cp-tree.def (DEFAULT_ARG): Adjust documentation.

* cp-tree.def (DEFAULT_ARG): Adjust documentation.
	* cp-tree.h (DEFARG_INSTANTIATIONS): New.
	(struct tree_default_arg): Add instantiations member.
	* parser.c (cp_parser_late_parsing_default_args): Adjust to use a
	VEC.
	* pt.c (tsubst_arg_types): Likewise.

From-SVN: r100707
This commit is contained in:
Nathan Sidwell 2005-06-07 11:56:11 +00:00
parent c938250d71
commit 01ea1ea826
4 changed files with 15 additions and 10 deletions

View File

@ -206,9 +206,9 @@ DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
/* A using directive. The operand is USING_STMT_NAMESPACE. */ /* A using directive. The operand is USING_STMT_NAMESPACE. */
DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1) DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1)
/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. /* An un-parsed default argument. Holds a vector of input tokens and
TREE_CHAIN is used to hold instantiations of functions that had to a vector of places where the argument was instantiated before
be instantiated before the argument was parsed. */ parsing had occurred. */
DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0) DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
/* A template-id, like foo<int>. The first operand is the template. /* A template-id, like foo<int>. The first operand is the template.

View File

@ -424,11 +424,14 @@ typedef enum cp_id_kind
#define DEFARG_TOKENS(NODE) \ #define DEFARG_TOKENS(NODE) \
(((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens) (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
#define DEFARG_INSTANTIATIONS(NODE) \
(((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
struct tree_default_arg GTY (()) struct tree_default_arg GTY (())
{ {
struct tree_common common; struct tree_common common;
struct cp_token_cache *tokens; struct cp_token_cache *tokens;
VEC(tree,gc) *instantiations;
}; };
enum cp_tree_node_structure_enum { enum cp_tree_node_structure_enum {

View File

@ -12146,6 +12146,7 @@ cp_parser_parameter_declaration (cp_parser *parser,
default_argument = make_node (DEFAULT_ARG); default_argument = make_node (DEFAULT_ARG);
DEFARG_TOKENS (default_argument) DEFARG_TOKENS (default_argument)
= cp_token_cache_new (first_token, token); = cp_token_cache_new (first_token, token);
DEFARG_INSTANTIATIONS (default_argument) = NULL;
} }
/* Outside of a class definition, we can just parse the /* Outside of a class definition, we can just parse the
assignment-expression. */ assignment-expression. */
@ -15595,6 +15596,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
cp_token_cache *tokens; cp_token_cache *tokens;
tree default_arg = TREE_PURPOSE (parm); tree default_arg = TREE_PURPOSE (parm);
tree parsed_arg; tree parsed_arg;
VEC(tree,gc) *insts;
tree copy;
unsigned ix;
if (!default_arg) if (!default_arg)
continue; continue;
@ -15615,10 +15619,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
TREE_PURPOSE (parm) = parsed_arg; TREE_PURPOSE (parm) = parsed_arg;
/* Update any instantiations we've already created. */ /* Update any instantiations we've already created. */
for (default_arg = TREE_CHAIN (default_arg); for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
default_arg; VEC_iterate (tree, insts, ix, copy); ix++)
default_arg = TREE_CHAIN (default_arg)) TREE_PURPOSE (copy) = parsed_arg;
TREE_PURPOSE (TREE_PURPOSE (default_arg)) = parsed_arg;
/* If the token stream has not been completely used up, then /* If the token stream has not been completely used up, then
there was extra junk after the end of the default there was extra junk after the end of the default

View File

@ -6745,8 +6745,7 @@ tsubst_arg_types (tree arg_types,
class, and is not an error unless we require the default class, and is not an error unless we require the default
argument in a call of this function. */ argument in a call of this function. */
result = tree_cons (default_arg, type, remaining_arg_types); result = tree_cons (default_arg, type, remaining_arg_types);
TREE_CHAIN (default_arg) = tree_cons (result, NULL_TREE, VEC_safe_push (tree, gc, DEFARG_INSTANTIATIONS (default_arg), result);
TREE_CHAIN (default_arg));
} }
else else
result = hash_tree_cons (default_arg, type, remaining_arg_types); result = hash_tree_cons (default_arg, type, remaining_arg_types);