From ae01ced508fd6d5e9d624a6e225bef0741ebb736 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 24 Feb 2011 21:13:57 +0100 Subject: 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 --- libgfortran/ChangeLog | 6 ++++++ libgfortran/io/transfer.c | 13 +++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'libgfortran') 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 + + 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 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; } -- cgit v1.1