]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2016-02-07 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Feb 2016 20:15:55 +0000 (20:15 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Feb 2016 20:15:55 +0000 (20:15 +0000)
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.

PR fortran/50555
* gfortran.dg/namelist_args.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233203 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/primary.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/namelist_args.f90 [new file with mode: 0644]

index f94fbe5df0514d0602f1c1069a5f14376ebf2b48..16a7c3d9b196361a46c7e0cb9c3972e37698820b 100644 (file)
@@ -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
index fb4029ce79324f982581a44f7984467876b2c618..d25d3de66b0e21f18c99d159cbe559442d1776b6 100644 (file)
@@ -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;
index 8752fd4693b928fcdf57a2bc57943ad547d6c22b..e6c3ff952e276fcb33cc375c8ea1c86b71c4518e 100644 (file)
@@ -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;
index 388b2b981856c5af3c7ca147d71a53b6e84e9ff6..8d3438efb2757a5cc3f12c36f7992256c12064b1 100644 (file)
@@ -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 (file)
index 0000000..132efce
--- /dev/null
@@ -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