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