OSDN Git Service

2008-07-21 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Jul 2008 10:05:32 +0000 (10:05 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Jul 2008 10:05:32 +0000 (10:05 +0000)
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.

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

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 13f1468..d02787b 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 48a20e9..b485123 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 2943c3e..06e2746 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 3f4f9e0..3be3c3c 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 4d246e5..b444a69 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 63b75bd..fd145c1 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 58ce7e9..d78c40a 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 0e9c2f1..06d5532 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 214f378..66a5077 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 e96ef25..3579cff 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 dc39b94..de969a0 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 76ce97e..ac26e86 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 ac7a0ba..fd216b1 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 239d971..aa66a8d 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 28fae59..861debe 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 8ce24ef..01ca57e 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 081ff92..6a6929c 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;