diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 865c198424696..29cd107186fb5 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -8108,6 +8108,15 @@ bool ResolveNamesVisitor::Pre(const parser::PointerAssignmentStmt &x) { return false; } } + if (IsProcedurePointer(parser::GetLastName(dataRef).symbol) && + !FindSymbol(*name)) { + // Unknown target of procedure pointer must be an external procedure + Symbol &symbol{MakeSymbol( + context().globalScope(), name->source, Attrs{Attr::EXTERNAL})}; + Resolve(*name, symbol); + ConvertToProcEntity(symbol); + return false; + } } Walk(expr); return false; diff --git a/flang/test/Semantics/symbol31.f90 b/flang/test/Semantics/symbol31.f90 new file mode 100644 index 0000000000000..c8016cf9ec71b --- /dev/null +++ b/flang/test/Semantics/symbol31.f90 @@ -0,0 +1,7 @@ +! RUN: %python %S/test_symbols.py %s %flang_fc1 + !DEF: /MainProgram1/pptr EXTERNAL, POINTER ProcEntity + procedure(), pointer :: pptr + !REF: /MainProgram1/pptr + !DEF: /mustbeexternal EXTERNAL ProcEntity + pptr => mustbeexternal +end program