diff options
author | Jason Merrill <jason@redhat.com> | 2019-07-16 04:50:16 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-07-16 04:50:16 -0400 |
commit | fd860f7d441d1f414bb13f2b6e1be6c4addac11f (patch) | |
tree | 879aac09f15f3495f2ee6bbbf0d639594b7a112f /gcc | |
parent | 19bd90282641da569f3da6c26eac3fd248296cb2 (diff) | |
download | gcc-fd860f7d441d1f414bb13f2b6e1be6c4addac11f.zip gcc-fd860f7d441d1f414bb13f2b6e1be6c4addac11f.tar.gz gcc-fd860f7d441d1f414bb13f2b6e1be6c4addac11f.tar.bz2 |
Simplify type-specifier parsing.
Previously, the tentative parses for optional type-specifier and to support
class template argument deduction were combined awkwardly. This
reorganization was motivated by the new concepts branch.
* parser.c (cp_parser_simple_type_specifier): Separate tentative
parses for optional type-spec and CTAD.
From-SVN: r273514
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/parser.c | 57 |
2 files changed, 31 insertions, 29 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bd85c70..ad7f4a3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2019-07-16 Jason Merrill <jason@redhat.com> + * parser.c (cp_parser_simple_type_specifier): Separate tentative + parses for optional type-spec and CTAD. + * parser.c (cp_parser_nested_name_specifier_opt): If the token is already CPP_NESTED_NAME_SPECIFIER, leave it alone. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 14a2168..5e4b453 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17833,7 +17833,7 @@ cp_parser_simple_type_specifier (cp_parser* parser, /* Don't gobble tokens or issue error messages if this is an optional type-specifier. */ - if ((flags & CP_PARSER_FLAGS_OPTIONAL) || cxx_dialect >= cxx17) + if (flags & CP_PARSER_FLAGS_OPTIONAL) cp_parser_parse_tentatively (parser); token = cp_lexer_peek_token (parser->lexer); @@ -17873,37 +17873,26 @@ cp_parser_simple_type_specifier (cp_parser* parser, else { cp_parser_error (parser, "expected template-id for type"); - type = NULL_TREE; + type = error_mark_node; } } } - /* Otherwise, look for a type-name. */ - else - type = cp_parser_type_name (parser, (qualified_p && typename_p)); - /* Keep track of all name-lookups performed in class scopes. */ - if (type - && !global_p - && !qualified_p - && TREE_CODE (type) == TYPE_DECL - && identifier_p (DECL_NAME (type))) - maybe_note_name_used_in_class (DECL_NAME (type), type); - /* If it didn't work out, we don't have a TYPE. */ - if (((flags & CP_PARSER_FLAGS_OPTIONAL) || cxx_dialect >= cxx17) - && !cp_parser_parse_definitely (parser)) - type = NULL_TREE; - if (!type && cxx_dialect >= cxx17) + /* Otherwise, look for a type-name. */ + if (!type) { - if (flags & CP_PARSER_FLAGS_OPTIONAL) + if (cxx_dialect >= cxx17) cp_parser_parse_tentatively (parser); - cp_parser_global_scope_opt (parser, - /*current_scope_valid_p=*/false); - cp_parser_nested_name_specifier_opt (parser, - /*typename_keyword_p=*/false, - /*check_dependency_p=*/true, - /*type_p=*/false, - /*is_declaration=*/false); + type = cp_parser_type_name (parser, (qualified_p && typename_p)); + + if (cxx_dialect >= cxx17 && !cp_parser_parse_definitely (parser)) + type = NULL_TREE; + } + + if (!type && cxx_dialect >= cxx17) + { + /* Try class template argument deduction. */ tree name = cp_parser_identifier (parser); if (name && TREE_CODE (name) == IDENTIFIER_NODE && parser->scope != error_mark_node) @@ -17929,11 +17918,21 @@ cp_parser_simple_type_specifier (cp_parser* parser, } else type = error_mark_node; - - if ((flags & CP_PARSER_FLAGS_OPTIONAL) - && !cp_parser_parse_definitely (parser)) - type = NULL_TREE; } + + /* If it didn't work out, we don't have a TYPE. */ + if ((flags & CP_PARSER_FLAGS_OPTIONAL) + && !cp_parser_parse_definitely (parser)) + type = NULL_TREE; + + /* Keep track of all name-lookups performed in class scopes. */ + if (type + && !global_p + && !qualified_p + && TREE_CODE (type) == TYPE_DECL + && identifier_p (DECL_NAME (type))) + maybe_note_name_used_in_class (DECL_NAME (type), type); + if (type && decl_specs) cp_parser_set_decl_spec_type (decl_specs, type, token, |