From 0d228a5255e2e2917cc8807f427221a36a583f4b Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 1 Oct 2010 12:07:47 +0000 Subject: [PATCH] re PR middle-end/45854 (ICE in redirect_eh_edge_1, at tree-eh.c:2131) 2010-10-01 Richard Guenther PR tree-optimization/45854 * tree-eh.c (cleanup_empty_eh): Avoid degenerate case. * g++.dg/torture/pr45854.C: New testcase. From-SVN: r164881 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr45854.C | 30 ++++++++++++++++++++++++++ gcc/tree-eh.c | 8 ++++++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr45854.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1deab0794c7..bb7a98bcba17 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-10-01 Richard Guenther + + PR tree-optimization/45854 + * tree-eh.c (cleanup_empty_eh): Avoid degenerate case. + 2010-10-01 Anthony Green * config.gcc: Fix moxie-*-rtems* configuration. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eecc6bedee7c..5af069797d95 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-10-01 Richard Guenther + + PR tree-optimization/45854 + * g++.dg/torture/pr45854.C: New testcase. + 2010-09-30 Michael Eager * gcc.c-torture/execute/cmpsf-1.c: Rename FLOAT_{MIN,MAX} to diff --git a/gcc/testsuite/g++.dg/torture/pr45854.C b/gcc/testsuite/g++.dg/torture/pr45854.C new file mode 100644 index 000000000000..17ee006e048e --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr45854.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +template < typename = void > +struct X { } ; +struct Y +{ + Y () ; +} ; +template < typename = X < > > +struct T +{ + void f () + { + f () ; + } +} ; +struct S +{ + S ( X < > = X < > ()) ; + ~S () + { + T < > () . f () ; + } +} ; +struct Z +{ + S s ; + Y y ; +} a ; + diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 217427648638..8a99ad3aa4fa 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -3743,7 +3743,13 @@ cleanup_empty_eh (eh_landing_pad lp) /* If the block is totally empty, look for more unsplitting cases. */ if (gsi_end_p (gsi)) - return cleanup_empty_eh_unsplit (bb, e_out, lp); + { + /* For the degenerate case of an infinite loop bail out. */ + if (e_out->dest == bb) + return false; + + return cleanup_empty_eh_unsplit (bb, e_out, lp); + } /* The block should consist only of a single RESX statement. */ resx = gsi_stmt (gsi);