* 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
/* 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.
#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 {
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. */
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;
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
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);