aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2009-10-13 11:41:56 -0700
committerRichard Henderson <rth@gcc.gnu.org>2009-10-13 11:41:56 -0700
commitd6063d7f3f4f244f1b52192152fd817e1f2b4afc (patch)
tree74fb485ab351d1834e45a278e8522553d5ee1422 /gcc/testsuite
parentf43085aaa3fef8263b4afc1c2b5f9721d9bdd8b2 (diff)
downloadgcc-d6063d7f3f4f244f1b52192152fd817e1f2b4afc.zip
gcc-d6063d7f3f4f244f1b52192152fd817e1f2b4afc.tar.gz
gcc-d6063d7f3f4f244f1b52192152fd817e1f2b4afc.tar.bz2
re PR tree-optimization/41377 (gimple EH rewrite causes ICE with PPRE (enabled at -O3))
PR tree-optimization/41377 * tree-eh.c (unsplit_eh): Propagate degenerate PHIs. (cleanup_empty_eh_merge_phis): New change_region parameter; pass it on to redirect_eh_edge_1. Update callers. (cleanup_empty_eh_unsplit): Don't require an existing EH label at the destination block. From-SVN: r152728
Diffstat (limited to 'gcc/testsuite')
-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 0000000..3557ab2
--- /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>;
+ }
+}