re PR middle-end/33589 (ICE on valid code at -O2: verify_flow_info failed)
authorAndrew Pinski <pinskia@gmail.com>
Sun, 28 Oct 2007 17:00:54 +0000 (10:00 -0700)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Sun, 28 Oct 2007 17:00:54 +0000 (10:00 -0700)
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  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.

From-SVN: r129700

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr33589-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr33589-2.C [new file with mode: 0644]
gcc/tree-outof-ssa.c

index 3064b8bd80bbcb0e567ad033c2a527441365efdb..4958089caec5ad9081db67a7c3d329c8c6eb1389 100644 (file)
@@ -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.
index d3305b8c7d578d44c088e2f085a268252679e189..f2996bd2f9de36b81af3c8d769bf474929c54018 100644 (file)
@@ -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 (file)
index 0000000..eea89f4
--- /dev/null
@@ -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 (file)
index 0000000..325892b
--- /dev/null
@@ -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 d01c663b2c5334d1e55fd7f7dad9994ff3aa8fa3..fd22d327fe9c7380adff227e0e0625f84f880726 100644 (file)
@@ -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);