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>
|
2011-11-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
PR c++/50608
|
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 asmspec_tree, int flags)
|
||||||
{
|
{
|
||||||
tree type;
|
tree type;
|
||||||
VEC(tree,gc) *cleanups = NULL;
|
VEC(tree,gc) *cleanups = make_tree_vector ();
|
||||||
|
unsigned i; tree t;
|
||||||
const char *asmspec = NULL;
|
const char *asmspec = NULL;
|
||||||
int was_readonly = 0;
|
int was_readonly = 0;
|
||||||
bool var_definition_p = false;
|
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
|
/* If a CLEANUP_STMT was created to destroy a temporary bound to a
|
||||||
reference, insert it in the statement-tree now. */
|
reference, insert it in the statement-tree now. */
|
||||||
if (cleanups)
|
FOR_EACH_VEC_ELT (tree, cleanups, i, t)
|
||||||
{
|
push_cleanup (decl, t, false);
|
||||||
unsigned i; tree t;
|
release_tree_vector (cleanups);
|
||||||
FOR_EACH_VEC_ELT_REVERSE (tree, cleanups, i, t)
|
|
||||||
push_cleanup (decl, t, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (was_readonly)
|
if (was_readonly)
|
||||||
TREE_READONLY (decl) = 1;
|
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>
|
2011-11-04 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* g++.dg/other/offsetof7.C: New test.
|
* g++.dg/other/offsetof7.C: New test.
|
||||||
|
|
|
@ -2,12 +2,13 @@
|
||||||
// { dg-do run }
|
// { dg-do run }
|
||||||
|
|
||||||
extern "C" void abort();
|
extern "C" void abort();
|
||||||
bool ok;
|
|
||||||
|
int last = 4;
|
||||||
|
|
||||||
struct A {
|
struct A {
|
||||||
int i;
|
int i;
|
||||||
A(int i): i(i) { }
|
A(int i): i(i) { }
|
||||||
~A() { if (!ok) abort(); }
|
~A() { if (i > last) abort(); last = i; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct D { int i; };
|
struct D { int i; };
|
||||||
|
@ -25,5 +26,4 @@ struct C
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
C c = { 1, B(2), E(3) };
|
C c = { 1, B(2), E(3) };
|
||||||
ok = true;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue