diff options
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr20124.f90 | 8 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 8 | ||||
-rw-r--r-- | libgfortran/io/write.c | 18 |
4 files changed, 38 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c51d1d1..109c848 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-03-12 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR libfortran/20124 + * gfortran.dg/pr20124.f90: New Test + 2005-03-10 James A. Morrison <phython@gcc.gnu.org> PR tree-optimization/20130 diff --git a/gcc/testsuite/gfortran.dg/pr20124.f90 b/gcc/testsuite/gfortran.dg/pr20124.f90 new file mode 100644 index 0000000..69f4f18 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr20124.f90 @@ -0,0 +1,8 @@ +! { dg-do run } +! pr 20124 + character*80 line + x = -.01 + y = .01 + write(line,'(2f10.2)') x, y + if (line.ne.' -0.01 0.01') call abort + end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2e3bd39..ac7e067 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2005-03-11 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR libfortran/20124 + * write.c (output_float): Adds a nzero_real variable to store + the number of leading zeros whatever the format width is. Corrects + the rounding of numbers less than 10^(-width). Fixes typo in an + error message. Updates copyright years + 2005-02-27 Toon Moene <toon@moene.indiv.nluug.nl> * runtime/environ.c: Update copyright years. diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 1babd20..9c255d7 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -286,6 +286,8 @@ output_float (fnode *f, double value, int len) int nzero; /* Number of digits after the decimal point. */ int nafter; + /* Number of zeros after the decimal point, whatever the precision. */ + int nzero_real; int leadzero; int nblanks; int i; @@ -295,6 +297,9 @@ output_float (fnode *f, double value, int len) w = f->u.real.w; d = f->u.real.d; + nzero_real = -1; + + /* We should always know the field width and precision. */ if (d < 0) internal_error ("Unspecified precision"); @@ -359,6 +364,7 @@ output_float (fnode *f, double value, int len) if (nbefore < 0) { nzero = -nbefore; + nzero_real = nzero; if (nzero > d) nzero = d; nafter = d - nzero; @@ -436,7 +442,17 @@ output_float (fnode *f, double value, int len) /* Round the value. */ if (nbefore + nafter == 0) - ndigits = 0; + { + ndigits = 0; + if (nzero_real == d && digits[0] >= '5') + { + /* We rounded to zero but shouldn't have */ + nzero--; + nafter = 1; + digits[0] = '1'; + ndigits = 1; + } + } else if (nbefore + nafter < ndigits) { ndigits = nbefore + nafter; |