diff options
author | Janus Weil <janus@gcc.gnu.org> | 2016-12-12 19:54:54 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2016-12-12 19:54:54 +0100 |
commit | 068b961b6a5ad37898cee76ce0e80ef46001eb03 (patch) | |
tree | 94f26051c1bbc2bd927fc10c86cdce7e02428131 /gcc/fortran/expr.c | |
parent | e4d604062535264fd7973c29f3343d1e51951437 (diff) | |
download | gcc-068b961b6a5ad37898cee76ce0e80ef46001eb03.zip gcc-068b961b6a5ad37898cee76ce0e80ef46001eb03.tar.gz gcc-068b961b6a5ad37898cee76ce0e80ef46001eb03.tar.bz2 |
re PR fortran/78392 (ICE in gfc_trans_auto_array_allocation, at fortran/trans-array.c:5979)
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
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 28 |
1 files changed, 5 insertions, 23 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 3464a20..c4a6ae1 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -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) |