diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-03-24 17:37:21 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-03-24 17:37:21 +0000 |
commit | 335d03387408e2ce580e59ace0a593d7d9e1950d (patch) | |
tree | 658e0a2b9fedcc9dcd5671990949f4b417428c02 /gcc | |
parent | ba77f7bad0f0898454cdef193a24a825cbc3f953 (diff) | |
download | gcc-335d03387408e2ce580e59ace0a593d7d9e1950d.zip gcc-335d03387408e2ce580e59ace0a593d7d9e1950d.tar.gz gcc-335d03387408e2ce580e59ace0a593d7d9e1950d.tar.bz2 |
re PR fortran/70068 (ICE: out of memory on involving empty substring)
2018-03-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/70068
* expr.c (find_substring_ref): Change types of start, end
and length variables to gfc_charlen_t. Set length to zero
for empty substring.
2018-03-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/70068
* gfortran.dg/substr_7.f90: New test.
From-SVN: r258835
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/substr_7.f90 | 13 |
4 files changed, 34 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2cf32f3..12348f1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-03-24 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/70068 + * expr.c (find_substring_ref): Change types of start, end + and length variables to gfc_charlen_t. Set length to zero + for empty substring. + 2018-03-24 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/42651 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index bbaabb6..9e113d2 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1662,9 +1662,9 @@ cleanup: static bool find_substring_ref (gfc_expr *p, gfc_expr **newp) { - int end; - int start; - int length; + gfc_charlen_t end; + gfc_charlen_t start; + gfc_charlen_t length; gfc_char_t *chr; if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT @@ -1674,9 +1674,12 @@ find_substring_ref (gfc_expr *p, gfc_expr **newp) *newp = gfc_copy_expr (p); free ((*newp)->value.character.string); - end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer); - start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer); - length = end - start + 1; + end = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.end->value.integer); + start = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.start->value.integer); + if (end >= start) + length = end - start + 1; + else + length = 0; chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1); (*newp)->value.character.length = length; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 962711c..1e1f515 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-24 Thomas Koenig <tkoenig@gcc.gnu.org> + + PR fortran/70068 + * gfortran.dg/substr_7.f90: New test. + 2018-03-24 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/42651 diff --git a/gcc/testsuite/gfortran.dg/substr_7.f90 b/gcc/testsuite/gfortran.dg/substr_7.f90 new file mode 100644 index 0000000..3d8f2e1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/substr_7.f90 @@ -0,0 +1,13 @@ +! { dg-do run } +! PR 70068 - used to allocate too much memory +! Original test cases by Gerhard Steinmetz +program p + integer :: i + character(3), parameter :: x(3) = ['abc', 'ijk', 'xyz'] + character(3) :: y(2) + character(99), parameter :: x2(2) = ' ' + character(99), parameter :: y2=x(2)(99:1) + y = [(x(i)(i:1), i=2,3)] + if (any(y /= '')) stop 1 + if (y2 /= '') stop 2 +end |