OSDN Git Service

* typeck.c (unary_complex_lvalue): Do not duplicate the
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Jul 2001 23:46:06 +0000 (23:46 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 9 Jul 2001 23:46:06 +0000 (23:46 +0000)
        argument to modify, pre-, or post-increment when used as an
        lvalue and when the argument has side-effects.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43884 138bc75d-0d04-0410-961f-82ee72b054a4

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

index e07fd96..1f77946 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 1cf76e5..17b75cc 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;