diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-12-15 16:38:08 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-12-15 16:38:08 +0000 |
commit | 4f3bff831367fbc16103d0039801ac81b7926107 (patch) | |
tree | c953b72b7d663af460cc1abd3269cf69ca79d5ae /gcc/gimple.c | |
parent | d42ef213184eec5bc0657a86d2a43631b159ddf9 (diff) | |
download | gcc-4f3bff831367fbc16103d0039801ac81b7926107.tar.gz |
2011-12-15 Richard Guenther <rguenther@suse.de>
PR lto/51567
* gimple.c (compare_type_names_p): Also compare the TREE_CODE.
(iterative_hash_name): Also hash the TREE_CODE.
(gimple_types_compatible_p_1): For types with a TYPE_DECL
name and a type DECL_CONTEXT recurse to that type.
(iterative_hash_gimple_type): Likewise.
* g++.dg/lto/pr51567-1_0.C: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182377 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r-- | gcc/gimple.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c index 81c119048f2..3a90358bae6 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -3318,11 +3318,21 @@ compare_type_names_p (tree t1, tree t2) tree name1 = TYPE_NAME (t1); tree name2 = TYPE_NAME (t2); - if (name1 && TREE_CODE (name1) == TYPE_DECL) + if ((name1 != NULL_TREE) != (name2 != NULL_TREE)) + return false; + + if (name1 == NULL_TREE) + return true; + + /* Either both should be a TYPE_DECL or both an IDENTIFIER_NODE. */ + if (TREE_CODE (name1) != TREE_CODE (name2)) + return false; + + if (TREE_CODE (name1) == TYPE_DECL) name1 = DECL_NAME (name1); gcc_checking_assert (!name1 || TREE_CODE (name1) == IDENTIFIER_NODE); - if (name2 && TREE_CODE (name2) == TYPE_DECL) + if (TREE_CODE (name2) == TYPE_DECL) name2 = DECL_NAME (name2); gcc_checking_assert (!name2 || TREE_CODE (name2) == IDENTIFIER_NODE); @@ -3537,6 +3547,19 @@ gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p, if (!compare_type_names_p (t1, t2)) goto different_types; + /* We may not merge typedef types to the same type in different + contexts. */ + if (TYPE_NAME (t1) + && TREE_CODE (TYPE_NAME (t1)) == TYPE_DECL + && DECL_CONTEXT (TYPE_NAME (t1)) + && TYPE_P (DECL_CONTEXT (TYPE_NAME (t1)))) + { + if (!gtc_visit (DECL_CONTEXT (TYPE_NAME (t1)), + DECL_CONTEXT (TYPE_NAME (t2)), + state, sccstack, sccstate, sccstate_obstack)) + goto different_types; + } + /* If their attributes are not the same they can't be the same type. */ if (!attribute_list_equal (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2))) goto different_types; @@ -3980,6 +4003,7 @@ iterative_hash_name (tree name, hashval_t v) { if (!name) return v; + v = iterative_hash_hashval_t (TREE_CODE (name), v); if (TREE_CODE (name) == TYPE_DECL) name = DECL_NAME (name); if (!name) @@ -4046,6 +4070,12 @@ iterative_hash_gimple_type (tree type, hashval_t val, only existing types having the same features as the new type will be checked. */ v = iterative_hash_name (TYPE_NAME (type), 0); + if (TYPE_NAME (type) + && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL + && DECL_CONTEXT (TYPE_NAME (type)) + && TYPE_P (DECL_CONTEXT (TYPE_NAME (type)))) + v = visit (DECL_CONTEXT (TYPE_NAME (type)), state, v, + sccstack, sccstate, sccstate_obstack); v = iterative_hash_hashval_t (TREE_CODE (type), v); v = iterative_hash_hashval_t (TYPE_QUALS (type), v); v = iterative_hash_hashval_t (TREE_ADDRESSABLE (type), v); |