diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2007-07-08 22:20:04 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2007-07-08 22:20:04 +0000 |
commit | fb263f821cdab4e9237c4a321f959ac9e3704686 (patch) | |
tree | 7c64d364be9be5b9dbf562d41d56660dc24c195d /libgfortran | |
parent | 3bed9dd0236405001fc0aeccf7fa37b1ff4ecc9f (diff) | |
download | gcc-fb263f821cdab4e9237c4a321f959ac9e3704686.zip gcc-fb263f821cdab4e9237c4a321f959ac9e3704686.tar.gz gcc-fb263f821cdab4e9237c4a321f959ac9e3704686.tar.bz2 |
re PR fortran/32217 (segfaults (at runtime) on UNPACK with zero-sized arrays)
2007-07-08 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/32217
* intrinsics/unpack_generic.c: If the destination array is
empty, return early.
2007-07-08 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/32217
* gfortran.dg/unpack_zerosize_1.f90: New test case.
From-SVN: r126469
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/intrinsics/unpack_generic.c | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 0d47591..0b9239d 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2007-07-08 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR libfortran/32217 + * intrinsics/unpack_generic.c: If the destination array is + empty, return early. + 2007-07-05 H.J. Lu <hongjiu.lu@intel.com> * aclocal.m4: Regenerated. diff --git a/libgfortran/intrinsics/unpack_generic.c b/libgfortran/intrinsics/unpack_generic.c index 13166f9..b349f0d 100644 --- a/libgfortran/intrinsics/unpack_generic.c +++ b/libgfortran/intrinsics/unpack_generic.c @@ -61,6 +61,9 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector, index_type n; index_type dim; + int empty; + + empty = 0; if (ret->data == NULL) { /* The front end has signalled that we need to populate the @@ -74,6 +77,7 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector, ret->dim[n].lbound = 0; ret->dim[n].ubound = mask->dim[n].ubound - mask->dim[n].lbound; extent[n] = ret->dim[n].ubound + 1; + empty = empty || extent[n] <= 0; rstride[n] = ret->dim[n].stride * size; fstride[n] = field->dim[n].stride * fsize; mstride[n] = mask->dim[n].stride; @@ -89,6 +93,7 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector, { count[n] = 0; extent[n] = ret->dim[n].ubound + 1 - ret->dim[n].lbound; + empty = empty || extent[n] <= 0; rstride[n] = ret->dim[n].stride * size; fstride[n] = field->dim[n].stride * fsize; mstride[n] = mask->dim[n].stride; @@ -96,6 +101,10 @@ unpack_internal (gfc_array_char *ret, const gfc_array_char *vector, if (rstride[0] == 0) rstride[0] = size; } + + if (empty) + return; + if (fstride[0] == 0) fstride[0] = fsize; if (mstride[0] == 0) |