[flang-commits] [flang] 2d5b850 - [flang] Use IMPLICIT from scope of external function reference
peter klausler via flang-commits
flang-commits at lists.llvm.org
Wed Nov 11 12:12:35 PST 2020
Author: peter klausler
Date: 2020-11-11T12:12:24-08:00
New Revision: 2d5b850751789531d9c47e1ccc18f1ac8f9bac7a
URL: https://github.com/llvm/llvm-project/commit/2d5b850751789531d9c47e1ccc18f1ac8f9bac7a
DIFF: https://github.com/llvm/llvm-project/commit/2d5b850751789531d9c47e1ccc18f1ac8f9bac7a.diff
LOG: [flang] Use IMPLICIT from scope of external function reference
Implicitly typed references to external functions are applying
the IMPLICIT typing rules of the global scope in which their
symbols were created, not the IMPLICIT typing rules in force in
the scope from which they were referenced.
Differential revision: https://reviews.llvm.org/D91214
Added:
Modified:
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 5f17aabac754..f2b88ba8117f 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -594,7 +594,7 @@ class ScopeHandler : public ImplicitRulesVisitor {
protected:
// Apply the implicit type rules to this symbol.
void ApplyImplicitRules(Symbol &);
- const DeclTypeSpec *GetImplicitType(Symbol &);
+ const DeclTypeSpec *GetImplicitType(Symbol &, const Scope &);
bool ConvertToObjectEntity(Symbol &);
bool ConvertToProcEntity(Symbol &);
@@ -2111,7 +2111,12 @@ static bool NeedsType(const Symbol &symbol) {
void ScopeHandler::ApplyImplicitRules(Symbol &symbol) {
if (NeedsType(symbol)) {
- if (const DeclTypeSpec * type{GetImplicitType(symbol)}) {
+ const Scope *scope{&symbol.owner()};
+ if (scope->IsGlobal()) {
+ scope = &currScope();
+ }
+ if (const DeclTypeSpec *
+ type{GetImplicitType(symbol, GetInclusiveScope(*scope))}) {
symbol.set(Symbol::Flag::Implicit);
symbol.SetType(*type);
return;
@@ -2137,9 +2142,9 @@ void ScopeHandler::ApplyImplicitRules(Symbol &symbol) {
}
}
-const DeclTypeSpec *ScopeHandler::GetImplicitType(Symbol &symbol) {
- const auto *type{implicitRulesMap_->at(&GetInclusiveScope(symbol.owner()))
- .GetType(symbol.name())};
+const DeclTypeSpec *ScopeHandler::GetImplicitType(
+ Symbol &symbol, const Scope &scope) {
+ const auto *type{implicitRulesMap_->at(&scope).GetType(symbol.name())};
if (type) {
if (const DerivedTypeSpec * derived{type->AsDerived()}) {
// Resolve any forward-referenced derived type; a quick no-op else.
More information about the flang-commits
mailing list