diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
commit | 218caa410aa38c29984be31a5229b9fa717560ee (patch) | |
tree | c54bd55eeb6e4c508940a30e94c0032fbd45d677 /tests/ui/repr/repr-transparent.rs | |
parent | Releasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff) | |
download | rustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/repr/repr-transparent.rs')
-rw-r--r-- | tests/ui/repr/repr-transparent.rs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/ui/repr/repr-transparent.rs b/tests/ui/repr/repr-transparent.rs new file mode 100644 index 000000000..8c9d1639c --- /dev/null +++ b/tests/ui/repr/repr-transparent.rs @@ -0,0 +1,90 @@ +// This file tests repr(transparent)-related errors reported during typeck. Other errors +// that are reported earlier and therefore preempt these are tested in: +// - repr-transparent-other-reprs.rs +// - repr-transparent-other-items.rs + +#![feature(transparent_unions)] + +use std::marker::PhantomData; + +#[repr(transparent)] +struct NoFields; + +#[repr(transparent)] +struct ContainsOnlyZst(()); + +#[repr(transparent)] +struct ContainsOnlyZstArray([bool; 0]); + +#[repr(transparent)] +struct ContainsMultipleZst(PhantomData<*const i32>, NoFields); + +#[repr(transparent)] +struct ContainsZstAndNonZst((), [i32; 2]); + +#[repr(transparent)] +struct MultipleNonZst(u8, u8); //~ ERROR needs at most one non-zero-sized field + +trait Mirror { type It: ?Sized; } +impl<T: ?Sized> Mirror for T { type It = Self; } + +#[repr(transparent)] +pub struct StructWithProjection(f32, <f32 as Mirror>::It); +//~^ ERROR needs at most one non-zero-sized field + +#[repr(transparent)] +struct NontrivialAlignZst(u32, [u16; 0]); //~ ERROR alignment larger than 1 + +#[repr(align(32))] +struct ZstAlign32<T>(PhantomData<T>); + +#[repr(transparent)] +struct GenericAlign<T>(ZstAlign32<T>, u32); //~ ERROR alignment larger than 1 + +#[repr(transparent)] //~ ERROR unsupported representation for zero-variant enum +enum Void {} //~ ERROR transparent enum needs exactly one variant, but has 0 + +#[repr(transparent)] +enum FieldlessEnum { + Foo, +} + +#[repr(transparent)] +enum UnitFieldEnum { + Foo(()), +} + +#[repr(transparent)] +enum TooManyFieldsEnum { + Foo(u32, String), +} +//~^^^ ERROR transparent enum needs at most one non-zero-sized field, but has 2 + +#[repr(transparent)] +enum MultipleVariants { //~ ERROR transparent enum needs exactly one variant, but has 2 + Foo(String), + Bar, +} + +#[repr(transparent)] +enum NontrivialAlignZstEnum { + Foo(u32, [u16; 0]), //~ ERROR alignment larger than 1 +} + +#[repr(transparent)] +enum GenericAlignEnum<T> { + Foo { bar: ZstAlign32<T>, baz: u32 } //~ ERROR alignment larger than 1 +} + +#[repr(transparent)] +union UnitUnion { + u: (), +} + +#[repr(transparent)] +union TooManyFields { //~ ERROR transparent union needs at most one non-zero-sized field, but has 2 + u: u32, + s: i32 +} + +fn main() {} |