diff options
author | Andrew Sutton <andrew.n.sutton@gmail.com> | 2015-07-09 17:50:06 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-07-09 13:50:06 -0400 |
commit | 2cc6d90e2d74a1bd0f97bf7106a86c1b85f70d8f (patch) | |
tree | d0b287be4d0b162656a59d5be771d00766647ccf | |
parent | 9d86e84ec0b576bd3586cf05f6605fee316c9cd4 (diff) | |
download | gcc-2cc6d90e2d74a1bd0f97bf7106a86c1b85f70d8f.zip gcc-2cc6d90e2d74a1bd0f97bf7106a86c1b85f70d8f.tar.gz gcc-2cc6d90e2d74a1bd0f97bf7106a86c1b85f70d8f.tar.bz2 |
* parser.c (cp_parser_default_type_template_argument)
(cp_parser_default_template_template_argument): Factor out from
cp_parser_type_parameter.
From-SVN: r225620
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 106 |
2 files changed, 72 insertions, 40 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c1a85e5..de57166 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d64b227..686654c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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; |