This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Bug Report - akka PR24416
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: François-Xavier Coudert <fxcoudert at gmail dot com>,jvdelisle at gcc dot gnu dot org, patch <gcc-patches at gcc dot gnu dot org>,pinskia at gcc dot gnu dot org
- Cc: Pascal PERNOT <pascal dot pernot at lcp dot u-psud dot fr>, fortran at gcc dot gnu dot org,jg69 at le dot ac dot uk, P dot Schaffnit at access dot rwth-aachen dot de
- Date: Mon, 24 Oct 2005 21:05:26 +0200
- Subject: Re: Bug Report - akka PR24416
- References: <200510241406.16080.pascal.pernot@lcp.u-psud.fr> <19c433eb0510240557w77fb865bsac64bf430f8d74e3@mail.gmail.com>
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