diff options
| author | The 8472 <git@infinite-source.de> | 2023-02-16 01:53:47 +0100 |
|---|---|---|
| committer | The 8472 <git@infinite-source.de> | 2023-04-27 22:29:03 +0200 |
| commit | faf2da3e2f04f525784fd4d41375e96a8356f4e3 (patch) | |
| tree | 25868df1def37fd8e25f845c31b43bb6287d8159 /tests/ui/structs-enums | |
| parent | be8e67d93c2daafcb006d7dc55b4b270c99d77f3 (diff) | |
| download | rust-faf2da3e2f04f525784fd4d41375e96a8356f4e3.tar.gz rust-faf2da3e2f04f525784fd4d41375e96a8356f4e3.zip | |
try two different niche-placement strategies when layouting univariant structs
Diffstat (limited to 'tests/ui/structs-enums')
| -rw-r--r-- | tests/ui/structs-enums/type-sizes.rs | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/tests/ui/structs-enums/type-sizes.rs b/tests/ui/structs-enums/type-sizes.rs index 63e2f3150c0..4bae1e07d0a 100644 --- a/tests/ui/structs-enums/type-sizes.rs +++ b/tests/ui/structs-enums/type-sizes.rs @@ -4,9 +4,14 @@ #![allow(dead_code)] #![feature(never_type)] #![feature(pointer_is_aligned)] +#![feature(ptr_from_ref)] +#![feature(strict_provenance)] use std::mem::size_of; -use std::num::NonZeroU8; +use std::num::{NonZeroU8, NonZeroU16}; +use std::ptr; +use std::ptr::NonNull; +use std::borrow::Cow; struct t {a: u8, b: i8} struct u {a: u8, b: i8, c: u8} @@ -181,6 +186,17 @@ struct Reorder2 { ary: [u8; 6], } +// standins for std types which we want to be laid out in a reasonable way +struct RawVecDummy { + ptr: NonNull<u8>, + cap: usize, +} + +struct VecDummy { + r: RawVecDummy, + len: usize, +} + pub fn main() { assert_eq!(size_of::<u8>(), 1 as usize); assert_eq!(size_of::<u32>(), 4 as usize); @@ -270,4 +286,16 @@ pub fn main() { let v = Reorder2 {a: 0, b: 0, ary: [0; 6]}; assert_eq!(size_of::<Reorder2>(), 10); assert!((&v.ary).as_ptr().is_aligned_to(2), "[u8; 6] should group with align-2 fields"); + + let v = VecDummy { r: RawVecDummy { ptr: NonNull::dangling(), cap: 0 }, len: 1 }; + assert_eq!(ptr::from_ref(&v), ptr::from_ref(&v.r.ptr).cast(), + "sort niches to the front where possible"); + + // Ideal layouts: (bool, u8, NonZeroU16) or (NonZeroU16, u8, bool) + // Currently the layout algorithm will choose the latter because it doesn't attempt + // to aggregate multiple smaller fields to move a niche before a higher-alignment one. + let b = BoolInTheMiddle( NonZeroU16::new(1).unwrap(), true, 0); + assert!(ptr::from_ref(&b.1).addr() > ptr::from_ref(&b.2).addr()); + + assert_eq!(size_of::<Cow<'static, str>>(), size_of::<String>()); } |
