diff --git a/src/arrayvec.rs b/src/arrayvec.rs index f646b08..003c33f 100644 --- a/src/arrayvec.rs +++ b/src/arrayvec.rs @@ -482,10 +482,11 @@ impl ArrayVec { impl Drop for BackshiftOnDrop<'_, T, CAP> { fn drop(&mut self) { if self.deleted_cnt > 0 { + let ptr = self.v.as_mut_ptr(); unsafe { ptr::copy( - self.v.as_ptr().add(self.processed_len), - self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt), + ptr.add(self.processed_len), + ptr.add(self.processed_len - self.deleted_cnt), self.original_len - self.processed_len ); } diff --git a/tests/tests.rs b/tests/tests.rs index 309ceb8..6b646a5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -409,6 +409,17 @@ fn test_retain() { assert_eq!(&v[..], &[]); } +#[test] +#[should_panic] +fn test_retain_panic() { + let mut v = ArrayVec::from([1, 2, 3]); + v.retain(|elt| match *elt { + 1 => false, + 2 => panic!("after something has been deleted"), + _ => true, + }); +} + #[test] #[should_panic] fn test_drain_oob() {