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

Reply via email to