diff options
author | Richard Guenther <rguenther@suse.de> | 2010-10-01 12:07:47 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-10-01 12:07:47 +0000 |
commit | 0d228a5255e2e2917cc8807f427221a36a583f4b (patch) | |
tree | 974de03023548fefebe5bb8532c965356aca9565 | |
parent | 33f49367016b4bf543de30324c580a317970b5e8 (diff) | |
download | gcc-0d228a5255e2e2917cc8807f427221a36a583f4b.zip gcc-0d228a5255e2e2917cc8807f427221a36a583f4b.tar.gz gcc-0d228a5255e2e2917cc8807f427221a36a583f4b.tar.bz2 |
re PR middle-end/45854 (ICE in redirect_eh_edge_1, at tree-eh.c:2131)
2010-10-01 Richard Guenther <rguenther@suse.de>
PR tree-optimization/45854
* tree-eh.c (cleanup_empty_eh): Avoid degenerate case.
* g++.dg/torture/pr45854.C: New testcase.
From-SVN: r164881
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr45854.C | 30 | ||||
-rw-r--r-- | gcc/tree-eh.c | 8 |
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1deab0..bb7a98b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-10-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/45854 + * tree-eh.c (cleanup_empty_eh): Avoid degenerate case. + 2010-10-01 Anthony Green <green@moxielogic.com> * config.gcc: Fix moxie-*-rtems* configuration. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eecc6be..5af0697 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-10-01 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/45854 + * g++.dg/torture/pr45854.C: New testcase. + 2010-09-30 Michael Eager <eager@eagercon.com> * 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 0000000..17ee006 --- /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 2174276..8a99ad3 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); |