except.c (reachable_handlers): Handle a region being removed out from under a RESX.
authorRichard Henderson <rth@redhat.com>
Wed, 25 Jul 2001 19:59:39 +0000 (12:59 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 25 Jul 2001 19:59:39 +0000 (12:59 -0700)
        * except.c (reachable_handlers): Handle a region being removed
        out from under a RESX.

From-SVN: r44363

gcc/ChangeLog
gcc/except.c

index 3e9f613975bfa5f117de6dda5cb08c0230220a23..973a821b3c4d9eba9d9fd82b3f92370c84d7ca33 100644 (file)
@@ -1,3 +1,8 @@
+2001-07-25  Richard Henderson  <rth@redhat.com>
+
+       * except.c (reachable_handlers): Handle a region being removed
+       out from under a RESX.
+
 2001-07-25  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (alpha_emit_conditional_move): Always
index 01e83f0c4693fb5b7c4158d3579a096d7ec9fe04..b45237cfa0040d3beed266720592d6e7b2a8785a 100644 (file)
@@ -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)