PR c++/54293 - binding reference to member of temporary
authorJason Merrill <jason@redhat.com>
Wed, 5 Oct 2016 22:58:55 +0000 (18:58 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 5 Oct 2016 22:58:55 +0000 (18:58 -0400)
* call.c (reference_binding): Fix binding to member of temporary.

From-SVN: r240819

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/init/ref19.C

index f8752a6911c3556b3575ec0ee37a57f62839798d..569d696546d7d1401f685f639d64f5bd0056fdde 100644 (file)
@@ -1,5 +1,8 @@
 2016-10-05  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54293
+       * call.c (reference_binding): Fix binding to member of temporary.
+
        * call.c (extend_ref_init_temps): Fix TARGET_EXPR handling.
 
        * parser.c (cp_parser_skip_to_end_of_statement): Add missing break.
index c33341813cf23e69449f923eca5c238a87eecfa2..dac1337cc4954919fe12f43cccf83d1652524194 100644 (file)
@@ -1539,15 +1539,20 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags,
        gl_kind = clk_rvalueref;
     }
   else if (expr)
-    {
-      gl_kind = lvalue_kind (expr);
-      if (gl_kind & clk_class)
-       /* A class prvalue is not a glvalue.  */
-       gl_kind = clk_none;
-    }
+    gl_kind = lvalue_kind (expr);
+  else if (CLASS_TYPE_P (from)
+          || TREE_CODE (from) == ARRAY_TYPE)
+    gl_kind = clk_class;
   else
     gl_kind = clk_none;
-  is_lvalue = gl_kind && !(gl_kind & clk_rvalueref);
+
+  /* Don't allow a class prvalue when LOOKUP_NO_TEMP_BIND.  */
+  if ((flags & LOOKUP_NO_TEMP_BIND)
+      && (gl_kind & clk_class))
+    gl_kind = clk_none;
+
+  /* Same mask as real_lvalue_p.  */
+  is_lvalue = gl_kind && !(gl_kind & (clk_rvalueref|clk_class));
 
   tfrom = from;
   if ((gl_kind & clk_bitfield) != 0)
@@ -1569,11 +1574,7 @@ reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags,
      [8.5.3/5 dcl.init.ref] is changed to also require direct bindings for
      const and rvalue references to rvalues of compatible class type.
      We should also do direct bindings for non-class xvalues.  */
-  if (related_p
-      && (gl_kind
-         || (!(flags & LOOKUP_NO_TEMP_BIND)
-             && (CLASS_TYPE_P (from)
-                 || TREE_CODE (from) == ARRAY_TYPE))))
+  if (related_p && gl_kind)
     {
       /* [dcl.init.ref]
 
index ed78c939ba63424ebdc137089cbe099cff300dc0..d583e939fdb3ac38dfe2b0951f0f2de6d14f42c1 100644 (file)
@@ -11,7 +11,11 @@ struct A
 
 int main()
 {
-  const int &r = A().i;
+  {
+    const int &r = A().i;
+    if (d != 0)
+      return 1;
+  }
   if (d != 1)
     return 1;
 }