add testcase for double-drop during Vec in-place collection

(cherry picked from commit fa89c0fbcfa8f4d44f153b1195ec5a305540ffc4)
This commit is contained in:
The8472 2021-03-29 04:22:34 +02:00 committed by Josh Stone
parent cc4d6d644b
commit 6ed66ebdde
1 changed files with 37 additions and 1 deletions

View File

@ -1027,7 +1027,7 @@ fn test_from_iter_specialization_head_tail_drop() {
}
#[test]
fn test_from_iter_specialization_panic_drop() {
fn test_from_iter_specialization_panic_during_iteration_drops() {
let drop_count: Vec<_> = (0..=2).map(|_| Rc::new(())).collect();
let src: Vec<_> = drop_count.iter().cloned().collect();
let iter = src.into_iter();
@ -1050,6 +1050,42 @@ fn test_from_iter_specialization_panic_drop() {
);
}
#[test]
fn test_from_iter_specialization_panic_during_drop_leaks() {
static mut DROP_COUNTER: usize = 0;
#[derive(Debug)]
enum Droppable {
DroppedTwice(Box<i32>),
PanicOnDrop,
}
impl Drop for Droppable {
fn drop(&mut self) {
match self {
Droppable::DroppedTwice(_) => {
unsafe {
DROP_COUNTER += 1;
}
println!("Dropping!")
}
Droppable::PanicOnDrop => {
if !std::thread::panicking() {
panic!();
}
}
}
}
}
let _ = std::panic::catch_unwind(AssertUnwindSafe(|| {
let v = vec![Droppable::DroppedTwice(Box::new(123)), Droppable::PanicOnDrop];
let _ = v.into_iter().take(0).collect::<Vec<_>>();
}));
assert_eq!(unsafe { DROP_COUNTER }, 1);
}
#[test]
fn test_cow_from() {
let borrowed: &[_] = &["borrowed", "(slice)"];