Hi all, There has been a bit of discussio on which way to go on this.
I took a look today and this trivial patch gives the behavior concluded on Fortran Discourse. See the bugzilla for all the relevant information.
Regresion tested on x86-64. I will do the appropriate changelog. OK for trunk? Attached is a new test case and the patch here: diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c index 2bc05b293f8..d169961f997 100644 --- a/libgfortran/io/file_pos.c +++ b/libgfortran/io/file_pos.c @@ -352,7 +352,6 @@ st_endfile (st_parameter_filepos *fpp) dtp.common = fpp->common; memset (&dtp.u.p, 0, sizeof (dtp.u.p)); dtp.u.p.current_unit = u; - next_record (&dtp, 1); } unit_truncate (u, stell (u->s), &fpp->common);
! { dg-do run } ! PR107031 Check that endfile truncates at end of record 5. program test_truncate integer :: num_rec, tmp, i, nr, j open(10, file="in.dat", action='readwrite') do i=1,10 write(10, *) i end do rewind (10) num_rec = 5 i = 1 ioerr = 0 do while (i <= num_rec .and. ioerr == 0) read(10, *, iostat=ioerr) tmp i = i + 1 enddo endfile(10) rewind (10) i = 0 ioerr = 0 do while (i <= num_rec + 1 .and. ioerr == 0) read(10, *, iostat=ioerr) j i = i + 1 end do close(10, status='delete') if (i - 1 /= 5) stop 1 end program test_truncate