summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/opt/eh5.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/eh5.C')
-rw-r--r--gcc/testsuite/g++.dg/opt/eh5.C43
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 000000000..3557ab2aa
--- /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>;
+ }
+}