diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a966911f94..06cd1b139ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-02-02 Thomas Koenig + + PR libfortran/35001 + * gfortran.dg/shape_4.f90: New test. + 2008-02-02 Hans-Peter Nilsson * gcc.target/cris/torture/pr34773.c: Use __asm__, not asm. diff --git a/gcc/testsuite/gfortran.dg/shape_4.f90 b/gcc/testsuite/gfortran.dg/shape_4.f90 new file mode 100644 index 00000000000..9275b11b8fd --- /dev/null +++ b/gcc/testsuite/gfortran.dg/shape_4.f90 @@ -0,0 +1,12 @@ +! PR 35001 - we need to return 0 for the shapes of +! negative extents. Test case adapted from Tobias Burnus. +program main + implicit none + integer :: i,j, a(10,10),res(2) + j = 1 + i = 10 + res = shape(a(1:1,i:j:1)) + if (res(1) /=1 .or. res(2) /= 0) call abort + res = shape(a(1:1,j:i:-1)) + if (res(1) /=1 .or. res(2) /= 0) call abort +end program main diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index b71eb30065e..432aa56ee44 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2008-02-02 Thomas Koenig + + PR libfortran/35001 + * m4/shape.m4: Return 0 for extents <= 0. + * generated/shape_i4.c: Regenerated. + * generated/shape_i8.c: Regenerated. + * generated/shape_i16.c: Regenerated. + 2008-01-27 Thomas Koenig PR libfortran/34980 diff --git a/libgfortran/generated/shape_i16.c b/libgfortran/generated/shape_i16.c index 77274d6002a..0ab2654bd8c 100644 --- a/libgfortran/generated/shape_i16.c +++ b/libgfortran/generated/shape_i16.c @@ -45,6 +45,7 @@ shape_16 (gfc_array_i16 * const restrict ret, { int n; index_type stride; + index_type extent; stride = ret->dim[0].stride; @@ -53,8 +54,8 @@ shape_16 (gfc_array_i16 * const restrict ret, for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++) { - ret->data[n * stride] = - array->dim[n].ubound + 1 - array->dim[n].lbound; + extent = array->dim[n].ubound + 1 - array->dim[n].lbound; + ret->data[n * stride] = extent > 0 ? extent : 0 ; } } diff --git a/libgfortran/generated/shape_i4.c b/libgfortran/generated/shape_i4.c index 787ba544c21..64a6fcdb994 100644 --- a/libgfortran/generated/shape_i4.c +++ b/libgfortran/generated/shape_i4.c @@ -45,6 +45,7 @@ shape_4 (gfc_array_i4 * const restrict ret, { int n; index_type stride; + index_type extent; stride = ret->dim[0].stride; @@ -53,8 +54,8 @@ shape_4 (gfc_array_i4 * const restrict ret, for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++) { - ret->data[n * stride] = - array->dim[n].ubound + 1 - array->dim[n].lbound; + extent = array->dim[n].ubound + 1 - array->dim[n].lbound; + ret->data[n * stride] = extent > 0 ? extent : 0 ; } } diff --git a/libgfortran/generated/shape_i8.c b/libgfortran/generated/shape_i8.c index f318b170ab9..80bef318b81 100644 --- a/libgfortran/generated/shape_i8.c +++ b/libgfortran/generated/shape_i8.c @@ -45,6 +45,7 @@ shape_8 (gfc_array_i8 * const restrict ret, { int n; index_type stride; + index_type extent; stride = ret->dim[0].stride; @@ -53,8 +54,8 @@ shape_8 (gfc_array_i8 * const restrict ret, for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++) { - ret->data[n * stride] = - array->dim[n].ubound + 1 - array->dim[n].lbound; + extent = array->dim[n].ubound + 1 - array->dim[n].lbound; + ret->data[n * stride] = extent > 0 ? extent : 0 ; } } diff --git a/libgfortran/m4/shape.m4 b/libgfortran/m4/shape.m4 index 3bda0ad8cbb..c783270bec7 100644 --- a/libgfortran/m4/shape.m4 +++ b/libgfortran/m4/shape.m4 @@ -46,6 +46,7 @@ shape_'rtype_kind` ('rtype` * const restrict ret, { int n; index_type stride; + index_type extent; stride = ret->dim[0].stride; @@ -54,8 +55,8 @@ shape_'rtype_kind` ('rtype` * const restrict ret, for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++) { - ret->data[n * stride] = - array->dim[n].ubound + 1 - array->dim[n].lbound; + extent = array->dim[n].ubound + 1 - array->dim[n].lbound; + ret->data[n * stride] = extent > 0 ? extent : 0 ; } }