OSDN Git Service

2008-01-26 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Jan 2008 15:22:59 +0000 (15:22 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Jan 2008 15:22:59 +0000 (15:22 +0000)
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  <tkoenig@gcc.gnu.org>

PR libfofortran/34887
* gfortran.dg/x_slash_2.f:  New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131864 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/x_slash_2.f [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/transfer.c

index 6535805..583a158 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfofortran/34887
+       * gfortran.dg/x_slash_2.f:  New test.
+
 2008-01-26  Richard Guenther  <rguenther@suse.de>
 
        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 (file)
index 0000000..6023b64
--- /dev/null
@@ -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
index 1c9148c..a83ee24 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       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  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/34876
index e94eb74..52c6314 100644 (file)
@@ -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