re PR fortran/58324 (Bogus END-of-line error with list-directed I/O of file without...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 15 Mar 2014 15:12:01 +0000 (15:12 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 15 Mar 2014 15:12:01 +0000 (15:12 +0000)
2014-03-15  Jerry DeLisle  <jvdelisle@gcc.gnu>

PR libfortran/58324
* io/list_read.c (finish_list_read): Read one character to check
for the end of the file.  If it is the end, then issue the file
end error message.  If not, use eat_line to reach the end
without giving error.  The next attempt to read will then
issue the error as described above.

From-SVN: r208591

libgfortran/ChangeLog
libgfortran/io/list_read.c

index f32b34cd8a485c8245050dccda25275bff0d47b7..358a31cbe5ac346ae9b60cbb87dd185198c71c04 100644 (file)
@@ -1,3 +1,12 @@
+2014-03-15  Jerry DeLisle  <jvdelisle@gcc.gnu>
+
+       PR libfortran/58324
+       * io/list_read.c (finish_list_read): Read one character to check
+       for the end of the file.  If it is the end, then issue the file
+       end error message.  If not, use eat_line to reach the end
+       without giving error.  The next attempt to read will then
+       issue the error as described above.
+
 2014-03-12  Jerry DeLisle  <jvdelisle@gcc.gnu>
 
        PR libfortran/38199
@@ -10,7 +19,7 @@
        formatted READ.
        * io/list_read.c (finish_list_read): Don't call eat_line for
        internal units.
-        
+
 2014-03-08  Jerry DeLisle  <jvdelisle@gcc.gnu>
 
        PR libfortran/38199
index 2467569d639679d406222592a0e1d175334fcaa8..caeb41b078275f6aa1203ac30384e86a081a78b1 100644 (file)
@@ -2092,8 +2092,6 @@ list_formatted_read (st_parameter_dt *dtp, bt type, void *p, int kind,
 void
 finish_list_read (st_parameter_dt *dtp)
 {
-  int err;
-
   free_saved (dtp);
 
   fbuf_flush (dtp->u.p.current_unit, dtp->u.p.mode);
@@ -2106,13 +2104,20 @@ finish_list_read (st_parameter_dt *dtp)
 
   if (!is_internal_unit (dtp))
     {
-      err = eat_line (dtp);
-      if (err == LIBERROR_END)
+      int c;
+      c = next_char (dtp);
+      if (c == EOF)
        {
          free_line (dtp);
          hit_eof (dtp);
+         return;
        }
+      if (c != '\n')
+       eat_line (dtp);
     }
+
+  free_line (dtp);
+
 }
 
 /*                     NAMELIST INPUT