From f7b0fb680c62cc0e246909ec8be88c10e85e3d69 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 31 Aug 2004 09:29:24 +0100 Subject: [PATCH] attribs.c (strip_attrs): Remove. * attribs.c (strip_attrs): Remove. (split_specs_attrs): Move ... * c-decl.c: ... to here. * tree.h (split_specs_attrs, strip_attrs): Remove. * c-tree.h (split_specs_attrs): Declare. From-SVN: r86823 --- gcc/ChangeLog | 8 ++++ gcc/attribs.c | 102 -------------------------------------------------- gcc/c-decl.c | 79 ++++++++++++++++++++++++++++++++++++++ gcc/c-tree.h | 1 + gcc/tree.h | 8 ---- 5 files changed, 88 insertions(+), 110 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 11d9a3de7bc..8e292b1a947 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-08-31 Joseph S. Myers + + * attribs.c (strip_attrs): Remove. + (split_specs_attrs): Move ... + * c-decl.c: ... to here. + * tree.h (split_specs_attrs, strip_attrs): Remove. + * c-tree.h (split_specs_attrs): Declare. + 2004-08-31 Richard Sandiford * read-rtl.c: Disable RTL checking. diff --git a/gcc/attribs.c b/gcc/attribs.c index 8174f39222c..6f111818dd3 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -335,105 +335,3 @@ decl_attributes (tree *node, tree attributes, int flags) return returned_attrs; } - -/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two - lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE). - - The head of the declspec list is stored in DECLSPECS. - The head of the attribute list is stored in PREFIX_ATTRIBUTES. - - Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of - the list elements. We drop the containing TREE_LIST nodes and link the - resulting attributes together the way decl_attributes expects them. */ - -void -split_specs_attrs (tree specs_attrs, tree *declspecs, tree *prefix_attributes) -{ - tree t, s, a, next, specs, attrs; - - /* This can happen after an __extension__ in pedantic mode. */ - if (specs_attrs != NULL_TREE - && TREE_CODE (specs_attrs) == INTEGER_CST) - { - *declspecs = NULL_TREE; - *prefix_attributes = NULL_TREE; - return; - } - - /* This can happen in c++ (eg: decl: typespec initdecls ';'). */ - if (specs_attrs != NULL_TREE - && TREE_CODE (specs_attrs) != TREE_LIST) - { - *declspecs = specs_attrs; - *prefix_attributes = NULL_TREE; - return; - } - - /* Remember to keep the lists in the same order, element-wise. */ - - specs = s = NULL_TREE; - attrs = a = NULL_TREE; - for (t = specs_attrs; t; t = next) - { - next = TREE_CHAIN (t); - /* Declspecs have a non-NULL TREE_VALUE. */ - if (TREE_VALUE (t) != NULL_TREE) - { - if (specs == NULL_TREE) - specs = s = t; - else - { - TREE_CHAIN (s) = t; - s = t; - } - } - /* The TREE_PURPOSE may also be empty in the case of - __attribute__(()). */ - else if (TREE_PURPOSE (t) != NULL_TREE) - { - if (attrs == NULL_TREE) - attrs = a = TREE_PURPOSE (t); - else - { - TREE_CHAIN (a) = TREE_PURPOSE (t); - a = TREE_PURPOSE (t); - } - /* More attrs can be linked here, move A to the end. */ - while (TREE_CHAIN (a) != NULL_TREE) - a = TREE_CHAIN (a); - } - } - - /* Terminate the lists. */ - if (s != NULL_TREE) - TREE_CHAIN (s) = NULL_TREE; - if (a != NULL_TREE) - TREE_CHAIN (a) = NULL_TREE; - - /* All done. */ - *declspecs = specs; - *prefix_attributes = attrs; -} - -/* Strip attributes from SPECS_ATTRS, a list of declspecs and attributes. - This function is used by the parser when a rule will accept attributes - in a particular position, but we don't want to support that just yet. - - A warning is issued for every ignored attribute. */ - -tree -strip_attrs (tree specs_attrs) -{ - tree specs, attrs; - - split_specs_attrs (specs_attrs, &specs, &attrs); - - while (attrs) - { - warning ("`%s' attribute ignored", - IDENTIFIER_POINTER (TREE_PURPOSE (attrs))); - attrs = TREE_CHAIN (attrs); - } - - return specs; -} diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b2f7bbe42d2..e358ff6408c 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -2797,6 +2797,85 @@ set_array_declarator_inner (tree decl, tree type, bool abstract_p) return decl; } +/* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two + lists. SPECS_ATTRS may also be just a typespec (eg: RECORD_TYPE). + + The head of the declspec list is stored in DECLSPECS. + The head of the attribute list is stored in PREFIX_ATTRIBUTES. + + Note that attributes in SPECS_ATTRS are stored in the TREE_PURPOSE of + the list elements. We drop the containing TREE_LIST nodes and link the + resulting attributes together the way decl_attributes expects them. */ + +void +split_specs_attrs (tree specs_attrs, tree *declspecs, tree *prefix_attributes) +{ + tree t, s, a, next, specs, attrs; + + /* This can happen after an __extension__ in pedantic mode. */ + if (specs_attrs != NULL_TREE + && TREE_CODE (specs_attrs) == INTEGER_CST) + { + *declspecs = NULL_TREE; + *prefix_attributes = NULL_TREE; + return; + } + + /* This can happen in c++ (eg: decl: typespec initdecls ';'). */ + if (specs_attrs != NULL_TREE + && TREE_CODE (specs_attrs) != TREE_LIST) + { + *declspecs = specs_attrs; + *prefix_attributes = NULL_TREE; + return; + } + + /* Remember to keep the lists in the same order, element-wise. */ + + specs = s = NULL_TREE; + attrs = a = NULL_TREE; + for (t = specs_attrs; t; t = next) + { + next = TREE_CHAIN (t); + /* Declspecs have a non-NULL TREE_VALUE. */ + if (TREE_VALUE (t) != NULL_TREE) + { + if (specs == NULL_TREE) + specs = s = t; + else + { + TREE_CHAIN (s) = t; + s = t; + } + } + /* The TREE_PURPOSE may also be empty in the case of + __attribute__(()). */ + else if (TREE_PURPOSE (t) != NULL_TREE) + { + if (attrs == NULL_TREE) + attrs = a = TREE_PURPOSE (t); + else + { + TREE_CHAIN (a) = TREE_PURPOSE (t); + a = TREE_PURPOSE (t); + } + /* More attrs can be linked here, move A to the end. */ + while (TREE_CHAIN (a) != NULL_TREE) + a = TREE_CHAIN (a); + } + } + + /* Terminate the lists. */ + if (s != NULL_TREE) + TREE_CHAIN (s) = NULL_TREE; + if (a != NULL_TREE) + TREE_CHAIN (a) = NULL_TREE; + + /* All done. */ + *declspecs = specs; + *prefix_attributes = attrs; +} + /* Decode a "typename", such as "int **", returning a ..._TYPE node. */ tree diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 329948ade53..02ff4a6b28a 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -179,6 +179,7 @@ extern void finish_function (void); extern tree finish_struct (tree, tree, tree); extern tree get_parm_info (bool); extern tree grokfield (tree, tree, tree); +extern void split_specs_attrs (tree, tree *, tree *); extern tree groktypename (tree); extern tree groktypename_in_parm_context (tree); extern tree grokparm (tree); diff --git a/gcc/tree.h b/gcc/tree.h index d6b0ba887c2..e815ef0f389 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2895,14 +2895,6 @@ extern tree merge_decl_attributes (tree, tree); extern tree merge_type_attributes (tree, tree); extern void default_register_cpp_builtins (struct cpp_reader *); -/* Split a list of declspecs and attributes into two. */ - -extern void split_specs_attrs (tree, tree *, tree *); - -/* Strip attributes from a list of combined specs and attrs. */ - -extern tree strip_attrs (tree); - /* Return 1 if an attribute and its arguments are valid for a decl or type. */ extern int valid_machine_attribute (tree, tree, tree, tree); -- 2.30.2