mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-11 03:50:27 +08:00
re PR c++/48370 (G++ fails to extend reference temporary lifetime in some situations)
PR c++/48370 * decl.c (cp_finish_decl): Run cleanups in the right order. From-SVN: r181001
This commit is contained in:
parent
1bb6f77823
commit
8dc1dc7975
@ -1,3 +1,8 @@
|
||||
2011-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48370
|
||||
* decl.c (cp_finish_decl): Run cleanups in the right order.
|
||||
|
||||
2011-11-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR c++/50608
|
||||
|
@ -5907,7 +5907,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
||||
tree asmspec_tree, int flags)
|
||||
{
|
||||
tree type;
|
||||
VEC(tree,gc) *cleanups = NULL;
|
||||
VEC(tree,gc) *cleanups = make_tree_vector ();
|
||||
unsigned i; tree t;
|
||||
const char *asmspec = NULL;
|
||||
int was_readonly = 0;
|
||||
bool var_definition_p = false;
|
||||
@ -6315,12 +6316,9 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
|
||||
|
||||
/* If a CLEANUP_STMT was created to destroy a temporary bound to a
|
||||
reference, insert it in the statement-tree now. */
|
||||
if (cleanups)
|
||||
{
|
||||
unsigned i; tree t;
|
||||
FOR_EACH_VEC_ELT_REVERSE (tree, cleanups, i, t)
|
||||
push_cleanup (decl, t, false);
|
||||
}
|
||||
FOR_EACH_VEC_ELT (tree, cleanups, i, t)
|
||||
push_cleanup (decl, t, false);
|
||||
release_tree_vector (cleanups);
|
||||
|
||||
if (was_readonly)
|
||||
TREE_READONLY (decl) = 1;
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-11-04 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48370
|
||||
* g++.dg/init/lifetime1.C: Test cleanup order.
|
||||
|
||||
2011-11-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* g++.dg/other/offsetof7.C: New test.
|
||||
|
@ -2,12 +2,13 @@
|
||||
// { dg-do run }
|
||||
|
||||
extern "C" void abort();
|
||||
bool ok;
|
||||
|
||||
int last = 4;
|
||||
|
||||
struct A {
|
||||
int i;
|
||||
A(int i): i(i) { }
|
||||
~A() { if (!ok) abort(); }
|
||||
~A() { if (i > last) abort(); last = i; }
|
||||
};
|
||||
|
||||
struct D { int i; };
|
||||
@ -25,5 +26,4 @@ struct C
|
||||
int main()
|
||||
{
|
||||
C c = { 1, B(2), E(3) };
|
||||
ok = true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user