(merge_attributes): New function.

(merge_attributes): New function.  Move code from
common_type to here.
(common_type): Call merge_attributes instead of having inline code.

From-SVN: r10620
This commit is contained in:
Jim Wilson 1995-11-29 10:57:22 -08:00
parent 771d55a31c
commit 7afbf31f02
1 changed files with 38 additions and 33 deletions

View File

@ -166,6 +166,43 @@ qualify_type (type, like)
return c_build_type_variant (type, constflag, volflag);
}
/* Return an attribute list that is the union of a1 and a2. */
tree
merge_attributes (a1, a2)
register tree a1, a2;
{
tree attributes;
/* Either one unset? Take the set one. */
if (! (attributes = a1))
attributes = a2;
/* One that completely contains the other? Take it. */
else if (a2 && ! attribute_list_contained (a1, a2))
if (attribute_list_contained (a2, a1))
attributes = a2;
else
{
/* Pick the longest list, and hang on the other list. */
/* ??? For the moment we punt on the issue of attrs with args. */
if (list_length (a1) < list_length (a2))
attributes = a2, a2 = a1;
for (; a2; a2 = TREE_CHAIN (a2))
if (lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
attributes) == NULL_TREE)
{
a1 = copy_node (a2);
TREE_CHAIN (a1) = attributes;
attributes = a1;
}
}
return attributes;
}
/* Return the common type of two types.
We assume that comptypes has already been done and returned 1;
if that isn't so, this may crash. In particular, we assume that qualifiers
@ -193,39 +230,7 @@ common_type (t1, t2)
return t1;
/* Merge the attributes */
{ register tree a1, a2;
a1 = TYPE_ATTRIBUTES (t1);
a2 = TYPE_ATTRIBUTES (t2);
/* Either one unset? Take the set one. */
if (!(attributes = a1))
attributes = a2;
/* One that completely contains the other? Take it. */
else if (a2 && !attribute_list_contained (a1, a2))
if (attribute_list_contained (a2, a1))
attributes = a2;
else
{
/* Pick the longest list, and hang on the other list. */
/* ??? For the moment we punt on the issue of attrs with args. */
if (list_length (a1) < list_length (a2))
attributes = a2, a2 = a1;
for (; a2; a2 = TREE_CHAIN (a2))
if (lookup_attribute (IDENTIFIER_POINTER (TREE_PURPOSE (a2)),
attributes) == NULL_TREE)
{
a1 = copy_node (a2);
TREE_CHAIN (a1) = attributes;
attributes = a1;
}
}
}
attributes = merge_attributes (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2));
/* Treat an enum type as the unsigned integer type of the same width. */