2006-01-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Jan 2006 00:52:21 +0000 (00:52 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Jan 2006 00:52:21 +0000 (00:52 +0000)
PR libgfortran/25631
* io/transfer.c (formatted_transfer_scalar): Adjust pending_spaces and
skips so that TL works correctly when no bytes_used yet.

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

libgfortran/ChangeLog
libgfortran/io/transfer.c

index 5ce8702..d5e178e 100644 (file)
@@ -1,3 +1,9 @@
+2006-01-17  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/25631
+       * io/transfer.c (formatted_transfer_scalar): Adjust pending_spaces and
+       skips so that TL works correctly when no bytes_used yet.  
+
 2006-01-16  Roger Sayle  <roger@eyesopen.com>
 
        * configure.ac (CFLAGS): Update to include -std=gnu99 so that
index 049ebb2..7298835 100644 (file)
@@ -868,7 +868,21 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
        case FMT_TL:
        case FMT_T:
          if (f->format == FMT_TL)
-           pos = bytes_used - f->u.n;
+           {
+
+             /* Handle the special case when no bytes have been used yet.
+                Cannot go below zero. */
+             if (bytes_used == 0)
+               {
+                 dtp->u.p.pending_spaces -= f->u.n;
+                 dtp->u.p.pending_spaces = dtp->u.p.pending_spaces < 0 ? 0
+                                           : dtp->u.p.pending_spaces;
+                 dtp->u.p.skips -= f->u.n;
+                 dtp->u.p.skips = dtp->u.p.skips < 0 ? 0 : dtp->u.p.skips;
+               }
+
+             pos = bytes_used - f->u.n;
+           }
          else /* FMT_T */
            {
              consume_data_flag = 0;