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 @@ -3885,9 +3885,8 @@ Symbol &symbol{DeclareUnknownEntity(name, attrs)}; symbol.ReplaceName(name.source); if (const auto &init{std::get>(x.t)}) { - if (ConvertToObjectEntity(symbol)) { - Initialization(name, *init, false); - } + ConvertToObjectEntity(symbol) || ConvertToProcEntity(symbol); + Initialization(name, *init, false); } else if (attrs.test(Attr::PARAMETER)) { // C882, C883 Say(name, "Missing initialization for parameter '%s'"_err_en_US); } @@ -6684,42 +6683,45 @@ Say(name, "Allocatable object '%s' cannot be initialized"_err_en_US); return; } - if (auto *object{ultimate.detailsIf()}) { - // TODO: check C762 - all bounds and type parameters of component - // are colons or constant expressions if component is initialized - common::visit( - common::visitors{ - [&](const parser::ConstantExpr &expr) { - NonPointerInitialization(name, expr); - }, - [&](const parser::NullInit &null) { - Walk(null); - if (auto nullInit{EvaluateExpr(null)}) { - if (!evaluate::IsNullPointer(*nullInit)) { - Say(name, - "Pointer initializer must be intrinsic NULL()"_err_en_US); // C813 - } else if (IsPointer(ultimate)) { + // TODO: check C762 - all bounds and type parameters of component + // are colons or constant expressions if component is initialized + common::visit( + common::visitors{ + [&](const parser::ConstantExpr &expr) { + NonPointerInitialization(name, expr); + }, + [&](const parser::NullInit &null) { // => NULL() + Walk(null); + if (auto nullInit{EvaluateExpr(null)}) { + if (!evaluate::IsNullPointer(*nullInit)) { + Say(name, + "Pointer initializer must be intrinsic NULL()"_err_en_US); // C813 + } else if (IsPointer(ultimate)) { + if (auto *object{ultimate.detailsIf()}) { object->set_init(std::move(*nullInit)); - } else { - Say(name, - "Non-pointer component '%s' initialized with null pointer"_err_en_US); + } else if (auto *procPtr{ + ultimate.detailsIf()}) { + procPtr->set_init(nullptr); } + } else { + Say(name, + "Non-pointer component '%s' initialized with null pointer"_err_en_US); } - }, - [&](const parser::InitialDataTarget &) { - // Defer analysis to the end of the specification part - // so that forward references and attribute checks like SAVE - // work better. - ultimate.set(Symbol::Flag::InDataStmt); - }, - [&](const std::list> &values) { - // Handled later in data-to-inits conversion - ultimate.set(Symbol::Flag::InDataStmt); - Walk(values); - }, - }, - init.u); - } + } + }, + [&](const parser::InitialDataTarget &) { + // Defer analysis to the end of the specification part + // so that forward references and attribute checks like SAVE + // work better. + ultimate.set(Symbol::Flag::InDataStmt); + }, + [&](const std::list> &values) { + // Handled later in data-to-inits conversion + ultimate.set(Symbol::Flag::InDataStmt); + Walk(values); + }, + }, + init.u); } void DeclarationVisitor::PointerInitialization( diff --git a/flang/test/Semantics/null-init.f90 b/flang/test/Semantics/null-init.f90 --- a/flang/test/Semantics/null-init.f90 +++ b/flang/test/Semantics/null-init.f90 @@ -95,3 +95,8 @@ integer, pointer :: p data p/null(j)/ ! ok end subroutine + +subroutine s13 + integer, external, pointer :: p1 => null() + procedure(), pointer :: p2 => null() +end subroutine