[flang-commits] [PATCH] D96467: flang] Cope with specific procedures with same name as generic
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Wed Feb 10 16:30:18 PST 2021
klausler created this revision.
klausler added a reviewer: tskeith.
klausler added a project: Flang.
Herald added a subscriber: jdoerfert.
klausler requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
[When accessing a specific procedure of a USE-associated generic
interface, we need to allow for the case in which that specific
procedure has the same name as the generic when testing for
its availability in the current scope.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D96467
Files:
flang/lib/Semantics/expression.cpp
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -1980,20 +1980,26 @@
} else if (const auto *used{
originalGeneric.detailsIf<semantics::UseDetails>()}) {
const auto &scope{originalGeneric.owner()};
- auto iter{scope.find(specific.name())};
- if (iter != scope.end() && iter->second->has<semantics::UseDetails>() &&
- &iter->second->get<semantics::UseDetails>().symbol() == &specific) {
- return specific;
- } else {
- // Create a renaming USE of the specific procedure.
- auto rename{context_.SaveTempName(
- used->symbol().owner().GetName().value().ToString() + "$" +
- specific.name().ToString())};
- return *const_cast<semantics::Scope &>(scope)
- .try_emplace(rename, specific.attrs(),
- semantics::UseDetails{rename, specific})
- .first->second;
+ if (auto iter{scope.find(specific.name())}; iter != scope.end()) {
+ if (const auto *useDetails{
+ iter->second->detailsIf<semantics::UseDetails>()}) {
+ const Symbol &usedSymbol{useDetails->symbol()};
+ const auto *usedGeneric{
+ usedSymbol.detailsIf<semantics::GenericDetails>()};
+ if (&usedSymbol == &specific ||
+ (usedGeneric && usedGeneric->specific() == &specific)) {
+ return specific;
+ }
+ }
}
+ // Create a renaming USE of the specific procedure.
+ auto rename{context_.SaveTempName(
+ used->symbol().owner().GetName().value().ToString() + "$" +
+ specific.name().ToString())};
+ return *const_cast<semantics::Scope &>(scope)
+ .try_emplace(rename, specific.attrs(),
+ semantics::UseDetails{rename, specific})
+ .first->second;
} else {
return specific;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96467.322857.patch
Type: text/x-patch
Size: 1971 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20210211/9880a5da/attachment.bin>
More information about the flang-commits
mailing list