aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/torture/pr57499.C14
-rw-r--r--gcc/tree-eh.c7
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);