------- Comment #1 from rguenth at gcc dot gnu dot org 2006-04-19 12:46 ------- Confirmed. Testcase:
extern "C" void abort(void); bool ok = false; struct C { ~C() { if (!ok) abort(); } }; void g() { static const C &c = C(); } int main() { g(); ok = true; return 0; } The C++ frontend generates void g() () { char * _ZGVZ1gvE1c.1; ... _ZGVZ1gvE1c.1 = (char *) &_ZGVZ1gvE1c; D.1786 = *_ZGVZ1gvE1c.1; if (D.1786 == 0) { D.1788 = __cxa_guard_acquire (&_ZGVZ1gvE1c); retval.2 = D.1788 != 0; if (retval.2) { D.1784 = 0; try { _ZGRZ1gvE1c = {}; c = &_ZGRZ1gvE1c; D.1784 = 1; __cxa_guard_release (&_ZGVZ1gvE1c); } catch { ... try { } finally { __comp_dtor (&_ZGRZ1gvE1c); } } -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Keywords| |wrong-code Last reconfirmed|0000-00-00 00:00:00 |2006-04-19 12:46:57 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27216