commit 5c80a1bd426a4aeccff0da54ab80d93d7973590e
Author: Tobias Burnus <tobias@codesourcery.com>
Date: Mon Feb 3 11:48:17 2020 +0100
Fortran] PR93309 – permit repeated 'implicit none(external)'
Backported from mainline
2020-01-21 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93309
* interface.c (gfc_procedure_use): Also check parent namespace for
'implict none (external)'.
* symbol.c (gfc_get_namespace): Don't set has_implicit_none_export
to parent namespace's setting.
Backported from mainline
2020-01-21 Tobias Burnus <tobias@codesourcery.com>
PR fortran/93309
* gfortran.dg/external_implicit_none_2.f90: New.
---
gcc/fortran/ChangeLog | 13 +++++++++-
gcc/fortran/interface.c | 7 +++++-
gcc/fortran/symbol.c | 3 ---
gcc/testsuite/ChangeLog | 8 +++++++
.../gfortran.dg/external_implicit_none_2.f90 | 28 ++++++++++++++++++++++
5 files changed, 54 insertions(+), 5 deletions(-)
@@ -1,3 +1,14 @@
+2020-02-03 Tobias Burnus <tobias@codesourcery.com>
+
+ Backported from mainline
+ 2020-01-21 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/93309
+ * interface.c (gfc_procedure_use): Also check parent namespace for
+ 'implict none (external)'.
+ * symbol.c (gfc_get_namespace): Don't set has_implicit_none_export
+ to parent namespace's setting.
+
2020-01-22 Jakub Jelinek <jakub@redhat.com>
* parse.c (parse_omp_structured_block): Handle ST_OMP_TARGET_PARALLEL.
@@ -10,7 +21,7 @@
2020-01-17 Mark Eggleston <mark.eggleston@codethink.com>
- Backport from mainline
+ Backport from mainline
Mark Eggleston <mark.eggleston@codethink.com>
PR fortran/93236
@@ -3671,7 +3671,12 @@ gfc_procedure_use (gfc_symbol *sym, gfc_actual_arglist **ap, locus *where)
explicitly declared at all if requested. */
if (sym->attr.if_source == IFSRC_UNKNOWN && !sym->attr.is_iso_c)
{
- if (sym->ns->has_implicit_none_export && sym->attr.proc == PROC_UNKNOWN)
+ bool has_implicit_none_export = false;
+ if (sym->attr.proc == PROC_UNKNOWN)
+ for (gfc_namespace *ns = sym->ns; ns; ns = ns->parent)
+ if (ns->has_implicit_none_export)
+ has_implicit_none_export = true;
+ if (has_implicit_none_export)
{
const char *guessed
= gfc_lookup_function_fuzzy (sym->name, sym->ns->sym_root);
@@ -2899,9 +2899,6 @@ gfc_get_namespace (gfc_namespace *parent, int parent_types)
}
}
- if (parent_types && ns->parent != NULL)
- ns->has_implicit_none_export = ns->parent->has_implicit_none_export;
-
ns->refs = 1;
return ns;
@@ -1,3 +1,11 @@
+2020-02-03 Tobias Burnus <tobias@codesourcery.com>
+
+ Backported from mainline
+ 2020-01-21 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/93309
+ * gfortran.dg/external_implicit_none_2.f90: New.
+
2020-01-30 Kito Cheng <kito.cheng@sifive.com>
Backport from mainline
new file mode 100644
@@ -0,0 +1,28 @@
+! { dg-do compile }
+!
+! PR fortran/93309
+!
+module m
+ implicit none(external)
+contains
+ subroutine s
+ implicit none(external) ! OK
+ end subroutine
+end module
+
+module m2
+ implicit none(external)
+contains
+ subroutine s
+ call foo(1) ! { dg-error "not explicitly declared" }
+ end subroutine
+end module
+
+module m3
+ implicit none(external)
+contains
+ subroutine s
+ implicit none(external) ! OK
+ implicit none(external) ! { dg-error "Duplicate IMPLICIT NONE statement" }
+ end subroutine
+end module