| // 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; |
| } |