re PR libfortran/36773 (zero-sized arrays with cshift and eoshift)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 21 Jul 2008 10:05:32 +0000 (10:05 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 21 Jul 2008 10:05:32 +0000 (10:05 +0000)
2008-07-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/36773
* intrinsics/cshift0.c (cshift0):  Return early if size of array
is zero.
* intrinsics/eoshift0.c (eoshift0):  Return early if size of
return array is zero.
* intrinsics/eoshift2.c (eoshift2):  Likewise.
* m4/eoshift1.m4 (eoshift1):  Return early if size of array
is zero.
* m4/eoshift3.m4 (eoshift3):  Likewise.
* m4/eoshift2.m4 (eoshift2):  Return early if size of return
array is zero.
* m4/eoshift4.m4 (eoshift2):  Return early if size of return
array is zero.
* generated/cshift1_16.c: Regenerated.
* generated/cshift1_4.c: Regenerated.
* generated/cshift1_8.c: Regenerated.
* generated/eoshift1_16.c: Regenerated.
* generated/eoshift1_4.c: Regenerated.
* generated/eoshift1_8.c: Regenerated.
* generated/eoshift3_16.c: Regenerated.
* generated/eoshift3_4.c: Regenerated.
* generated/eoshift3_8.c: Regenerated.

2008-07-21  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/36773
* gfortran.dg/zero_sized_5.f90:  New test case.

From-SVN: r138027

18 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/zero_sized_5.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/generated/cshift1_16.c
libgfortran/generated/cshift1_4.c
libgfortran/generated/cshift1_8.c
libgfortran/generated/eoshift1_16.c
libgfortran/generated/eoshift1_4.c
libgfortran/generated/eoshift1_8.c
libgfortran/generated/eoshift3_16.c
libgfortran/generated/eoshift3_4.c
libgfortran/generated/eoshift3_8.c
libgfortran/intrinsics/cshift0.c
libgfortran/intrinsics/eoshift0.c
libgfortran/intrinsics/eoshift2.c
libgfortran/m4/cshift1.m4
libgfortran/m4/eoshift1.m4
libgfortran/m4/eoshift3.m4

index 13f146817809e0ae65eb7b010a5bf7d72ace0025..d02787b284afc7a5010efe3a8b42ae0e059cdc9f 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/36773
+       * gfortran.dg/zero_sized_5.f90:  New test case.
+
 2008-07-21  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/36870
diff --git a/gcc/testsuite/gfortran.dg/zero_sized_5.f90 b/gcc/testsuite/gfortran.dg/zero_sized_5.f90
new file mode 100644 (file)
index 0000000..30ca8bf
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do run }
+! These used to segfault.
+program main
+  real, dimension(1,0) :: a, b, c
+  integer, dimension(0) :: j
+  a = 0
+  c = 0
+  b = cshift (a,1)
+  b = cshift (a,j)
+  b = eoshift (a,1)
+  b = eoshift (a,(/1/))
+  b = eoshift (a,1,boundary=c(1,:))
+  b = eoshift (a, j, boundary=c(1,:))
+
+end program main
index 48a20e99d2187d8f0dd15203cdcf5f4025524dc3..b485123cb7b1645dbdf8fc434336ba45696d4e66 100644 (file)
@@ -1,3 +1,28 @@
+2008-07-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/36773
+       * intrinsics/cshift0.c (cshift0):  Return early if size of array
+       is zero.
+       * intrinsics/eoshift0.c (eoshift0):  Return early if size of
+       return array is zero.
+       * intrinsics/eoshift2.c (eoshift2):  Likewise.
+       * m4/eoshift1.m4 (eoshift1):  Return early if size of array
+       is zero.
+       * m4/eoshift3.m4 (eoshift3):  Likewise.
+       * m4/eoshift2.m4 (eoshift2):  Return early if size of return
+       array is zero.
+       * m4/eoshift4.m4 (eoshift2):  Return early if size of return
+       array is zero.
+       * generated/cshift1_16.c: Regenerated.
+       * generated/cshift1_4.c: Regenerated.
+       * generated/cshift1_8.c: Regenerated.
+       * generated/eoshift1_16.c: Regenerated.
+       * generated/eoshift1_4.c: Regenerated.
+       * generated/eoshift1_8.c: Regenerated.
+       * generated/eoshift3_16.c: Regenerated.
+       * generated/eoshift3_4.c: Regenerated.
+       * generated/eoshift3_8.c: Regenerated.
+
 2008-07-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/36857
