OSDN Git Service

2008-05-04 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 May 2008 10:14:49 +0000 (10:14 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 May 2008 10:14:49 +0000 (10:14 +0000)
PR libfortran/35990
* intrinsics/pack_generic.c:  Really commit.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134928 138bc75d-0d04-0410-961f-82ee72b054a4

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
        {