Commit 068b961b by Janus Weil

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
parent e4d60406
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> 2016-12-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/78226 PR fortran/78226
......
...@@ -881,15 +881,15 @@ done: ...@@ -881,15 +881,15 @@ done:
} }
/* Function to determine if an expression is constant or not. This /* Determine if an expression is constant in the sense of F08:7.1.12.
function expects that the expression has already been simplified. */ * This function expects that the expression has already been simplified.
* FIXME: Return a bool, not an int. */
int int
gfc_is_constant_expr (gfc_expr *e) gfc_is_constant_expr (gfc_expr *e)
{ {
gfc_constructor *c; gfc_constructor *c;
gfc_actual_arglist *arg; gfc_actual_arglist *arg;
gfc_symbol *sym;
if (e == NULL) if (e == NULL)
return 1; return 1;
...@@ -918,25 +918,6 @@ gfc_is_constant_expr (gfc_expr *e) ...@@ -918,25 +918,6 @@ gfc_is_constant_expr (gfc_expr *e)
return 0; 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 if (e->value.function.isym
&& (e->value.function.isym->elemental && (e->value.function.isym->elemental
|| e->value.function.isym->pure || e->value.function.isym->pure
...@@ -2739,7 +2720,8 @@ restricted_args (gfc_actual_arglist *a) ...@@ -2739,7 +2720,8 @@ restricted_args (gfc_actual_arglist *a)
/************* Restricted/specification expressions *************/ /************* 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 static bool
external_spec_function (gfc_expr *e) external_spec_function (gfc_expr *e)
......
...@@ -11825,8 +11825,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) ...@@ -11825,8 +11825,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
&& !sym->attr.pointer && !sym->attr.pointer
&& is_non_constant_shape_array (sym)) && is_non_constant_shape_array (sym))
{ {
/* The shape of a main program or module array needs to be /* F08:C541. The shape of an array defined in a main program or module
constant. */ * needs to be constant. */
gfc_error ("The module or main program array %qs at %L must " gfc_error ("The module or main program array %qs at %L must "
"have constant shape", sym->name, &sym->declared_at); "have constant shape", sym->name, &sym->declared_at);
specification_expr = saved_specification_expr; specification_expr = saved_specification_expr;
......
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> 2016-12-12 Marek Polacek <polacek@redhat.com>
PR c++/78647 PR c++/78647
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment