[patch, fortran] PR30014 INQUIRE (iolength = xx) limited to kind=4

Jerry DeLisle jvdelisle@verizon.net
Sat Dec 16 05:45:00 GMT 2006


ping

Also, should I increase size parameter as well? Any opinions?

Jerry DeLisle wrote:
> :ADDPATCH fortran:
> 
> The attached patch changes the type to GFC_IO_INT which will either be 
> kind=4 or kind=8 depending on the system.  The patch is very straight 
> forward.  I don't see any point giving a warning if a user specifies a 
> variable of kind=8 in a -std=f95 situation.  If others feel stronger 
> about this I will do it.  The restriction is lifted in F2003
> 
> OK for 4.3 only?   Since this is an enhancement really and it does mess 
> a bit with the size of st_parameter_dt it should not go to 4.2.
> 
> Regression tested on x86-64-Linux. A test case for this will require a 
> lot of memory and consumes time.  I suggest we go without one for this.  
> I have attached the test case that I used to check this out.
> 
> Also, while we are at it here should we go ahead and do the same for the 
> size parameter?
> 
> 2006-12-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
> 
>     PR fortran/30014
>     * ioparm.def: Define iolength parameter to be type of pointer to 
> pintio.
> 
> 2006-12-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
> 
>     PR lingfortran/30014
>     * io.h: Define iolength parameter to type GFC_IO_INT.
>     * transfer.c (iolength_transfer): Cast size to GFC_IO_INT.
> 
> 
> ------------------------------------------------------------------------
> 
> Index: gcc/fortran/ioparm.def
> ===================================================================
> *** gcc/fortran/ioparm.def	(revision 119608)
> --- gcc/fortran/ioparm.def	(working copy)
> *************** IOPARM (inquire, convert,       1 << 30,
> *** 61,67 ****
>   IOPARM (dt,      common,	0,	 common)
>   IOPARM (dt,      rec,		1 << 9,  intio)
>   IOPARM (dt,      size,		1 << 10, pint4)
> ! IOPARM (dt,      iolength,	1 << 11, pint4)
>   IOPARM (dt,      internal_unit_desc, 0,  parray)
>   IOPARM (dt,      format,	1 << 12, char1)
>   IOPARM (dt,      advance,	1 << 13, char2)
> --- 61,67 ----
>   IOPARM (dt,      common,	0,	 common)
>   IOPARM (dt,      rec,		1 << 9,  intio)
>   IOPARM (dt,      size,		1 << 10, pint4)
> ! IOPARM (dt,      iolength,	1 << 11, pintio)
>   IOPARM (dt,      internal_unit_desc, 0,  parray)
>   IOPARM (dt,      format,	1 << 12, char1)
>   IOPARM (dt,      advance,	1 << 13, char2)
> Index: libgfortran/io/io.h
> ===================================================================
> *** libgfortran/io/io.h	(revision 119608)
> --- libgfortran/io/io.h	(working copy)
> *************** typedef struct st_parameter_dt
> *** 354,360 ****
>   {
>     st_parameter_common common;
>     GFC_IO_INT rec;
> !   GFC_INTEGER_4 *size, *iolength;
>     gfc_array_char *internal_unit_desc;
>     CHARACTER1 (format);
>     CHARACTER2 (advance);
> --- 354,361 ----
>   {
>     st_parameter_common common;
>     GFC_IO_INT rec;
> !   GFC_INTEGER_4 *size;
> !   GFC_IO_INT *iolength;
>     gfc_array_char *internal_unit_desc;
>     CHARACTER1 (format);
>     CHARACTER2 (advance);
> Index: libgfortran/io/transfer.c
> ===================================================================
> *** libgfortran/io/transfer.c	(revision 119608)
> --- libgfortran/io/transfer.c	(working copy)
> *************** iolength_transfer (st_parameter_dt *dtp,
> *** 2615,2621 ****
>   		   size_t size, size_t nelems)
>   {
>     if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
> !     *dtp->iolength += (GFC_INTEGER_4) size * nelems;
>   }
>   
>   
> --- 2615,2621 ----
>   		   size_t size, size_t nelems)
>   {
>     if ((dtp->common.flags & IOPARM_DT_HAS_IOLENGTH) != 0)
> !     *dtp->iolength += (GFC_IO_INT) size * nelems;
>   }
>   
>   
> 
> 
> ------------------------------------------------------------------------
> 
> program subrecord
>   integer, parameter :: arraydim = huge(1_4)/16
>   real, dimension(arraydim) :: array
>   integer :: x
>   integer(kind=8) :: recl
> 
>   inquire (iolength = recl) array,x,array,x,array,x,array,x,x,x
>   print *, "record size =", recl
> 
> end program subrecord



More information about the Fortran mailing list