| // 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; |
| } |