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
+ use std:: os:: raw:: c_int;
13
14
14
15
// The two enums that follow are designed so that bugs trigger layout optimization.
15
16
// Specifically, if either of the following reprs used here is not detected by the compiler,
@@ -27,6 +28,38 @@ enum E2 {
27
28
B ( u8 , u16 , u8 )
28
29
}
29
30
31
+ // Check that repr(int) and repr(C) are in fact different from the above
32
+
33
+ #[ repr( u8 ) ]
34
+ enum E3 {
35
+ A ( u8 , u16 , u8 ) ,
36
+ B ( u8 , u16 , u8 )
37
+ }
38
+
39
+ #[ repr( u16 ) ]
40
+ enum E4 {
41
+ A ( u8 , u16 , u8 ) ,
42
+ B ( u8 , u16 , u8 )
43
+ }
44
+
45
+ #[ repr( u32 ) ]
46
+ enum E5 {
47
+ A ( u8 , u16 , u8 ) ,
48
+ B ( u8 , u16 , u8 )
49
+ }
50
+
51
+ #[ repr( u64 ) ]
52
+ enum E6 {
53
+ A ( u8 , u16 , u8 ) ,
54
+ B ( u8 , u16 , u8 )
55
+ }
56
+
57
+ #[ repr( C ) ]
58
+ enum E7 {
59
+ A ( u8 , u16 , u8 ) ,
60
+ B ( u8 , u16 , u8 )
61
+ }
62
+
30
63
// From pr 37429
31
64
32
65
#[ repr( C , packed) ]
@@ -37,7 +70,20 @@ pub struct p0f_api_query {
37
70
}
38
71
39
72
pub fn main ( ) {
40
- assert_eq ! ( size_of:: <E1 >( ) , 6 ) ;
41
- assert_eq ! ( size_of:: <E2 >( ) , 6 ) ;
73
+ assert_eq ! ( size_of:: <E1 >( ) , 8 ) ;
74
+ assert_eq ! ( size_of:: <E2 >( ) , 8 ) ;
75
+ assert_eq ! ( size_of:: <E3 >( ) , 6 ) ;
76
+ assert_eq ! ( size_of:: <E4 >( ) , 8 ) ;
77
+ assert_eq ! ( size_of:: <E5 >( ) , align_size( 10 , align_of:: <u32 >( ) ) ) ;
78
+ assert_eq ! ( size_of:: <E6 >( ) , align_size( 14 , align_of:: <u64 >( ) ) ) ;
79
+ assert_eq ! ( size_of:: <E7 >( ) , align_size( 6 + size_of:: <c_int>( ) , align_of:: <c_int>( ) ) ) ;
42
80
assert_eq ! ( size_of:: <p0f_api_query>( ) , 21 ) ;
43
81
}
82
+
83
+ fn align_size ( size : usize , align : usize ) -> usize {
84
+ if size % align != 0 {
85
+ size + ( align - ( size % align) )
86
+ } else {
87
+ size
88
+ }
89
+ }
0 commit comments