summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/debug/vartrack1.C
blob: d72cb6f3572060cd833ffcaaa064d3cfbe4b31b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// 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;
	    }
	}
    }
}