99// except according to those terms.
1010
1111
12- use std:: mem:: size_of;
12+ use std:: mem:: { size_of, align_of } ;
1313
1414#[ repr( i8 ) ]
1515enum Ei8 {
@@ -71,14 +71,20 @@ enum Euint {
7171 Buint = 1
7272}
7373
74+ #[ repr( u8 ) ]
75+ enum Eu8NonCLike < T > {
76+ _None,
77+ _Some( T ) ,
78+ }
79+
7480#[ repr( i64 ) ]
75- enum Ei64_non_c_like < T > {
81+ enum Ei64NonCLike < T > {
7682 _None,
7783 _Some( T ) ,
7884}
7985
8086#[ repr( u64 ) ]
81- enum Eu64_non_c_like < T > {
87+ enum Eu64NonCLike < T > {
8288 _None,
8389 _Some( T ) ,
8490}
@@ -94,6 +100,17 @@ pub fn main() {
94100 assert_eq ! ( size_of:: <Eu64 >( ) , 8 ) ;
95101 assert_eq ! ( size_of:: <Eint >( ) , size_of:: <isize >( ) ) ;
96102 assert_eq ! ( size_of:: <Euint >( ) , size_of:: <usize >( ) ) ;
97- assert_eq ! ( size_of:: <Ei64_non_c_like <( ) >>( ) , 8 ) ;
98- assert_eq ! ( size_of:: <Eu64_non_c_like <( ) >>( ) , 8 ) ;
103+ assert_eq ! ( size_of:: <Eu8NonCLike <( ) >>( ) , 1 ) ;
104+ assert_eq ! ( size_of:: <Ei64NonCLike <( ) >>( ) , 8 ) ;
105+ assert_eq ! ( size_of:: <Eu64NonCLike <( ) >>( ) , 8 ) ;
106+ let u8_expected_size = round_up ( 9 , align_of :: < Eu64NonCLike < u8 > > ( ) ) ;
107+ assert_eq ! ( size_of:: <Eu64NonCLike <u8 >>( ) , u8_expected_size) ;
108+ let array_expected_size = round_up ( 28 , align_of :: < Eu64NonCLike < [ u32 ; 5 ] > > ( ) ) ;
109+ assert_eq ! ( size_of:: <Eu64NonCLike <[ u32 ; 5 ] >>( ) , array_expected_size) ;
110+ assert_eq ! ( size_of:: <Eu64NonCLike <[ u32 ; 6 ] >>( ) , 32 ) ;
111+ }
112+
113+ // Rounds x up to the next multiple of a
114+ fn round_up ( x : usize , a : usize ) -> usize {
115+ ( ( x + ( a - 1 ) ) / a) * a
99116}
0 commit comments