9
9
// except according to those terms.
10
10
11
11
12
- use std:: mem:: size_of;
12
+ use std:: mem:: { size_of, align_of } ;
13
13
14
14
#[ repr( i8 ) ]
15
15
enum Ei8 {
@@ -71,14 +71,20 @@ enum Euint {
71
71
Buint = 1
72
72
}
73
73
74
+ #[ repr( u8 ) ]
75
+ enum Eu8NonCLike < T > {
76
+ _None,
77
+ _Some( T ) ,
78
+ }
79
+
74
80
#[ repr( i64 ) ]
75
- enum Ei64_non_c_like < T > {
81
+ enum Ei64NonCLike < T > {
76
82
_None,
77
83
_Some( T ) ,
78
84
}
79
85
80
86
#[ repr( u64 ) ]
81
- enum Eu64_non_c_like < T > {
87
+ enum Eu64NonCLike < T > {
82
88
_None,
83
89
_Some( T ) ,
84
90
}
@@ -94,6 +100,17 @@ pub fn main() {
94
100
assert_eq ! ( size_of:: <Eu64 >( ) , 8 ) ;
95
101
assert_eq ! ( size_of:: <Eint >( ) , size_of:: <isize >( ) ) ;
96
102
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
99
116
}
0 commit comments