re PR fortran/47778 (reading two arrays of structures from namelist fails)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 27 Feb 2011 20:06:10 +0000 (20:06 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 27 Feb 2011 20:06:10 +0000 (20:06 +0000)
2011-02-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/47778
* io/list_read.c (namelist_read): Intialize the error string buffere.
If pprev_nl was used during the previous namelist read and the rank
was zero, reset the pointer to NULL for the next namelist read.

From-SVN: r170548

libgfortran/ChangeLog
libgfortran/io/list_read.c

index bc85a6c9e0fda089ea80f72fb2dc2c7d0371c572..800c1490bcbbde98a4210ac692caa5207b9a015d 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/47778
+       * io/list_read.c (namelist_read): Intialize the error string buffere.
+       If pprev_nl was used during the previous namelist read and the rank
+       was zero, reset the pointer to NULL for the next namelist read.
+
 2011-02-26  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR libfortran/45165
index 9d797cc270d260a3483c4a796ddc90a865c04b1d..ea232327f48b5f545b36c2fa84ad031a76331c0a 100644 (file)
@@ -2985,6 +2985,11 @@ namelist_read (st_parameter_dt *dtp)
 {
   int c;
   char nml_err_msg[200];
+
+  /* Initialize the error string buffer just in case we get an unexpected fail
+     somewhere and end up at nml_err_ret.  */
+  strcpy (nml_err_msg, "Internal namelist read error");
+
   /* Pointer to the previously read object, in case attempt is made to read
      new object name.  Should this fail, error message can give previous
      name.  */
@@ -3058,6 +3063,11 @@ find_nml_name:
            goto nml_err_ret;
          generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
         }
+
+      /* Reset the previous namelist pointer if we know we are not going
+        to be doing multiple reads within a single namelist object.  */
+      if (prev_nl && prev_nl->var_rank == 0)
+       prev_nl = NULL;
     }
 
   free_saved (dtp);