1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
4 * BTF-to-C dumper test for majority of C syntax quirks.
6 * Copyright (c) 2019 Facebook
8 /* ----- START-EXPECTED-OUTPUT ----- */
30 typedef volatile const int * volatile const crazy_ptr_t;
32 typedef int *****we_need_to_go_deeper_ptr_t;
34 typedef 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;
36 typedef int *ptr_arr_t[10];
38 typedef void (*fn_ptr1_t)(int);
40 typedef void (*printf_fn_t)(const char *, ...);
42 /* ------ END-EXPECTED-OUTPUT ------ */
44 * While previous function pointers are pretty trivial (C-syntax-level
45 * trivial), the following are deciphered here for future generations:
47 * - `fn_ptr2_t`: function, taking anonymous struct as a first arg and pointer
48 * to a function, that takes int and returns int, as a second arg; returning
49 * a pointer to a const pointer to a char. Equivalent to:
50 * typedef struct { int a; } s_t;
51 * typedef int (*fn_t)(int);
52 * typedef char * const * (*fn_ptr2_t)(s_t, fn_t);
54 * - `fn_complext_t`: pointer to a function returning struct and accepting
55 * union and struct. All structs and enum are anonymous and defined inline.
57 * - `signal_t: pointer to a function accepting a pointer to a function as an
58 * argument and returning pointer to a function as a result. Sane equivalent:
59 * typedef void (*signal_handler_t)(int);
60 * typedef signal_handler_t (*signal_ptr_t)(int, signal_handler_t);
62 * - fn_ptr_arr1_t: array of pointers to a function accepting pointer to
63 * a pointer to an int and returning pointer to a char. Easy.
65 * - fn_ptr_arr2_t: array of const pointers to a function taking no arguments
66 * and returning a const pointer to a function, that takes pointer to a
67 * `int -> char *` function and returns pointer to a char. Equivalent:
68 * typedef char * (*fn_input_t)(int);
69 * typedef char * (*fn_output_outer_t)(fn_input_t);
70 * typedef const fn_output_outer_t (* fn_output_inner_t)();
71 * typedef const fn_output_inner_t fn_ptr_arr2_t[5];
73 /* ----- START-EXPECTED-OUTPUT ----- */
74 typedef char * const * (*fn_ptr2_t)(struct {
80 void (*b)(int, struct {
86 } (*fn_complex_t)(union {
93 typedef void (* (*signal_t)(int, void (*)(int)))(int);
95 typedef char * (*fn_ptr_arr1_t[10])(int **);
97 typedef char * (* const (* const fn_ptr_arr2_t[5])())(char * (*)(int));
99 struct struct_w_typedefs {
102 we_need_to_go_deeper_ptr_t c;
103 how_about_this_ptr_t d;
122 typedef struct struct_fwd struct_fwd_t;
124 typedef struct struct_fwd *struct_fwd_ptr_t;
128 typedef union union_fwd union_fwd_t;
130 typedef union union_fwd *union_fwd_ptr_t;
132 struct struct_empty {};
134 struct struct_simple {
138 struct struct_empty s;
148 union union_empty {};
157 struct struct_in_struct {
158 struct struct_simple simple;
159 union union_simple also_simple;
162 } not_so_hard_as_well;
166 } anon_union_is_good;
177 struct struct_with_embedded_stuff {
182 struct struct_with_embedded_stuff *c;
192 void (*i)(char, int, void *);
204 struct struct_in_struct s[10];
213 struct struct_w_typedefs _3;
215 struct struct_fwd *_8;
217 struct_fwd_ptr_t _10;
218 union union_fwd *_11;
221 struct struct_with_embedded_stuff _14;
224 /* ------ END-EXPECTED-OUTPUT ------ */
226 int f(struct root_struct *s)