| //@ 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>>()); |
| } |