PR 49296 List directed read of string ending in EOF.
authorjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jun 2011 07:53:09 +0000 (07:53 +0000)
committerjb <jb@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 18 Jun 2011 07:53:09 +0000 (07:53 +0000)
libgfortran ChangeLog entry:

2011-06-18  Janne Blomqvist  <jb@gcc.gnu.org>

        PR libfortran/49296
        * io/list_read.c (read_character): Accept EOF as a separator when
        reading string.

testsuite ChangeLog entry:

2011-06-18  Janne Blomqvist  <jb@gcc.gnu.org>

        PR libfortran/48296
* gfortran.dg/read_list_eof_1.f90: New test.

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

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/read_list_eof_1.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/list_read.c

index dc35df3..d1469b6 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-18  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR libfortran/48296
+       * gfortran.dg/read_list_eof_1.f90: New test.
+
 2011-06-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/49411
diff --git a/gcc/testsuite/gfortran.dg/read_list_eof_1.f90 b/gcc/testsuite/gfortran.dg/read_list_eof_1.f90
new file mode 100644 (file)
index 0000000..775346e
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do run }
+! PR 49296 List formatted read of file without EOR marker (\n).
+program read_list_eof_1
+  implicit none
+  character(len=100) :: s
+  call genfil ()
+  open (unit=20, file='read.dat', form='FORMATTED', action='READ', &
+       status='OLD')
+  read (20, fmt=*) s
+  close (20, status='delete')
+  if (trim(s) /= "a") then
+     call abort ()
+  end if
+
+contains
+  subroutine genfil
+    open(10, file='read.dat', form='unformatted', action='write', &
+         status='replace', access='stream')
+    write(10) 'a'
+    close(10)
+  end subroutine genfil
+end program read_list_eof_1
index bd95cd3..b0f0666 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-18  Janne Blomqvist  <jb@gcc.gnu.org>
+
+        PR libfortran/49296
+        * io/list_read.c (read_character): Accept EOF as a separator when
+        reading string.
+
 2011-06-17  Daniel Carrera  <dcarrera@gmail.com>
 
        * caf/single.c (_gfortran_caf_register): Store the address
index 38a92e1..baf2f54 100644 (file)
@@ -1022,7 +1022,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
   for (;;)
     {
       if ((c = next_char (dtp)) == EOF)
-       goto eof;
+       goto done_eof;
       switch (c)
        {
        case '"':
@@ -1068,26 +1068,26 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
      invalid.  */
  done:
   c = next_char (dtp);
- eof:
-  if (is_separator (c) || c == '!')
done_eof:
+  if (is_separator (c) || c == '!' || c == EOF)
     {
       unget_char (dtp, c);
       eat_separator (dtp);
       dtp->u.p.saved_type = BT_CHARACTER;
       free_line (dtp);
     }
-  else
+  else 
     {
       free_saved (dtp);
-      if (c == EOF)
-       {
-         hit_eof (dtp);
-         return;
-       }
       snprintf (message, MSGLEN, "Invalid string input in item %d",
                  dtp->u.p.item_count);
       generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
     }
+  return;
+
+ eof:
+  free_saved (dtp);
+  hit_eof (dtp);
 }