re PR fortran/49479 (reshape / optionals / zero sized arrays)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 28 Jun 2011 18:59:04 +0000 (18:59 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 28 Jun 2011 18:59:04 +0000 (18:59 +0000)
2011-06-28  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/49479
* m4/reshape.m4: If source allocation is smaller than one, set it
to one.
* intrinsics/reshape_generic.c:  Likewise.
* generated/reshape_r16.c: Regenerated.
* generated/reshape_c4.c: Regenerated.
* generated/reshape_c16.c: Regenerated.
* generated/reshape_c8.c: Regenerated.
* generated/reshape_r4.c: Regenerated.
* generated/reshape_i4.c: Regenerated.
* generated/reshape_r10.c: Regenerated.
* generated/reshape_r8.c: Regenerated.
* generated/reshape_c10.c: Regenerated.
* generated/reshape_i8.c: Regenerated.
* generated/reshape_i16.c: Regenerated.

2011-06-28  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/49479
* gfortran.dg/reshape_zerosize_3.f90:  New test.

From-SVN: r175594

16 files changed:
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/reshape_zerosize_3.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/generated/reshape_c10.c
libgfortran/generated/reshape_c16.c
libgfortran/generated/reshape_c4.c
libgfortran/generated/reshape_c8.c
libgfortran/generated/reshape_i16.c
libgfortran/generated/reshape_i4.c
libgfortran/generated/reshape_i8.c
libgfortran/generated/reshape_r10.c
libgfortran/generated/reshape_r16.c
libgfortran/generated/reshape_r4.c
libgfortran/generated/reshape_r8.c
libgfortran/intrinsics/reshape_generic.c
libgfortran/m4/reshape.m4

index d270b3eea9d989775f4458976e3698243cc67cab..77a408639ac06b6fa73b10e83e1b5028109ad16b 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/49479
+       * gfortran.dg/reshape_zerosize_3.f90:  New test.
+
 2011-06-28  Janis Johnson  <janisjo@codesourcery.com>
 
        * gcc.target/arm/vfp-ldmdbs.c: Skip for soft float.
diff --git a/gcc/testsuite/gfortran.dg/reshape_zerosize_3.f90 b/gcc/testsuite/gfortran.dg/reshape_zerosize_3.f90
new file mode 100644 (file)
index 0000000..870a76c
--- /dev/null
@@ -0,0 +1,43 @@
+! { dg-do run }
+! PR 49479 - this used not to print anything.
+! Test case by Joost VandeVondele.
+MODULE M1
+  IMPLICIT NONE
+  type foo
+     character(len=5) :: x
+  end type foo
+CONTAINS
+  SUBROUTINE S1(data)
+    INTEGER, DIMENSION(:), INTENT(IN), &
+         OPTIONAL                               :: DATA
+    character(20) :: line
+    IF (.not. PRESENT(data)) call abort
+    write (unit=line,fmt='(I5)') size(data)
+    if (line /= '    0               ') call abort
+  END SUBROUTINE S1
+
+  subroutine s_type(data)
+    type(foo), dimension(:), intent(in), optional :: data
+    character(20) :: line
+    IF (.not. PRESENT(data)) call abort
+    write (unit=line,fmt='(I5)') size(data)
+    if (line /= '    0               ') call abort
+  end subroutine s_type
+
+  SUBROUTINE S2(N)
+    INTEGER :: N
+    INTEGER, ALLOCATABLE, DIMENSION(:, :)    :: blki
+    type(foo), allocatable, dimension(:, :)  :: bar
+    ALLOCATE(blki(3,N))
+    allocate (bar(3,n))
+    blki=0
+    CALL S1(RESHAPE(blki,(/3*N/)))
+    call s_type(reshape(bar, (/3*N/)))
+  END SUBROUTINE S2
+
+END MODULE M1
+
+USE M1
+CALL S2(0)
+END
+! { dg-final { cleanup-modules "m1" } }
index b0f0666a3b5eacb3bbf181550cd8fbdb8f0aca29..88ee3638d1784b41915326939b069abf0153dd3d 100644 (file)
@@ -1,3 +1,21 @@
+2011-06-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/49479
+       * m4/reshape.m4: If source allocation is smaller than one, set it
+       to one.
+       * intrinsics/reshape_generic.c:  Likewise.
+       * generated/reshape_r16.c: Regenerated.
+       * generated/reshape_c4.c: Regenerated.
+       * generated/reshape_c16.c: Regenerated.
+       * generated/reshape_c8.c: Regenerated.
+       * generated/reshape_r4.c: Regenerated.
+       * generated/reshape_i4.c: Regenerated.
+       * generated/reshape_r10.c: Regenerated.
+       * generated/reshape_r8.c: Regenerated.
+       * generated/reshape_c10.c: Regenerated.
+       * generated/reshape_i8.c: Regenerated.
+       * generated/reshape_i16.c: Regenerated.
+
 2011-06-18  Janne Blomqvist  <jb@gcc.gnu.org>
 
         PR libfortran/49296
index 34eff9086a0b707469a655349d8a661f29e0ba19..44446ebfee895ff2ff61581eea5ed4c4b560dcaa 100644 (file)
@@ -97,6 +97,8 @@ reshape_c10 (gfc_array_c10 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_c10 (gfc_array_c10 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_COMPLEX_10));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_COMPLEX_10);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 569b76ce4a87595459569b83b1de8bf9afa3493c..ca588dc2c93a966104eb85efa8a80d103a426d2e 100644 (file)
@@ -97,6 +97,8 @@ reshape_c16 (gfc_array_c16 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_c16 (gfc_array_c16 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_COMPLEX_16));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_COMPLEX_16);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index c8b7355de37fb250cbcebb639ed055475b47417e..e16d32c523916104a88bf5f8a3c3b4f38c4ae772 100644 (file)
@@ -97,6 +97,8 @@ reshape_c4 (gfc_array_c4 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_c4 (gfc_array_c4 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_COMPLEX_4));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_COMPLEX_4);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 1a390b4509b0d5eb1ea454865c3bdf8ece460d84..c8da0bc5f6a12e311653c3ac08bb1c668ec26885 100644 (file)
@@ -97,6 +97,8 @@ reshape_c8 (gfc_array_c8 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_c8 (gfc_array_c8 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_COMPLEX_8));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_COMPLEX_8);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 4f69ce0d287aa247612c549a03e279031b6446cd..43fbefc8ccb80571584f844d14db6cdf6811efc8 100644 (file)
@@ -97,6 +97,8 @@ reshape_16 (gfc_array_i16 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_16 (gfc_array_i16 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_INTEGER_16));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_INTEGER_16);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 53016bdf597f2b396e30fd5f56e31193f29c030d..2c136deeae21a342ae57aeff90468affe499e061 100644 (file)
@@ -97,6 +97,8 @@ reshape_4 (gfc_array_i4 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_4 (gfc_array_i4 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_INTEGER_4));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_INTEGER_4);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 34620cf6d4096f0a097349a3e2635c0693d895c4..c97b747ee6d17f083c51f8ac3dd458c06ede4a6c 100644 (file)
@@ -97,6 +97,8 @@ reshape_8 (gfc_array_i8 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_8 (gfc_array_i8 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_INTEGER_8));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_INTEGER_8);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 3bf319aa43406b88aef0489b588f1999ec72515b..fa3873e1617f426982689b0a9064d5c9d7b01b31 100644 (file)
@@ -97,6 +97,8 @@ reshape_r10 (gfc_array_r10 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_r10 (gfc_array_r10 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_REAL_10));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_REAL_10);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 6794b506059862defac19b908f3bcf2630d87853..c2b6556b0176d02b38143f92c80a2e2af960f4b1 100644 (file)
@@ -97,6 +97,8 @@ reshape_r16 (gfc_array_r16 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_r16 (gfc_array_r16 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_REAL_16));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_REAL_16);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index e7bfbfbf538271b14838eb06bbf83d3de07b67f9..2b859fca7d892dae7c7c5dbf281b134c4ea35311 100644 (file)
@@ -97,6 +97,8 @@ reshape_r4 (gfc_array_r4 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_r4 (gfc_array_r4 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_REAL_4));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_REAL_4);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index d0441c0fe5d561c73e33e1720230195cd0b746de..49b23524fdba01506620cd429fb77bf65821e97c 100644 (file)
@@ -97,6 +97,8 @@ reshape_r8 (gfc_array_r8 * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -107,7 +109,13 @@ reshape_r8 (gfc_array_r8 * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof (GFC_REAL_8));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof (GFC_REAL_8);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index bb1552aa4333c66b6184d41d1e9dddc3cc59fcec..5b39711cea67fd35a081d77bb67f316f033c5133 100644 (file)
@@ -85,6 +85,8 @@ reshape_internal (parray *ret, parray *source, shape_type *shape,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -95,7 +97,14 @@ reshape_internal (parray *ret, parray *source, shape_type *shape,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * size );
+
+      if (unlikely (rs < 1))
+       alloc_size = 1;
+      else
+       alloc_size = rs * size;
+
+      ret->data = internal_malloc_size (alloc_size);
+
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }
 
index 4052a5ecc151232ebf5fc99c0630d1ea489a30d9..d1486f3942e4fa8d22a370bb5940a6cdfd728595 100644 (file)
@@ -101,6 +101,8 @@ reshape_'rtype_ccode` ('rtype` * const restrict ret,
 
   if (ret->data == NULL)
     {
+      index_type alloc_size;
+
       rs = 1;
       for (n = 0; n < rdim; n++)
        {
@@ -111,7 +113,13 @@ reshape_'rtype_ccode` ('rtype` * const restrict ret,
          rs *= rex;
        }
       ret->offset = 0;
-      ret->data = internal_malloc_size ( rs * sizeof ('rtype_name`));
+
+      if (unlikely (rs < 1))
+        alloc_size = 1;
+      else
+        alloc_size = rs * sizeof ('rtype_name`);
+
+      ret->data = internal_malloc_size (alloc_size);
       ret->dtype = (source->dtype & ~GFC_DTYPE_RANK_MASK) | rdim;
     }