aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOllie Wild <aaw@google.com>2012-08-31 15:47:29 +0000
committerOllie Wild <aaw@gcc.gnu.org>2012-08-31 15:47:29 +0000
commit5efef981c87dfa6bbbf516775821cd8ed2ca7e81 (patch)
tree589f7daabbc93367a0dc703715ace6fc0735ea07
parent0336096575e3cf4dd0ac43d65097976631c609df (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/call.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/lifetime3.C37
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;
+}