diff options
| author | The8472 <git@infinite-source.de> | 2020-01-18 16:13:28 +0100 |
|---|---|---|
| committer | The8472 <git@infinite-source.de> | 2020-09-03 20:59:25 +0200 |
| commit | 6ed05fd99573c481e2484edc28f18588e9135d1f (patch) | |
| tree | ec8e25e5824cb10f62f2693d35948bad8fe72b1c | |
| parent | ab382b76616e20bdb29973d44aa220341133d407 (diff) | |
replace drop flag with ManuallyDrop
| -rw-r--r-- | library/alloc/src/vec.rs | 10 |
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 |
