re PR fortran/77707 (formatted direct access: nextrec off by one)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 28 Sep 2016 19:38:03 +0000 (19:38 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Wed, 28 Sep 2016 19:38:03 +0000 (19:38 +0000)
2016-09-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/77707
io/transfer.c (next_record): Flush before calculating next_record.
Correctly calculate.

From-SVN: r240592

libgfortran/ChangeLog
libgfortran/io/transfer.c

index f312a066c18da96206094b070da727c0fcd60152..c58ad5d0ca0dc3d53ef6e2bde0831c794546fdb4 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-28  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/77707
+       io/transfer.c (next_record): Flush before calculating next_record.
+       Correctly calculate.
+
 2016-09-23  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/48298
index 6009c123d71b8f5c50bfa7b0ae1d678cac0aef18..902c02011ae38d2cf91e8bdce52e55555cc0da3b 100644 (file)
@@ -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);
 }