PR 78534 Regression on 32-bit targets

Message ID 1515413563-29177-1-git-send-email-blomqvist.janne@gmail.com
State New
Headers show
Series
  • PR 78534 Regression on 32-bit targets
Related show

Commit Message

Janne Blomqvist Jan. 8, 2018, 12:12 p.m.
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.
---
 libgfortran/io/transfer.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

-- 
2.7.4

Patch

diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index f9c8696..7e076de 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -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)
 		{