[flang-commits] [flang] [flang] Make NULL() initializers explicit for allocatables in DATA co… (PR #69753)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Oct 20 12:20:45 PDT 2023
https://github.com/klausler updated https://github.com/llvm/llvm-project/pull/69753
>From 2a3978b7b4e87e5364f17a0f5f50a9f8ac641df1 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 20 Oct 2023 12:06:20 -0700
Subject: [PATCH] [flang] Make NULL() initializers explicit for allocatables in
DATA conversion
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.
---
flang/lib/Evaluate/initial-image.cpp | 9 ++++++++-
flang/test/Semantics/data19.f90 | 18 ++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
create mode 100644 flang/test/Semantics/data19.f90
diff --git a/flang/lib/Evaluate/initial-image.cpp b/flang/lib/Evaluate/initial-image.cpp
index a0fe4ec95da94d7..ab5f8c229cbe012 100644
--- a/flang/lib/Evaluate/initial-image.cpp
+++ b/flang/lib/Evaluate/initial-image.cpp
@@ -113,9 +113,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
new file mode 100644
index 000000000000000..dea2350adbdaec6
--- /dev/null
+++ b/flang/test/Semantics/data19.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