about summary refs log tree commit diff
path: root/src/liballoc
diff options
context:
space:
mode:
authorUlrik Sverdrup <bluss@users.noreply.github.com>2020-04-28 23:31:32 +0200
committerUlrik Sverdrup <bluss@users.noreply.github.com>2020-04-28 23:31:32 +0200
commitf654daf3a6681e6d412db1e3203801353b9089c7 (patch)
tree22ec0d224ee74849afe8a19f775df80603a9de17 /src/liballoc
parent7612ad77975331c91aec8ab2a269b31b22668972 (diff)
downloadrust-f654daf3a6681e6d412db1e3203801353b9089c7.tar.gz
rust-f654daf3a6681e6d412db1e3203801353b9089c7.zip
Vec IntoIter: Drop using raw slice
Update Vec drop with a comment to explain why we want to use a raw
slice, and extend this pattern to also include the Vec's IntoIter.
Diffstat (limited to 'src/liballoc')
-rw-r--r--src/liballoc/vec.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs
index 21c387e59e2..edb36dbf220 100644
--- a/src/liballoc/vec.rs
+++ b/src/liballoc/vec.rs
@@ -2379,6 +2379,8 @@ unsafe impl<#[may_dangle] T> Drop for Vec<T> {
     fn drop(&mut self) {
         unsafe {
             // use drop for [T]
+            // use a raw slice to refer to the elements of the vector as weakest necessary type;
+            // could avoid questions of validity in certain cases
             ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
         }
         // RawVec handles deallocation
@@ -2596,7 +2598,11 @@ impl<T> IntoIter<T> {
     /// ```
     #[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")]
     pub fn as_mut_slice(&mut self) -> &mut [T] {
-        unsafe { slice::from_raw_parts_mut(self.ptr as *mut T, self.len()) }
+        unsafe { &mut *self.as_raw_mut_slice() }
+    }
+
+    fn as_raw_mut_slice(&mut self) -> *mut [T] {
+        ptr::slice_from_raw_parts_mut(self.ptr as *mut T, self.len())
     }
 }
 
@@ -2708,7 +2714,7 @@ unsafe impl<#[may_dangle] T> Drop for IntoIter<T> {
         let guard = DropGuard(self);
         // destroy the remaining elements
         unsafe {
-            ptr::drop_in_place(guard.0.as_mut_slice());
+            ptr::drop_in_place(guard.0.as_raw_mut_slice());
         }
         // now `guard` will be dropped and do the rest
     }