add testcase for double-drop during Vec in-place collection
(cherry picked from commit fa89c0fbcfa8f4d44f153b1195ec5a305540ffc4)
This commit is contained in:
parent
cc4d6d644b
commit
6ed66ebdde
|
@ -1027,7 +1027,7 @@ fn test_from_iter_specialization_head_tail_drop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[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 drop_count: Vec<_> = (0..=2).map(|_| Rc::new(())).collect();
|
||||||
let src: Vec<_> = drop_count.iter().cloned().collect();
|
let src: Vec<_> = drop_count.iter().cloned().collect();
|
||||||
let iter = src.into_iter();
|
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]
|
#[test]
|
||||||
fn test_cow_from() {
|
fn test_cow_from() {
|
||||||
let borrowed: &[_] = &["borrowed", "(slice)"];
|
let borrowed: &[_] = &["borrowed", "(slice)"];
|
||||||
|
|
Loading…
Reference in New Issue