re PR fortran/32217 (segfaults (at runtime) on UNPACK with zero-sized arrays)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 8 Jul 2007 22:20:04 +0000 (22:20 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 8 Jul 2007 22:20:04 +0000 (22:20 +0000)
2007-07-08  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/32217
* intrinsics/unpack_generic.c:  If the destination array is
empty, return early.

2007-07-08  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/32217
* gfortran.dg/unpack_zerosize_1.f90:  New test case.

From-SVN: r126469

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

index c983b9223950b21e9c4bda12553212590a6e65ee..4f24f50eb4848a240badc02037c41ea2a0ec5717 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-08  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/32217
+       * gfortran.dg/unpack_zerosize_1.f90:  New test case.
+
 2007-07-08  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/17711
diff --git a/gcc/testsuite/gfortran.dg/unpack_zerosize_1.f90 b/gcc/testsuite/gfortran.dg/unpack_zerosize_1.f90
new file mode 100644 (file)
index 0000000..8a41f5d
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do run }
+! PR 32217 - unpack used to crash at runtime with a zero-sized
+!            array.  Test case submitted by Jaroslav Hajek.
+program bug_report
+  implicit none
+  integer,parameter:: rp = kind(1.d0),na = 6
+  real(rp),allocatable:: hhe(:,:,:),hhc(:,:,:),dv(:)
+  integer:: nhh,ndv
+  nhh = 0
+  allocate(hhe(nhh,2,2))
+  ndv = 2*na + count(hhe /= 0)
+  allocate(hhc(nhh,2,2),dv(ndv))
+  hhc = unpack(dv(2*na+1:),hhe /= 0._rp,0._rp)
+end program bug_report
index 0d475917d81b21448386cedad1a0594cf203a27f..0b9239d1e0a57028b9b853ae0f35eb24649f3a00 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-08  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/32217
+       * intrinsics/unpack_generic.c:  If the destination array is
+       empty, return early.
+
 2007-07-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        * aclocal.m4: Regenerated.
index 13166f9db2f488694ade397f62e234897243fa66..b349f0d60fd0efcb4ce071b2a0f57cc4528a640f 100644 (file)
@@ -61,6 +61,9 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector,
   index_type n;
   index_type dim;
 
+  int empty;
+
+  empty = 0;
   if (ret->data == NULL)
     {
       /* The front end has signalled that we need to populate the
@@ -74,6 +77,7 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector,
          ret->dim[n].lbound = 0;
          ret->dim[n].ubound = mask->dim[n].ubound - mask->dim[n].lbound;
          extent[n] = ret->dim[n].ubound + 1;
+         empty = empty || extent[n] <= 0;
          rstride[n] = ret->dim[n].stride * size;
          fstride[n] = field->dim[n].stride * fsize;
          mstride[n] = mask->dim[n].stride;
@@ -89,6 +93,7 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector,
        {
          count[n] = 0;
          extent[n] = ret->dim[n].ubound + 1 - ret->dim[n].lbound;
+         empty = empty || extent[n] <= 0;
          rstride[n] = ret->dim[n].stride * size;
          fstride[n] = field->dim[n].stride * fsize;
          mstride[n] = mask->dim[n].stride;
@@ -96,6 +101,10 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector,
       if (rstride[0] == 0)
        rstride[0] = size;
     }
+
+  if (empty)
+    return;
+
   if (fstride[0] == 0)
     fstride[0] = fsize;
   if (mstride[0] == 0)