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
This commit is contained in:
Jakub Jelinek 2011-02-24 21:13:57 +01:00 committed by Jakub Jelinek
parent 01bd5703f5
commit ae01ced508
4 changed files with 28 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2011-02-24 Jakub Jelinek <jakub@redhat.com>
PR fortran/47878
* gfortran.dg/pr47878.f90: New test.
2011-02-24 Richard Guenther <rguenther@suse.de> 2011-02-24 Richard Guenther <rguenther@suse.de>
PR testsuite/47801 PR testsuite/47801

View File

@ -0,0 +1,10 @@
! PR fortran/47878
! { dg-do run }
integer :: a(5)
open (99, recl = 40)
write (99, '(5i3)') 1, 2, 3
rewind (99)
read (99, '(5i3)') a
if (any (a.ne.(/1, 2, 3, 0, 0/))) call abort
close (99, status = 'delete')
end

View File

@ -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> 2011-02-24 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/47802 PR libfortran/47802

View File

@ -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. Free Software Foundation, Inc.
Contributed by Andy Vaught Contributed by Andy Vaught
Namelist transfer functions contributed by Paul Thomas Namelist transfer functions contributed by Paul Thomas
@ -284,7 +284,6 @@ static char *
read_sf (st_parameter_dt *dtp, int * length) read_sf (st_parameter_dt *dtp, int * length)
{ {
static char *empty_string[0]; static char *empty_string[0];
char *base;
int q, q2; int q, q2;
int n, lorig, seen_comma; 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. */ /* Read data into format buffer and scan through it. */
lorig = *length; lorig = *length;
base = fbuf_getptr (dtp->u.p.current_unit);
if (base == NULL)
return NULL;
while (n < *length) while (n < *length)
{ {
@ -396,7 +392,12 @@ read_sf (st_parameter_dt *dtp, int * length)
if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0) if ((dtp->common.flags & IOPARM_DT_HAS_SIZE) != 0)
dtp->u.p.size_used += (GFC_IO_INT) n; 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;
} }