diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1999-04-14 12:16:39 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1999-04-14 08:16:39 -0400 |
commit | fbf6f1bae6dcd6010aff66685662a15ea50d4a00 (patch) | |
tree | e264b369d5078e8687420b2a3364d8c41a839577 /gcc | |
parent | 613f2fe6e68d61d28118f29a2d8ae290fe5b0bcb (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 22 |
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); |