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:
parent
4b1a46942e
commit
516d9427ed
4 changed files with 46 additions and 5 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
25
gcc/testsuite/g++.dg/template/operator11.C
Normal file
25
gcc/testsuite/g++.dg/template/operator11.C
Normal 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)();
|
||||
}
|
Loading…
Add table
Reference in a new issue