Commit fd860f7d by Jason Merrill Committed by Jason Merrill

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
parent 19bd9028
2019-07-16 Jason Merrill <jason@redhat.com> 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 * parser.c (cp_parser_nested_name_specifier_opt): If the token is
already CPP_NESTED_NAME_SPECIFIER, leave it alone. already CPP_NESTED_NAME_SPECIFIER, leave it alone.
......
...@@ -17833,7 +17833,7 @@ cp_parser_simple_type_specifier (cp_parser* parser, ...@@ -17833,7 +17833,7 @@ cp_parser_simple_type_specifier (cp_parser* parser,
/* Don't gobble tokens or issue error messages if this is an /* Don't gobble tokens or issue error messages if this is an
optional type-specifier. */ optional type-specifier. */
if ((flags & CP_PARSER_FLAGS_OPTIONAL) || cxx_dialect >= cxx17) if (flags & CP_PARSER_FLAGS_OPTIONAL)
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
token = cp_lexer_peek_token (parser->lexer); token = cp_lexer_peek_token (parser->lexer);
...@@ -17873,37 +17873,26 @@ cp_parser_simple_type_specifier (cp_parser* parser, ...@@ -17873,37 +17873,26 @@ cp_parser_simple_type_specifier (cp_parser* parser,
else else
{ {
cp_parser_error (parser, "expected template-id for type"); 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. */ /* Otherwise, look for a type-name. */
if (type 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)
{ {
if (flags & CP_PARSER_FLAGS_OPTIONAL) if (cxx_dialect >= cxx17)
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
cp_parser_global_scope_opt (parser, type = cp_parser_type_name (parser, (qualified_p && typename_p));
/*current_scope_valid_p=*/false);
cp_parser_nested_name_specifier_opt (parser, if (cxx_dialect >= cxx17 && !cp_parser_parse_definitely (parser))
/*typename_keyword_p=*/false, type = NULL_TREE;
/*check_dependency_p=*/true, }
/*type_p=*/false,
/*is_declaration=*/false); if (!type && cxx_dialect >= cxx17)
{
/* Try class template argument deduction. */
tree name = cp_parser_identifier (parser); tree name = cp_parser_identifier (parser);
if (name && TREE_CODE (name) == IDENTIFIER_NODE if (name && TREE_CODE (name) == IDENTIFIER_NODE
&& parser->scope != error_mark_node) && parser->scope != error_mark_node)
...@@ -17929,11 +17918,21 @@ cp_parser_simple_type_specifier (cp_parser* parser, ...@@ -17929,11 +17918,21 @@ cp_parser_simple_type_specifier (cp_parser* parser,
} }
else else
type = error_mark_node; 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) if (type && decl_specs)
cp_parser_set_decl_spec_type (decl_specs, type, cp_parser_set_decl_spec_type (decl_specs, type,
token, token,
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