// Test for noexcept-expression
// { dg-do compile { target c++11 } }
// { dg-options "-O2" }

#include <typeinfo>

#define SA(X) static_assert(X, #X)

void f();
void g() throw();
SA(noexcept(g()));
SA(!noexcept(f()));
SA(!noexcept(throw 1));
SA(noexcept(42));

struct A
{
  virtual ~A();
};

struct B: public A
{
  virtual ~B();
};

A* ap;

struct C { };
C* cp;

SA (noexcept (dynamic_cast<B*>(ap)));
SA (!noexcept (dynamic_cast<B&>(*ap)));
SA (!noexcept (typeid (*ap)));
SA (noexcept (typeid (*cp)));

SA (!noexcept (true ? 1 : throw 1));
SA (!noexcept (true || true ? 1 : throw 1));

SA (noexcept (C()));

struct D
{
  D() throw();
};

SA (noexcept (D()));

struct E
{
  E() throw();
  ~E();
};

SA (noexcept (E()));

struct F
{
  virtual void f();
};

SA (noexcept (F()));

struct G
{
  G() = default;
  ~G() = default;
};

SA (noexcept (G()));

template <class T, bool b>
void tf()
{
  SA (noexcept (T()) == b);
}

template void tf<int,true>();
template void tf<E, true>();

// Make sure that noexcept uses the declared exception-specification, not
// any knowledge we might have about whether or not the function really
// throws.
void h() { }
SA(!noexcept(h()));
