[flang-commits] [flang] [flang] Fix proc ptr default initializers in structure constructors (PR #178897)

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Fri Jan 30 06:26:37 PST 2026


https://github.com/klausler created https://github.com/llvm/llvm-project/pull/178897

The default initializers for procedure pointer components are not being used for unspecificed components in structure constructors.

Fixes https://github.com/llvm/llvm-project/issues/178813.

>From ba56f7601b3d5291f750daeb0d6d25c2e69565e6 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 30 Jan 2026 06:23:04 -0800
Subject: [PATCH] [flang] Fix proc ptr default initializers in structure
 constructors

The default initializers for procedure pointer components are
not being used for unspecificed components in structure constructors.

Fixes https://github.com/llvm/llvm-project/issues/178813.
---
 flang/lib/Semantics/expression.cpp | 28 ++++++++++++++--------------
 flang/test/Semantics/bug178813.f90 |  8 ++++++++
 2 files changed, 22 insertions(+), 14 deletions(-)
 create mode 100644 flang/test/Semantics/bug178813.f90

diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp
index 725188c623868..7735ab728b2a8 100644
--- a/flang/lib/Semantics/expression.cpp
+++ b/flang/lib/Semantics/expression.cpp
@@ -2419,22 +2419,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