diff options
| author | Mikail Bagishov <bagishov.mikail@yandex.ru> | 2020-05-26 23:48:36 +0300 |
|---|---|---|
| committer | Mikail Bagishov <bagishov.mikail@yandex.ru> | 2020-05-27 00:57:07 +0300 |
| commit | 591584e71f7d8a613d586066c8b01c1eecf08f35 (patch) | |
| tree | 8434d56eecfdc5063f326c3f56e9c11b2c45314d /src/libcore | |
| parent | aeca4d6428c52cbf2c8d1f28657b0bdf92e4ea7c (diff) | |
| download | rust-591584e71f7d8a613d586066c8b01c1eecf08f35.tar.gz rust-591584e71f7d8a613d586066c8b01c1eecf08f35.zip | |
Add tests for 'impl Default for [T; N]'
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/tests/array.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/libcore/tests/array.rs b/src/libcore/tests/array.rs index c2a816f0a7d..41855a9a8cb 100644 --- a/src/libcore/tests/array.rs +++ b/src/libcore/tests/array.rs @@ -241,3 +241,44 @@ fn iterator_drops() { } 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(); +} |
