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:
parent
c938250d71
commit
01ea1ea826
|
@ -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.
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -12146,6 +12146,7 @@ cp_parser_parameter_declaration (cp_parser *parser,
|
|||
default_argument = make_node (DEFAULT_ARG);
|
||||
DEFARG_TOKENS (default_argument)
|
||||
= 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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue