This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] PR50555 synonymous namelist/statement function dummy argument not allowed
- From: Jerry DeLisle <jvdelisle at charter dot net>
- To: gfortran <fortran at gcc dot gnu dot org>
- Cc: gcc patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 6 Feb 2016 20:13:27 -0800
- Subject: [patch, fortran] PR50555 synonymous namelist/statement function dummy argument not allowed
- Authentication-results: sourceware.org; auth=none
Hi All,
Attached patch adds diagnostics to catch this.
Test case included. Regression tested on x86-64
OK for trunk?
Regards,
Jerry
PS Want to get this one out of the way so I can do the new namelist regression
with DELIM=NONE.
2016-02-06 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/50555
* primary.c (match_actual_arg): If symbol has attribute flavor of
namelist, generate an error. (gfc_match_rvalue): Likewise return
MATCH_ERROR.
* resolve.c (resolve_symbol): Scan arument list of procedures and
generate an error if a namelist is found.
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index fb4029c..d25d3de 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1552,6 +1552,12 @@ match_actual_arg (gfc_expr **result)
sym = symtree->n.sym;
gfc_set_sym_referenced (sym);
+ if (sym->attr.flavor == FL_NAMELIST)
+ {
+ gfc_error ("Namelist '%s' can not be an argument at %L",
+ sym->name, &where);
+ break;
+ }
if (sym->attr.flavor != FL_PROCEDURE
&& sym->attr.flavor != FL_UNKNOWN)
break;
@@ -3219,6 +3225,10 @@ gfc_match_rvalue (gfc_expr **result)
m = gfc_match_actual_arglist (0, &e->value.function.actual);
break;
+ case FL_NAMELIST:
+ m = MATCH_ERROR;
+ break;
+
default:
gfc_error ("Symbol at %C is not appropriate for an expression");
return MATCH_ERROR;
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 8752fd4..e6c3ff9 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -14226,6 +14226,21 @@ resolve_symbol (gfc_symbol *sym)
break;
case FL_PROCEDURE:
+ if (sym->formal && !sym->formal_ns)
+ {
+ /* Check that none of the arguments are a namelist. */
+ gfc_formal_arglist *formal = sym->formal;
+
+ for (; formal; formal = formal->next)
+ if (formal->sym && formal->sym->attr.flavor == FL_NAMELIST)
+ {
+ gfc_error ("Namelist '%s' can not be an argument to "
+ "subroutine or function at %L",
+ formal->sym->name, &sym->declared_at);
+ return;
+ }
+ }
+
if (!resolve_fl_procedure (sym, mp_flag))
return;
break;
diff --git a/gcc/testsuite/gfortran.dg/namelist_args.f90 b/gcc/testsuite/gfortran.dg/namelist_args.f90
new file mode 100644
index 0000000..132efce
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/namelist_args.f90
@@ -0,0 +1,18 @@
+! { dg-do compile }
+! { dg-options -std=gnu }
+! PR50555 synonymous namelist/statement function dummy argument not allowed
+subroutine g(k1, k2, k3)
+ integer, intent(in) :: k1, k2, k3
+ print *, k
+end subroutine
+function j(k1, k2, k3)
+ integer, intent(in) :: k1, k2, k3
+ j = 25 * k
+end function
+program pr50555
+ namelist /i/ j
+ call g(k,l,i) ! { dg-error "can not be an argument" }
+ f(k,l,i)=0 ! { dg-error "can not be an argument" }
+ h = j(k,l,i) ! { dg-error "can not be an argument" }
+end program
+! Note: -std=gnu needed because line 15 function statement is obsolescent