From: Paul Brook Date: Tue, 31 Aug 2004 20:37:43 +0000 (+0000) Subject: re PR libfortran/16805 (Runtime failure using list directed read from string) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=334ff453eaa61a47ee9b45b273a0a8057697060e;p=gcc.git re PR libfortran/16805 (Runtime failure using list directed read from string) PR libfortran/16805 * io/list_read.c (next_char): Don't signal EOF for internal files. * io/unix.c (mem_alloc_r_at): Don't return NULL for incomplete reads. testsuite/ 2004-08-31 Bud Davis * gfortran.dg/list_read_2.f90: New test. From-SVN: r86844 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5e8be36c636..10dd9bf3c1d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-08-31 Bud Davis + + PR libfortran/16805 + * gfortran.dg/list_read_2.f90: New test. + 2004-08-31 Mark Mitchell * g++.dg/abi/key1.C: New test. diff --git a/gcc/testsuite/gfortran.dg/list_read_2.f90 b/gcc/testsuite/gfortran.dg/list_read_2.f90 new file mode 100644 index 00000000000..f60a8362010 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/list_read_2.f90 @@ -0,0 +1,25 @@ +! { dg-do run } +! PR16805 +! Test list directed reads from character substrings +! The IO library was reporting an error rather the end-or-fecord when it +! got to the end of an internal file record. +program list_read_2 + implicit none + character*10 a + data a /'1234567890'/ + integer i + logical debug + data debug /.TRUE./ + read(a,*)i + if (i.ne.1234567890) call abort + read(a(1:1),*)i + if (i.ne.1) call abort + read(a(2:2),*)i + if (i.ne.2) call abort + read(a(1:5),*)i + if (i.ne.12345) call abort + read(a(5:10),*)i + if (i.ne.567890) call abort + read(a(10:10),*)i + if (i.ne.0) call abort +end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 83e03388269..50ad7a6290f 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2004-08-31 Paul Brook + + PR libfortran/16805 + * io/list_read.c (next_char): Don't signal EOF for internal files. + * io/unix.c (mem_alloc_r_at): Don't return NULL for incomplete reads. + 2004-08-31 Tobias Schlueter * io/unit.c: Separate copyright years by ','. diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 8b00a5e296e..f47d473df91 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -142,8 +142,17 @@ next_char (void) } if (length == 0) - longjmp (g.eof_jump, 1); - c = *p; + { + /* For internal files return a newline instead of signalling EOF. */ + /* ??? This isn't quite right, but we don't handle internal files + with multiple records. */ + if (is_internal_unit ()) + c = '\n'; + else + longjmp (g.eof_jump, 1); + } + else + c = *p; done: at_eol = (c == '\n'); diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 33d7fda4514..377cadd438e 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -746,9 +746,6 @@ mem_alloc_r_at (unix_stream * s, int *len, gfc_offset where) if (where < s->buffer_offset || where > s->buffer_offset + s->active) return NULL; - if (is_internal_unit() && where + *len > s->file_length) - return NULL; - s->logical_offset = where + *len; n = s->buffer_offset + s->active - where;