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