From f454b05a320d8a8e77167013b086649a64f03bec Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Mon, 31 Oct 2016 23:40:40 +0000 Subject: [PATCH] backport: re PR libfortran/78123 (Short reads with T edit descriptor not padding correctly) 2016-10-31 Jerry DeLisle Backport from trunk PR libgfortran/78123 * io/transfer.c (formatted_transfer_scalar_read): Clear seen_eor only if we have tabbed to left of current position. Backport from trunk PR fortran/78123 * gfortran.dg/fmt_t_9.f: New test. From-SVN: r241727 --- gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gfortran.dg/fmt_t_9.f | 41 +++++++++++++++++++++++++++++ libgfortran/ChangeLog | 7 +++++ libgfortran/io/transfer.c | 3 ++- 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/fmt_t_9.f diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3700eabf635e..cf77a64be9d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-10-31 Jerry DeLisle + + Backport from trunk + PR fortran/78123 + * gfortran.dg/fmt_t_9.f: New test. + 2016-10-24 Thomas Koenig Backport from trunk diff --git a/gcc/testsuite/gfortran.dg/fmt_t_9.f b/gcc/testsuite/gfortran.dg/fmt_t_9.f new file mode 100644 index 000000000000..bfe0361d0e12 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/fmt_t_9.f @@ -0,0 +1,41 @@ +! { 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 diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9048779f8538..078910059f94 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2016-10-31 Jerry DeLisle + + Backport from trunk + PR libgfortran/78123 + * io/transfer.c (formatted_transfer_scalar_read): Clear seen_eor + only if we have tabbed to left of current position. + 2016-09-29 Jerry DeLisle Backport from trunk diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index f49052c8a622..7f02e45a89ea 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1434,7 +1434,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) { -- 2.47.2