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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |jason at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think it is well defined.
Simplified testcase:
struct A
{
  A () { a++; }
  A (const A &) { a++; }
  ~A () { a--; }
  static int a;
};
int A::a = 0;

A
foo ()
{
  int cnt = 10;
lab:
  A a;
  if (cnt--)
    goto lab;
  return a;
}

int
main ()
{
  foo ();
  if (A::a)
    __builtin_abort ();
}

I believe the reason why this doesn't work is NRV, at least if return a; is
changed to return A ();, so that the a variable is not NRV optimized, it works
properly.

Reply via email to