| use std::alloc::{AllocRef, Global, Layout, System}; | |
| /// Issue #45955 and #62251. | |
| #[test] | |
| fn alloc_system_overaligned_request() { | |
| check_overalign_requests(System) | |
| } | |
| #[test] | |
| fn std_heap_overaligned_request() { | |
| check_overalign_requests(Global) | |
| } | |
| fn check_overalign_requests<T: AllocRef>(allocator: T) { | |
| for &align in &[4, 8, 16, 32] { | |
| // less than and bigger than `MIN_ALIGN` | |
| for &size in &[align / 2, align - 1] { | |
| // size less than alignment | |
| let iterations = 128; | |
| unsafe { | |
| let pointers: Vec<_> = (0..iterations) | |
| .map(|_| { | |
| allocator.alloc(Layout::from_size_align(size, align).unwrap()).unwrap() | |
| }) | |
| .collect(); | |
| for &ptr in &pointers { | |
| assert_eq!( | |
| (ptr.as_non_null_ptr().as_ptr() as usize) % align, | |
| 0, | |
| "Got a pointer less aligned than requested" | |
| ) | |
| } | |
| // Clean up | |
| for &ptr in &pointers { | |
| allocator.dealloc( | |
| ptr.as_non_null_ptr(), | |
| Layout::from_size_align(size, align).unwrap(), | |
| ) | |
| } | |
| } | |
| } | |
| } | |
| } |