-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[flang] Allow polymorphic type mismatch for hlfir.eoshift. #158718
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
When the ARRAY has polymorphic type, its element type may not match the element type of BOUNDARY. Fixes llvm#158382.
@llvm/pr-subscribers-flang-fir-hlfir Author: Slava Zakharin (vzakhari) ChangesWhen the ARRAY has polymorphic type, its element type may not match Fixes #158382. Full diff: https://github.com/llvm/llvm-project/pull/158718.diff 2 Files Affected:
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
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM (but please wait for Jean to review :) )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
All regressions are fixed.
Thanks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
When the ARRAY has polymorphic type, its element type may not match
the element type of BOUNDARY.
Fixes #158382.