@@ -854,7 +854,10 @@ static PreparedDummyArgument preparePresentUserCallActualArgument(
854
854
const PreparedActualArgument &preparedActual, mlir::Type dummyType,
855
855
const Fortran::lower::CallerInterface::PassedEntity &arg,
856
856
const Fortran::lower::SomeExpr &expr,
857
- Fortran::evaluate::FoldingContext &foldingContext) {
857
+ Fortran::lower::AbstractConverter &converter) {
858
+
859
+ Fortran::evaluate::FoldingContext &foldingContext =
860
+ converter.getFoldingContext ();
858
861
859
862
// Step 1: get the actual argument, which includes addressing the
860
863
// element if this is an array in an elemental call.
@@ -931,8 +934,9 @@ static PreparedDummyArgument preparePresentUserCallActualArgument(
931
934
if (mustSetDynamicTypeToDummyType)
932
935
TODO (loc, " passing polymorphic array expression to non polymorphic "
933
936
" contiguous dummy" );
937
+ mlir::Type storageType = converter.genType (expr);
934
938
hlfir::AssociateOp associate = hlfir::genAssociateExpr (
935
- loc, builder, entity, dummyType , " adapt.valuebyref" );
939
+ loc, builder, entity, storageType , " adapt.valuebyref" );
936
940
entity = hlfir::Entity{associate.getBase ()};
937
941
preparedDummy.setExprAssociateCleanUp (associate.getFirBase (),
938
942
associate.getMustFreeStrorageFlag ());
@@ -983,10 +987,10 @@ static PreparedDummyArgument prepareUserCallActualArgument(
983
987
const PreparedActualArgument &preparedActual, mlir::Type dummyType,
984
988
const Fortran::lower::CallerInterface::PassedEntity &arg,
985
989
const Fortran::lower::SomeExpr &expr,
986
- Fortran::evaluate::FoldingContext &foldingContext ) {
990
+ Fortran::lower::AbstractConverter &converter ) {
987
991
if (!preparedActual.handleDynamicOptional ())
988
992
return preparePresentUserCallActualArgument (
989
- loc, builder, preparedActual, dummyType, arg, expr, foldingContext );
993
+ loc, builder, preparedActual, dummyType, arg, expr, converter );
990
994
991
995
// Conditional dummy argument preparation. The actual may be absent
992
996
// at runtime, causing any addressing, copy, and packaging to have
@@ -1007,8 +1011,8 @@ static PreparedDummyArgument prepareUserCallActualArgument(
1007
1011
mlir::Block *preparationBlock = &badIfOp.getThenRegion ().front ();
1008
1012
builder.setInsertionPointToStart (preparationBlock);
1009
1013
PreparedDummyArgument unconditionalDummy =
1010
- preparePresentUserCallActualArgument (
1011
- loc, builder, preparedActual, dummyType, arg, expr, foldingContext );
1014
+ preparePresentUserCallActualArgument (loc, builder, preparedActual,
1015
+ dummyType, arg, expr, converter );
1012
1016
builder.restoreInsertionPoint (insertPt);
1013
1017
1014
1018
// TODO: when forwarding an optional to an optional of the same kind
@@ -1100,9 +1104,9 @@ genUserCall(PreparedActualArguments &loweredActuals,
1100
1104
case PassBy::Box:
1101
1105
case PassBy::BaseAddress:
1102
1106
case PassBy::BoxChar: {
1103
- PreparedDummyArgument preparedDummy = prepareUserCallActualArgument (
1104
- loc, builder, *preparedActual, argTy, arg, *expr ,
1105
- callContext.converter . getFoldingContext () );
1107
+ PreparedDummyArgument preparedDummy =
1108
+ prepareUserCallActualArgument ( loc, builder, *preparedActual, argTy,
1109
+ arg, *expr, callContext.converter );
1106
1110
if (preparedDummy.maybeCleanUp .has_value ())
1107
1111
callCleanUps.emplace_back (std::move (*preparedDummy.maybeCleanUp ));
1108
1112
caller.placeInput (arg, preparedDummy.dummy );
0 commit comments