]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/42714 (ICE in create_tmp_var, at gimplify.c:504)
authorMartin Jambor <mjambor@suse.cz>
Thu, 14 Jan 2010 13:29:44 +0000 (14:29 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Thu, 14 Jan 2010 13:29:44 +0000 (14:29 +0100)
2010-01-14  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/42714
* tree-sra.c (sra_ipa_modify_assign): Handle incompatible-type
constructors specially.

* gcc/testsuite/g++.dg/torture/pr42714.C: New test.

From-SVN: r155905

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr42714.C [new file with mode: 0644]
gcc/tree-sra.c

index 47e06e5f8c0bb094973dade9fd5dab465da09959..d1cfa1bcaa33553359c63fefbd1c11f193452d82 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-14  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/42714
+       * tree-sra.c (sra_ipa_modify_assign): Handle incompatible-type
+       constructors specially.
+
 2010-01-14  Andi Kleen  <ak@linux.intel.com>
 
        * config/i386/drivers-i386.c (detect_caches_intel):
index f7bbdfb35ffcef92bbac3687d9f5aa3e98d4bbfa..0a7a289c61240a34d71146757566864cf9041636 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-14  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/42714
+       * gcc/testsuite/g++.dg/torture/pr42714.C: New test.
+
 2010-01-14  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/42246
diff --git a/gcc/testsuite/g++.dg/torture/pr42714.C b/gcc/testsuite/g++.dg/torture/pr42714.C
new file mode 100644 (file)
index 0000000..b1b2d85
--- /dev/null
@@ -0,0 +1,37 @@
+struct QVectorData {
+    static QVectorData shared_null;
+};
+template <typename T> class QVector {
+    union {
+        QVectorData *d;
+    };
+public:
+    inline QVector() : d(&QVectorData::shared_null) { }
+    inline QVector(const QVector<T> &v) : d(v.d) { }
+};
+class QXmlStreamAttribute { };
+class QXmlStreamAttributes : public QVector<QXmlStreamAttribute> { };
+class __attribute__ ((visibility("default"))) Smoke {
+public:
+    union StackItem;
+    typedef StackItem* Stack;
+    typedef short Index;
+};
+class SmokeBinding { };
+namespace __smokeqt {
+    class x_QXmlStreamAttributes : public QXmlStreamAttributes {
+        SmokeBinding* _binding;
+    public:
+        static void x_11(Smoke::Stack x) {
+            x_QXmlStreamAttributes* xret = new x_QXmlStreamAttributes();
+        }
+        explicit x_QXmlStreamAttributes() : QXmlStreamAttributes() { }
+    };
+    void xcall_QXmlStreamAttributes(Smoke::Index xi, void *obj,
+                                    Smoke::Stack args)
+      {
+        switch(xi) {
+            case 11: x_QXmlStreamAttributes::x_11(args);
+        }
+      }
+}
index e9766d78a54e92e7923f1bc514147068155cc9ee..47976679a11f3eae2a6674ac590c9aca519e5fe8 100644 (file)
@@ -3712,8 +3712,20 @@ sra_ipa_modify_assign (gimple *stmt_ptr, gimple_stmt_iterator *gsi, void *data)
       tree new_rhs = NULL_TREE;
 
       if (!useless_type_conversion_p (TREE_TYPE (*lhs_p), TREE_TYPE (*rhs_p)))
-       new_rhs = fold_build1_loc (gimple_location (stmt), VIEW_CONVERT_EXPR,
-                                  TREE_TYPE (*lhs_p), *rhs_p);
+       {
+         if (TREE_CODE (*rhs_p) == CONSTRUCTOR)
+           {
+             /* V_C_Es of constructors can cause trouble (PR 42714).  */
+             if (is_gimple_reg_type (TREE_TYPE (*lhs_p)))
+               *rhs_p = fold_convert (TREE_TYPE (*lhs_p), integer_zero_node);
+             else
+               *rhs_p = build_constructor (TREE_TYPE (*lhs_p), 0);
+           }
+         else
+           new_rhs = fold_build1_loc (gimple_location (stmt),
+                                      VIEW_CONVERT_EXPR, TREE_TYPE (*lhs_p),
+                                      *rhs_p);
+       }
       else if (REFERENCE_CLASS_P (*rhs_p)
               && is_gimple_reg_type (TREE_TYPE (*lhs_p))
               && !is_gimple_reg (*lhs_p))