Skip to content

Commit 0e63d27

Browse files
committed
Fix and improve test for enum repr sizes
1 parent 7e79b9b commit 0e63d27

File tree

1 file changed

+49
-3
lines changed

1 file changed

+49
-3
lines changed

src/test/run-pass/multiple-reprs.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
// except according to those terms.
1010

1111

12-
use std::mem::size_of;
12+
use std::mem::{size_of, align_of};
13+
use std::os::raw::c_int;
1314

1415
// The two enums that follow are designed so that bugs trigger layout optimization.
1516
// Specifically, if either of the following reprs used here is not detected by the compiler,
@@ -27,6 +28,38 @@ enum E2 {
2728
B(u8, u16, u8)
2829
}
2930

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+
3063
// From pr 37429
3164

3265
#[repr(C,packed)]
@@ -37,7 +70,20 @@ pub struct p0f_api_query {
3770
}
3871

3972
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>()));
4280
assert_eq!(size_of::<p0f_api_query>(), 21);
4381
}
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

Comments
 (0)