|  | /* Area:	ffi_call | 
|  | Purpose:	Check structures. | 
|  | Limitations:	none. | 
|  | PR:		none. | 
|  | Originator:	Sergei Trofimovich <slyfox@gentoo.org> | 
|  |  | 
|  | The test originally discovered in ruby's bindings | 
|  | for ffi in https://bugs.gentoo.org/634190  */ | 
|  |  | 
|  | /* { dg-do run } */ | 
|  | #include "ffitest.h" | 
|  |  | 
|  | struct s { | 
|  | int s32; | 
|  | float f32; | 
|  | signed char s8; | 
|  | }; | 
|  |  | 
|  | struct s make_s(void) { | 
|  | struct s r; | 
|  | r.s32 = 0x1234; | 
|  | r.f32 = 7.0; | 
|  | r.s8  = 0x78; | 
|  | return r; | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | ffi_cif cif; | 
|  | struct s r; | 
|  | ffi_type rtype; | 
|  | ffi_type* s_fields[] = { | 
|  | &ffi_type_sint, | 
|  | &ffi_type_float, | 
|  | &ffi_type_schar, | 
|  | NULL, | 
|  | }; | 
|  |  | 
|  | rtype.size      = 0; | 
|  | rtype.alignment = 0, | 
|  | rtype.type      = FFI_TYPE_STRUCT, | 
|  | rtype.elements  = s_fields, | 
|  |  | 
|  | r.s32 = 0xbad; | 
|  | r.f32 = 999.999; | 
|  | r.s8  = 0x51; | 
|  |  | 
|  | // Here we emulate the following call: | 
|  | //r = make_s(); | 
|  |  | 
|  | CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &rtype, NULL) == FFI_OK); | 
|  | ffi_call(&cif, FFI_FN(make_s), &r, NULL); | 
|  |  | 
|  | CHECK(r.s32 == 0x1234); | 
|  | CHECK(r.f32 == 7.0); | 
|  | CHECK(r.s8  == 0x78); | 
|  | exit(0); | 
|  | } |