typeck.c (get_member_function_from_ptrfunc): Allow extraction of function pointer...
authorMartin v. Löwis <loewis@informatik.hu-berlin.de>
Tue, 21 Sep 1999 19:49:04 +0000 (19:49 +0000)
committerMartin v. Löwis <loewis@gcc.gnu.org>
Tue, 21 Sep 1999 19:49:04 +0000 (19:49 +0000)
* typeck.c (get_member_function_from_ptrfunc): Allow extraction of
function pointer from pmfs with no object given.
(convert_for_assignment): Do not return error when converting
pmfs.

From-SVN: r29559

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

index 2fc11ec..fecaede 100644 (file)
@@ -1,3 +1,10 @@
+1999-09-21  Martin v. Löwis  <loewis@informatik.hu-berlin.de>
+
+       * typeck.c (get_member_function_from_ptrfunc): Allow extraction of
+       function pointer from pmfs with no object given.
+       (convert_for_assignment): Do not return error when converting
+       pmfs.
+
 1999-09-21  Alex Samuel  <samuel@codesourcery.com>
 
        * lex.c (internal_filename): New variable.
index f4cdc92..a4d0255 100644 (file)
@@ -2808,6 +2808,17 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
 
       tree instance_ptr = *instance_ptrptr;
 
+      if (instance_ptr == error_mark_node
+         && TREE_CODE (function) == PTRMEM_CST)
+       {
+         /* Extracting the function address from a pmf is only
+            allowed with -Wno-pmf-conversions. It only works for
+            pmf constants. */
+         e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
+         e1 = convert (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function)), e1);
+         return e1;
+       }
+
       if (TREE_SIDE_EFFECTS (instance_ptr))
        instance_ptr = save_expr (instance_ptr);
 
@@ -6425,25 +6436,28 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
      cv-unqualified type of the left operand.  */
   if (!can_convert_arg (type, rhstype, rhs))
     {
-      /* When -Wno-pmf-converions is use, we just silently allow
+      /* When -Wno-pmf-conversions is use, we just silently allow
         conversions from pointers-to-members to plain pointers.  If
         the conversion doesn't work, cp_convert will complain.  */
       if (!warn_pmf2ptr 
          && TYPE_PTR_P (type) 
          && TYPE_PTRMEMFUNC_P (rhstype))
        rhs = cp_convert (strip_top_quals (type), rhs);
-      /* If the right-hand side has unknown type, then it is an
-        overloaded function.  Call instantiate_type to get error
-        messages.  */
-      else if (rhstype == unknown_type_node)
-       instantiate_type (type, rhs, 1);
-      else if (fndecl)
-       cp_error ("cannot convert `%T' to `%T' for argument `%P' to `%D'",
-                 rhstype, type, parmnum, fndecl);
-      else
-       cp_error ("cannot convert `%T' to `%T' in %s", rhstype, type, 
-                 errtype);
-      return error_mark_node;
+      else 
+       {
+         /* If the right-hand side has unknown type, then it is an
+            overloaded function.  Call instantiate_type to get error
+            messages.  */
+         if (rhstype == unknown_type_node)
+           instantiate_type (type, rhs, 1);
+         else if (fndecl)
+           cp_error ("cannot convert `%T' to `%T' for argument `%P' to `%D'",
+                     rhstype, type, parmnum, fndecl);
+         else
+           cp_error ("cannot convert `%T' to `%T' in %s", rhstype, type, 
+                     errtype);
+         return error_mark_node;
+       }
     }
   return perform_implicit_conversion (strip_top_quals (type), rhs);
 }