From: Jerry DeLisle Date: Tue, 26 Nov 2019 22:56:24 +0000 (+0000) Subject: backport: re PR libfortran/92100 (Formatted stream IO irreproducible read with binary... X-Git-Tag: releases/gcc-9.3.0~353 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b1a33584cf912cba70494df079bef7f92bbc442;p=thirdparty%2Fgcc.git backport: re PR libfortran/92100 (Formatted stream IO irreproducible read with binary data in file) 2019-11-26 Jerry DeLisle Backport from mainline PR fortran/92100 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. gfortran.dg/streamio_18.f90: New test. From-SVN: r278740 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c07ef85ce927..2ec93f884c79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-11-26 Jerry DeLisle + + Backport from trunk + PR fortran/92100 + gfortran.dg/streamio_18.f90: New test. + 2019-11-25 Thomas Koenig Harald Anlauf diff --git a/gcc/testsuite/gfortran.dg/streamio_18.f90 b/gcc/testsuite/gfortran.dg/streamio_18.f90 new file mode 100644 index 000000000000..ee36238ecfaa --- /dev/null +++ b/gcc/testsuite/gfortran.dg/streamio_18.f90 @@ -0,0 +1,23 @@ +! { dg-do run } +! PR91200 +program foo + implicit none + integer fd + open(newunit=fd, file='test.dat', access='stream', form='formatted') + write(fd,'(A)') '$MeshFormat' + write(fd,'(A)') 'aabbccdd' + close(fd) + call readfile ! Read test.dat +contains + subroutine readfile + character(len=20) buf1, buf2 + integer fd, m, n + open(newunit=fd, file='test.dat', access='stream', form='formatted') + inquire(fd, pos=m) + if (m /= 1) stop 'm /= 1' + read(fd, *) buf1 + read(fd, *, pos=m) buf2 ! Reread by using pos=1 + close(fd, status='delete') + if (buf1 /= buf2) stop 'wrong' + end subroutine readfile +end program diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 5bf3cc8340d2..34ca3548589f 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2019-11-26 Jerry DeLisle + + Backport from mainline + PR fortran/92100 + 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. + 2019-11-25 Thomas Koenig Harald Anlauf diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 8ed0391225d1..28e403fedf2f 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -3294,8 +3294,9 @@ data_transfer_init_worker (st_parameter_dt *dtp, int read_flag) if (dtp->pos != dtp->u.p.current_unit->strm_pos) { - fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode); - if (sseek (dtp->u.p.current_unit->s, dtp->pos - 1, SEEK_SET) < 0) + fbuf_reset (dtp->u.p.current_unit); + if (sseek (dtp->u.p.current_unit->s, dtp->pos - 1, + SEEK_SET) < 0) { generate_error (&dtp->common, LIBERROR_OS, NULL); return;