re PR middle-end/36191 (can't use complex in a eh region if non-call-exceptions is...
authorJakub Jelinek <jakub@gcc.gnu.org>
Mon, 29 Dec 2008 18:25:19 +0000 (19:25 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 29 Dec 2008 18:25:19 +0000 (19:25 +0100)
PR c++/36191
* tree-complex.c (expand_complex_libcall): Call
maybe_clean_or_replace_eh_stmt and gimple_purge_dead_eh_edges
instead of passing true as 3rd argument to gsi_replace.

* g++.dg/torture/pr36191.C: New test.

From-SVN: r142950

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr36191.C [new file with mode: 0644]
gcc/tree-complex.c

index bb86005726d2c6ff9438348d622bfca676846d93..00dcec7a4fb6ef31afd98507953e8380e8415c67 100644 (file)
@@ -1,4 +1,11 @@
-2008-12-28 Uros Bizjak <ubizjak@gmail.com>
+2008-12-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/36191
+       * tree-complex.c (expand_complex_libcall): Call
+       maybe_clean_or_replace_eh_stmt and gimple_purge_dead_eh_edges
+       instead of passing true as 3rd argument to gsi_replace.
+
+2008-12-28  Uros Bizjak  <ubizjak@gmail.com>
 
        PR middle-end/38652
        * dse.c: Include target.h.
index e89e5b68e940ff5c212c2f3d65ef76ea160550c1..27649f02a8013570eb7f401047bdbc251799a9b8 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/36191
+       * g++.dg/torture/pr36191.C: New test.
+
 2008-12-15  Hariharan Sandanagobalane <hariharan@picochip.com>
 
        * gcc.c-torture/execute/builtins/fprintf.x: Disable test for
diff --git a/gcc/testsuite/g++.dg/torture/pr36191.C b/gcc/testsuite/g++.dg/torture/pr36191.C
new file mode 100644 (file)
index 0000000..18051ce
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/36191
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions" }
+
+__complex__ double
+foo (__complex__ double x, double y)
+{
+  try
+    {
+      return x / y;
+    }
+  catch (char *s)
+    {
+      return x;
+    }
+}
index 939bd6f1a63c4b49335ee4f2eeefd3bee7477470..c7a7ad48f6e687eb3314622b63c82d3fbe697708 100644 (file)
@@ -953,10 +953,10 @@ expand_complex_libcall (gimple_stmt_iterator *gsi, tree ar, tree ai,
   enum machine_mode mode;
   enum built_in_function bcode;
   tree fn, type, lhs;
-  gimple stmt;
+  gimple old_stmt, stmt;
 
-  stmt = gsi_stmt (*gsi);
-  lhs = gimple_assign_lhs (stmt);
+  old_stmt = gsi_stmt (*gsi);
+  lhs = gimple_assign_lhs (old_stmt);
   type = TREE_TYPE (lhs);
 
   mode = TYPE_MODE (type);
@@ -973,7 +973,10 @@ expand_complex_libcall (gimple_stmt_iterator *gsi, tree ar, tree ai,
   stmt = gimple_build_call (fn, 4, ar, ai, br, bi);
   gimple_call_set_lhs (stmt, lhs);
   update_stmt (stmt);
-  gsi_replace (gsi, stmt, true);
+  gsi_replace (gsi, stmt, false);
+
+  if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
+    gimple_purge_dead_eh_edges (gsi_bb (*gsi));
 
   if (gimple_in_ssa_p (cfun))
     {