aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/restricted/libffi/testsuite/libffi.call/struct10.c
blob: 31d77936840ca8b27de34a7d7fe673bd8db806e9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/* 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); 
}