aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2018-03-22 21:42:07 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2018-03-22 21:42:07 +0000
commitb74fa12697a7b369368b8792ea8217ba5fcfaf85 (patch)
treef47abe155e17a6b3a3886a786d592ec08935e987
parent0bf86d4683e42967bc55de1d3b5bc31a713396f1 (diff)
downloadgcc-b74fa12697a7b369368b8792ea8217ba5fcfaf85.zip
gcc-b74fa12697a7b369368b8792ea8217ba5fcfaf85.tar.gz
gcc-b74fa12697a7b369368b8792ea8217ba5fcfaf85.tar.bz2
re PR fortran/84922 (fortran reports inconsistency in rank of arguments in interface and contained procedures)
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
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/decl.c29
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gfortran.dg/interface_42.f9024
-rw-r--r--gcc/testsuite/gfortran.dg/interface_43.f9025
5 files changed, 82 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 87c78eb..64142c5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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>
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index f6649cf..a826890 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d1ddb79..d4b8c27 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..1fd47b9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_42.f90
@@ -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
index 0000000..5a5294f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/interface_43.f90
@@ -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