aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/primary.c10
-rw-r--r--gcc/fortran/resolve.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/namelist_args.f9018
5 files changed, 57 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f94fbe5..16a7c3d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2016-02-07 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.
+
2016-02-05 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/66089
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/ChangeLog b/gcc/testsuite/ChangeLog
index 388b2b9..8d3438e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/50555
+ * gfortran.dg/namelist_args.f90: New test.
+
2016-02-05 Jeff Law <law@redhat.com>
PR tree-optimization/68541
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