diff options
Diffstat (limited to 'src/test/run-pass/structs-enums/enum-null-pointer-opt.rs')
| -rw-r--r-- | src/test/run-pass/structs-enums/enum-null-pointer-opt.rs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/test/run-pass/structs-enums/enum-null-pointer-opt.rs b/src/test/run-pass/structs-enums/enum-null-pointer-opt.rs index 87629665bc2..f871c218558 100644 --- a/src/test/run-pass/structs-enums/enum-null-pointer-opt.rs +++ b/src/test/run-pass/structs-enums/enum-null-pointer-opt.rs @@ -1,4 +1,6 @@ // run-pass +#![feature(transparent_unions)] + use std::mem::size_of; use std::num::NonZeroUsize; use std::ptr::NonNull; @@ -10,6 +12,11 @@ trait Mirror { type Image; } impl<T> Mirror for T { type Image = T; } struct ParamTypeStruct<T>(T); struct AssocTypeStruct<T>(<T as Mirror>::Image); +#[repr(transparent)] +union MaybeUninitUnion<T: Copy> { + _value: T, + _uninit: (), +} fn main() { // Functions @@ -29,9 +36,12 @@ fn main() { // Pointers - Box<T> assert_eq!(size_of::<Box<isize>>(), size_of::<Option<Box<isize>>>()); - // The optimization can't apply to raw pointers + // The optimization can't apply to raw pointers or unions with a ZST field. assert!(size_of::<Option<*const isize>>() != size_of::<*const isize>()); assert!(Some(0 as *const isize).is_some()); // Can't collapse None to null + assert_ne!(size_of::<fn(isize)>(), size_of::<Option<MaybeUninitUnion<fn(isize)>>>()); + assert_ne!(size_of::<&str>(), size_of::<Option<MaybeUninitUnion<&str>>>()); + assert_ne!(size_of::<NonNull<isize>>(), size_of::<Option<MaybeUninitUnion<NonNull<isize>>>>()); struct Foo { _a: Box<isize> |
