re PR c++/48594 (Rejects valid with pointer-to-member in template)

PR c++/48594
	* decl2.c (build_offset_ref_call_from_tree): Fix calling a functor
	or pointer to (non-member) function.

From-SVN: r172394
This commit is contained in:
Jason Merrill 2011-04-13 16:50:26 -04:00 committed by Jason Merrill
parent 4b1a46942e
commit 516d9427ed
4 changed files with 46 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2011-04-13 Jason Merrill <jason@redhat.com>
PR c++/48594
* decl2.c (build_offset_ref_call_from_tree): Fix calling a functor
or pointer to (non-member) function.
2011-04-13 Jakub Jelinek <jakub@redhat.com>
PR c++/48570

View File

@ -4081,10 +4081,13 @@ build_offset_ref_call_from_tree (tree fn, VEC(tree,gc) **args)
parameter. That must be done before the FN is transformed
because we depend on the form of FN. */
make_args_non_dependent (*args);
object = build_non_dependent_expr (object);
if (TREE_CODE (fn) == DOTSTAR_EXPR)
object = cp_build_addr_expr (object, tf_warning_or_error);
VEC_safe_insert (tree, gc, *args, 0, object);
if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE)
{
object = build_non_dependent_expr (object);
if (TREE_CODE (fn) == DOTSTAR_EXPR)
object = cp_build_addr_expr (object, tf_warning_or_error);
VEC_safe_insert (tree, gc, *args, 0, object);
}
/* Now that the arguments are done, transform FN. */
fn = build_non_dependent_expr (fn);
}
@ -4103,7 +4106,10 @@ build_offset_ref_call_from_tree (tree fn, VEC(tree,gc) **args)
VEC_safe_insert (tree, gc, *args, 0, object_addr);
}
expr = cp_build_function_call_vec (fn, args, tf_warning_or_error);
if (CLASS_TYPE_P (TREE_TYPE (fn)))
expr = build_op_call (fn, args, tf_warning_or_error);
else
expr = cp_build_function_call_vec (fn, args, tf_warning_or_error);
if (processing_template_decl && expr != error_mark_node)
expr = build_min_non_dep_call_vec (expr, orig_fn, orig_args);

View File

@ -1,3 +1,7 @@
2011-04-13 Jason Merrill <jason@redhat.com>
* g++.dg/template/operator11.C: New.
2011-04-13 Jakub Jelinek <jakub@redhat.com>
PR middle-end/48591

View File

@ -0,0 +1,25 @@
// PR c++/48594
// Test for uses of (X->*Y)() that don't actually involve a
// pointer to member function.
struct A { } a;
struct B { } b;
struct C * cp;
struct Func { void operator()(); };
Func operator->* (A, int);
typedef void (*pfn)();
pfn operator->* (B, int);
pfn C::*cpfn;
Func C::*cfunc;
template <class T>
void f()
{
(a->*1)();
(b->*1)();
(cp->*cpfn)();
(cp->*cfunc)();
}