aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@gcc.gnu.org>1996-03-08 23:44:26 +0000
committerMike Stump <mrs@gcc.gnu.org>1996-03-08 23:44:26 +0000
commit2a888d4cd0492cb7f0e00bee497da7e9a01bf439 (patch)
tree623144524a5bed163162917af323d1c6247e5a06
parent23ccec44cc5dbdcca16d1e50ea649facf7e466eb (diff)
downloadgcc-2a888d4cd0492cb7f0e00bee497da7e9a01bf439.zip
gcc-2a888d4cd0492cb7f0e00bee497da7e9a01bf439.tar.gz
gcc-2a888d4cd0492cb7f0e00bee497da7e9a01bf439.tar.bz2
expr.c (expand_expr, [...]): Delay putting the cleanup on the cleanup chain until after the subexpression...
* expr.c (expand_expr, case TARGET_EXPR): Delay putting the cleanup on the cleanup chain until after the subexpression has been expanded. Fixes eh44.C and eh45.C From-SVN: r11504
-rw-r--r--gcc/expr.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index f4e2444..1765d69 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6588,7 +6588,6 @@ expand_expr (exp, target, tmode, modifier)
case TARGET_EXPR:
{
- int need_exception_region = 0;
/* Something needs to be initialized, but we didn't know
where that thing was when building the tree. For example,
it could be the return value of a function, or a parameter
@@ -6599,6 +6598,7 @@ expand_expr (exp, target, tmode, modifier)
or copied into our original target. */
tree slot = TREE_OPERAND (exp, 0);
+ tree cleanups = NULL_TREE;
tree exp1;
rtx temp;
@@ -6634,13 +6634,7 @@ expand_expr (exp, target, tmode, modifier)
if (TREE_OPERAND (exp, 2) == 0)
TREE_OPERAND (exp, 2) = maybe_build_cleanup (slot);
- if (TREE_OPERAND (exp, 2))
- {
- cleanups_this_call = tree_cons (NULL_TREE,
- TREE_OPERAND (exp, 2),
- cleanups_this_call);
- need_exception_region = 1;
- }
+ cleanups = TREE_OPERAND (exp, 2);
}
}
else
@@ -6671,8 +6665,13 @@ expand_expr (exp, target, tmode, modifier)
store_expr (exp1, target, 0);
- if (need_exception_region)
- (*interim_eh_hook) (NULL_TREE);
+ if (cleanups)
+ {
+ cleanups_this_call = tree_cons (NULL_TREE,
+ cleanups,
+ cleanups_this_call);
+ (*interim_eh_hook) (NULL_TREE);
+ }
return target;
}