blob: 2df1a4937b7c86a2de1ab9d7dbae04c7ec4e8197 [file] [log] [blame]
// PR c++/53868
// { dg-do run { target c++11 } }
#if __cplusplus > 201100L
#define THROWING noexcept(false)
#else
#define THROWING
#endif
extern "C" int printf(const char *, ...);
extern "C" void abort();
struct SubobjectInA {
SubobjectInA();
~SubobjectInA();
};
int a;
struct A : SubobjectInA {
A() = delete;
A(const A &) = delete;
A(A &&) = delete;
A(int);
~A();
};
#ifdef DEBUG
#define TRACE_FUNC( ... ) \
{ printf("%s\n", __PRETTY_FUNCTION__); __VA_ARGS__ }
#else
#define TRACE_FUNC( ... ) \
{ __VA_ARGS__ }
#endif
struct Q {
Q() : q(0) TRACE_FUNC()
~Q() THROWING;
int q;
};
int main() {
try { const A &a = Q().q; }
catch (...) { if (!a) return 0; }
abort();
}
SubobjectInA::SubobjectInA() TRACE_FUNC()
SubobjectInA::~SubobjectInA() TRACE_FUNC()
A::A(int) TRACE_FUNC(++a;)
A::~A() TRACE_FUNC(--a;)
Q::~Q() THROWING TRACE_FUNC( throw 0; )