This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch, fortran] PR50555 synonymous namelist/statement function dummy argument not allowed


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]