Cover equal-size alignment mismatches

This commit is contained in:
2026-07-31 04:22:56 +02:00
parent a3729f05a3
commit e1a771b4d8
+28
View File
@@ -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::<AlignEight>(), size_of::<[u8; 8]>());
assert_ne!(align_of::<AlignEight>(), 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::<AlignEight>());
assert_eq!(erased.capacity(), original_capacity);
// SAFETY: Both failed probes preserved the original element type.
let guard = unsafe { erased.cast_type::<AlignEight>() };
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>);