From c808637ebd40215efaffc70b76d51cdda632bf57 Mon Sep 17 00:00:00 2001 From: tkoenig Date: Sun, 20 Apr 2008 19:56:07 +0000 Subject: 2008-04-20 Thomas Koenig 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 PR libfortran/35960 * gfortran.dg/reshape_zerosize_1.f90: New file. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134490 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgfortran/m4/reshape.m4 | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'libgfortran/m4') diff --git a/libgfortran/m4/reshape.m4 b/libgfortran/m4/reshape.m4 index de936f0191a..ed060ecb9ff 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]) -- cgit v1.2.1