PR c++/70584 - don't force indirection to an rvalue
authorJason Merrill <jason@redhat.com>
Tue, 24 May 2016 21:06:53 +0000 (17:06 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 24 May 2016 21:06:53 +0000 (17:06 -0400)
* cp-gimplify.c (cp_fold_maybe_rvalue): Loop in case cp_fold
returns a decl.
(cp_fold) [INDIRECT_REF]: Don't fold to an rvalue.

From-SVN: r236670

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c

index 5e7eb3d0e4cff043059e8d446226c25a2dfa53d9..8010cb70b94fcf23d2c347a306cf23262c4371c5 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-24  Jason Merrill  <jason@redhat.com>
+
+       PR c++/70584
+       * cp-gimplify.c (cp_fold_maybe_rvalue): Loop in case cp_fold
+       returns a decl.
+       (cp_fold) [INDIRECT_REF]: Don't fold to an rvalue.
+
 2016-05-24  Martin Sebor  <msebor@redhat.com>
 
        PR c++/71147
index eeba26829b71eaead00b91431e34d8a5d78dbffb..0ba5aa956ee1f95f8bc38211449a4cf0d9e555f9 100644 (file)
@@ -1878,13 +1878,21 @@ cp_fully_fold (tree x)
 static tree
 cp_fold_maybe_rvalue (tree x, bool rval)
 {
-  if (rval && DECL_P (x))
+  while (true)
     {
-      tree v = decl_constant_value (x);
-      if (v != error_mark_node)
-       x = v;
+      x = cp_fold (x);
+      if (rval && DECL_P (x))
+       {
+         tree v = decl_constant_value (x);
+         if (v != x && v != error_mark_node)
+           {
+             x = v;
+             continue;
+           }
+       }
+      break;
     }
-  return cp_fold (x);
+  return x;
 }
 
 /* Fold expression X which is used as an rvalue.  */
@@ -2001,7 +2009,7 @@ cp_fold (tree x)
       if (REF_PARENTHESIZED_P (x))
        {
          tree p = maybe_undo_parenthesized_ref (x);
-         return cp_fold_maybe_rvalue (p, rval_ops);
+         return cp_fold (p);
        }
       goto unary;