1 #include <stddef.h>
2 
3 struct S {
4   int i;
5   int j;
6 };
7 struct R {
8   int k;
9   struct S a;
10 };
11 struct Q {
12   float k;
13   struct S a;
14 };
15 struct Q s;
16 int __attribute__((noinline,noclone))
test1(void * q)17 test1 (void *q)
18 {
19   struct S *b = (struct S *)((char *)q + sizeof (int));
20   s.a.i = 0;
21   b->i = 3;
22   return s.a.i;
23 }
24 int __attribute__((noinline,noclone))
test2(void * q)25 test2 (void *q)
26 {
27   struct S *b = &((struct R *)q)->a;
28   s.a.i = 0;
29   b->i = 3;
30   return s.a.i;
31 }
32 int __attribute__((noinline,noclone))
test3(void * q)33 test3 (void *q)
34 {
35   s.a.i = 0;
36   ((struct S *)((char *)q + sizeof (int)))->i = 3;
37   return s.a.i;
38 }
39 extern void abort (void);
40 int
main()41 main()
42 {
43   if (sizeof (float) != sizeof (int)
44       || offsetof (struct R, a) != sizeof (int)
45       || offsetof (struct Q, a) != sizeof (int))
46     return 0;
47   s.a.i = 1;
48   s.a.j = 2;
49   if (test1 ((void *)&s) != 3)
50     abort ();
51   s.a.i = 1;
52   s.a.j = 2;
53   if (test2 ((void *)&s) != 3)
54     abort ();
55   s.a.i = 1;
56   s.a.j = 2;
57   if (test3 ((void *)&s) != 3)
58     abort ();
59   return 0;
60 }
61