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
)