]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
typeck.c (get_delta_difference): If via a virtual base, return zero.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 5 Dec 2000 15:35:59 +0000 (15:35 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 5 Dec 2000 15:35:59 +0000 (15:35 +0000)
cp:
* typeck.c (get_delta_difference): If via a virtual base,
return zero.
* cvt.c (cp_convert_to_pointer): If via a virtual base, do no
adjustment.
testsuite:
* g++.old-deja/g++.mike/pmf5.C: Remove test.

From-SVN: r38039

gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.mike/pmf5.C [deleted file]

index c3a36ab0d022bdf07d4b9ff2a68b553cc4c3e184..e2d722665477d204cddf08a12f29c11176fec182 100644 (file)
@@ -1,3 +1,10 @@
+2000-12-05  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * typeck.c (get_delta_difference): If via a virtual base,
+       return zero.
+       * cvt.c (cp_convert_to_pointer): If via a virtual base, do no
+       adjustment.
+
 2000-12-04  Richard Henderson  <rth@redhat.com>
 
        * error.c (dump_tree): Use output_add_string not OB_PUTS.
index fe99c8f566e914ac8316cd14ae69ce4e0bf7c577..1672f26f82bc3916ba457c9787b531abe4059a08 100644 (file)
@@ -209,10 +209,9 @@ cp_convert_to_pointer (type, expr, force)
           if (virt_binfo)
            {
              if (force)
-               cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
+               cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
                            BINFO_TYPE (virt_binfo),
-                            BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)),
-                            code == MINUS_EXPR ? b2 : b1);
+                            BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
               else
                 {
                  cp_error ("pointer to member cast via virtual base `%T' of `%T'",
@@ -220,13 +219,16 @@ cp_convert_to_pointer (type, expr, force)
                             BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
                  return error_mark_node;
                }
+             /* This is a reinterpret cast, whose result is unspecified.
+                We choose to do nothing.  */
+             return build1 (NOP_EXPR, type, expr);
            }
              
          if (TREE_CODE (expr) == PTRMEM_CST)
            expr = cplus_expand_constant (expr);
 
-         if (binfo && ! TREE_VIA_VIRTUAL (binfo))
-           expr = size_binop (code, convert (sizetype,expr),
+         if (binfo)
+           expr = size_binop (code, convert (sizetype, expr),
                               BINFO_OFFSET (binfo));
        }
       else if (TYPE_PTRMEMFUNC_P (type))
index 803c1c00c1453a167098186b907354fae144f4d0..b426e76748c35a8820d0ae52cc953aa62d0ddf33 100644 (file)
@@ -5936,31 +5936,39 @@ get_delta_difference (from, to, force)
       virt_binfo = binfo_from_vbase (binfo);
       
       if (virt_binfo)
-        cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
-                   BINFO_TYPE (virt_binfo),
-                   BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)), from);
+        {
+          /* This is a reinterpret cast, we choose to do nothing. */
+          cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
+                     BINFO_TYPE (virt_binfo),
+                     BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
+          return delta;
+        }
       delta = BINFO_OFFSET (binfo);
       delta = cp_convert (ptrdiff_type_node, delta);
-      
-      return cp_build_binary_op (MINUS_EXPR,
+      delta = cp_build_binary_op (MINUS_EXPR,
                                 integer_zero_node,
                                 delta);
+
+      return delta;
     }
 
   virt_binfo = binfo_from_vbase (binfo);
   if (virt_binfo)
     {
+      /* This is a reinterpret cast, we choose to do nothing. */
       if (force)
-        cp_warning ("pointer to member cast via virtual base `%T' of `%T' will only work for objects of dynamic type `%T'",
+        cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
                     BINFO_TYPE (virt_binfo),
-                    BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)), to);
+                    BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
       else
        cp_error ("pointer to member conversion via virtual base `%T' of `%T'",
                  BINFO_TYPE (virt_binfo),
                   BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
+      return delta;
     }
+  delta = BINFO_OFFSET (binfo);
 
-  return BINFO_OFFSET (binfo);
+  return cp_convert (ptrdiff_type_node, delta);
 }
 
 /* Return a constructor for the pointer-to-member-function TYPE using
index f9630fee3baa804aa8ac891054abfa7f2c8c77f1..54d8296deafd549d0a40d477cc13023fc97ec664 100644 (file)
@@ -1,3 +1,7 @@
+2000-12-05  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.mike/pmf5.C: Remove test.
+
 2000-12-05  Richard Henderson  <rth@redhat.com>
 
        * gcc.c-torture/compile/20001205-1.c: New.
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/pmf5.C b/gcc/testsuite/g++.old-deja/g++.mike/pmf5.C
deleted file mode 100644 (file)
index 685801a..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// Special g++ Options: -w
-
-class A {
-  int j;
-};
-
-class Space {
-  int j;
-};
-
-typedef int (A::*pma)();
-
-class B : public Space, virtual public A {
-public:
-  int i;
-  int foo () {
-    return i!=42;
-  }
-  B() {
-    i = 42;
-  }
-};
-
-int call_base (A* ap, pma pmf) {
-  return (ap->*pmf)();
-}
-
-int main() {
-  B b;
-  return call_base ((A*)&b, (pma)&B::foo);
-}