GCC screws up pointer->ulong conversion on 32 bit systems
Iain Buclaw
ibuclaw at ubuntu.com
Sun Nov 24 03:50:43 PST 2013
On Saturday, 9 November 2013 at 17:53:41 UTC, Johannes Pfau wrote:
> Am Sat, 9 Nov 2013 17:01:43 +0000
> schrieb Iain Buclaw <ibuclaw at ubuntu.com>:
>
>> On 9 November 2013 12:19, Johannes Pfau <nospam at example.com>
>> wrote:
>> > The fix is simple:
>> > in gcc/convert.c(convert_to_integer):
>> >
>> > /* Convert to an unsigned integer of the correct width
>> > first, and
>> > from there widen/truncate to the required type. Some targets
>> > support the coexistence of multiple valid pointer sizes, so
>> > fetch
>> > the one we need from the type. */
>> > expr = fold_build1 (CONVERT_EXPR,
>> > lang_hooks.types.type_for_size
>> > (TYPE_PRECISION (intype), 0),
>> > expr);
>> >
>> >
>> That code does seem to contradict what the comment is saying.
>> I'll
>> raise it in #gcc and send a patch (unless you want to do it).
>>
>>
>
> It indeed seems like it's only a small oversight. It'd be
> great if you could report it.
Apparently it's working as per C semantics, which means the
behavior is undefined. I've mentioned that it makes no sense
that documentation/code don't match comments. But all I've heard
back is that you shouldn't use convert_to_integer in the front
end (except maybe through convert() - which I am 90% certain is
the case with us), and to implement our own semantics if we say
that pointer to integer conversion is clearly defined in D.
Regards
Iain.
More information about the D.gnu
mailing list