Hi all,

As stated in the PR, the problem turns out to be an ungraceful return after an error. Most namelist errors go through nml_err_ret, The one I am removing did not and in the unique case of UNIT=5 after the error it falls through and hits some code which modifies pointers to the namelist data structures.

This patch fixes it.

Regression tested on x86-64 and manually tested with a redirection to stdin. (cat somefile | ./a.out )

I plan to commit today as simple along with a new testcase.

Regards.

Jerry

2019-01-12  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR libfortran/88776
        * io/list_read.c (namelist_read): Use nml_err_ret path on
        read error, not based on stdin_unit.
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 4a7ccb3ddd5..d9af255a034 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -3614,11 +3614,7 @@ find_nml_name:
   while (!dtp->u.p.input_complete)
     {
       if (!nml_get_obj_data (dtp, &prev_nl, nml_err_msg, sizeof nml_err_msg))
-	{
-	  if (dtp->u.p.current_unit->unit_number != options.stdin_unit)
-	    goto nml_err_ret;
-	  generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
-        }
+	goto nml_err_ret;
 
       /* Reset the previous namelist pointer if we know we are not going
 	 to be doing multiple reads within a single namelist object.  */

Reply via email to