diff options
Diffstat (limited to 'gcc/cp/expr.c')
| -rw-r--r-- | gcc/cp/expr.c | 15 |
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; |
