Use while let slice_pattern instead of carrying an index around
diff --git a/src/librustc_mir/borrow_check/conflict_errors.rs b/src/librustc_mir/borrow_check/conflict_errors.rs
index 4b4516d..81359c6 100644
--- a/src/librustc_mir/borrow_check/conflict_errors.rs
+++ b/src/librustc_mir/borrow_check/conflict_errors.rs
@@ -614,8 +614,9 @@
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 @@
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 5ef7046..1d35762 100644
--- a/src/librustc_mir/borrow_check/mod.rs
+++ b/src/librustc_mir/borrow_check/mod.rs
@@ -1758,7 +1758,10 @@
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 @@
// 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 @@
}
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 1d17bae..62bff34 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 @@
"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 aa261f8..2b0237c 100644
--- a/src/librustc_mir/build/matches/mod.rs
+++ b/src/librustc_mir/build/matches/mod.rs
@@ -1296,8 +1296,9 @@
// 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 f8af9b9..39aa5c7 100644
--- a/src/librustc_mir/transform/check_unsafety.rs
+++ b/src/librustc_mir/transform/check_unsafety.rs
@@ -407,8 +407,9 @@
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 b4c97f9..a75c1af 100644
--- a/src/librustc_mir/util/alignment.rs
+++ b/src/librustc_mir/util/alignment.rs
@@ -38,8 +38,9 @@
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