aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorErik Rozendaal <dlr@acm.org>2001-07-09 19:46:06 -0400
committerJason Merrill <jason@gcc.gnu.org>2001-07-09 19:46:06 -0400
commitae818d3be84a3154287758d8be72c82b921d1429 (patch)
treec6ad27b09a855052eba84353eab09e3c659df104 /gcc/cp
parentd777856dc899138fa15029c6f7490614c176d765 (diff)
downloadgcc-ae818d3be84a3154287758d8be72c82b921d1429.zip
gcc-ae818d3be84a3154287758d8be72c82b921d1429.tar.gz
gcc-ae818d3be84a3154287758d8be72c82b921d1429.tar.bz2
typeck.c (unary_complex_lvalue): Do not duplicate the argument to modify...
* 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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/typeck.c15
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e07fd96..1f77946 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 1cf76e5..17b75cc 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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;