aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-03-24 17:37:21 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-03-24 17:37:21 +0000
commit335d03387408e2ce580e59ace0a593d7d9e1950d (patch)
tree658e0a2b9fedcc9dcd5671990949f4b417428c02 /gcc
parentba77f7bad0f0898454cdef193a24a825cbc3f953 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fortran/expr.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/substr_7.f9013
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