From: Jakub Jelinek Date: Wed, 5 Feb 2014 14:34:30 +0000 (+0100) Subject: re PR middle-end/57499 (ICE when noreturn destructor returns after throw with -O) X-Git-Tag: releases/gcc-4.9.0~1085 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=609524d29c7471cf4e26cce50b082868428bb572;p=thirdparty%2Fgcc.git re PR middle-end/57499 (ICE when noreturn destructor returns after throw with -O) PR middle-end/57499 * tree-eh.c (cleanup_empty_eh): Bail out on totally empty bb with no successors. * g++.dg/torture/pr57499.C: New test. From-SVN: r207504 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be732f1416ee..9d26481242d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-05 Jakub Jelinek + + PR middle-end/57499 + * tree-eh.c (cleanup_empty_eh): Bail out on totally empty + bb with no successors. + 2014-02-05 James Greenhalgh PR target/59718 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2f154f44e27e..68ef6ada1e47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ +2014-02-05 Jakub Jelinek + + PR middle-end/57499 + * g++.dg/torture/pr57499.C: New test. + 2014-02-05 Yury Gribov - * gcc.dg/asan/nosanitize-and-inline.c: : New test. + * gcc.dg/asan/nosanitize-and-inline.c: New test. 2014-02-04 Jan Hubicka diff --git a/gcc/testsuite/g++.dg/torture/pr57499.C b/gcc/testsuite/g++.dg/torture/pr57499.C new file mode 100644 index 000000000000..fd985a199b84 --- /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 e9c714c7714a..857ee4581bca 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);