blob: d72cb6f3572060cd833ffcaaa064d3cfbe4b31b1 [file] [log] [blame]
// 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;
}
}
}
}