[flang-commits] [flang] bb7e31b - [flang] Don't repeat module procedure interface from ancestor in *.mod file
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Sat Dec 3 13:39:45 PST 2022
Author: Peter Klausler
Date: 2022-12-03T13:39:33-08:00
New Revision: bb7e31bccf4a26fc29809370fbbf5079f79584b3
URL: https://github.com/llvm/llvm-project/commit/bb7e31bccf4a26fc29809370fbbf5079f79584b3
DIFF: https://github.com/llvm/llvm-project/commit/bb7e31bccf4a26fc29809370fbbf5079f79584b3.diff
LOG: [flang] Don't repeat module procedure interface from ancestor in *.mod file
When a submodule defines a module procedure whose interface was declared
in an ancestor (sub)module, don't repeat the definition of that interface
in the submodule's *.mod file output.
Differential Revision: https://reviews.llvm.org/D139132
Added:
Modified:
flang/lib/Semantics/mod-file.cpp
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/mod-file.cpp b/flang/lib/Semantics/mod-file.cpp
index 0f6117b26a61..36b23410ab20 100644
--- a/flang/lib/Semantics/mod-file.cpp
+++ b/flang/lib/Semantics/mod-file.cpp
@@ -422,7 +422,12 @@ static const Attrs subprogramPrefixAttrs{Attr::ELEMENTAL, Attr::IMPURE,
void ModFileWriter::PutSubprogram(const Symbol &symbol) {
auto &details{symbol.get<SubprogramDetails>()};
if (const Symbol * interface{details.moduleInterface()}) {
- PutSubprogram(*interface);
+ const Scope *module{FindModuleContaining(interface->owner())};
+ if (module && module != &symbol.owner()) {
+ // Interface is in ancestor module
+ } else {
+ PutSubprogram(*interface);
+ }
}
auto attrs{symbol.attrs()};
Attrs bindAttrs{};
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 983f5b465355..933ecb01beff 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -873,7 +873,7 @@ class SubprogramVisitor : public virtual ScopeHandler, public InterfaceVisitor {
Symbol &PushSubprogramScope(const parser::Name &, Symbol::Flag,
const parser::LanguageBindingSpec * = nullptr);
Symbol *GetSpecificFromGeneric(const parser::Name &);
- SubprogramDetails &PostSubprogramStmt(const parser::Name &);
+ SubprogramDetails &PostSubprogramStmt();
void CreateEntry(const parser::EntryStmt &stmt, Symbol &subprogram);
void PostEntryStmt(const parser::EntryStmt &stmt);
void HandleLanguageBinding(Symbol *,
@@ -3422,8 +3422,7 @@ bool SubprogramVisitor::Pre(const parser::SubroutineStmt &stmt) {
Walk(std::get<parser::Name>(stmt.t));
Walk(std::get<std::list<parser::DummyArg>>(stmt.t));
// Don't traverse the LanguageBindingSpec now; it's deferred to EndSubprogram.
- const auto &name{std::get<parser::Name>(stmt.t)};
- auto &details{PostSubprogramStmt(name)};
+ auto &details{PostSubprogramStmt()};
for (const auto &dummyArg : std::get<std::list<parser::DummyArg>>(stmt.t)) {
if (const auto *dummyName{std::get_if<parser::Name>(&dummyArg.u)}) {
Symbol &dummy{MakeSymbol(*dummyName, EntityDetails{true})};
@@ -3444,7 +3443,7 @@ bool SubprogramVisitor::Pre(const parser::EntryStmt &) { return BeginAttrs(); }
void SubprogramVisitor::Post(const parser::FunctionStmt &stmt) {
const auto &name{std::get<parser::Name>(stmt.t)};
- auto &details{PostSubprogramStmt(name)};
+ auto &details{PostSubprogramStmt()};
for (const auto &dummyName : std::get<std::list<parser::Name>>(stmt.t)) {
Symbol &dummy{MakeSymbol(dummyName, EntityDetails{true})};
details.add_dummyArg(dummy);
@@ -3509,8 +3508,7 @@ void SubprogramVisitor::Post(const parser::FunctionStmt &stmt) {
info.resultName = nullptr;
}
-SubprogramDetails &SubprogramVisitor::PostSubprogramStmt(
- const parser::Name &name) {
+SubprogramDetails &SubprogramVisitor::PostSubprogramStmt() {
Symbol &symbol{*currScope().symbol()};
SetExplicitAttrs(symbol, EndAttrs());
if (symbol.attrs().test(Attr::MODULE)) {
@@ -3775,7 +3773,7 @@ bool SubprogramVisitor::BeginSubprogram(const parser::Name &name,
if (moduleInterface && &moduleInterface->owner() == &currScope()) {
// Subprogram is MODULE FUNCTION or MODULE SUBROUTINE with an interface
// previously defined in the same scope.
- currScope().erase(moduleInterface->name());
+ EraseSymbol(name);
}
}
Symbol &newSymbol{PushSubprogramScope(name, subpFlag, bindingSpec)};
More information about the flang-commits
mailing list