PR90374 Zero width format specifiers.
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 17 Jan 2020 19:26:10 +0000 (11:26 -0800)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 17 Jan 2020 19:26:10 +0000 (11:26 -0800)
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.

libgfortran/ChangeLog
libgfortran/io/format.c
libgfortran/io/write_float.def

index 840642cd660fdffc2523281c4e863a96e3dbda6a..bd2d87eab014ead70e2a875134ffbc81fa07f7ad 100644 (file)
@@ -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
index b42a5593e38a1ae548b5fc785c97da5b14810cd7..3be861fb19c48c995de3e4d42dd8cc15cbeee97f 100644 (file)
@@ -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;
index 75c7942c4c5cb9199d148695e587901836806072..8a1be054371425b6675163a91f266a395d6ba83b 100644 (file)
@@ -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;