cvt.c (cp_fold_convert): Use convert_ptrmem.
authorJason Merrill <jason@redhat.com>
Fri, 27 Apr 2018 17:09:17 +0000 (13:09 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 27 Apr 2018 17:09:17 +0000 (13:09 -0400)
* cvt.c (cp_fold_convert): Use convert_ptrmem.

* typeck.c (convert_ptrmem): Add a NOP even if no adjustment.

From-SVN: r259717

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

index 552828fa3eaf66d9cf60adaa7d72fe2ad0b0c5e9..2dbc67501c5c131ac7aecce62ab0824e7559542b 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-27  Jason Merrill  <jason@redhat.com>
+
+       * cvt.c (cp_fold_convert): Use convert_ptrmem.
+       * typeck.c (convert_ptrmem): Add a NOP even if no adjustment.
+
 2018-04-27  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/84691
index 0f045e2ab1266a80727222bfdcd8167fd2d171b6..d9e3cb520c3f0ac140e6c7ddb059719e0c15207d 100644 (file)
@@ -601,16 +601,20 @@ cp_fold_convert (tree type, tree expr)
   tree conv;
   if (TREE_TYPE (expr) == type)
     conv = expr;
-  else if (TREE_CODE (expr) == PTRMEM_CST)
+  else if (TREE_CODE (expr) == PTRMEM_CST
+          && same_type_p (TYPE_PTRMEM_CLASS_TYPE (type),
+                          PTRMEM_CST_CLASS (expr)))
     {
       /* Avoid wrapping a PTRMEM_CST in NOP_EXPR.  */
       conv = copy_node (expr);
       TREE_TYPE (conv) = type;
     }
-  else if (TREE_CODE (expr) == CONSTRUCTOR
-          && TYPE_PTRMEMFUNC_P (type))
-    conv = build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
-                            true, false, tf_warning_or_error);
+  else if (TYPE_PTRMEM_P (type))
+    {
+      conv = convert_ptrmem (type, expr, true, false,
+                            tf_warning_or_error);
+      conv = cp_fully_fold (conv);
+    }
   else
     {
       conv = fold_convert (type, expr);
index 19db3154e81b948c1f4be84da4c8bff67a277525..05ae00ed6dffdb3832a8d8c8b3e49bcb44d5ff5e 100644 (file)
@@ -6844,15 +6844,16 @@ convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
 
   if (TYPE_PTRDATAMEM_P (type))
     {
+      tree obase = TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr));
+      tree nbase = TYPE_PTRMEM_CLASS_TYPE (type);
       tree delta = (get_delta_difference
-                   (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)),
-                    TYPE_PTRMEM_CLASS_TYPE (type),
+                   (obase, nbase,
                     allow_inverse_p, c_cast_p, complain));
 
       if (delta == error_mark_node)
        return error_mark_node;
 
-      if (!integer_zerop (delta))
+      if (!same_type_p (obase, nbase))
        {
          if (TREE_CODE (expr) == PTRMEM_CST)
            expr = cplus_expand_constant (expr);