summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-19 21:48:50 +0000
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-19 21:48:50 +0000
commit81499f286c30744e70b97127a45e6995cfe1027d (patch)
tree25894134c7e725dd6026b7d0c821b145999ec721 /libgfortran
parent81035ec1299c5ee26e838bb28dfe87801d53e51d (diff)
downloadgcc-81499f286c30744e70b97127a45e6995cfe1027d.tar.gz
PR libfortran/27895
* intrinsics/cshift0.c: Special cases for zero-sized arrays. * intrinsics/pack_generic.c: Likewise. * intrinsics/spread_generic.c: Likewise. * gfortran.dg/zero_sized_1.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117890 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/intrinsics/cshift0.c15
-rw-r--r--libgfortran/intrinsics/pack_generic.c42
-rw-r--r--libgfortran/intrinsics/spread_generic.c8
4 files changed, 49 insertions, 23 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 9001e2c979e..5a51c53cadb 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2006-10-19 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/27895
+ * intrinsics/cshift0.c: Special cases for zero-sized arrays.
+ * intrinsics/pack_generic.c: Likewise.
+ * intrinsics/spread_generic.c: Likewise.
+
2006-10-18 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/29277
diff --git a/libgfortran/intrinsics/cshift0.c b/libgfortran/intrinsics/cshift0.c
index 4df90ad0fbb..f2c2219dd30 100644
--- a/libgfortran/intrinsics/cshift0.c
+++ b/libgfortran/intrinsics/cshift0.c
@@ -1,5 +1,5 @@
/* Generic implementation of the CSHIFT intrinsic
- Copyright 2003, 2005 Free Software Foundation, Inc.
+ Copyright 2003, 2005, 2006 Free Software Foundation, Inc.
Contributed by Feng Wang <wf_cs@yahoo.com>
This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -144,8 +144,8 @@ cshift0 (gfc_array_char * ret, const gfc_array_char * array,
if (ret->data == NULL)
{
int i;
+ index_type arraysize = size0 ((array_t *)array);
- ret->data = internal_malloc_size (size * size0 ((array_t *)array));
ret->offset = 0;
ret->dtype = array->dtype;
for (i = 0; i < GFC_DESCRIPTOR_RANK (array); i++)
@@ -156,8 +156,17 @@ cshift0 (gfc_array_char * ret, const gfc_array_char * array,
if (i == 0)
ret->dim[i].stride = 1;
else
- ret->dim[i].stride = (ret->dim[i-1].ubound + 1) * ret->dim[i-1].stride;
+ 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++)
diff --git a/libgfortran/intrinsics/pack_generic.c b/libgfortran/intrinsics/pack_generic.c
index 27a22ec8d54..1b0d7250540 100644
--- a/libgfortran/intrinsics/pack_generic.c
+++ b/libgfortran/intrinsics/pack_generic.c
@@ -1,5 +1,5 @@
/* Generic implementation of the PACK intrinsic
- Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Paul Brook <paul@nowt.org>
This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -195,12 +195,15 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
ret->dim[0].ubound = total - 1;
ret->dim[0].stride = 1;
- ret->data = internal_malloc_size (size * total);
ret->offset = 0;
-
if (total == 0)
- /* In this case, nothing remains to be done. */
- return;
+ {
+ /* In this case, nothing remains to be done. */
+ ret->data = internal_malloc_size (1);
+ return;
+ }
+ else
+ ret->data = internal_malloc_size (size * total);
}
rstride0 = ret->dim[0].stride * size;
@@ -210,7 +213,7 @@ pack_internal (gfc_array_char *ret, const gfc_array_char *array,
mstride0 = mstride[0];
rptr = ret->data;
- while (sptr)
+ while (sptr && mptr)
{
/* Test this element. */
if (*mptr)
@@ -315,14 +318,17 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
index_type extent[GFC_MAX_DIMENSIONS];
index_type n;
index_type dim;
+ index_type ssize;
index_type nelem;
dim = GFC_DESCRIPTOR_RANK (array);
+ ssize = 1;
for (n = 0; n < dim; n++)
{
count[n] = 0;
extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound;
sstride[n] = array->dim[n].stride * size;
+ ssize *= extent[n];
}
if (sstride[0] == 0)
sstride[0] = size;
@@ -352,25 +358,23 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
total *= extent[n];
}
else
- {
- /* The result array will be empty. */
- ret->dim[0].lbound = 0;
- ret->dim[0].ubound = -1;
- ret->dim[0].stride = 1;
- ret->data = internal_malloc_size (0);
- ret->offset = 0;
-
- return;
- }
+ /* The result array will be empty. */
+ total = 0;
}
/* Setup the array descriptor. */
ret->dim[0].lbound = 0;
ret->dim[0].ubound = total - 1;
ret->dim[0].stride = 1;
-
- ret->data = internal_malloc_size (size * total);
ret->offset = 0;
+
+ if (total == 0)
+ {
+ ret->data = internal_malloc_size (1);
+ return;
+ }
+ else
+ ret->data = internal_malloc_size (size * total);
}
rstride0 = ret->dim[0].stride * size;
@@ -384,7 +388,7 @@ pack_s_internal (gfc_array_char *ret, const gfc_array_char *array,
If MASK is .FALSE., we have to copy VECTOR into the result
array. If VECTOR were not present we would have already returned. */
- if (*mask)
+ if (*mask && ssize != 0)
{
while (sptr)
{
diff --git a/libgfortran/intrinsics/spread_generic.c b/libgfortran/intrinsics/spread_generic.c
index cbc5c4985df..9ea6b12ef16 100644
--- a/libgfortran/intrinsics/spread_generic.c
+++ b/libgfortran/intrinsics/spread_generic.c
@@ -101,7 +101,13 @@ spread_internal (gfc_array_char *ret, const gfc_array_char *source,
}
}
ret->offset = 0;
- ret->data = internal_malloc_size (rs * size);
+ if (rs > 0)
+ ret->data = internal_malloc_size (rs * size);
+ else
+ {
+ ret->data = internal_malloc_size (1);
+ return;
+ }
}
else
{