diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 16af6e0234fe6..84b5765b32250 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -3013,12 +3013,11 @@ struct LoadOpConversion : public FIROpConversion { auto inputBoxStorage = adaptor.getOperands()[0]; mlir::Location loc = load.getLoc(); fir::SequenceType seqTy = fir::unwrapUntilSeqType(boxTy); - mlir::Type eleTy = fir::unwrapPassByRefType(boxTy); - // fir.box of assumed rank and polymorphic entities do not have a storage + // fir.box of assumed rank do not have a storage // size that is know at compile time. The copy needs to be runtime driven // depending on the actual dynamic rank or type. - if (eleTy.isa() || (seqTy && seqTy.hasUnknownShape())) - TODO(loc, "loading polymorphic or assumed rank fir.box"); + if (seqTy && seqTy.hasUnknownShape()) + TODO(loc, "loading or assumed rank fir.box"); mlir::Type boxPtrTy = inputBoxStorage.getType(); auto boxValue = rewriter.create( loc, boxPtrTy.cast().getElementType(), diff --git a/flang/test/Fir/polymorphic.fir b/flang/test/Fir/polymorphic.fir index 58b19829e7ec3..a24652123ab2b 100644 --- a/flang/test/Fir/polymorphic.fir +++ b/flang/test/Fir/polymorphic.fir @@ -159,4 +159,27 @@ func.func @_QQmain() { // CHECK: store { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } %[[LOAD]], ptr %[[DESC]] // CHECK: call void @_QMmod1Psub1(ptr %[[DESC]]) +fir.global @_QMmod2Ep : !fir.class> { + %0 = fir.zero_bits !fir.ptr + %1 = fir.embox %0 : (!fir.ptr) -> !fir.class> + fir.has_value %1 : !fir.class> +} +func.func @_QMmod2Pinitp(%arg0: !fir.ref>> {fir.bindc_name = "target"}) { + %0 = fir.address_of(@_QMmod2Ep) : !fir.ref>> + %1 = fir.load %arg0 : !fir.ref>> + %2 = fir.convert %0 : (!fir.ref>>) -> !fir.ref> + %3 = fir.convert %1 : (!fir.class>) -> !fir.box + %4 = fir.call @_FortranAPointerAssociate(%2, %3) fastmath : (!fir.ref>, !fir.box) -> none + return +} +func.func private @_FortranAPointerAssociate(!fir.ref>, !fir.box) -> none attributes {fir.runtime} + +// CHECK-LABEL: define void @_QMmod2Pinitp( +// CHECK-SAME: ptr %[[ARG0:.*]]) { +// CHECK: %[[ALLOCA_CLASS_NONE:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } +// CHECK: %[[LOAD:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] }, ptr %[[ARG0]] +// CHECK: store { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } %[[LOAD]], ptr %[[ALLOCA_CLASS_NONE]] +// CHECK: %{{.*}} = call {} @_FortranAPointerAssociate(ptr @_QMmod2Ep, ptr %[[ALLOCA_CLASS_NONE]]) +// CHECK: ret void +