PATCH: C++ pointer to member conversion fixes
Ollie Wild
aaw@google.com
Mon Aug 20 19:45:00 GMT 2007
This patch implements a number of related fixes to C++ pointer to
member conversions.
According to the C++ standard, a pointer to member conversion maps
null pointers to members of the source type to null pointers to
members of the destination type. GCC gets this wrong when multiple
inheritance forces a pointer to data member offset to be updated.
This patch fixes the problem by generating a conditional expression
inside convert_ptrmem.
It also refactors cp_convert_to_pointer by calling convert_ptrmem and
removing the unnecessary force parameter, and it refactors
get_delta_difference, by pushing some duplicate checks inside
get_delta_difference_1 (which has the side effect of adding a missing
check which resulted in an ICE).
To rectify a lack of pointer to member conversion tests, I've created
7 new tests which exercise various functionality. Of these, only 5
pass without this patch.
Tested with a C/C++/Java bootstrap and testsuite on i686-pc-linux-gnu.
Ollie
:ADDPATCH c++:
2007-08-20 Ollie Wild <aaw@google.com>
* cvt.c (cp_convert_to_pointer): Remove force parameter. Call
convert_ptrmem for pointer to member conversions.
(convert_to_pointer_force): Update cp_convert_to_pointer call.
(ocp_convert): Update cp_convert_to_pointer call.
* typeck.c (convert_ptrmem): Add conditional for null pointers to
members.
(build_static_cast_1): Check can_convert for conversions in either
direction.
(get_delta_difference_1): New function.
(get_delta_difference): Refactor to call get_delta_difference_1.
2007-08-20 Ollie Wild <aaw@google.com>
g++.dg/conversion/ptrmem2.C: New test.
g++.dg/conversion/ptrmem3.C: New test.
g++.dg/conversion/ptrmem4.C: New test.
g++.dg/conversion/ptrmem5.C: New test.
g++.dg/conversion/ptrmem6.C: New test.
g++.dg/conversion/ptrmem7.C: New test.
g++.dg/conversion/ptrmem8.C: New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: convert_ptrmem.patch
Type: text/x-patch
Size: 17481 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20070820/4fb757d5/attachment.bin>
More information about the Gcc-patches
mailing list