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