[flang-commits] [flang] [flang][coarray] Fix error fir.store mismatch memory reference type in genCoBounds #193131 (PR #194870)
Jean-Didier PAILLEUX via flang-commits
flang-commits at lists.llvm.org
Thu Apr 30 05:55:02 PDT 2026
https://github.com/JDPailleux updated https://github.com/llvm/llvm-project/pull/194870
>From 67fcd93c20c1f3a73d3f031e9eef6ec13a71b2a1 Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Wed, 29 Apr 2026 13:58:57 +0200
Subject: [PATCH 1/2] [flang][coarray] Fix error fir.store mismatch memory
reference type in genCoBounds #193131
---
flang/lib/Lower/Allocatable.cpp | 6 ++++--
flang/lib/Lower/MultiImageFortran.cpp | 2 ++
flang/test/Lower/MIF/coarray_allocation.f90 | 10 +++++++++-
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/flang/lib/Lower/Allocatable.cpp b/flang/lib/Lower/Allocatable.cpp
index 5cbfba23cffdf..e01418ca6f98f 100644
--- a/flang/lib/Lower/Allocatable.cpp
+++ b/flang/lib/Lower/Allocatable.cpp
@@ -512,7 +512,8 @@ class AllocateStmtHelper {
if (alloc.hasCoarraySpec()) {
stat = Fortran::lower::genAllocateCoarray(
converter, loc, alloc.getSymbol(), box.getAddr(),
- alloc.getCoarraySpec(), errorManager.errMsgAddr);
+ alloc.getCoarraySpec(), errorManager.errMsgAddr,
+ errorManager.hasStatSpec());
} else if (!isCudaAllocate) {
stat = genRuntimeAllocate(builder, loc, box, errorManager);
setPinnedToFalse();
@@ -659,7 +660,8 @@ class AllocateStmtHelper {
if (alloc.hasCoarraySpec()) {
stat = Fortran::lower::genAllocateCoarray(
converter, loc, alloc.getSymbol(), box.getAddr(),
- alloc.getCoarraySpec(), errorManager.errMsgAddr);
+ alloc.getCoarraySpec(), errorManager.errMsgAddr,
+ errorManager.hasStatSpec());
} else if (Fortran::semantics::HasCUDAAttr(alloc.getSymbol()) ||
sourceIsDevice) {
stat =
diff --git a/flang/lib/Lower/MultiImageFortran.cpp b/flang/lib/Lower/MultiImageFortran.cpp
index b06cb785e872d..519ccf7bee4f1 100644
--- a/flang/lib/Lower/MultiImageFortran.cpp
+++ b/flang/lib/Lower/MultiImageFortran.cpp
@@ -410,6 +410,8 @@ genCoBounds(Fortran::lower::AbstractConverter &converter, mlir::Location loc,
std::get<1>(allocSpec.t)) {
auto expr = Fortran::semantics::GetExpr(*lastCobound);
lb = fir::getBase(converter.genExprValue(loc, expr, stmtCtx));
+ if (lb.getType() != i64Ty)
+ lb = fir::ConvertOp::create(builder, loc, i64Ty, lb);
}
mlir::Value index =
builder.createIntegerConstant(loc, builder.getIndexType(), i);
diff --git a/flang/test/Lower/MIF/coarray_allocation.f90 b/flang/test/Lower/MIF/coarray_allocation.f90
index 64122aa21d582..7b3152de71dbe 100644
--- a/flang/test/Lower/MIF/coarray_allocation.f90
+++ b/flang/test/Lower/MIF/coarray_allocation.f90
@@ -60,4 +60,12 @@ program alloc_test
! CHECK: mif.dealloc_coarray %[[VAL_14]] stat %[[STAT:.*]] errmsg %[[ERRMSG:.*]] : (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<i32>, !fir.box<none>) -> ()
deallocate(d%z%co)
-end program
+end program
+
+! CHECK-LABEL: func.func @_QPtest_alloc2()
+subroutine test_alloc2
+ class(*),allocatable :: a[:]
+
+ ! CHECK: mif.alloc_coarray %[[VAL_1:.*]]#0 lcobounds %[[LCOBOUNDS:.*]] ucobounds %[[UCOBOUNDS:.*]] errmsg %[[ERRMSG:.*]] {uniq_name = "_QFtest_alloc2Ea"} : (!fir.ref<!fir.class<!fir.heap<none>>>, !fir.box<!fir.array<1xi64>>, !fir.box<!fir.array<0xi64>>, !fir.box<none>) -> ()
+ allocate(real::a[1:*])
+end subroutine
>From 4f935218949bfe73dac1c8c260e39afccfd32b11 Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Thu, 30 Apr 2026 14:54:36 +0200
Subject: [PATCH 2/2] Adding alloc with STAT=
---
flang/test/Lower/MIF/coarray_allocation.f90 | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/flang/test/Lower/MIF/coarray_allocation.f90 b/flang/test/Lower/MIF/coarray_allocation.f90
index 7b3152de71dbe..f33229a63165b 100644
--- a/flang/test/Lower/MIF/coarray_allocation.f90
+++ b/flang/test/Lower/MIF/coarray_allocation.f90
@@ -65,7 +65,12 @@ program alloc_test
! CHECK-LABEL: func.func @_QPtest_alloc2()
subroutine test_alloc2
class(*),allocatable :: a[:]
+ class(*),allocatable :: b[:]
+ integer :: ierr
! CHECK: mif.alloc_coarray %[[VAL_1:.*]]#0 lcobounds %[[LCOBOUNDS:.*]] ucobounds %[[UCOBOUNDS:.*]] errmsg %[[ERRMSG:.*]] {uniq_name = "_QFtest_alloc2Ea"} : (!fir.ref<!fir.class<!fir.heap<none>>>, !fir.box<!fir.array<1xi64>>, !fir.box<!fir.array<0xi64>>, !fir.box<none>) -> ()
allocate(real::a[1:*])
+
+ ! CHECK: mif.alloc_coarray %[[VAL_2:.*]]#0 lcobounds %[[LCOBOUNDS2:.*]] ucobounds %[[UCOBOUNDS2:.*]] stat %[[STAT:.*]] errmsg %[[ERRMSG2:.*]] {uniq_name = "_QFtest_alloc2Eb"} : (!fir.ref<!fir.class<!fir.heap<none>>>, !fir.box<!fir.array<1xi64>>, !fir.box<!fir.array<0xi64>>, !fir.ref<i32>, !fir.box<none>) -> ()
+ allocate(real::b[2:*], STAT=ierr)
end subroutine
More information about the flang-commits
mailing list