re PR fortran/68053 (lower bound of implied shape array restricted too much)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 9 Nov 2015 05:50:24 +0000 (05:50 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 9 Nov 2015 05:50:24 +0000 (05:50 +0000)
2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

PR fortran/68053
* decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
before testing for a constant value.

2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

PR fortran/68053
* gfortran.dg/pr68053.f90: New test.

From-SVN: r229992

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr68053.f90 [new file with mode: 0644]

index 78644b876b11c6d9f2e15c674ed8bd6e49011db4..cd4c94e67645f2d78130715af6b7ea6fb6b6df53 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/68053
+       * decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
+       before testing for a constant value.
+
 2015-11-08  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        PR fortran/68218
index 7178aafe5e1a3bf1f49832a47061dfd9d0dde952..0c3377f7b080f2f543fb2de712aea698b1af9178 100644 (file)
@@ -1529,26 +1529,34 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
          for (dim = 0; dim < sym->as->rank; ++dim)
            {
              int k;
-             gfc_expr* lower;
-             gfc_expr* e;
+             gfc_expr *e, *lower;
 
              lower = sym->as->lower[dim];
-             if (lower->expr_type != EXPR_CONSTANT)
+
+             /* If the lower bound is an array element from another 
+                parameterized array, then it is marked with EXPR_VARIABLE and
+                is an initialization expression.  Try to reduce it.  */
+             if (lower->expr_type == EXPR_VARIABLE)
+               gfc_reduce_init_expr (lower);
+
+             if (lower->expr_type == EXPR_CONSTANT)
+               {
+                 /* All dimensions must be without upper bound.  */
+                 gcc_assert (!sym->as->upper[dim]);
+
+                 k = lower->ts.kind;
+                 e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
+                 mpz_add (e->value.integer, lower->value.integer,
+                          init->shape[dim]);
+                 mpz_sub_ui (e->value.integer, e->value.integer, 1);
+                 sym->as->upper[dim] = e;
+               }
+             else
                {
                  gfc_error ("Non-constant lower bound in implied-shape"
                             " declaration at %L", &lower->where);
                  return false;
                }
-
-             /* All dimensions must be without upper bound.  */
-             gcc_assert (!sym->as->upper[dim]);
-
-             k = lower->ts.kind;
-             e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
-             mpz_add (e->value.integer,
-                      lower->value.integer, init->shape[dim]);
-             mpz_sub_ui (e->value.integer, e->value.integer, 1);
-             sym->as->upper[dim] = e;
            }
 
          sym->as->type = AS_EXPLICIT;
index 69c155bb1d98a4351c0b37d18dcf2a96008b8706..f8c5d5ab7a38617c163bd33638ad28af01fdbe31 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/68053
+       * gfortran.dg/pr68053.f90: New test.
+
 2015-11-06  Jan Hubicka  <hubicka@ucw.cz>
 
        * g++.dg/lto/pr68057_0.C: Fix testcase.
diff --git a/gcc/testsuite/gfortran.dg/pr68053.f90 b/gcc/testsuite/gfortran.dg/pr68053.f90
new file mode 100644 (file)
index 0000000..e59693c
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do run }
+! PR fortran/68053
+! Original code contributed by Gerhard Steinmetz
+! <gerhard dot steinmetx dot fortran at t-online dot de>
+program p
+   integer, parameter :: n(3) = [1,2,3]
+   integer, parameter :: x(1) = 7
+   integer, parameter :: z(n(2):*) = x
+   if (lbound(z,1) /= 2) call abort
+end