diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-11-01 19:50:14 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2018-11-01 19:50:14 +0000 |
commit | 437725af7af4c28bbc7f595d6c2c26482fa2bcf6 (patch) | |
tree | 7aa8da9b8efb695d9e0678ee4fdab8325769c634 /gcc/fortran/frontend-passes.c | |
parent | a5fbc2f36a291cbe80c4393950d6db9b56a34b05 (diff) | |
download | gcc-437725af7af4c28bbc7f595d6c2c26482fa2bcf6.zip gcc-437725af7af4c28bbc7f595d6c2c26482fa2bcf6.tar.gz gcc-437725af7af4c28bbc7f595d6c2c26482fa2bcf6.tar.bz2 |
re PR fortran/87782 (runtime error: load of value 1818451807, which is not a valid value for type 'expr_t')
2018-11-01 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/87782
* frontend-passes.c (constant_string_length): If there is a
substring with a length which cannot be reduced to a constant,
return NULL.
From-SVN: r265730
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r-- | gcc/fortran/frontend-passes.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 2c095cb..1993030 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -638,23 +638,27 @@ constant_string_length (gfc_expr *e) return gfc_copy_expr(length); } - /* Return length of substring, if constant. */ + /* See if there is a substring. If it has a constant length, return + that and NULL otherwise. */ for (ref = e->ref; ref; ref = ref->next) { - if (ref->type == REF_SUBSTRING - && gfc_dep_difference (ref->u.ss.end, ref->u.ss.start, &value)) + if (ref->type == REF_SUBSTRING) { - res = gfc_get_constant_expr (BT_INTEGER, gfc_charlen_int_kind, - &e->where); + if (gfc_dep_difference (ref->u.ss.end, ref->u.ss.start, &value)) + { + res = gfc_get_constant_expr (BT_INTEGER, gfc_charlen_int_kind, + &e->where); - mpz_add_ui (res->value.integer, value, 1); - mpz_clear (value); - return res; + mpz_add_ui (res->value.integer, value, 1); + mpz_clear (value); + return res; + } + else + return NULL; } } /* Return length of char symbol, if constant. */ - if (e->symtree && e->symtree->n.sym->ts.u.cl && e->symtree->n.sym->ts.u.cl->length && e->symtree->n.sym->ts.u.cl->length->expr_type == EXPR_CONSTANT) |