diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/eh5.C')
-rw-r--r-- | gcc/testsuite/g++.dg/opt/eh5.C | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/eh5.C b/gcc/testsuite/g++.dg/opt/eh5.C new file mode 100644 index 00000000000..3557ab2aa54 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh5.C @@ -0,0 +1,43 @@ +// PR 41377 +// { dg-do compile } +// { dg-options "-O3" } + +struct A +{ + bool foo(int*) const; +} a; + +struct B {}; + +struct B1 : B +{ + bool (A::*pmf)(int*) const; + const A* pa; + + B1() : pmf(&A::foo), pa(&a) {} + bool operator()() const { return (pa->*pmf)(new int); } +}; + +struct B2 : B +{ + B1 b1; + + B2(const B1& _b1) : b1(_b1) {} + bool operator()() const { return b1(); } +}; + +template<int> struct C +{ + void bar(B2 b2) { while (b2()) ; } + C() { bar(B2(B1())); } +}; + +void baz(int i) +{ + switch(i) + { + case 0: new C<0>; + case 1: new C<1>; + case 2: new C<2>; + } +} |