diff --git a/src/librustc_mir/borrow_check/path_utils.rs b/src/librustc_mir/borrow_check/path_utils.rs index 0c2a4ef45f1..caef8d8bc5a 100644 --- a/src/librustc_mir/borrow_check/path_utils.rs +++ b/src/librustc_mir/borrow_check/path_utils.rs @@ -131,22 +131,20 @@ pub(super) fn is_active<'tcx>( /// Determines if a given borrow is borrowing local data /// This is called for all Yield statements on movable generators pub(super) fn borrow_of_local_data<'tcx>(place: &Place<'tcx>) -> bool { - match place { - Place::Base(PlaceBase::Static(..)) => false, - Place::Base(PlaceBase::Local(..)) => true, - Place::Projection(box proj) => { - match proj.elem { - // Reborrow of already borrowed data is ignored - // Any errors will be caught on the initial borrow - ProjectionElem::Deref => false, + place.iterate(|place_base, place_projection| { + match place_base { + PlaceBase::Static(..) => return false, + PlaceBase::Local(..) => {}, + } - // For interior references and downcasts, find out if the base is local - ProjectionElem::Field(..) - | ProjectionElem::Index(..) - | ProjectionElem::ConstantIndex { .. } - | ProjectionElem::Subslice { .. } - | ProjectionElem::Downcast(..) => borrow_of_local_data(&proj.base), + for proj in place_projection { + // Reborrow of already borrowed data is ignored + // Any errors will be caught on the initial borrow + if proj.elem == ProjectionElem::Deref { + return false; } } - } + + true + }) }