aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-04-15 20:23:36 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-04-15 20:23:36 +0000
commit5eb106287bbb5cba374b3a6666ce40685a33e900 (patch)
tree8187fbf0bd1bb690a6a10b2f1cf5858182c6f6e2 /gcc/cp/parser.c
parent98475c572e3d589811aa15cf17184dcd5e265db2 (diff)
downloadgcc-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.c67
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