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 @@ -504,7 +504,8 @@ mlir::ValueRange emptyRange; mlir::Value s = createShape(loc, exv); return create(loc, boxTy, itemAddr, s, /*slice=*/empty, - /*typeparams=*/emptyRange, box.getTdesc()); + /*typeparams=*/emptyRange, + isPolymorphic ? box.getTdesc() : tdesc); }, [&](const fir::CharArrayBoxValue &box) -> mlir::Value { mlir::Value s = createShape(loc, exv); @@ -532,7 +533,8 @@ mlir::Value empty; mlir::ValueRange emptyRange; return create(loc, boxTy, itemAddr, empty, empty, - emptyRange, p.getTdesc()); + emptyRange, + isPolymorphic ? p.getTdesc() : tdesc); }, [&](const auto &) -> mlir::Value { mlir::Value empty; 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 @@ -90,4 +90,13 @@ ! CHECK: } ! CHECK: fir.array_merge_store %{{.*}}, %{{.*}} to %{{.*}}[%{{.*}}] : !fir.array, !fir.array, !fir.class>>>, !fir.slice<1> + subroutine polymorphic_to_nonpolymorphic(p) + class(p1), pointer :: p(:) + type(p1), allocatable, target :: t(:) + t = p + end subroutine + +! CHECK-LABEL: func.func @_QMpolymorphic_testPpolymorphic_to_nonpolymorphic +! Just checking that FIR is generated without error. + end module