parser.c (cp_parser_nonclass_name): New.

2008-02-29  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

cp/
	* parser.c (cp_parser_nonclass_name): New.
	(cp_parser_pseudo_destructor_name): Use it instead of
	cp_parser_type_name.
	(cp_parser_type_name): Move code to cp_parser_nonclass_name.

From-SVN: r132778
parent 966e8f4d
2008-02-29 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* parser.c (cp_parser_nonclass_name): New.
(cp_parser_pseudo_destructor_name): Use it instead of
cp_parser_type_name.
(cp_parser_type_name): Move code to cp_parser_nonclass_name.
2008-02-29 Tom Tromey <tromey@redhat.com> 2008-02-29 Tom Tromey <tromey@redhat.com>
* parser.c (struct cp_token) <input_file_stack_index>: Remove. * parser.c (struct cp_token) <input_file_stack_index>: Remove.
......
...@@ -1672,6 +1672,8 @@ static tree cp_parser_simple_type_specifier ...@@ -1672,6 +1672,8 @@ static tree cp_parser_simple_type_specifier
(cp_parser *, cp_decl_specifier_seq *, cp_parser_flags); (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
static tree cp_parser_type_name static tree cp_parser_type_name
(cp_parser *); (cp_parser *);
static tree cp_parser_nonclass_name
(cp_parser* parser);
static tree cp_parser_elaborated_type_specifier static tree cp_parser_elaborated_type_specifier
(cp_parser *, bool, bool); (cp_parser *, bool, bool);
static tree cp_parser_enum_specifier static tree cp_parser_enum_specifier
...@@ -5171,8 +5173,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, ...@@ -5171,8 +5173,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
} }
/* Look for the type-name. */ /* Look for the type-name. */
*scope = TREE_TYPE (cp_parser_type_name (parser)); *scope = TREE_TYPE (cp_parser_nonclass_name (parser));
if (*scope == error_mark_node) if (*scope == error_mark_node)
return; return;
...@@ -5186,7 +5187,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, ...@@ -5186,7 +5187,7 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
cp_parser_require (parser, CPP_COMPL, "`~'"); cp_parser_require (parser, CPP_COMPL, "`~'");
/* Look for the type-name again. We are not responsible for /* Look for the type-name again. We are not responsible for
checking that it matches the first type-name. */ checking that it matches the first type-name. */
*type = cp_parser_type_name (parser); *type = cp_parser_nonclass_name (parser);
} }
/* Parse a unary-expression. /* Parse a unary-expression.
...@@ -10947,7 +10948,6 @@ static tree ...@@ -10947,7 +10948,6 @@ static tree
cp_parser_type_name (cp_parser* parser) cp_parser_type_name (cp_parser* parser)
{ {
tree type_decl; tree type_decl;
tree identifier;
/* We can't know yet whether it is a class-name or not. */ /* We can't know yet whether it is a class-name or not. */
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
...@@ -10963,44 +10963,64 @@ cp_parser_type_name (cp_parser* parser) ...@@ -10963,44 +10963,64 @@ cp_parser_type_name (cp_parser* parser)
if (!cp_parser_parse_definitely (parser)) if (!cp_parser_parse_definitely (parser))
{ {
/* It must be a typedef-name or an enum-name. */ /* It must be a typedef-name or an enum-name. */
identifier = cp_parser_identifier (parser); return cp_parser_nonclass_name (parser);
if (identifier == error_mark_node) }
return error_mark_node;
/* Look up the type-name. */ return type_decl;
type_decl = cp_parser_lookup_name_simple (parser, identifier); }
if (TREE_CODE (type_decl) != TYPE_DECL /* Parse a non-class type-name, that is, either an enum-name or a typedef-name.
&& (objc_is_id (identifier) || objc_is_class_name (identifier)))
{
/* See if this is an Objective-C type. */
tree protos = cp_parser_objc_protocol_refs_opt (parser);
tree type = objc_get_protocol_qualified_type (identifier, protos);
if (type)
type_decl = TYPE_NAME (type);
}
/* Issue an error if we did not find a type-name. */ enum-name:
if (TREE_CODE (type_decl) != TYPE_DECL) identifier
{
if (!cp_parser_simulate_error (parser)) typedef-name:
cp_parser_name_lookup_error (parser, identifier, type_decl, identifier
"is not a type");
type_decl = error_mark_node; Returns a TYPE_DECL for the type. */
}
/* Remember that the name was used in the definition of the
current class so that we can check later to see if the
meaning would have been different after the class was
entirely defined. */
else if (type_decl != error_mark_node
&& !parser->scope)
maybe_note_name_used_in_class (identifier, type_decl);
}
static tree
cp_parser_nonclass_name (cp_parser* parser)
{
tree type_decl;
tree identifier;
identifier = cp_parser_identifier (parser);
if (identifier == error_mark_node)
return error_mark_node;
/* Look up the type-name. */
type_decl = cp_parser_lookup_name_simple (parser, identifier);
if (TREE_CODE (type_decl) != TYPE_DECL
&& (objc_is_id (identifier) || objc_is_class_name (identifier)))
{
/* See if this is an Objective-C type. */
tree protos = cp_parser_objc_protocol_refs_opt (parser);
tree type = objc_get_protocol_qualified_type (identifier, protos);
if (type)
type_decl = TYPE_NAME (type);
}
/* Issue an error if we did not find a type-name. */
if (TREE_CODE (type_decl) != TYPE_DECL)
{
if (!cp_parser_simulate_error (parser))
cp_parser_name_lookup_error (parser, identifier, type_decl,
"is not a type");
return error_mark_node;
}
/* Remember that the name was used in the definition of the
current class so that we can check later to see if the
meaning would have been different after the class was
entirely defined. */
else if (type_decl != error_mark_node
&& !parser->scope)
maybe_note_name_used_in_class (identifier, type_decl);
return type_decl; return type_decl;
} }
/* Parse an elaborated-type-specifier. Note that the grammar given /* Parse an elaborated-type-specifier. Note that the grammar given
here incorporates the resolution to DR68. here incorporates the resolution to DR68.
......
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