* call.c (extend_ref_init_temps_1): Handle ARRAY_REF.
* class.c (build_base_path): Avoid redundant move of an rvalue.
From-SVN: r260563
2018-05-22 Jason Merrill <jason@redhat.com>
+ 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.
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)
{
{
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);
--- /dev/null
+// 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();
+}