// PR ipa/82352
// { dg-do compile }
// { dg-options "-O2" }

typedef __SIZE_TYPE__ size_t;

class A
{
public :
  typedef enum { Zero = 0, One = 1 } tA;
  A(tA a) { m_a = a; }

private :
  tA m_a;
};

class B
{
public :
  void *operator new(size_t);
};

class C
{
public:
  virtual void ffff () = 0;
};

class D
{
 public :
  virtual void g() = 0;
  virtual void h() = 0;
};

template<class T> class IIII: public T, public D
{
public:
 void ffff()
 {
   if (!m_i2) throw A(A::One);
 };

 void h()
 {
  if (m_i2) throw A(A::Zero);
 }

protected:
 virtual void g()
 {
  if (m_i1 !=0) throw A(A::Zero);
 };

private :
 int m_i1;
 void *m_i2;
};

class E
{
private:
    size_t m_e;
    static const size_t Max;

public:
    E& i(size_t a, size_t b, size_t c)
    {
        if ((a > Max) || (c > Max)) throw A(A::Zero );
        if (a + b > m_e) throw A(A::One );
        return (*this);
    }

  inline E& j(const E &s)
    {
      return i(0,0,s.m_e);
    }
};

class F : public C { };
class G : public C { };
class HHHH : public B, public F, public G { };

void k()
{
    new IIII<HHHH>();
}

void l()
{
  E e1, e2;
  e1.j(e2);
}
