From: Richard Guenther Date: Mon, 30 May 2011 14:55:03 +0000 (+0000) Subject: gimple.c (gimple_types_compatible_p_1): Compare record and union type members properly. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=17e99cdb2d3048641353093c53dd04e3e3f7e8aa;p=gcc.git gimple.c (gimple_types_compatible_p_1): Compare record and union type members properly. 2011-05-30 Richard Guenther * gimple.c (gimple_types_compatible_p_1): Compare record and union type members properly. From-SVN: r174436 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ed73069b297..4a800f05b9b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-30 Richard Guenther + + * gimple.c (gimple_types_compatible_p_1): Compare record + and union type members properly. + 2011-05-30 Richard Guenther PR tree-optimization/49210 diff --git a/gcc/gimple.c b/gcc/gimple.c index e13b3ed7883..0cbd443337b 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -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;