re PR fortran/78392 (ICE in gfc_trans_auto_array_allocation, at fortran/trans-array...
authorJanus Weil <janus@gcc.gnu.org>
Mon, 12 Dec 2016 18:54:54 +0000 (19:54 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Mon, 12 Dec 2016 18:54:54 +0000 (19:54 +0100)
2016-12-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/78392
* expr.c (gfc_is_constant_expr): Specification functions are not
compile-time constants. Update documentation (add reference to F08
standard), add a FIXME.
(external_spec_function): Add reference to F08 standard.
* resolve.c (resolve_fl_variable): Ditto.

2016-12-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/78392
* gfortran.dg/constant_shape.f90: New test case.

From-SVN: r243580

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/constant_shape.f90 [new file with mode: 0644]

index 1597a89e1f4b0d517230a4bebfcc7a9bfae37ba6..7a47db2e9995f8e958146eab7ea731f056c4795c 100644 (file)
@@ -1,3 +1,12 @@
+2016-12-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/78392
+       * expr.c (gfc_is_constant_expr): Specification functions are not
+       compile-time constants. Update documentation (add reference to F08
+       standard), add a FIXME.
+       (external_spec_function): Add reference to F08 standard.
+       * resolve.c (resolve_fl_variable): Ditto.
+
 2016-12-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/78226
index 3464a204547016a1bff0a53f2b6fd41684abdb04..c4a6ae10de6ea19beb53d0d72c315769fb8bc4d8 100644 (file)
@@ -881,15 +881,15 @@ done:
 }
 
 
-/* Function to determine if an expression is constant or not.  This
-   function expects that the expression has already been simplified.  */
+/* Determine if an expression is constant in the sense of F08:7.1.12.
+ * This function expects that the expression has already been simplified.
+ * FIXME: Return a bool, not an int.  */
 
 int
 gfc_is_constant_expr (gfc_expr *e)
 {
   gfc_constructor *c;
   gfc_actual_arglist *arg;
-  gfc_symbol *sym;
 
   if (e == NULL)
     return 1;
@@ -918,25 +918,6 @@ gfc_is_constant_expr (gfc_expr *e)
              return 0;
        }
 
-      /* Specification functions are constant.  */
-      /* F95, 7.1.6.2; F2003, 7.1.7  */
-      sym = NULL;
-      if (e->symtree)
-       sym = e->symtree->n.sym;
-      if (e->value.function.esym)
-       sym = e->value.function.esym;
-
-      if (sym
-         && sym->attr.function
-         && sym->attr.pure
-         && !sym->attr.intrinsic
-         && !sym->attr.recursive
-         && sym->attr.proc != PROC_INTERNAL
-         && sym->attr.proc != PROC_ST_FUNCTION
-         && sym->attr.proc != PROC_UNKNOWN
-         && gfc_sym_get_dummy_args (sym) == NULL)
-       return 1;
-
       if (e->value.function.isym
          && (e->value.function.isym->elemental
              || e->value.function.isym->pure
@@ -2739,7 +2720,8 @@ restricted_args (gfc_actual_arglist *a)
 /************* Restricted/specification expressions *************/
 
 
-/* Make sure a non-intrinsic function is a specification function.  */
+/* Make sure a non-intrinsic function is a specification function,
+ * see F08:7.1.11.5.  */
 
 static bool
 external_spec_function (gfc_expr *e)
index c7d872cb5b3391d07c3b3fdffc1d7fd79bd55709..ece4d7523a2cf8245c1b0f74b9ae34063726d343 100644 (file)
@@ -11825,8 +11825,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
       && !sym->attr.pointer
       && is_non_constant_shape_array (sym))
     {
-      /* The shape of a main program or module array needs to be
-        constant.  */
+      /* F08:C541. The shape of an array defined in a main program or module
+       * needs to be constant.  */
       gfc_error ("The module or main program array %qs at %L must "
                 "have constant shape", sym->name, &sym->declared_at);
       specification_expr = saved_specification_expr;
index d6657b574d9f1aca778327aae057a59433a2a779..d333de178da3b2a1a4cdb43a95f97e3297e55133 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/78392
+       * gfortran.dg/constant_shape.f90: New test case.
+
 2016-12-12  Marek Polacek  <polacek@redhat.com>
 
        PR c++/78647
diff --git a/gcc/testsuite/gfortran.dg/constant_shape.f90 b/gcc/testsuite/gfortran.dg/constant_shape.f90
new file mode 100644 (file)
index 0000000..c2eaf82
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do compile }
+!
+! PR 78392: ICE in gfc_trans_auto_array_allocation, at fortran/trans-array.c:5979
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+module mytypes
+   implicit none
+ contains
+   pure integer function get_i ()
+     get_i = 13
+   end function
+end module
+
+program test
+  use mytypes
+  implicit none
+  integer, dimension(get_i()) :: x  ! { dg-error "must have constant shape" }
+  print *, size (x)
+end