diff options
Diffstat (limited to 'gcc/cp')
| -rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
| -rw-r--r-- | gcc/cp/typeck.c | 13 |
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1bc4fed5a5a..d999173926d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2003-08-01 Nathan Sidwell <nathan@codesourcery.com> + * typeck.c (build_compound_expr): If RHS is a TARGET_EXPR, put the + compound expr inside the target's initializer. + PR c++/11525 * parser.c (cp_parser_primary_expression): Do not set non-constant-p merely because it is a dependent scope. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 00fa013b69a..dd7e0af8084 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4322,6 +4322,19 @@ build_compound_expr (tree lhs, tree rhs) lhs = convert_to_void (lhs, "left-hand operand of comma"); if (lhs == error_mark_node || rhs == error_mark_node) return error_mark_node; + + if (TREE_CODE (rhs) == TARGET_EXPR) + { + /* If the rhs is a TARGET_EXPR, then build the compound + expression inside the target_expr's initializer. This + helps the compiler to eliminate unncessary temporaries. */ + tree init = TREE_OPERAND (rhs, 1); + + init = build (COMPOUND_EXPR, TREE_TYPE (init), lhs, init); + TREE_OPERAND (rhs, 1) = init; + + return rhs; + } return build (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs); } |

