diff --git a/src/lib.rs b/src/lib.rs index fb644fe..74dcfa5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -37,6 +37,7 @@ use core::{any::TypeId, marker::PhantomData, mem}; pub unsafe fn unty(x: Src) -> Result { if type_equal::() { let ptr = &x as *const Src as *const Target; + mem::forget(x); // we're going to copy this, so don't run the destructor Ok(core::ptr::read(ptr)) } else { Err(x) @@ -73,3 +74,24 @@ fn non_static_type_id() -> TypeId { mem::transmute::<&dyn NonStaticAny, &(dyn NonStaticAny + 'static)>(&phantom_data) }) } + +#[test] +fn test_double_drop() { + use core::sync::atomic::{AtomicUsize, Ordering}; + #[derive(Debug)] + struct Ty; + static COUNTER: AtomicUsize = AtomicUsize::new(0); + + impl Drop for Ty { + fn drop(&mut self) { + COUNTER.fetch_add(1, Ordering::Relaxed); + } + } + + fn foo(t: T) { + unsafe { unty::(t) }.unwrap(); + } + + foo(Ty); + assert_eq!(COUNTER.load(Ordering::Relaxed), 1); +}