summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 0f49968..e63c462 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -636,6 +636,7 @@ mod tests
use std::any::TypeId;
use std::mem::offset_of;
use std::ptr::NonNull;
+ use std::sync::atomic::{AtomicUsize, Ordering};
use crate::{FieldMetadata, MultiVec, OwnedAnyPtr};
@@ -648,7 +649,6 @@ mod tests
length = $length: literal
) => {{
#[repr(C)]
- #[derive(Debug)]
struct Data
{
$($field_name: [$field_type; $length],)*
@@ -907,4 +907,65 @@ mod tests
assert_eq!(multi_vec.get_field(2).as_slice::<u8>(), [120, 88, 54, 3, 7]);
}
+
+ #[test]
+ fn fields_are_dropped()
+ {
+ static THING_DROPPED_CNT: AtomicUsize = AtomicUsize::new(0);
+
+ struct Thing
+ {
+ _num: u32,
+ }
+
+ impl Drop for Thing
+ {
+ fn drop(&mut self)
+ {
+ THING_DROPPED_CNT.fetch_add(1, Ordering::Relaxed);
+ }
+ }
+
+ let mut data;
+ let multi_vec = multi_vec_with_data!(
+ data = &mut data,
+ {
+ _a: Thing = [Thing { _num: 567}, Thing { _num: 890}, Thing { _num: 345}],
+ },
+ length = 3
+ );
+
+ drop(multi_vec);
+
+ assert_eq!(THING_DROPPED_CNT.load(Ordering::Relaxed), 3);
+ }
+
+ #[test]
+ fn zero_sized_fields_are_dropped()
+ {
+ static THING_DROPPED_CNT: AtomicUsize = AtomicUsize::new(0);
+
+ struct Thing;
+
+ impl Drop for Thing
+ {
+ fn drop(&mut self)
+ {
+ THING_DROPPED_CNT.fetch_add(1, Ordering::Relaxed);
+ }
+ }
+
+ let mut data;
+ let multi_vec = multi_vec_with_data!(
+ data = &mut data,
+ {
+ _a: Thing = [const {Thing}; 3],
+ },
+ length = 3
+ );
+
+ drop(multi_vec);
+
+ assert_eq!(THING_DROPPED_CNT.load(Ordering::Relaxed), 3);
+ }
}