re PR fortran/84922 (fortran reports inconsistency in rank of arguments in interface...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 22 Mar 2018 21:42:07 +0000 (21:42 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 22 Mar 2018 21:42:07 +0000 (21:42 +0000)
2018-03-22  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/84922
* decl.c (get_proc_name): If the MODULE prefix appears in interface
body, then it must appear on the contained subroutine or function.
While here, fix nearby mis-indented code.

2018-03-22  Steven G. Kargl  <kargl@gcc.gnu.org

PR fortran/84922
* gfortran.dg/interface_42.f90: New test.
* gfortran.dg/interface_43.f90: New test.

From-SVN: r258784

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/interface_42.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/interface_43.f90 [new file with mode: 0644]

index 87c78ebdc1516dcf9418c49b347facc52fe6aa89..64142c54c21734dc476b7487aea551d2113a22de 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-22  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/84922
+       * decl.c (get_proc_name): If the MODULE prefix appears in interface
+       body, then it must appear on the contained subroutine or function.
+       While here, fix nearby mis-indented code.
+
 2018-03-21  Thomas Koenig  <tkoenig@gcc.gnu.org>
        Harald Anlauf  <anlauf@gmx.de>
 
index f6649cf95000749b9b944fbf2ca52665754c6ada..a82689069d4c869fe45478a0fadc490517ef2a55 100644 (file)
@@ -1245,15 +1245,26 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
                       "from a previous declaration",  name);
     }
 
-    if (sym && !sym->gfc_new
-       && sym->attr.flavor != FL_UNKNOWN
-       && sym->attr.referenced == 0 && sym->attr.subroutine == 1
-       && gfc_state_stack->state == COMP_CONTAINS
-       && gfc_state_stack->previous->state == COMP_SUBROUTINE)
-    {
-       gfc_error_now ("Procedure %qs at %C is already defined at %L",
-                      name, &sym->declared_at);
-    }
+  /* C1246 (R1225) MODULE shall appear only in the function-stmt or
+     subroutine-stmt of a module subprogram or of a nonabstract interface
+     body that is declared in the scoping unit of a module or submodule.  */
+  if (sym->attr.external
+      && (sym->attr.subroutine || sym->attr.function)
+      && sym->attr.if_source == IFSRC_IFBODY
+      && !current_attr.module_procedure
+      && sym->attr.proc == PROC_MODULE
+      && gfc_state_stack->state == COMP_CONTAINS)
+    gfc_error_now ("Procedure %qs defined in interface body at %L "
+                  "clashes with internal procedure defined at %C",
+                   name, &sym->declared_at);
+
+  if (sym && !sym->gfc_new
+      && sym->attr.flavor != FL_UNKNOWN
+      && sym->attr.referenced == 0 && sym->attr.subroutine == 1
+      && gfc_state_stack->state == COMP_CONTAINS
+      && gfc_state_stack->previous->state == COMP_SUBROUTINE)
+    gfc_error_now ("Procedure %qs at %C is already defined at %L",
+                   name, &sym->declared_at);
 
   if (gfc_current_ns->parent == NULL || *result == NULL)
     return rc;
index d1ddb79a8090bb917bab3ac7fa2e842f0e7d7917..d4b8c275d558100da0086b088811e228d5dc1116 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-22  Steven G. Kargl  <kargl@gcc.gnu.org
+
+       PR fortran/84922
+       * gfortran.dg/interface_42.f90: New test.
+       * gfortran.dg/interface_43.f90: New test.
+
 2018-03-22  Sudakshina Das  <sudi.das@arm.com>
 
        PR target/84826
diff --git a/gcc/testsuite/gfortran.dg/interface_42.f90 b/gcc/testsuite/gfortran.dg/interface_42.f90
new file mode 100644 (file)
index 0000000..1fd47b9
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+! { dg-options "-fmax-errors=1" }
+! PR fortran/84922
+! Original code contributed by William Clodius.
+module copy
+
+   interface
+      module subroutine foo_da(da, copy) ! { dg-error "(1)" }
+         integer, intent(in) :: da(:)
+         integer, allocatable, intent(out) :: copy(:)
+      end subroutine foo_da
+   end interface
+
+   contains
+
+      subroutine foo_da(da, copy) ! { dg-error "defined in interface body" }
+         integer, intent(in) :: da(:)
+         integer, allocatable, intent(out) :: copy(:)
+         allocate( copy( size(da) ) )
+         copy = da
+      end subroutine foo_da
+
+end module copy
+{ dg-prune-output "compilation terminated" }
diff --git a/gcc/testsuite/gfortran.dg/interface_43.f90 b/gcc/testsuite/gfortran.dg/interface_43.f90
new file mode 100644 (file)
index 0000000..5a5294f
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! PR fortran/84922
+! This should compile without error.
+module foom
+
+   implicit none
+
+   interface foo
+      module procedure foo_sngl
+      module procedure foo_dble
+   end interface foo
+
+   contains
+
+      subroutine foo_sngl(n, f, g, h)
+         integer n
+         real f, g, h
+      end subroutine foo_sngl
+
+      subroutine foo_dble(n, f, g, h)
+         integer n
+         double precision f, g, h
+      end subroutine foo_dble
+
+end module foom