1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
#![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),
}
};
}
|