From 3423a64d46de09a8625db4c2ec2b6a1586f40c56 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 22 May 2018 23:52:56 -0400 Subject: [PATCH] PR c++/81420 - not extending temporary lifetime. * call.c (extend_ref_init_temps_1): Handle ARRAY_REF. * class.c (build_base_path): Avoid redundant move of an rvalue. From-SVN: r260563 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/call.c | 4 +++- gcc/cp/class.c | 2 +- gcc/testsuite/g++.dg/cpp0x/temp-extend1.C | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/temp-extend1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ce22731..ee7361b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-05-22 Jason Merrill + PR c++/81420 - not extending temporary lifetime. + * call.c (extend_ref_init_temps_1): Handle ARRAY_REF. + * class.c (build_base_path): Avoid redundant move of an rvalue. + PR c++/85866 - error with .* in default template arg. * pt.c (tsubst_copy_and_build): Handle partial instantiation. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 1df4d14..c100a92 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -11061,7 +11061,9 @@ extend_ref_init_temps_1 (tree decl, tree init, vec **cleanups) if (TREE_CODE (sub) != ADDR_EXPR) return init; /* Deal with binding to a subobject. */ - for (p = &TREE_OPERAND (sub, 0); TREE_CODE (*p) == COMPONENT_REF; ) + for (p = &TREE_OPERAND (sub, 0); + (TREE_CODE (*p) == COMPONENT_REF + || TREE_CODE (*p) == ARRAY_REF); ) p = &TREE_OPERAND (*p, 0); if (TREE_CODE (*p) == TARGET_EXPR) { diff --git a/gcc/cp/class.c b/gcc/cp/class.c index a9a0fa9..25753d4 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -426,7 +426,7 @@ build_base_path (enum tree_code code, { expr = cp_build_fold_indirect_ref (expr); expr = build_simple_base_path (expr, binfo); - if (rvalue) + if (rvalue && lvalue_p (expr)) expr = move (expr); if (want_pointer) expr = build_address (expr); diff --git a/gcc/testsuite/g++.dg/cpp0x/temp-extend1.C b/gcc/testsuite/g++.dg/cpp0x/temp-extend1.C new file mode 100644 index 0000000..639f945 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/temp-extend1.C @@ -0,0 +1,19 @@ +// PR c++/81420 +// { dg-do run { target c++11 } } + +int d; + +struct A +{ + int i[2]; + ~A() { ++d; }; +}; + +struct B: A {}; + +int main() +{ + const int &r = B().i[0]; + if (d != 0) + __builtin_abort(); +} -- 2.7.4