https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83367

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
                 CC|                            |marxin at gcc dot gnu.org
         Resolution|---                         |INVALID

--- Comment #4 from Martin Liška <marxin at gcc dot gnu.org> ---
First note that in cTest::cTest you take pointer this and register it to a
cTestList. That requires that all cTest instances will have defined storage and
will not be out of scope.
However in this case static variables 'a' and 'ab' are defined static in scope
of Tests.cpp and as there's no reference to these variables, compiler makes
optimization and removes these variables. Then static initializer looks as
follows:

(static initializers for Tests.cpp) ()
{
  struct cTestRegister D.2548;
  struct cTestRegister D.2547;

  <bb 2> [100.00%]:
  MEM[(struct  &)&D.2548] ={v} {CLOBBER};
  D.2548.m_pchRoot = 0B;
  D.2548.m_pchName = "a";
  cTestRegister::operator+ (&D.2548, _FUN); [return slot optimization]
  D.2548 ={v} {CLOBBER};
  MEM[(struct  &)&D.2547] ={v} {CLOBBER};
  D.2547.m_pchRoot = "a";
  D.2547.m_pchName = "b";
  cTestRegister::operator+ (&D.2547, _FUN); [return slot optimization]
  D.2547 ={v} {CLOBBER};
  return;
}

Then it's quite clear how the bad thinks happen.

Reply via email to