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. */
DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1)
/* An un-parsed default argument. Looks like an IDENTIFIER_NODE.
TREE_CHAIN is used to hold instantiations of functions that had to
be instantiated before the argument was parsed. */
/* An un-parsed default argument. Holds a vector of input tokens and
a vector of places where the argument was instantiated before
parsing had occurred. */
DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
/* 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) \
(((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_common common;
struct cp_token_cache *tokens;
VEC(tree,gc) *instantiations;
};
enum cp_tree_node_structure_enum {

View File

@ -12145,7 +12145,8 @@ cp_parser_parameter_declaration (cp_parser *parser,
argument. */
default_argument = make_node (DEFAULT_ARG);
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
assignment-expression. */
@ -15595,6 +15596,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
cp_token_cache *tokens;
tree default_arg = TREE_PURPOSE (parm);
tree parsed_arg;
VEC(tree,gc) *insts;
tree copy;
unsigned ix;
if (!default_arg)
continue;
@ -15615,10 +15619,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
TREE_PURPOSE (parm) = parsed_arg;
/* Update any instantiations we've already created. */
for (default_arg = TREE_CHAIN (default_arg);
default_arg;
default_arg = TREE_CHAIN (default_arg))
TREE_PURPOSE (TREE_PURPOSE (default_arg)) = parsed_arg;
for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
VEC_iterate (tree, insts, ix, copy); ix++)
TREE_PURPOSE (copy) = parsed_arg;
/* If the token stream has not been completely used up, then
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
argument in a call of this function. */
result = tree_cons (default_arg, type, remaining_arg_types);
TREE_CHAIN (default_arg) = tree_cons (result, NULL_TREE,
TREE_CHAIN (default_arg));
VEC_safe_push (tree, gc, DEFARG_INSTANTIATIONS (default_arg), result);
}
else
result = hash_tree_cons (default_arg, type, remaining_arg_types);