From: Thomas Koenig Date: Thu, 7 Jul 2005 22:01:41 +0000 (+0000) Subject: re PR fortran/21594 ([4.0 only] FAIL: gfortran.dg/eoshift.f90 -O0 execution test) X-Git-Tag: misc/cutover-cvs2svn~1856 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=47b3a403a5b5424d15829d47abd4cb1a8a87e93e;p=thirdparty%2Fgcc.git re PR fortran/21594 ([4.0 only] FAIL: gfortran.dg/eoshift.f90 -O0 execution test) 2005-07-07 Thomas Koenig PR libfortran/21594 * intrinsics/eoshift0.c: If abs(shift) > len, fill the the whole array with the boundary value, but don't overrun it. * intrinsics/eoshift2.c: Likewise. * m4/eoshift1.m4: Likewise. * m4/eoshift3.m4: Likewise. * generated/eoshift1_4.c: Regenerated. * generated/eoshift1_8.c: Regenerated. * generated/eoshift3_4.c: Regenerated. * generated/eoshift3_8.c: Regenerated. 2005-07-07 Thomas Koenig PR libfortran/21594 * gfortran.fortran-torture/execute/intrinsic_eoshift.f90: Add test cases where the shift length is greater than the array length. From-SVN: r101738 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29ed4af2853e..1804874c4de9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-07-07 Thomas Koenig + + PR libfortran/21594 + * gfortran.fortran-torture/execute/intrinsic_eoshift.f90: + Add test cases where the shift length is greater than the + array length. + 2005-07-07 Ziemowit Laski * obj-c++.dg/gnu-runtime-2.mm: Compile, do not run. diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_eoshift.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_eoshift.f90 index 872422d2f086..c4bbcdd689c3 100644 --- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_eoshift.f90 +++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_eoshift.f90 @@ -10,17 +10,30 @@ program intrinsic_eoshift if (any (a .ne. reshape ((/2, 3, 99, 5, 6, 99, 8, 9, 99/), (/3, 3/)))) & call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, 9999, 99, 1) + if (any (a .ne. 99)) call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) a = eoshift (a, -2, dim = 2) if (any (a .ne. reshape ((/0, 0, 0, 0, 0, 0, 1, 2, 3/), (/3, 3/)))) & call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, -9999, 99, 1) + if (any (a .ne. 99)) call abort + ! Array shift and scalar bound. a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) a = eoshift (a, (/1, 0, -1/), 99, 1) if (any (a .ne. reshape ((/2, 3, 99, 4, 5, 6, 99, 7, 8/), (/3, 3/)))) & call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, (/9999, 0, -9999/), 99, 1) + if (any (a .ne. reshape ((/99, 99, 99, 4, 5, 6, 99, 99, 99/), (/3, 3/)))) & + call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) a = eoshift (a, (/2, -2, 0/), dim = 2) if (any (a .ne. reshape ((/7, 0, 3, 0, 0, 6, 0, 2, 9/), (/3, 3/)))) & @@ -32,6 +45,16 @@ program intrinsic_eoshift if (any (a .ne. reshape ((/2, 3, 99, 5, 6, -1, 8, 9, 42/), (/3, 3/)))) & call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, 9999, (/99, -1, 42/), 1) + if (any (a .ne. reshape ((/99, 99, 99, -1, -1, -1, 42, 42, 42/), & + (/3, 3/)))) call abort + + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, -9999, (/99, -1, 42/), 1) + if (any (a .ne. reshape ((/99, 99, 99, -1, -1, -1, 42, 42, 42/), & + (/3, 3/)))) call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) a = eoshift (a, -2, (/99, -1, 42/), 2) if (any (a .ne. reshape ((/99, -1, 42, 99, -1, 42, 1, 2, 3/), (/3, 3/)))) & @@ -61,6 +84,11 @@ program intrinsic_eoshift if (any (a .ne. reshape ((/ -999, -999, -999, -99, 4, 5, -9, -9, -9 /), & shape(a)))) call abort + a = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) + a = eoshift (a, (/9999, -9999, 0/), (/99, -1, 42/), 2) + if (any (a .ne. reshape ((/99, -1, 3, 99, -1, 6, 99, -1, 9/), (/3, 3/)))) & + call abort + ! Test arrays > rank 2 b(:, :, 1) = reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) b(:, :, 2) = 10 + reshape ((/1, 2, 3, 4, 5, 6, 7, 8, 9/), (/3, 3/)) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 242bd3c8910a..b1256797e624 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,16 @@ +2005-07-07 Thomas Koenig + + PR libfortran/21594 + * intrinsics/eoshift0.c: If abs(shift) > len, fill the + the whole array with the boundary value, but don't overrun it. + * intrinsics/eoshift2.c: Likewise. + * m4/eoshift1.m4: Likewise. + * m4/eoshift3.m4: Likewise. + * generated/eoshift1_4.c: Regenerated. + * generated/eoshift1_8.c: Regenerated. + * generated/eoshift3_4.c: Regenerated. + * generated/eoshift3_8.c: Regenerated. + 2005-07-07 Feng Wang PR fortran/16531 diff --git a/libgfortran/generated/eoshift1_4.c b/libgfortran/generated/eoshift1_4.c index cb4dfb5547b5..6012c3fe902b 100644 --- a/libgfortran/generated/eoshift1_4.c +++ b/libgfortran/generated/eoshift1_4.c @@ -158,7 +158,14 @@ eoshift1_4 (gfc_array_char *ret, { /* Do the shift for this dimension. */ sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset]; diff --git a/libgfortran/generated/eoshift1_8.c b/libgfortran/generated/eoshift1_8.c index 379cb4a1b50a..3caf66a60900 100644 --- a/libgfortran/generated/eoshift1_8.c +++ b/libgfortran/generated/eoshift1_8.c @@ -158,7 +158,14 @@ eoshift1_8 (gfc_array_char *ret, { /* Do the shift for this dimension. */ sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset]; diff --git a/libgfortran/generated/eoshift3_4.c b/libgfortran/generated/eoshift3_4.c index 4ce66a3059ad..1fe4e765c82e 100644 --- a/libgfortran/generated/eoshift3_4.c +++ b/libgfortran/generated/eoshift3_4.c @@ -167,7 +167,14 @@ eoshift3_4 (gfc_array_char *ret, gfc_array_char *array, { /* Do the shift for this dimension. */ sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset]; diff --git a/libgfortran/generated/eoshift3_8.c b/libgfortran/generated/eoshift3_8.c index 7e9b911b1a6b..69ead625577f 100644 --- a/libgfortran/generated/eoshift3_8.c +++ b/libgfortran/generated/eoshift3_8.c @@ -167,7 +167,14 @@ eoshift3_8 (gfc_array_char *ret, gfc_array_char *array, { /* Do the shift for this dimension. */ sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset]; diff --git a/libgfortran/intrinsics/eoshift0.c b/libgfortran/intrinsics/eoshift0.c index b1fbd1a516ad..6152e9fccbd8 100644 --- a/libgfortran/intrinsics/eoshift0.c +++ b/libgfortran/intrinsics/eoshift0.c @@ -131,10 +131,19 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array, sstride0 = sstride[0]; rptr = ret->data; sptr = array->data; - if (shift > 0) - len = len - shift; + + if ((shift >= 0 ? shift : -shift) > len) + { + shift = len; + len = 0; + } else - len = len + shift; + { + if (shift > 0) + len = len - shift; + else + len = len + shift; + } while (rptr) { diff --git a/libgfortran/intrinsics/eoshift2.c b/libgfortran/intrinsics/eoshift2.c index 70baf3c18d15..4e2b41ba7d3f 100644 --- a/libgfortran/intrinsics/eoshift2.c +++ b/libgfortran/intrinsics/eoshift2.c @@ -139,16 +139,25 @@ eoshift2 (gfc_array_char *ret, const gfc_array_char *array, bstride0 = bstride[0]; rptr = ret->data; sptr = array->data; + + if ((shift >= 0 ? shift : -shift ) > len) + { + shift = len; + len = 0; + } + else + { + if (shift > 0) + len = len - shift; + else + len = len + shift; + } + if (bound) bptr = bound->data; else bptr = zeros; - if (shift > 0) - len = len - shift; - else - len = len + shift; - while (rptr) { /* Do the shift for this dimension. */ diff --git a/libgfortran/m4/eoshift1.m4 b/libgfortran/m4/eoshift1.m4 index 906687ac7ca4..a650f952a648 100644 --- a/libgfortran/m4/eoshift1.m4 +++ b/libgfortran/m4/eoshift1.m4 @@ -159,7 +159,14 @@ eoshift1_`'atype_kind (gfc_array_char *ret, { ` /* Do the shift for this dimension. */' sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset]; diff --git a/libgfortran/m4/eoshift3.m4 b/libgfortran/m4/eoshift3.m4 index 24b21cd1531c..1e04113e12b3 100644 --- a/libgfortran/m4/eoshift3.m4 +++ b/libgfortran/m4/eoshift3.m4 @@ -168,7 +168,14 @@ eoshift3_`'atype_kind (gfc_array_char *ret, gfc_array_char *array, { ` /* Do the shift for this dimension. */' sh = *hptr; - delta = (sh >= 0) ? sh: -sh; + if (( sh >= 0 ? sh : -sh ) > len) + { + delta = len; + sh = len; + } + else + delta = (sh >= 0) ? sh: -sh; + if (sh > 0) { src = &sptr[delta * soffset];