re PR middle-end/36191 (can't use complex in a eh region if non-call-exceptions is enabled)

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
This commit is contained in:
Jakub Jelinek 2008-12-29 19:25:19 +01:00
parent 67d0afe901
commit 04be6ff5a8
4 changed files with 36 additions and 5 deletions

View 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.

View 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

View File

@ -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;
}
}

View 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))
{