From 6cac36304e7153206248af3511287d44bacd3ae2 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Sat, 26 Jan 2008 15:22:59 +0000 Subject: [PATCH] re PR libfortran/34887 (reverse tabbing before slash descriptor (regression vs. g77)) 2008-01-26 Thomas Koenig PR libfofortran/34887 * io/transfer.c (next_record_w): Always move to the farthest position when completing the record (also when we are processing a slash edit descriptor). 2008-01-26 Thomas Koenig PR libfofortran/34887 * gfortran.dg/x_slash_2.f: New test. From-SVN: r131864 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/x_slash_2.f | 11 +++++++++++ libgfortran/ChangeLog | 7 +++++++ libgfortran/io/transfer.c | 23 ++++++++++------------- 4 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/x_slash_2.f diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6535805cc966..583a15890cf9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-01-26 Thomas Koenig + + PR libfofortran/34887 + * gfortran.dg/x_slash_2.f: New test. + 2008-01-26 Richard Guenther PR c++/34235 diff --git a/gcc/testsuite/gfortran.dg/x_slash_2.f b/gcc/testsuite/gfortran.dg/x_slash_2.f new file mode 100644 index 000000000000..6023b647d24d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/x_slash_2.f @@ -0,0 +1,11 @@ +! { dg-do run } +! PR 34887 - reverse tabs followed by a slash used to confuse I/O. + program main + character(len=2) :: b, a + open(10,form="formatted") + write (10,'(3X, A, T1, A,/)') 'aa', 'bb' + rewind(10) + read (10,'(A2,1X,A2)') b,a + if (a /= 'aa' .or. b /= 'bb') call abort + close(10,status="delete") + end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 1c9148c13d07..a83ee24daae7 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2008-01-26 Thomas Koenig + + PR libfofortran/34887 + * io/transfer.c (next_record_w): Always move to the farthest + position when completing the record (also when we are + processing a slash edit descriptor). + 2008-01-25 Jerry DeLisle PR libfortran/34876 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index e94eb7431e68..52c6314349db 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -2573,21 +2573,18 @@ next_record_w (st_parameter_dt *dtp, int done) } else { - /* If this is the last call to next_record move to the farthest - position reached in preparation for completing the record. - (for file unit) */ - if (done) - { - m = dtp->u.p.current_unit->recl - - dtp->u.p.current_unit->bytes_left; - if (max_pos > m) - { - length = (int) (max_pos - m); - p = salloc_w (dtp->u.p.current_unit->s, &length); - } - } size_t len; const char crlf[] = "\r\n"; + + /* Move to the farthest position reached in preparation for + completing the record. (for file unit) */ + m = dtp->u.p.current_unit->recl - + dtp->u.p.current_unit->bytes_left; + if (max_pos > m) + { + length = (int) (max_pos - m); + p = salloc_w (dtp->u.p.current_unit->s, &length); + } #ifdef HAVE_CRLF len = 2; #else