aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/expr.c
diff options
context:
space:
mode:
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 ebf7c94..c47d390 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;