From: Thomas Koenig Date: Sun, 4 May 2008 10:14:49 +0000 (+0000) Subject: re PR fortran/35990 (run-time abort for PACK of run-time zero sized array) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9e6dca75944c1d711ef62e4d7d2befa9179e166b;p=gcc.git re PR fortran/35990 (run-time abort for PACK of run-time zero sized array) 2008-05-04 Thomas Koenig PR libfortran/35990 * intrinsics/pack_generic.c: Really commit. From-SVN: r134928 --- diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 89019b36f8a..ec9ab88b753 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2008-05-04 Thomas Koenig + + PR libfortran/35990 + * intrinsics/pack_generic.c: Really commit. + 2008-05-04 Thomas Koenig PR libfortran/35990 diff --git a/libgfortran/intrinsics/pack_generic.c b/libgfortran/intrinsics/pack_generic.c index e282c916502..bb4abaeae4b 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 {