From 6f17d116b739645d9c331ffb4b741eebbfb69a5c Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Sun, 28 Oct 2007 10:00:54 -0700 Subject: [PATCH] re PR middle-end/33589 (ICE on valid code at -O2: verify_flow_info failed) 2007-10-28 Andrew Pinski PR tree-opt/33589 * tree-outof-ssa.c (rewrite_trees): If the statement changed, cleanup the eh information on the statement. 2007-10-28 Andrew Pinski PR tree-opt/33589 * g++.dg/torture/pr33589-1.C: New testcase. * g++.dg/torture/pr33589-2.C: New testcase. From-SVN: r129700 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/torture/pr33589-1.C | 22 ++++++++++++++++++++++ gcc/testsuite/g++.dg/torture/pr33589-2.C | 13 +++++++++++++ gcc/tree-outof-ssa.c | 7 ++++++- 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr33589-1.C create mode 100644 gcc/testsuite/g++.dg/torture/pr33589-2.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3064b8bd80bb..4958089caec5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-10-28 Andrew Pinski + + PR tree-opt/33589 + * tree-outof-ssa.c (rewrite_trees): If the statement changed, cleanup + the eh information on the statement. + 2007-10-28 Richard Guenther * tree-flow.h (subvar_t): Make it a VEC. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d3305b8c7d57..f2996bd2f9de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-10-28 Andrew Pinski + + PR tree-opt/33589 + * g++.dg/torture/pr33589-1.C: New testcase. + * g++.dg/torture/pr33589-2.C: New testcase. + 2007-10-28 Richard Guenther * gcc.dg/tree-ssa/alias-15.c: Adjust pattern. diff --git a/gcc/testsuite/g++.dg/torture/pr33589-1.C b/gcc/testsuite/g++.dg/torture/pr33589-1.C new file mode 100644 index 000000000000..eea89f421a57 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33589-1.C @@ -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() )(); +} diff --git a/gcc/testsuite/g++.dg/torture/pr33589-2.C b/gcc/testsuite/g++.dg/torture/pr33589-2.C new file mode 100644 index 000000000000..325892bc684c --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr33589-2.C @@ -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;} +} diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index d01c663b2c53..fd22d327fe9c 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -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);