[Bug c++/27216] Wrong lifetime of temporary, calls destructor twice
rguenth at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Wed Apr 19 12:47:00 GMT 2006
------- 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
More information about the Gcc-bugs
mailing list