diff --git a/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIROrderedAssignments.cpp b/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIROrderedAssignments.cpp index c4aee7d39e4a3..84101353a740a 100644 --- a/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIROrderedAssignments.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIROrderedAssignments.cpp @@ -421,6 +421,14 @@ convertToMoldType(mlir::Location loc, fir::FirOpBuilder &builder, } // Variable to Variable mismatch (e.g., fir.heap vs fir.ref), or value // to Value mismatch (e.g. i1 vs fir.logical<4>). + if (mlir::isa(mold.getType()) && + !mlir::isa(input.getType())) { + // An entity may have have been saved without descriptor while the original + // value had a descriptor (e.g., it was not contiguous). + auto emboxed = hlfir::convertToBox(loc, builder, input, mold.getType()); + assert(!emboxed.second && "temp should already be in memory"); + input = hlfir::Entity{fir::getBase(emboxed.first)}; + } return hlfir::Entity{builder.createConvert(loc, mold.getType(), input)}; } diff --git a/flang/test/HLFIR/order_assignments/user-defined-assignment.fir b/flang/test/HLFIR/order_assignments/user-defined-assignment.fir index 521288d0cfa12..61836b8bcc57e 100644 --- a/flang/test/HLFIR/order_assignments/user-defined-assignment.fir +++ b/flang/test/HLFIR/order_assignments/user-defined-assignment.fir @@ -180,3 +180,26 @@ func.func @test_scalar_forall_overlap(%i: !fir.ref>) { // CHECK: fir.call @logical_value_to_numeric(%[[VAL_32]], %[[VAL_33]]) : (!fir.ref, !fir.logical<4>) -> () // CHECK: } // CHECK: fir.freemem %[[VAL_15]] : !fir.heap> + +func.func @test_saved_scalar_box(%arg0: !fir.box>, %arg1: !fir.class>) { + hlfir.region_assign { + hlfir.yield %arg0 : !fir.box> + } to { + hlfir.yield %arg1 : !fir.class> + } user_defined_assign (%arg2: !fir.box>) to (%arg3: !fir.class>) { + fir.call @user_assign_box(%arg3, %arg2) : (!fir.class>, !fir.box>) -> () + } + return +} +func.func private @user_assign_box(!fir.class>, !fir.box>) -> () + +// CHECK-LABEL: func.func @test_saved_scalar_box( +// CHECK-SAME: %[[VAL_0:.*]]: !fir.box>, +// CHECK-SAME: %[[VAL_1:.*]]: !fir.class>) { +// CHECK: %[[VAL_2:.*]] = hlfir.as_expr %[[VAL_0]] : (!fir.box>) -> !hlfir.expr> +// CHECK: %[[VAL_3:.*]]:3 = hlfir.associate %[[VAL_2]] +// CHECK: %[[VAL_4:.*]] = fir.embox %[[VAL_3]]#1 : (!fir.ref>) -> !fir.box> +// CHECK: fir.call @user_assign_box(%[[VAL_1]], %[[VAL_4]]) : (!fir.class>, !fir.box>) -> () +// CHECK: hlfir.end_associate %[[VAL_3]]#1, %[[VAL_3]]#2 : !fir.ref>, i1 +// CHECK: return +// CHECK: }