This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch, libgfortran] Bug 78123 - Short reads with T edit descriptor not padding correctly


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  <jvdelisle@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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]