diff options
author | Ollie Wild <aaw@google.com> | 2012-08-31 15:47:29 +0000 |
---|---|---|
committer | Ollie Wild <aaw@gcc.gnu.org> | 2012-08-31 15:47:29 +0000 |
commit | 5efef981c87dfa6bbbf516775821cd8ed2ca7e81 (patch) | |
tree | 589f7daabbc93367a0dc703715ace6fc0735ea07 | |
parent | 0336096575e3cf4dd0ac43d65097976631c609df (diff) | |
download | gcc-5efef981c87dfa6bbbf516775821cd8ed2ca7e81.zip gcc-5efef981c87dfa6bbbf516775821cd8ed2ca7e81.tar.gz gcc-5efef981c87dfa6bbbf516775821cd8ed2ca7e81.tar.bz2 |
re PR c++/54197 (Lifetime of reference not properly extended)
2012-08-31 Ollie Wild <aaw@google.com>
PR c++/54197
* gcc/cp/call.c (extend_ref_init_temps_1): Handle COMPOUND_EXPR trees.
* gcc/testsuite/g++.dg/init/lifetime3.C: New test.
From-SVN: r190834
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/lifetime3.C | 37 |
4 files changed, 53 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0bfcde7..5fb1b41 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2012-08-31 Ollie Wild <aaw@google.com> + + PR c++/54197 + * call.c (extend_ref_init_temps_1): Handle COMPOUND_EXPR trees. + 2012-08-30 Jason Merrill <jason@redhat.com> PR c++/50545 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 3915738..4d65b3e 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -8916,6 +8916,12 @@ extend_ref_init_temps_1 (tree decl, tree init, VEC(tree,gc) **cleanups) tree sub = init; tree *p; STRIP_NOPS (sub); + if (TREE_CODE (sub) == COMPOUND_EXPR) + { + TREE_OPERAND (sub, 1) + = extend_ref_init_temps_1 (decl, TREE_OPERAND (sub, 1), cleanups); + return init; + } if (TREE_CODE (sub) != ADDR_EXPR) return init; /* Deal with binding to a subobject. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8d48f8..2d3bf4d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-08-31 Ollie Wild <aaw@google.com> + + PR c++/54197 + * g++.dg/init/lifetime3.C: New test. + 2012-08-31 Martin Jambor <mjambor@suse.cz> PR middle-end/54409 diff --git a/gcc/testsuite/g++.dg/init/lifetime3.C b/gcc/testsuite/g++.dg/init/lifetime3.C new file mode 100644 index 0000000..d099699 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/lifetime3.C @@ -0,0 +1,37 @@ +// PR c++/26714 +// { dg-do run } + +extern "C" void abort(); + +bool ok = false; +struct A { + A() { } + ~A() { if (!ok) abort(); } +}; + +struct B { + static A foo() { return A(); } +}; + +B b_g; + +struct scoped_ptr { + B* operator->() const { return &b_g; } + B* get() const { return &b_g; } +}; + +B *get() { return &b_g; } + +int main() +{ + scoped_ptr f; + const A& ref1 = f->foo(); + const A& ref2 = f.get()->foo(); + const A& ref3 = get()->foo(); + const A& ref4 = B::foo(); + B *pf = f.get(); + const A& ref5 = pf->foo(); + + + ok = true; +} |