aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/cvt.c
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/cp/cvt.c
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/cp/cvt.c')
-rw-r--r--gcc/cp/cvt.c12
1 files changed, 7 insertions, 5 deletions
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))