struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / support / regression / tests / offsetof.c
blobe2728846c71aadd8d02daeb2b4089c473b9fe2f3
1 /*
2 * some testcases to check sanity of the offsetof implementation
3 * especially the __builtin_offsetof implementation
4 */
6 #include <testfwk.h>
7 #include <stddef.h>
9 struct tail {
10 int t;
13 struct aux {
14 char x;
15 char fil[2];
16 struct tail ta;
19 union bla {
20 char a;
21 long b;
22 struct aux ax;
25 struct st {
26 char first;
27 short a[11], b;
28 struct aux s;
29 struct aux arr[7];
30 union bla abla;
31 union bla abla_arr[2];
34 typedef struct st st_t;
35 typedef union bla bla_t;
37 #define check(type, element) \
38 { int x, y; \
39 union { long bits; type *ptr; } nul; nul.bits = 0; \
40 x = (int) &(nul.ptr->element); \
41 y = offsetof (type, element); \
42 ASSERT (x == y); \
45 void
46 testOffsetOf(void)
48 int z;
50 check (struct st, first);
51 #ifndef __SDCC_pdk14 // Lack of memory
52 check (struct st, b);
53 check (struct st, a);
54 check (struct st, a[9]);
55 check (struct st, s);
56 check (struct st, s.x);
57 check (struct st, s.ta.t);
58 check (struct st, s.fil);
59 check (struct st, s.fil[1]);
60 check (struct st, arr);
61 check (struct st, arr[1]);
62 check (struct st, arr[1].x);
63 check (struct st, arr[1].fil);
64 check (struct st, arr[1].fil[1]);
65 check (struct st, abla);
66 check (struct st, abla.b);
67 check (struct st, abla_arr);
68 check (struct st, abla_arr[1]);
69 check (struct st, abla_arr[1].b);
70 check (struct st, abla_arr[1].ax);
71 check (struct st, abla_arr[1].ax.fil);
72 check (struct st, abla_arr[1].ax.fil[1]);
73 #endif
75 z = 7; check (struct st, a[z*3+1]);
76 z = 3; check (struct st, arr[z].x);
78 check (st_t, arr[1].fil[1]);
79 check (bla_t, b);
81 ASSERT (0 == offsetof (union bla, b));
82 ASSERT (0 == offsetof (bla_t, b));