[flang-commits] [flang] [flang] Allow polymorphic type mismatch for hlfir.eoshift. (PR #158718)
Slava Zakharin via flang-commits
flang-commits at lists.llvm.org
Mon Sep 15 12:10:13 PDT 2025
https://github.com/vzakhari created https://github.com/llvm/llvm-project/pull/158718
When the ARRAY has polymorphic type, its element type may not match
the element type of BOUNDARY.
Fixes #158382.
>From a182721a603b0b2d4379726d0960d0de1df53c3a Mon Sep 17 00:00:00 2001
From: Slava Zakharin <szakharin at nvidia.com>
Date: Mon, 15 Sep 2025 10:22:30 -0700
Subject: [PATCH] [flang] Allow polymorphic type mismatch for hlfir.eoshift.
When the ARRAY has polymorphic type, its element type may not match
the element type of BOUNDARY.
Fixes #158382.
---
flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp | 15 +++++++++------
flang/test/Lower/HLFIR/eoshift.f90 | 11 +++++++++++
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp
index 1a63b1bea3177..0cc65f939723e 100644
--- a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp
+++ b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp
@@ -1618,12 +1618,15 @@ static llvm::LogicalResult verifyArrayShift(Op op) {
if (mlir::Value boundary = op.getBoundary()) {
mlir::Type boundaryTy =
hlfir::getFortranElementOrSequenceType(boundary.getType());
- if (auto match = areMatchingTypes(
- op, eleTy, hlfir::getFortranElementType(boundaryTy),
- /*allowCharacterLenMismatch=*/!useStrictIntrinsicVerifier);
- match.failed())
- return op.emitOpError(
- "ARRAY and BOUNDARY operands must have the same element type");
+ // In case of polymorphic ARRAY type, the BOUNDARY's element type
+ // may not match the ARRAY's element type.
+ if (!hlfir::isPolymorphicType(array.getType()))
+ if (auto match = areMatchingTypes(
+ op, eleTy, hlfir::getFortranElementType(boundaryTy),
+ /*allowCharacterLenMismatch=*/!useStrictIntrinsicVerifier);
+ match.failed())
+ return op.emitOpError(
+ "ARRAY and BOUNDARY operands must have the same element type");
if (failed(verifyOperandTypeShape(boundaryTy, "BOUNDARY")))
return mlir::failure();
}
diff --git a/flang/test/Lower/HLFIR/eoshift.f90 b/flang/test/Lower/HLFIR/eoshift.f90
index e7fb98c2b0401..8d541779a2569 100644
--- a/flang/test/Lower/HLFIR/eoshift.f90
+++ b/flang/test/Lower/HLFIR/eoshift.f90
@@ -4,6 +4,8 @@
module eoshift_types
type t
end type t
+ type, extends(t) :: t2
+ end type t2
end module eoshift_types
! 1d shift by scalar
@@ -269,3 +271,12 @@ subroutine eoshift14(array)
! CHECK-DAG: %[[VAL_3]] = arith.constant 1 : i32
! CHECK: %[[VAL_5:.*]] = hlfir.eoshift{{.*}}boundary %[[VAL_4]] : (!fir.box<!fir.array<?xui32>>, i32, ui32) -> !hlfir.expr<?xui32>
end subroutine eoshift14
+
+! CHECK-LABEL: func.func @_QPeoshift15(
+subroutine eoshift15(array, boundary)
+ use eoshift_types
+ class(t), allocatable :: array(:,:)
+ type(t) :: boundary(:)
+ array = eoshift(array, shift=1, boundary=boundary)
+! CHECK: hlfir.eoshift %{{.*}} %{{.*}} boundary %{{.*}}#0 : (!fir.class<!fir.heap<!fir.array<?x?x!fir.type<_QMeoshift_typesTt>>>>, i32, !fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>) -> !hlfir.expr<?x?x!fir.type<_QMeoshift_typesTt>?>
+end subroutine eoshift15
More information about the flang-commits
mailing list