| // 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; ) |