diff options
author | Peter Klausler <pklausler@nvidia.com> | 2022-10-04 10:24:29 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2022-10-06 11:21:36 -0700 |
commit | de457f64891c22a4680865642548f21b685491a1 (patch) | |
tree | 325f9bedd04ba63272a0e1a233b8272889832c8a /flang | |
parent | 81003744374dd2a75ae8dd190cdf2188cc086820 (diff) | |
download | llvm-de457f64891c22a4680865642548f21b685491a1.zip llvm-de457f64891c22a4680865642548f21b685491a1.tar.gz llvm-de457f64891c22a4680865642548f21b685491a1.tar.bz2 |
[flang] Error message situation should be a warning
f18 emits an error message when the same name is used in a scope
for both a procedure and a generic interface, and the procedure is
not a specific procedure of the generic interface. It may be
questionable usage, and not portable, but it does not appear to
be non-conforming by a strict reading of the standard, and many
popular Fortran compilers accept it.
Differential Revision: https://reviews.llvm.org/D135205
Diffstat (limited to 'flang')
-rw-r--r-- | flang/docs/Extensions.md | 31 | ||||
-rw-r--r-- | flang/lib/Semantics/resolve-names.cpp | 4 | ||||
-rw-r--r-- | flang/test/Semantics/resolve17.f90 | 2 | ||||
-rw-r--r-- | flang/test/Semantics/resolve18.f90 | 2 |
4 files changed, 35 insertions, 4 deletions
diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md index 09b5608..f2bce2f 100644 --- a/flang/docs/Extensions.md +++ b/flang/docs/Extensions.md @@ -440,3 +440,34 @@ end subroutine The precedent among the most commonly used compilers agrees with f18's interpretation: a `DATA` statement without any other specification of the name refers to the host-associated object. + +* Many Fortran compilers allow a non-generic procedure to be `USE`-associated + into a scope that also contains a generic interface of the same name + but does not have the `USE`-associated non-generic procedure as a + specific procedure. +``` +module m1 + contains + subroutine foo(n) + integer, intent(in) :: n + end subroutine +end module + +module m2 + use m1, only: foo + interface foo + module procedure noargs + end interface + contains + subroutine noargs + end subroutine +end module +``` + + This case elicits a warning from f18, as it should not be treated + any differently than the same case with the non-generic procedure of + the same name being defined in the same scope rather than being + `USE`-associated into it, which is explicitly non-conforming in the + standard and not allowed by most other compilers. + If the `USE`-associated entity of the same name is not a procedure, + most compilers disallow it as well. diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index df36326..51e0767 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -3196,8 +3196,8 @@ void InterfaceVisitor::CheckGenericProcedures(Symbol &generic) { auto &details{generic.get<GenericDetails>()}; if (auto *proc{details.CheckSpecific()}) { auto msg{ - "'%s' may not be the name of both a generic interface and a" - " procedure unless it is a specific procedure of the generic"_err_en_US}; + "'%s' should not be the name of both a generic interface and a" + " procedure unless it is a specific procedure of the generic"_warn_en_US}; if (proc->name().begin() > generic.name().begin()) { Say(proc->name(), std::move(msg)); } else { diff --git a/flang/test/Semantics/resolve17.f90 b/flang/test/Semantics/resolve17.f90 index 76b9cbe..784abd4 100644 --- a/flang/test/Semantics/resolve17.f90 +++ b/flang/test/Semantics/resolve17.f90 @@ -11,7 +11,7 @@ module m2 interface s end interface contains - !ERROR: 's' may not be the name of both a generic interface and a procedure unless it is a specific procedure of the generic + !WARNING: 's' should not be the name of both a generic interface and a procedure unless it is a specific procedure of the generic subroutine s end subroutine end module diff --git a/flang/test/Semantics/resolve18.f90 b/flang/test/Semantics/resolve18.f90 index 16f6ac5..edb59e9 100644 --- a/flang/test/Semantics/resolve18.f90 +++ b/flang/test/Semantics/resolve18.f90 @@ -11,7 +11,7 @@ end module module m2 use m1 implicit none - !ERROR: 'foo' may not be the name of both a generic interface and a procedure unless it is a specific procedure of the generic + !WARNING: 'foo' should not be the name of both a generic interface and a procedure unless it is a specific procedure of the generic interface foo module procedure s end interface |