re PR c++/17829 (wrong error: call of overloaded function is ambiguous)

cp:
	PR c++/17829
	* parser.c (cp_parser_postfix_expression): Inhibit Koenig when
	unqualified lookup finds a member function.
testsuite:
	PR c++/17829
	* g++.dg/lookup/koenig4.C: New.

From-SVN: r88558
This commit is contained in:
Nathan Sidwell 2004-10-05 16:08:02 +00:00
parent 370f7a47be
commit 89d594a24d
4 changed files with 61 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2004-10-05 Nathan Sidwell <nathan@codesourcery.com>
PR c++/17829
* parser.c (cp_parser_postfix_expression): Inhibit Koenig when
unqualified lookup finds a member function.
2004-10-04 Gabriel Dos Reis <gdr@integrable-solutions.net>
Convert diagnostics to use quoting flag q 4/n

View File

@ -4061,20 +4061,38 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p)
koenig_p = false;
if (idk == CP_ID_KIND_UNQUALIFIED)
{
if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
{
if (args)
{
koenig_p = true;
postfix_expression
= perform_koenig_lookup (postfix_expression, args);
}
else
postfix_expression
= unqualified_fn_lookup_error (postfix_expression);
}
/* We do not perform argument-dependent lookup if
normal lookup finds a non-function, in accordance
with the expected resolution of DR 218. */
if (args
&& (is_overloaded_fn (postfix_expression)
|| TREE_CODE (postfix_expression) == IDENTIFIER_NODE))
else if (args && is_overloaded_fn (postfix_expression))
{
koenig_p = true;
postfix_expression
= perform_koenig_lookup (postfix_expression, args);
tree fn = get_first_fn (postfix_expression);
if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
fn = OVL_CURRENT (TREE_OPERAND (fn, 0));
/* Only do argument dependent lookup if regular
lookup does not find a set of member functions.
[basic.lookup.koenig]/2a */
if (!DECL_FUNCTION_MEMBER_P (fn))
{
koenig_p = true;
postfix_expression
= perform_koenig_lookup (postfix_expression, args);
}
}
else if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
postfix_expression
= unqualified_fn_lookup_error (postfix_expression);
}
if (TREE_CODE (postfix_expression) == COMPONENT_REF)

View File

@ -1,3 +1,8 @@
2004-10-05 Nathan Sidwell <nathan@codesourcery.com>
PR c++/17829
* g++.dg/lookup/koenig4.C: New.
2004-10-05 Gabriel Dos Reis <gdr@integrable-solutions.net>
* g++.dg/other/classkey1.C: Adjust quoting marks.
@ -22219,7 +22224,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/compile/labels-2.c: New test.
1999-12-27 Martin von Löwis <loewis@informatik.hu-berlin.de>
1999-12-27 Martin von Löwis <loewis@informatik.hu-berlin.de>
* gcc.c-torture/execute/991227-1.c: New test.
@ -22227,7 +22232,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz>
* g++.old-deja/g++.pt/instantiate6.C: Remove excess errors XFAIL.
1999-12-21 Martin von Löwis <loewis@informatik.hu-berlin.de>
1999-12-21 Martin von Löwis <loewis@informatik.hu-berlin.de>
* gcc.c-torture/execute/991221-1.c: New test.

View File

@ -0,0 +1,21 @@
// { dg-do compile }
// Copyright (C) 2004 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 5 Oct 2004 <nathan@codesourcery.com>
// Origin: Wolfgang Bangerth <bangerth@dealii.org>
// Incorrect koenig lookup
struct A {};
struct B {
static void foo();
static void bar(const A &);
};
void bar(const A &){}
void B::foo () {
A a;
bar (a);
}