about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2019-05-23 22:17:45 +0200
committerSantiago Pastorino <spastorino@gmail.com>2019-05-23 22:17:45 +0200
commit2e39b9c51f8a94662bf0c7d1f3411ebade7bfeb6 (patch)
tree4f550bc9875cc371628839ffc8f187b41bb90eca /src
parent27cc0db7a248308fc2634ac68d7608a20b4a1c09 (diff)
downloadrust-2e39b9c51f8a94662bf0c7d1f3411ebade7bfeb6.tar.gz
rust-2e39b9c51f8a94662bf0c7d1f3411ebade7bfeb6.zip
Make find_local iterate instead of recurse
Diffstat (limited to 'src')
-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> {