1 /* { dg-do run } */ 2 /* { dg-options "-O2" } */ 3 /* { dg-options "-O2 -mtune=i686" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */ 4 5 extern void abort (void); 6 extern void exit (int); 7 8 struct A { char p[6]; } __attribute__((packed)); 9 struct B { 10 struct A a; 11 void * const b; 12 struct A const * const c; 13 struct A const *d; 14 }; 15 16 char v; 17 18 int __attribute__((noinline)) foo(struct B * b)19foo (struct B *b) 20 { 21 int i; 22 for (i = 0; i < 6; ++i) 23 if (b->a.p[i]) 24 abort (); 25 if (b->b != &v || b->c || b->d) 26 abort (); 27 return 12; 28 } 29 30 int __attribute__((noinline)) bar(void * x)31bar (void *x) 32 { 33 __asm __volatile ("" : "=r" (x) : "0" (x)); 34 struct B y = { .b = x, .c = (void *) 0 }; 35 return foo (&y) + 1; 36 } 37 38 int main(void)39main (void) 40 { 41 if (bar (&v) != 13) 42 abort (); 43 exit (0); 44 } 45