diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp --- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp +++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp @@ -344,6 +344,13 @@ return create(loc, toTy, val, mlir::Value{}, /*slice=*/mlir::Value{}); + if (fir::unwrapRefType(fromTy).isa() && + fir::isPolymorphicType(toTy)) { + mlir::Value empty; + mlir::ValueRange emptyRange; + return create(loc, toTy, val, empty, empty, emptyRange); + } + return createConvert(loc, toTy, val); } diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90 --- a/flang/test/Lower/polymorphic.f90 +++ b/flang/test/Lower/polymorphic.f90 @@ -543,4 +543,19 @@ ! CHECK: %{{.*}} = fir.call @_FortranAioOutputDescriptor(%{{.*}}, %[[BOX_NONE]]) fastmath : (!fir.ref, !fir.box) -> i1 ! CHECK: fir.freemem %[[TMP]] : !fir.heap> + subroutine pass_class(p) + class(p1) :: p + end subroutine + end module + +program test + use polymorphic_test + type(p1) :: a = p1(1,2) + call pass_class(a) +end program + +! CHECK-LABEL: func.func @_QQmain() { +! CHECK: %[[ADDR:.*]] = fir.address_of(@_QFEa) : !fir.ref> +! CHECK: %[[CLASS:.*]] = fir.embox %[[ADDR]] : (!fir.ref>) -> !fir.class> +! CHECK: fir.call @_QMpolymorphic_testPpass_class(%[[CLASS]]) {{.*}} : (!fir.class>) -> ()