aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33589-1.C22
-rw-r--r--gcc/testsuite/g++.dg/torture/pr33589-2.C13
-rw-r--r--gcc/tree-outof-ssa.c7
5 files changed, 53 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3064b8b..4958089 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-28 Andrew Pinski <pinskia@gmail.com>
+
+ 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 <rguenther@suse.de>
* tree-flow.h (subvar_t): Make it a VEC.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d3305b8..f2996bd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-28 Andrew Pinski <pinskia@gmail.com>
+
+ 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 <rguenther@suse.de>
* 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 0000000..eea89f4
--- /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 0000000..325892b
--- /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 d01c663..fd22d32 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);