From: Peter Klausler Date: Thu, 9 Jun 2022 23:06:23 +0000 (-0700) Subject: [flang] Handle module subprogram with interface in same (sub)module when writing... X-Git-Tag: upstream/15.0.7~4501 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b67984d356272b36ac1ec04c4c844d3b57eeeff5;p=platform%2Fupstream%2Fllvm.git [flang] Handle module subprogram with interface in same (sub)module when writing module file There's a few (3) cases where Fortran allows two distinct symbols to have the same name in the same scope. Module file output copes with only two of them. The third involves a separate module procedure that isn't separate: both the procedure and its declared interface appear in the same (sub)module. Fix to ensure that the interface is included in the module file output, so that the module file reader doesn't suffer a bogus error about a "separate module procedure without an interface". Differential Revision: https://reviews.llvm.org/D127784 --- diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp index d97b817..50ea580 100644 --- a/flang/lib/Semantics/mod-file.cpp +++ b/flang/lib/Semantics/mod-file.cpp @@ -419,8 +419,11 @@ static const Attrs subprogramPrefixAttrs{Attr::ELEMENTAL, Attr::IMPURE, Attr::MODULE, Attr::NON_RECURSIVE, Attr::PURE, Attr::RECURSIVE}; void ModFileWriter::PutSubprogram(const Symbol &symbol) { - auto attrs{symbol.attrs()}; auto &details{symbol.get()}; + if (const Symbol * interface{details.moduleInterface()}) { + PutSubprogram(*interface); + } + auto attrs{symbol.attrs()}; Attrs bindAttrs{}; if (attrs.test(Attr::BIND_C)) { // bind(c) is a suffix, not prefix @@ -1092,6 +1095,9 @@ void SubprogramSymbolCollector::Collect() { const Symbol *dt{generic->derivedType()}; needed = needed || (spec && useSet_.count(*spec) > 0) || (dt && useSet_.count(*dt) > 0); + } else if (const auto *subp{ultimate.detailsIf()}) { + const Symbol *interface { subp->moduleInterface() }; + needed = needed || (interface && useSet_.count(*interface) > 0); } if (needed) { need_.push_back(symbol);