// PR tree-optimization/79267
// { dg-do compile }
// { dg-options "-O3" }

struct A { A (int); };
struct B
{
  virtual void av () = 0;
  void aw ();
  void h () { av (); aw (); }
};
template <class T> struct G : B
{
  T ba;
  G (int, T) : ba (0) {}
  void av () { ba (0); }
};
struct I
{
  B *bc;
  template <class j, class T> I (j, T) try { G<T> (0, 0); } catch (...) {}
  ~I () { bc->h (); }
};
template <class M> struct C { typedef M *i; };
template <class M> struct J
{
  J ();
  template <class O, class T> J (O, T p2) : be (0, p2) {}
  typename C<M>::i operator-> ();
  I be;
};
struct H : A { H () : A (0) {} };
struct D { J<int> d; void q (); };
template <typename = int> class bs;
int z;

void
foo (int p1, int *, int)
{
  if (p1 == 0)
    throw H ();
}

D bar ();
template <typename T> struct L
{
  struct K { K (int); void operator() (int *) { bar ().q (); } };
  static J<T> bp () { bq (0); }
  template <typename br> static void bq (br) { J<T> (0, K (0)); }
};
struct F
{
  virtual J<int> x (int) { foo (0, 0, 0); J<bs<> > (L<bs<> >::bp ()); }
};

void
baz ()
{
  if (z)
    {
      J<F> d, e;
      d->x (0);
      e->x (0);
    }
  J<F> v, i, j;
  v->x (0);
  i->x (0);
  j->x (0);
}
