diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-05-23 22:17:45 +0200 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-05-23 22:17:45 +0200 |
| commit | 2e39b9c51f8a94662bf0c7d1f3411ebade7bfeb6 (patch) | |
| tree | 4f550bc9875cc371628839ffc8f187b41bb90eca /src | |
| parent | 27cc0db7a248308fc2634ac68d7608a20b4a1c09 (diff) | |
| download | rust-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.rs | 19 |
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> { |
