OSDN Git Service

2011-05-30 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 May 2011 14:55:03 +0000 (14:55 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 May 2011 14:55:03 +0000 (14:55 +0000)
* gimple.c (gimple_types_compatible_p_1): Compare record
and union type members properly.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174436 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimple.c

index ed73069..4a800f0 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-30  Richard Guenther  <rguenther@suse.de>
 
+       * gimple.c (gimple_types_compatible_p_1): Compare record
+       and union type members properly.
+
+2011-05-30  Richard Guenther  <rguenther@suse.de>
+
        PR tree-optimization/49210
        * ipa-split.c (split_function): Care for the case where the
        call result is not trivially convertible to the result holding
index e13b3ed..0cbd443 100644 (file)
@@ -3772,10 +3772,16 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
             f1 && f2;
             f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
          {
-           /* The fields must have the same name, offset and type.  */
+           /* Different field kinds are not compatible.  */
+           if (TREE_CODE (f1) != TREE_CODE (f2))
+             goto different_types;
+           /* Field decls must have the same name and offset.  */
+           if (TREE_CODE (f1) == FIELD_DECL
+               && (DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
+                   || !gimple_compare_field_offset (f1, f2)))
+             goto different_types;
+           /* All entities should have the same name and type.  */
            if (DECL_NAME (f1) != DECL_NAME (f2)
-               || DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
-               || !gimple_compare_field_offset (f1, f2)
                || !gtc_visit (TREE_TYPE (f1), TREE_TYPE (f2),
                               state, sccstack, sccstate, sccstate_obstack))
              goto different_types;