From 5c80a1bd426a4aeccff0da54ab80d93d7973590e Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Mon, 3 Feb 2020 11:48:17 +0100 Subject: [PATCH] =?utf8?q?Fortran]=20PR93309=20=E2=80=93=20permit=20repeat?= =?utf8?q?ed=20'implicit=20none(external)'?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Backported from mainline 2020-01-21 Tobias Burnus 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 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(-) create mode 100644 gcc/testsuite/gfortran.dg/external_implicit_none_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e0a34420e362..ec87cc9e6cf6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2020-02-03 Tobias Burnus + + Backported from mainline + 2020-01-21 Tobias Burnus + + 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 * parse.c (parse_omp_structured_block): Handle ST_OMP_TARGET_PARALLEL. @@ -10,7 +21,7 @@ 2020-01-17 Mark Eggleston - Backport from mainline + Backport from mainline Mark Eggleston PR fortran/93236 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index bee98129bc1b..b5701b1a59a1 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -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); diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 2b8f86e0881f..faaeebf2c098 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9e117a6854a1..0f8e75926659 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-02-03 Tobias Burnus + + Backported from mainline + 2020-01-21 Tobias Burnus + + PR fortran/93309 + * gfortran.dg/external_implicit_none_2.f90: New. + 2020-01-30 Kito Cheng Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/external_implicit_none_2.f90 b/gcc/testsuite/gfortran.dg/external_implicit_none_2.f90 new file mode 100644 index 000000000000..b2b1dd1e6d79 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/external_implicit_none_2.f90 @@ -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 -- 2.47.3