Commit ff2c46ac by Richard Henderson Committed by Richard Henderson

re PR c++/6320 (3.1 regression wrt 3.0: ICE in remove_eh_handler, at except.c:2696)

        PR c++/6320
        * except.c (remove_eh_handler): Insert inner regions at beginning
        of sibling chain.  Refactor expressions.

	* g++.dg/eh/dead1.C: New.

From-SVN: r52397
parent b2123dc0
2002-04-16 Richard Henderson <rth@redhat.com>
PR c++/6320
* except.c (remove_eh_handler): Insert inner regions at beginning
of sibling chain. Refactor expressions.
2002-04-16 Richard Henderson <rth@redhat.com>
* config/sparc/sol2-bi.h (AS_SPARC64_FLAG): New.
* config/sparc/sol2-gas-bi.h: New file.
* config.gcc (sparc*-solaris): Add it as needed.
......
......@@ -2579,7 +2579,7 @@ static void
remove_eh_handler (region)
struct eh_region *region;
{
struct eh_region **pp, *p;
struct eh_region **pp, **pp_start, *p, *outer, *inner;
rtx lab;
/* For the benefit of efficiently handling REG_EH_REGION notes,
......@@ -2588,21 +2588,22 @@ remove_eh_handler (region)
multiple copies of this region in the array, so we have a
list of alternate numbers by which we are known. */
cfun->eh->region_array[region->region_number] = region->outer;
outer = region->outer;
cfun->eh->region_array[region->region_number] = outer;
if (region->aka)
{
int i;
EXECUTE_IF_SET_IN_BITMAP (region->aka, 0, i,
{ cfun->eh->region_array[i] = region->outer; });
{ cfun->eh->region_array[i] = outer; });
}
if (region->outer)
if (outer)
{
if (!region->outer->aka)
region->outer->aka = BITMAP_XMALLOC ();
if (!outer->aka)
outer->aka = BITMAP_XMALLOC ();
if (region->aka)
bitmap_a_or_b (region->outer->aka, region->outer->aka, region->aka);
bitmap_set_bit (region->outer->aka, region->region_number);
bitmap_a_or_b (outer->aka, outer->aka, region->aka);
bitmap_set_bit (outer->aka, region->region_number);
}
if (cfun->eh->built_landing_pads)
......@@ -2612,23 +2613,24 @@ remove_eh_handler (region)
if (lab)
remove_exception_handler_label (lab);
if (region->outer)
pp = &region->outer->inner;
if (outer)
pp_start = &outer->inner;
else
pp = &cfun->eh->region_tree;
for (p = *pp; p != region; pp = &p->next_peer, p = *pp)
pp_start = &cfun->eh->region_tree;
for (pp = pp_start, p = *pp; p != region; pp = &p->next_peer, p = *pp)
continue;
*pp = region->next_peer;
if (region->inner)
inner = region->inner;
if (inner)
{
for (p = region->inner; p->next_peer ; p = p->next_peer)
p->outer = region->outer;
p->next_peer = region->next_peer;
p->outer = region->outer;
*pp = region->inner;
for (p = inner; p->next_peer ; p = p->next_peer)
p->outer = outer;
p->outer = outer;
p->next_peer = *pp_start;
*pp_start = inner;
}
else
*pp = region->next_peer;
if (region->type == ERT_CATCH)
{
......
// PR 6320
// Rechained the MUST_NOT_THROW region in the wrong order wrt the
// TRY/CATCH while removing them and got confused.
// { dg-do compile }
struct S {
~S();
};
void foo()
{
try {
return;
}
catch (int) {
}
catch (...) {
S s;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment