From d1664d3574acd95f85b0ea08a3dad6fd1a578b55 Mon Sep 17 00:00:00 2001 From: fxcoudert Date: Sat, 24 Jun 2006 18:10:47 +0000 Subject: [PATCH] PR fortran/28081 * resolve.c (resolve_substring): Don't issue out-of-bounds error messages when the range has zero size. * gfortran.dg/substr_3.f: New test. * gfortran.dg/equiv_2.f90: Update expected error message. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114972 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/resolve.c | 10 +++++++--- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/equiv_2.f90 | 2 +- gcc/testsuite/gfortran.dg/substr_3.f | 12 ++++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/substr_3.f diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index af4b5e9..6e5e492 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,11 @@ 2006-06-24 Francois-Xavier Coudert + PR fortran/28081 + * resolve.c (resolve_substring): Don't issue out-of-bounds + error messages when the range has zero size. + +2006-06-24 Francois-Xavier Coudert + PR fortran/23862 * lang-specs.h (f95-cpp-input): Pass -ffree-form to f951 unless -ffixed-form is explicitly specified. diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 384b5a4..fe37f2c 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2542,7 +2542,9 @@ resolve_substring (gfc_ref * ref) return FAILURE; } - if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT) + if (compare_bound_int (ref->u.ss.start, 1) == CMP_LT + && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ + || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT)) { gfc_error ("Substring start index at %L is less than one", &ref->u.ss.start->where); @@ -2570,9 +2572,11 @@ resolve_substring (gfc_ref * ref) } if (ref->u.ss.length != NULL - && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT) + && compare_bound (ref->u.ss.end, ref->u.ss.length->length) == CMP_GT + && (compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_EQ + || compare_bound (ref->u.ss.end, ref->u.ss.start) == CMP_GT)) { - gfc_error ("Substring end index at %L is out of bounds", + gfc_error ("Substring end index at %L exceeds the string length", &ref->u.ss.start->where); return FAILURE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2db5a7c..a8598aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-06-24 Francois-Xavier Coudert + + PR fortran/28081 + * gfortran.dg/substr_3.f: New test. + * gfortran.dg/equiv_2.f90: Update expected error message. + 2006-06-24 Paul Thomas PR fortran/28118 diff --git a/gcc/testsuite/gfortran.dg/equiv_2.f90 b/gcc/testsuite/gfortran.dg/equiv_2.f90 index c827aec..8bc7fb1 100644 --- a/gcc/testsuite/gfortran.dg/equiv_2.f90 +++ b/gcc/testsuite/gfortran.dg/equiv_2.f90 @@ -7,7 +7,7 @@ subroutine broken_equiv2 character*4 j character*2 k - equivalence (j(2:3), k(1:5)) ! { dg-error "out of bounds" } + equivalence (j(2:3), k(1:5)) ! { dg-error "exceeds the string length" } end subroutine subroutine broken_equiv3 diff --git a/gcc/testsuite/gfortran.dg/substr_3.f b/gcc/testsuite/gfortran.dg/substr_3.f new file mode 100644 index 0000000..3bb7197 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substr_3.f @@ -0,0 +1,12 @@ +! { dg-do run } +! Check that substrings behave correctly even when zero-sized + implicit none + character(len=10) :: s, t + integer :: i, j + + s = "abcdefghij" + t(:10) = s(1:) + s(16:15) = "foo" + s(0:-1) = "foo" + if (s /= t) call abort + end -- 2.7.4