/* { dg-do run } */ /* { dg-options "-O2" } */ /* { dg-options "-O2 -mtune=i686" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */ extern void abort (void); extern void exit (int); struct A { char p[6]; } __attribute__((packed)); struct B { struct A a; void * const b; struct A const * const c; struct A const *d; }; char v; int __attribute__((noinline)) foo (struct B *b) { int i; for (i = 0; i < 6; ++i) if (b->a.p[i]) abort (); if (b->b != &v || b->c || b->d) abort (); return 12; } int __attribute__((noinline)) bar (void *x) { __asm __volatile ("" : "=r" (x) : "0" (x)); struct B y = { .b = x, .c = (void *) 0 }; return foo (&y) + 1; } int main (void) { if (bar (&v) != 13) abort (); exit (0); }