re PR tree-optimization/47420 (ICE in calc_dfs_tree during RESX lowering)
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 11 Feb 2011 21:19:16 +0000 (21:19 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 11 Feb 2011 21:19:16 +0000 (21:19 +0000)
PR tree-optimization/47420
* ipa-split.c (visit_bb): Punt on any kind of GIMPLE_RESX.

From-SVN: r170061

gcc/ChangeLog
gcc/ipa-split.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/inline17.C [new file with mode: 0644]

index 92f3ddb..25270c9 100644 (file)
@@ -1,4 +1,9 @@
-2011-02-11  Pat Haugen <pthaugen@us.ibm.com>
+2011-02-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/47420
+       * ipa-split.c (visit_bb): Punt on any kind of GIMPLE_RESX.
+
+2011-02-11  Pat Haugen  <pthaugen@us.ibm.com>
 
        PR rtl-optimization/47614
        * rtl.h (check_for_inc_dec): Declare.
index dce57ea..3b26f61 100644 (file)
@@ -643,11 +643,10 @@ visit_bb (basic_block bb, basic_block return_bb,
         into different partitions.  This would require tracking of
         EH regions and checking in consider_split_point if they 
         are not used elsewhere.  */
-      if (gimple_code (stmt) == GIMPLE_RESX
-         && stmt_can_throw_external (stmt))
+      if (gimple_code (stmt) == GIMPLE_RESX)
        {
          if (dump_file && (dump_flags & TDF_DETAILS))
-           fprintf (dump_file, "Cannot split: external resx.\n");
+           fprintf (dump_file, "Cannot split: resx.\n");
          can_split = false;
        }
       if (gimple_code (stmt) == GIMPLE_EH_DISPATCH)
index 996c2d9..06a388e 100644 (file)
@@ -1,3 +1,7 @@
+2011-02-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * g++.dg/opt/inline17.C: New test.
+
 2011-02-11  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/47550
diff --git a/gcc/testsuite/g++.dg/opt/inline17.C b/gcc/testsuite/g++.dg/opt/inline17.C
new file mode 100644 (file)
index 0000000..a42233d
--- /dev/null
@@ -0,0 +1,80 @@
+// PR tree-optimization/47420
+// Testcase by Yu Simin <silver24k@gmail.com>
+
+// { dg-do compile }
+// { dg-options "-O2" }
+
+class fooControlBase
+{
+public:
+    fooControlBase() { }
+
+    virtual ~fooControlBase();
+};
+
+class fooControl : public fooControlBase
+{
+public:
+    fooControl() { }
+};
+
+class sfTextEntryBase
+{
+public:
+    sfTextEntryBase() {  }
+    virtual ~sfTextEntryBase();
+};
+
+class sfTextEntry : public sfTextEntryBase
+{
+public:
+    sfTextEntry()
+    {
+    }
+};
+
+class sfTextAreaBase
+{
+public:
+    sfTextAreaBase() { }
+    virtual ~sfTextAreaBase() { }
+
+protected:
+};
+
+
+class sfTextCtrlBase : public fooControl,
+                                   public sfTextAreaBase,
+                                   public sfTextEntry
+{
+public:
+
+
+
+    sfTextCtrlBase() { }
+    virtual ~sfTextCtrlBase() { }
+};
+
+class sfTextCtrl : public sfTextCtrlBase
+{
+public:
+    sfTextCtrl(void* parent)
+    {
+        Create(parent);
+    }
+    virtual ~sfTextCtrl();
+
+    bool Create(void *parent);
+
+
+};
+
+sfTextCtrl* CreateTextCtrl()
+{
+    return new sfTextCtrl(0);
+}
+
+void foo ()
+{
+    new sfTextCtrl(0);
+}