[flang-commits] [PATCH] D140127: [flang] When resolving a binding, allow for overriding
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Thu Dec 15 15:09:13 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGe9088e3789bb: [flang] When resolving a binding, allow for overriding (authored by klausler).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140127/new/
https://reviews.llvm.org/D140127
Files:
flang/lib/Semantics/expression.cpp
Index: flang/lib/Semantics/expression.cpp
===================================================================
--- flang/lib/Semantics/expression.cpp
+++ flang/lib/Semantics/expression.cpp
@@ -2071,6 +2071,7 @@
}
if (auto *dtExpr{UnwrapExpr<Expr<SomeDerived>>(*base)}) {
if (sym->has<semantics::GenericDetails>()) {
+ auto dyType{dtExpr->GetType()};
AdjustActuals adjustment{
[&](const Symbol &proc, ActualArguments &actuals) {
if (!proc.attrs().test(semantics::Attr::NOPASS)) {
@@ -2082,6 +2083,15 @@
sym = pair.first;
if (sym) {
// re-resolve the name to the specific binding
+ CHECK(sym->has<semantics::ProcBindingDetails>());
+ // Use the most recent override of the binding, if any
+ CHECK(dyType && dyType->category() == TypeCategory::Derived &&
+ !dyType->IsUnlimitedPolymorphic());
+ if (const Symbol *latest{
+ DEREF(dyType->GetDerivedTypeSpec().typeSymbol().scope())
+ .FindComponent(sym->name())}) {
+ sym = latest;
+ }
sc.component.symbol = const_cast<Symbol *>(sym);
} else {
EmitGenericResolutionError(
@@ -3834,14 +3844,14 @@
context_.EmitGenericResolutionError(*symbol, pair.second, true);
}
}
- for (std::size_t i{0}; i < actuals_.size(); ++i) {
+ for (std::size_t i{0}; !proc && i < actuals_.size(); ++i) {
const Symbol *generic{nullptr};
- if (const Symbol *specific{FindBoundOp(oprName, i, generic, true)}) {
+ if (const Symbol *binding{FindBoundOp(oprName, i, generic, true)}) {
if (const Symbol *resolution{
- GetBindingResolution(GetType(i), *specific)}) {
+ GetBindingResolution(GetType(i), *binding)}) {
proc = resolution;
} else {
- proc = specific;
+ proc = binding;
passedObjectIndex = i;
}
}
@@ -3924,23 +3934,30 @@
const Symbol *ArgumentAnalyzer::FindBoundOp(parser::CharBlock oprName,
int passIndex, const Symbol *&generic, bool isSubroutine) {
const auto *type{GetDerivedTypeSpec(GetType(passIndex))};
- if (!type || !type->scope()) {
- return nullptr;
- }
- generic = type->scope()->FindComponent(oprName);
- if (!generic) {
- return nullptr;
- }
- ExpressionAnalyzer::AdjustActuals adjustment{
- [&](const Symbol &proc, ActualArguments &) {
- return passIndex == GetPassIndex(proc);
- }};
- auto pair{
- context_.ResolveGeneric(*generic, actuals_, adjustment, isSubroutine)};
- if (!pair.first) {
- context_.EmitGenericResolutionError(*generic, pair.second, isSubroutine);
+ const semantics::Scope *scope{type ? type->scope() : nullptr};
+ if (scope) {
+ // Use the original type definition's scope, since PDT
+ // instantiations don't have redundant copies of bindings or
+ // generics.
+ scope = DEREF(scope->derivedTypeSpec()).typeSymbol().scope();
+ }
+ generic = scope ? scope->FindComponent(oprName) : nullptr;
+ if (generic) {
+ ExpressionAnalyzer::AdjustActuals adjustment{
+ [&](const Symbol &proc, ActualArguments &) {
+ return passIndex == GetPassIndex(proc);
+ }};
+ auto pair{
+ context_.ResolveGeneric(*generic, actuals_, adjustment, isSubroutine)};
+ if (const Symbol *binding{pair.first}) {
+ CHECK(binding->has<semantics::ProcBindingDetails>());
+ // Use the most recent override of the binding, if any
+ return scope->FindComponent(binding->name());
+ } else {
+ context_.EmitGenericResolutionError(*generic, pair.second, isSubroutine);
+ }
}
- return pair.first;
+ return nullptr;
}
// If there is an implicit conversion between intrinsic types, make it explicit
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140127.483359.patch
Type: text/x-patch
Size: 3874 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20221215/75e2c676/attachment.bin>
More information about the flang-commits
mailing list