about summary refs log tree commit diff
path: root/src/liballoc/collections
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2019-12-11 19:38:45 +0100
committerJonas Schievink <jonasschievink@gmail.com>2019-12-11 19:38:45 +0100
commit189ccf20a21b367507447a8563d055f1d0b57ffb (patch)
treee0dcadb1b73df61b87eb49992280d43cadbe8e74 /src/liballoc/collections
parent90b957a17c1abba979aa41234ce0993a61030e67 (diff)
downloadrust-189ccf20a21b367507447a8563d055f1d0b57ffb.tar.gz
rust-189ccf20a21b367507447a8563d055f1d0b57ffb.zip
VecDeque: drop remaining items on destructor panic
Diffstat (limited to 'src/liballoc/collections')
-rw-r--r--src/liballoc/collections/vec_deque.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/liballoc/collections/vec_deque.rs b/src/liballoc/collections/vec_deque.rs
index 7795083e058..6e644dced16 100644
--- a/src/liballoc/collections/vec_deque.rs
+++ b/src/liballoc/collections/vec_deque.rs
@@ -144,11 +144,21 @@ impl<T: Clone> Clone for VecDeque<T> {
 #[stable(feature = "rust1", since = "1.0.0")]
 unsafe impl<#[may_dangle] T> Drop for VecDeque<T> {
     fn drop(&mut self) {
+        struct Dropper<'a, T>(&'a mut [T]);
+
+        impl<'a, T> Drop for Dropper<'a, T> {
+            fn drop(&mut self) {
+                unsafe {
+                    ptr::drop_in_place(self.0);
+                }
+            }
+        }
+
         let (front, back) = self.as_mut_slices();
         unsafe {
+            let _back_dropper = Dropper(back);
             // use drop for [T]
             ptr::drop_in_place(front);
-            ptr::drop_in_place(back);
         }
         // RawVec handles deallocation
     }