diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-08-18 00:58:52 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-08-18 00:58:52 +0000 |
commit | b14454ba1a4d273021e354ff30f02f754fedb121 (patch) | |
tree | 0862611a0d7c0e5c5d262db48bfcabfa622dc7e1 /gcc | |
parent | f2d16e4add400632f577c96c9ff59e58075d88a5 (diff) | |
download | gcc-b14454ba1a4d273021e354ff30f02f754fedb121.zip gcc-b14454ba1a4d273021e354ff30f02f754fedb121.tar.gz gcc-b14454ba1a4d273021e354ff30f02f754fedb121.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 27 |
2 files changed, 25 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 92e5751..c7ff194 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 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 * semantics.c (expand_or_defer_fn): Honor -fkeep-inline-functions. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index fa41ce6..999c528 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2018,6 +2018,13 @@ cp_parser_name_lookup_error (cp_parser* parser, parser->scope, name); else if (parser->scope == global_namespace) 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 error ("`%D' has not been declared", name); } @@ -4488,6 +4495,9 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, { bool nested_name_specifier_p; + /* Assume that things will not work out. */ + *type = error_mark_node; + /* Look for the optional `::' operator. */ cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true); /* Look for the optional nested-name-specifier. */ @@ -4520,17 +4530,18 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, /* Look for the type-name. */ *scope = TREE_TYPE (cp_parser_type_name (parser)); - /* If we didn't get an aggregate type, or we don't have ::~, - then something has gone wrong. Since the only caller of this - function is looking for something after `.' or `->' after a - scalar type, most likely the program is trying to get a - member of a non-aggregate type. */ - if (*scope == error_mark_node - || cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE) + if (*scope == error_mark_node) + return; + + /* If we don't have ::~, then something has gone wrong. Since + the only caller of this function is looking for something + after `.' or `->' after a scalar type, most likely the + 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_parser_error (parser, "request for member of non-aggregate type"); - *type = error_mark_node; return; } |