Is the following patch OK for trunk and the gcc-4.9 and gcc-5 branches after some delay (bootstrapped and regtested on x86_64-apple-darwin15)?
TIA Dominique Index: gcc/testsuite/ChangeLog =================================================================== --- gcc/testsuite/ChangeLog (revision 234597) +++ gcc/testsuite/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2016-03-30 Dominique d'Humieres <domi...@lps.ens.fr> + Jerry DeLisle <jvdeli...@gcc.gnu.org> + + gfortran.dg/fmt_pf.f90: New test. + 2016-03-30 Rainer Orth <r...@cebitec.uni-bielefeld.de> Forward-port from 5 branch Index: libgfortran/ChangeLog =================================================================== --- libgfortran/ChangeLog (revision 234597) +++ libgfortran/ChangeLog (working copy) @@ -1,3 +1,10 @@ +2016-03-30 Jerry DeLisle <jvdeli...@gcc.gnu.org> + Dominique d'Humieres <domi...@lps.ens.fr> + + PR libgfortran/70235 + * io/write_float.def: Fix PF format for negative values of the scale + factor. + 2016-03-28 Alessandro Fanfarillo <fanfarillo....@gmail.com> * caf/libcaf.h: caf_stop_numeric and caf_stop_str prototype. Index: libgfortran/io/write_float.def =================================================================== --- libgfortran/io/write_float.def (revision 234597) +++ libgfortran/io/write_float.def (working copy) @@ -184,9 +184,6 @@ memmove (digits + nbefore, digits + nbefore + 1, p); digits[nbefore + p] = '.'; nbefore += p; - nafter = d - p; - if (nafter < 0) - nafter = 0; nafter = d; nzero = 0; } @@ -204,12 +201,27 @@ { nzero = -(nbefore + p); memmove (digits + 1, digits, nbefore); - digits++; - nafter = d + nbefore; + nafter = d - nzero; + if (nafter == 0 && d > 0) + { + /* This is needed to get the correct rounding. */ + memmove (digits + 1, digits, ndigits - 1); + digits[1] = '0'; + nafter = 1; + nzero = d - 1; + } + else if (nafter < 0) + { + /* Reset digits to 0 in order to get correct rounding + towards infinity. */ + for (i = 0; i < ndigits; i++) + digits[i] = '0'; + digits[ndigits - 1] = '1'; + nafter = d; + nzero = 0; + } nbefore = 0; } - if (nzero > d) - nzero = d; } } else