[flang-commits] [flang] [FLANG] Solved an issue with usage of unlimited polymorphic in where construct (PR #147001)
via flang-commits
flang-commits at lists.llvm.org
Thu Jul 3 22:33:10 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Ebin-McW (EbinJose2002)
<details>
<summary>Changes</summary>
Fixes #<!-- -->133669
---
Full diff: https://github.com/llvm/llvm-project/pull/147001.diff
2 Files Affected:
- (modified) flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp (+7)
- (added) flang/test/Lower/polymorphic-array.f90 (+27)
``````````diff
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
index 33f687db08f9a..2196f6a9dde0c 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp
@@ -141,6 +141,13 @@ class AssignOpConversion : public mlir::OpRewritePattern<hlfir::AssignOp> {
fir::runtime::genAssignTemporary(builder, loc, toMutableBox, from);
else
fir::runtime::genAssign(builder, loc, toMutableBox, from);
+ } else if (lhs.isPolymorphic() && rhs.isPolymorphic()) {
+ if (fir::isNoneOrSeqNone(fir::getElementTypeOf(lhsExv)) &&
+ fir::isNoneOrSeqNone(fir::getElementTypeOf(rhsExv))) {
+ mlir::Value to = fir::getBase(builder.createBox(loc, lhsExv));
+ mlir::Value from = fir::getBase(builder.createBox(loc, rhsExv));
+ fir::runtime::genAssignPolymorphic(builder, loc, to, from);
+ }
} else {
// TODO: use the type specification to see if IsFinalizable is set,
// or propagate IsFinalizable attribute from lowering.
diff --git a/flang/test/Lower/polymorphic-array.f90 b/flang/test/Lower/polymorphic-array.f90
new file mode 100644
index 0000000000000..6e6d9ae7187e5
--- /dev/null
+++ b/flang/test/Lower/polymorphic-array.f90
@@ -0,0 +1,27 @@
+! RUN: bbc -emit-fir %s -o - | FileCheck %s
+
+! Checks that no fir store is present with fir.class<none> as the first operand.
+! Regression test for bug: FIR lowering failure on polymorphic assignment.
+
+! CHECK-NOT: fir.store{{.*}}!fir.class<none>
+module m1
+ type x
+ end type x
+ logical,parameter::t=.true.,f=.false.
+ logical::mask(3)=[t,f,t]
+end module m1
+
+subroutine s1
+ use m1
+ class(*),allocatable::v(:),u(:)
+ allocate(x::v(3))
+ allocate(x::u(3))
+ where(mask)
+ u=v
+ end where
+end subroutine s1
+
+program main
+ call s1
+ print *,'pass'
+end program main
``````````
</details>
https://github.com/llvm/llvm-project/pull/147001
More information about the flang-commits
mailing list