This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ PATCH] Fix bug 827
- To: Jason Merrill <jason at redhat dot com>
- Subject: Re: [C++ PATCH] Fix bug 827
- From: Nathan Sidwell <nathan at codesourcery dot com>
- Date: Tue, 05 Dec 2000 14:19:46 +0000
- CC: gcc-patches at gcc dot gnu dot org
- Organization: Codesourcery LLC
- References: <3A224C47.688B5963@codesourcery.com> <u9lmu55omh.fsf@casey.soma.redhat.com> <3A23CBC0.4724CC8B@codesourcery.com> <u9ofyx5t1u.fsf@casey.soma.redhat.com> <3A27A382.8092419@codesourcery.com> <u9y9y0gkfl.fsf@casey.soma.redhat.com>
Jason Merrill wrote:
> > + return expr;
>
> We still need to build a NOP_EXPR around it.
Yes, of course.
Built & tested on i686-pc-linux-gnu.
This one ok?
I'll remove g++.mike/pmf5.C from the testsuite, if this goes in.
nathan
--
Dr Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery LLC
'But that's a lie.' - 'Yes it is. What's your point?'
nathan@codesourcery.com : http://www.cs.bris.ac.uk/~nathan/ : nathan@acm.org
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.
Index: cp/typeck.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/typeck.c,v
retrieving revision 1.324
diff -c -3 -p -r1.324 typeck.c
*** typeck.c 2000/12/04 16:36:04 1.324
--- typeck.c 2000/12/05 10:52:44
*************** get_delta_difference (from, to, force)
*** 5936,5966 ****
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);
delta = BINFO_OFFSET (binfo);
delta = cp_convert (ptrdiff_type_node, delta);
!
! return cp_build_binary_op (MINUS_EXPR,
integer_zero_node,
delta);
}
virt_binfo = binfo_from_vbase (binfo);
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'",
BINFO_TYPE (virt_binfo),
! BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)), to);
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 BINFO_OFFSET (binfo);
}
/* Return a constructor for the pointer-to-member-function TYPE using
--- 5936,5974 ----
virt_binfo = binfo_from_vbase (binfo);
if (virt_binfo)
! {
! /* 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);
! 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'",
BINFO_TYPE (virt_binfo),
! 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 cp_convert (ptrdiff_type_node, delta);
}
/* Return a constructor for the pointer-to-member-function TYPE using
Index: cp/cvt.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/cvt.c,v
retrieving revision 1.90
diff -c -3 -p -r1.90 cvt.c
*** cvt.c 2000/11/27 10:55:30 1.90
--- cvt.c 2000/12/05 10:52:46
*************** cp_convert_to_pointer (type, expr, force
*** 209,218 ****
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'",
BINFO_TYPE (virt_binfo),
! BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)),
! code == MINUS_EXPR ? b2 : b1);
else
{
cp_error ("pointer to member cast via virtual base `%T' of `%T'",
--- 209,217 ----
if (virt_binfo)
{
if (force)
! cp_warning ("pointer to member cast via virtual base `%T' of `%T'",
BINFO_TYPE (virt_binfo),
! BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
else
{
cp_error ("pointer to member cast via virtual base `%T' of `%T'",
*************** cp_convert_to_pointer (type, expr, force
*** 220,232 ****
BINFO_TYPE (BINFO_INHERITANCE_CHAIN (virt_binfo)));
return error_mark_node;
}
}
if (TREE_CODE (expr) == PTRMEM_CST)
expr = cplus_expand_constant (expr);
! if (binfo && ! TREE_VIA_VIRTUAL (binfo))
! expr = size_binop (code, convert (sizetype,expr),
BINFO_OFFSET (binfo));
}
else if (TYPE_PTRMEMFUNC_P (type))
--- 219,234 ----
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)
! expr = size_binop (code, convert (sizetype, expr),
BINFO_OFFSET (binfo));
}
else if (TYPE_PTRMEMFUNC_P (type))