1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3/*
4 * BTF-to-C dumper test for majority of C syntax quirks.
5 *
6 * Copyright (c) 2019 Facebook
7 */
8/* ----- START-EXPECTED-OUTPUT ----- */
9enum e1 {
10	A = 0,
11	B = 1,
12};
13
14enum e2 {
15	C = 100,
16	D = 4294967295,
17	E = 0,
18};
19
20typedef enum e2 e2_t;
21
22typedef enum {
23	F = 0,
24	G = 1,
25	H = 2,
26} e3_t;
27
28/* ----- START-EXPECTED-OUTPUT ----- */
29/*
30 *enum e_byte {
31 *	EBYTE_1 = 0,
32 *	EBYTE_2 = 1,
33 *} __attribute__((mode(byte)));
34 *
35 */
36/* ----- END-EXPECTED-OUTPUT ----- */
37enum e_byte {
38	EBYTE_1,
39	EBYTE_2,
40} __attribute__((mode(byte)));
41
42/* ----- START-EXPECTED-OUTPUT ----- */
43/*
44 *enum e_word {
45 *	EWORD_1 = 0LL,
46 *	EWORD_2 = 1LL,
47 *} __attribute__((mode(word)));
48 *
49 */
50/* ----- END-EXPECTED-OUTPUT ----- */
51enum e_word {
52	EWORD_1,
53	EWORD_2,
54} __attribute__((mode(word))); /* force to use 8-byte backing for this enum */
55
56/* ----- START-EXPECTED-OUTPUT ----- */
57enum e_big {
58	EBIG_1 = 1000000000000ULL,
59};
60
61typedef int int_t;
62
63typedef volatile const int * volatile const crazy_ptr_t;
64
65typedef int *****we_need_to_go_deeper_ptr_t;
66
67typedef volatile const we_need_to_go_deeper_ptr_t * restrict * volatile * const * restrict volatile * restrict const * volatile const * restrict volatile const how_about_this_ptr_t;
68
69typedef int *ptr_arr_t[10];
70
71typedef void (*fn_ptr1_t)(int);
72
73typedef void (*printf_fn_t)(const char *, ...);
74
75/* ------ END-EXPECTED-OUTPUT ------ */
76/*
77 * While previous function pointers are pretty trivial (C-syntax-level
78 * trivial), the following are deciphered here for future generations:
79 *
80 * - `fn_ptr2_t`: function, taking anonymous struct as a first arg and pointer
81 *   to a function, that takes int and returns int, as a second arg; returning
82 *   a pointer to a const pointer to a char. Equivalent to:
83 *	typedef struct { int a; } s_t;
84 *	typedef int (*fn_t)(int);
85 *	typedef char * const * (*fn_ptr2_t)(s_t, fn_t);
86 *
87 * - `fn_complex_t`: pointer to a function returning struct and accepting
88 *   union and struct. All structs and enum are anonymous and defined inline.
89 *
90 * - `signal_t: pointer to a function accepting a pointer to a function as an
91 *   argument and returning pointer to a function as a result. Sane equivalent:
92 *	typedef void (*signal_handler_t)(int);
93 *	typedef signal_handler_t (*signal_ptr_t)(int, signal_handler_t);
94 *
95 * - fn_ptr_arr1_t: array of pointers to a function accepting pointer to
96 *   a pointer to an int and returning pointer to a char. Easy.
97 *
98 * - fn_ptr_arr2_t: array of const pointers to a function taking no arguments
99 *   and returning a const pointer to a function, that takes pointer to a
100 *   `int -> char *` function and returns pointer to a char. Equivalent:
101 *   typedef char * (*fn_input_t)(int);
102 *   typedef char * (*fn_output_outer_t)(fn_input_t);
103 *   typedef const fn_output_outer_t (* fn_output_inner_t)();
104 *   typedef const fn_output_inner_t fn_ptr_arr2_t[5];
105 */
106/* ----- START-EXPECTED-OUTPUT ----- */
107typedef char * const * (*fn_ptr2_t)(struct {
108	int a;
109}, int (*)(int));
110
111typedef struct {
112	int a;
113	void (*b)(int, struct {
114		int c;
115	}, union {
116		char d;
117		int e[5];
118	});
119} (*fn_complex_t)(union {
120	void *f;
121	char g[16];
122}, struct {
123	int h;
124});
125
126typedef void (* (*signal_t)(int, void (*)(int)))(int);
127
128typedef char * (*fn_ptr_arr1_t[10])(int **);
129
130typedef char * (* (* const fn_ptr_arr2_t[5])())(char * (*)(int));
131
132struct struct_w_typedefs {
133	int_t a;
134	crazy_ptr_t b;
135	we_need_to_go_deeper_ptr_t c;
136	how_about_this_ptr_t d;
137	ptr_arr_t e;
138	fn_ptr1_t f;
139	printf_fn_t g;
140	fn_ptr2_t h;
141	fn_complex_t i;
142	signal_t j;
143	fn_ptr_arr1_t k;
144	fn_ptr_arr2_t l;
145};
146
147typedef struct {
148	int x;
149	int y;
150	int z;
151} anon_struct_t;
152
153struct struct_fwd;
154
155typedef struct struct_fwd struct_fwd_t;
156
157typedef struct struct_fwd *struct_fwd_ptr_t;
158
159union union_fwd;
160
161typedef union union_fwd union_fwd_t;
162
163typedef union union_fwd *union_fwd_ptr_t;
164
165struct struct_empty {};
166
167struct struct_simple {
168	int a;
169	char b;
170	const int_t *p;
171	struct struct_empty s;
172	enum e2 e;
173	enum {
174		ANON_VAL1 = 1,
175		ANON_VAL2 = 2,
176	} f;
177	int arr1[13];
178	enum e2 arr2[5];
179};
180
181union union_empty {};
182
183union union_simple {
184	void *ptr;
185	int num;
186	int_t num2;
187	union union_empty u;
188};
189
190struct struct_in_struct {
191	struct struct_simple simple;
192	union union_simple also_simple;
193	struct {
194		int a;
195	} not_so_hard_as_well;
196	union {
197		int b;
198		int c;
199	} anon_union_is_good;
200	struct {
201		int d;
202		int e;
203	};
204	union {
205		int f;
206		int g;
207	};
208};
209
210struct struct_in_array {};
211
212struct struct_in_array_typed {};
213
214typedef struct struct_in_array_typed struct_in_array_t[2];
215
216struct struct_with_embedded_stuff {
217	int a;
218	struct {
219		int b;
220		struct {
221			struct struct_with_embedded_stuff *c;
222			const char *d;
223		} e;
224		union {
225			volatile long f;
226			void * restrict g;
227		};
228	};
229	union {
230		const int_t *h;
231		void (*i)(char, int, void *);
232	} j;
233	enum {
234		K = 100,
235		L = 200,
236	} m;
237	char n[16];
238	struct {
239		char o;
240		int p;
241		void (*q)(int);
242	} r[5];
243	struct struct_in_struct s[10];
244	int t[11];
245	struct struct_in_array (*u)[2];
246	struct_in_array_t *v;
247};
248
249struct float_struct {
250	float f;
251	const double *d;
252	volatile long double *ld;
253};
254
255struct root_struct {
256	enum e1 _1;
257	enum e2 _2;
258	e2_t _2_1;
259	e3_t _2_2;
260	enum e_byte _100;
261	enum e_word _101;
262	enum e_big _102;
263	struct struct_w_typedefs _3;
264	anon_struct_t _7;
265	struct struct_fwd *_8;
266	struct_fwd_t *_9;
267	struct_fwd_ptr_t _10;
268	union union_fwd *_11;
269	union_fwd_t *_12;
270	union_fwd_ptr_t _13;
271	struct struct_with_embedded_stuff _14;
272	struct float_struct _15;
273};
274
275/* ------ END-EXPECTED-OUTPUT ------ */
276
277int f(struct root_struct *s)
278{
279	return 0;
280}
281