[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