This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, fortran] Use correct type for transferring array descriptor info to library
- From: Janne Blomqvist <blomqvist dot janne at gmail dot com>
- To: gfortran <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 26 Jul 2007 17:17:00 +0300
- Subject: [Patch, fortran] Use correct type for transferring array descriptor info to library
- Dkim-signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:user-agent:mime-version:to:subject:content-type; b=b/IPX34j9HlP3IIZe+6rAsHX42OWUTS3CN8PvdaJhhJ5XMJxiyPyVocEFno8LfOQE5MJv5FpiHDxd3k6CcK4s5vi6Sb+4zGzWlFwNpB7G8SntJPh2Ng0u5IrEDDRNCT2Ur/WKZ2aq7EcYCpr+KN/5NCmoNM+BYG8ImThhIfaL+o=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:user-agent:mime-version:to:subject:content-type; b=N9T/J6SC4YKt0+NQnEyZ3Ay+85Xwiij3apgS0PCRoq1Mc2Vq0Pe/61MKp+GJIw24pFy7gogPuqX6of4Dbdm9ssLlP/9R7zgqp77agp+m9PLh1404PaZCWUwAr4uRqe8oX7U65cQn8OKICqup7+nFAjAMRi6u9SjUdlGRoqrYCv0=
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. */