Commit 5094a795 by Jason Merrill Committed by Jason Merrill

PR c++/38030, 38850, 39070

        PR c++/38030, 38850, 39070
        * pt.c (type_dependent_expression_p_push): New fn.
        (tsubst_copy_and_build) [CALL_EXPR]: Only do arg-dep lookup when the
        substitution makes the call non-dependent.  Preserve koenig_p.
        * parser.c (cp_parser_postfix_expression): Only do arg-dep lookup
        for non-dependent calls.
        * semantics.c (finish_call_expr): Revert earlier changes.
        * cp-tree.h: Revert change to finish_call_expr prototype.

From-SVN: r145360
parent 60081874
2009-03-30 Jason Merrill <jason@redhat.com>
PR c++/38030, 38850, 39070
* pt.c (type_dependent_expression_p_push): New fn.
(tsubst_copy_and_build) [CALL_EXPR]: Only do arg-dep lookup when the
substitution makes the call non-dependent. Preserve koenig_p.
* parser.c (cp_parser_postfix_expression): Only do arg-dep lookup
for non-dependent calls.
* semantics.c (finish_call_expr): Revert earlier changes.
* cp-tree.h: Revert change to finish_call_expr prototype.
2009-03-29 Joseph Myers <joseph@codesourcery.com> 2009-03-29 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/34695 PR preprocessor/34695
......
...@@ -4602,6 +4602,7 @@ extern bool dependent_template_p (tree); ...@@ -4602,6 +4602,7 @@ extern bool dependent_template_p (tree);
extern bool dependent_template_id_p (tree, tree); extern bool dependent_template_id_p (tree, tree);
extern bool type_dependent_expression_p (tree); extern bool type_dependent_expression_p (tree);
extern bool any_type_dependent_arguments_p (const_tree); extern bool any_type_dependent_arguments_p (const_tree);
extern bool type_dependent_expression_p_push (tree);
extern bool value_dependent_expression_p (tree); extern bool value_dependent_expression_p (tree);
extern bool any_value_dependent_elements_p (const_tree); extern bool any_value_dependent_elements_p (const_tree);
extern bool dependent_omp_for_p (tree, tree, tree, tree); extern bool dependent_omp_for_p (tree, tree, tree, tree);
...@@ -4761,7 +4762,7 @@ extern tree finish_stmt_expr_expr (tree, tree); ...@@ -4761,7 +4762,7 @@ extern tree finish_stmt_expr_expr (tree, tree);
extern tree finish_stmt_expr (tree, bool); extern tree finish_stmt_expr (tree, bool);
extern tree stmt_expr_value_expr (tree); extern tree stmt_expr_value_expr (tree);
extern tree perform_koenig_lookup (tree, tree); extern tree perform_koenig_lookup (tree, tree);
extern tree finish_call_expr (tree, tree, bool, int, extern tree finish_call_expr (tree, tree, bool, bool,
tsubst_flags_t); tsubst_flags_t);
extern tree finish_increment_expr (tree, enum tree_code); extern tree finish_increment_expr (tree, enum tree_code);
extern tree finish_this_expr (void); extern tree finish_this_expr (void);
......
...@@ -4738,8 +4738,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -4738,8 +4738,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
if (args) if (args)
{ {
koenig_p = true; koenig_p = true;
postfix_expression if (!any_type_dependent_arguments_p (args))
= perform_koenig_lookup (postfix_expression, args); postfix_expression
= perform_koenig_lookup (postfix_expression, args);
} }
else else
postfix_expression postfix_expression
...@@ -4761,8 +4762,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -4761,8 +4762,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
if (!DECL_FUNCTION_MEMBER_P (fn)) if (!DECL_FUNCTION_MEMBER_P (fn))
{ {
koenig_p = true; koenig_p = true;
postfix_expression if (!any_type_dependent_arguments_p (args))
= perform_koenig_lookup (postfix_expression, args); postfix_expression
= perform_koenig_lookup (postfix_expression, args);
} }
} }
} }
......
...@@ -11450,7 +11450,11 @@ tsubst_copy_and_build (tree t, ...@@ -11450,7 +11450,11 @@ tsubst_copy_and_build (tree t,
not appropriate, even if an unqualified-name was used not appropriate, even if an unqualified-name was used
to denote the function. */ to denote the function. */
&& !DECL_FUNCTION_MEMBER_P (get_first_fn (function))) && !DECL_FUNCTION_MEMBER_P (get_first_fn (function)))
|| TREE_CODE (function) == IDENTIFIER_NODE)) || TREE_CODE (function) == IDENTIFIER_NODE)
/* Only do this when substitution turns a dependent call
into a non-dependent call. */
&& type_dependent_expression_p_push (t)
&& !any_type_dependent_arguments_p (call_args))
function = perform_koenig_lookup (function, call_args); function = perform_koenig_lookup (function, call_args);
if (TREE_CODE (function) == IDENTIFIER_NODE) if (TREE_CODE (function) == IDENTIFIER_NODE)
...@@ -11481,12 +11485,9 @@ tsubst_copy_and_build (tree t, ...@@ -11481,12 +11485,9 @@ tsubst_copy_and_build (tree t,
/*fn_p=*/NULL, /*fn_p=*/NULL,
complain)); complain));
} }
/* Pass -1 for koenig_p so that build_new_function_call will
allow hidden friends found by arg-dependent lookup at template
parsing time. */
return finish_call_expr (function, call_args, return finish_call_expr (function, call_args,
/*disallow_virtual=*/qualified_p, /*disallow_virtual=*/qualified_p,
/*koenig_p*/-1, koenig_p,
complain); complain);
} }
...@@ -16454,6 +16455,19 @@ type_dependent_expression_p (tree expression) ...@@ -16454,6 +16455,19 @@ type_dependent_expression_p (tree expression)
return (dependent_type_p (TREE_TYPE (expression))); return (dependent_type_p (TREE_TYPE (expression)));
} }
/* Like type_dependent_expression_p, but it also works while not processing
a template definition, i.e. during substitution or mangling. */
bool
type_dependent_expression_p_push (tree expr)
{
bool b;
++processing_template_decl;
b = type_dependent_expression_p (expr);
--processing_template_decl;
return b;
}
/* Returns TRUE if ARGS (a TREE_LIST of arguments to a function call) /* Returns TRUE if ARGS (a TREE_LIST of arguments to a function call)
contains a type-dependent expression. */ contains a type-dependent expression. */
......
...@@ -1836,14 +1836,10 @@ perform_koenig_lookup (tree fn, tree args) ...@@ -1836,14 +1836,10 @@ perform_koenig_lookup (tree fn, tree args)
qualified. For example a call to `X::f' never generates a virtual qualified. For example a call to `X::f' never generates a virtual
call.) call.)
KOENIG_P is 1 if we want to perform argument-dependent lookup,
-1 if we don't, but we want to accept functions found by previous
argument-dependent lookup, and 0 if we want nothing to do with it.
Returns code for the call. */ Returns code for the call. */
tree tree
finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p, finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p,
tsubst_flags_t complain) tsubst_flags_t complain)
{ {
tree result; tree result;
...@@ -1866,7 +1862,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p, ...@@ -1866,7 +1862,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p,
|| any_type_dependent_arguments_p (args)) || any_type_dependent_arguments_p (args))
{ {
result = build_nt_call_list (fn, args); result = build_nt_call_list (fn, args);
KOENIG_LOOKUP_P (result) = koenig_p > 0; KOENIG_LOOKUP_P (result) = koenig_p;
if (cfun) if (cfun)
{ {
do do
...@@ -1956,7 +1952,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p, ...@@ -1956,7 +1952,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p,
if (!result) if (!result)
/* A call to a namespace-scope function. */ /* A call to a namespace-scope function. */
result = build_new_function_call (fn, args, koenig_p != 0, complain); result = build_new_function_call (fn, args, koenig_p, complain);
} }
else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR) else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR)
{ {
...@@ -1982,9 +1978,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p, ...@@ -1982,9 +1978,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, int koenig_p,
if (processing_template_decl) if (processing_template_decl)
{ {
result = build_call_list (TREE_TYPE (result), orig_fn, orig_args); result = build_call_list (TREE_TYPE (result), orig_fn, orig_args);
/* Don't repeat arg-dependent lookup at instantiation time if this call KOENIG_LOOKUP_P (result) = koenig_p;
is not type-dependent. */
KOENIG_LOOKUP_P (result) = 0;
} }
return result; return result;
} }
......
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