]> git.lizzy.rs Git - rust.git/commitdiff
Make move_path_children_matching closure take a PlaceElem instead of a slice
authorSantiago Pastorino <spastorino@gmail.com>
Sat, 24 Aug 2019 23:49:08 +0000 (19:49 -0400)
committerSantiago Pastorino <spastorino@gmail.com>
Mon, 9 Sep 2019 21:16:49 +0000 (18:16 -0300)
src/librustc_mir/dataflow/drop_flag_effects.rs
src/librustc_mir/transform/elaborate_drops.rs

index 672bbda7502fe5463fd65da5c1f8d30b375872dd..444cc008ae785432f1ed2165e45c8e7f2dec896b 100644 (file)
@@ -10,14 +10,17 @@ pub fn move_path_children_matching<'tcx, F>(move_data: &MoveData<'tcx>,
                                         path: MovePathIndex,
                                         mut cond: F)
                                         -> Option<MovePathIndex>
-    where F: FnMut(&[mir::PlaceElem<'tcx>]) -> bool
+    where F: FnMut(&mir::PlaceElem<'tcx>) -> bool
 {
     let mut next_child = move_data.move_paths[path].first_child;
     while let Some(child_index) = next_child {
-        if cond(&move_data.move_paths[child_index].place.projection) {
-            return Some(child_index)
+        let move_path_children = &move_data.move_paths[child_index];
+        if let Some(elem) = move_path_children.place.projection.last() {
+            if cond(elem) {
+                return Some(child_index)
+            }
         }
-        next_child = move_data.move_paths[child_index].next_sibling;
+        next_child = move_path_children.next_sibling;
     }
 
     None
index 47c7c2c5cb3196cbd21f4981674f791540e2ac9f..de5978c3a3525a5c345d87ce347519fdaa5463bf 100644 (file)
@@ -236,18 +236,18 @@ fn clear_drop_flag(&mut self, loc: Location, path: Self::Path, mode: DropFlagMod
     }
 
     fn field_subpath(&self, path: Self::Path, field: Field) -> Option<Self::Path> {
-        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
-            [.., ProjectionElem::Field(idx, _)] => *idx == field,
+        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
+            ProjectionElem::Field(idx, _) => *idx == field,
             _ => false,
         })
     }
 
     fn array_subpath(&self, path: Self::Path, index: u32, size: u32) -> Option<Self::Path> {
-        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
-            [.., ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false }] => {
+        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
+            ProjectionElem::ConstantIndex { offset, min_length: _, from_end: false } => {
                 *offset == index
             }
-            [.., ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true }] => {
+            ProjectionElem::ConstantIndex { offset, min_length: _, from_end: true } => {
                 size - offset == index
             }
             _ => false,
@@ -255,17 +255,14 @@ fn array_subpath(&self, path: Self::Path, index: u32, size: u32) -> Option<Self:
     }
 
     fn deref_subpath(&self, path: Self::Path) -> Option<Self::Path> {
-        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| {
-            match p {
-                [.., ProjectionElem::Deref] => true,
-                _ => false
-            }
+        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| {
+            *e == ProjectionElem::Deref
         })
     }
 
     fn downcast_subpath(&self, path: Self::Path, variant: VariantIdx) -> Option<Self::Path> {
-        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |p| match p {
-            [.., ProjectionElem::Downcast(_, idx)] => *idx == variant,
+        dataflow::move_path_children_matching(self.ctxt.move_data(), path, |e| match e {
+            ProjectionElem::Downcast(_, idx) => *idx == variant,
             _ => false
         })
     }