[flang-commits] [flang] 6577aa5 - [flang] Fix proc ptr default initializers in structure constructors (#178897)
via flang-commits
flang-commits at lists.llvm.org
Sat Jan 31 14:48:36 PST 2026
Author: Peter Klausler
Date: 2026-01-31T14:48:32-08:00
New Revision: 6577aa54e805745c3cd8e695d0e7bc732f83e533
URL: https://github.com/llvm/llvm-project/commit/6577aa54e805745c3cd8e695d0e7bc732f83e533
DIFF: https://github.com/llvm/llvm-project/commit/6577aa54e805745c3cd8e695d0e7bc732f83e533.diff
LOG: [flang] Fix proc ptr default initializers in structure constructors (#178897)
The default initializers for procedure pointer components are not being
used for unspecified components in structure constructors.
Fixes https://github.com/llvm/llvm-project/issues/178813.
Added:
flang/test/Semantics/bug178813.f90
Modified:
flang/lib/Semantics/expression.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index 5386c15b5e042..fef6b4f0470dd 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -2421,22 +2421,22 @@ MaybeExpr ExpressionAnalyzer::CheckStructureConstructor(
for (const Symbol &symbol : components) {
if (!symbol.test(Symbol::Flag::ParentComp) &&
unavailable.find(symbol.name()) == unavailable.cend()) {
- if (IsAllocatable(symbol)) {
- // Set all remaining allocatables to explicit NULL().
+ if (const auto *object{
+ symbol.detailsIf<semantics::ObjectEntityDetails>()};
+ object && object->init()) {
+ result.Add(symbol, common::Clone(*object->init()));
+ } else if (const auto *proc{
+ symbol.detailsIf<semantics::ProcEntityDetails>()};
+ proc && proc->init() && *proc->init()) {
+ result.Add(symbol, Expr<SomeType>{ProcedureDesignator{**proc->init()}});
+ } else if (IsAllocatableOrPointer(symbol)) {
result.Add(symbol, Expr<SomeType>{NullPointer{}});
} else {
- const auto *object{symbol.detailsIf<semantics::ObjectEntityDetails>()};
- if (object && object->init()) {
- result.Add(symbol, common::Clone(*object->init()));
- } else if (IsPointer(symbol)) {
- result.Add(symbol, Expr<SomeType>{NullPointer{}});
- } else if (object) { // C799
- AttachDeclaration(
- Say(typeName,
- "Structure constructor lacks a value for component '%s'"_err_en_US,
- symbol.name()),
- symbol);
- }
+ AttachDeclaration(
+ Say(typeName,
+ "Structure constructor lacks a value for component '%s'"_err_en_US,
+ symbol.name()),
+ symbol);
}
}
}
diff --git a/flang/test/Semantics/bug178813.f90 b/flang/test/Semantics/bug178813.f90
new file mode 100644
index 0000000000000..0ada9055702ef
--- /dev/null
+++ b/flang/test/Semantics/bug178813.f90
@@ -0,0 +1,8 @@
+!RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
+external s
+type t
+ procedure(), nopass, pointer :: p => s
+end type
+!CHECK: TYPE(t) :: x = t(p=s)
+type(t) :: x = t()
+end
More information about the flang-commits
mailing list