Hi all,

The attached patch implements the last piece of this which enables the zero width exponent, giving a processor dependent width.

Regression tested on x86_64-pc-linux-gnu.

I don't think it is very intrusive and I updated the test case.

OK for trunk?

Regards,

Jerry

2019-11-27  Jerry DeLisle  <jvdeli...@gcc.ngu.org>

        PR fortran/90374
        * io.c (check_format): Allow zero width expoenent with e0.

        io/format.c (parse_format_list): Relax format checking to allow
        e0 exponent specifier.

        * gfortran.dg/fmt_zero_width.f90: Update test.



diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 57a3fdd5152..70aa6474445 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -1007,9 +1007,22 @@ data_desc:
 	    goto fail;
 	  if (u != FMT_POSINT)
 	    {
-	      error = G_("Positive exponent width required in format string "
-			 "at %L");
-	      goto syntax;
+	      if (u == FMT_ZERO)
+		{
+		  if (!gfc_notify_std (GFC_STD_F2018,
+				      "Positive exponent width required in "
+				      "format string at %L", &format_locus))
+		    {
+		      saved_token = u;
+		      goto fail;
+		    }
+		}
+	      else
+		{
+		  error = G_("Positive exponent width required in format"
+			     "string at %L");
+		  goto syntax;
+		}
 	    }
 	}
 
diff --git a/gcc/testsuite/gfortran.dg/fmt_zero_width.f90 b/gcc/testsuite/gfortran.dg/fmt_zero_width.f90
index 093c0a44c34..640b6735c65 100644
--- a/gcc/testsuite/gfortran.dg/fmt_zero_width.f90
+++ b/gcc/testsuite/gfortran.dg/fmt_zero_width.f90
@@ -1,11 +1,11 @@
 ! { dg-do run }
 ! PR90374 "5.5 d0.d, e0.d, es0.d, en0.d, g0.d and ew.d edit descriptors
 program pr90374
+  implicit none
   real(4) :: rn
   character(32) :: afmt, aresult
-  real(8) :: one = 1.0D0, zero = 0.0D0, nan, pinf, minf
+  real(8) :: one = 1.0D0, zero = 0.0D0, pinf, minf
 
-  nan = zero/zero
   rn = 0.00314_4
   afmt = "(D0.3)"
   write (aresult,fmt=afmt) rn
@@ -22,15 +22,19 @@ program pr90374
   afmt = "(G0.10)"
   write (aresult,fmt=afmt) rn
   if (aresult /= "0.3139999928E-02") stop 24
+  afmt = "(E0.10e0)"
+  write (aresult,fmt=afmt) rn
+  if (aresult /= "0.3139999928E-02") stop 27
   write (aresult,fmt="(D0.3)") rn
-  if (aresult /= "0.314D-02") stop 26
+  if (aresult /= "0.314D-02") stop 29
   write (aresult,fmt="(E0.10)") rn
-  if (aresult /= "0.3139999928E-02") stop 28
+  if (aresult /= "0.3139999928E-02") stop 31
   write (aresult,fmt="(ES0.10)") rn
-  if (aresult /= "3.1399999280E-03") stop 30
+  if (aresult /= "3.1399999280E-03") stop 33
   write (aresult,fmt="(EN0.10)") rn
-  if (aresult /= "3.1399999280E-03") stop 32
+  if (aresult /= "3.1399999280E-03") stop 35
   write (aresult,fmt="(G0.10)") rn
-  if (aresult /= "0.3139999928E-02") stop 34
-
+  if (aresult /= "0.3139999928E-02") stop 37
+  write (aresult,fmt="(E0.10e0)") rn
+  if (aresult /= "0.3139999928E-02") stop 39
 end
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index b33620815d5..dd448c83e87 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -1027,11 +1027,17 @@ parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
 	{
 	  t = format_lex (fmt);
 	  if (t != FMT_POSINT)
-	    {
-	      fmt->error = "Positive exponent width required in format";
-	      goto finished;
-	    }
-
+	    if (t == FMT_ZERO)
+	      {
+		notify_std (&dtp->common, GFC_STD_F2018,
+			    "Positive exponent width required");
+	      }
+	    else
+	      {
+		fmt->error = "Positive exponent width required in "
+			     "format string at %L";
+		goto finished;
+	      }
 	  tail->u.real.e = fmt->value;
 	}
 
diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def
index daa16679f53..ce6aec83114 100644
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -482,7 +482,7 @@ build_float_string (st_parameter_dt *dtp, const fnode *f, char *buffer,
       for (i = abs (e); i >= 10; i /= 10)
 	edigits++;
 
-      if (f->u.real.e < 0)
+      if (f->u.real.e <= 0)
 	{
 	  /* Width not specified.  Must be no more than 3 digits.  */
 	  if (e > 999 || e < -999)

Reply via email to