typeck.c (unary_complex_lvalue): Do not duplicate the argument to modify...
authorErik Rozendaal <dlr@acm.org>
Mon, 9 Jul 2001 23:46:06 +0000 (19:46 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 9 Jul 2001 23:46:06 +0000 (19:46 -0400)
        * typeck.c (unary_complex_lvalue): Do not duplicate the
        argument to modify, pre-, or post-increment when used as an
        lvalue and when the argument has side-effects.

From-SVN: r43884

gcc/cp/ChangeLog
gcc/cp/typeck.c

index e07fd96fabca8466ec471452b434e627fe7382cc..1f77946cbf259515a1c6fb2e264f4d179e5d6c30 100644 (file)
@@ -1,3 +1,9 @@
+2001-07-09  Erik Rozendaal  <dlr@acm.org>
+
+       * typeck.c (unary_complex_lvalue): Do not duplicate the
+       argument to modify, pre-, or post-increment when used as an
+       lvalue and when the argument has side-effects.
+
 2001-07-08  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * decl.c (start_decl): Don't call SET_DEFAULT_DECL_ATTRIBUTES.
@@ -12,7 +18,7 @@
 
 2001-07-06  Ira Ruben   <ira@apple.com>
 
-        * cp-tree.def (TEMPLATE_DECL): Update comment. DECL_RESULT should
+       * cp-tree.def (TEMPLATE_DECL): Update comment. DECL_RESULT should
        be DECL_TEMPLATE_RESULT.
 
 2001-07-05  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
index 1cf76e5980ae3345bcc58c158636914c39f9c21d..17b75cc362b8d8fdd6609e01821ab03253fd7a49 100644 (file)
@@ -4808,12 +4808,21 @@ unary_complex_lvalue (code, arg)
       || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
     return rationalize_conditional_expr (code, arg);
 
+  /* Handle (a = b), (++a), and (--a) used as an "lvalue".  */
   if (TREE_CODE (arg) == MODIFY_EXPR
       || TREE_CODE (arg) == PREINCREMENT_EXPR
       || TREE_CODE (arg) == PREDECREMENT_EXPR)
-    return unary_complex_lvalue
-      (code, build (COMPOUND_EXPR, TREE_TYPE (TREE_OPERAND (arg, 0)),
-                   arg, TREE_OPERAND (arg, 0)));
+    {
+      tree lvalue = TREE_OPERAND (arg, 0);
+      if (TREE_SIDE_EFFECTS (lvalue))
+       {
+         lvalue = stabilize_reference (lvalue);
+         arg = build (TREE_CODE (arg), TREE_TYPE (arg),
+                      lvalue, TREE_OPERAND (arg, 1));
+       }
+      return unary_complex_lvalue
+       (code, build (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
+    }
 
   if (code != ADDR_EXPR)
     return 0;