From eb3119f90fb7a12cd7fe7ad83e3622a064d28ace Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Wed, 26 Dec 2012 00:11:16 +0200 Subject: [PATCH] PR fortran/55539 Fix regression in -fno-sign-zero. libgfortran ChangeLog: 2012-12-26 Janne Blomqvist PR fortran/55539 * io/write_float.def (output_float): Take into account decimal dot. testsuite ChangeLog: 2012-12-26 Janne Blomqvist PR fortran/55539 * gfortran.dg/nosigned_zero_3.f90: New testcase. From-SVN: r194717 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 | 15 +++++++++++++++ libgfortran/ChangeLog | 6 ++++++ libgfortran/io/write_float.def | 9 ++++++--- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/nosigned_zero_3.f90 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a99e06a5448..59f344106c11 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-12-26 Janne Blomqvist + + PR fortran/55539 + * gfortran.dg/nosigned_zero_3.f90: New testcase. + 2012-12-23 Tobias Burnus 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 000000000000..3f0f7101f26b --- /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 566a24bd55bf..debd88c8f4f6 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2012-12-26 Janne Blomqvist + + PR fortran/55539 + * io/write_float.def (output_float): Take into account decimal + dot. + 2012-12-21 Thomas Koenig PR libfortran/30162 diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index 6521f3c06232..1e30dde29ce2 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