From 9895ba86a842bfea10c731ed6c5ed05d77e30d91 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Wed, 10 Feb 2021 16:28:34 -0800 Subject: [PATCH] [flang] Cope with specific procedures with same name as generic 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. Differential Revision: https://reviews.llvm.org/D96467 --- flang/lib/Semantics/expression.cpp | 32 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 37207e6fde2f..c5ca4126f6be 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -1980,20 +1980,26 @@ const Symbol &ExpressionAnalyzer::AccessSpecific( } else if (const auto *used{ originalGeneric.detailsIf()}) { const auto &scope{originalGeneric.owner()}; - auto iter{scope.find(specific.name())}; - if (iter != scope.end() && iter->second->has() && - &iter->second->get().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(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()}) { + const Symbol &usedSymbol{useDetails->symbol()}; + const auto *usedGeneric{ + usedSymbol.detailsIf()}; + 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(scope) + .try_emplace(rename, specific.attrs(), + semantics::UseDetails{rename, specific}) + .first->second; } else { return specific; }