From: Richard Henderson Date: Wed, 25 Jul 2001 19:59:39 +0000 (-0700) Subject: except.c (reachable_handlers): Handle a region being removed out from under a RESX. X-Git-Tag: prereleases/libstdc++-3.0.95~3050 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f206d8f42ecbe874b67712a5994dc4459ca4795;p=thirdparty%2Fgcc.git except.c (reachable_handlers): Handle a region being removed out from under a RESX. * except.c (reachable_handlers): Handle a region being removed out from under a RESX. From-SVN: r44363 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e9f613975bf..973a821b3c4d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-07-25 Richard Henderson + + * except.c (reachable_handlers): Handle a region being removed + out from under a RESX. + 2001-07-25 Richard Henderson * config/alpha/alpha.c (alpha_emit_conditional_move): Always diff --git a/gcc/except.c b/gcc/except.c index 01e83f0c4693..b45237cfa004 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -2728,14 +2728,20 @@ reachable_handlers (insn) region = cfun->eh->region_array[region_number]; type_thrown = NULL_TREE; - if (region->type == ERT_THROW) + if (GET_CODE (insn) == JUMP_INSN + && GET_CODE (PATTERN (insn)) == RESX) + { + /* A RESX leaves a region instead of entering it. Thus the + region itself may have been deleted out from under us. */ + if (region == NULL) + return NULL; + region = region->outer; + } + else if (region->type == ERT_THROW) { type_thrown = region->u.throw.type; region = region->outer; } - else if (GET_CODE (insn) == JUMP_INSN - && GET_CODE (PATTERN (insn)) == RESX) - region = region->outer; for (; region; region = region->outer) if (reachable_next_level (region, type_thrown, &info) >= RNL_CAUGHT)