PR fortran/55539 Fix regression in -fno-sign-zero.

libgfortran ChangeLog:

2012-12-26  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/55539
	* io/write_float.def (output_float): Take into account decimal dot.

testsuite ChangeLog:

2012-12-26  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/55539
	* gfortran.dg/nosigned_zero_3.f90: New testcase.

From-SVN: r194717
This commit is contained in:
Janne Blomqvist 2012-12-26 00:11:16 +02:00
parent e255044e71
commit eb3119f90f
4 changed files with 32 additions and 3 deletions

View File

@ -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> 2012-12-23 Tobias Burnus <burnus@net-b.de>
PR fortran/54884 PR fortran/54884

View File

@ -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

View File

@ -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> 2012-12-21 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/30162 PR libfortran/30162

View File

@ -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 /* 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 all the way through the loop, we know the value is zero after the
rounding completed above. */ 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; break;
} }
/* To format properly, we need to know if the rounded result is zero and if /* 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 so, we set the zero_flag which may have been already set for
actual zero. */ actual zero. */
if (i == ndigits) if (i == ndigits + hasdot)
{ {
zero_flag = true; zero_flag = true;
/* The output is zero, so set the sign according to the sign bit unless /* The output is zero, so set the sign according to the sign bit unless