| extern void abort (void); |
| |
| struct A |
| { |
| struct A *a; |
| }; |
| |
| struct B |
| { |
| struct A *b; |
| }; |
| |
| __attribute__((noinline)) |
| struct A * |
| foo (struct A *x) |
| { |
| asm volatile ("" : : "g" (x) : "memory"); |
| return x; |
| } |
| |
| __attribute__((noinline)) |
| void |
| bar (struct B *w, struct A *x, struct A *y, struct A *z) |
| { |
| struct A **c; |
| c = &w->b; |
| *c = foo (x); |
| while (*c) |
| c = &(*c)->a; |
| *c = foo (y); |
| while (*c) |
| c = &(*c)->a; |
| *c = foo (z); |
| } |
| |
| struct B d; |
| struct A e, f, g; |
| |
| int |
| main (void) |
| { |
| f.a = &g; |
| bar (&d, &e, &f, 0); |
| if (d.b == 0 |
| || d.b->a == 0 |
| || d.b->a->a == 0 |
| || d.b->a->a->a != 0) |
| abort (); |
| return 0; |
| } |
| |