This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] Use correct type for transferring array descriptor info to library


Hi,

I plan to commit the following obvious patch in 24 hours unless someone objects. The problem is that the array descriptor triplets for each dimension (ubound, stride, lbound) are transferred as GFC_INTEGER_4 rather than as the correct array index type (typedeffed to ssize_t). It's a rather obscure bug, surfacing only when doing namelist I/O on big arrays on 64-bit platforms. But it's the right thing to do, so it should be done.



--
Janne Blomqvist
Fortran frontend changelog:

2007-07-26  Janne Blomqvist  <jb@gcc.gnu.org>

	* trans-io.c (gfc_build_io_library_fndecls): Change to use
	gfc_array_index_type for array descriptor triplets instead of
	gfc_int4_type_node.

libgfortran ChangeLog:

2007-07-26  Janne Blomqvist  <jb@gcc.gnu.org>

	* io/transfer.c (st_set_nml_var_dim): Use index_type instead of
	GFC_INTEGER_4 for array descriptor triplets.
Index: gcc/fortran/trans-io.c
===================================================================
--- gcc/fortran/trans-io.c	(revision 126947)
+++ gcc/fortran/trans-io.c	(working copy)
@@ -417,8 +417,8 @@ gfc_build_io_library_fndecls (void)
   iocall[IOCALL_SET_NML_VAL_DIM] =
     gfc_build_library_function_decl (get_identifier (PREFIX("st_set_nml_var_dim")),
 				     void_type_node, 5, dt_parm_type,
-				     gfc_int4_type_node, gfc_int4_type_node,
-				     gfc_int4_type_node, gfc_int4_type_node);
+				     gfc_int4_type_node, gfc_array_index_type,
+				     gfc_array_index_type, gfc_array_index_type);
 }
 
 
Index: libgfortran/io/transfer.c
===================================================================
--- libgfortran/io/transfer.c	(revision 126947)
+++ libgfortran/io/transfer.c	(working copy)
@@ -2906,14 +2906,14 @@ st_set_nml_var (st_parameter_dt *dtp, vo
 
 /* Store the dimensional information for the namelist object.  */
 extern void st_set_nml_var_dim (st_parameter_dt *, GFC_INTEGER_4,
-				GFC_INTEGER_4, GFC_INTEGER_4,
-				GFC_INTEGER_4);
+				index_type, index_type,
+				index_type);
 export_proto(st_set_nml_var_dim);
 
 void
 st_set_nml_var_dim (st_parameter_dt *dtp, GFC_INTEGER_4 n_dim,
-		    GFC_INTEGER_4 stride, GFC_INTEGER_4 lbound,
-		    GFC_INTEGER_4 ubound)
+		    index_type stride, index_type lbound,
+		    index_type ubound)
 {
   namelist_info * nml;
   int n;
@@ -2922,9 +2922,9 @@ st_set_nml_var_dim (st_parameter_dt *dtp
 
   for (nml = dtp->u.p.ionml; nml->next; nml = nml->next);
 
-  nml->dim[n].stride = (ssize_t)stride;
-  nml->dim[n].lbound = (ssize_t)lbound;
-  nml->dim[n].ubound = (ssize_t)ubound;
+  nml->dim[n].stride = stride;
+  nml->dim[n].lbound = lbound;
+  nml->dim[n].ubound = ubound;
 }
 
 /* Reverse memcpy - used for byte swapping.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]