aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@gcc.gnu.org>2004-10-05 16:08:02 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-10-05 16:08:02 +0000
commit89d594a24d75b48db60e6dcebf5945686618361b (patch)
treef51e5219a6b3d3d36d4714660d7207c65c66ca54 /gcc/cp/parser.c
parent370f7a47bebfc5e52df1caa262d47e553041912b (diff)
downloadgcc-89d594a24d75b48db60e6dcebf5945686618361b.zip
gcc-89d594a24d75b48db60e6dcebf5945686618361b.tar.gz
gcc-89d594a24d75b48db60e6dcebf5945686618361b.tar.bz2
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
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index ed65334..79342db 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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)