Add tests for 'impl Default for [T; N]'
This commit is contained in:
parent
aeca4d6428
commit
591584e71f
1 changed files with 41 additions and 0 deletions
|
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue