Cover equal-size alignment mismatches
This commit is contained in:
@@ -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>);
|
||||
|
||||
Reference in New Issue
Block a user