Adapt inplace collection leak test to check for no leaks
This commit is contained in:
parent
fa61678a7d
commit
f81b07e947
@ -1110,11 +1110,13 @@ fn test_from_iter_specialization_panic_during_iteration_drops() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_from_iter_specialization_panic_during_drop_leaks() {
|
||||
static mut DROP_COUNTER: usize = 0;
|
||||
fn test_from_iter_specialization_panic_during_drop_doesnt_leak() {
|
||||
static mut DROP_COUNTER_SHOULD_BE_DROPPED: usize = 0;
|
||||
static mut DROP_COUNTER_DROPPED_TWICE: usize = 0;
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Droppable {
|
||||
ShouldBeDropped,
|
||||
DroppedTwice(Box<i32>),
|
||||
PanicOnDrop,
|
||||
}
|
||||
@ -1122,11 +1124,17 @@ enum Droppable {
|
||||
impl Drop for Droppable {
|
||||
fn drop(&mut self) {
|
||||
match self {
|
||||
Droppable::ShouldBeDropped => {
|
||||
unsafe {
|
||||
DROP_COUNTER_SHOULD_BE_DROPPED += 1;
|
||||
}
|
||||
println!("Dropping ShouldBeDropped!")
|
||||
}
|
||||
Droppable::DroppedTwice(_) => {
|
||||
unsafe {
|
||||
DROP_COUNTER += 1;
|
||||
DROP_COUNTER_DROPPED_TWICE += 1;
|
||||
}
|
||||
println!("Dropping!")
|
||||
println!("Dropping DroppedTwice!")
|
||||
}
|
||||
Droppable::PanicOnDrop => {
|
||||
if !std::thread::panicking() {
|
||||
@ -1137,21 +1145,17 @@ fn drop(&mut self) {
|
||||
}
|
||||
}
|
||||
|
||||
let mut to_free: *mut Droppable = core::ptr::null_mut();
|
||||
let mut cap = 0;
|
||||
|
||||
let _ = std::panic::catch_unwind(AssertUnwindSafe(|| {
|
||||
let mut v = vec![Droppable::DroppedTwice(Box::new(123)), Droppable::PanicOnDrop];
|
||||
to_free = v.as_mut_ptr();
|
||||
cap = v.capacity();
|
||||
let _ = v.into_iter().take(0).collect::<Vec<_>>();
|
||||
let v = vec![
|
||||
Droppable::ShouldBeDropped,
|
||||
Droppable::DroppedTwice(Box::new(123)),
|
||||
Droppable::PanicOnDrop,
|
||||
];
|
||||
let _ = v.into_iter().take(1).collect::<Vec<_>>();
|
||||
}));
|
||||
|
||||
assert_eq!(unsafe { DROP_COUNTER }, 1);
|
||||
// clean up the leak to keep miri happy
|
||||
unsafe {
|
||||
drop(Vec::from_raw_parts(to_free, 0, cap));
|
||||
}
|
||||
assert_eq!(unsafe { DROP_COUNTER_SHOULD_BE_DROPPED }, 1);
|
||||
assert_eq!(unsafe { DROP_COUNTER_DROPPED_TWICE }, 1);
|
||||
}
|
||||
|
||||
// regression test for issue #85322. Peekable previously implemented InPlaceIterable,
|
||||
|
Loading…
Reference in New Issue
Block a user