http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60372

            Bug ID: 60372
           Summary: incorrect destruction order for function parameter
                    objects
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jens.maurer at gmx dot net

Parameter objects are not destroyed when the called function returns, but later
(too late).  The C++ standard says in 5.2.2p4 [expr.call]:
"... The lifetime of a parameter ends when the function in which it is defined
returns. ..."

However, the following program shows that "S" is destroyed too late, after the
call to h():

#include <stdio.h>

struct S {
  S(int) { printf("S(int)\n"); }
  ~S() { printf("~S\n"); }
};

void f(S) { printf("f(S)\n"); }
void h() { printf("h()\n"); }

int main()
{
  f({0}), h();
}

> g++ -Wall -Wextra -std=c++11 -pedantic func-destroy.cc 
> ./a.out
S(int)
f(S)
h()
~S

"S" should be destroyed before the call to h().  Note that no temporary is
involved (which would correctly be destroyed at the end of the
full-expression); the copy-list-initialization initializes the parameter
object.

Reply via email to