#![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),
}
};
}