[flang-commits] [flang] 54d19ba - [flang] Fix crash: ENTRY with generic interface of the same name
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Tue Mar 22 11:10:38 PDT 2022
Author: Peter Klausler
Date: 2022-03-22T11:10:30-07:00
New Revision: 54d19ba2084ca366b99b95ed22a6862819c55c49
URL: https://github.com/llvm/llvm-project/commit/54d19ba2084ca366b99b95ed22a6862819c55c49
DIFF: https://github.com/llvm/llvm-project/commit/54d19ba2084ca366b99b95ed22a6862819c55c49.diff
LOG: [flang] Fix crash: ENTRY with generic interface of the same name
Name resolution was crashing while processing the ENTRY statement
due to a lack of special-case code necessary to handle the indirection
needed when the generic has the same name as the ENTRY.
Differential Revision: https://reviews.llvm.org/D122050
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 6301e88b24f12..650debbc11b6c 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -3300,11 +3300,16 @@ void SubprogramVisitor::Post(const parser::EntryStmt &stmt) {
return;
}
}
- Symbol &entrySymbol{MakeSymbol(outer, name.source, attrs)};
- entrySymbol.set_details(std::move(entryDetails));
- SetBindNameOn(entrySymbol);
- entrySymbol.set(subpFlag);
- Resolve(name, entrySymbol);
+
+ Symbol *entrySymbol{&MakeSymbol(outer, name.source, attrs)};
+ if (auto *generic{entrySymbol->detailsIf<GenericDetails>()}) {
+ CHECK(generic->specific());
+ entrySymbol = generic->specific();
+ }
+ entrySymbol->set_details(std::move(entryDetails));
+ SetBindNameOn(*entrySymbol);
+ entrySymbol->set(subpFlag);
+ Resolve(name, *entrySymbol);
}
// A subprogram declared with MODULE PROCEDURE
@@ -3400,9 +3405,14 @@ void SubprogramVisitor::EndSubprogram() {
bool SubprogramVisitor::HandlePreviousCalls(
const parser::Name &name, Symbol &symbol, Symbol::Flag subpFlag) {
- if (const auto *proc{symbol.detailsIf<ProcEntityDetails>()}; proc &&
- !proc->isDummy() &&
- !symbol.attrs().HasAny(Attrs{Attr::INTRINSIC, Attr::POINTER})) {
+ // If the extant symbol is a generic, check its homonymous specific
+ // procedure instead if it has one.
+ if (auto *generic{symbol.detailsIf<GenericDetails>()}) {
+ return generic->specific() &&
+ HandlePreviousCalls(name, *generic->specific(), subpFlag);
+ } else if (const auto *proc{symbol.detailsIf<ProcEntityDetails>()}; proc &&
+ !proc->isDummy() &&
+ !symbol.attrs().HasAny(Attrs{Attr::INTRINSIC, Attr::POINTER})) {
// There's a symbol created for previous calls to this subprogram or
// ENTRY's name. We have to replace that symbol in situ to avoid the
// obligation to rewrite symbol pointers in the parse tree.
@@ -7320,14 +7330,27 @@ bool ResolveNames(
void ResolveSpecificationParts(
SemanticsContext &context, const Symbol &subprogram) {
auto originalLocation{context.location()};
+ ImplicitRulesMap implicitRulesMap;
+ bool localImplicitRulesMap{false};
+ if (!sharedImplicitRulesMap) {
+ sharedImplicitRulesMap = &implicitRulesMap;
+ localImplicitRulesMap = true;
+ }
ResolveNamesVisitor visitor{
- context, DEREF(sharedImplicitRulesMap), context.globalScope()};
+ context, *sharedImplicitRulesMap, context.globalScope()};
const auto &details{subprogram.get<SubprogramNameDetails>()};
ProgramTree &node{details.node()};
const Scope &moduleScope{subprogram.owner()};
- visitor.SetScope(const_cast<Scope &>(moduleScope));
+ if (localImplicitRulesMap) {
+ visitor.BeginScope(const_cast<Scope &>(moduleScope));
+ } else {
+ visitor.SetScope(const_cast<Scope &>(moduleScope));
+ }
visitor.ResolveSpecificationParts(node);
context.set_location(std::move(originalLocation));
+ if (localImplicitRulesMap) {
+ sharedImplicitRulesMap = nullptr;
+ }
}
} // namespace Fortran::semantics
More information about the flang-commits
mailing list