Commit 3ae4d3cc by Alexandre Oliva Committed by Alexandre Oliva

re PR c/27898 (Compile failure with --combine and anonymous structures)

PR c/27898
* c-typeck.c (tagged_types_tu_compatible_p): Enable exact
matches between anonymous union fields.

From-SVN: r130425
parent 3c8da8a5
2007-11-26 Alexandre Oliva <aoliva@redhat.com>
PR c/27898
* c-typeck.c (tagged_types_tu_compatible_p): Enable exact
matches between anonymous union fields.
2007-11-26 Alexandre Oliva <aoliva@redhat.com>, Jan Hubicka <jh@suse.cz> 2007-11-26 Alexandre Oliva <aoliva@redhat.com>, Jan Hubicka <jh@suse.cz>
* tree-ssa-live.c (remove_unused_scope_block_p): Drop * tree-ssa-live.c (remove_unused_scope_block_p): Drop
...@@ -1233,11 +1233,12 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2) ...@@ -1233,11 +1233,12 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2)
{ {
int result; int result;
if (DECL_NAME (s1) != DECL_NAME (s2))
if (DECL_NAME (s1) == NULL
|| DECL_NAME (s1) != DECL_NAME (s2))
break; break;
result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2)); result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2));
if (result != 1 && !DECL_NAME (s1))
break;
if (result == 0) if (result == 0)
{ {
tu->val = 0; tu->val = 0;
...@@ -1264,28 +1265,31 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2) ...@@ -1264,28 +1265,31 @@ tagged_types_tu_compatible_p (const_tree t1, const_tree t2)
{ {
bool ok = false; bool ok = false;
if (DECL_NAME (s1) != NULL) for (s2 = TYPE_FIELDS (t2); s2; s2 = TREE_CHAIN (s2))
for (s2 = TYPE_FIELDS (t2); s2; s2 = TREE_CHAIN (s2)) if (DECL_NAME (s1) == DECL_NAME (s2))
if (DECL_NAME (s1) == DECL_NAME (s2)) {
{ int result;
int result;
result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2));
if (result == 0)
{
tu->val = 0;
return 0;
}
if (result == 2)
needs_warning = true;
if (TREE_CODE (s1) == FIELD_DECL result = comptypes_internal (TREE_TYPE (s1), TREE_TYPE (s2));
&& simple_cst_equal (DECL_FIELD_BIT_OFFSET (s1),
DECL_FIELD_BIT_OFFSET (s2)) != 1) if (result != 1 && !DECL_NAME (s1))
break; continue;
if (result == 0)
{
tu->val = 0;
return 0;
}
if (result == 2)
needs_warning = true;
ok = true; if (TREE_CODE (s1) == FIELD_DECL
&& simple_cst_equal (DECL_FIELD_BIT_OFFSET (s1),
DECL_FIELD_BIT_OFFSET (s2)) != 1)
break; break;
}
ok = true;
break;
}
if (!ok) if (!ok)
{ {
tu->val = 0; tu->val = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment