59 lines
1.0 KiB
C
59 lines
1.0 KiB
C
// PR target/30230
|
|
// This testcase failed on IA-64, where end of an EH region ended
|
|
// in the middle of a bundle (with br.call insn in first or second
|
|
// slot of .bbb/.mbb bundles and EH region end right after it).
|
|
// But br.call returns to the start of the next bundlem so during
|
|
// unwinding the call was considered to be outside of the EH region
|
|
// while it should have been inside.
|
|
// { dg-do run }
|
|
// { dg-require-weak "" }
|
|
// { dg-options "-O2" }
|
|
|
|
struct A {};
|
|
struct B { virtual ~B(); };
|
|
B::~B () {}
|
|
struct C { void foo (short &, B &); };
|
|
struct D { void *d1; C *d2; virtual void virt (void) {} };
|
|
struct E { D *e1; B *e2; };
|
|
struct F { void bar (void *, B &); };
|
|
F *p __attribute__((weak));
|
|
volatile int r;
|
|
|
|
void C::foo (short &x, B &)
|
|
{
|
|
if (r)
|
|
throw A ();
|
|
x = 1;
|
|
}
|
|
|
|
void F::bar (void *, B &)
|
|
{
|
|
throw A ();
|
|
}
|
|
|
|
void baz (E &x)
|
|
{
|
|
short g = 0;
|
|
B b = *x.e2;
|
|
x.e1->d2->foo (g, b);
|
|
if (g)
|
|
p->bar(x.e1->d1, b);
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
F g;
|
|
D s;
|
|
E h;
|
|
p = &g;
|
|
h.e1 = &s;
|
|
try
|
|
{
|
|
baz (h);
|
|
}
|
|
catch (A &)
|
|
{
|
|
}
|
|
return 0;
|
|
}
|