diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2008-05-04 10:14:49 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2008-05-04 10:14:49 +0000 |
commit | 9e6dca75944c1d711ef62e4d7d2befa9179e166b (patch) | |
tree | 916b49d74e2b351e44cd9159b7487c6daebdecef /libgfortran/intrinsics | |
parent | 7ad99d60f442253354e6a7b1be56748f6e627246 (diff) | |
download | gcc-9e6dca75944c1d711ef62e4d7d2befa9179e166b.zip gcc-9e6dca75944c1d711ef62e4d7d2befa9179e166b.tar.gz gcc-9e6dca75944c1d711ef62e4d7d2befa9179e166b.tar.bz2 |
re PR fortran/35990 (run-time abort for PACK of run-time zero sized array)
2008-05-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/35990
* intrinsics/pack_generic.c: Really commit.
From-SVN: r134928
Diffstat (limited to 'libgfortran/intrinsics')
-rw-r--r-- | libgfortran/intrinsics/pack_generic.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/libgfortran/intrinsics/pack_generic.c b/libgfortran/intrinsics/pack_generic.c index e282c91..bb4abae 100644 --- a/libgfortran/intrinsics/pack_generic.c +++ b/libgfortran/intrinsics/pack_generic.c @@ -491,6 +491,7 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array, index_type dim; index_type ssize; index_type nelem; + index_type total; dim = GFC_DESCRIPTOR_RANK (array); ssize = 1; @@ -498,6 +499,9 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array, { count[n] = 0; extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound; + if (extent[n] < 0) + extent[n] = 0; + sstride[n] = array->dim[n].stride * size; ssize *= extent[n]; } @@ -505,18 +509,26 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array, sstride[0] = size; sstride0 = sstride[0]; - sptr = array->data; + + if (ssize != 0) + sptr = array->data; + else + sptr = NULL; if (ret->data == NULL) { /* Allocate the memory for the result. */ - int total; if (vector != NULL) { /* The return array will have as many elements as there are in vector. */ total = vector->dim[0].ubound + 1 - vector->dim[0].lbound; + if (total <= 0) + { + total = 0; + vector = NULL; + } } else { |