1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
3 
4 typedef __SIZE_TYPE__ size_t;
5 extern void *malloc (size_t);
6 extern void free (void *);
7 extern void abort (void);
8 
9 union A
10 {
11   int a1;
12   char a2[3];
13 };
14 
15 union B
16 {
17   long long b1;
18   union A b2;
19 };
20 
21 struct C
22 {
23   int c1;
24   union A c2;
25 };
26 
27 struct D
28 {
29   int d1;
30   union B d2;
31 };
32 
33 union E
34 {
35   struct C e1;
36   char e2[3];
37 };
38 
39 union F
40 {
41   int f1;
42   struct D f2;
43 };
44 
45 struct G
46 {
47   union A g1;
48   char g2;
49 };
50 
51 struct H
52 {
53   int h1;
54   union E h2;
55 };
56 
57 #define T(X, S0, S1) \
58   if (__builtin_object_size (X, 0) != (S0))	\
59     abort ();					\
60   if (__builtin_object_size (X, 1) != (S1))	\
61     abort ();					\
62   if (__builtin_object_size (X, 2) != (S0))	\
63     abort ();					\
64   if (__builtin_object_size (X, 3) != (S1))	\
65     abort ()
66 #define TS(X, S0) T(&X, S0, sizeof (X))
67 #define TA(X, S0, S1) \
68   T(X, S0, S1); T(&X[0], S0, S1); T(&X[1], (S0) - 1, (S1) - 1)
69 #define TF(X, S0) TA(X, S0, S0)
70 
71 int
main(void)72 main (void)
73 {
74   size_t s, o, o2;
75 
76   s = sizeof (union A);
77   o = 0;
78   union A *a1 = malloc (s);
79   union A *a2 = malloc (o + 212);
80   TS (a1->a1, s);
81   s = o + 212;
82   TS (a2->a1, s);
83   free (a2);
84   free (a1);
85   s = sizeof (union A);
86   o = 0;
87   a1 = malloc (s);
88   a2 = malloc (o + 212);
89   TF (a1->a2, s);
90   s = o + 212;
91   TF (a2->a2, s);
92   free (a2);
93   free (a1);
94 
95   s = sizeof (union B);
96   o = 0;
97   union B *b1 = malloc (s);
98   union B *b2 = malloc (o + 212);
99   TS (b1->b1, s);
100   s = o + 212;
101   TS (b2->b1, s);
102   free (b2);
103   free (b1);
104   s = sizeof (union B);
105   o = 0;
106   b1 = malloc (s);
107   b2 = malloc (o + 212);
108   TS (b1->b2.a1, s);
109   s = o + 212;
110   TS (b2->b2.a1, s);
111   free (b2);
112   free (b1);
113   s = sizeof (union B);
114   o = 0;
115   b1 = malloc (s);
116   b2 = malloc (o + 212);
117   TF (b1->b2.a2, s);
118   s = o + 212;
119   TF (b2->b2.a2, s);
120   free (b2);
121   free (b1);
122 
123   s = sizeof (struct C);
124   o = __builtin_offsetof (struct C, c2);
125   struct C *c1 = malloc (s);
126   struct C *c2 = malloc (o + 212);
127   TS (c1->c1, s);
128   s = o + 212;
129   TS (c2->c1, s);
130   free (c2);
131   free (c1);
132   s = sizeof (struct C);
133   o = __builtin_offsetof (struct C, c2);
134   c1 = malloc (s);
135   c2 = malloc (o + 212);
136   TS (c1->c2.a1, s - o);
137   s = o + 212;
138   TS (c2->c2.a1, s - o);
139   free (c2);
140   free (c1);
141   s = sizeof (struct C);
142   o = __builtin_offsetof (struct C, c2);
143   c1 = malloc (s);
144   c2 = malloc (o + 212);
145   TF (c1->c2.a2, s - o);
146   s = o + 212;
147   TF (c2->c2.a2, s - o);
148   free (c2);
149   free (c1);
150 
151   s = sizeof (struct D);
152   o = __builtin_offsetof (struct D, d2);
153   struct D *d1 = malloc (s);
154   struct D *d2 = malloc (o + 212);
155   TS (d1->d1, s);
156   s = o + 212;
157   TS (d2->d1, s);
158   free (d2);
159   free (d1);
160   s = sizeof (struct D);
161   o = __builtin_offsetof (struct D, d2);
162   d1 = malloc (s);
163   d2 = malloc (o + 212);
164   TS (d1->d2.b1, s - o);
165   s = o + 212;
166   TS (d2->d2.b1, s - o);
167   free (d2);
168   free (d1);
169   s = sizeof (struct D);
170   o = __builtin_offsetof (struct D, d2);
171   d1 = malloc (s);
172   d2 = malloc (o + 212);
173   TS (d1->d2.b2.a1, s - o);
174   s = o + 212;
175   TS (d2->d2.b2.a1, s - o);
176   free (d2);
177   free (d1);
178   s = sizeof (struct D);
179   o = __builtin_offsetof (struct D, d2);
180   d1 = malloc (s);
181   d2 = malloc (o + 212);
182   TF (d1->d2.b2.a2, s - o);
183   s = o + 212;
184   TF (d2->d2.b2.a2, s - o);
185   free (d2);
186   free (d1);
187 
188   s = sizeof (union E);
189   o = __builtin_offsetof (union E, e1.c2);
190   union E *e1 = malloc (s);
191   union E *e2 = malloc (o + 212);
192   TS (e1->e1.c1, s);
193   s = o + 212;
194   TS (e2->e1.c1, s);
195   free (e2);
196   free (e1);
197   s = sizeof (union E);
198   o = __builtin_offsetof (union E, e1.c2);
199   e1 = malloc (s);
200   e2 = malloc (o + 212);
201   TS (e1->e1.c2.a1, s - o);
202   s = o + 212;
203   TS (e2->e1.c2.a1, s - o);
204   free (e2);
205   free (e1);
206   s = sizeof (union E);
207   o = __builtin_offsetof (union E, e1.c2);
208   e1 = malloc (s);
209   e2 = malloc (o + 212);
210   TF (e1->e1.c2.a2, s - o);
211   s = o + 212;
212   TF (e2->e1.c2.a2, s - o);
213   free (e2);
214   free (e1);
215   s = sizeof (union E);
216   o = __builtin_offsetof (union E, e1.c2);
217   e1 = malloc (s);
218   e2 = malloc (o + 212);
219   TF (e1->e2, s);
220   s = o + 212;
221   TF (e2->e2, s);
222   free (e2);
223   free (e1);
224 
225   s = sizeof (union F);
226   o = __builtin_offsetof (union F, f2.d2);
227   union F *f1 = malloc (s);
228   union F *f2 = malloc (o + 212);
229   TS (f1->f1, s);
230   s = o + 212;
231   TS (f2->f1, s);
232   free (f2);
233   free (f1);
234   s = sizeof (union F);
235   o = __builtin_offsetof (union F, f2.d2);
236   f1 = malloc (s);
237   f2 = malloc (o + 212);
238   TS (f1->f2.d1, s);
239   s = o + 212;
240   TS (f2->f2.d1, s);
241   free (f2);
242   free (f1);
243   s = sizeof (union F);
244   o = __builtin_offsetof (union F, f2.d2);
245   f1 = malloc (s);
246   f2 = malloc (o + 212);
247   TS (f1->f2.d2.b1, s - o);
248   s = o + 212;
249   TS (f2->f2.d2.b1, s - o);
250   free (f2);
251   free (f1);
252   s = sizeof (union F);
253   o = __builtin_offsetof (union F, f2.d2);
254   f1 = malloc (s);
255   f2 = malloc (o + 212);
256   TS (f1->f2.d2.b2.a1, s - o);
257   s = o + 212;
258   TS (f2->f2.d2.b2.a1, s - o);
259   free (f2);
260   free (f1);
261   s = sizeof (union F);
262   o = __builtin_offsetof (union F, f2.d2);
263   f1 = malloc (s);
264   f2 = malloc (o + 212);
265   TF (f1->f2.d2.b2.a2, s - o);
266   s = o + 212;
267   TF (f2->f2.d2.b2.a2, s - o);
268   free (f2);
269   free (f1);
270 
271   s = sizeof (struct G);
272   o = __builtin_offsetof (struct G, g2);
273   struct G *g1 = malloc (s);
274   struct G *g2 = malloc (o + 212);
275   TS (g1->g1.a1, s);
276   s = o + 212;
277   TS (g2->g1.a1, s);
278   free (g2);
279   free (g1);
280   s = sizeof (struct G);
281   o = __builtin_offsetof (struct G, g2);
282   g1 = malloc (s);
283   g2 = malloc (o + 212);
284   TA (g1->g1.a2, s, sizeof (g1->g1.a2));
285   s = o + 212;
286   TA (g2->g1.a2, s, sizeof (g1->g1.a2));
287   free (g2);
288   free (g1);
289   s = sizeof (struct G);
290   o = __builtin_offsetof (struct G, g2);
291   g1 = malloc (s);
292   g2 = malloc (o + 212);
293   TS (g1->g2, s - o);
294   s = o + 212;
295   TS (g2->g2, s - o);
296   free (g2);
297   free (g1);
298 
299   s = sizeof (struct H);
300   o = __builtin_offsetof (struct H, h2);
301   o2 = __builtin_offsetof (struct H, h2.e1.c2);
302   struct H *h1 = malloc (s);
303   struct H *h2 = malloc (o2 + 212);
304   TS (h1->h1, s);
305   s = o2 + 212;
306   TS (h2->h1, s);
307   free (h2);
308   free (h1);
309   s = sizeof (struct H);
310   o = __builtin_offsetof (struct H, h2);
311   o2 = __builtin_offsetof (struct H, h2.e1.c2);
312   h1 = malloc (s);
313   h2 = malloc (o2 + 212);
314   TS (h1->h2.e1.c1, s - o);
315   s = o2 + 212;
316   TS (h2->h2.e1.c1, s - o);
317   free (h2);
318   free (h1);
319   s = sizeof (struct H);
320   o = __builtin_offsetof (struct H, h2);
321   o2 = __builtin_offsetof (struct H, h2.e1.c2);
322   h1 = malloc (s);
323   h2 = malloc (o2 + 212);
324   TS (h1->h2.e1.c2.a1, s - o2);
325   s = o2 + 212;
326   TS (h2->h2.e1.c2.a1, s - o2);
327   free (h2);
328   free (h1);
329   s = sizeof (struct H);
330   o = __builtin_offsetof (struct H, h2);
331   o2 = __builtin_offsetof (struct H, h2.e1.c2);
332   h1 = malloc (s);
333   h2 = malloc (o2 + 212);
334   TA (h1->h2.e1.c2.a2, s - o2, sizeof (h1->h2.e1.c2.a2));
335   s = o2 + 212;
336   TA (h2->h2.e1.c2.a2, s - o2, sizeof (h2->h2.e1.c2.a2));
337   free (h2);
338   free (h1);
339   s = sizeof (struct H);
340   o = __builtin_offsetof (struct H, h2);
341   o2 = __builtin_offsetof (struct H, h2.e1.c2);
342   h1 = malloc (s);
343   h2 = malloc (o2 + 212);
344   TF (h1->h2.e2, s - o);
345   s = o2 + 212;
346   TF (h2->h2.e2, s - o);
347   free (h2);
348   free (h1);
349 
350   return 0;
351 }
352