diff options
author | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-04 15:33:18 +0000 |
---|---|---|
committer | pbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-04 15:33:18 +0000 |
commit | d56c27620b8f2d33c6ee38ccbf771ab5de0b3c12 (patch) | |
tree | 4114a0c97da613eea429829446e76db65fd5d026 /libgfortran | |
parent | 03be79050e41b7f56443511f010242beb0f267f8 (diff) | |
download | gcc-d56c27620b8f2d33c6ee38ccbf771ab5de0b3c12.tar.gz |
2004-10-04 Paul Brook <paul@codesourcery.com>
Bud Davis <bdavis9659@comcast.net>
PR fortran/17706
PR fortran/16434
* io/format.c (parse_format_list): Set repeat count for S, SP, SS,
BN and BZ formats.
* io/write.c (output_float): Don't output minus zero.
libgfortran/
* gfortran/pr17706.f90: New test.
* gfortran.dg/g77/f77-edit-s-out.f: Remove xfail.
Actually apply the patch this time.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88513 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/io/format.c | 1 | ||||
-rw-r--r-- | libgfortran/io/write.c | 17 |
2 files changed, 16 insertions, 2 deletions
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c index 23b8d5ebf1b..0e42810873e 100644 --- a/libgfortran/io/format.c +++ b/libgfortran/io/format.c @@ -552,6 +552,7 @@ format_item: case FMT_BN: case FMT_BZ: get_fnode (&head, &tail, t); + tail->repeat = 1; goto between_desc; case FMT_COLON: diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c index 4e22b703ea8..f98ec1f1f36 100644 --- a/libgfortran/io/write.c +++ b/libgfortran/io/write.c @@ -425,9 +425,12 @@ output_float (fnode *f, double value, int len) } /* Round the value. */ - if (nbefore + nafter < ndigits && nbefore + nafter > 0) + if (nbefore + nafter == 0) + ndigits = 0; + else if (nbefore + nafter < ndigits) { - i = nbefore + nafter; + ndigits = nbefore + nafter; + i = ndigits; if (digits[i] >= '5') { /* Propagate the carry. */ @@ -513,6 +516,16 @@ output_float (fnode *f, double value, int len) if (out == NULL) return; + /* Zero values always output as positive, even if the value was negative + before rounding. */ + for (i = 0; i < ndigits; i++) + { + if (digits[i] != '0') + break; + } + if (i == ndigits) + sign = calculate_sign (0); + /* Work out how much padding is needed. */ nblanks = w - (nbefore + nzero + nafter + edigits + 1); if (sign != SIGN_NONE) |