From: Tobias Burnus Date: Thu, 20 Dec 2007 08:16:48 +0000 (+0100) Subject: re PR libfortran/34530 (namelist read broken when whitespace after &namelist) X-Git-Tag: releases/gcc-4.3.0~861 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=667e20459d82a01e61fc590781c53fd2c136ef96;p=thirdparty%2Fgcc.git re PR libfortran/34530 (namelist read broken when whitespace after &namelist) 2007-12-20 Tobias Burnus 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 PR fortran/34530 * gfortran.dg/namelist_44.f90: New. From-SVN: r131099 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 231375bc3742..3c67c45c256d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-12-20 Tobias Burnus + + PR fortran/34530 + * gfortran.dg/namelist_44.f90: New. + 2007-12-20 Tobias Burnus PR fortran/34482 diff --git a/gcc/testsuite/gfortran.dg/namelist_44.f90 b/gcc/testsuite/gfortran.dg/namelist_44.f90 new file mode 100644 index 000000000000..5922d43964aa --- /dev/null +++ b/gcc/testsuite/gfortran.dg/namelist_44.f90 @@ -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 diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 286524b35c27..9d84e1bd5fa4 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2007-12-19 Tobias Burnus + + 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 PR fortran/34427 diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index df43589cad06..06fd8a151eac 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -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. */