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;
}