Commit 01ea1ea8 by Nathan Sidwell

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
parent c938250d
...@@ -206,9 +206,9 @@ DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0) ...@@ -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.
......
...@@ -424,11 +424,14 @@ typedef enum cp_id_kind ...@@ -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 {
......
...@@ -12145,7 +12145,8 @@ cp_parser_parameter_declaration (cp_parser *parser, ...@@ -12145,7 +12145,8 @@ cp_parser_parameter_declaration (cp_parser *parser,
argument. */ argument. */
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) ...@@ -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) ...@@ -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
......
...@@ -6745,8 +6745,7 @@ tsubst_arg_types (tree arg_types, ...@@ -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);
......
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