index 2943c3ed86d803c8133873aa6a8b78605ebd6ecd..06e27468e855d4644ce73dfde5d355450f1e48b8 100644 (file)
@@ -67,6 +67,7 @@ cshift1 (gfc_array_char * const restrict ret,
   index_type n;
   int which;
   GFC_INTEGER_16 sh;
+  index_type arraysize;
 
   if (pwhich)
     which = *pwhich - 1;
@@ -76,11 +77,13 @@ cshift1 (gfc_array_char * const restrict ret,
   if (which < 0 || (which + 1) > GFC_DESCRIPTOR_RANK (array))
     runtime_error ("Argument 'DIM' is out of range in call to 'CSHIFT'");
 
+  arraysize = size0 ((array_t *)array);
+
   if (ret->data == NULL)
     {
       int i;
 
-      ret->data = internal_malloc_size (size * size0 ((array_t *)array));
+      ret->data = internal_malloc_size (size * arraysize);
       ret->offset = 0;
       ret->dtype = array->dtype;
       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -95,6 +98,9 @@ cshift1 (gfc_array_char * const restrict ret,
         }
     }
 
+  if (arraysize == 0)
+    return;
+
   extent[0] = 1;
   count[0] = 0;
   n = 0;
index 3f4f9e0bf259acb90d262973bf32ec0b472dc7f7..3be3c3c15a67bd1e97620ef308879236710b6662 100644 (file)
@@ -67,6 +67,7 @@ cshift1 (gfc_array_char * const restrict ret,
   index_type n;
   int which;
   GFC_INTEGER_4 sh;
+  index_type arraysize;
 
   if (pwhich)
     which = *pwhich - 1;
@@ -76,11 +77,13 @@ cshift1 (gfc_array_char * const restrict ret,
   if (which < 0 || (which + 1) > GFC_DESCRIPTOR_RANK (array))
     runtime_error ("Argument 'DIM' is out of range in call to 'CSHIFT'");
 
+  arraysize = size0 ((array_t *)array);
+
   if (ret->data == NULL)
     {
       int i;
 
-      ret->data = internal_malloc_size (size * size0 ((array_t *)array));
+      ret->data = internal_malloc_size (size * arraysize);
       ret->offset = 0;
       ret->dtype = array->dtype;
       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -95,6 +98,9 @@ cshift1 (gfc_array_char * const restrict ret,
         }
     }
 
+  if (arraysize == 0)
+    return;
+
   extent[0] = 1;
   count[0] = 0;
   n = 0;
index 4d246e54d95a5b91a6c9886c8a474c732884874b..b444a691acc129c4ac2bb3345b014db99a47b2cd 100644 (file)
@@ -67,6 +67,7 @@ cshift1 (gfc_array_char * const restrict ret,
   index_type n;
   int which;
   GFC_INTEGER_8 sh;
+  index_type arraysize;
 
   if (pwhich)
     which = *pwhich - 1;
@@ -76,11 +77,13 @@ cshift1 (gfc_array_char * const restrict ret,
   if (which < 0 || (which + 1) > GFC_DESCRIPTOR_RANK (array))
     runtime_error ("Argument 'DIM' is out of range in call to 'CSHIFT'");
 
+  arraysize = size0 ((array_t *)array);
+
   if (ret->data == NULL)
     {
       int i;
 
-      ret->data = internal_malloc_size (size * size0 ((array_t *)array));
+      ret->data = internal_malloc_size (size * arraysize);
       ret->offset = 0;
       ret->dtype = array->dtype;
       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -95,6 +98,9 @@ cshift1 (gfc_array_char * const restrict ret,
         }
     }
 
+  if (arraysize == 0)
+    return;
+
   extent[0] = 1;
   count[0] = 0;
   n = 0;
index 63b75bdbd6b6704b1ff367f57ca8826ced089daf..fd145c12e6e6181702daffc29d39fc06601c4ff7 100644 (file)
@@ -102,6 +102,11 @@ eoshift1 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
   n = 0;
   for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
index 58ce7e9f5dd5540708eebfae128a7b24b943a8f3..d78c40a1113f4591f3ed5da2ad80aac11cf588c2 100644 (file)
@@ -102,6 +102,11 @@ eoshift1 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
   n = 0;
   for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
index 0e9c2f1442a346cd7a05354d6a58bda8c2d786b0..06d55323369de14d7eb59d72864ebf9d80532187 100644 (file)
@@ -102,6 +102,11 @@ eoshift1 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
   n = 0;
   for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
index 214f3783d4fb53095f7a477defc0dc5f22399645..66a507773ace2de4e5d289e6e07f7a76248d9a6d 100644 (file)
@@ -103,6 +103,11 @@ eoshift3 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
 
   extent[0] = 1;
index e96ef2504b052bbaac53481e3ab080c1a74f9eab..3579cffd483ec49c2b3357e3cad77c265fed6aa0 100644 (file)
@@ -103,6 +103,11 @@ eoshift3 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
 
   extent[0] = 1;
index dc39b94eb97693ab47b38bee9fc7b1f0dc02d0c1..de969a0c92b592e06b5dae416134d75c9d64434b 100644 (file)
@@ -103,6 +103,11 @@ eoshift3 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
 
   extent[0] = 1;
index 76ce97e0f10fb907fb73264123d8949e21bc37eb..ac26e86cf5f20e2b4ea53e45d96b31febd137559 100644 (file)
@@ -97,10 +97,43 @@ cshift0 (gfc_array_char * ret, const gfc_array_char * array,
   index_type len;
   index_type n;
   int whichloop;
+  index_type arraysize;
 
   if (which < 1 || which > GFC_DESCRIPTOR_RANK (array))
     runtime_error ("Argument 'DIM' is out of range in call to 'CSHIFT'");
 
+  arraysize = size0 ((array_t *) array);
+
+  if (ret->data == NULL)
+    {
+      int i;
+
+      ret->offset = 0;
+      ret->dtype = array->dtype;
+      for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
+        {
+          ret->dim[i].lbound = 0;
+          ret->dim[i].ubound = array->dim[i].ubound - array->dim[i].lbound;
+
+          if (i == 0)
+            ret->dim[i].stride = 1;
+          else
+            ret->dim[i].stride = (ret->dim[i-1].ubound + 1)
+                                * ret->dim[i-1].stride;
+        }
+
+      if (arraysize > 0)
+       ret->data = internal_malloc_size (size * arraysize);
+      else
+       {
+         ret->data = internal_malloc_size (1);
+         return;
+       }
+    }
+  
+  if (arraysize == 0)
+    return;
+
   which = which - 1;
   sstride[0] = 0;
   rstride[0] = 0;
@@ -142,34 +175,6 @@ cshift0 (gfc_array_char * ret, const gfc_array_char * array,
   soffset = size;
   len = 0;
 
-  if (ret->data == NULL)
-    {
-      int i;
-      index_type arraysize = size0 ((array_t *)array);
-
-      ret->offset = 0;
-      ret->dtype = array->dtype;
-      for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
-        {
-          ret->dim[i].lbound = 0;
-          ret->dim[i].ubound = array->dim[i].ubound - array->dim[i].lbound;
-
-          if (i == 0)
-            ret->dim[i].stride = 1;
-          else
-            ret->dim[i].stride = (ret->dim[i-1].ubound + 1)
-                                * ret->dim[i-1].stride;
-        }
-
-      if (arraysize > 0)
-       ret->data = internal_malloc_size (size * arraysize);
-      else
-       {
-         ret->data = internal_malloc_size (1);
-         return;
-       }
-    }
-
   for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
     {
       if (dim == which)
index ac7a0ba85b60fb6902209b03ec316d8e0e9a50d7..fd216b1084bf3f95238fb49645d1931c96bd662b 100644 (file)
@@ -84,6 +84,11 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
   which = which - 1;
 
index 239d9714a992fe6b4c6e0ff975cdceff92462902..aa66a8dfe009358febe43ad0ee295250f6c4ab44 100644 (file)
@@ -63,6 +63,7 @@ eoshift2 (gfc_array_char *ret, const gfc_array_char *array,
   index_type dim;
   index_type len;
   index_type n;
+  index_type arraysize;
 
   /* The compiler cannot figure out that these are set, initialize
      them to avoid warnings.  */
@@ -70,11 +71,13 @@ eoshift2 (gfc_array_char *ret, const gfc_array_char *array,
   soffset = 0;
   roffset = 0;
 
+  arraysize = size0 ((array_t *) array);
+
   if (ret->data == NULL)
     {
       int i;
 
-      ret->data = internal_malloc_size (size * size0 ((array_t *)array));
+      ret->data = internal_malloc_size (size * arraysize);
       ret->offset = 0;
       ret->dtype = array->dtype;
       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -88,6 +91,14 @@ eoshift2 (gfc_array_char *ret, const gfc_array_char *array,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
+
+  if (arraysize == 0 && filler == NULL)
+    return;
 
   which = which - 1;
 
index 28fae596bd46f3b4b5d939d9cbda09b9803f3788..861debeed2c5a0e58ec067d198f2dfe788155b0c 100644 (file)
@@ -68,6 +68,7 @@ cshift1 (gfc_array_char * const restrict ret,
   index_type n;
   int which;
   'atype_name` sh;
+  index_type arraysize;
 
   if (pwhich)
     which = *pwhich - 1;
@@ -77,11 +78,13 @@ cshift1 (gfc_array_char * const restrict ret,
   if (which < 0 || (which + 1) > GFC_DESCRIPTOR_RANK (array))
     runtime_error ("Argument ''`DIM''` is out of range in call to ''`CSHIFT''`");
 
+  arraysize = size0 ((array_t *)array);
+
   if (ret->data == NULL)
     {
       int i;
 
-      ret->data = internal_malloc_size (size * size0 ((array_t *)array));
+      ret->data = internal_malloc_size (size * arraysize);
       ret->offset = 0;
       ret->dtype = array->dtype;
       for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -96,6 +99,9 @@ cshift1 (gfc_array_char * const restrict ret,
         }
     }
 
+  if (arraysize == 0)
+    return;
+
   extent[0] = 1;
   count[0] = 0;
   n = 0;
index 8ce24eff0f5d501c9fb4f156a8a007a274f393cc..01ca57ec68ded957d5f36f3259de1418b7d108be 100644 (file)
@@ -103,6 +103,11 @@ eoshift1 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
   n = 0;
   for (dim = 0; dim < GFC_DESCRIPTOR_RANK (array); dim++)
index 081ff92727765d3639403ee337fac3e6987891ac..6a6929ca0c70bbbd73337184b2c676fb60b36c11 100644 (file)
@@ -104,6 +104,11 @@ eoshift3 (gfc_array_char * const restrict ret,
             ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
         }
     }
+  else
+    {
+      if (size0 ((array_t *) ret) == 0)
+       return;
+    }
 
 
   extent[0] = 1;