re PR fortran/35990 (run-time abort for PACK of run-time zero sized array)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 4 May 2008 10:14:49 +0000 (10:14 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 4 May 2008 10:14:49 +0000 (10:14 +0000)
2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/35990
* intrinsics/pack_generic.c:  Really commit.

From-SVN: r134928

libgfortran/ChangeLog
libgfortran/intrinsics/pack_generic.c

index 89019b3..ec9ab88 100644 (file)
@@ -1,6 +1,11 @@
 2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR libfortran/35990
+       * intrinsics/pack_generic.c:  Really commit.
+
+2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/35990
        * intrinsics/pack_generic.c:  If an extent of the source
        array is less then zero, set it to zero.  Set the source
        pointer to NULL if the source size is zero.  Set the total
index e282c91..bb4abae 100644 (file)
@@ -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
        {