diff options
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index eacf5e9..28f47c8 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1732,6 +1732,10 @@ static tree cp_parser_declarator_id (cp_parser *, bool); static tree cp_parser_type_id (cp_parser *); +static tree cp_parser_template_type_arg + (cp_parser *); +static tree cp_parser_type_id_1 + (cp_parser *, bool); static void cp_parser_type_specifier_seq (cp_parser *, bool, cp_decl_specifier_seq *); static tree cp_parser_parameter_declaration_clause @@ -5772,7 +5776,7 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts) new_declarator = NULL; } - type = groktypename (&type_specifier_seq, new_declarator); + type = groktypename (&type_specifier_seq, new_declarator, false); return type; } @@ -10544,7 +10548,7 @@ cp_parser_template_argument (cp_parser* parser) Therefore, we try a type-id first. */ cp_parser_parse_tentatively (parser); - argument = cp_parser_type_id (parser); + argument = cp_parser_template_type_arg (parser); /* If there was no error parsing the type-id but the next token is a '>>', our behavior depends on which dialect of C++ we're parsing. In C++98, we probably found a typo for '> >'. But there @@ -10732,7 +10736,7 @@ cp_parser_template_argument (cp_parser* parser) was the only alternative that matched (albeit with a '>' after it). We can assume it's just a typo from the user, and a diagnostic will then be issued. */ - return cp_parser_type_id (parser); + return cp_parser_template_type_arg (parser); } /* Parse an explicit-instantiation. @@ -13766,7 +13770,7 @@ cp_parser_declarator_id (cp_parser* parser, bool optional_p) Returns the TYPE specified. */ static tree -cp_parser_type_id (cp_parser* parser) +cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg) { cp_decl_specifier_seq type_specifier_seq; cp_declarator *abstract_declarator; @@ -13795,7 +13799,18 @@ cp_parser_type_id (cp_parser* parser) return error_mark_node; } - return groktypename (&type_specifier_seq, abstract_declarator); + return groktypename (&type_specifier_seq, abstract_declarator, + is_template_arg); +} + +static tree cp_parser_type_id (cp_parser *parser) +{ + return cp_parser_type_id_1 (parser, false); +} + +static tree cp_parser_template_type_arg (cp_parser *parser) +{ + return cp_parser_type_id_1 (parser, true); } /* Parse a type-specifier-seq. |