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 08:06:02 +0000 (08:06 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 4 May 2008 08:06:02 +0000 (08:06 +0000)
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
number of elements to zero if the vector has an extent
less or equal to zero.
* m4/pack.m4:  Set the source pointer to NULL if the
source array is zero-sized.  Set the total number of
elemements to zero if the vector has an extent less or
equal to zero.
* generated/pack_i1.c:  Regenerated.
* generated/pack_i2.c:  Regenerated.
* generated/pack_i4.c:  Regenerated.
* generated/pack_i8.c:  Regenerated.
* generated/pack_i16.c:  Regenerated.
* generated/pack_r4.c:  Regenerated.
* generated/pack_r8.c:  Regenerated.
* generated/pack_r10.c:  Regenerated.
* generated/pack_r16.c:  Regenerated.
* generated/pack_c4.c:  Regenerated.
* generated/pack_c8.c:  Regenerated.
* generated/pack_c10.c:  Regenerated.
* generated/pack_c16.c:  Regenerated.

2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/35990
* gfortran.dg/intrinsic_pack_4.f90:  New test case.

From-SVN: r134927

17 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/intrinsic_pack_4.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/generated/pack_c10.c
libgfortran/generated/pack_c16.c
libgfortran/generated/pack_c4.c
libgfortran/generated/pack_c8.c
libgfortran/generated/pack_i1.c
libgfortran/generated/pack_i16.c
libgfortran/generated/pack_i2.c
libgfortran/generated/pack_i4.c
libgfortran/generated/pack_i8.c
libgfortran/generated/pack_r10.c
libgfortran/generated/pack_r16.c
libgfortran/generated/pack_r4.c
libgfortran/generated/pack_r8.c
libgfortran/m4/pack.m4

index a8880ad5a3447d78aebcbcedd4e00859f6d66982..ef2a4be73d8155dfbb2b0c117a21b6625b732773 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-04  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/35990
+       * gfortran.dg/intrinsic_pack_4.f90:  New test case.
+
 2008-05-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/discr6_pkg.ads: New helper.
diff --git a/gcc/testsuite/gfortran.dg/intrinsic_pack_4.f90 b/gcc/testsuite/gfortran.dg/intrinsic_pack_4.f90
new file mode 100644 (file)
index 0000000..6910368
--- /dev/null
@@ -0,0 +1,72 @@
+! { dg-do run }
+! PR 35990 - some empty array sections caused pack to crash.
+! Test case contributed by Dick Hendrickson, adjusted and
+! extended by Thomas Koenig.
+      program try_gf1048
+
+      call       gf1048a(  10,  8,  7,  1,  0,  .true.) 
+      call       gf1048b(  10,  8,  7,  1,  0,  .true.) 
+      call       gf1048c(  10,  8,  7,  1,  0,  .true.) 
+      call       gf1048d(  10,  8,  7,  1,  0,  .true.) 
+      call       P_inta (  10,  8,  7,  1,  0,  .true.)    
+      call       P_intb (  10,  8,  7,  1,  0,  .true.)    
+      call       P_intc (  10,  8,  7,  1,  0,  .true.)    
+      call       P_intd (  10,  8,  7,  1,  0,  .true.)    
+      end program
+
+      SUBROUTINE GF1048a(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      CHARACTER(9) BDA(10)
+      CHARACTER(9) BDA1(10)
+      BDA(  8:7) = PACK(BDA1( 10:  1), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE GF1048b(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      CHARACTER(9) BDA(10)
+      CHARACTER(9) BDA1(nf10)
+      BDA(NF8:NF7) = PACK(BDA1(NF8:NF7), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE GF1048c(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      CHARACTER(9) BDA(10)
+      CHARACTER(9) BDA1(10)
+      BDA(NF8:NF7) = PACK(BDA1(NF10:NF1), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE GF1048d(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      CHARACTER(9) BDA(10)
+      CHARACTER(9) BDA1(nf10)
+      BDA(NF8:NF7) = PACK(BDA1(NF10:NF1), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE P_INTa(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      INTEGER BDA(10)
+      INTEGER BDA1(10)
+      BDA(  8:7) = PACK(BDA1( 10:  1), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE P_INTb(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      INTEGER BDA(10)
+      INTEGER BDA1(nf10)
+      BDA(NF8:NF7) = PACK(BDA1(NF8:NF7), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE P_INTc(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      INTEGER BDA(10)
+      INTEGER BDA1(10)
+      BDA(NF8:NF7) = PACK(BDA1(NF10:NF1), NF_TRUE)
+      END SUBROUTINE
+
+      SUBROUTINE P_INTd(nf10,nf8,nf7,nf1,nf0,nf_true)
+      logical nf_true
+      INTEGER BDA(10)
+      INTEGER BDA1(nf10)
+      BDA(NF8:NF7) = PACK(BDA1(NF10:NF1), NF_TRUE)
+      END SUBROUTINE
+
index 63b6ad0ddc88b4a02133c6ab7525497a0d11a7a9..89019b36f8a6321823c1ffb01c43614523613731 100644 (file)
@@ -1,3 +1,29 @@
+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
+       number of elements to zero if the vector has an extent
+       less or equal to zero.
+       * m4/pack.m4:  Set the source pointer to NULL if the
+       source array is zero-sized.  Set the total number of
+       elemements to zero if the vector has an extent less or
+       equal to zero.
+       * generated/pack_i1.c:  Regenerated.
+       * generated/pack_i2.c:  Regenerated.
+       * generated/pack_i4.c:  Regenerated.
+       * generated/pack_i8.c:  Regenerated.
+       * generated/pack_i16.c:  Regenerated.
+       * generated/pack_r4.c:  Regenerated.
+       * generated/pack_r8.c:  Regenerated.
+       * generated/pack_r10.c:  Regenerated.
+       * generated/pack_r16.c:  Regenerated.
+       * generated/pack_c4.c:  Regenerated.
+       * generated/pack_c8.c:  Regenerated.
+       * generated/pack_c10.c:  Regenerated.
+       * generated/pack_c16.c:  Regenerated.
+
 2008-05-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/36094
index c9a0c58a5b5743bba4d5b2af47696a25cd004961..0bad32385d87a566fd2ed5c7a7c8f4b59d738f4b 100644 (file)
@@ -103,7 +103,6 @@ pack_c10 (gfc_array_c10 *ret, const gfc_array_c10 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_c10 (gfc_array_c10 *ret, const gfc_array_c10 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_c10 (gfc_array_c10 *ret, const gfc_array_c10 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_c10 (gfc_array_c10 *ret, const gfc_array_c10 *array,
 }
 
 #endif
+
index 2996be2d220db028ff682786a4a9aae40a6586b3..a0c87ec8a266855886af91043b19cd36cceba1b0 100644 (file)
@@ -103,7 +103,6 @@ pack_c16 (gfc_array_c16 *ret, const gfc_array_c16 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_c16 (gfc_array_c16 *ret, const gfc_array_c16 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_c16 (gfc_array_c16 *ret, const gfc_array_c16 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_c16 (gfc_array_c16 *ret, const gfc_array_c16 *array,
 }
 
 #endif
+
index ee41c0b8cbf0163092bb3de3b440c04d6d9c468a..2fb6a20ad9c0d153bcd6c9d8e8b7484e31d83a65 100644 (file)
@@ -103,7 +103,6 @@ pack_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_c4 (gfc_array_c4 *ret, const gfc_array_c4 *array,
 }
 
 #endif
+
index a129422e04f732aef5e511f703b5c86a88c5420d..1a4e78ec792447465148af9065884e35c71ae77d 100644 (file)
@@ -103,7 +103,6 @@ pack_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_c8 (gfc_array_c8 *ret, const gfc_array_c8 *array,
 }
 
 #endif
+
index 25d7f569de51b3d4cb6757e38fd2bd07c20c7988..44c6c677e445e2930a3f2acb75689ba1361ac2f4 100644 (file)
@@ -103,7 +103,6 @@ pack_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_i1 (gfc_array_i1 *ret, const gfc_array_i1 *array,
 }
 
 #endif
+
index 35c64ce8a9e5a3f447f78edf790caf27467f0449..e9c154379775d80054deaeb03a9dcf27f0f3be6f 100644 (file)
@@ -103,7 +103,6 @@ pack_i16 (gfc_array_i16 *ret, const gfc_array_i16 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_i16 (gfc_array_i16 *ret, const gfc_array_i16 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_i16 (gfc_array_i16 *ret, const gfc_array_i16 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_i16 (gfc_array_i16 *ret, const gfc_array_i16 *array,
 }
 
 #endif
+
index 3a42bd38d78d3c5cbd75a26d8fa92dbed94e113d..51380c26ba72bc6b652fc05e7d39c53b86f9984d 100644 (file)
@@ -103,7 +103,6 @@ pack_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_i2 (gfc_array_i2 *ret, const gfc_array_i2 *array,
 }
 
 #endif
+
index 28e09f6abec215f537cc3b014038ab61e9e6ec63..861670d6865b7f7f61fe11708b5d9df49bb95b83 100644 (file)
@@ -103,7 +103,6 @@ pack_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_i4 (gfc_array_i4 *ret, const gfc_array_i4 *array,
 }
 
 #endif
+
index 44fc430782fdfb5623efb6d2d53df208d4dd36a3..c547f3809f2be379648074960d59397dddd582de 100644 (file)
@@ -103,7 +103,6 @@ pack_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_i8 (gfc_array_i8 *ret, const gfc_array_i8 *array,
 }
 
 #endif
+
index 72fe254d918acc34df844788563ce613f6bb1926..4b8c5784aef88f028c8b22356f86f25f6a9614b6 100644 (file)
@@ -103,7 +103,6 @@ pack_r10 (gfc_array_r10 *ret, const gfc_array_r10 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_r10 (gfc_array_r10 *ret, const gfc_array_r10 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_r10 (gfc_array_r10 *ret, const gfc_array_r10 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_r10 (gfc_array_r10 *ret, const gfc_array_r10 *array,
 }
 
 #endif
+
index 0ced53ab017d45fe0f7619060aedba0a595766f3..a691f7c4041102c80f75ad2f57902b6120a23f5e 100644 (file)
@@ -103,7 +103,6 @@ pack_r16 (gfc_array_r16 *ret, const gfc_array_r16 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_r16 (gfc_array_r16 *ret, const gfc_array_r16 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_r16 (gfc_array_r16 *ret, const gfc_array_r16 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_r16 (gfc_array_r16 *ret, const gfc_array_r16 *array,
 }
 
 #endif
+
index 17172ed92a802ef878bf709aa10a643296a6b7f1..c008aadf4d435154a5f6d14afa5ee813df6cb647 100644 (file)
@@ -103,7 +103,6 @@ pack_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_r4 (gfc_array_r4 *ret, const gfc_array_r4 *array,
 }
 
 #endif
+
index 9d0fb5b5d78ad2259996370c8e1d90f34261dfe9..7b36047962848f6d46a81567f421e8a9650f35d2 100644 (file)
@@ -103,7 +103,6 @@ pack_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -139,6 +138,11 @@ pack_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -149,6 +153,11 @@ pack_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array,
          /* 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
        {
@@ -308,3 +317,4 @@ pack_r8 (gfc_array_r8 *ret, const gfc_array_r8 *array,
 }
 
 #endif
+
index 87409a562233dc69559232f980845d0e1d1a8818..4f31ffdd15e7dc87d5cd44ea4c485ed87bd4cf29 100644 (file)
@@ -104,7 +104,6 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array,
 
   dim = GFC_DESCRIPTOR_RANK (array);
 
-  sptr = array->data;
   mptr = mask->data;
 
   /* Use the same loop for all logical types, by using GFC_LOGICAL_1
@@ -140,6 +139,11 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array,
   if (mstride[0] == 0)
     mstride[0] = mask_kind;
 
+  if (zero_sized)
+    sptr = NULL;
+  else
+    sptr = array->data;
+
   if (ret->data == NULL || compile_options.bounds_check)
     {
       /* Count the elements, either for allocating memory or
@@ -150,6 +154,11 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array,
          /* 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
        {
@@ -309,4 +318,4 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array,
 }
 
 #endif
-'
\ No newline at end of file
+'