aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8.1/gcc/testsuite/g++.dg/opt/pr55329.C
blob: 3646785d12e1ab72cfee8bf707a3e4aca36587f5 (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
// PR tree-optimization/55329
// { dg-do compile }
// { dg-options "-O -fno-guess-branch-probability -fnon-call-exceptions --param=early-inlining-insns=111" }

void *f1 ();
void f2 (void *);
void f3 ();
static inline void *
f4 ()
{
  void *p = f1 ();
  if (!p)
    f3 ();
  return p;
}

struct A
{
  int *a;
  A ();
  ~A () { a3 (); }
  int a1 (int * p) { if (!p) f3 (); f2 (p); }
  int *a2 ();
  void a3 () { if (*a) a1 (a); }
  int a4 (int x) { if (*a) f4 (); *a2 () += x; }
};

struct B : A
{
  ~B () { a3 (); }
};

template <class T>
struct C
{
  T *c;
  C ();
  int c1 () { return *(int *) f4 (); }
  ~C () { if (c1 ()) for (T *t = c + c2 (); t != c; t--) T (); }
  int c2 ();
};

class D
{
  C <C <int> > c;
};

struct E
{
  int *e;
  ~E () { delete e; }
};

struct F
{
  int *f1 ();
  D f2;
  E f3;
  F () { f4 (); }
};

struct G : F
{
  B g;
  G () { g.a4 (*g1 ()->f1 ()); g1 ()->f1 (); }
  F *g1 ();
};

void
foo ()
{
  G g;
}