re PR lto/41808 (error: non-trivial conversion at assignment)
authorRichard Guenther <rguenther@suse.de>
Wed, 28 Oct 2009 14:48:34 +0000 (14:48 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 28 Oct 2009 14:48:34 +0000 (14:48 +0000)
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

gcc/ChangeLog
gcc/gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/20091026-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/20091026-1_1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/20091026-1_a.h [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/20091027-1_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/20091027-1_1.c [new file with mode: 0644]
gcc/tree-ssa.c

index e43a077..d2126f0 100644 (file)
@@ -1,3 +1,12 @@
+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
index 1f80883..676e3fd 100644 (file)
@@ -3368,7 +3368,8 @@ gimple_types_compatible_p (tree t1, tree t2)
            && 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.  */
index 9f06387..751486d 100644 (file)
@@ -1,3 +1,13 @@
+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
diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_0.C b/gcc/testsuite/g++.dg/lto/20091026-1_0.C
new file mode 100644 (file)
index 0000000..5c74f29
--- /dev/null
@@ -0,0 +1,11 @@
+// { 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;
+
diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_1.C b/gcc/testsuite/g++.dg/lto/20091026-1_1.C
new file mode 100644 (file)
index 0000000..2881610
--- /dev/null
@@ -0,0 +1,14 @@
+#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;
+}
+
diff --git a/gcc/testsuite/g++.dg/lto/20091026-1_a.h b/gcc/testsuite/g++.dg/lto/20091026-1_a.h
new file mode 100644 (file)
index 0000000..314dd96
--- /dev/null
@@ -0,0 +1,9 @@
+class cObject {
+public:
+    cObject *firstchildp;
+};
+class cHead : public cObject {
+public:
+    cObject *find(const char *objname) const;
+};
+
diff --git a/gcc/testsuite/gcc.dg/lto/20091027-1_0.c b/gcc/testsuite/gcc.dg/lto/20091027-1_0.c
new file mode 100644 (file)
index 0000000..f2669fe
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-lto-do link } */
+/* { dg-extra-ld-options "-r -nostdlib" } */
+
+typedef struct _xmlDict xmlDict;
+struct _xmlDict {
+ int ref_counter;
+};
+void xmlDictCreate(void) {
+  xmlDict * dict;
+}
+
diff --git a/gcc/testsuite/gcc.dg/lto/20091027-1_1.c b/gcc/testsuite/gcc.dg/lto/20091027-1_1.c
new file mode 100644 (file)
index 0000000..d92394c
--- /dev/null
@@ -0,0 +1,9 @@
+typedef struct _xmlDict xmlDict;
+struct _xmlDoc {
+  struct _xmlDict *dict;
+};
+void xmlAddEntity(struct _xmlDoc *a) {
+  xmlDict * dict = a->dict;
+  xmlHashCreateDict(0, dict);
+}
+
index b646ded..8e88c2f 100644 (file)
@@ -1201,11 +1201,6 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
         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))