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>, i32, ui32) -> !hlfir.expr 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>>>, i32, !fir.box>>) -> !hlfir.expr?> +end subroutine eoshift15