When compiling encoding.c from the screen-v4 branch:
encoding.c: In function ‘AddUtf8’:
display.h:322:18: warning: overflow in conversion from ‘int’ to ‘char’ changes
value from ‘c >> 12 & 12288^ 248’ to ‘-8’ [-Woverflow]
322 | *D_obufp++ = (c); \
| ^
encoding.c:682:4: note: in expansion of macro ‘AddChar’
682 | AddChar((c & 0x3000000) >> 12 ^ 0xf8);
| ^~~~~~~
encoding.c: In function ‘ToUtf8’:
encoding.c:727:13: warning: overflow in conversion from ‘int’ to ‘char’ changes
value from ‘c >> 12 & 12288^ 248’ to ‘-8’ [-Woverflow]
727 | *p++ = (c & 0x3000000) >> 12 ^ 0xf8;
| ^
Indeed, the code is really strange:
(c & 0x3000000) >> 12 ^ 0xf8
will be stored in a char. So why dealing with bits more significant
than the 8 bits of a char?
The master branch has a similar code, but with int replaced by
uint32_t, so that the warning disappears just because of the unsigned
type (the behavior becomes fully specified by the C standard instead
of being implementation defined).
--
Vincent Lefèvre <[email protected]> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)