[Bug libfortran/88776] New: Namelist read from stdin: loss of data
anlauf at gmx dot de
gcc-bugzilla@gcc.gnu.org
Wed Jan 9 21:07:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88776
Bug ID: 88776
Summary: Namelist read from stdin: loss of data
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libfortran
Assignee: unassigned at gcc dot gnu.org
Reporter: anlauf at gmx dot de
Target Milestone: ---
Reading namelist from unit 5 may skip valid data later when an error is
encountered. This problem does not occur when another unit number is used.
Example:
% cat gfcbug154.f90
program nmlbug
implicit none
integer :: i, stat, nnml
nnml = 5 ! No problem with nnml = 10
! nnml = 10
open (nnml, file="gfcbug154.dat", action="read")
do i = 1, 3
print *, "# Read namelist", i
call read_nml_type_2
print *
end do
contains
subroutine read_nml_type_2
!----------------------------------------------------------
! variant 2 of namelist input: chan = real char(len=*) real
!----------------------------------------------------------
type t_chan
real :: ichan = -1.
character(len=10) :: flag = ''
real :: band = -1.
end type t_chan
type(t_chan) :: chan(2)
namelist /CHAN_NML/ chan
chan(:) = t_chan(-1.,'',-1.)
stat = 0
read (nnml, nml=CHAN_NML, iostat=stat, end=99)
print *, "read_nml_type_2: stat=", stat
print *, "chan(1)=", chan(1)
print *, "chan(2)=", chan(2)
return
99 stop "EOF"
end subroutine read_nml_type_2
end program nmlbug
% cat gfcbug154.dat
&CHAN_NML
chan = 3 '#1 ' '0.1'
6 '#1 ' 0.8
/
&CHAN_NML
chan = 4 '#2 ' 0.1
7 '#2 ' 0.2
/
&CHAN_NML
chan = 5 '#3 ' 0.3
8 '#3 ' 0.4
/
The above code outputs:
# Read namelist 1
read_nml_type_2: stat= 5010
chan(1)= 4.00000000 #2 0.100000001
chan(2)= 7.00000000 #2 0.200000003
# Read namelist 2
read_nml_type_2: stat= 0
chan(1)= 5.00000000 #3 0.300000012
chan(2)= 8.00000000 #3 0.400000006
# Read namelist 3
STOP EOF
whereas with e.g. unit 10 it (correctly) outputs:
# Read namelist 1
read_nml_type_2: stat= 5010
chan(1)= 3.00000000 #1 -1.00000000
chan(2)= -1.00000000 -1.00000000
# Read namelist 2
read_nml_type_2: stat= 0
chan(1)= 4.00000000 #2 0.100000001
chan(2)= 7.00000000 #2 0.200000003
# Read namelist 3
read_nml_type_2: stat= 0
chan(1)= 5.00000000 #3 0.300000012
chan(2)= 8.00000000 #3 0.400000006
For some reason, when an error is encountered during the first read,
it correctly sets the error status, but apparently continues to the
second namelist instance.
More information about the Gcc-bugs
mailing list