https://gcc.gnu.org/bugzilla/show_bug.cgi?id=33799
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|FIXED |--- --- Comment #15 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reopening. Modified version of g++.dg/eh/return1.C showing the remaining bug, in the new i() function: // PR c++/33799 // { dg-do run } extern "C" void abort(); int c, d; #if __cplusplus >= 201103L #define THROWS noexcept(false) #else #define THROWS #endif struct X { X(bool throws) : throws_(throws) { ++c; } X(const X& x) : throws_(x.throws_) { ++c; } ~X() THROWS { ++d; if (throws_) { throw 1; } } private: bool throws_; }; X f() { X x(true); return X(false); } X g() { return X(true),X(false); } void h() { #if __cplusplus >= 201103L []{ return X(true),X(false); }(); #endif } X i() { try { X x(true); return X(false); } catch(...) {} return X(false); } int main() { try { f(); } catch (...) {} try { g(); } catch (...) {} try { h(); } catch (...) {} try { i(); } catch (...) {} if (c != d) throw; }