[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