From: Martin Jambor Date: Thu, 14 Jan 2010 13:29:44 +0000 (+0100) Subject: re PR tree-optimization/42714 (ICE in create_tmp_var, at gimplify.c:504) X-Git-Tag: releases/gcc-4.5.0~1222 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=92e97cdd7d8f1f1a078d6afeb10f8de537ba3e50;p=thirdparty%2Fgcc.git re PR tree-optimization/42714 (ICE in create_tmp_var, at gimplify.c:504) 2010-01-14 Martin Jambor 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47e06e5f8c0b..d1cfa1bcaa33 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-01-14 Martin Jambor + + PR tree-optimization/42714 + * tree-sra.c (sra_ipa_modify_assign): Handle incompatible-type + constructors specially. + 2010-01-14 Andi Kleen * config/i386/drivers-i386.c (detect_caches_intel): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f7bbdfb35ffc..0a7a289c6124 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-14 Martin Jambor + + PR tree-optimization/42714 + * gcc/testsuite/g++.dg/torture/pr42714.C: New test. + 2010-01-14 Alexander Monakov 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 000000000000..b1b2d856efc2 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr42714.C @@ -0,0 +1,37 @@ +struct QVectorData { + static QVectorData shared_null; +}; +template class QVector { + union { + QVectorData *d; + }; +public: + inline QVector() : d(&QVectorData::shared_null) { } + inline QVector(const QVector &v) : d(v.d) { } +}; +class QXmlStreamAttribute { }; +class QXmlStreamAttributes : public QVector { }; +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 e9766d78a54e..47976679a11f 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))