summaryrefslogtreecommitdiff
path: root/libgfortran/intrinsics/iso_c_binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgfortran/intrinsics/iso_c_binding.c')
-rw-r--r--libgfortran/intrinsics/iso_c_binding.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/libgfortran/intrinsics/iso_c_binding.c b/libgfortran/intrinsics/iso_c_binding.c
index 38f07753c72..bb25e3e2d4f 100644
--- a/libgfortran/intrinsics/iso_c_binding.c
+++ b/libgfortran/intrinsics/iso_c_binding.c
@@ -75,9 +75,8 @@ ISO_C_BINDING_PREFIX (c_f_pointer) (void *c_ptr_in,
/* A generic function to set the common fields of all descriptors, no
- matter whether it's to a scalar or an array. Fields set are: data,
- and if appropriate, rank, offset, dim[*].lbound, dim[*].ubound, and
- dim[*].stride. Parameter shape is a rank 1 array of integers
+ matter whether it's to a scalar or an array. Access is via the array
+ descrptor macros. Parameter shape is a rank 1 array of integers
containing the upper bound of each dimension of what f_ptr_out
points to. The length of this array must be EXACTLY the rank of
what f_ptr_out points to, as required by the draft (J3/04-007). If
@@ -104,51 +103,51 @@ ISO_C_BINDING_PREFIX (c_f_pointer_u0) (void *c_ptr_in,
p = shape->data;
size = GFC_DESCRIPTOR_SIZE(shape);
- source_stride = shape->dim[0].stride * size;
+ source_stride = GFC_DESCRIPTOR_STRIDE_BYTES(shape,0);
/* shape's length (rank of the output array) */
- shapeSize = shape->dim[0].ubound + 1 - shape->dim[0].lbound;
+ shapeSize = GFC_DESCRIPTOR_EXTENT(shape,0);
for (i = 0; i < shapeSize; i++)
{
- /* Lower bound is 1, as specified by the draft. */
- f_ptr_out->dim[i].lbound = 1;
+ index_type str, ub;
+
/* Have to allow for the SHAPE array to be any valid kind for
an INTEGER type. */
#ifdef HAVE_GFC_INTEGER_1
if (size == 1)
- f_ptr_out->dim[i].ubound = *((GFC_INTEGER_1 *) p);
+ ub = *((GFC_INTEGER_1 *) p);
#endif
#ifdef HAVE_GFC_INTEGER_2
if (size == 2)
- f_ptr_out->dim[i].ubound = *((GFC_INTEGER_2 *) p);
+ ub = *((GFC_INTEGER_2 *) p);
#endif
#ifdef HAVE_GFC_INTEGER_4
if (size == 4)
- f_ptr_out->dim[i].ubound = *((GFC_INTEGER_4 *) p);
+ ub = *((GFC_INTEGER_4 *) p);
#endif
#ifdef HAVE_GFC_INTEGER_8
if (size == 8)
- f_ptr_out->dim[i].ubound = *((GFC_INTEGER_8 *) p);
+ ub = *((GFC_INTEGER_8 *) p);
#endif
#ifdef HAVE_GFC_INTEGER_16
if (size == 16)
- f_ptr_out->dim[i].ubound = *((GFC_INTEGER_16 *) p);
+ ub = *((GFC_INTEGER_16 *) p);
#endif
p += source_stride;
if (i == 0)
{
- f_ptr_out->dim[0].stride = 1;
- f_ptr_out->offset = f_ptr_out->dim[0].lbound
- * f_ptr_out->dim[0].stride;
+ str = 1;
+ f_ptr_out->offset = str;
}
else
{
- f_ptr_out->dim[i].stride = (f_ptr_out->dim[i-1].ubound + 1)
- - f_ptr_out->dim[i-1].lbound;
- f_ptr_out->offset += f_ptr_out->dim[i].lbound
- * f_ptr_out->dim[i].stride;
+ str = GFC_DESCRIPTOR_EXTENT(f_ptr_out,i-1);
+ f_ptr_out->offset += str;
}
+
+ /* Lower bound is 1, as specified by the draft. */
+ GFC_DIMENSION_SET(f_ptr_out->dim[i], 1, ub, str);
}
f_ptr_out->offset *= -1;