162 lines · rust
1#![feature(repr128)]2#![feature(rustc_attrs)]3#![feature(const_option)]4 5use core::num::{NonZeroI128, NonZeroU32};6 7/// This file was manually compiled with rustc as object file8/// obj2yaml tool was used to convert this to main.yaml9/// This is done in order to make the test portable since LLVM codebase tests don't have setup to compile Rust programs10/// no_std , no_main is used in order to make the object file as small as possible eliminating extra symbols from standard library11/// static global variables are used because they can be inspected on object file without starting the process12 13/// Command:14/// rustc -g --emit=obj --crate-type=bin -C panic=abort -C link-arg=-nostdlib main.rs && obj2yaml main.o -o main.yaml15use core::ptr::NonNull;16 17pub enum CLikeEnumDefault {18 A = 2,19 B = 10,20}21 22#[repr(u8)]23pub enum CLikeEnumReprU8 {24 VariantA,25 VariantB,26 VariantC,27}28 29#[repr(u32)]30pub enum CLikeEnumReprU32 {31 VariantA = 1,32 VariantB = 2,33 VariantC = 3,34}35 36pub enum EnumWithTuples {37 A(u8),38 B(u16),39 C(u32),40 D(usize),41 AA(u8, u8),42 BB(u16, u16),43 BC(u16, u32),44 CC(u32, u32),45 // no DD on purpose to have D = CC in size46}47 48pub enum EnumWithStructs {49 A(Struct1),50 B(Struct2),51}52 53#[repr(usize)]54pub enum MixedEnum {55 A,56 B(i32),57 C(u8, i32),58 D(Option<Struct2>),59 E(EnumWithStructs),60}61 62pub struct Struct1 {63 field: i32,64}65 66pub struct Struct2 {67 field: u32,68 inner: Struct1,69}70 71pub struct NonNullHolder {72 inner: Option<NonNull<u64>>,73}74 75pub enum NicheLayoutEnum {76 Tag1,77 Data { my_data: CLikeEnumDefault },78 Tag2,79}80 81// The following three types will use a niche layout once82pub enum NicheLayoutWithFields1<'a> {83 A(&'a u8, u32),84 B(u32),85}86 87pub enum NicheLayoutWithFields2 {88 A(NonZeroU32, u64),89 B(u64),90}91 92pub enum NicheLayoutWithFields3 {93 A(u8, bool),94 B(u8),95 C(bool),96 D(u8),97 E(u8),98 F,99}100 101#[repr(i128)]102enum DirectTag128 {103 A(u32),104 B(u32),105}106 107static CLIKE_DEFAULT_A: CLikeEnumDefault = CLikeEnumDefault::A;108static CLIKE_DEFAULT_B: CLikeEnumDefault = CLikeEnumDefault::B;109 110static CLIKE_U8_A: CLikeEnumReprU8 = CLikeEnumReprU8::VariantA;111static CLIKE_U8_B: CLikeEnumReprU8 = CLikeEnumReprU8::VariantB;112static CLIKE_U8_C: CLikeEnumReprU8 = CLikeEnumReprU8::VariantC;113 114static CLIKE_U32_A: CLikeEnumReprU32 = CLikeEnumReprU32::VariantA;115static CLIKE_U32_B: CLikeEnumReprU32 = CLikeEnumReprU32::VariantB;116static CLIKE_U32_C: CLikeEnumReprU32 = CLikeEnumReprU32::VariantC;117 118static ENUM_WITH_TUPLES_A: EnumWithTuples = EnumWithTuples::A(13);119static ENUM_WITH_TUPLES_AA: EnumWithTuples = EnumWithTuples::AA(13, 37);120static ENUM_WITH_TUPLES_B: EnumWithTuples = EnumWithTuples::B(37);121static ENUM_WITH_TUPLES_BB: EnumWithTuples = EnumWithTuples::BB(37, 5535);122static ENUM_WITH_TUPLES_BC: EnumWithTuples = EnumWithTuples::BC(65000, 165000);123static ENUM_WITH_TUPLES_C: EnumWithTuples = EnumWithTuples::C(31337);124static ENUM_WITH_TUPLES_CC: EnumWithTuples = EnumWithTuples::CC(31337, 87236);125static ENUM_WITH_TUPLES_D: EnumWithTuples = EnumWithTuples::D(123456789012345678);126 127static MIXED_ENUM_A: MixedEnum = MixedEnum::A;128static MIXED_ENUM_B: MixedEnum = MixedEnum::B(-10);129static MIXED_ENUM_C: MixedEnum = MixedEnum::C(254, -254);130static MIXED_ENUM_D_NONE: MixedEnum = MixedEnum::D(None);131static MIXED_ENUM_D_SOME: MixedEnum = MixedEnum::D(Some(Struct2 {132 field: 123456,133 inner: Struct1 { field: 123 },134}));135 136static NICHE_W_FIELDS_1_A: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);137static NICHE_W_FIELDS_1_B: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);138static NICHE_W_FIELDS_2_A: NicheLayoutWithFields2 =139 NicheLayoutWithFields2::A(NonZeroU32::new(800).unwrap(), 900);140static NICHE_W_FIELDS_2_B: NicheLayoutWithFields2 = NicheLayoutWithFields2::B(1000);141static NICHE_W_FIELDS_3_A: NicheLayoutWithFields3 = NicheLayoutWithFields3::A(137, true);142static NICHE_W_FIELDS_3_B: NicheLayoutWithFields3 = NicheLayoutWithFields3::B(12);143static NICHE_W_FIELDS_3_C: NicheLayoutWithFields3 = NicheLayoutWithFields3::C(false);144static NICHE_W_FIELDS_3_D: NicheLayoutWithFields3 = NicheLayoutWithFields3::D(34);145static NICHE_W_FIELDS_3_E: NicheLayoutWithFields3 = NicheLayoutWithFields3::E(56);146static NICHE_W_FIELDS_3_F: NicheLayoutWithFields3 = NicheLayoutWithFields3::F;147 148static DIRECT_TAG_128_A: DirectTag128 = DirectTag128::A(12345);149static DIRECT_TAG_128_B: DirectTag128 = DirectTag128::B(6789);150 151pub fn main() {152 let niche_w_fields_1_a: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);153 let niche_w_fields_1_b: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);154 let direct_tag_128_a: DirectTag128 = DirectTag128::A(0xF1F2);155 let direct_tag_128_b: DirectTag128 = DirectTag128::B(0xF3F4);156 let non_null = unsafe {157 NonNullHolder {158 inner: NonNull::new(12345 as *mut u64),159 }160 };161}162