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. */
|
/* 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
|
||||||
|
|
||||||
#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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue