[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