[flang-commits] [flang] 4739c88 - [flang] Make NULL() initializers explicit for allocatables in DATA co… (#69753)

via flang-commits flang-commits at lists.llvm.org
Tue Oct 31 10:36:54 PDT 2023


Author: Peter Klausler
Date: 2023-10-31T10:36:50-07:00
New Revision: 4739c883fdc1ddb22b51502dbde177410663dee3

URL: https://github.com/llvm/llvm-project/commit/4739c883fdc1ddb22b51502dbde177410663dee3
DIFF: https://github.com/llvm/llvm-project/commit/4739c883fdc1ddb22b51502dbde177410663dee3.diff

LOG: [flang] Make NULL() initializers explicit for allocatables in DATA co… (#69753)

…nversion

As requested by people working on lowering: when semantics converts the
contents of DATA statements into explicit object initializers, ensure
that structure constructors for derived types contain explicit NULL()
values for their allocatable components.

Added: 
    flang/test/Semantics/data20.f90

Modified: 
    flang/lib/Evaluate/initial-image.cpp
    flang/test/Semantics/data19.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Evaluate/initial-image.cpp b/flang/lib/Evaluate/initial-image.cpp
index 3b0d738c422d4f4..6a712bcfbe1bc1b 100644
--- a/flang/lib/Evaluate/initial-image.cpp
+++ b/flang/lib/Evaluate/initial-image.cpp
@@ -119,9 +119,16 @@ class AsConstantHelper {
             for (std::size_t j{0}; j < elements; ++j, at += stride) {
               if (Result value{image_.AsConstantPointer(at)}) {
                 typedValue[j].emplace(component, std::move(*value));
+              } else {
+                typedValue[j].emplace(component, Expr<SomeType>{NullPointer{}});
               }
             }
-          } else if (!IsAllocatable(component)) {
+          } else if (IsAllocatable(component)) {
+            // Lowering needs an explicit NULL() for allocatables
+            for (std::size_t j{0}; j < elements; ++j, at += stride) {
+              typedValue[j].emplace(component, Expr<SomeType>{NullPointer{}});
+            }
+          } else {
             auto componentType{DynamicType::From(component)};
             CHECK(componentType.has_value());
             auto componentExtents{GetConstantExtents(context_, component)};

diff  --git a/flang/test/Semantics/data19.f90 b/flang/test/Semantics/data19.f90
index 6ed2e2144d401fc..b686ae221dcdbdd 100644
--- a/flang/test/Semantics/data19.f90
+++ b/flang/test/Semantics/data19.f90
@@ -1,6 +1,6 @@
 ! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s
 ! Test truncation/padding in DATA statement.
-
+program main
   character(len=3) :: c1, c2, c3(2), c4(2)
   data c1(1:2), c1(3:3) /'123', '4'/
   data c2(1:2), c2(3:3) /'1', '2'/

diff  --git a/flang/test/Semantics/data20.f90 b/flang/test/Semantics/data20.f90
new file mode 100644
index 000000000000000..dea2350adbdaec6
--- /dev/null
+++ b/flang/test/Semantics/data20.f90
@@ -0,0 +1,18 @@
+! RUN: %flang_fc1 -fdebug-dump-symbols %s 2>&1 | FileCheck %s
+! Verify that allocatable components have explicit NULL() initializers
+! when converted from DATA statements
+!CHECK: x1 (InDataStmt) size=32 offset=0: ObjectEntity type: TYPE(t) init:t(a=NULL(),n=1_4)
+!CHECK: x2 (InDataStmt) size=64 offset=32: ObjectEntity type: TYPE(t) shape: 1_8:2_8 init:[t::t(a=NULL(),n=2_4),t(a=NULL(),n=3_4)]
+!CHECK: x3 (InDataStmt) size=64 offset=96: ObjectEntity type: TYPE(t2) init:t2(b=[t::t(a=NULL(),n=4_4),t(a=NULL(),n=5_4)])
+program main
+  type t
+    real, allocatable :: a
+    integer n
+  end type
+  type t2
+    type(t) b(2)
+  end type
+  type(t) x1, x2(2)
+  type(t2) x3
+  data x1%n/1/, x2(:)%n/2, 3/, x3%b(:)%n/4, 5/
+end


        


More information about the flang-commits mailing list