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