1 // run-pass 2 // Test that we will do various size optimizations to enum layout, but 3 // *not* if `#[repr(u8)]` or `#[repr(C)]` is passed. See also #40029. 4 5 #![allow(dead_code)] 6 7 use std::mem; 8 9 enum Nullable<T> { 10 Alive(T), 11 Dropped, 12 } 13 14 #[repr(u8)] 15 enum NullableU8<T> { 16 Alive(T), 17 Dropped, 18 } 19 20 #[repr(C)] 21 enum NullableC<T> { 22 Alive(T), 23 Dropped, 24 } 25 26 struct StructNewtype<T>(T); 27 28 #[repr(C)] 29 struct StructNewtypeC<T>(T); 30 31 enum EnumNewtype<T> { Variant(T) } 32 33 #[repr(u8)] 34 enum EnumNewtypeU8<T> { Variant(T) } 35 36 #[repr(C)] 37 enum EnumNewtypeC<T> { Variant(T) } 38 main()39fn main() { 40 assert!(mem::size_of::<Box<i32>>() == mem::size_of::<Nullable<Box<i32>>>()); 41 assert!(mem::size_of::<Box<i32>>() < mem::size_of::<NullableU8<Box<i32>>>()); 42 assert!(mem::size_of::<Box<i32>>() < mem::size_of::<NullableC<Box<i32>>>()); 43 44 assert!(mem::size_of::<i32>() == mem::size_of::<StructNewtype<i32>>()); 45 assert!(mem::size_of::<i32>() == mem::size_of::<StructNewtypeC<i32>>()); 46 47 assert!(mem::size_of::<i32>() == mem::size_of::<EnumNewtype<i32>>()); 48 assert!(mem::size_of::<i32>() < mem::size_of::<EnumNewtypeU8<i32>>()); 49 assert!(mem::size_of::<i32>() < mem::size_of::<EnumNewtypeC<i32>>()); 50 } 51