diff options
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 13 | ||||
-rw-r--r-- | libgfortran/generated/eoshift1_4.c | 9 | ||||
-rw-r--r-- | libgfortran/generated/eoshift1_8.c | 9 | ||||
-rw-r--r-- | libgfortran/generated/eoshift3_4.c | 9 | ||||
-rw-r--r-- | libgfortran/generated/eoshift3_8.c | 9 | ||||
-rw-r--r-- | libgfortran/intrinsics/eoshift0.c | 15 | ||||
-rw-r--r-- | libgfortran/intrinsics/eoshift2.c | 19 | ||||
-rw-r--r-- | libgfortran/m4/eoshift1.m4 | 9 | ||||
-rw-r--r-- | libgfortran/m4/eoshift3.m4 | 9 |
9 files changed, 87 insertions, 14 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 242bd3c..b125679 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,16 @@ +2005-07-07 Thomas Koenig <Thomas.Koenig@online.de> + + 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 <fengwang@nudt.edu.cn> PR fortran/16531 diff --git a/libgfortran/generated/eoshift1_4.c b/libgfortran/generated/eoshift1_4.c index cb4dfb5..6012c3f 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 379cb4a..3caf66a 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 4ce66a3..1fe4e76 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 7e9b911b..69ead62 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 b1fbd1a..6152e9f 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 70baf3c..4e2b41b 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 906687a..a650f95 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 24b21cd..1e04113 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]; |