Commit 2cc6d90e by Andrew Sutton Committed by Jason Merrill

* parser.c (cp_parser_default_type_template_argument)

	(cp_parser_default_template_template_argument): Factor out from
	cp_parser_type_parameter.

From-SVN: r225620
parent 9d86e84e
2015-07-09 Andrew Sutton <andrew.n.sutton@gmail.com>
* parser.c (cp_parser_default_type_template_argument)
(cp_parser_default_template_template_argument): Factor out from
cp_parser_type_parameter.
2015-07-09 Paolo Carlini <paolo.carlini@oracle.com>
* typeck.c (warn_args_num): Rename to error_args_num.
......
......@@ -13330,6 +13330,69 @@ cp_parser_template_parameter_list (cp_parser* parser)
return end_template_parm_list (parameter_list);
}
/* Parse a default argument for a type template-parameter.
Note that diagnostics are handled in cp_parser_template_parameter. */
static tree
cp_parser_default_type_template_argument (cp_parser *parser)
{
gcc_assert (cp_lexer_next_token_is (parser->lexer, CPP_EQ));
/* Consume the `=' token. */
cp_lexer_consume_token (parser->lexer);
/* Parse the default-argument. */
push_deferring_access_checks (dk_no_deferred);
tree default_argument = cp_parser_type_id (parser);
pop_deferring_access_checks ();
return default_argument;
}
/* Parse a default argument for a template template-parameter. */
static tree
cp_parser_default_template_template_argument (cp_parser *parser)
{
gcc_assert (cp_lexer_next_token_is (parser->lexer, CPP_EQ));
bool is_template;
/* Consume the `='. */
cp_lexer_consume_token (parser->lexer);
/* Parse the id-expression. */
push_deferring_access_checks (dk_no_deferred);
/* save token before parsing the id-expression, for error
reporting */
const cp_token* token = cp_lexer_peek_token (parser->lexer);
tree default_argument
= cp_parser_id_expression (parser,
/*template_keyword_p=*/false,
/*check_dependency_p=*/true,
/*template_p=*/&is_template,
/*declarator_p=*/false,
/*optional_p=*/false);
if (TREE_CODE (default_argument) == TYPE_DECL)
/* If the id-expression was a template-id that refers to
a template-class, we already have the declaration here,
so no further lookup is needed. */
;
else
/* Look up the name. */
default_argument
= cp_parser_lookup_name (parser, default_argument,
none_type,
/*is_template=*/is_template,
/*is_namespace=*/false,
/*check_dependency=*/true,
/*ambiguous_decls=*/NULL,
token->location);
/* See if the default argument is valid. */
default_argument = check_template_template_default_arg (default_argument);
pop_deferring_access_checks ();
return default_argument;
}
/* Parse a template-parameter.
template-parameter:
......@@ -13552,11 +13615,8 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
/* If the next token is an `=', we have a default argument. */
if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
{
/* Consume the `=' token. */
cp_lexer_consume_token (parser->lexer);
/* Parse the default-argument. */
push_deferring_access_checks (dk_no_deferred);
default_argument = cp_parser_type_id (parser);
default_argument
= cp_parser_default_type_template_argument (parser);
/* Template parameter packs cannot have default
arguments. */
......@@ -13574,7 +13634,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
}
else if (check_for_bare_parameter_packs (default_argument))
default_argument = error_mark_node;
pop_deferring_access_checks ();
}
else
default_argument = NULL_TREE;
......@@ -13632,40 +13691,8 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
default-argument. */
if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
{
bool is_template;
/* Consume the `='. */
cp_lexer_consume_token (parser->lexer);
/* Parse the id-expression. */
push_deferring_access_checks (dk_no_deferred);
/* save token before parsing the id-expression, for error
reporting */
token = cp_lexer_peek_token (parser->lexer);
default_argument
= cp_parser_id_expression (parser,
/*template_keyword_p=*/false,
/*check_dependency_p=*/true,
/*template_p=*/&is_template,
/*declarator_p=*/false,
/*optional_p=*/false);
if (TREE_CODE (default_argument) == TYPE_DECL)
/* If the id-expression was a template-id that refers to
a template-class, we already have the declaration here,
so no further lookup is needed. */
;
else
/* Look up the name. */
default_argument
= cp_parser_lookup_name (parser, default_argument,
none_type,
/*is_template=*/is_template,
/*is_namespace=*/false,
/*check_dependency=*/true,
/*ambiguous_decls=*/NULL,
token->location);
/* See if the default argument is valid. */
default_argument
= check_template_template_default_arg (default_argument);
= cp_parser_default_template_template_argument (parser);
/* Template parameter packs cannot have default
arguments. */
......@@ -13681,7 +13708,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
"have default arguments");
default_argument = NULL_TREE;
}
pop_deferring_access_checks ();
}
else
default_argument = NULL_TREE;
......
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