Commit 42f02385 by Jason Merrill Committed by Jason Merrill

re PR c++/20416 (Incorrect lifetime for temporary with static const reference)

        PR c++/20416
        * call.c (initialize_reference): Handle local static reference
        temps properly.

From-SVN: r129020
parent 37b22c82
2007-10-04 Jason Merrill <jason@redhat.com>
PR c++/20416
* call.c (initialize_reference): Handle local static reference
temps properly.
2007-10-03 Jason Merrill <jason@redhat.com>
PR c++/32470
......
......@@ -6824,7 +6824,11 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
if (at_function_scope_p ())
{
add_decl_expr (var);
*cleanup = cxx_maybe_build_cleanup (var);
if (TREE_STATIC (var))
init = add_stmt_to_compound (init, register_dtor_fn (var));
else
*cleanup = cxx_maybe_build_cleanup (var);
/* We must be careful to destroy the temporary only
after its initialization has taken place. If the
......
// PR c++/20416. We correctly constructed the temporary S in foo(),
// but incorrectly destroyed it every time foo() was called.
// { dg-do run }
extern "C" void abort (void);
extern "C" void _exit (int);
int c, exiting;
struct S {
S() { ++c; }
S(const S &) { ++c; }
~S()
{
if (!exiting) abort ();
_exit (0);
}
};
void
foo (void)
{
static const S &s = S();
}
int main ()
{
if (c != 0)
abort ();
foo ();
foo ();
if (c != 1)
abort ();
exiting = 1;
return 1;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment