xref: /aosp_15_r20/external/libffi/testsuite/libffi.go/closure1.c (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
1*1fd5a2e1SPrashanth Swaminathan /* { dg-do run } */
2*1fd5a2e1SPrashanth Swaminathan 
3*1fd5a2e1SPrashanth Swaminathan #include "ffitest.h"
4*1fd5a2e1SPrashanth Swaminathan 
doit(ffi_cif * cif,void * rvalue,void ** avalue,void * closure)5*1fd5a2e1SPrashanth Swaminathan void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure)
6*1fd5a2e1SPrashanth Swaminathan {
7*1fd5a2e1SPrashanth Swaminathan   (void)cif;
8*1fd5a2e1SPrashanth Swaminathan   (void)avalue;
9*1fd5a2e1SPrashanth Swaminathan   *(void **)rvalue = closure;
10*1fd5a2e1SPrashanth Swaminathan }
11*1fd5a2e1SPrashanth Swaminathan 
12*1fd5a2e1SPrashanth Swaminathan typedef void * (*FN)(void);
13*1fd5a2e1SPrashanth Swaminathan 
main()14*1fd5a2e1SPrashanth Swaminathan int main()
15*1fd5a2e1SPrashanth Swaminathan {
16*1fd5a2e1SPrashanth Swaminathan   ffi_cif cif;
17*1fd5a2e1SPrashanth Swaminathan   ffi_go_closure cl;
18*1fd5a2e1SPrashanth Swaminathan   void *result;
19*1fd5a2e1SPrashanth Swaminathan 
20*1fd5a2e1SPrashanth Swaminathan   CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK);
21*1fd5a2e1SPrashanth Swaminathan   CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK);
22*1fd5a2e1SPrashanth Swaminathan 
23*1fd5a2e1SPrashanth Swaminathan   ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl);
24*1fd5a2e1SPrashanth Swaminathan 
25*1fd5a2e1SPrashanth Swaminathan   CHECK(result == &cl);
26*1fd5a2e1SPrashanth Swaminathan 
27*1fd5a2e1SPrashanth Swaminathan   exit(0);
28*1fd5a2e1SPrashanth Swaminathan }
29