diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp --- a/flang/lib/Lower/ConvertExpr.cpp +++ b/flang/lib/Lower/ConvertExpr.cpp @@ -1830,7 +1830,7 @@ return builder.create(loc, boxProcTy, fir::getBase(exv)); } - mlir::Value box = builder.createBox(loc, exv); + mlir::Value box = builder.createBox(loc, exv, exv.isPolymorphic()); return fir::BoxValue( box, fir::factory::getNonDefaultLowerBounds(builder, loc, exv), fir::factory::getNonDeferredLenParams(exv)); diff --git a/flang/test/Lower/polymorphic-temp.f90 b/flang/test/Lower/polymorphic-temp.f90 --- a/flang/test/Lower/polymorphic-temp.f90 +++ b/flang/test/Lower/polymorphic-temp.f90 @@ -18,14 +18,20 @@ subroutine test_temp_from_intrinsic_spread() class(*), pointer :: p + class(*), pointer :: pa(:) allocate(p2::p) + allocate(p2::pa(10)) call pass_unlimited_poly_1d(spread(p, dim=1, ncopies=2)) + call pass_unlimited_poly_1d(spread(pa(1), dim=1, ncopies=2)) + end subroutine ! CHECK-LABEL: func.func @_QMpoly_tmpPtest_temp_from_intrinsic_spread() { -! CHECK: %[[TEMP_RES:.*]] = fir.alloca !fir.class>> +! CHECK: %[[TEMP_RES1:.*]] = fir.alloca !fir.class>> +! CHECK: %[[TEMP_RES0:.*]] = fir.alloca !fir.class>> ! CHECK: %[[P:.*]] = fir.alloca !fir.class> {bindc_name = "p", uniq_name = "_QMpoly_tmpFtest_temp_from_intrinsic_spreadEp"} +! CHECK: %[[PA:.*]] = fir.alloca !fir.class>> {bindc_name = "pa", uniq_name = "_QMpoly_tmpFtest_temp_from_intrinsic_spreadEpa"} ! CHECK: fir.call @_FortranAPointerNullifyDerived ! CHECK: fir.call @_FortranAPointerAllocate ! CHECK: %[[LOAD_P:.*]] = fir.load %[[P]] : !fir.ref>> @@ -36,16 +42,22 @@ ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C0]] : (index) -> !fir.shape<1> ! Make sure the fir.embox contains the source_box pointing to the polymoprhic entity ! CHECK: %[[BOX_RES:.*]] = fir.embox %[[ZERO]](%[[SHAPE]]) source_box %[[LOAD_P]] : (!fir.heap>, !fir.shape<1>, !fir.class>) -> !fir.class>> -! CHECK: fir.store %[[BOX_RES]] to %[[TEMP_RES]] : !fir.ref>>> -! CHECK: %[[RES_BOX_NONE:.*]] = fir.convert %[[TEMP_RES]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: fir.store %[[BOX_RES]] to %[[TEMP_RES0]] : !fir.ref>>> +! CHECK: %[[RES_BOX_NONE:.*]] = fir.convert %[[TEMP_RES0]] : (!fir.ref>>>) -> !fir.ref> ! CHECK: %[[P_BOX_NONE:.*]] = fir.convert %[[LOAD_P]] : (!fir.class>) -> !fir.box ! CHECK: %[[C2_I64:.*]] = fir.convert %[[C2]] : (i32) -> i64 ! CHECK: %{{.*}} = fir.call @_FortranASpread(%[[RES_BOX_NONE]], %[[P_BOX_NONE]], %[[C1]], %[[C2_I64]], %{{.*}}, %{{.*}}) fastmath : (!fir.ref>, !fir.box, i32, i64, !fir.ref, i32) -> none -! CHECK: %[[LOAD_RES:.*]] = fir.load %[[TEMP_RES]] : !fir.ref>>> +! CHECK: %[[LOAD_RES:.*]] = fir.load %[[TEMP_RES0]] : !fir.ref>>> ! CHECK: %[[RES_ADDR:.*]] = fir.box_addr %[[LOAD_RES]] : (!fir.class>>) -> !fir.heap> ! CHECK: %[[REBOX:.*]] = fir.rebox %[[LOAD_RES]] : (!fir.class>>) -> !fir.class> ! CHECK: fir.call @_QMpoly_tmpPpass_unlimited_poly_1d(%[[REBOX]]) {{.*}} : (!fir.class>) -> () ! CHECK: fir.freemem %[[RES_ADDR]] : !fir.heap> +! CHECK: %[[LOAD_PA:.*]] = fir.load %[[PA]] : !fir.ref>>> +! CHECK: %[[COORD_PA_1:.*]] = fir.coordinate_of %[[LOAD_PA]], %{{.*}} : (!fir.class>>, i64) -> !fir.ref +! CHECK: %[[EMBOX_PA_1:.*]] = fir.embox %[[COORD_PA_1]] source_box %[[LOAD_PA]] : (!fir.ref, !fir.class>>) -> !fir.class +! CHECK: %[[RES1_BOX_NONE:.*]] = fir.convert %[[TEMP_RES1]] : (!fir.ref>>>) -> !fir.ref> +! CHECK: %[[PA1_BOX_NONE:.*]] = fir.convert %[[EMBOX_PA_1]] : (!fir.class) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranASpread(%[[RES1_BOX_NONE]], %[[PA1_BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref>, !fir.box, i32, i64, !fir.ref, i32) -> none subroutine test_temp_from_intrinsic_reshape(i) class(*), allocatable :: a(:,:)