1#include "struct-layout-1.h"
2
3struct Info info;
4int fails;
5int intarray[256];
6int fn0 (void) { return 0; }
7int fn1 (void) { return 1; }
8int fn2 (void) { return 2; }
9int fn3 (void) { return 3; }
10int fn4 (void) { return 4; }
11int fn5 (void) { return 5; }
12int fn6 (void) { return 6; }
13int fn7 (void) { return 7; }
14int fn8 (void) { return 8; }
15int fn9 (void) { return 9; }
16
17/* This macro is intended for fields where their
18   addresses/sizes/alignments and value passing should be checked.  */
19#define F(n, x, v, w) 						\
20  info.flds[i] = &s##n.x;					\
21  info.sizes[i] = sizeof (s##n.x);				\
22  info.aligns[i] = __alignof__ (s##n.x);			\
23  s##n.x = v;							\
24  a##n[2].x = w;						\
25  ++i;
26/* This macro is for fields where just their addresses/sizes/alignments
27   should be checked.  */
28#define N(n, x) 						\
29  info.flds[i] = &s##n.x;					\
30  info.sizes[i] = sizeof (s##n.x);				\
31  info.aligns[i] = __alignof__ (s##n.x);			\
32  ++i;
33/* This macro is for fields where just value passing should be checked.  */
34#define B(n, x, v, w)						\
35  s##n.x = v;							\
36  a##n[2].x = w;						\
37  ++j;
38#define TX(n, type, attrs, fields, ops) 			\
39type S##n { fields } attrs;					\
40type S##n s##n;							\
41extern type S##n a##n[5];					\
42extern type S##n check##n (type S##n, type S##n *,		\
43			     type S##n);			\
44extern void check##n##va (int i, ...);				\
45extern void checkx##n (type S##n);				\
46void test##n (void)						\
47{								\
48  int i, j;							\
49  memset (&s##n, '\0', sizeof (s##n));				\
50  memset (a##n, '\0', sizeof (a##n));				\
51  memset (&info, '\0', sizeof (info));				\
52  info.sp = &s##n;						\
53  info.a0p = &a##n[0];						\
54  info.a3p = &a##n[3];						\
55  info.sz = sizeof (s##n);					\
56  info.als = __alignof__ (s##n);				\
57  info.ala0 = __alignof__ (a##n[0]);				\
58  info.ala3 = __alignof__ (a##n[3]);				\
59  if (((long) (__SIZE_TYPE__) &a##n[3]) & (info.als - 1))			\
60    FAIL (n, 1);						\
61  i = 0; j = 0;							\
62  ops								\
63  info.nfields = i;						\
64  info.nbitfields = j;						\
65  checkx##n (check##n (s##n, &a##n[1], a##n[2]));		\
66  check##n##va (1, 1.0, s##n, 2LL, a##n[2], a##n[2]);		\
67  check##n##va (2, s##n, s##n, 2.0L, a##n[2], s##n);		\
68}
69