Fortran: check for invalid uses of statement functions arguments [PR69604]
Checks
Commit Message
Dear all,
the attached patch adds a check for statement function bodies for
invalid uses of dummy arguments. This fixes an ICE-on invalid.
Regtested on x86_64-pc-linux-gnu. OK for mainline?
Thanks,
Harald
Comments
On Thu, Dec 22, 2022 at 10:13:04PM +0100, Harald Anlauf via Fortran wrote:
>
> the attached patch adds a check for statement function bodies for
> invalid uses of dummy arguments. This fixes an ICE-on invalid.
>
> Regtested on x86_64-pc-linux-gnu. OK for mainline?
>
Yes. Thanks for the patch.
From 794af0d00b7086c9f0493f3a1aaac644e1fd50f6 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Thu, 22 Dec 2022 22:03:31 +0100
Subject: [PATCH] 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.
---
gcc/fortran/match.cc | 27 +++++++++++++++++++
.../gfortran.dg/statement_function_4.f90 | 10 +++++++
2 files changed, 37 insertions(+)
create mode 100644 gcc/testsuite/gfortran.dg/statement_function_4.f90
@@ -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
new file mode 100644
@@ -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
--
2.35.3