See patch below which is very simple. We were handling the case where we tabbed left of current position in the record by clearing the seen_eor flag. We were not handling the case where we tab toward the right and so are still at eor.

New test case attached. Regression tested on x86-64-linux.

OK to commit?

This is a regression relative to g77. Its simple enough I think it should go to 5 and 6 as well.

Regards,

Jerry

2016-10-30  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR fortran/79123
        * io/transfer.c (formatted_transfer_scalar_read): Clear seen_eor
        only if we have tabbed to left of current position.


diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index b8eb5ed..5830362 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -1579,7 +1579,8 @@ formatted_transfer_scalar_read (st_parameter_dt *dtp, bt type, void *p, int kind
               dtp->u.p.current_unit->bytes_left -= dtp->u.p.sf_seen_eor;
               dtp->u.p.skips -= dtp->u.p.sf_seen_eor;
              bytes_used = pos;
-             dtp->u.p.sf_seen_eor = 0;
+             if (dtp->u.p.pending_spaces == 0)
+               dtp->u.p.sf_seen_eor = 0;
            }
          if (dtp->u.p.skips < 0)
            {
! { dg-options "-ffixed-line-length-none -std=gnu" }
! { dg-do run }
! PR78123 Short reads with T edit descriptor not padding correctly
      PROGRAM tformat
C
      INTEGER  MXFLTL
      PARAMETER (MXFLTL = 99999)
      INTEGER   IFLGHT, NFLCYC, IFLTSQ(MXFLTL), IDXBLK, LMAX, LMIN, I
C
      OPEN(29, status='scratch')
      WRITE(29, '(a)') "   1   1   1  TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT      72  122     4"
      WRITE(29, '(a)') ""
      WRITE(29, '(a)') "  451   402012011201120112011200120112011201120112011201120111971201120112011201120112011201"
      WRITE(29, '(a)') "  451   4020 866 866 866 866 866 866 866 866 865 866 865 866 866 866 866 866 866 866 865 866"
      REWIND(29)
C     The error occurs in the following loop:
 10   CONTINUE
         READ(29,1010   )  IDXBLK, LMAX, LMIN
1010     FORMAT(8X,I4,T51,2I5) ! wrong if this format is used
c         write(6,fmt='("IDXBLK,LMAX,LMIN=",3I5)')IDXBLK,LMAX,LMIN
         IF (IDXBLK .EQ. 0)  GO TO 20
      GO TO 10
C
 20   CONTINUE
      READ(29,1040,END=100)  IFLGHT, NFLCYC,
     &              (IFLTSQ(I), I=1,NFLCYC)
1040  FORMAT(I5,I5,2X,(T13,20I4))
c      write(6,fmt='(2i6)') IFLGHT,NFLCYC
c      write(6,fmt='(20I4)') (IFLTSQ(I), I=1,NFLCYC)
c      write(6,*) "Program is correct"
      close(29)
      if (IFLGHT.ne.451) call abort
      if (NFLCYC.ne.40) call abort
      stop
C
 100  CONTINUE
C      write(6,*) "End of file encountered (wrong)"
      close (29)
      call abort
      STOP
      END

Reply via email to