diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-02-24 21:13:57 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-02-24 21:13:57 +0100 |
commit | ae01ced508fd6d5e9d624a6e225bef0741ebb736 (patch) | |
tree | 70db0376a7fb8a2f0f1238edba4f17781f849d1a /libgfortran | |
parent | 01bd5703f577e2c3331c27c623d7a37c85ca2ffa (diff) | |
download | gcc-ae01ced508fd6d5e9d624a6e225bef0741ebb736.zip gcc-ae01ced508fd6d5e9d624a6e225bef0741ebb736.tar.gz gcc-ae01ced508fd6d5e9d624a6e225bef0741ebb736.tar.bz2 |
re PR fortran/47878 (187.facerec miscompares)
PR fortran/47878
* io/transfer.c (read_sf): Call fbuf_getptr only at the end,
and subtract n, dtp->u.p.sf_seen_eor and seen_comma from it.
* gfortran.dg/pr47878.f90: New test.
From-SVN: r170476
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 13 |
2 files changed, 13 insertions, 6 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 0b0a27e..c7e1950 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2011-02-24 Jakub Jelinek <jakub@redhat.com> + + PR fortran/47878 + * io/transfer.c (read_sf): Call fbuf_getptr only at the end, + and subtract n, dtp->u.p.sf_seen_eor and seen_comma from it. + 2011-02-24 Janne Blomqvist <jb@gcc.gnu.org> PR libfortran/47802 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index ad5d19d..15f90e7 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Andy Vaught Namelist transfer functions contributed by Paul Thomas @@ -284,7 +284,6 @@ static char * read_sf (st_parameter_dt *dtp, int * length) { static char *empty_string[0]; - char *base; int q, q2; int n, lorig, seen_comma; @@ -302,9 +301,6 @@ read_sf (st_parameter_dt *dtp, int * length) /* Read data into format buffer and scan through it. */ lorig = *length; - base = fbuf_getptr (dtp->u.p.current_unit); - if (base == NULL) - return NULL; while (n < *length) { @@ -396,7 +392,12 @@ read_sf (st_parameter_dt *dtp, int * length) if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) dtp->u.p.size_used += (GFC_IO_INT) n; - return base; + /* We can't call fbuf_getptr before the loop doing fbuf_getc, because + fbuf_getc might reallocate the buffer. So return current pointer + minus all the advances, which is n plus up to two characters + of newline or comma. */ + return fbuf_getptr (dtp->u.p.current_unit) + - n - dtp->u.p.sf_seen_eor - seen_comma; } |