From: Thomas Koenig Date: Thu, 1 Nov 2018 19:50:14 +0000 (+0000) Subject: re PR fortran/87782 (runtime error: load of value 1818451807, which is not a valid... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=437725af7af4c28bbc7f595d6c2c26482fa2bcf6;p=gcc.git 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 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 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 31e3fdd12ec..134c43db644 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-11-01 Thomas Koenig + + 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. + 2018-11-01 Paul Thomas PR fortran/40196 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 2c095cb8d5e..19930305bd1 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)