diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-07-09 23:46:06 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-07-09 23:46:06 +0000 |
commit | 21ca8a32a0a2bf23a61eef96cf4fde85970582a1 (patch) | |
tree | c6ad27b09a855052eba84353eab09e3c659df104 | |
parent | d7e2f694b72291b16824c21758b353898c40c51f (diff) | |
download | gcc-21ca8a32a0a2bf23a61eef96cf4fde85970582a1.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43884 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 15 |
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e07fd96fabc..1f77946cbf2 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 1cf76e5980a..17b75cc362b 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; |