Hello world,

here is the second version of the fix for PR 85102. This
is a much more general approach, which actually uses simplification
(while avoiding some "interesting" regressions when resolving, or
simplifying, too soon...)

Thanks to Dominique for the hint about the problem with my first patch.

Regression-tested. OK for trunk?

Regards

        Thomas

2018-04-02  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/85102
        * decl.c (variable_decl): If upper or lower bounds simplify
        to a constant, use that.

2018-04-02  Thomas Koenig  <tkoe...@gcc.gnu.org>

        PR fortran/85102
        * gfortran.dg/array_simplify_2.f90: New test.
! { dg-do  run }
! PR 85102 - this used to ICE
! Original test case by Gerhard Steinmetz
program p
   integer, parameter :: a((1+2)) = 1
   integer, parameter :: b((1+1)+1) = 1
   integer, parameter :: c = dot_product(a, a)
   integer, parameter :: d = dot_product(b,b)
   if (c /= 3) stop 1
   if (d /= 3) stop 2
 end program p
Index: decl.c
===================================================================
--- decl.c	(revision 258845)
+++ decl.c	(working copy)
@@ -2424,6 +2424,29 @@ variable_decl (int elem)
 	      goto cleanup;
 	    }
 	}
+      if (as->type == AS_EXPLICIT)
+	{
+	  for (int i = 0; i < as->rank; i++)
+	    {
+	      gfc_expr *e, *n;
+	      e = as->lower[i];
+	      if (e->expr_type != EXPR_CONSTANT)
+		{
+		  n = gfc_copy_expr (e);
+		  gfc_simplify_expr (n, 1);
+		  if (n->expr_type == EXPR_CONSTANT)
+		    gfc_replace_expr (e, n);
+		}
+	      e = as->upper[i];
+	      if (e->expr_type != EXPR_CONSTANT)
+		{
+		  n = gfc_copy_expr (e);
+		  gfc_simplify_expr (n, 1);
+		  if (n->expr_type == EXPR_CONSTANT)
+		    gfc_replace_expr (e, n);
+		}
+	    }
+	}
     }
 
   char_len = NULL;

Reply via email to