I plan to commit the attached patch in the next few days. Fairly simple.
Regression tested on x86-64. Regards, Jerry 2016-09-27 Jerry DeLisle <jvdeli...@gcc.gnu.org> PR libgfortran/77707 io/transfer.c (next_record): Flush before calculating next_record. Correctly calculate.
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 6009c123..902c0201 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -3720,6 +3720,8 @@ next_record (st_parameter_dt *dtp, int done) else next_record_w (dtp, done); + fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode); + if (!is_stream_io (dtp)) { /* Since we have changed the position, set it to unspecified so @@ -3733,8 +3735,8 @@ next_record (st_parameter_dt *dtp, int done) fp = stell (dtp->u.p.current_unit->s); /* Calculate next record, rounding up partial records. */ dtp->u.p.current_unit->last_record = - (fp + dtp->u.p.current_unit->recl - 1) / - dtp->u.p.current_unit->recl; + (fp + dtp->u.p.current_unit->recl) / + dtp->u.p.current_unit->recl - 1; } else dtp->u.p.current_unit->last_record++; @@ -3743,7 +3745,6 @@ next_record (st_parameter_dt *dtp, int done) if (!done) pre_position (dtp); - fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode); smarkeor (dtp->u.p.current_unit->s); }
! { dg-do run } ! PR77707 formatted direct access: nextrec off by one program directaccess_formatted integer nextrec open(10, status='scratch', form='formatted', access='direct', recl=10*4) write(10,'(10i4)',rec=9) 1,2,3,4,5,6,7,8,9,10 inquire(unit=10,nextrec=nextrec) if (nextrec.ne.10) call abort close(10) end