1 // bindgen-flags: --experimental --wrap-static-fns
2 // bindgen-parse-callbacks: wrap-as-variadic-fn
3
4 // to avoid polluting the expectation tests we put the stdarg.h behind a conditional
5 // variable only used in bindgen-integration
6 #ifdef USE_VA_HEADER
7 #include <stdarg.h>
8 #endif
9
foo()10 static inline int foo() {
11 return 11;
12 }
13 static int bar();
bar()14 static int bar() {
15 return 1;
16 }
baz()17 inline int baz() {
18 return 2;
19 }
20
takes_ptr(int * arg)21 static inline int takes_ptr(int* arg) {
22 return *arg + 1;
23 }
24
takes_fn_ptr(int (* f)(int))25 static inline int takes_fn_ptr(int (*f)(int)) {
26 return f(1);
27 }
28
takes_fn(int (f)(int))29 static inline int takes_fn(int (f)(int)) {
30 return f(2);
31 }
32
33 typedef int (func)(int);
34
takes_alias(func f)35 static inline int takes_alias(func f) {
36 return f(3);
37 }
38
takes_qualified(const int * const * arg)39 static inline int takes_qualified(const int *const *arg) {
40 return **arg;
41 }
42
43 enum foo {
44 BAR = 0x0,
45 };
46
takes_enum(const enum foo f)47 static inline enum foo takes_enum(const enum foo f) {
48 return f;
49 }
50
nevermore()51 static inline void nevermore() {
52 while (1) { }
53 }
54
takes_fn_with_no_args(int (f)(void))55 static inline int takes_fn_with_no_args(int(f)(void)) {
56 return f();
57 }
58
variadic(int x,...)59 static inline int variadic(int x, ...) {
60 return x;
61 }
62
no_extra_argument(__builtin_va_list va)63 static inline void no_extra_argument(__builtin_va_list va) {}
64
many_va_list(int i,__builtin_va_list va1,__builtin_va_list va2)65 static inline int many_va_list(int i, __builtin_va_list va1, __builtin_va_list va2) {
66 return i;
67 }
68
69 #ifndef USE_VA_HEADER
wrap_as_variadic_fn1(int i,__builtin_va_list va)70 static inline int wrap_as_variadic_fn1(int i, __builtin_va_list va) {
71 return i;
72 }
73
wrap_as_variadic_fn2(int i,__builtin_va_list va)74 static inline void wrap_as_variadic_fn2(int i, __builtin_va_list va) {}
75 #else
wrap_as_variadic_fn1(int i,va_list va)76 static inline int wrap_as_variadic_fn1(int i, va_list va) {
77 int res = 0;
78
79 for (int j = 0; j < i; j++)
80 res += (int) va_arg(va, int);
81
82 return res;
83 }
84
wrap_as_variadic_fn2(int i,va_list va)85 static inline void wrap_as_variadic_fn2(int i, va_list va) {}
86 #endif
87