diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -749,8 +749,8 @@ // Edits an existing symbol created for earlier calls to a subprogram or ENTRY // so that it can be replaced by a later definition. bool HandlePreviousCalls(const parser::Name &, Symbol &, Symbol::Flag); - // Create a subprogram symbol in the current scope and push a new scope. void CheckExtantProc(const parser::Name &, Symbol::Flag); + // Create a subprogram symbol in the current scope and push a new scope. Symbol &PushSubprogramScope(const parser::Name &, Symbol::Flag); Symbol *GetSpecificFromGeneric(const parser::Name &); SubprogramDetails &PostSubprogramStmt(const parser::Name &); @@ -3206,7 +3206,11 @@ void SubprogramVisitor::CheckExtantProc( const parser::Name &name, Symbol::Flag subpFlag) { if (auto *prev{FindSymbol(name)}) { - if (!IsDummy(*prev) && !HandlePreviousCalls(name, *prev, subpFlag)) { + if (IsDummy(*prev)) { + } else if (inInterfaceBlock() && currScope() != prev->owner()) { + // Procedures in an INTERFACE block do not resolve to symbols + // in scopes between the global scope and the current scope. + } else if (!HandlePreviousCalls(name, *prev, subpFlag)) { SayAlreadyDeclared(name, *prev); } }