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 89019b36f8a6321823c1ffb01c43614523613731..ec9ab88b75333c5413a802335d6b240a1d6d96a9 100644 (file)
@@ -1,3 +1,8 @@
+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
index e282c916502e8dd5d066ff9068dd319379118d43..bb4abaeae4b4b895b3543d9ea664e0d75730e89e 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
        {