Fortran: check for invalid uses of statement functions arguments [PR69604]

gcc/fortran/ChangeLog:

	PR fortran/69604
	* match.cc (chk_stmt_fcn_body): New function.  Check for invalid uses
	of statement functions arguments.
	(gfc_match_st_function): Use above.

gcc/testsuite/ChangeLog:

	PR fortran/69604
	* gfortran.dg/statement_function_4.f90: New test.
This commit is contained in:
Harald Anlauf 2022-12-22 22:03:31 +01:00
parent 74544bdadc
commit 794af0d00b
2 changed files with 37 additions and 0 deletions

View file

@ -5915,6 +5915,30 @@ recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
}
/* Check for invalid uses of statement function dummy arguments in body. */
static bool
chk_stmt_fcn_body (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
{
gfc_formal_arglist *formal;
if (e == NULL || e->symtree == NULL || e->expr_type != EXPR_FUNCTION)
return false;
for (formal = sym->formal; formal; formal = formal->next)
{
if (formal->sym == e->symtree->n.sym)
{
gfc_error ("Invalid use of statement function argument at %L",
&e->where);
return true;
}
}
return false;
}
/* Match a statement function declaration. It is so easy to match
non-statement function statements with a MATCH_ERROR as opposed to
MATCH_NO that we suppress error message in most cases. */
@ -5983,6 +6007,9 @@ gfc_match_st_function (void)
return MATCH_ERROR;
}
if (gfc_traverse_expr (expr, sym, chk_stmt_fcn_body, 0))
return MATCH_ERROR;
sym->value = expr;
if ((gfc_current_state () == COMP_FUNCTION

View file

@ -0,0 +1,10 @@
! { dg-do compile }
! PR fortran/69604
! Contributed by G.Steinmetz
program p
x(n) = 1 + n(2.0) ! { dg-error "Invalid use of statement function argument" }
y(k) = k() ! { dg-error "Invalid use of statement function argument" }
z(m) = m ! { dg-warning "Statement function" }
print *, x(n)
end