From 59387d2e310983bced3bf86cb759a1dbc1520277 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 13 Jul 2001 21:40:43 +0100 Subject: [PATCH] c-common.c (decl_attributes): Take a pointer to the node to which attributes are to be attached... * c-common.c (decl_attributes): Take a pointer to the node to which attributes are to be attached, and a flags argument. * c-common.h (enum attribute_flags): New. (decl_attributes): Update prototype. * c-decl.c (start_decl, push_parm_decl, finish_struct, finish_enum, start_function): Update calls to decl_attributes. * c-parse.in (component_declarator, component_notype_declarator, label): Update calls to decl_attributes. cp: * decl2.c (cplus_decl_attributes): Take a pointer to the node to which attributes are to be attached, and a flags argument. Update call to decl_attributes. (grokfield): Update call to decl_attributes. * class.c (finish_struct): Update call to cplus_decl_attributes. * cp-tree.h (cplus_decl_attributes): Update prototype. * decl.c (start_decl, grokdeclarator, start_function): Update calls to decl_attributes and cplus_decl_attributes. * friend.c (do_friend): Update call to cplus_decl_attributes. * parse.y (parse_bitfield): Update call to cplus_decl_attributes. From-SVN: r43995 --- gcc/ChangeLog | 11 +++++++++++ gcc/c-common.c | 36 ++++++++++++++++++++++-------------- gcc/c-common.h | 20 +++++++++++++++++++- gcc/c-decl.c | 14 +++++++------- gcc/c-parse.in | 14 +++++++------- gcc/cp/ChangeLog | 13 +++++++++++++ gcc/cp/class.c | 2 +- gcc/cp/cp-tree.h | 2 +- gcc/cp/decl.c | 10 +++++----- gcc/cp/decl2.c | 23 ++++++++++++----------- gcc/cp/friend.c | 2 +- gcc/cp/parse.y | 2 +- 12 files changed, 100 insertions(+), 49 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8be501f3794..5fa755290bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2001-07-13 Joseph S. Myers + + * c-common.c (decl_attributes): Take a pointer to the node to + which attributes are to be attached, and a flags argument. + * c-common.h (enum attribute_flags): New. + (decl_attributes): Update prototype. + * c-decl.c (start_decl, push_parm_decl, finish_struct, + finish_enum, start_function): Update calls to decl_attributes. + * c-parse.in (component_declarator, component_notype_declarator, + label): Update calls to decl_attributes. + Fri Jul 13 23:04:00 2001 Denis Chertykov * config/avr/avr.md (strlenhi): PARALLEL keyword removed. diff --git a/gcc/c-common.c b/gcc/c-common.c index 0213843be9e..751ba267c98 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -723,12 +723,19 @@ default_valid_lang_attribute (attr_name, attr_args, decl, type) int (*valid_lang_attribute) PARAMS ((tree, tree, tree, tree)) = default_valid_lang_attribute; -/* Process the attributes listed in ATTRIBUTES and install them in NODE, - which is either a DECL (including a TYPE_DECL) or a TYPE. */ +/* Process the attributes listed in ATTRIBUTES and install them in *NODE, + which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL, + it should be modified in place; if a TYPE, a copy should be created. + FLAGS gives further information, in the form of a bitwise OR of flags + in enum attribute_flags from c-common.h. Depending on these flags, + some attributes may be returned to be applied at a later stage (for + example, to apply a decl attribute to the declaration rather than to + its type). */ -void -decl_attributes (node, attributes) - tree node, attributes; +tree +decl_attributes (node, attributes, flags) + tree *node, attributes; + int flags ATTRIBUTE_UNUSED; { tree decl = 0, type = 0; int is_type = 0; @@ -737,16 +744,16 @@ decl_attributes (node, attributes) if (attrtab_idx == 0) init_attributes (); - if (DECL_P (node)) + if (DECL_P (*node)) { - decl = node; + decl = *node; type = TREE_TYPE (decl); - is_type = TREE_CODE (node) == TYPE_DECL; + is_type = TREE_CODE (*node) == TYPE_DECL; } - else if (TYPE_P (node)) - type = node, is_type = 1; + else if (TYPE_P (*node)) + type = *node, is_type = 1; - (*targetm.insert_attributes) (node, &attributes); + (*targetm.insert_attributes) (*node, &attributes); for (a = attributes; a; a = TREE_CHAIN (a)) { @@ -979,16 +986,16 @@ decl_attributes (node, attributes) else if (DECL_SECTION_NAME (decl) != NULL_TREE && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), TREE_STRING_POINTER (TREE_VALUE (args))) != 0) - error_with_decl (node, + error_with_decl (*node, "section of `%s' conflicts with previous declaration"); else DECL_SECTION_NAME (decl) = TREE_VALUE (args); } else - error_with_decl (node, + error_with_decl (*node, "section attribute not allowed for `%s'"); #else - error_with_decl (node, + error_with_decl (*node, "section attributes are not supported for this target"); #endif break; @@ -1140,6 +1147,7 @@ decl_attributes (node, attributes) break; } } + return NULL_TREE; } /* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two diff --git a/gcc/c-common.h b/gcc/c-common.h index eac227e48d2..0ba64b121d1 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -498,7 +498,25 @@ extern void finish_fname_decls PARAMS ((void)); extern const char *fname_as_string PARAMS ((int)); extern tree fname_decl PARAMS ((unsigned, tree)); extern const char *fname_string PARAMS ((unsigned)); -extern void decl_attributes PARAMS ((tree, tree)); + +/* Flags that may be passed in the third argument of decl_attributes. */ +enum attribute_flags +{ + /* The type passed in is the type of a DECL, and any attributes that + should be passed in again to be applied to the DECL rather than the + type should be returned. */ + ATTR_FLAG_DECL_NEXT = 1, + /* The type passed in is a function return type, and any attributes that + should be passed in again to be applied to the function type rather + than the return type should be returned. */ + ATTR_FLAG_FUNCTION_NEXT = 2, + /* The type passed in is an array element type, and any attributes that + should be passed in again to be applied to the array type rather + than the element type should be returned. */ + ATTR_FLAG_ARRAY_NEXT = 4 +}; + +extern tree decl_attributes PARAMS ((tree *, tree, int)); extern void init_function_format_info PARAMS ((void)); extern void check_function_format PARAMS ((int *, tree, tree, tree)); extern void set_Wformat PARAMS ((int)); diff --git a/gcc/c-decl.c b/gcc/c-decl.c index dc100db5ad4..a9f6968b7ea 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3341,8 +3341,8 @@ start_decl (declarator, declspecs, initialized, attributes) int initialized; tree attributes; { - register tree decl = grokdeclarator (declarator, declspecs, - NORMAL, initialized); + tree decl = grokdeclarator (declarator, declspecs, + NORMAL, initialized); register tree tem; if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL @@ -3448,7 +3448,7 @@ start_decl (declarator, declspecs, initialized, attributes) DECL_COMMON (decl) = 1; /* Set attributes here so if duplicate decl, will have proper attributes. */ - decl_attributes (decl, attributes); + decl_attributes (&decl, attributes, 0); /* Add this decl to the current binding level. TEM may equal DECL or it may be a previous decl of the same name. */ @@ -3712,7 +3712,7 @@ push_parm_decl (parm) decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)), TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0); - decl_attributes (decl, TREE_VALUE (parm)); + decl_attributes (&decl, TREE_VALUE (parm), 0); #if 0 if (DECL_NAME (decl)) @@ -5340,7 +5340,7 @@ finish_struct (t, fieldlist, attributes) TYPE_SIZE (t) = 0; - decl_attributes (t, attributes); + decl_attributes (&t, attributes, 0); /* Nameless union parm types are useful as GCC extension. */ if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic) @@ -5704,7 +5704,7 @@ finish_enum (enumtype, values, attributes) if (in_parm_level_p ()) warning ("enum defined inside parms"); - decl_attributes (enumtype, attributes); + decl_attributes (&enumtype, attributes, 0); /* Calculate the maximum value of any enumerator in this type. */ @@ -5928,7 +5928,7 @@ start_function (declspecs, declarator, attributes) return 0; } - decl_attributes (decl1, attributes); + decl_attributes (&decl1, attributes, 0); announce_function (decl1); diff --git a/gcc/c-parse.in b/gcc/c-parse.in index ad2d5f7f13d..a094ebb146f 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -1896,27 +1896,27 @@ components_notype: component_declarator: save_filename save_lineno declarator maybe_attribute { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); - decl_attributes ($$, chainon ($4, prefix_attributes)); } + decl_attributes (&$$, chainon ($4, prefix_attributes), 0); } | save_filename save_lineno declarator ':' expr_no_commas maybe_attribute { $$ = grokfield ($1, $2, $3, current_declspecs, $5); - decl_attributes ($$, chainon ($6, prefix_attributes)); } + decl_attributes (&$$, chainon ($6, prefix_attributes), 0); } | save_filename save_lineno ':' expr_no_commas maybe_attribute { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); - decl_attributes ($$, chainon ($5, prefix_attributes)); } + decl_attributes (&$$, chainon ($5, prefix_attributes), 0); } ; component_notype_declarator: save_filename save_lineno notype_declarator maybe_attribute { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE); - decl_attributes ($$, chainon ($4, prefix_attributes)); } + decl_attributes (&$$, chainon ($4, prefix_attributes), 0); } | save_filename save_lineno notype_declarator ':' expr_no_commas maybe_attribute { $$ = grokfield ($1, $2, $3, current_declspecs, $5); - decl_attributes ($$, chainon ($6, prefix_attributes)); } + decl_attributes (&$$, chainon ($6, prefix_attributes), 0); } | save_filename save_lineno ':' expr_no_commas maybe_attribute { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4); - decl_attributes ($$, chainon ($5, prefix_attributes)); } + decl_attributes (&$$, chainon ($5, prefix_attributes), 0); } ; /* We chain the enumerators in reverse order. @@ -2447,7 +2447,7 @@ label: CASE expr_no_commas ':' stmt_count++; if (label) { - decl_attributes (label, $5); + decl_attributes (&label, $5, 0); $$ = add_stmt (build_stmt (LABEL_STMT, label)); } else diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d8f346349e..61e59933461 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2001-07-13 Joseph S. Myers + + * decl2.c (cplus_decl_attributes): Take a pointer to the node to + which attributes are to be attached, and a flags argument. Update + call to decl_attributes. + (grokfield): Update call to decl_attributes. + * class.c (finish_struct): Update call to cplus_decl_attributes. + * cp-tree.h (cplus_decl_attributes): Update prototype. + * decl.c (start_decl, grokdeclarator, start_function): Update + calls to decl_attributes and cplus_decl_attributes. + * friend.c (do_friend): Update call to cplus_decl_attributes. + * parse.y (parse_bitfield): Update call to cplus_decl_attributes. + 2001-07-12 Mark Mitchell * decl.c (make_rtl_for_nonlocal_decl): Set DECL_C_HARD_REGISTER diff --git a/gcc/cp/class.c b/gcc/cp/class.c index fac4a3891a9..2ec3448d636 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5539,7 +5539,7 @@ finish_struct (t, attributes) as necessary. */ unreverse_member_declarations (t); - cplus_decl_attributes (t, attributes, NULL_TREE); + cplus_decl_attributes (&t, attributes, NULL_TREE, 0); /* Nadger the current location so that diagnostics point to the start of the struct, not the end. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 66ce4fb0d31..e8a61a8b11c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3907,7 +3907,7 @@ extern tree grokbitfield PARAMS ((tree, tree, tree)); extern tree groktypefield PARAMS ((tree, tree)); extern tree grokoptypename PARAMS ((tree, tree)); extern int copy_assignment_arg_p PARAMS ((tree, int)); -extern void cplus_decl_attributes PARAMS ((tree, tree, tree)); +extern void cplus_decl_attributes PARAMS ((tree *, tree, tree, int)); extern tree constructor_name_full PARAMS ((tree)); extern tree constructor_name PARAMS ((tree)); extern void defer_fn PARAMS ((tree)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c0e9b85a471..bc157b37d68 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7128,7 +7128,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) int initialized; tree attributes, prefix_attributes; { - register tree decl; + tree decl; register tree type, tem; tree context; extern int have_extern_spec; @@ -7221,7 +7221,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes) } /* Set attributes here so if duplicate decl, will have proper attributes. */ - cplus_decl_attributes (decl, attributes, prefix_attributes); + cplus_decl_attributes (&decl, attributes, prefix_attributes, 0); if (context && COMPLETE_TYPE_P (complete_type (context))) { @@ -10471,7 +10471,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ignore_attrs = 0; else if (inner_attrs) { - decl_attributes (type, inner_attrs); + decl_attributes (&type, inner_attrs, 0); inner_attrs = NULL_TREE; } @@ -10990,7 +10990,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) if (inner_attrs) { if (! ignore_attrs) - decl_attributes (type, inner_attrs); + decl_attributes (&type, inner_attrs, 0); else if (attrlist) TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist)); else @@ -13639,7 +13639,7 @@ start_function (declspecs, declarator, attrs, flags) pushlevel (0); current_binding_level->parm_flag = 1; - cplus_decl_attributes (decl1, NULL_TREE, attrs); + cplus_decl_attributes (&decl1, NULL_TREE, attrs, 0); /* Promote the value to int before returning it. */ if (c_promoting_integer_type_p (restype)) diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index e6d4274ebb2..5a1a1edc667 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1531,7 +1531,7 @@ tree grokfield (declarator, declspecs, init, asmspec_tree, attrlist) tree declarator, declspecs, init, asmspec_tree, attrlist; { - register tree value; + tree value; const char *asmspec = 0; int flags = LOOKUP_ONLYCONVERTING; @@ -1679,8 +1679,8 @@ grokfield (declarator, declspecs, init, asmspec_tree, attrlist) value = push_template_decl (value); if (attrlist) - cplus_decl_attributes (value, TREE_PURPOSE (attrlist), - TREE_VALUE (attrlist)); + cplus_decl_attributes (&value, TREE_PURPOSE (attrlist), + TREE_VALUE (attrlist), 0); if (TREE_CODE (value) == VAR_DECL) { @@ -1875,19 +1875,20 @@ grok_function_init (decl, init) } void -cplus_decl_attributes (decl, attributes, prefix_attributes) - tree decl, attributes, prefix_attributes; +cplus_decl_attributes (decl, attributes, prefix_attributes, flags) + tree *decl, attributes, prefix_attributes; + int flags; { - if (decl == NULL_TREE || decl == void_type_node) + if (*decl == NULL_TREE || *decl == void_type_node) return; - if (TREE_CODE (decl) == TEMPLATE_DECL) - decl = DECL_TEMPLATE_RESULT (decl); + if (TREE_CODE (*decl) == TEMPLATE_DECL) + decl = &DECL_TEMPLATE_RESULT (*decl); - decl_attributes (decl, chainon (attributes, prefix_attributes)); + decl_attributes (decl, chainon (attributes, prefix_attributes), flags); - if (TREE_CODE (decl) == TYPE_DECL) - SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl)); + if (TREE_CODE (*decl) == TYPE_DECL) + SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl)); } /* CONSTRUCTOR_NAME: diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c index c27a73ecc2c..f7ff9848a6f 100644 --- a/gcc/cp/friend.c +++ b/gcc/cp/friend.c @@ -447,7 +447,7 @@ do_friend (ctype, declarator, decl, parmdecls, attrlist, } /* Set attributes here so if duplicate decl, will have proper attributes. */ - cplus_decl_attributes (decl, attributes, prefix_attributes); + cplus_decl_attributes (&decl, attributes, prefix_attributes, 0); return decl; } diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 6e2ac183ce5..276537582d2 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -182,7 +182,7 @@ parse_bitfield (declarator, attributes, width) tree declarator, attributes, width; { tree d = grokbitfield (declarator, current_declspecs, width); - cplus_decl_attributes (d, attributes, prefix_attributes); + cplus_decl_attributes (&d, attributes, prefix_attributes, 0); decl_type_access_control (d); return d; }