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)