File tree 1 file changed +21
-0
lines changed
1 file changed +21
-0
lines changed Original file line number Diff line number Diff line change
1
+ // run-pass
2
+ use std:: ptr:: addr_of;
3
+
4
+ // When the unsized tail is a `dyn Trait`, its alignments is only dynamically known. This means the
5
+ // packed(2) needs to be applied at runtime: the actual alignment of the field is `min(2,
6
+ // usual_alignment)`. Here we check that we do this right by comparing size, alignment, and field
7
+ // offset before and after unsizing.
8
+ fn main ( ) {
9
+ #[ repr( C , packed( 2 ) ) ]
10
+ struct Packed < T : ?Sized > ( u8 , core:: mem:: ManuallyDrop < T > ) ;
11
+
12
+ let p = Packed ( 0 , core:: mem:: ManuallyDrop :: new ( 1 ) ) ;
13
+ let p: & Packed < usize > = & p;
14
+ let sized = ( core:: mem:: size_of_val ( p) , core:: mem:: align_of_val ( p) ) ;
15
+ let sized_offset = unsafe { addr_of ! ( p. 1 ) . cast :: < u8 > ( ) . offset_from ( addr_of ! ( p. 0 ) ) } ;
16
+ let p: & Packed < dyn Send > = p;
17
+ let un_sized = ( core:: mem:: size_of_val ( p) , core:: mem:: align_of_val ( p) ) ;
18
+ let un_sized_offset = unsafe { addr_of ! ( p. 1 ) . cast :: < u8 > ( ) . offset_from ( addr_of ! ( p. 0 ) ) } ;
19
+ assert_eq ! ( sized, un_sized) ;
20
+ assert_eq ! ( sized_offset, un_sized_offset) ;
21
+ }
You can’t perform that action at this time.
0 commit comments