PR libfortran/31001
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Mar 2007 16:37:54 +0000 (16:37 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 3 Mar 2007 16:37:54 +0000 (16:37 +0000)
        * intrinsics/pack_generic.c (pack_internal): Add special checks
        for zero-sized arrays.

        * gfortran.dg/zero_sized_3.f90: New test.

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

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/zero_sized_3.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/intrinsics/pack_generic.c

index 2b4a696..e3d16ac 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-03  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/31001
+       * gfortran.dg/zero_sized_3.f90: New test.
+
 2007-03-03  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
        PR c++/15787
diff --git a/gcc/testsuite/gfortran.dg/zero_sized_3.f90 b/gcc/testsuite/gfortran.dg/zero_sized_3.f90
new file mode 100644 (file)
index 0000000..e4e1c06
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do run }
+! Testcase for PR libfortran/31001
+  implicit none
+
+  integer :: i, j, k
+  integer, allocatable :: mm(:)
+  logical, allocatable :: mask(:)
+
+  do i = 2, -2, -1
+    do k = 0, 1
+      allocate (mm(i), mask(i))
+      mm(:) = k
+      mask(:) = (mm == 0)
+      j = count (mask)
+      print *, pack (mm, mask)
+      if (size (pack (mm, mask)) /= j) call abort
+      deallocate (mm, mask)
+    end do
+  end do
+end
index 49ab4dd..cfa42b2 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-03  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR libfortran/31001
+       * intrinsics/pack_generic.c (pack_internal): Add special checks
+       for zero-sized arrays.
+
 2007-03-01  Brooks Moses  <brooks.moses@codesourcery.com>
 
        * Makefile.am: Add dummy install-pdf target.
index 1b0d725..06e7084 100644 (file)
@@ -93,15 +93,19 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
 
   index_type count[GFC_MAX_DIMENSIONS];
   index_type extent[GFC_MAX_DIMENSIONS];
+  int zero_sized;
   index_type n;
   index_type dim;
   index_type nelem;
 
   dim = GFC_DESCRIPTOR_RANK (array);
+  zero_sized = 0;
   for (n = 0; n < dim; n++)
     {
       count[n] = 0;
       extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound;
+      if (extent[n] <= 0)
+       zero_sized = 1;
       sstride[n] = array->dim[n].stride * size;
       mstride[n] = mask->dim[n].stride;
     }
@@ -154,6 +158,8 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
          const GFC_LOGICAL_4 *m = mptr;
 
          total = 0;
+         if (zero_sized)
+           m = NULL;
 
          while (m)
            {