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]
|
||||
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)"];
|
||||
|
|
Loading…
Reference in New Issue