1 #include <stdarg.h>
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include <stdlib.h>
5 
6 enum FillRule {
7   A,
8   B,
9 };
10 typedef uint8_t FillRule;
11 
12 /**
13  * This will have a destructor manually implemented via variant_body, and
14  * similarly a Drop impl in Rust.
15  */
16 struct OwnedSlice_u32 {
17   uintptr_t len;
18   uint32_t *ptr;
19 };
20 
21 struct Polygon_u32 {
22   FillRule fill;
23   struct OwnedSlice_u32 coordinates;
24 };
25 
26 /**
27  * This will have a destructor manually implemented via variant_body, and
28  * similarly a Drop impl in Rust.
29  */
30 struct OwnedSlice_i32 {
31   uintptr_t len;
32   int32_t *ptr;
33 };
34 
35 enum Foo_u32_Tag {
36   Bar_u32,
37   Polygon1_u32,
38   Slice1_u32,
39   Slice2_u32,
40   Slice3_u32,
41   Slice4_u32,
42 };
43 typedef uint8_t Foo_u32_Tag;
44 
45 struct Polygon1_Body_u32 {
46   struct Polygon_u32 _0;
47 };
48 
49 struct Slice1_Body_u32 {
50   struct OwnedSlice_u32 _0;
51 };
52 
53 struct Slice2_Body_u32 {
54   struct OwnedSlice_i32 _0;
55 };
56 
57 struct Slice3_Body_u32 {
58   FillRule fill;
59   struct OwnedSlice_u32 coords;
60 };
61 
62 struct Slice4_Body_u32 {
63   FillRule fill;
64   struct OwnedSlice_i32 coords;
65 };
66 
67 struct Foo_u32 {
68   Foo_u32_Tag tag;
69   union {
70     struct Polygon1_Body_u32 polygon1;
71     struct Slice1_Body_u32 slice1;
72     struct Slice2_Body_u32 slice2;
73     struct Slice3_Body_u32 slice3;
74     struct Slice4_Body_u32 slice4;
75   };
76 };
77 
78 struct Polygon_i32 {
79   FillRule fill;
80   struct OwnedSlice_i32 coordinates;
81 };
82 
83 enum Baz_i32_Tag {
84   Bar2_i32,
85   Polygon21_i32,
86   Slice21_i32,
87   Slice22_i32,
88   Slice23_i32,
89   Slice24_i32,
90 };
91 typedef uint8_t Baz_i32_Tag;
92 
93 struct Polygon21_Body_i32 {
94   Baz_i32_Tag tag;
95   struct Polygon_i32 _0;
96 };
97 
98 struct Slice21_Body_i32 {
99   Baz_i32_Tag tag;
100   struct OwnedSlice_i32 _0;
101 };
102 
103 struct Slice22_Body_i32 {
104   Baz_i32_Tag tag;
105   struct OwnedSlice_i32 _0;
106 };
107 
108 struct Slice23_Body_i32 {
109   Baz_i32_Tag tag;
110   FillRule fill;
111   struct OwnedSlice_i32 coords;
112 };
113 
114 struct Slice24_Body_i32 {
115   Baz_i32_Tag tag;
116   FillRule fill;
117   struct OwnedSlice_i32 coords;
118 };
119 
120 union Baz_i32 {
121   Baz_i32_Tag tag;
122   struct Polygon21_Body_i32 polygon21;
123   struct Slice21_Body_i32 slice21;
124   struct Slice22_Body_i32 slice22;
125   struct Slice23_Body_i32 slice23;
126   struct Slice24_Body_i32 slice24;
127 };
128 
129 enum Taz_Tag {
130   Bar3,
131   Taz1,
132   Taz3,
133 };
134 typedef uint8_t Taz_Tag;
135 
136 struct Taz1_Body {
137   Taz_Tag tag;
138   int32_t _0;
139 };
140 
141 struct Taz3_Body {
142   Taz_Tag tag;
143   struct OwnedSlice_i32 _0;
144 };
145 
146 union Taz {
147   Taz_Tag tag;
148   struct Taz1_Body taz1;
149   struct Taz3_Body taz3;
150 };
151 
152 enum Tazz_Tag {
153   Bar4,
154   Taz2,
155 };
156 typedef uint8_t Tazz_Tag;
157 
158 struct Taz2_Body {
159   Tazz_Tag tag;
160   int32_t _0;
161 };
162 
163 union Tazz {
164   Tazz_Tag tag;
165   struct Taz2_Body taz2;
166 };
167 
168 enum Tazzz_Tag {
169   Bar5,
170   Taz5,
171 };
172 typedef uint8_t Tazzz_Tag;
173 
174 struct Taz5_Body {
175   Tazzz_Tag tag;
176   int32_t _0;
177 };
178 
179 union Tazzz {
180   Tazzz_Tag tag;
181   struct Taz5_Body taz5;
182 };
183 
184 enum Tazzzz_Tag {
185   Taz6,
186   Taz7,
187 };
188 typedef uint8_t Tazzzz_Tag;
189 
190 struct Taz6_Body {
191   Tazzzz_Tag tag;
192   int32_t _0;
193 };
194 
195 struct Taz7_Body {
196   Tazzzz_Tag tag;
197   uint32_t _0;
198 };
199 
200 union Tazzzz {
201   Tazzzz_Tag tag;
202   struct Taz6_Body taz6;
203   struct Taz7_Body taz7;
204 };
205 
206 void root(const struct Foo_u32 *a,
207           const union Baz_i32 *b,
208           const union Taz *c,
209           union Tazz d,
210           const union Tazzz *e,
211           const union Tazzzz *f);
212