File tree Expand file tree Collapse file tree 1 file changed +21
-0
lines changed Expand file tree Collapse file tree 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