| /* 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); |
| } |