https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96859
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I've read that. But I think in this case it is an obvious bug (just, what I've missed in the patch, there is another copy of the same bug in another routine). The /* Clear first bit. */ if (kind == 1 || kind == 4 || kind == 16) { if (buf[0] == '4') buf[0] = '0'; else if (buf[0] == '5') buf[0] = '1'; else if (buf[0] == '6') buf[0] = '2'; else if (buf[0] == '7') buf[0] = '3'; } part looks correct, for kind 1, 4 and 16 the calculated len times 3 is 1 larger than the number of bits it needs, so the above ensures that the first digit is 0-3 even if it is 4-7 by subtracting 4. But the: /* Clear first two bits. */ else { if (buf[0] == '4' || buf[0] == '6') buf[0] = '0'; else if (buf[0] == '5' || buf[0] == '7') buf[0] = '1'; } which is needed for kind 2 and 8, when he calculated len times 3 is 2 larger than the number of bits it needs, is only correct for digits 0-1 an 4-7, for which it ensures the digit is 0 if it is even and 1 if it is odd. But 2 and 3 are kept as is, while they don't fit into 1 bit.