blob: 4ca3f7a1aad94a50cd1152dc18ce0d72f9aee672 [file] [log] [blame]
// For rust-lang/rust#68303: the contents of `UnsafeCell<T>` cannot
// participate in the niche-optimization for enum discriminants. This
// test checks that an `Option<UnsafeCell<NonZeroU32>>` has the same
// size in memory as an `Option<UnsafeCell<u32>>` (namely, 8 bytes).
// run-pass
#![feature(no_niche)]
use std::cell::UnsafeCell;
use std::mem::size_of;
use std::num::NonZeroU32 as N32;
struct Wrapper<T>(T);
#[repr(transparent)]
struct Transparent<T>(T);
#[repr(no_niche)]
struct NoNiche<T>(T);
fn main() {
assert_eq!(size_of::<Option<Wrapper<u32>>>(), 8);
assert_eq!(size_of::<Option<Wrapper<N32>>>(), 4);
assert_eq!(size_of::<Option<Transparent<u32>>>(), 8);
assert_eq!(size_of::<Option<Transparent<N32>>>(), 4);
assert_eq!(size_of::<Option<NoNiche<u32>>>(), 8);
assert_eq!(size_of::<Option<NoNiche<N32>>>(), 8);
assert_eq!(size_of::<Option<UnsafeCell<u32>>>(), 8);
assert_eq!(size_of::<Option<UnsafeCell<N32>>>(), 8);
}