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>
|
2004-08-31 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
* read-rtl.c: Disable RTL checking.
|
* 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;
|
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;
|
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. */
|
/* Decode a "typename", such as "int **", returning a ..._TYPE node. */
|
||||||
|
|
||||||
tree
|
tree
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,7 @@ extern void finish_function (void);
|
||||||
extern tree finish_struct (tree, tree, tree);
|
extern tree finish_struct (tree, tree, tree);
|
||||||
extern tree get_parm_info (bool);
|
extern tree get_parm_info (bool);
|
||||||
extern tree grokfield (tree, tree, tree);
|
extern tree grokfield (tree, tree, tree);
|
||||||
|
extern void split_specs_attrs (tree, tree *, tree *);
|
||||||
extern tree groktypename (tree);
|
extern tree groktypename (tree);
|
||||||
extern tree groktypename_in_parm_context (tree);
|
extern tree groktypename_in_parm_context (tree);
|
||||||
extern tree grokparm (tree);
|
extern tree grokparm (tree);
|
||||||
|
|
|
||||||
|
|
@ -2895,14 +2895,6 @@ extern tree merge_decl_attributes (tree, tree);
|
||||||
extern tree merge_type_attributes (tree, tree);
|
extern tree merge_type_attributes (tree, tree);
|
||||||
extern void default_register_cpp_builtins (struct cpp_reader *);
|
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. */
|
/* Return 1 if an attribute and its arguments are valid for a decl or type. */
|
||||||
|
|
||||||
extern int valid_machine_attribute (tree, tree, tree, tree);
|
extern int valid_machine_attribute (tree, tree, tree, tree);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue