Hello world, the attached patch fixes the PR by not trying to determine the length of the base symbol when there is a substring with a length which is not constant. This might make the length of temporary strings generated by the front end optimization pass shorter, while inserting an additional call to determine length of the substring.
No test case because the failure was only exposed by an instrumented compiler. Regression-tested. OK for trunk? Regards Thomas 2018-11-01 Thomas Koenig <tkoe...@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.
Index: frontend-passes.c =================================================================== --- frontend-passes.c (Revision 265722) +++ frontend-passes.c (Arbeitskopie) @@ -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)