diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2008-05-04 08:06:02 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2008-05-04 08:06:02 +0000 |
commit | 7ad99d60f442253354e6a7b1be56748f6e627246 (patch) | |
tree | 8b1112ef5b4bc21bef6fd7da4fef8fc861f0618b /libgfortran/m4 | |
parent | 3e438e2b76a87fd492bee3af425a450077fa4ef5 (diff) | |
download | gcc-7ad99d60f442253354e6a7b1be56748f6e627246.zip gcc-7ad99d60f442253354e6a7b1be56748f6e627246.tar.gz gcc-7ad99d60f442253354e6a7b1be56748f6e627246.tar.bz2 |
re PR fortran/35990 (run-time abort for PACK of run-time zero sized array)
2008-05-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/35990
* intrinsics/pack_generic.c: If an extent of the source
array is less then zero, set it to zero. Set the source
pointer to NULL if the source size is zero. Set the total
number of elements to zero if the vector has an extent
less or equal to zero.
* m4/pack.m4: Set the source pointer to NULL if the
source array is zero-sized. Set the total number of
elemements to zero if the vector has an extent less or
equal to zero.
* generated/pack_i1.c: Regenerated.
* generated/pack_i2.c: Regenerated.
* generated/pack_i4.c: Regenerated.
* generated/pack_i8.c: Regenerated.
* generated/pack_i16.c: Regenerated.
* generated/pack_r4.c: Regenerated.
* generated/pack_r8.c: Regenerated.
* generated/pack_r10.c: Regenerated.
* generated/pack_r16.c: Regenerated.
* generated/pack_c4.c: Regenerated.
* generated/pack_c8.c: Regenerated.
* generated/pack_c10.c: Regenerated.
* generated/pack_c16.c: Regenerated.
2008-05-04 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/35990
* gfortran.dg/intrinsic_pack_4.f90: New test case.
From-SVN: r134927
Diffstat (limited to 'libgfortran/m4')
-rw-r--r-- | libgfortran/m4/pack.m4 | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/libgfortran/m4/pack.m4 b/libgfortran/m4/pack.m4 index 87409a5..4f31ffd 100644 --- a/libgfortran/m4/pack.m4 +++ b/libgfortran/m4/pack.m4 @@ -104,7 +104,6 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, dim = GFC_DESCRIPTOR_RANK (array); - sptr = array->data; mptr = mask->data; /* Use the same loop for all logical types, by using GFC_LOGICAL_1 @@ -140,6 +139,11 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, if (mstride[0] == 0) mstride[0] = mask_kind; + if (zero_sized) + sptr = NULL; + else + sptr = array->data; + if (ret->data == NULL || compile_options.bounds_check) { /* Count the elements, either for allocating memory or @@ -150,6 +154,11 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, /* The return array will have as many elements as there are in VECTOR. */ total = vector->dim[0].ubound + 1 - vector->dim[0].lbound; + if (total < 0) + { + total = 0; + vector = NULL; + } } else { @@ -309,4 +318,4 @@ pack_'rtype_code` ('rtype` *ret, const 'rtype` *array, } #endif -'
\ No newline at end of file +' |