re PR libfortran/34530 (namelist read broken when whitespace after &namelist)

2007-12-20  Tobias Burnus  <burnus@net-b.de>

        PR fortran/34530
        * io/list_read.c (eat_line): Move up in the file.
        (eat_separator): In namelist mode, skip over comment lines.

2007-12-20  Tobias Burnus  <burnus@net-b.de>

        PR fortran/34530
        * gfortran.dg/namelist_44.f90: New.

From-SVN: r131099
This commit is contained in:
Tobias Burnus 2007-12-20 09:16:48 +01:00 committed by Tobias Burnus
parent c7abc45c7f
commit 667e20459d
4 changed files with 62 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2007-12-20 Tobias Burnus <burnus@net-b.de>
PR fortran/34530
* gfortran.dg/namelist_44.f90: New.
2007-12-20 Tobias Burnus <burnus@net-b.de>
PR fortran/34482

View File

@ -0,0 +1,29 @@
! { dg-do run }
!
! PR fortran/34530
!
! Skipping over comment line was not working
!
! Test case contributed by Harald Anlauf.
!
program gfcbug77
implicit none
character(len=128) :: file = ""
logical :: default
namelist /BLACKLIST/ file, default
integer, parameter :: nnml = 10
default = .true.
open (nnml, file='gfcbug77.nml')
write(nnml,*) "&blacklist " ! The trailing space breaks gfortran
write(nnml,*) " ! This is a comment within the namelist"
write(nnml,*) " file = 'myfile'"
write(nnml,*) " default = F"
write(nnml,*) "/"
rewind(nnml)
read (nnml, nml=BLACKLIST)
close(nnml)
if(file /= "myfile" .or. default) call abort()
! write (*,nml=BLACKLIST)
end program gfcbug77

View File

@ -1,3 +1,9 @@
2007-12-19 Tobias Burnus <burnus@net-b.de>
PR fortran/34530
* io/list_read.c (eat_line): Move up in the file.
(eat_separator): In namelist mode, skip over comment lines.
2007-12-16 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/34427

View File

@ -275,6 +275,20 @@ eat_spaces (st_parameter_dt *dtp)
}
/* This function reads characters through to the end of the current line and
just ignores them. */
static void
eat_line (st_parameter_dt *dtp)
{
char c;
if (!is_internal_unit (dtp))
do
c = next_char (dtp);
while (c != '\n');
}
/* Skip over a separator. Technically, we don't always eat the whole
separator. This is because if we've processed the last input item,
then a separator is unnecessary. Plus the fact that operating
@ -328,7 +342,14 @@ eat_separator (st_parameter_dt *dtp)
if (dtp->u.p.namelist_mode)
{
do
c = next_char (dtp);
{
c = next_char (dtp);
if (c == '!')
{
eat_line (dtp);
c = next_char (dtp);
}
}
while (c == '\n' || c == '\r' || c == ' ');
unget_char (dtp, c);
}
@ -407,20 +428,6 @@ finish_separator (st_parameter_dt *dtp)
}
/* This function reads characters through to the end of the current line and
just ignores them. */
static void
eat_line (st_parameter_dt *dtp)
{
char c;
if (!is_internal_unit (dtp))
do
c = next_char (dtp);
while (c != '\n');
}
/* This function is needed to catch bad conversions so that namelist can
attempt to see if dtp->u.p.saved_string contains a new object name rather
than a bad value. */