summaryrefslogtreecommitdiff
path: root/gcc/cp/expr.c
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-01 05:50:40 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2000-05-01 05:50:40 +0000
commitbaa633bb7b4b3d477b37d3690ad64eaae23ee0bd (patch)
treee41de7e1f2eea4b105de1a4b38766e800772579c /gcc/cp/expr.c
parenta8edab65590091ee8b79951c5a5a08ccdf77f676 (diff)
downloadgcc-baa633bb7b4b3d477b37d3690ad64eaae23ee0bd.tar.gz
* expr.c (cplus_expand_expr): Preserve temporaries when expanding
STMT_EXPRs. * optimize.c (struct inline_data): Add target_exprs field. (declare_return_variable): When a function returns an aggregate, use the variable declared in the TARGET_EXPR as the remapped DECL_RESULT. (expand_call_inline): Update the pending target_exprs stack. (optimize_function): Initialize the stack. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33561 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/expr.c')
-rw-r--r--gcc/cp/expr.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index ebf7c94f946..c47d3909a72 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -143,10 +143,21 @@ cplus_expand_expr (exp, target, tmode, modifier)
case STMT_EXPR:
{
- tree rtl_expr = expand_start_stmt_expr ();
+ tree rtl_expr;
+ rtx result;
+
+ /* Since expand_expr_stmt calls free_temp_slots after every
+ expression statement, we must call push_temp_slots here.
+ Otherwise, any temporaries in use now would be considered
+ out-of-scope after the first EXPR_STMT from within the
+ STMT_EXPR. */
+ push_temp_slots ();
+ rtl_expr = expand_start_stmt_expr ();
expand_stmt (STMT_EXPR_STMT (exp));
expand_end_stmt_expr (rtl_expr);
- return expand_expr (rtl_expr, target, tmode, modifier);
+ result = expand_expr (rtl_expr, target, tmode, modifier);
+ pop_temp_slots ();
+ return result;
}
break;