mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
f51a38b9c1
commit
f7b0fb680c
|
|
@ -1,3 +1,11 @@
|
|||
2004-08-31 Joseph S. Myers <jsm@polyomino.org.uk>
|
||||
|
||||
* 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 <rsandifo@redhat.com>
|
||||
|
||||
* read-rtl.c: Disable RTL checking.
|
||||
|
|
|
|||
102
gcc/attribs.c
102
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;
|
||||
}
|
||||
|
|
|
|||
79
gcc/c-decl.c
79
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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue