diff --git a/src/tests.rs b/src/tests.rs index 1d7d039..49f80a5 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -7,6 +7,7 @@ use super::*; use std::alloc::Layout; use std::cell::Cell; use std::marker::PhantomData; +use std::mem::{align_of, size_of}; use std::panic; use std::rc::Rc; use std::sync::Arc; @@ -807,6 +808,33 @@ fn test_aligned_zst_layout_mismatch_is_non_destructive() { assert_eq!(erased.capacity(), usize::MAX); } +#[test] +fn test_equal_size_different_alignment_is_rejected() { + #[repr(align(8))] + struct AlignEight([u8; 8]); + + assert_eq!(size_of::(), size_of::<[u8; 8]>()); + assert_ne!(align_of::(), align_of::<[u8; 8]>()); + + let values = vec![AlignEight([1, 2, 3, 4, 5, 6, 7, 8])]; + let original_ptr = values.as_ptr(); + let original_capacity = values.capacity(); + let mut erased = TypeErasedVec::new(values); + + assert!(erased.try_as_type::<[u8; 8]>().is_none()); + assert!(erased.try_as_type_scoped::<[u8; 8]>().is_none()); + assert_erased_state(&erased, 1, Layout::new::()); + assert_eq!(erased.capacity(), original_capacity); + + // SAFETY: Both failed probes preserved the original element type. + let guard = unsafe { erased.cast_type::() }; + assert_eq!(guard.as_slice().as_ptr(), original_ptr); + assert_eq!( + guard.as_slice().first().map(|value| value.0), + Some([1, 2, 3, 4, 5, 6, 7, 8]) + ); +} + #[test] fn test_scoped_borrowed_zst_behavior() { struct BorrowedZst<'a>(PhantomData<&'a u8>);