diff options
Diffstat (limited to 'flang/lib/Semantics/symbol.cpp')
| -rw-r--r-- | flang/lib/Semantics/symbol.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp index 2259cfcf23ec..ea7eeac80a2d 100644 --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -330,8 +330,14 @@ bool Symbol::CanReplaceDetails(const Details &details) const { common::visitors{ [](const UseErrorDetails &) { return true; }, [&](const ObjectEntityDetails &) { return has<EntityDetails>(); }, - [&](const ProcEntityDetails &) { return has<EntityDetails>(); }, + [&](const ProcEntityDetails &x) { return has<EntityDetails>(); }, [&](const SubprogramDetails &) { + if (const auto *oldProc{detailsIf<ProcEntityDetails>()}) { + // Can replace bare "EXTERNAL dummy" with explicit INTERFACE + return oldProc->isDummy() && !oldProc->procInterface() && + attrs().test(Attr::EXTERNAL) && !test(Flag::Function) && + !test(Flag::Subroutine); + } return has<SubprogramNameDetails>() || has<EntityDetails>(); }, [&](const DerivedTypeDetails &) { @@ -339,14 +345,12 @@ bool Symbol::CanReplaceDetails(const Details &details) const { return derived && derived->isForwardReferenced(); }, [&](const UseDetails &x) { - const auto *use{this->detailsIf<UseDetails>()}; + const auto *use{detailsIf<UseDetails>()}; return use && use->symbol() == x.symbol(); }, - [&](const HostAssocDetails &) { - return this->has<HostAssocDetails>(); - }, + [&](const HostAssocDetails &) { return has<HostAssocDetails>(); }, [&](const UserReductionDetails &) { - return this->has<UserReductionDetails>(); + return has<UserReductionDetails>(); }, [](const auto &) { return false; }, }, @@ -611,7 +615,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Details &details) { sep = ','; } }, - [](const HostAssocDetails &) {}, + [&os](const HostAssocDetails &x) { os << " => " << x.symbol(); }, [&](const ProcBindingDetails &x) { os << " => " << x.symbol().name(); DumpOptional(os, "passName", x.passName()); |
