PR 78534 Regression on 32-bit targets
authorJanne Blomqvist <jb@gcc.gnu.org>
Mon, 8 Jan 2018 12:12:05 +0000 (14:12 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Mon, 8 Jan 2018 12:12:05 +0000 (14:12 +0200)
By switching from int to size_t in order to handle larger values,
r256322 introduced a bug that manifested itself on 32-bit
targets. Fixed by using the correct type to store the result of a
next_array_record call.

Regtested on x86_64-pc-linux-gnu and i686-pc-linux-gnu, committed to
trunk as obvious.

libgfortran/ChangeLog:

2018-01-08  Janne Blomqvist  <jb@gcc.gnu.org>

PR 78534, bugfix for r256322
* io/transfer.c (next_record_w): Use correct type for return value
of next_array_record.

From-SVN: r256337

libgfortran/ChangeLog
libgfortran/io/transfer.c

index d05e6c65fda598bf7eeeff6d0e2ec6053b7ad5b9..022725fdcdca6533a2f7a70933c87c45a86f58a9 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-08  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR 78534, bugfix for r256322
+       * io/transfer.c (next_record_w): Use correct type for return value
+       of next_array_record.
+
 2018-01-07  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        * libgfortran.h (GFC_DTYPE_COPY): New macro.
index f9c8696766f43b62e5f51bf3241f7fa7fccbbaa2..7e076de84fa798041ac609717450b1693f6ea77c 100644 (file)
@@ -3691,7 +3691,7 @@ next_record_w (st_parameter_dt *dtp, int done)
        {
          char *p;
          /* Internal unit, so must fit in memory.  */
-         size_t length, m, record;
+         size_t length, m;
          size_t max_pos = max_pos_off;
          if (is_array_io (dtp))
            {
@@ -3730,14 +3730,16 @@ next_record_w (st_parameter_dt *dtp, int done)
                memset (p, ' ', length);
 
              /* Now that the current record has been padded out,
-                determine where the next record in the array is. */
-             record = next_array_record (dtp, dtp->u.p.current_unit->ls,
-                                         &finished);
+                determine where the next record in the array is.
+                Note that this can return a negative value, so it
+                needs to be assigned to a signed value.  */
+             gfc_offset record = next_array_record
+               (dtp, dtp->u.p.current_unit->ls, &finished);
              if (finished)
                dtp->u.p.current_unit->endfile = AT_ENDFILE;
 
              /* Now seek to this record */
-             record = record * ((size_t) dtp->u.p.current_unit->recl);
+             record = record * dtp->u.p.current_unit->recl;
 
              if (sseek (dtp->u.p.current_unit->s, record, SEEK_SET) < 0)
                {