summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-14 13:29:44 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2010-01-14 13:29:44 +0000
commitd23efcf82b84732366b493de2c2bf8ed232b32a8 (patch)
treef2febcbe59eba4389ef16ad0d9e2c5294a498685
parent3ba7ca5cff6ef61af3261f71ebe9b007b2fdf7a4 (diff)
downloadppe42-gcc-d23efcf82b84732366b493de2c2bf8ed232b32a8.tar.gz
ppe42-gcc-d23efcf82b84732366b493de2c2bf8ed232b32a8.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155905 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr42714.C37
-rw-r--r--gcc/tree-sra.c16
4 files changed, 62 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 47e06e5f8c0..d1cfa1bcaa3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f7bbdfb35ff..0a7a289c612 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..b1b2d856efc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr42714.C
@@ -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);
+ }
+ }
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index e9766d78a54..47976679a11 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -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))
OpenPOWER on IntegriCloud