about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThe8472 <git@infinite-source.de>2020-01-18 16:13:28 +0100
committerThe8472 <git@infinite-source.de>2020-09-03 20:59:25 +0200
commit6ed05fd99573c481e2484edc28f18588e9135d1f (patch)
treeec8e25e5824cb10f62f2693d35948bad8fe72b1c
parentab382b76616e20bdb29973d44aa220341133d407 (diff)
replace drop flag with ManuallyDrop
-rw-r--r--library/alloc/src/vec.rs10
1 files changed, 4 insertions, 6 deletions
diff --git a/library/alloc/src/vec.rs b/library/alloc/src/vec.rs
index 9d0ab47f8f2..27618f4a388 100644
--- a/library/alloc/src/vec.rs
+++ b/library/alloc/src/vec.rs
@@ -2172,7 +2172,6 @@ where
 struct InPlaceDrop<T> {
     inner: *mut T,
     dst: *mut T,
-    did_panic: bool,
 }
 
 impl<T> InPlaceDrop<T> {
@@ -2185,9 +2184,7 @@ impl<T> Drop for InPlaceDrop<T> {
     #[inline]
     fn drop(&mut self) {
         unsafe {
-            if self.did_panic {
-                ptr::drop_in_place(slice::from_raw_parts_mut(self.inner, self.len()) as *mut _);
-            }
+            ptr::drop_in_place(slice::from_raw_parts_mut(self.inner, self.len()) as *mut _);
         }
     }
 }
@@ -2240,7 +2237,7 @@ where
 
         let dst = if mem::needs_drop::<T>() {
             // special-case drop handling since it prevents vectorization
-            let mut sink = InPlaceDrop { inner: src_buf, dst, did_panic: true };
+            let mut sink = InPlaceDrop { inner: src_buf, dst };
             let _ = iterator.try_for_each::<_, Result<_, !>>(|item| {
                 unsafe {
                     debug_assert!(
@@ -2252,7 +2249,8 @@ where
                 }
                 Ok(())
             });
-            sink.did_panic = false;
+            // iteration succeeded, don't drop head
+            let sink = mem::ManuallyDrop::new(sink);
             sink.dst
         } else {
             // use try-fold