diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/except.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/eh1.C | 21 |
3 files changed, 38 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66813dd..7e39ad6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-03-11 Richard Henderson <rth@redhat.com> + + PR middle-end/14477 + * except.c (remove_unreachable_regions): Look thru CALL_PLACEHOLDER. + 2004-03-11 Ulrich Weigand <uweigand@de.ibm.com> PR target/14262 diff --git a/gcc/except.c b/gcc/except.c index 60edf82..809f653 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1048,7 +1048,18 @@ remove_unreachable_regions (rtx insns) } for (insn = insns; insn; insn = NEXT_INSN (insn)) - reachable[uid_region_num[INSN_UID (insn)]] = true; + { + reachable[uid_region_num[INSN_UID (insn)]] = true; + + if (GET_CODE (insn) == CALL_INSN + && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER) + for (i = 0; i < 3; i++) + { + rtx sub = XEXP (PATTERN (insn), i); + for (; sub ; sub = NEXT_INSN (sub)) + reachable[uid_region_num[INSN_UID (sub)]] = true; + } + } for (i = cfun->eh->last_region_number; i > 0; --i) { diff --git a/gcc/testsuite/g++.dg/opt/eh1.C b/gcc/testsuite/g++.dg/opt/eh1.C new file mode 100644 index 0000000..63a4d2e --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh1.C @@ -0,0 +1,21 @@ +// PR middle-end/14477 +// { dg-do compile } +// { dg-options "-O2 -fno-default-inline" } + +struct A +{ + A(); +}; + +struct B +{ + B(const A*); +}; + +struct C +{ + B b; + C(int) : b(new A) {} +}; + +C c(0); |