diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2009-10-13 11:41:56 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2009-10-13 11:41:56 -0700 |
commit | d6063d7f3f4f244f1b52192152fd817e1f2b4afc (patch) | |
tree | 74fb485ab351d1834e45a278e8522553d5ee1422 /gcc/testsuite/g++.dg/opt/eh5.C | |
parent | f43085aaa3fef8263b4afc1c2b5f9721d9bdd8b2 (diff) | |
download | gcc-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/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 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>; + } +} |