Commit b14454ba by Mark Mitchell Committed by Mark Mitchell

re PR c++/16215 (Bad error message when requesting member of non-aggregate type)

	PR c++/16215
	* parser.c (cp_parser_name_lookup_error): If parser->object_scope
	is set use it for diagnostic purposes.
	(cp_parser_pseudo_destructor_name): Remove special-case error
	message.

From-SVN: r86165
parent f2d16e4a
2004-08-17 Mark Mitchell <mark@codesourcery.com> 2004-08-17 Mark Mitchell <mark@codesourcery.com>
PR c++/16215
* parser.c (cp_parser_name_lookup_error): If parser->object_scope
is set use it for diagnostic purposes.
(cp_parser_pseudo_destructor_name): Remove special-case error
message.
PR c++/15871 PR c++/15871
* semantics.c (expand_or_defer_fn): Honor -fkeep-inline-functions. * semantics.c (expand_or_defer_fn): Honor -fkeep-inline-functions.
......
...@@ -2018,6 +2018,13 @@ cp_parser_name_lookup_error (cp_parser* parser, ...@@ -2018,6 +2018,13 @@ cp_parser_name_lookup_error (cp_parser* parser,
parser->scope, name); parser->scope, name);
else if (parser->scope == global_namespace) else if (parser->scope == global_namespace)
error ("`::%D' has not been declared", name); error ("`::%D' has not been declared", name);
else if (parser->object_scope
&& !CLASS_TYPE_P (parser->object_scope))
error ("request for member `%D' in non-class type `%T'",
name, parser->object_scope);
else if (parser->object_scope)
error ("`%T::%D' has not been declared",
parser->object_scope, name);
else else
error ("`%D' has not been declared", name); error ("`%D' has not been declared", name);
} }
...@@ -4488,6 +4495,9 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, ...@@ -4488,6 +4495,9 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
{ {
bool nested_name_specifier_p; bool nested_name_specifier_p;
/* Assume that things will not work out. */
*type = error_mark_node;
/* Look for the optional `::' operator. */ /* Look for the optional `::' operator. */
cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true); cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
/* Look for the optional nested-name-specifier. */ /* Look for the optional nested-name-specifier. */
...@@ -4520,17 +4530,18 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, ...@@ -4520,17 +4530,18 @@ 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_type_name (parser));
/* If we didn't get an aggregate type, or we don't have ::~, if (*scope == error_mark_node)
then something has gone wrong. Since the only caller of this return;
function is looking for something after `.' or `->' after a
scalar type, most likely the program is trying to get a /* If we don't have ::~, then something has gone wrong. Since
member of a non-aggregate type. */ the only caller of this function is looking for something
if (*scope == error_mark_node after `.' or `->' after a scalar type, most likely the
|| cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE) program is trying to get a member of a non-aggregate
type. */
if (cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE)
|| cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_COMPL) || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_COMPL)
{ {
cp_parser_error (parser, "request for member of non-aggregate type"); cp_parser_error (parser, "request for member of non-aggregate type");
*type = error_mark_node;
return; return;
} }
......
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