https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96859

--- Comment #12 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Jakub Jelinek
<ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:e24dbeeb7864dc4c673f57383c3fa329d1d16e71

commit r10-8729-ge24dbeeb7864dc4c673f57383c3fa329d1d16e71
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed Sep 2 12:18:46 2020 +0200

    fortran: Fix o'...' boz to integer/real conversions [PR96859]

    The standard says that excess digits from boz are truncated.
    For hexadecimal or binary, the routines copy just the number of digits
    that will be needed, but for octal we copy number of digits that
    contain one extra bit (for 8-bit, 32-bit or 128-bit, i.e. kind 1, 4 and 16)
    or two extra bits (for 16-bit or 64-bit, i.e. kind 2 and 8).
    The clearing of the first bit is done correctly by changing the first digit
    if it is 4-7 to one smaller by 4 (i.e. modulo 4).
    The clearing of the first two bits is done by changing 4 or 6 to 0
    and 5 or 7 to 1, which is incorrect, because we really want to change the
    first digit to 0 if it was even, or to 1 if it was odd, so digits
    2 and 3 are mishandled by keeping them as is, rather than changing 2 to 0
    and 3 to 1.

    2020-09-02  Jakub Jelinek  <ja...@redhat.com>

            PR fortran/96859
            * check.c (gfc_boz2real, gfc_boz2int): When clearing first two
bits,
            change also '2' to '0' and '3' to '1' rather than just handling '4'
            through '7'.

            * gfortran.dg/pr96859.f90: New test.

    (cherry picked from commit b567d3bd302933adb253aba9069fd8120c485441)

Reply via email to