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
|
@ -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>
|
2011-04-13 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/48570
|
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
|
parameter. That must be done before the FN is transformed
|
||||||
because we depend on the form of FN. */
|
because we depend on the form of FN. */
|
||||||
make_args_non_dependent (*args);
|
make_args_non_dependent (*args);
|
||||||
object = build_non_dependent_expr (object);
|
if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE)
|
||||||
if (TREE_CODE (fn) == DOTSTAR_EXPR)
|
{
|
||||||
object = cp_build_addr_expr (object, tf_warning_or_error);
|
object = build_non_dependent_expr (object);
|
||||||
VEC_safe_insert (tree, gc, *args, 0, 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. */
|
/* Now that the arguments are done, transform FN. */
|
||||||
fn = build_non_dependent_expr (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);
|
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)
|
if (processing_template_decl && expr != error_mark_node)
|
||||||
expr = build_min_non_dep_call_vec (expr, orig_fn, orig_args);
|
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>
|
2011-04-13 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR middle-end/48591
|
PR middle-end/48591
|
||||||
|
|
|
@ -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…
Reference in New Issue