diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2000-12-05 15:35:59 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2000-12-05 15:35:59 +0000 |
commit | 61402b802aafc9dfc34536858decdefce1748bf6 (patch) | |
tree | 936afa192edd41da88d835e592de28663dd4890b /gcc | |
parent | 4839149c4ce8911c2532bb8f32e82d0aa9c28410 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 12 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.mike/pmf5.C | 31 |
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); -} |