Commit e60bf9d4 by Nathan Froyd Committed by Nathan Froyd

c-tree.h (c_arg_tag): Define.

	* c-tree.h (c_arg_tag): Define.  Define a VEC containing it.
	(struct c_arg_info): Change type of tags field.
	* c-decl.c (grokdeclarator): Update for changed type of tags field.
	(get_parm_info): Likewise.
	(store_parm_decls_newstyle): Likewise.

From-SVN: r163013
parent 4f8c876d
2010-08-08 Nathan Froyd <froydnj@codesourcery.com>
* c-tree.h (c_arg_tag): Define. Define a VEC containing it.
(struct c_arg_info): Change type of tags field.
* c-decl.c (grokdeclarator): Update for changed type of tags field.
(get_parm_info): Likewise.
(store_parm_decls_newstyle): Likewise.
2010-08-08 Nathan Froyd <froydnj@codesourcery.com>
* config/rs6000/rs6000.c (branch_island): Define. Define a VEC of it.
(branch_island_list): Delete.
(branch_islands): Declare.
......
......@@ -5541,12 +5541,11 @@ grokdeclarator (const struct c_declarator *declarator,
the formal parameter list of this FUNCTION_TYPE to point to
the FUNCTION_TYPE node itself. */
{
tree link;
c_arg_tag *tag;
unsigned ix;
for (link = arg_info->tags;
link;
link = TREE_CHAIN (link))
TYPE_CONTEXT (TREE_VALUE (link)) = type;
FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
TYPE_CONTEXT (tag->type) = type;
}
break;
}
......@@ -6192,7 +6191,7 @@ get_parm_info (bool ellipsis)
struct c_arg_info *arg_info = XOBNEW (&parser_obstack,
struct c_arg_info);
tree parms = 0;
tree tags = 0;
VEC(c_arg_tag,gc) *tags = NULL;
tree types = 0;
tree others = 0;
......@@ -6246,6 +6245,7 @@ get_parm_info (bool ellipsis)
{
tree decl = b->decl;
tree type = TREE_TYPE (decl);
c_arg_tag *tag;
const char *keyword;
switch (TREE_CODE (decl))
......@@ -6319,7 +6319,9 @@ get_parm_info (bool ellipsis)
}
}
tags = tree_cons (b->id, decl, tags);
tag = VEC_safe_push (c_arg_tag, gc, tags, NULL);
tag->id = b->id;
tag->type = decl;
break;
case CONST_DECL:
......@@ -7644,6 +7646,8 @@ static void
store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
{
tree decl;
c_arg_tag *tag;
unsigned ix;
if (current_scope->bindings)
{
......@@ -7696,9 +7700,9 @@ store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
}
/* And all the tag declarations. */
for (decl = arg_info->tags; decl; decl = TREE_CHAIN (decl))
if (TREE_PURPOSE (decl))
bind (TREE_PURPOSE (decl), TREE_VALUE (decl), current_scope,
FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
if (tag->id)
bind (tag->id, tag->type, current_scope,
/*invisible=*/false, /*nested=*/false, UNKNOWN_LOCATION);
}
......
......@@ -295,12 +295,22 @@ enum c_declarator_kind {
cdk_attrs
};
typedef struct GTY(()) c_arg_tag_d {
/* The argument name. */
tree id;
/* The type of the argument. */
tree type;
} c_arg_tag;
DEF_VEC_O(c_arg_tag);
DEF_VEC_ALLOC_O(c_arg_tag,gc);
/* Information about the parameters in a function declarator. */
struct c_arg_info {
/* A list of parameter decls. */
tree parms;
/* A list of structure, union and enum tags defined. */
tree tags;
VEC(c_arg_tag,gc) *tags;
/* A list of argument types to go in the FUNCTION_TYPE. */
tree types;
/* A list of non-parameter decls (notably enumeration constants)
......
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