summaryrefslogtreecommitdiff
path: root/flang/lib/Semantics/symbol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Semantics/symbol.cpp')
-rw-r--r--flang/lib/Semantics/symbol.cpp18
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());