<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 9 November 2013 12:19, Johannes Pfau <span dir="ltr"><<a href="mailto:nospam@example.com" target="_blank">nospam@example.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

----------------------------------------------<br>
#include <stdio.h><br>
#include <stdint.h><br>
<br>
void test(void* p)<br>
{<br>
    uint64_t pl = (uint64_t)p;<br>
    uint64_t p2 = (uint64_t)(int)p;<br>
    int tmp = (int)p;<br>
    uint64_t p3 = (uint64_t)tmp;<br>
<br>
    printf("%llx %llx %llx\n", pl, p2, p3);<br>
}<br>
<br>
void main()<br>
{<br>
    void* p = (void*)0xFFEECCAA;<br>
    test(p);<br>
}<br>
-----------------------------------------------<br>
Output is:<br>
ffffffffffeeccaa ffffffffffeeccaa ffffffffffeeccaa<br>
<br>
Expected:<br>
ffeeccaa ffffffffffeeccaa ffffffffffeeccaa<br>
<br>
Unfortunately this affects us as well (the bug is in<br>
convert_to_integer). What do you think, is this a valid GCC bug which<br>
should be filed?<br>
<br>
<br>
I verified the C testcase on ARM and x86. I don't have a x86 gdc right<br>
now, could you test whether the D testcase<br>
<a href="http://dpaste.dzfl.pl/abb9a6971" target="_blank">http://dpaste.dzfl.pl/abb9a6971</a><br>
also fails on x86?<br>
<br>
<br>
The fix is simple:<br>
in gcc/convert.c(convert_to_integer):<br>
<br>
/* Convert to an unsigned integer of the correct width first, and<br>
from there widen/truncate to the required type.  Some targets support<br>
the coexistence of multiple valid pointer sizes, so fetch the one we<br>
need from the type.  */<br>
      expr = fold_build1 (CONVERT_EXPR,<br>
                          lang_hooks.types.type_for_size<br>
                            (TYPE_PRECISION (intype), 0),<br>
                          expr);<br>
<br></blockquote></div><br></div><div class="gmail_extra">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).<br></div><div class="gmail_extra">
<br clear="all"><br>-- <br>Iain Buclaw<br><br>*(p < e ? p++ : p) = (c & 0x0f) + '0';
</div></div>