Bug 18398 - Formatted I/O problems
Summary: Formatted I/O problems
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libfortran (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: 4.0.0
Assignee: Not yet assigned to anyone
URL:
Keywords: patch
Depends on:
Blocks: 19292
  Show dependency treegraph
 
Reported: 2004-11-09 14:01 UTC by Salvatore Filippone
Modified: 2005-01-07 14:01 UTC (History)
2 users (show)

See Also:
Host: i686-pc-linux-gnu
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2004-11-26 14:34:00


Attachments
Test case source code (750 bytes, text/plain)
2004-11-09 14:02 UTC, Salvatore Filippone
Details
test case input file (536 bytes, text/plain)
2004-11-09 14:03 UTC, Salvatore Filippone
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Salvatore Filippone 2004-11-09 14:01:20 UTC
The attached test case ought to exactly reproduce its input, and it does not on
two counts: 1. There are missing lines in the output 2. It gives a run time error. 
The runtime error appears similar to that of bug 17597, but this is on formatted
I/O.  If the source is compiled with g77 it produces correct output. 
[sfilippo@localhost BOWL]$ gfortran -v 
Reading specs from /home/local/gfortran/bin/../lib/gcc/i686-pc-linux-gnu/4.0.0/specs
Configured with: ../gcc-4.0-20041107/configure --prefix=/usr/local/gfortran
Thread model: posix
gcc version 4.0.0 20041107 (experimental)
[sfilippo@localhost BOWL]$ g77 -o rnp77 rnp.f
[sfilippo@localhost BOWL]$ gfortran -o rnp rnp.f
[sfilippo@localhost BOWL]$ ./rnp77 <itr >r77
[sfilippo@localhost BOWL]$ ./rnp <itr >rout
At line 47 of file rnp.f
Fortran runtime error: End of file
[sfilippo@localhost BOWL]$ diff rout r77 
7a8
>   cafilm    0.0000    
9a11
>   pgssw     0.0000    
12a15
>   dtmax    0.31100E-04
16a20
>   bore      8.2000    
20a25
>   datdct    0.0000    
22a28
>   swipro    3.1100    
23a30
>   sector    0.0000    

..... etc
Comment 1 Salvatore Filippone 2004-11-09 14:02:56 UTC
Created attachment 7500 [details]
Test case source code
Comment 2 Salvatore Filippone 2004-11-09 14:03:20 UTC
Created attachment 7501 [details]
test case input file
Comment 3 Bud Davis 2004-11-27 15:33:57 UTC
here's a shorter test case:

      program  rinput
      implicit double precision(a-h,o-z)
      character *8 a,b
      open(unit=7)
      write(7,*)'aaaaaaa123.456'
      write(7,*)'bbbbbbb-123.456'
      write(7,*)
      rewind(7)
  610 format(a8,f10.5)
      read (7,610) a,cafin ,b,angmom
      print*, a,cafin ,b,angmom
      stop
      end
Comment 4 Thomas Koenig 2005-01-04 22:20:07 UTC
Even shorter testcase:

$ cat fio.f
      open(7)
      write (7,'(F12.5)') 1.0, 2.0, 3.0
      rewind(7)
      read(7,'(F15.5)') a,b
      print *,a,b
      if (abs(a-1.0) .gt. 1e-5) call abort
      if (abs(b-2.0) .gt. 1e-5) call abort
      end
$ gfortran fio.f && ./a.out
   1.000000       3.000000
$ gfortran -dumpmachine
i686-pc-linux-gnu
Aborted
$ gfortran -v
Using built-in specs.
Configured with: ../gcc/configure --prefix=/home/ig25 --enable-languages=c,c++,f95
Thread model: posix
gcc version 4.0.0 20050103 (experimental)

Here's what should happen:

$ g77 fio.f && ./a.out
  1.  2.
Comment 5 Thomas Koenig 2005-01-04 22:31:11 UTC
> $ gfortran fio.f && ./a.out
>    1.000000       3.000000
> $ gfortran -dumpmachine
> i686-pc-linux-gnu
> Aborted

I had mixed up my cut&paste there... of course,
it was the test program that aborted, not the
gfortran -dumpmachine command.
Comment 6 Thomas Koenig 2005-01-05 08:33:49 UTC
A testcase with character variables:

$ gfortran cline
$ cat cline.f
      character*2 c1,c2
      open(7)
      write (7,'(A1)') 'a','b','c'
      rewind(7)
      read(7,'(A2)') c1,c2
      print *,c1,c2
      if (c2 .ne. 'b ') call abort
      end
$ gfortran cline.f
$ ./a.out
 a c
Aborted
$ g77 cline.f
$ ./a.out
 a b

I think this bug can be summed up as:

"Input Format longer than line length causes following record to be skipped".

This bug may be the reason for the I/O related LAPACK failures.
In the driver programs, for example cchkaa.f at line 314, there's the line

      READ( NIN, FMT = '(A72)', END = 140 )ALINE

If the input line in question is shorter than 72 characters, this bug
will cause the next line to be skipped, with - presumably - bad consequences.
Comment 7 Bud Davis 2005-01-06 06:13:48 UTC
patch here:


http://gcc.gnu.org/ml/fortran/2005-01/msg00038.html
Comment 8 CVS Commits 2005-01-07 03:25:53 UTC
Subject: Bug 18398

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	bdavis@gcc.gnu.org	2005-01-07 03:25:48

Modified files:
	gcc/testsuite  : ChangeLog 
	libgfortran    : ChangeLog 
	libgfortran/io : transfer.c 
Added files:
	gcc/testsuite/gfortran.dg: fmt_read.f90 

Log message:
	2005-01-07  Bud Davis  <bdavis9659@comcast.net>
	
	PR fortran/18398
	* transfer.c (next_record_r): always skip the
	eol search if it was found during sf_read.
	
	* gfortran.dg/fmt_read.f90: New test.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/fmt_read.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.4858&r2=1.4859
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/ChangeLog.diff?cvsroot=gcc&r1=1.143&r2=1.144
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/io/transfer.c.diff?cvsroot=gcc&r1=1.23&r2=1.24

Comment 9 Andrew Pinski 2005-01-07 14:01:36 UTC
Fixed.