diff --git a/src/lib.rs b/src/lib.rs index 5bba2b3..ae76a85 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -132,7 +132,8 @@ impl TypeErasedVec { let layout = self.layout; let res = self.try_as_type(); - if cfg!(debug_assertions) && res.is_none() { + #[cfg(debug_assertions)] + if res.is_none() { unreachable!( "Calling `as_type_unchecked` with an incompatible layout is UB! Target type layout must exactly match the erased layout. Capacity is reserved for {:?} but {} has {:?}", layout, diff --git a/src/tests.rs b/src/tests.rs index d5b03fb..d0dd2cb 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -368,3 +368,21 @@ fn test_multiple_compatible_type_casts() { let restored = unsafe { erased.cast_into_vec::() }; assert_eq!(restored, vec![-1, 42]); } + +#[test] +fn test_cast_and_clear() { + let mut vec = Vec::::new(); + vec.push(-1); + let mut erased = TypeErasedVec::new(vec); + + { + let mut guard = unsafe { erased.cast_type::() }; + assert_eq!(guard.as_slice(), &[u32::MAX]); + guard.clear(); + guard.push(u32::MAX - 1); + guard.push(42); + } + + let restored = unsafe { erased.cast_into_vec::() }; + assert_eq!(restored, vec![-2, 42]); +}