1 // PR target/30230
2 // This testcase failed on IA-64, where end of an EH region ended
3 // in the middle of a bundle (with br.call insn in first or second
4 // slot of .bbb/.mbb bundles and EH region end right after it).
5 // But br.call returns to the start of the next bundlem so during
6 // unwinding the call was considered to be outside of the EH region
7 // while it should have been inside.
8 // { dg-do run }
9 // { dg-require-weak "" }
10 // { dg-options "-O2" }
11
12 struct A {};
13 struct B { virtual ~B(); };
~B()14 B::~B () {}
15 struct C { void foo (short &, B &); };
virtD16 struct D { void *d1; C *d2; virtual void virt (void) {} };
17 struct E { D *e1; B *e2; };
18 struct F { void bar (void *, B &); };
19 F *p __attribute__((weak));
20 volatile int r;
21
foo(short & x,B &)22 void C::foo (short &x, B &)
23 {
24 if (r)
25 throw A ();
26 x = 1;
27 }
28
bar(void *,B &)29 void F::bar (void *, B &)
30 {
31 throw A ();
32 }
33
baz(E & x)34 void baz (E &x)
35 {
36 short g = 0;
37 B b = *x.e2;
38 x.e1->d2->foo (g, b);
39 if (g)
40 p->bar(x.e1->d1, b);
41 }
42
main()43 int main ()
44 {
45 F g;
46 D s;
47 E h;
48 p = &g;
49 h.e1 = &s;
50 try
51 {
52 baz (h);
53 }
54 catch (A &)
55 {
56 }
57 return 0;
58 }
59