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.

Reply via email to