Index: testsuite/g++.dg/torture/pr33589-1.C =================================================================== --- testsuite/g++.dg/torture/pr33589-1.C (revision 0) +++ testsuite/g++.dg/torture/pr33589-1.C (revision 0) @@ -0,0 +1,22 @@ +// { dg-do compile } +struct base { void somemethod() {} }; +struct derived : public base { }; + +struct smartpointer +{ + ~smartpointer() { } + operator derived*() const + { + return 0; + } +}; +typedef void ( derived::* methodptr_type )(); +methodptr_type getmemberptr() +{ + return &derived::somemethod; +} +void somefunction() +{ + smartpointer pObj; + ( pObj->*getmemberptr() )(); +} Index: testsuite/g++.dg/torture/pr33589-2.C =================================================================== --- testsuite/g++.dg/torture/pr33589-2.C (revision 0) +++ testsuite/g++.dg/torture/pr33589-2.C (revision 0) @@ -0,0 +1,13 @@ +// { dg-do compile } + +void f(void*) throw(); + +void somefunction() +{ +try { + void (*g)(void*) = (void (*)(void*))f; + void (*g2)(int*) = (void (*)(int*))g; + g2(0); +} catch (...) +{throw;} +} Index: tree-outof-ssa.c =================================================================== --- tree-outof-ssa.c (revision 129695) +++ tree-outof-ssa.c (working copy) @@ -758,7 +758,12 @@ rewrite_trees (var_map map, tree *values if (remove) bsi_remove (&si, true); else - bsi_next (&si); + { + if (changed) + if (maybe_clean_or_replace_eh_stmt (stmt, stmt)) + tree_purge_dead_eh_edges (bb); + bsi_next (&si); + } } phi = phi_nodes (bb);