OSDN Git Service

* typeck.c (build_unary_op): Handle taking the address of a unique
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Apr 1999 12:16:39 +0000 (12:16 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Apr 1999 12:16:39 +0000 (12:16 +0000)
bound non-static member function.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26451 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c

index 2f00fdd..4e867bc 100644 (file)
@@ -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.
index c210410..fd21ed0 100644 (file)
@@ -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);