//! null pointer optimization preserves type sizes. //! //! Verifies that Option has the same size as T for non-null pointer types, //! and for custom enums that have a niche. //@ run-pass // Needs for Nothing variat in Enum #![allow(dead_code)] use std::mem; enum E { Thing(isize, T), Nothing((), ((), ()), [i8; 0]), } struct S(isize, T); // These are macros so we get useful assert messages. macro_rules! check_option { ($T:ty) => { assert_eq!(mem::size_of::>(), mem::size_of::<$T>()); }; } macro_rules! check_fancy { ($T:ty) => { assert_eq!(mem::size_of::>(), mem::size_of::>()); }; } macro_rules! check_type { ($T:ty) => {{ check_option!($T); check_fancy!($T); }}; } pub fn main() { check_type!(&'static isize); check_type!(Box); check_type!(extern "C" fn()); }