Commit d095e03c by Jason Merrill Committed by Jason Merrill

re PR c++/13549 (Problem compiling Boost.Python test)

        PR c++/13549
        * semantics.c (perform_koenig_lookup): Handle TEMPLATE_ID_EXPR.
        * parser.c (cp_parser_postfix_expression): Call it for
        TEMPLATE_ID_EXPR.
        * tree.c (is_overloaded_fn): Look through TEMPLATE_ID_EXPR.
        (get_first_fn): Likewise.

From-SVN: r144636
parent 4a1f5eed
2009-03-04 Jason Merrill <jason@redhat.com> 2009-03-04 Jason Merrill <jason@redhat.com>
PR c++/13549
* semantics.c (perform_koenig_lookup): Handle TEMPLATE_ID_EXPR.
* parser.c (cp_parser_postfix_expression): Call it for
TEMPLATE_ID_EXPR.
* tree.c (is_overloaded_fn): Look through TEMPLATE_ID_EXPR.
(get_first_fn): Likewise.
PR c++/9634 PR c++/9634
PR c++/29469 PR c++/29469
PR c++/29607 PR c++/29607
......
...@@ -4732,7 +4732,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -4732,7 +4732,8 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
} }
koenig_p = false; koenig_p = false;
if (idk == CP_ID_KIND_UNQUALIFIED) if (idk == CP_ID_KIND_UNQUALIFIED
|| idk == CP_ID_KIND_TEMPLATE_ID)
{ {
if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE) if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
{ {
......
...@@ -1801,6 +1801,13 @@ perform_koenig_lookup (tree fn, tree args) ...@@ -1801,6 +1801,13 @@ perform_koenig_lookup (tree fn, tree args)
{ {
tree identifier = NULL_TREE; tree identifier = NULL_TREE;
tree functions = NULL_TREE; tree functions = NULL_TREE;
tree tmpl_args = NULL_TREE;
if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
{
tmpl_args = TREE_OPERAND (fn, 1);
fn = TREE_OPERAND (fn, 0);
}
/* Find the name of the overloaded function. */ /* Find the name of the overloaded function. */
if (TREE_CODE (fn) == IDENTIFIER_NODE) if (TREE_CODE (fn) == IDENTIFIER_NODE)
...@@ -1820,7 +1827,8 @@ perform_koenig_lookup (tree fn, tree args) ...@@ -1820,7 +1827,8 @@ perform_koenig_lookup (tree fn, tree args)
Do Koenig lookup -- unless any of the arguments are Do Koenig lookup -- unless any of the arguments are
type-dependent. */ type-dependent. */
if (!any_type_dependent_arguments_p (args)) if (!any_type_dependent_arguments_p (args)
&& !any_dependent_template_arguments_p (tmpl_args))
{ {
fn = lookup_arg_dependent (identifier, functions, args); fn = lookup_arg_dependent (identifier, functions, args);
if (!fn) if (!fn)
...@@ -1828,6 +1836,9 @@ perform_koenig_lookup (tree fn, tree args) ...@@ -1828,6 +1836,9 @@ perform_koenig_lookup (tree fn, tree args)
fn = unqualified_fn_lookup_error (identifier); fn = unqualified_fn_lookup_error (identifier);
} }
if (fn && tmpl_args)
fn = build_nt (TEMPLATE_ID_EXPR, fn, tmpl_args);
return fn; return fn;
} }
......
...@@ -1175,8 +1175,9 @@ is_overloaded_fn (tree x) ...@@ -1175,8 +1175,9 @@ is_overloaded_fn (tree x)
x = TREE_OPERAND (x, 1); x = TREE_OPERAND (x, 1);
if (BASELINK_P (x)) if (BASELINK_P (x))
x = BASELINK_FUNCTIONS (x); x = BASELINK_FUNCTIONS (x);
if (TREE_CODE (x) == TEMPLATE_ID_EXPR if (TREE_CODE (x) == TEMPLATE_ID_EXPR)
|| DECL_FUNCTION_TEMPLATE_P (OVL_CURRENT (x)) x = TREE_OPERAND (x, 0);
if (DECL_FUNCTION_TEMPLATE_P (OVL_CURRENT (x))
|| (TREE_CODE (x) == OVERLOAD && OVL_CHAIN (x))) || (TREE_CODE (x) == OVERLOAD && OVL_CHAIN (x)))
return 2; return 2;
return (TREE_CODE (x) == FUNCTION_DECL return (TREE_CODE (x) == FUNCTION_DECL
...@@ -1202,6 +1203,8 @@ get_first_fn (tree from) ...@@ -1202,6 +1203,8 @@ get_first_fn (tree from)
from = TREE_OPERAND (from, 1); from = TREE_OPERAND (from, 1);
if (BASELINK_P (from)) if (BASELINK_P (from))
from = BASELINK_FUNCTIONS (from); from = BASELINK_FUNCTIONS (from);
if (TREE_CODE (from) == TEMPLATE_ID_EXPR)
from = TREE_OPERAND (from, 0);
return OVL_CURRENT (from); return OVL_CURRENT (from);
} }
......
2009-03-04 Jason Merrill <jason@redhat.com>
PR c++/13549
* g++.dg/template/koenig7.C: New test.
2009-03-04 Nathan Sidwell <nathan@codesourcery.com> 2009-03-04 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/torture/predcom-1.C: New test. * g++.dg/torture/predcom-1.C: New test.
......
// PR c++/13549
// We need to do arg-dep lookup for g<T>(j) at instantiation time because
// g<T> is dependent, even though (j) is not; at that point we can find
// g(h).
template <typename T> int g(int);
class h{};
template <typename T> int l(){h j; return g<T>(j);}
template <typename T> int g(const h&);
class j{};
int jj(){return l<j>();}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment