fortran : FAIL: gfortran.dg/pr93365.f90 PR94386
authorMark Eggleston <markeggleston@gcc.gnu.org>
Wed, 1 Apr 2020 11:50:16 +0000 (12:50 +0100)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Wed, 1 Apr 2020 11:50:16 +0000 (12:50 +0100)
Failures of pr93365.f90,  pr93600_1.f90 and pr93600_2.f90.
Changes made by PR94246 delete and changed code from expr.c
introduced by PR93600, the deleted code.  This broke the PR93600
test cases.  Restoring the deleted code and leaving the changed
code alone allows the cases for PR93600 and PR94246 to pass.

gcc/fortran/ChangeLog:

PR fortran/94386
expr.c (simplify_parameter_variable): Restore code deleted
in PR94246.

gcc/fortran/ChangeLog
gcc/fortran/expr.c

index 217eef29ebac0d6f2028151d7967e4dd805191d6..2539e51861eb0f4b8b05f0f1df7a6ed0da8d88c3 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-01  Mark Eggleston  <mark.eggleston@codethink.com>
+
+       PR fortran/94386
+       expr.c (simplify_parameter_variable): Restore code deleted
+       in PR94246.
+
 2020-03-28  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/94246
index 1106341df91a59f58db6f42e053144f3b94064ea..a9fa03ad153ff8d1bd6f51bfba991548c1cfa002 100644 (file)
@@ -2057,6 +2057,18 @@ simplify_parameter_variable (gfc_expr *p, int type)
     }
   gfc_expression_rank (p);
 
+  /* Is this an inquiry?  */
+  bool inquiry = false;
+  gfc_ref* ref = p->ref;
+  while (ref)
+    {
+      if (ref->type == REF_INQUIRY)
+       break;
+      ref = ref->next;
+    }
+  if (ref && ref->type == REF_INQUIRY)
+    inquiry = ref->u.i == INQUIRY_LEN || ref->u.i == INQUIRY_KIND;
+
   if (gfc_is_size_zero_array (p))
     {
       if (p->expr_type == EXPR_ARRAY)
@@ -2069,15 +2081,22 @@ simplify_parameter_variable (gfc_expr *p, int type)
       e->value.constructor = NULL;
       e->shape = gfc_copy_shape (p->shape, p->rank);
       e->where = p->where;
-      gfc_replace_expr (p, e);
-      return true;
+      /* If %kind and %len are not used then we're done, otherwise
+        drop through for simplification.  */
+      if (!inquiry)
+       {
+         gfc_replace_expr (p, e);
+         return true;
+       }
     }
+  else
+    {
+      e = gfc_copy_expr (p->symtree->n.sym->value);
+      if (e == NULL)
+       return false;
 
-  e = gfc_copy_expr (p->symtree->n.sym->value);
-  if (e == NULL)
-    return false;
-
-  e->rank = p->rank;
+      e->rank = p->rank;
+    }
 
   if (e->ts.type == BT_CHARACTER && e->ts.u.cl == NULL)
     e->ts.u.cl = gfc_new_charlen (gfc_current_ns, p->ts.u.cl);