X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=compiler%2Frustc_mir%2Fsrc%2Fborrow_check%2Fpath_utils.rs;h=80de3b4e363bfb369a40b701ff9cf944e43df84a;hb=c748f32ee45ed42eaab4d6a62dc64720b5096c68;hp=934729553a73be6588cc0f34b4b444cfd89d157e;hpb=216c4ae46352330bc7962f132fe226a7e73ab8fa;p=rust.git diff --git a/compiler/rustc_mir/src/borrow_check/path_utils.rs b/compiler/rustc_mir/src/borrow_check/path_utils.rs index 934729553a7..80de3b4e363 100644 --- a/compiler/rustc_mir/src/borrow_check/path_utils.rs +++ b/compiler/rustc_mir/src/borrow_check/path_utils.rs @@ -143,31 +143,29 @@ pub(super) fn borrow_of_local_data(place: Place<'_>) -> bool { /// of a closure type. pub(crate) fn is_upvar_field_projection( tcx: TyCtxt<'tcx>, - upvars: &[Upvar], + upvars: &[Upvar<'tcx>], place_ref: PlaceRef<'tcx>, body: &Body<'tcx>, ) -> Option { - let mut place_projection = place_ref.projection; + let mut place_ref = place_ref; let mut by_ref = false; - if let [proj_base @ .., ProjectionElem::Deref] = place_projection { - place_projection = proj_base; + if let Some((place_base, ProjectionElem::Deref)) = place_ref.last_projection() { + place_ref = place_base; by_ref = true; } - match place_projection { - [base @ .., ProjectionElem::Field(field, _ty)] => { - let base_ty = Place::ty_from(place_ref.local, base, body, tcx).ty; - + match place_ref.last_projection() { + Some((place_base, ProjectionElem::Field(field, _ty))) => { + let base_ty = place_base.ty(body, tcx).ty; if (base_ty.is_closure() || base_ty.is_generator()) && (!by_ref || upvars[field.index()].by_ref) { - Some(*field) + Some(field) } else { None } } - _ => None, } }