Make borrow_of_local_data iterate instead of recurse
This commit is contained in:
parent
27cc0db7a2
commit
9613779855
|
@ -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
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue