fortran: Fix o'...' boz to integer/real conversions [PR96859]
authorJakub Jelinek <jakub@redhat.com>
Wed, 2 Sep 2020 10:18:46 +0000 (12:18 +0200)
committerJakub Jelinek <jakub@redhat.com>
Wed, 2 Sep 2020 10:18:46 +0000 (12:18 +0200)
commitb567d3bd302933adb253aba9069fd8120c485441
tree145a7d1cdb18bf3e1c9330c35ac3443da8f193c7
parent6640a5b9e7c6f66a7d0c3de1bf01f24c3b20b692
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  <jakub@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.
gcc/fortran/check.c
gcc/testsuite/gfortran.dg/pr96859.f90 [new file with mode: 0644]