about summary refs log tree commit diff
path: root/src/liballoc/vec.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/liballoc/vec.rs')
-rw-r--r--src/liballoc/vec.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs
index b26979c7f6d..a906628dbc7 100644
--- a/src/liballoc/vec.rs
+++ b/src/liballoc/vec.rs
@@ -813,14 +813,19 @@ impl<T> Vec<T> {
             for i in 0..len {
                 if !f(&v[i]) {
                     del += 1;
+                    unsafe {
+                        ptr::read(&v[i]);
+                    }
                 } else if del > 0 {
-                    v.swap(i - del, i);
+                    let src: *const T = &v[i];
+                    let dst: *mut T = &mut v[i - del];
+                    unsafe {
+                        ptr::copy_nonoverlapping(src, dst, 1);
+                    }
                 }
             }
         }
-        if del > 0 {
-            self.truncate(len - del);
-        }
+        self.len = len - del;
     }
 
     /// Removes all but the first of consecutive elements in the vector that resolve to the same