| #![feature(repr128)] |
| #![feature(rustc_attrs)] |
| #![feature(const_option)] |
| |
| use core::num::{NonZeroI128, NonZeroU32}; |
| |
| /// This file was manually compiled with rustc as object file |
| /// obj2yaml tool was used to convert this to main.yaml |
| /// This is done in order to make the test portable since LLVM codebase tests don't have setup to compile Rust programs |
| /// no_std , no_main is used in order to make the object file as small as possible eliminating extra symbols from standard library |
| /// static global variables are used because they can be inspected on object file without starting the process |
| |
| /// Command: |
| /// rustc -g --emit=obj --crate-type=bin -C panic=abort -C link-arg=-nostdlib main.rs && obj2yaml main.o -o main.yaml |
| use core::ptr::NonNull; |
| |
| pub enum CLikeEnumDefault { |
| A = 2, |
| B = 10, |
| } |
| |
| #[repr(u8)] |
| pub enum CLikeEnumReprU8 { |
| VariantA, |
| VariantB, |
| VariantC, |
| } |
| |
| #[repr(u32)] |
| pub enum CLikeEnumReprU32 { |
| VariantA = 1, |
| VariantB = 2, |
| VariantC = 3, |
| } |
| |
| pub enum EnumWithTuples { |
| A(u8), |
| B(u16), |
| C(u32), |
| D(usize), |
| AA(u8, u8), |
| BB(u16, u16), |
| BC(u16, u32), |
| CC(u32, u32), |
| // no DD on purpose to have D = CC in size |
| } |
| |
| pub enum EnumWithStructs { |
| A(Struct1), |
| B(Struct2), |
| } |
| |
| #[repr(usize)] |
| pub enum MixedEnum { |
| A, |
| B(i32), |
| C(u8, i32), |
| D(Option<Struct2>), |
| E(EnumWithStructs), |
| } |
| |
| pub struct Struct1 { |
| field: i32, |
| } |
| |
| pub struct Struct2 { |
| field: u32, |
| inner: Struct1, |
| } |
| |
| pub struct NonNullHolder { |
| inner: Option<NonNull<u64>>, |
| } |
| |
| pub enum NicheLayoutEnum { |
| Tag1, |
| Data { my_data: CLikeEnumDefault }, |
| Tag2, |
| } |
| |
| // The following three types will use a niche layout once |
| pub enum NicheLayoutWithFields1<'a> { |
| A(&'a u8, u32), |
| B(u32), |
| } |
| |
| pub enum NicheLayoutWithFields2 { |
| A(NonZeroU32, u64), |
| B(u64), |
| } |
| |
| pub enum NicheLayoutWithFields3 { |
| A(u8, bool), |
| B(u8), |
| C(bool), |
| D(u8), |
| E(u8), |
| F, |
| } |
| |
| #[repr(i128)] |
| enum DirectTag128 { |
| A(u32), |
| B(u32), |
| } |
| |
| static CLIKE_DEFAULT_A: CLikeEnumDefault = CLikeEnumDefault::A; |
| static CLIKE_DEFAULT_B: CLikeEnumDefault = CLikeEnumDefault::B; |
| |
| static CLIKE_U8_A: CLikeEnumReprU8 = CLikeEnumReprU8::VariantA; |
| static CLIKE_U8_B: CLikeEnumReprU8 = CLikeEnumReprU8::VariantB; |
| static CLIKE_U8_C: CLikeEnumReprU8 = CLikeEnumReprU8::VariantC; |
| |
| static CLIKE_U32_A: CLikeEnumReprU32 = CLikeEnumReprU32::VariantA; |
| static CLIKE_U32_B: CLikeEnumReprU32 = CLikeEnumReprU32::VariantB; |
| static CLIKE_U32_C: CLikeEnumReprU32 = CLikeEnumReprU32::VariantC; |
| |
| static ENUM_WITH_TUPLES_A: EnumWithTuples = EnumWithTuples::A(13); |
| static ENUM_WITH_TUPLES_AA: EnumWithTuples = EnumWithTuples::AA(13, 37); |
| static ENUM_WITH_TUPLES_B: EnumWithTuples = EnumWithTuples::B(37); |
| static ENUM_WITH_TUPLES_BB: EnumWithTuples = EnumWithTuples::BB(37, 5535); |
| static ENUM_WITH_TUPLES_BC: EnumWithTuples = EnumWithTuples::BC(65000, 165000); |
| static ENUM_WITH_TUPLES_C: EnumWithTuples = EnumWithTuples::C(31337); |
| static ENUM_WITH_TUPLES_CC: EnumWithTuples = EnumWithTuples::CC(31337, 87236); |
| static ENUM_WITH_TUPLES_D: EnumWithTuples = EnumWithTuples::D(123456789012345678); |
| |
| static MIXED_ENUM_A: MixedEnum = MixedEnum::A; |
| static MIXED_ENUM_B: MixedEnum = MixedEnum::B(-10); |
| static MIXED_ENUM_C: MixedEnum = MixedEnum::C(254, -254); |
| static MIXED_ENUM_D_NONE: MixedEnum = MixedEnum::D(None); |
| static MIXED_ENUM_D_SOME: MixedEnum = MixedEnum::D(Some(Struct2 { |
| field: 123456, |
| inner: Struct1 { field: 123 }, |
| })); |
| |
| static NICHE_W_FIELDS_1_A: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7); |
| static NICHE_W_FIELDS_1_B: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99); |
| static NICHE_W_FIELDS_2_A: NicheLayoutWithFields2 = |
| NicheLayoutWithFields2::A(NonZeroU32::new(800).unwrap(), 900); |
| static NICHE_W_FIELDS_2_B: NicheLayoutWithFields2 = NicheLayoutWithFields2::B(1000); |
| static NICHE_W_FIELDS_3_A: NicheLayoutWithFields3 = NicheLayoutWithFields3::A(137, true); |
| static NICHE_W_FIELDS_3_B: NicheLayoutWithFields3 = NicheLayoutWithFields3::B(12); |
| static NICHE_W_FIELDS_3_C: NicheLayoutWithFields3 = NicheLayoutWithFields3::C(false); |
| static NICHE_W_FIELDS_3_D: NicheLayoutWithFields3 = NicheLayoutWithFields3::D(34); |
| static NICHE_W_FIELDS_3_E: NicheLayoutWithFields3 = NicheLayoutWithFields3::E(56); |
| static NICHE_W_FIELDS_3_F: NicheLayoutWithFields3 = NicheLayoutWithFields3::F; |
| |
| static DIRECT_TAG_128_A: DirectTag128 = DirectTag128::A(12345); |
| static DIRECT_TAG_128_B: DirectTag128 = DirectTag128::B(6789); |
| |
| pub fn main() { |
| let niche_w_fields_1_a: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7); |
| let niche_w_fields_1_b: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99); |
| let direct_tag_128_a: DirectTag128 = DirectTag128::A(0xF1F2); |
| let direct_tag_128_b: DirectTag128 = DirectTag128::B(0xF3F4); |
| let non_null = unsafe { |
| NonNullHolder { |
| inner: NonNull::new(12345 as *mut u64), |
| } |
| }; |
| } |