about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorMikail Bagishov <bagishov.mikail@yandex.ru>2020-05-26 23:48:36 +0300
committerMikail Bagishov <bagishov.mikail@yandex.ru>2020-05-27 00:57:07 +0300
commit591584e71f7d8a613d586066c8b01c1eecf08f35 (patch)
tree8434d56eecfdc5063f326c3f56e9c11b2c45314d /src/libcore
parentaeca4d6428c52cbf2c8d1f28657b0bdf92e4ea7c (diff)
downloadrust-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.rs41
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();
+}