Commit 10861e9a by Richard Kenner

(finish_struct): Add ATTRIBUTES argument, call decl_attributes and set…

(finish_struct): Add ATTRIBUTES argument, call decl_attributes and set DECL_PACKED from TYPE_PACKED.

(finish_struct): Add ATTRIBUTES argument, call decl_attributes and set
DECL_PACKED from TYPE_PACKED.
(finish_enum): Add ATTRIBUTES argument, call decl_attributes, and make enum
narrow if TYPE_PACKED.

From-SVN: r9486
parent a89ca5c6
...@@ -5383,12 +5383,15 @@ field_decl_cmp (x, y) ...@@ -5383,12 +5383,15 @@ field_decl_cmp (x, y)
/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T. /* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
FIELDLIST is a chain of FIELD_DECL nodes for the fields. FIELDLIST is a chain of FIELD_DECL nodes for the fields.
ATTRIBUTES are attributes to be applied to the structure.
We also do a pop_obstacks to match the push in start_struct. */ We also do a pop_obstacks to match the push in start_struct. */
tree tree
finish_struct (t, fieldlist) finish_struct (t, fieldlist, attributes)
register tree t, fieldlist; tree t;
tree fieldlist;
tree attributes;
{ {
register tree x; register tree x;
int old_momentary; int old_momentary;
...@@ -5399,6 +5402,8 @@ finish_struct (t, fieldlist) ...@@ -5399,6 +5402,8 @@ finish_struct (t, fieldlist)
TYPE_SIZE (t) = 0; TYPE_SIZE (t) = 0;
decl_attributes (t, attributes, NULL_TREE);
/* Nameless union parm types are useful as GCC extension. */ /* Nameless union parm types are useful as GCC extension. */
if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic) if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic)
/* Otherwise, warn about any struct or union def. in parmlist. */ /* Otherwise, warn about any struct or union def. in parmlist. */
...@@ -5428,6 +5433,7 @@ finish_struct (t, fieldlist) ...@@ -5428,6 +5433,7 @@ finish_struct (t, fieldlist)
for (x = fieldlist; x; x = TREE_CHAIN (x)) for (x = fieldlist; x; x = TREE_CHAIN (x))
{ {
DECL_CONTEXT (x) = t; DECL_CONTEXT (x) = t;
DECL_PACKED (x) = TYPE_PACKED (t);
DECL_FIELD_SIZE (x) = 0; DECL_FIELD_SIZE (x) = 0;
/* If any field is const, the structure type is pseudo-const. */ /* If any field is const, the structure type is pseudo-const. */
...@@ -5763,12 +5769,15 @@ start_enum (name) ...@@ -5763,12 +5769,15 @@ start_enum (name)
/* After processing and defining all the values of an enumeration type, /* After processing and defining all the values of an enumeration type,
install their decls in the enumeration type and finish it off. install their decls in the enumeration type and finish it off.
ENUMTYPE is the type object and VALUES a list of decl-value pairs. ENUMTYPE is the type object, VALUES a list of decl-value pairs,
and ATTRIBUTES are the specified attributes.
Returns ENUMTYPE. */ Returns ENUMTYPE. */
tree tree
finish_enum (enumtype, values) finish_enum (enumtype, values, attributes)
register tree enumtype, values; tree enumtype;
tree values;
tree attributes;
{ {
register tree pair, tem; register tree pair, tem;
tree minnode = 0, maxnode = 0; tree minnode = 0, maxnode = 0;
...@@ -5778,6 +5787,8 @@ finish_enum (enumtype, values) ...@@ -5778,6 +5787,8 @@ finish_enum (enumtype, values)
if (in_parm_level_p ()) if (in_parm_level_p ())
warning ("enum defined inside parms"); warning ("enum defined inside parms");
decl_attributes (enumtype, attributes, NULL_TREE);
/* Calculate the maximum value of any enumerator in this type. */ /* Calculate the maximum value of any enumerator in this type. */
if (values == error_mark_node) if (values == error_mark_node)
...@@ -5809,7 +5820,8 @@ finish_enum (enumtype, values) ...@@ -5809,7 +5820,8 @@ finish_enum (enumtype, values)
highprec = min_precision (maxnode, TREE_UNSIGNED (enumtype)); highprec = min_precision (maxnode, TREE_UNSIGNED (enumtype));
precision = MAX (lowprec, highprec); precision = MAX (lowprec, highprec);
if (flag_short_enums || precision > TYPE_PRECISION (integer_type_node)) if (flag_short_enums || TYPE_PACKED (enumtype)
|| precision > TYPE_PRECISION (integer_type_node))
/* Use the width of the narrowest normal C type which is wide enough. */ /* Use the width of the narrowest normal C type which is wide enough. */
TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1)); TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
else else
......
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