]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/34530 (namelist read broken when whitespace after &namelist)
authorTobias Burnus <burnus@net-b.de>
Thu, 20 Dec 2007 08:16:48 +0000 (09:16 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 20 Dec 2007 08:16:48 +0000 (09:16 +0100)
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

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/namelist_44.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/io/list_read.c

index 231375bc37420a96184a3dfb980be271c6ee37d1..3c67c45c256df7e0de4004d16dba03def16e29d7 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/namelist_44.f90 b/gcc/testsuite/gfortran.dg/namelist_44.f90
new file mode 100644 (file)
index 0000000..5922d43
--- /dev/null
@@ -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
index 286524b35c274fbcf73553fb23108b5f0a40c26c..9d84e1bd5fa4d91cb13ecf4bd88ac4543beac17c 100644 (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
index df43589cad06b9744c7ca444097baaa3378a7d76..06fd8a151eac928c2825c03bf2e9308c2e0dc85a 100644 (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.  */