1 extern void exit (int);
2 extern void abort (void);
3 
4 typedef union
5 {
6   struct
7   {
8     int f1, f2, f3, f4, f5, f6, f7, f8;
9     long int f9, f10;
10     int f11;
11   } f;
12   char s[56];
13   long int a;
14 } T;
15 
16 __attribute__((noinline))
17 void
test(T * t)18 test (T *t)
19 {
20   static int i = 11;
21   if (t->f.f1 != i++)
22     abort ();
23   if (t->f.f2 || t->f.f3 || t->f.f4 || t->f.f5 || t->f.f6
24       || t->f.f7 || t->f.f8 || t->f.f9 || t->f.f10 || t->f.f11)
25     abort ();
26   if (i == 20)
27     exit (0);
28 }
29 
30 __attribute__((noinline))
31 void
foo(int i)32 foo (int i)
33 {
34   T t;
35 again:
36   t = (T) { { ++i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
37   test (&t);
38   goto again;
39 }
40 
41 int
main(void)42 main (void)
43 {
44   T *t1, *t2;
45   int cnt = 0;
46   t1 = (T *) 0;
47 loop:
48   t2 = t1;
49   t1 = & (T) { .f.f9 = cnt++ };
50   if (cnt < 3)
51     goto loop;
52   if (t1 != t2 || t1->f.f9 != 2)
53     abort ();
54   foo (10);
55   return 0;
56 }
57