diff options
author | Erik Rozendaal <dlr@acm.org> | 2001-07-09 19:46:06 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2001-07-09 19:46:06 -0400 |
commit | ae818d3be84a3154287758d8be72c82b921d1429 (patch) | |
tree | c6ad27b09a855052eba84353eab09e3c659df104 /gcc/cp | |
parent | d777856dc899138fa15029c6f7490614c176d765 (diff) | |
download | gcc-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/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 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; |