aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2018-11-01 19:50:14 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2018-11-01 19:50:14 +0000
commit437725af7af4c28bbc7f595d6c2c26482fa2bcf6 (patch)
tree7aa8da9b8efb695d9e0678ee4fdab8325769c634 /gcc/fortran/frontend-passes.c
parenta5fbc2f36a291cbe80c4393950d6db9b56a34b05 (diff)
downloadgcc-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.c22
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)