2009-10-28 Richard Guenther <rguenther@suse.de>
PR lto/41808
PR lto/41839
* tree-ssa.c (useless_type_conversion_p): Do not treat
conversions to pointers to incomplete types as useless.
* gimple.c (gimple_types_compatible_p): Compare struct tags,
not typedef names.
* gcc.dg/lto/
20091027-1_0.c: New testcase.
* gcc.dg/lto/
20091027-1_1.c: Likewise.
* g++.dg/lto/
20091026-1_0.C: Likewise.
* g++.dg/lto/
20091026-1_1.C: Likewise.
* g++.dg/lto/
20091026-1_a.h: Likewise.
From-SVN: r153671
+2009-10-28 Richard Guenther <rguenther@suse.de>
+
+ PR lto/41808
+ PR lto/41839
+ * tree-ssa.c (useless_type_conversion_p): Do not treat
+ conversions to pointers to incomplete types as useless.
+ * gimple.c (gimple_types_compatible_p): Compare struct tags,
+ not typedef names.
+
2009-10-28 Jakub Jelinek <jakub@redhat.com>
* var-tracking.c (emit_note_insn_var_location): Don't call the second
&& RECORD_OR_UNION_TYPE_P (TREE_TYPE (t1))
&& (!COMPLETE_TYPE_P (TREE_TYPE (t1))
|| !COMPLETE_TYPE_P (TREE_TYPE (t2)))
- && compare_type_names_p (TREE_TYPE (t1), TREE_TYPE (t2), true))
+ && compare_type_names_p (TYPE_MAIN_VARIANT (TREE_TYPE (t1)),
+ TYPE_MAIN_VARIANT (TREE_TYPE (t2)), true))
{
/* Replace the pointed-to incomplete type with the
complete one. */
+2009-10-28 Richard Guenther <rguenther@suse.de>
+
+ PR lto/41808
+ PR lto/41839
+ * gcc.dg/lto/20091027-1_0.c: New testcase.
+ * gcc.dg/lto/20091027-1_1.c: Likewise.
+ * g++.dg/lto/20091026-1_0.C: Likewise.
+ * g++.dg/lto/20091026-1_1.C: Likewise.
+ * g++.dg/lto/20091026-1_a.h: Likewise.
+
2009-10-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/41837
--- /dev/null
+// { dg-lto-do link }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+#include "20091026-1_a.h"
+cObject *cHead::find(const char *objname) const
+{
+ return firstchildp;
+}
+class cNetworkType : public cObject { };
+cNetworkType *networktype;
+
--- /dev/null
+#include "20091026-1_a.h"
+extern cHead networks;
+class cNetworkType;
+inline cNetworkType *findNetwork(const char *s)
+{
+ return (cNetworkType *)networks.find(s);
+}
+int run(const char *opt_network_name)
+{
+ cNetworkType *network = findNetwork(opt_network_name);
+ if (!network)
+ throw 1;
+}
+
--- /dev/null
+class cObject {
+public:
+ cObject *firstchildp;
+};
+class cHead : public cObject {
+public:
+ cObject *find(const char *objname) const;
+};
+
--- /dev/null
+/* { dg-lto-do link } */
+/* { dg-extra-ld-options "-r -nostdlib" } */
+
+typedef struct _xmlDict xmlDict;
+struct _xmlDict {
+ int ref_counter;
+};
+void xmlDictCreate(void) {
+ xmlDict * dict;
+}
+
--- /dev/null
+typedef struct _xmlDict xmlDict;
+struct _xmlDoc {
+ struct _xmlDict *dict;
+};
+void xmlAddEntity(struct _xmlDoc *a) {
+ xmlDict * dict = a->dict;
+ xmlHashCreateDict(0, dict);
+}
+
record type or a pointer to an unprototyped function,
then the conversion is not necessary. */
if (VOID_TYPE_P (TREE_TYPE (outer_type))
- || (AGGREGATE_TYPE_P (TREE_TYPE (outer_type))
- && TREE_CODE (TREE_TYPE (outer_type)) != ARRAY_TYPE
- && (TREE_CODE (TREE_TYPE (outer_type))
- == TREE_CODE (TREE_TYPE (inner_type)))
- && !COMPLETE_TYPE_P (TREE_TYPE (outer_type)))
|| ((TREE_CODE (TREE_TYPE (outer_type)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (outer_type)) == METHOD_TYPE)
&& (TREE_CODE (TREE_TYPE (outer_type))