[flang-commits] [flang] [flang] accept character type in fir::changeTypeShape (PR #131892)

via flang-commits flang-commits at lists.llvm.org
Tue Mar 18 12:21:59 PDT 2025


https://github.com/jeanPerier created https://github.com/llvm/llvm-project/pull/131892

There is no reason for character element type to be forbidden in this helper.
The assert was triggering in character pointer assignment in FORALL after #130772 added a usage of this helper.

>From e480a5e1ebd7c86f3dc554a4f32fe79e621e2cb3 Mon Sep 17 00:00:00 2001
From: Jean Perier <jperier at nvidia.com>
Date: Tue, 18 Mar 2025 12:09:46 -0700
Subject: [PATCH] [flang] accept character type in fir::changeTypeShape

---
 flang/lib/Optimizer/Dialect/FIRType.cpp           |  3 ++-
 .../forall-pointer-assignment-scheduling.f90      | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index dc0bee9b060c9..f3f969ba401e5 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -1326,7 +1326,8 @@ changeTypeShape(mlir::Type type,
       })
       .Default([&](mlir::Type t) -> mlir::Type {
         assert((fir::isa_trivial(t) || llvm::isa<fir::RecordType>(t) ||
-                llvm::isa<mlir::NoneType>(t)) &&
+                llvm::isa<mlir::NoneType>(t) ||
+                llvm::isa<fir::CharacterType>(t)) &&
                "unexpected FIR leaf type");
         if (newShape)
           return fir::SequenceType::get(*newShape, t);
diff --git a/flang/test/HLFIR/order_assignments/forall-pointer-assignment-scheduling.f90 b/flang/test/HLFIR/order_assignments/forall-pointer-assignment-scheduling.f90
index cb5bff1020b3a..fc2ef5248e410 100644
--- a/flang/test/HLFIR/order_assignments/forall-pointer-assignment-scheduling.f90
+++ b/flang/test/HLFIR/order_assignments/forall-pointer-assignment-scheduling.f90
@@ -85,6 +85,21 @@ subroutine test_need_to_save_lhs_and_rhs(n, a)
 ! CHECK-NEXT: conflict: R/W
 ! CHECK-NEXT: run 1 save    : forall/region_assign1/lhs
 ! CHECK-NEXT: run 2 evaluate: forall/region_assign1
+
+subroutine test_character_no_conflict(c)
+ type tc
+    character(10), pointer :: p
+ end type
+ character(10), target :: c(10)
+ integer(8) :: i
+ type(tc) a(10)
+ forall(i=1:10)
+   a(i)%p => c(i)
+ end forall
+end subroutine
+! CHECK: ------------ scheduling forall in _QMforall_pointersPtest_character_no_conflict ------------
+! CHECK-NEXT: run 1 evaluate: forall/region_assign1
+
 end module
 
 ! End to end test provided for debugging purpose (not run by lit).



More information about the flang-commits mailing list