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> 2015-07-09 Paolo Carlini <paolo.carlini@oracle.com>
* typeck.c (warn_args_num): Rename to error_args_num. * typeck.c (warn_args_num): Rename to error_args_num.
......
...@@ -13330,6 +13330,69 @@ cp_parser_template_parameter_list (cp_parser* parser) ...@@ -13330,6 +13330,69 @@ cp_parser_template_parameter_list (cp_parser* parser)
return end_template_parm_list (parameter_list); 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. /* Parse a template-parameter.
template-parameter: template-parameter:
...@@ -13552,11 +13615,8 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack) ...@@ -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 the next token is an `=', we have a default argument. */
if (cp_lexer_next_token_is (parser->lexer, CPP_EQ)) if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
{ {
/* Consume the `=' token. */ default_argument
cp_lexer_consume_token (parser->lexer); = cp_parser_default_type_template_argument (parser);
/* Parse the default-argument. */
push_deferring_access_checks (dk_no_deferred);
default_argument = cp_parser_type_id (parser);
/* Template parameter packs cannot have default /* Template parameter packs cannot have default
arguments. */ arguments. */
...@@ -13574,7 +13634,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack) ...@@ -13574,7 +13634,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
} }
else if (check_for_bare_parameter_packs (default_argument)) else if (check_for_bare_parameter_packs (default_argument))
default_argument = error_mark_node; default_argument = error_mark_node;
pop_deferring_access_checks ();
} }
else else
default_argument = NULL_TREE; default_argument = NULL_TREE;
...@@ -13632,40 +13691,8 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack) ...@@ -13632,40 +13691,8 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
default-argument. */ default-argument. */
if (cp_lexer_next_token_is (parser->lexer, CPP_EQ)) 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 default_argument
= cp_parser_id_expression (parser, = cp_parser_default_template_template_argument (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);
/* Template parameter packs cannot have default /* Template parameter packs cannot have default
arguments. */ arguments. */
...@@ -13681,7 +13708,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack) ...@@ -13681,7 +13708,6 @@ cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
"have default arguments"); "have default arguments");
default_argument = NULL_TREE; default_argument = NULL_TREE;
} }
pop_deferring_access_checks ();
} }
else else
default_argument = NULL_TREE; 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