aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-05-30 14:55:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-05-30 14:55:03 +0000
commit17e99cdb2d3048641353093c53dd04e3e3f7e8aa (patch)
treea0ded474567f221de791b44b6555bfdd84406750 /gcc/gimple.c
parent42b05b6e884f5b14c3433f12593fe6accae5becf (diff)
downloadgcc-17e99cdb2d3048641353093c53dd04e3e3f7e8aa.zip
gcc-17e99cdb2d3048641353093c53dd04e3e3f7e8aa.tar.gz
gcc-17e99cdb2d3048641353093c53dd04e3e3f7e8aa.tar.bz2
gimple.c (gimple_types_compatible_p_1): Compare record and union type members properly.
2011-05-30 Richard Guenther <rguenther@suse.de> * gimple.c (gimple_types_compatible_p_1): Compare record and union type members properly. From-SVN: r174436
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index e13b3ed..0cbd443 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;