From 61402b802aafc9dfc34536858decdefce1748bf6 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 5 Dec 2000 15:35:59 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cvt.c | 12 +++++++----- gcc/cp/typeck.c | 24 +++++++++++++++-------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.old-deja/g++.mike/pmf5.C | 31 ------------------------------ 5 files changed, 34 insertions(+), 44 deletions(-) delete mode 100644 gcc/testsuite/g++.old-deja/g++.mike/pmf5.C 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 + + * 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 * 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 + + * g++.old-deja/g++.mike/pmf5.C: Remove test. + 2000-12-05 Richard Henderson * 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); -} -- 2.7.4