re PR libfortran/90374 (Fortran 2018: Support d0.d, e0.d, es0.d, en0.d, g0.d and ew.d e0 edit descriptors for output)

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.

From-SVN: r278817
This commit is contained in:
Jerry DeLisle 2019-11-28 18:33:20 +00:00
parent 9c28689a99
commit 68c28e37e4
7 changed files with 57 additions and 18 deletions

View File

@ -1,3 +1,8 @@
2019-11-28 Jerry DeLisle <jvdelisle@gcc.ngu.org>
PR fortran/90374
* io.c (check_format): Allow zero width expoenent with e0.
2019-11-27 Jakub Jelinek <jakub@redhat.com>
PR fortran/91944

View File

@ -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;
}
}
}

View File

@ -1,3 +1,8 @@
2019-11-28 Jerry DeLisle <jvdelisle@gcc.ngu.org>
PR fortran/90374
* gfortran.dg/fmt_zero_width.f90: Update test.
2019-11-28 Martin Jambor <mjambor@suse.cz>
PR ipa/92697

View File

@ -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

View File

@ -1,7 +1,13 @@
2019-11-28 Jerry DeLisle <jvdelisle@gcc.ngu.org>
PR fortran/90374
* io/format.c (parse_format_list): Relax format checking to allow
e0 exponent specifier.
2019-11-24 Jerry DeLisle <jvdelisle@gcc.ngu.org>
PR fortran/92100
io/transfer.c (data_transfer_init_worker): Use fbuf_reset
* io/transfer.c (data_transfer_init_worker): Use fbuf_reset
instead of fbuf_flush before the seek. Note that fbuf_reset
calls fbuf_flush and adjusts fbuf pointers.

View File

@ -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;
}

View File

@ -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)