@@ -29,24 +29,36 @@ fn check_alloc<T: Alloc>(mut allocator: T) { unsafe {
29
29
allocator. dealloc ( p4, Layout :: from_size_align ( 10 , 4 ) . unwrap ( ) ) ;
30
30
} }
31
31
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 ) {
33
45
let size = 8 ;
34
46
// Greater than `size`.
35
47
let align = 16 ;
36
48
37
49
let iterations = 5 ;
38
50
unsafe {
39
51
let pointers: Vec < _ > = ( 0 ..iterations) . map ( |_| {
40
- allocator . alloc ( Layout :: from_size_align ( size, align) . unwrap ( ) ) . unwrap ( )
52
+ allocate_with_align ( allocator , size, align)
41
53
} ) . collect ( ) ;
42
54
for & ptr in & pointers {
43
- assert_eq ! ( ( ptr. as_ptr ( ) as usize ) % align, 0 ,
55
+ assert_eq ! ( ( ptr as usize ) % align, 0 ,
44
56
"Got a pointer less aligned than requested" )
45
57
}
46
58
47
59
// Clean up.
48
60
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 ( ) )
50
62
}
51
63
}
52
64
}
0 commit comments