[Patch, fortran] PR24416 - namelist problem

Paul Thomas paulthomas2@wanadoo.fr
Mon Oct 24 19:09:00 GMT 2005


Sorry, I forgot to change the subject line of what was going to have 
been an off-list message.

> Dear All,
>
> I found the problem:  Alone of all the list_read.c read_type routines, 
> read_character does not call free_saved () upon exiting.  This is 
> because the character string is stored there and has to be available 
> for repeat counts.  The fault occurred with characters because the 
> data in the saved string was being carried over to the next io call.  
> Other types clean up after them, which is why a namelist with a 
> character and any other type works correctly.
>
> Please find a patch, a testcase and ChangeLog entries below.
>
> Bubblestrapped and regtested on FC3/i686
>
> I intend to commit tonight to mainline and 4.0, under the obvious 
> rule, unless anybody objects in the next couple of hours.
>
> Cheers
>
> Paul T
>
> 2005-10-24  Paul Thomas  <pault@gcc.gnu.org>
>
>    PR fortran/24416
>    * libgfortran/io/list_read.c (namelist_read): Exit with call to
>    free_saved () so that character strings do not accumulate.
>
> 2005-10-24  Paul Thomas  <pault@gcc.gnu.org>
>
>    PR fortran/24416
>    gfortran.dg/namelist_char_only.f90: New test.
>
>
>
> Index: gcc/libgfortran/io/list_read.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/libgfortran/io/list_read.c,v
> retrieving revision 1.28
> diff -c -p -r1.28 list_read.c
> *** gcc/libgfortran/io/list_read.c    26 Sep 2005 20:24:44 -0000    1.28
> --- gcc/libgfortran/io/list_read.c    24 Oct 2005 18:40:04 -0000
> *************** find_nml_name:
> *** 2364,2376 ****
>          }
>
>     }
> !
>    return;
>
>    /* All namelist error calls return from here */
>
>  nml_err_ret:
>
>    generate_error (ERROR_READ_VALUE , nml_err_msg);
>    return;
>  }
> --- 2364,2377 ----
>          }
>
>     }
> !   free_saved ();
>    return;
>
>    /* All namelist error calls return from here */
>
>  nml_err_ret:
>
> +   free_saved ();
>    generate_error (ERROR_READ_VALUE , nml_err_msg);
>    return;
>  }
>
> ====================namelist_char_only.f90======================
>
> ! { dg-do run }
> ! { dg-options "-O0" }
> ! Test patch for PR24416.f90 - 'a' used to come back from the read 
> with var
> ! prepended.
> !
>  IMPLICIT NONE
>  CHARACTER(len=10)  :: var = "hello"
>  character(len=10)  :: a = ""
>  NAMELIST /inx/ var
>
>  OPEN(unit=11, status='scratch')
>  write (11, *) "&INX"
>  write (11, *) "  var = 'goodbye'"
>  write (11, *) "&END"
>  rewind (11)
>
>  READ(11,NML=inx)
>  CLOSE(11)
>
>  OPEN(unit=11, status='scratch')
>  write (11, *) "alls_well"
>  rewind (11)
>
>  READ(11,*) a
>  CLOSE(11)
>
>  if (a /= "alls_well") call abort ()
>
> END
>
>
>
>
>
>
>




More information about the Gcc-patches mailing list