From fbf6f1bae6dcd6010aff66685662a15ea50d4a00 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 14 Apr 1999 12:16:39 +0000 Subject: [PATCH] typeck.c (build_unary_op): Handle taking the address of a unique bound non-static member function. * typeck.c (build_unary_op): Handle taking the address of a unique bound non-static member function. From-SVN: r26451 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/typeck.c | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2f00fdd..4e867bc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-04-14 Jason Merrill + + * typeck.c (build_unary_op): Handle taking the address of a unique + bound non-static member function. + 1999-04-13 Martin von Loewis * lang-options.h (-Wdeprecated): New flag. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index c210410..fd21ed0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4685,6 +4685,28 @@ build_unary_op (code, xarg, noconvert) return build1 (ADDR_EXPR, unknown_type_node, arg); } + if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg) + && OVL_NEXT (TREE_OPERAND (arg, 1)) == NULL_TREE) + { + /* They're trying to take the address of a unique non-static + member function. This is ill-formed, but let's try to DTRT. */ + tree base, name; + + if (current_class_type + && TREE_OPERAND (arg, 0) == current_class_ref) + /* An expression like &memfn. */ + pedwarn ("taking the address of a non-static member function"); + else + pedwarn ("taking the address of a bound member function"); + + base = TREE_TYPE (TREE_OPERAND (arg, 0)); + name = DECL_NAME (OVL_CURRENT (TREE_OPERAND (arg, 1))); + + cp_pedwarn (" to form a pointer to member function, say `&%T::%D'", + base, name); + arg = build_offset_ref (base, name); + } + if (type_unknown_p (arg)) return build1 (ADDR_EXPR, unknown_type_node, arg); -- 2.7.4