aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1999-04-14 12:16:39 +0000
committerJason Merrill <jason@gcc.gnu.org>1999-04-14 08:16:39 -0400
commitfbf6f1bae6dcd6010aff66685662a15ea50d4a00 (patch)
treee264b369d5078e8687420b2a3364d8c41a839577 /gcc
parent613f2fe6e68d61d28118f29a2d8ae290fe5b0bcb (diff)
downloadgcc-fbf6f1bae6dcd6010aff66685662a15ea50d4a00.zip
gcc-fbf6f1bae6dcd6010aff66685662a15ea50d4a00.tar.gz
gcc-fbf6f1bae6dcd6010aff66685662a15ea50d4a00.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/typeck.c22
2 files changed, 27 insertions, 0 deletions
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 <jason@yorick.cygnus.com>
+
+ * typeck.c (build_unary_op): Handle taking the address of a unique
+ bound non-static member function.
+
1999-04-13 Martin von Loewis <loewis@informatik.hu-berlin.de>
* 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);