diff options
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 | 15 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/write_float.def | 9 |
4 files changed, 32 insertions, 3 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a99e06..59f3441 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-12-26 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/55539 + * gfortran.dg/nosigned_zero_3.f90: New testcase. + 2012-12-23 Tobias Burnus <burnus@net-b.de> PR fortran/54884 diff --git a/gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 b/gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 new file mode 100644 index 0000000..3f0f710 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 @@ -0,0 +1,15 @@ +! { dg-do run } +! { dg-options "-fno-sign-zero" } +! +! PR fortran/55539 +! +program nosigned_zero_3 + implicit none + character(len=20) :: s + real(4) :: x = -1.2e-3 + real(8) :: y = -1.2e-3 + write(s,'(7f10.3)') x + if (trim(adjustl(s)) /= "-0.001") call abort + write(s, '(7f10.3)') y + if (trim(adjustl(s)) /= "-0.001") call abort +end program nosigned_zero_3 diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 566a24b..debd88c 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2012-12-26 Janne Blomqvist <jb@gcc.gnu.org> + + PR fortran/55539 + * io/write_float.def (output_float): Take into account decimal + dot. + 2012-12-21 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/30162 diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index 6521f3c..1e30dde 100644 --- a/libgfortran/io/write_float.def +++ b/libgfortran/io/write_float.def @@ -483,16 +483,19 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size, /* Scan the digits string and count the number of zeros. If we make it all the way through the loop, we know the value is zero after the rounding completed above. */ - for (i = 0; i < ndigits; i++) + int hasdot = 0; + for (i = 0; i < ndigits + hasdot; i++) { - if (digits[i] != '0' && digits[i] != '.') + if (digits[i] == '.') + hasdot = 1; + else if (digits[i] != '0') break; } /* To format properly, we need to know if the rounded result is zero and if so, we set the zero_flag which may have been already set for actual zero. */ - if (i == ndigits) + if (i == ndigits + hasdot) { zero_flag = true; /* The output is zero, so set the sign according to the sign bit unless |