From d1f763f60d47c6777934039f86529e189c1b92a9 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 16 Sep 2019 15:53:08 -0300 Subject: [PATCH] Use while let slice_pattern instead of carrying an index around --- src/librustc_mir/borrow_check/conflict_errors.rs | 10 ++++++---- src/librustc_mir/borrow_check/mod.rs | 8 ++++---- src/librustc_mir/borrow_check/nll/type_check/mod.rs | 7 +++++-- src/librustc_mir/build/matches/mod.rs | 5 +++-- src/librustc_mir/transform/check_unsafety.rs | 5 +++-- src/librustc_mir/util/alignment.rs | 5 +++-- 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/librustc_mir/borrow_check/conflict_errors.rs b/src/librustc_mir/borrow_check/conflict_errors.rs index 4b4516d6bf2..81359c6a46e 100644 --- a/src/librustc_mir/borrow_check/conflict_errors.rs +++ b/src/librustc_mir/borrow_check/conflict_errors.rs @@ -614,8 +614,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { projection, } = first_borrowed_place; - for (i, elem) in projection.iter().enumerate().rev() { - let proj_base = &projection[..i]; + let mut cursor = &**projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; match elem { ProjectionElem::Field(field, _) if union_ty(base, proj_base).is_some() => { @@ -637,8 +638,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { projection, } = second_borrowed_place; - for (i, elem) in projection.iter().enumerate().rev() { - let proj_base = &projection[..i]; + let mut cursor = &**projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; if let ProjectionElem::Field(field, _) = elem { if let Some(union_ty) = union_ty(base, proj_base) { diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 5ef70461296..1d3576244c4 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -1758,7 +1758,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!("check_if_assigned_path_is_moved place: {:?}", place); // None case => assigning to `x` does not require `x` be initialized. - for (i, elem) in place.projection.iter().enumerate().rev() { + let mut cursor = &*place.projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; + match elem { ProjectionElem::Index(_/*operand*/) | ProjectionElem::ConstantIndex { .. } | @@ -1771,8 +1774,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // assigning to (*P) requires P to be initialized ProjectionElem::Deref => { - let proj_base = &place.projection[..i]; - self.check_if_full_path_is_moved( location, InitializationRequiringAction::Use, (PlaceRef { @@ -1790,7 +1791,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { } ProjectionElem::Field(..) => { - let proj_base = &place.projection[..i]; // if type of `P` has a dtor, then // assigning to `P.f` requires `P` itself // be already initialized diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs index 1d17bae559c..62bff3421a0 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -2417,9 +2417,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { "add_reborrow_constraint({:?}, {:?}, {:?})", location, borrow_region, borrowed_place ); - for (i, elem) in borrowed_place.projection.iter().enumerate().rev() { + + let mut cursor = &*borrowed_place.projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; + debug!("add_reborrow_constraint - iteration {:?}", elem); - let proj_base = &borrowed_place.projection[..i]; match elem { ProjectionElem::Deref => { diff --git a/src/librustc_mir/build/matches/mod.rs b/src/librustc_mir/build/matches/mod.rs index aa261f8eb6f..2b0237c7c08 100644 --- a/src/librustc_mir/build/matches/mod.rs +++ b/src/librustc_mir/build/matches/mod.rs @@ -1296,8 +1296,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Insert a Shallow borrow of the prefixes of any fake borrows. for place in fake_borrows { - for (i, elem) in place.projection.iter().enumerate().rev() { - let proj_base = &place.projection[..i]; + let mut cursor = &*place.projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; if let ProjectionElem::Deref = elem { // Insert a shallow borrow after a deref. For other diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs index f8af9b9fcbe..39aa5c717ac 100644 --- a/src/librustc_mir/transform/check_unsafety.rs +++ b/src/librustc_mir/transform/check_unsafety.rs @@ -407,8 +407,9 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { place: &Place<'tcx>, is_mut_use: bool, ) { - for (i, elem) in place.projection.iter().enumerate().rev() { - let proj_base = &place.projection[..i]; + let mut cursor = &*place.projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; match elem { ProjectionElem::Field(..) => { diff --git a/src/librustc_mir/util/alignment.rs b/src/librustc_mir/util/alignment.rs index b4c97f91917..a75c1af04f0 100644 --- a/src/librustc_mir/util/alignment.rs +++ b/src/librustc_mir/util/alignment.rs @@ -38,8 +38,9 @@ fn is_within_packed<'tcx, L>(tcx: TyCtxt<'tcx>, local_decls: &L, place: &Place<' where L: HasLocalDecls<'tcx>, { - for (i, elem) in place.projection.iter().enumerate().rev() { - let proj_base = &place.projection[..i]; + let mut cursor = &*place.projection; + while let [proj_base @ .., elem] = cursor { + cursor = proj_base; match elem { // encountered a Deref, which is ABI-aligned