1*1fd5a2e1SPrashanth Swaminathan/* -*-c-*- */ 2*1fd5a2e1SPrashanth Swaminathan#include "ffitest.h" 3*1fd5a2e1SPrashanth Swaminathan#include <complex.h> 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathantypedef struct Cs { 6*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE x; 7*1fd5a2e1SPrashanth Swaminathan _Complex T_C_TYPE y; 8*1fd5a2e1SPrashanth Swaminathan} Cs; 9*1fd5a2e1SPrashanth Swaminathan 10*1fd5a2e1SPrashanth SwaminathanCs gc; 11*1fd5a2e1SPrashanth Swaminathan 12*1fd5a2e1SPrashanth Swaminathanvoid 13*1fd5a2e1SPrashanth Swaminathanclosure_test_fn(Cs p) 14*1fd5a2e1SPrashanth Swaminathan{ 15*1fd5a2e1SPrashanth Swaminathan printf("%.1f,%.1fi %.1f,%.1fi\n", 16*1fd5a2e1SPrashanth Swaminathan T_CONV creal (p.x), T_CONV cimag (p.x), 17*1fd5a2e1SPrashanth Swaminathan T_CONV creal (p.y), T_CONV cimag (p.y)); 18*1fd5a2e1SPrashanth Swaminathan gc = p; 19*1fd5a2e1SPrashanth Swaminathan} 20*1fd5a2e1SPrashanth Swaminathan 21*1fd5a2e1SPrashanth Swaminathanvoid 22*1fd5a2e1SPrashanth Swaminathanclosure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, 23*1fd5a2e1SPrashanth Swaminathan void** args, void* userdata __UNUSED__) 24*1fd5a2e1SPrashanth Swaminathan{ 25*1fd5a2e1SPrashanth Swaminathan closure_test_fn(*(Cs*)args[0]); 26*1fd5a2e1SPrashanth Swaminathan} 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathanint main(int argc __UNUSED__, char** argv __UNUSED__) 29*1fd5a2e1SPrashanth Swaminathan{ 30*1fd5a2e1SPrashanth Swaminathan ffi_cif cif; 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan void *code; 33*1fd5a2e1SPrashanth Swaminathan ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); 34*1fd5a2e1SPrashanth Swaminathan ffi_type *cl_arg_types[1]; 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth Swaminathan ffi_type ts1_type; 37*1fd5a2e1SPrashanth Swaminathan ffi_type* ts1_type_elements[4]; 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I}; 40*1fd5a2e1SPrashanth Swaminathan 41*1fd5a2e1SPrashanth Swaminathan ts1_type.size = 0; 42*1fd5a2e1SPrashanth Swaminathan ts1_type.alignment = 0; 43*1fd5a2e1SPrashanth Swaminathan ts1_type.type = FFI_TYPE_STRUCT; 44*1fd5a2e1SPrashanth Swaminathan ts1_type.elements = ts1_type_elements; 45*1fd5a2e1SPrashanth Swaminathan 46*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[0] = &T_FFI_TYPE; 47*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[1] = &T_FFI_TYPE; 48*1fd5a2e1SPrashanth Swaminathan ts1_type_elements[2] = NULL; 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan cl_arg_types[0] = &ts1_type; 51*1fd5a2e1SPrashanth Swaminathan 52*1fd5a2e1SPrashanth Swaminathan /* Initialize the cif */ 53*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 54*1fd5a2e1SPrashanth Swaminathan &ffi_type_void, cl_arg_types) == FFI_OK); 55*1fd5a2e1SPrashanth Swaminathan 56*1fd5a2e1SPrashanth Swaminathan CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK); 57*1fd5a2e1SPrashanth Swaminathan 58*1fd5a2e1SPrashanth Swaminathan gc.x = 0.0 + 0.0 * I; 59*1fd5a2e1SPrashanth Swaminathan gc.y = 0.0 + 0.0 * I; 60*1fd5a2e1SPrashanth Swaminathan ((void*(*)(Cs))(code))(arg); 61*1fd5a2e1SPrashanth Swaminathan /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ 62*1fd5a2e1SPrashanth Swaminathan CHECK (gc.x == arg.x && gc.y == arg.y); 63*1fd5a2e1SPrashanth Swaminathan 64*1fd5a2e1SPrashanth Swaminathan gc.x = 0.0 + 0.0 * I; 65*1fd5a2e1SPrashanth Swaminathan gc.y = 0.0 + 0.0 * I; 66*1fd5a2e1SPrashanth Swaminathan closure_test_fn(arg); 67*1fd5a2e1SPrashanth Swaminathan /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ 68*1fd5a2e1SPrashanth Swaminathan CHECK (gc.x == arg.x && gc.y == arg.y); 69*1fd5a2e1SPrashanth Swaminathan 70*1fd5a2e1SPrashanth Swaminathan return 0; 71*1fd5a2e1SPrashanth Swaminathan} 72