Add tests for 'impl Default for [T; N]'

This commit is contained in:
Mikail Bagishov 2020-05-26 23:48:36 +03:00
parent aeca4d6428
commit 591584e71f
No known key found for this signature in database
GPG key ID: 63CF4B1F9D921A40

View file

@ -241,3 +241,44 @@ fn iterator_drops() {
} }
assert_eq!(i.get(), 5); assert_eq!(i.get(), 5);
} }
#[test]
fn array_default_impl_avoids_leaks_on_panic() {
use core::sync::atomic::{AtomicUsize, Ordering::Relaxed};
static COUNTER: AtomicUsize = AtomicUsize::new(0);
#[derive(Debug)]
struct Bomb(usize);
impl Default for Bomb {
fn default() -> Bomb {
if COUNTER.load(Relaxed) == 3 {
panic!("bomb limit exceeded");
}
COUNTER.fetch_add(1, Relaxed);
Bomb(COUNTER.load(Relaxed))
}
}
impl Drop for Bomb {
fn drop(&mut self) {
COUNTER.fetch_sub(1, Relaxed);
}
}
let res = std::panic::catch_unwind(|| <[Bomb; 5]>::default());
let panic_msg = match res {
Ok(_) => unreachable!(),
Err(p) => p.downcast::<&'static str>().unwrap(),
};
assert_eq!(*panic_msg, "bomb limit exceeded");
// check that all bombs are successfully dropped
assert_eq!(COUNTER.load(Relaxed), 0);
}
#[test]
fn empty_array_is_always_default() {
struct DoesNotImplDefault;
let _arr = <[DoesNotImplDefault; 0]>::default();
}