https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79267

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Turned out to be easier to fix up all the errors in the reduced testcase
manually and rereduce.  There are still warnings about missing return
statements in functions returning non-void, fixing those makes the ICE go away.

struct A { A (int); };
struct B
{
  virtual void av () = 0;
  void aw ();
  void h () { av (); aw (); }
};
template <class ax> struct G : B
{
  ax ba;
  G (int, ax) : ba (0) {}
  void av () { ba (0); }
};
struct I
{
  B *bc;
  template <class j, class ax> I (j, ax) try { G<ax> (0, 0); } catch (...) {}
  ~I () { bc->h (); }
};
template <class m> struct C { typedef m *i; };
template <class m> struct J
{
  J ();
  template <class o, class ax> J (o, ax 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
fn1 (int p1, int *, int)
{
  switch (p1)
  case 0:
  throw H ();
}

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

void
fn3 ()
{
  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);
}

Reply via email to