xref: /llvm-project/lldb/test/API/lang/rust/enum-structs/main.rs (revision e84751a21561c5b1d5673cdff8e22ac4cf2f5dc2)
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