| // This testcase used to hang the compiler in vt_find_locations. |
| // { dg-do compile } |
| // { dg-options "-O2 -g" } |
| |
| struct S |
| { |
| int a; |
| S *b, *c, *d; |
| }; |
| |
| struct T |
| { |
| void f1 (S *x); |
| void f2 (S *x); |
| void f3 (S *x, S *y); |
| S *e; |
| }; |
| |
| void |
| T::f3 (S *x, S *y) |
| { |
| while (x != this->e && (!x || x->a == 1)) |
| { |
| if (x == y->c) |
| { |
| S *w = y->d; |
| if (w && w->a == 0) |
| { |
| w->a = 1; |
| y->a = 0; |
| f2 (y); |
| w = y->d; |
| } |
| if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1)) |
| { |
| w->a = 0; |
| x = y; |
| y = x->b; |
| } |
| else |
| { |
| if (w && (!w->d || w->d->a == 1)) |
| { |
| if (w->c) |
| w->c->a = 1; |
| w->a = 0; |
| f1 (w); |
| w = y->d; |
| } |
| if (w) |
| { |
| w->a = y->a; |
| if (w->d) |
| w->d->a = 1; |
| } |
| y->a = 1; |
| f2 (y); |
| x = e; |
| } |
| } |
| else |
| { |
| S *w = y->c; |
| if (w && w->a == 0) |
| { |
| w->a = 1; |
| y->a = 0; |
| f1 (y); |
| w = y->c; |
| } |
| if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1)) |
| { |
| w->a = 0; |
| x = y; |
| y = x->b; |
| } |
| else |
| { |
| if (w && (!w->c || w->c->a == 1)) |
| { |
| w->a = 0; |
| if (w->d) |
| w->d->a = 1; |
| f2 (w); |
| w = y->c; |
| } |
| if (w) |
| { |
| w->a = y->a; |
| if (w->c) |
| w->c->a = 1; |
| } |
| y->a = 1; |
| f1 (y); |
| x = e; |
| } |
| } |
| } |
| } |