diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr57499.C | 14 | ||||
-rw-r--r-- | gcc/tree-eh.c | 7 |
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be732f1..9d26481 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-05 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/57499 + * tree-eh.c (cleanup_empty_eh): Bail out on totally empty + bb with no successors. + 2014-02-05 James Greenhalgh <james.greenhalgh@arm.com> PR target/59718 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2f154f4..68ef6ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ +2014-02-05 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/57499 + * g++.dg/torture/pr57499.C: New test. + 2014-02-05 Yury Gribov <y.gribov@samsung.com> - * gcc.dg/asan/nosanitize-and-inline.c: : New test. + * gcc.dg/asan/nosanitize-and-inline.c: New test. 2014-02-04 Jan Hubicka <hubicka@ucw.cz> diff --git a/gcc/testsuite/g++.dg/torture/pr57499.C b/gcc/testsuite/g++.dg/torture/pr57499.C new file mode 100644 index 0000000..fd985a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr57499.C @@ -0,0 +1,14 @@ +// PR middle-end/57499 +// { dg-do compile } + +struct S +{ + ~S () __attribute__ ((noreturn)) {} // { dg-warning "function does return" } +}; + +void +foo () +{ + S s; + throw 1; +} diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index e9c714c..857ee45 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -4396,8 +4396,11 @@ cleanup_empty_eh (eh_landing_pad lp) /* If the block is totally empty, look for more unsplitting cases. */ if (gsi_end_p (gsi)) { - /* For the degenerate case of an infinite loop bail out. */ - if (infinite_empty_loop_p (e_out)) + /* For the degenerate case of an infinite loop bail out. + If bb has no successors and is totally empty, which can happen e.g. + because of incorrect noreturn attribute, bail out too. */ + if (e_out == NULL + || infinite_empty_loop_p (e_out)) return ret; return ret | cleanup_empty_eh_unsplit (bb, e_out, lp); |