diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-04-15 20:23:36 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-04-15 20:23:36 +0000 |
commit | 5eb106287bbb5cba374b3a6666ce40685a33e900 (patch) | |
tree | 8187fbf0bd1bb690a6a10b2f1cf5858182c6f6e2 /gcc/cp/parser.c | |
parent | 98475c572e3d589811aa15cf17184dcd5e265db2 (diff) | |
download | gcc-5eb106287bbb5cba374b3a6666ce40685a33e900.zip gcc-5eb106287bbb5cba374b3a6666ce40685a33e900.tar.gz gcc-5eb106287bbb5cba374b3a6666ce40685a33e900.tar.bz2 |
re PR c++/10381 (Accepts call to inexistent function)
PR c++/10381
* parser.c (cp_parser_primary_expression): Reorganize logic for
dealing with name lookup failures.
PR c++/10381
* g++.dg/parse/lookup3.C: New test.
From-SVN: r65656
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 67 |
1 files changed, 38 insertions, 29 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 8f992c5..7515089 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2558,43 +2558,52 @@ cp_parser_primary_expression (cp_parser *parser, } } - if (!parser->scope - && decl == error_mark_node - && processing_template_decl) + if (decl == error_mark_node) { - /* Unqualified name lookup failed while processing a - template. */ - *idk = CP_PARSER_ID_KIND_UNQUALIFIED; - /* If the next token is a parenthesis, assume that - Koenig lookup will succeed when instantiating the - template. */ - if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) - return build_min_nt (LOOKUP_EXPR, id_expression); - /* If we're not doing Koenig lookup, issue an error. */ - error ("`%D' has not been declared", id_expression); - return error_mark_node; - } - else if (decl == error_mark_node - && !processing_template_decl) - { - if (!parser->scope) + /* Name lookup failed. */ + if (!parser->scope + && processing_template_decl) + { + /* Unqualified name lookup failed while processing a + template. */ + *idk = CP_PARSER_ID_KIND_UNQUALIFIED; + /* If the next token is a parenthesis, assume that + Koenig lookup will succeed when instantiating the + template. */ + if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) + return build_min_nt (LOOKUP_EXPR, id_expression); + /* If we're not doing Koenig lookup, issue an error. */ + error ("`%D' has not been declared", id_expression); + return error_mark_node; + } + else if (parser->scope + && (!TYPE_P (parser->scope) + || !dependent_type_p (parser->scope))) + { + /* Qualified name lookup failed, and the + qualifying name was not a dependent type. That + is always an error. */ + if (TYPE_P (parser->scope) + && !COMPLETE_TYPE_P (parser->scope)) + error ("incomplete type `%T' used in nested name " + "specifier", + parser->scope); + else if (parser->scope != global_namespace) + error ("`%D' is not a member of `%D'", + id_expression, parser->scope); + else + error ("`::%D' has not been declared", id_expression); + return error_mark_node; + } + else if (!parser->scope && !processing_template_decl) { /* It may be resolvable as a koenig lookup function call. */ *idk = CP_PARSER_ID_KIND_UNQUALIFIED; return id_expression; } - else if (TYPE_P (parser->scope) - && !COMPLETE_TYPE_P (parser->scope)) - error ("incomplete type `%T' used in nested name specifier", - parser->scope); - else if (parser->scope != global_namespace) - error ("`%D' is not a member of `%D'", - id_expression, parser->scope); - else - error ("`::%D' has not been declared", id_expression); } - /* If DECL is a variable would be out of scope under + /* If DECL is a variable that would be out of scope under ANSI/ISO rules, but in scope in the ARM, name lookup will succeed. Issue a diagnostic here. */ else |