Hi, the attached patch fixes the remaining cases of handling input that ends in EOF instead of a normal separator for list formatted read of the primitive types. Ok for trunk and 4.6?
2011-07-04 Janne Blomqvist <j...@gcc.gnu.org> PR libfortran/49296 * io/list_read.c (read_logical): Don't error out if a valid value is followed by EOF instead of a normal separator. (read_integer): Likewise. testsuite: 2011-07-04 Janne Blomqvist <j...@gcc.gnu.org> PR libfortran/49296 * gfortran.dg/read_list_eof_1.f90: Add tests for integer, real, and logical reads. -- Janne Blomqvist
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index baf2f54..c88f232 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -657,22 +657,20 @@ read_logical (st_parameter_dt *dtp, int length) { case 't': v = 1; - if ((c = next_char (dtp)) == EOF) - goto bad_logical; + c = next_char (dtp); l_push_char (dtp, c); - if (!is_separator(c)) + if (!is_separator(c) && c != EOF) goto possible_name; unget_char (dtp, c); break; case 'f': v = 0; - if ((c = next_char (dtp)) == EOF) - goto bad_logical; + c = next_char (dtp); l_push_char (dtp, c); - if (!is_separator(c)) + if (!is_separator(c) && c != EOF) goto possible_name; unget_char (dtp, c); @@ -837,6 +835,7 @@ read_integer (st_parameter_dt *dtp, int length) goto repeat; CASE_SEPARATORS: /* Not a repeat count. */ + case EOF: goto done; default: @@ -886,6 +885,7 @@ read_integer (st_parameter_dt *dtp, int length) break; CASE_SEPARATORS: + case EOF: goto done; default:
! { 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 integer :: ii real :: rr logical :: ll call genfil ('a') 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 call genfil ('1') open (unit=20, file='read.dat', form='FORMATTED', action='READ', & status='OLD') read (20, fmt=*) ii close (20, status='delete') if (ii /= 1) then call abort () end if call genfil ('1.5') open (unit=20, file='read.dat', form='FORMATTED', action='READ', & status='OLD') read (20, fmt=*) rr close (20, status='delete') if (rr /= 1.5) then call abort () end if call genfil ('T') open (unit=20, file='read.dat', form='FORMATTED', action='READ', & status='OLD') read (20, fmt=*) ll close (20, status='delete') if (.not. ll) then call abort () end if contains subroutine genfil(str) character(len=*), intent(in) :: str open(10, file='read.dat', form='unformatted', action='write', & status='replace', access='stream') write(10) str close(10) end subroutine genfil end program read_list_eof_1