1#include <stddef.h>
2
3struct S {
4  int i;
5  int j;
6};
7struct R {
8  int k;
9  struct S a;
10};
11struct Q {
12  float k;
13  struct S a;
14};
15struct Q s;
16int __attribute__((noinline,noclone))
17test1 (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}
24int __attribute__((noinline,noclone))
25test2 (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}
32int __attribute__((noinline,noclone))
33test3 (void *q)
34{
35  s.a.i = 0;
36  ((struct S *)((char *)q + sizeof (int)))->i = 3;
37  return s.a.i;
38}
39extern void abort (void);
40int
41main()
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