@@ -29,24 +29,36 @@ fn check_alloc<T: Alloc>(mut allocator: T) { unsafe {
2929 allocator. dealloc ( p4, Layout :: from_size_align ( 10 , 4 ) . unwrap ( ) ) ;
3030} }
3131
32- fn check_overalign_requests < T : Alloc > ( mut allocator : T ) {
32+ unsafe fn align_ptr ( ptr : * mut u8 , align : usize ) -> * mut u8 {
33+ ptr. add ( align - ( ptr as usize & ( align - 1 ) ) )
34+ }
35+
36+ fn allocate_with_align < T : Alloc > ( mut allocator : T , size : usize , align : usize ) -> * mut u8 { unsafe {
37+ let ptr = allocator. alloc ( Layout :: from_size_align ( size + align, 1 ) . unwrap ( ) ) . unwrap ( ) . as_ptr ( ) ;
38+ eprintln ! ( "{}" , format!( "Before aligning: {:?}" , ptr) ) ;
39+ let ptr = align_ptr ( ptr, align) ;
40+ eprintln ! ( "{}" , format!( "After aligning: {:?}" , ptr) ) ;
41+ ptr
42+ } }
43+
44+ fn check_overalign_requests < T : Alloc +Copy > ( mut allocator : T ) {
3345 let size = 8 ;
3446 // Greater than `size`.
3547 let align = 16 ;
3648
3749 let iterations = 5 ;
3850 unsafe {
3951 let pointers: Vec < _ > = ( 0 ..iterations) . map ( |_| {
40- allocator . alloc ( Layout :: from_size_align ( size, align) . unwrap ( ) ) . unwrap ( )
52+ allocate_with_align ( allocator , size, align)
4153 } ) . collect ( ) ;
4254 for & ptr in & pointers {
43- assert_eq ! ( ( ptr. as_ptr ( ) as usize ) % align, 0 ,
55+ assert_eq ! ( ( ptr as usize ) % align, 0 ,
4456 "Got a pointer less aligned than requested" )
4557 }
4658
4759 // Clean up.
4860 for & ptr in & pointers {
49- allocator. dealloc ( ptr, Layout :: from_size_align ( size, align ) . unwrap ( ) )
61+ allocator. dealloc ( NonNull :: new ( ptr) . unwrap ( ) , Layout :: from_size_align ( size, 1 ) . unwrap ( ) )
5062 }
5163 }
5264}
0 commit comments