http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60128
Dominique d'Humieres <dominiq at lps dot ens.fr> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jb at gcc dot gnu.org, | |jvdelisle at gcc dot gnu.org --- Comment #2 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- This likely due to r185433. This fixed by the following patch --- ../_clean/libgfortran/io/write_float.def 2014-01-21 08:30:57.000000000 +0100 +++ libgfortran/io/write_float.def 2014-02-10 10:23:13.000000000 +0100 @@ -1215,8 +1211,8 @@ determine_en_precision (st_parameter_dt nbefore = 3 - nbefore; } int prec = f->u.real.d + nbefore; - if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED - && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED) + /* if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED + && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED) */ prec += 2 * len + 4; return prec; } For the following extended test write(*,"(en15.2)") -.44444 write(*,"(rp,en15.2)") -.44444 write(*,"(rc,en15.2)") -.44444 write(*,"(rz,en15.2)") -.44444 write(*,"(rd,en15.2)") -.44444 write(*,"(en15.2)") -.44446 write(*,"(en15.1)") -.44444 end before the patch, the output is -444.40E-03 -444.40E-03 -444.44E-03 -444.44E-03 -444.45E-03 -444.50E-03 -444.0E-03 after the patch, it is -444.44E-03 -444.44E-03 -444.44E-03 -444.44E-03 -444.45E-03 -444.46E-03 -444.4E-03 Regtesting in progress. Note that the block - if (dtp->u.p.current_unit->round_status != ROUND_UNSPECIFIED - && dtp->u.p.current_unit->round_status != ROUND_PROCDEFINED) appears in several places in libgfortran/io/write_float.def and I fail to see the logic.