[flang-commits] [flang] ddd692e - [flang] Allow forward reference to ENTRY from generic interface
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Wed May 25 17:15:11 PDT 2022
Author: Peter Klausler
Date: 2022-05-25T17:14:59-07:00
New Revision: ddd692e9d5722b8b85a871d9a4188358274b5f6e
URL: https://github.com/llvm/llvm-project/commit/ddd692e9d5722b8b85a871d9a4188358274b5f6e
DIFF: https://github.com/llvm/llvm-project/commit/ddd692e9d5722b8b85a871d9a4188358274b5f6e.diff
LOG: [flang] Allow forward reference to ENTRY from generic interface
The CreateEntry() function in name resolution needs to allow for the name
of an alternate entry point already having been declared in the outer scope
as the homonymous specific procedure of a generic interface; e.g.,
interface foo
module procedure foo
end interface
subroutine bar
entry foo
end subroutine
Differential Revision: https://reviews.llvm.org/D126436
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 9898fe3da57d..f03d3fa24b99 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -3411,10 +3411,21 @@ void SubprogramVisitor::CreateEntry(
if (outer.IsModule() && !attrs.test(Attr::PRIVATE)) {
attrs.set(Attr::PUBLIC);
}
- Symbol &entrySymbol{MakeSymbol(outer, entryName.source, attrs)};
+ Symbol *entrySymbol{FindInScope(outer, entryName.source)};
+ if (entrySymbol) {
+ if (auto *generic{entrySymbol->detailsIf<GenericDetails>()}) {
+ if (auto *specific{generic->specific()}) {
+ // Forward reference to ENTRY from a generic interface
+ entrySymbol = specific;
+ entrySymbol->attrs() |= attrs;
+ }
+ }
+ } else {
+ entrySymbol = &MakeSymbol(outer, entryName.source, attrs);
+ }
SubprogramDetails entryDetails;
entryDetails.set_entryScope(currScope());
- entrySymbol.set(subpFlag);
+ entrySymbol->set(subpFlag);
if (subpFlag == Symbol::Flag::Function) {
Symbol *result{nullptr};
EntityDetails resultDetails;
@@ -3443,11 +3454,12 @@ void SubprogramVisitor::CreateEntry(
if (subpFlag == Symbol::Flag::Subroutine ||
(distinctResultName && !badResultName)) {
Symbol &assoc{MakeSymbol(entryName.source)};
- assoc.set_details(HostAssocDetails{entrySymbol});
+ assoc.set_details(HostAssocDetails{*entrySymbol});
assoc.set(Symbol::Flag::Subroutine);
}
- Resolve(entryName, entrySymbol);
- entrySymbol.set_details(std::move(entryDetails));
+ Resolve(entryName, *entrySymbol);
+ Details details{std::move(entryDetails)};
+ entrySymbol->set_details(std::move(entryDetails));
}
void SubprogramVisitor::PostEntryStmt(const parser::EntryStmt &stmt) {
More information about the flang-commits
mailing list