aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/m4/reshape.m4
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2008-04-20 19:56:07 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2008-04-20 19:56:07 +0000
commit8c154b65579602aad087eff7229a460412b9ed8c (patch)
treea0f091b6d4e9ffd907ca682662f415fcb11b9fd8 /libgfortran/m4/reshape.m4
parenteea05d39c799880df753e9b74d2d96e86215c46e (diff)
downloadgcc-8c154b65579602aad087eff7229a460412b9ed8c.zip
gcc-8c154b65579602aad087eff7229a460412b9ed8c.tar.gz
gcc-8c154b65579602aad087eff7229a460412b9ed8c.tar.bz2
re PR fortran/35960 (run time abort with assignment of RESHAPEd zero sized array)
2008-04-20 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/35960 * intrinsics/reshape_generic.c (reshape_internal): If the size of the resized array is zero, as determined by the SHAPE argument, return early. * m4/reshape.m4: Likewise. * generated/reshape_i4.c: Regererated. * generated/reshape_i8.c: Regenerated. * generated/reshape_i16.c: Regenerated. * generated/reshape_r4.c: Regenerated. * generated/reshape_r8.c: Regenerated. * generated/reshape_r10.c: Regenerated. * generated/reshape_r16.c: Regenerated. * generated/reshape_c4.c: Regenerated. * generated/reshape_c8.c: Regenerated. * generated/reshape_c10.c: Regenerated. * generated/reshape_c16.c: Regenerated. 2008-04-20 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/35960 * gfortran.dg/reshape_zerosize_1.f90: New file. From-SVN: r134490
Diffstat (limited to 'libgfortran/m4/reshape.m4')
-rw-r--r--libgfortran/m4/reshape.m433
1 files changed, 25 insertions, 8 deletions
diff --git a/libgfortran/m4/reshape.m4 b/libgfortran/m4/reshape.m4
index de936f0..ed060ec 100644
--- a/libgfortran/m4/reshape.m4
+++ b/libgfortran/m4/reshape.m4
@@ -85,16 +85,32 @@ reshape_'rtype_ccode` ('rtype` * const restrict ret,
const 'rtype_name` *src;
int n;
int dim;
- int sempty, pempty;
+ int sempty, pempty, shape_empty;
+ index_type shape_data[GFC_MAX_DIMENSIONS];
+
+ rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1;
+ if (rdim != GFC_DESCRIPTOR_RANK(ret))
+ runtime_error("rank of return array incorrect in RESHAPE intrinsic");
+
+ shape_empty = 0;
+
+ for (n = 0; n < rdim; n++)
+ {
+ shape_data[n] = shape->data[n * shape->dim[0].stride];
+ if (shape_data[n] <= 0)
+ {
+ shape_data[n] = 0;
+ shape_empty = 1;
+ }
+ }
if (ret->data == NULL)
{
- rdim = shape->dim[0].ubound - shape->dim[0].lbound + 1;
rs = 1;
for (n = 0; n < rdim; n++)
{
ret->dim[n].lbound = 0;
- rex = shape->data[n * shape->dim[0].stride];
+ rex = shape_data[n];
ret->dim[n].ubound = rex - 1;
ret->dim[n].stride = rs;
rs *= rex;
@@ -103,10 +119,9 @@ reshape_'rtype_ccode` ('rtype` * const restrict ret,
ret->data = internal_malloc_size ( rs * sizeof ('rtype_name`));
ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
}
- else
- {
- rdim = GFC_DESCRIPTOR_RANK (ret);
- }
+
+ if (shape_empty)
+ return;
rsize = 1;
for (n = 0; n < rdim; n++)
@@ -119,8 +134,10 @@ reshape_'rtype_ccode` ('rtype` * const restrict ret,
rcount[n] = 0;
rstride[n] = ret->dim[dim].stride;
rextent[n] = ret->dim[dim].ubound + 1 - ret->dim[dim].lbound;
+ if (rextent[n] < 0)
+ rextent[n] == 0;
- if (rextent[n] != shape->data[dim * shape->dim[0].stride])
+ if (rextent[n] != shape_data[dim])
runtime_error ("shape and target do not conform");
if (rsize == rstride[n])