about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-05-25 04:57:34 +0200
committerGitHub <noreply@github.com>2019-05-25 04:57:34 +0200
commitaf015527aa037ae858871ae30cf6897bdb8236e5 (patch)
tree865ec63d69797b3821e78f75dc25e459efc81d3d
parentb4f6e5baebe621e8c1292482c9006a5a1ca14f0f (diff)
parent2e39b9c51f8a94662bf0c7d1f3411ebade7bfeb6 (diff)
downloadrust-af015527aa037ae858871ae30cf6897bdb8236e5.tar.gz
rust-af015527aa037ae858871ae30cf6897bdb8236e5.zip
Rollup merge of #61094 - spastorino:find-local-iterate, r=oli-obk
Make find_local iterate instead of recurse

r? @oli-obk
-rw-r--r--src/librustc_mir/dataflow/impls/borrowed_locals.rs19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/librustc_mir/dataflow/impls/borrowed_locals.rs b/src/librustc_mir/dataflow/impls/borrowed_locals.rs
index 42c2387b705..65cbc83fbcb 100644
--- a/src/librustc_mir/dataflow/impls/borrowed_locals.rs
+++ b/src/librustc_mir/dataflow/impls/borrowed_locals.rs
@@ -91,16 +91,19 @@ struct BorrowedLocalsVisitor<'b, 'c: 'b> {
 }
 
 fn find_local<'tcx>(place: &Place<'tcx>) -> Option<Local> {
-    match *place {
-        Place::Base(PlaceBase::Local(l)) => Some(l),
-        Place::Base(PlaceBase::Static(..)) => None,
-        Place::Projection(ref proj) => {
-            match proj.elem {
-                ProjectionElem::Deref => None,
-                _ => find_local(&proj.base)
+    place.iterate(|place_base, place_projection| {
+        for proj in place_projection {
+            if proj.elem == ProjectionElem::Deref {
+                return None;
             }
         }
-    }
+
+        if let PlaceBase::Local(local) = place_base {
+            Some(*local)
+        } else {
+            None
+        }
+    })
 }
 
 impl<'tcx, 'b, 'c> Visitor<'tcx> for BorrowedLocalsVisitor<'b, 'c> {