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