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;