aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2000-12-05 15:35:59 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2000-12-05 15:35:59 +0000
commit61402b802aafc9dfc34536858decdefce1748bf6 (patch)
tree936afa192edd41da88d835e592de28663dd4890b /gcc
parent4839149c4ce8911c2532bb8f32e82d0aa9c28410 (diff)
downloadgcc-61402b802aafc9dfc34536858decdefce1748bf6.zip
gcc-61402b802aafc9dfc34536858decdefce1748bf6.tar.gz
gcc-61402b802aafc9dfc34536858decdefce1748bf6.tar.bz2
typeck.c (get_delta_difference): If via a virtual base, return zero.
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cvt.c12
-rw-r--r--gcc/cp/typeck.c24
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/pmf5.C31
5 files changed, 34 insertions, 44 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c3a36ab..e2d7226 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index fe99c8f..1672f26 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -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))
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 803c1c0..b426e76 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f9630fe..54d8296 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 685801a..0000000
--- a/gcc/testsuite/g++.old-deja/g++.mike/pmf5.C
+++ /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);
-}