]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/34876 (Can't read/write array sections with negative stride not specified)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 25 Jan 2008 23:34:53 +0000 (23:34 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Fri, 25 Jan 2008 23:34:53 +0000 (23:34 +0000)
2008-01-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libfortran/34876
* io/transfer.c (write_buf): Handle case of zero sized array.
(transfer_array): Set data pointer to NULL and size to zero.  Then
make a data transfer and return.

From-SVN: r131848

libgfortran/ChangeLog
libgfortran/io/transfer.c

index 8ac8c7197abfca3a2af03118e938e04189091c7d..d41dc6654a4a129cfb81abcfcfcdae4cb94de25b 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-24  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libfortran/34876
+       * io/transfer.c (write_buf): Handle case of zero sized array.
+       (transfer_array): Set data pointer to NULL and size to zero.  Then
+       make a data transfer and return.
+       
 2008-01-24  David Edelsohn  <edelsohn@gnu.org>
 
        * configure: Regenerate.
index da3e3f2000c557f0a84f6bb2c5fd876c04338c72..e94eb7431e681a926caa9ebfbcd0c013725d7438 100644 (file)
@@ -638,6 +638,14 @@ write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
          return FAILURE;
        }
 
+      if (buf == NULL && nbytes == 0)
+       {
+          char *p;
+          p = write_block (dtp, dtp->u.p.current_unit->recl);
+          memset (p, 0, dtp->u.p.current_unit->recl);
+          return SUCCESS;
+       }
+
       if (swrite (dtp->u.p.current_unit->s, buf, &nbytes) != 0)
        {
          generate_error (&dtp->common, LIBERROR_OS, NULL);
@@ -648,7 +656,6 @@ write_buf (st_parameter_dt *dtp, void *buf, size_t nbytes)
       dtp->u.p.current_unit->bytes_left -= (gfc_offset) nbytes;
 
       return SUCCESS;
-
     }
 
   /* Unformatted sequential.  */
@@ -1507,9 +1514,15 @@ transfer_array (st_parameter_dt *dtp, gfc_array_char *desc, int kind,
       extent[n] = desc->dim[n].ubound + 1 - desc->dim[n].lbound;
 
       /* If the extent of even one dimension is zero, then the entire
-        array section contains zero elements, so we return.  */
+        array section contains zero elements, so we return after writing
+        a zero array record.  */
       if (extent[n] <= 0)
-       return;
+       {
+         data = NULL;
+         tsize = 0;
+         dtp->u.p.transfer (dtp, iotype, data, kind, size, tsize);
+         return;
+       }
     }
 
   stride0 = stride[0];