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)

Reply via email to