diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2020-01-17 11:26:10 -0800 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2020-01-17 11:26:10 -0800 |
commit | 82033483fd74b1dcedab416d98673e212258498d (patch) | |
tree | d421a53d45895d9869e62fe016679017163cbf87 | |
parent | 7e45138702a9c26b00d25db07f92a271b054e304 (diff) | |
download | gcc-82033483fd74b1dcedab416d98673e212258498d.tar.gz |
PR90374 Zero width format specifiers.
PR libfortran/90374
* io/format.c (parse_format_list): Zero width not allowed with
FMT_D.
* io/write_float.def (build_float_string): Include range of
higher exponent values that require wider width.
-rw-r--r-- | libgfortran/ChangeLog | 8 | ||||
-rw-r--r-- | libgfortran/io/format.c | 4 | ||||
-rw-r--r-- | libgfortran/io/write_float.def | 4 |
3 files changed, 14 insertions, 2 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 840642cd660..bd2d87eab01 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2020-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/90374 + * io/format.c (parse_format_list): Zero width not allowed with + FMT_D. + * io/write_float.def (build_float_string): Include range of + higher exponent values that require wider width. + 2020-01-01 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libfortran/90374 diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c index b42a5593e38..3be861fb19c 100644 --- a/libgfortran/io/format.c +++ b/libgfortran/io/format.c @@ -954,7 +954,9 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd) } tail->u.real.d = fmt->value; - /* Look for optional exponent */ + /* Look for optional exponent, not allowed for FMT_D */ + if (t == FMT_D) + break; u = format_lex (fmt); if (u != FMT_E) fmt->saved_token = u; diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index 75c7942c4c5..8a1be054371 100644 --- a/libgfortran/io/write_float.def +++ b/libgfortran/io/write_float.def @@ -497,7 +497,9 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer, else if (f->u.real.e == 0) { /* Zero width specified, no leading zeros in exponent */ - if (e > 99 || e < -99) + if (e > 999 || e < -999) + edigits = 6; + else if (e > 99 || e < -99) edigits = 5; else if (e > 9 || e < -9) edigits = 4; |