re PR fortran/13201 (PARAMETER variables of nonconstant shape are accepted)
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
Fri, 9 Jul 2004 21:20:50 +0000 (23:20 +0200)
committerTobias Schlüter <tobi@gcc.gnu.org>
Fri, 9 Jul 2004 21:20:50 +0000 (23:20 +0200)
PR fortran/13201
* resolve.c (resolve_symbol): Verify that the shape of a
parameter array is not only explicit, but also constant.
* array.c (gfc_is_compile_time_shape): New function.
* gfortran.h (gfc_is_compile_time_shape): Add prototype.

From-SVN: r84400

gcc/fortran/ChangeLog
gcc/fortran/array.c
gcc/fortran/gfortran.h
gcc/fortran/resolve.c

index d5578cff5ca52433c4c71c59c7dfffed32c66fd9..26182d4c95b18bc31bf54b587874b79059fcbd85 100644 (file)
@@ -1,3 +1,11 @@
+2004-07-09  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
+       
+       PR fortran/13201
+       * resolve.c (resolve_symbol): Verify that the shape of a
+       parameter array is not only explicit, but also constant.
+       * array.c (gfc_is_compile_time_shape): New function.
+       * gfortran.h (gfc_is_compile_time_shape): Add prototype.
+
 2004-07-09  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/15481
index a7081d84305d3e6ecf205433297439456dc5aa37..c7fc8bbccf7cee7c73d0925ea78b03ad6d389ef9 100644 (file)
@@ -1973,3 +1973,22 @@ gfc_find_array_ref (gfc_expr * e)
 
   return &ref->u.ar;
 }
+
+
+/* Find out if an array shape is known at compile time.  */
+
+int
+gfc_is_compile_time_shape (gfc_array_spec *as)
+{
+  int i;
+
+  if (as->type != AS_EXPLICIT)
+    return 0;
+
+  for (i = 0; i < as->rank; i++)
+    if (!gfc_is_constant_expr (as->lower[i])
+       || !gfc_is_constant_expr (as->upper[i]))
+      return 0;
+
+  return 1;
+}
index 54508dc590e3dd4685f33c276c85fd90972aa0e1..d82d30621d756d982aa7ada205855ecacdcdf257 100644 (file)
@@ -1645,6 +1645,7 @@ void gfc_insert_constructor (gfc_expr *, gfc_constructor *);
 gfc_constructor *gfc_get_constructor (void);
 tree gfc_conv_array_initializer (tree type, gfc_expr * expr);
 try spec_size (gfc_array_spec *, mpz_t *);
+int gfc_is_compile_time_shape (gfc_array_spec *);
 
 /* interface.c -- FIXME: some of these should be in symbol.c */
 void gfc_free_interface (gfc_interface *);
index a10709504f93962bb5eb52bf7e9711bb8c15283d..81df9ef03f8e4e5dc16c7b4c7f2659b6017a8228 100644 (file)
@@ -3745,12 +3745,14 @@ resolve_symbol (gfc_symbol * sym)
       return;
     }
 
-  if (sym->attr.flavor == FL_PARAMETER
-      && sym->as != NULL && sym->as->type != AS_EXPLICIT)
+  /* A parameter array's shape needs to be constant.  */
+
+  if (sym->attr.flavor == FL_PARAMETER && sym->as != NULL 
+      && !gfc_is_compile_time_shape (sym->as))
     {
-      gfc_error ("Parameter array '%s' at %L must have an explicit shape",
-                sym->name, &sym->declared_at);
-      return;
+      gfc_error ("Parameter array '%s' at %L cannot be automatic "
+                "or assumed shape", sym->name, &sym->declared_at);
+         return;
     }
 
   /* Make sure that character string variables with assumed length are