Hello all,

The attached patch fixes this PR by not seeking if the next character is a 
space.

Regression tested on x86-64.  New test case provided.

OK for trunk and back ports?

Regards.

Jerry

2014-05-23  Jerry DeLisle  <jvdeli...@gcc.gnu>

        PR libgfortran/61173
        * io/list_read.c (eat_spaces): If the next character pointed to
        is a space, don't seek, must be at the end.

Index: list_read.c
===================================================================
--- list_read.c	(revision 210879)
+++ list_read.c	(working copy)
@@ -398,7 +398,7 @@ eat_spaces (st_parameter_dt *dtp)
   if (is_array_io (dtp))
     {
       gfc_offset offset = stell (dtp->u.p.current_unit->s);
-      gfc_offset limit = dtp->u.p.current_unit->bytes_left;
+      gfc_offset limit = offset + dtp->u.p.current_unit->bytes_left;
 
       if (dtp->common.unit) /* kind=4 */
 	{
@@ -410,13 +410,15 @@ eat_spaces (st_parameter_dt *dtp)
 	      offset += (sizeof (gfc_char4_t));
 	      dtp->u.p.current_unit->bytes_left--;
 	    }
-	  while (offset < limit && (cc == (gfc_char4_t)' '
-		  || cc == (gfc_char4_t)'\t'));
+	  while (offset < limit && cc == (gfc_char4_t)' ');
 	  /* Back up, seek ahead, and fall through to complete the
 	     process so that END conditions are handled correctly.  */
 	  dtp->u.p.current_unit->bytes_left++;
-	  sseek (dtp->u.p.current_unit->s,
-		  offset-(sizeof (gfc_char4_t)), SEEK_SET);
+
+	  cc = dtp->internal_unit[offset];
+	  if (cc != (gfc_char4_t)' ')
+	    sseek (dtp->u.p.current_unit->s,
+		   offset-(sizeof (gfc_char4_t)), SEEK_SET);
 	}
       else
 	{
@@ -425,11 +427,13 @@ eat_spaces (st_parameter_dt *dtp)
 	      c = dtp->internal_unit[offset++];
 	      dtp->u.p.current_unit->bytes_left--;
 	    }
-	  while (offset < limit && (c == ' ' || c == '\t'));
+	  while (offset < limit && c == ' ');
 	  /* Back up, seek ahead, and fall through to complete the
 	     process so that END conditions are handled correctly.  */
 	  dtp->u.p.current_unit->bytes_left++;
-	  sseek (dtp->u.p.current_unit->s, offset-1, SEEK_SET);
+
+	  if (dtp->internal_unit[offset] != ' ')
+	    sseek (dtp->u.p.current_unit->s, offset - 1, SEEK_SET);
 	}
     }
   /* Now skip spaces, EOF and EOL are handled in next_char.  */
! { dg-do run }
! PR61173.f90 Bogus END condition
module bd
  character(len=25, kind=1), dimension(:), allocatable, save :: source
  contains
    subroutine init_data
      allocate(source(2))
      source=["   1   1   1  ", "   4   4   4  "]
    end subroutine init_data
end module bd
program read_internal
  use bd
  integer :: x(6),i

  call init_data
  read(source,*) (x(i), i=1,6)
  if (any(x/=[1,1,1,4,4,4])) call abort
end program read_internal

Reply via email to