about summary refs log tree commit diff
path: root/src/test/run-pass/structs-enums/enum-null-pointer-opt.rs
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-06-11 11:06:38 +0000
committerbors <bors@rust-lang.org>2019-06-11 11:06:38 +0000
commit8e948df707ea8a3c88c65bf2ffdcb2f1cf5491be (patch)
treecaf2cb5f0b7881b6056c37c37c2e73e46b520aab /src/test/run-pass/structs-enums/enum-null-pointer-opt.rs
parent912d22e36965d3c9f6d7f14ca18657182aa1fe54 (diff)
parentdac1c6a731713ec9e90a1e05b3e2c789faf3f2ba (diff)
Auto merge of #60463 - mjbshaw:transparent, r=varkor,rkruppe
Implement RFC 2645 (transparent enums and unions)

Tracking issue: #60405
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.rs12
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>