]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: check for invalid uses of statement functions arguments [PR69604]
authorHarald Anlauf <anlauf@gmx.de>
Thu, 22 Dec 2022 21:03:31 +0000 (22:03 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 22 Dec 2022 21:03:31 +0000 (22:03 +0100)
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
gcc/testsuite/gfortran.dg/statement_function_4.f90 [new file with mode: 0644]

index 89fb115c0f61e07b26999669438a591dd2fe2479..3d346788416f3e81bacebbdf3052402627f4c11c 100644 (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
diff --git a/gcc/testsuite/gfortran.dg/statement_function_4.f90 b/gcc/testsuite/gfortran.dg/statement_function_4.f90
new file mode 100644 (file)
index 0000000..6ce5951
--- /dev/null
@@ -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