| //@ run-pass | |
| // Test that we will do various size optimizations to enum layout, but | |
| // *not* if `#[repr(u8)]` or `#[repr(C)]` is passed. See also #40029. | |
| #![allow(dead_code)] | |
| use std::mem; | |
| enum Nullable<T> { | |
| Alive(T), | |
| Dropped, | |
| } | |
| #[repr(u8)] | |
| enum NullableU8<T> { | |
| Alive(T), | |
| Dropped, | |
| } | |
| #[repr(C)] | |
| enum NullableC<T> { | |
| Alive(T), | |
| Dropped, | |
| } | |
| struct StructNewtype<T>(T); | |
| #[repr(C)] | |
| struct StructNewtypeC<T>(T); | |
| enum EnumNewtype<T> { Variant(T) } | |
| #[repr(u8)] | |
| enum EnumNewtypeU8<T> { Variant(T) } | |
| #[repr(C)] | |
| enum EnumNewtypeC<T> { Variant(T) } | |
| fn main() { | |
| assert!(mem::size_of::<Box<i32>>() == mem::size_of::<Nullable<Box<i32>>>()); | |
| assert!(mem::size_of::<Box<i32>>() < mem::size_of::<NullableU8<Box<i32>>>()); | |
| assert!(mem::size_of::<Box<i32>>() < mem::size_of::<NullableC<Box<i32>>>()); | |
| assert!(mem::size_of::<i32>() == mem::size_of::<StructNewtype<i32>>()); | |
| assert!(mem::size_of::<i32>() == mem::size_of::<StructNewtypeC<i32>>()); | |
| assert!(mem::size_of::<i32>() == mem::size_of::<EnumNewtype<i32>>()); | |
| assert!(mem::size_of::<i32>() < mem::size_of::<EnumNewtypeU8<i32>>()); | |
| assert!(mem::size_of::<i32>() < mem::size_of::<EnumNewtypeC<i32>>()); | |
| } |