diff --git a/flang/lib/Lower/CallInterface.cpp b/flang/lib/Lower/CallInterface.cpp --- a/flang/lib/Lower/CallInterface.cpp +++ b/flang/lib/Lower/CallInterface.cpp @@ -878,7 +878,7 @@ if ((obj.type.attrs() & shapeRequiringBox).any()) // Need to pass shape/coshape info in fir.box. return true; - if (obj.type.type().IsPolymorphic()) + if (obj.type.type().IsPolymorphic() && !obj.type.type().IsAssumedType()) // Need to pass dynamic type info in fir.box. return true; if (const Fortran::semantics::DerivedTypeSpec *derived = @@ -965,14 +965,7 @@ mlir::Type boxType = fir::wrapInClassOrBoxType( type, obj.type.type().IsPolymorphic(), obj.type.type().IsAssumedType()); - if (obj.type.type().IsAssumedType() && isBindC) { - mlir::Type voidPtrType = fir::ReferenceType::get( - mlir::NoneType::get(&interface.converter.getMLIRContext())); - addFirOperand(voidPtrType, nextPassedArgPosition(), Property::BaseAddress, - attrs); - addPassedArg(PassEntityBy::BaseAddress, entity, characteristics); - } else if (obj.attrs.test(Attrs::Allocatable) || - obj.attrs.test(Attrs::Pointer)) { + if (obj.attrs.test(Attrs::Allocatable) || obj.attrs.test(Attrs::Pointer)) { // Pass as fir.ref or fir.ref mlir::Type boxRefType = fir::ReferenceType::get(boxType); addFirOperand(boxRefType, nextPassedArgPosition(), Property::MutableBox, 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 @@ -1844,8 +1844,22 @@ const Fortran::evaluate::Symbol *assumedTypeSym = arg.value()->GetAssumedTypeDummy(); auto symBox = symMap.lookupSymbol(*assumedTypeSym); - operands.emplace_back( - converter.getSymbolExtendedValue(*assumedTypeSym, &symMap)); + ExtValue exv = + converter.getSymbolExtendedValue(*assumedTypeSym, &symMap); + if (argLowering) { + fir::ArgLoweringRule argRules = + fir::lowerIntrinsicArgumentAs(*argLowering, arg.index()); + // Note: usages of TYPE(*) is limited by C710 but C_LOC and + // IS_CONTIGUOUS may require an assumed size TYPE(*) to be passed to + // the intrinsic library utility as a fir.box. + if (argRules.lowerAs == fir::LowerIntrinsicArgAs::Box && + !fir::getBase(exv).getType().isa()) { + operands.emplace_back( + fir::factory::createBoxValue(builder, loc, exv)); + continue; + } + } + operands.emplace_back(std::move(exv)); continue; } if (!expr) { diff --git a/flang/test/Lower/assumed-type.f90 b/flang/test/Lower/assumed-type.f90 --- a/flang/test/Lower/assumed-type.f90 +++ b/flang/test/Lower/assumed-type.f90 @@ -23,8 +23,8 @@ ! CHECK-LABEL: func.func @_QMassumed_type_testPcall_assumed() { ! CHECK: %[[I:.*]] = fir.alloca i32 {bindc_name = "i", fir.target, uniq_name = "_QMassumed_type_testFcall_assumedEi"} -! CHECK: %[[BOX_NONE:.*]] = fir.embox %[[I]] : (!fir.ref) -> !fir.box -! CHECK: fir.call @_QPassumed(%[[BOX_NONE]]) fastmath : (!fir.box) -> () +! CHECK: %[[CONV:.*]] = fir.convert %[[I]] : (!fir.ref) -> !fir.ref +! CHECK: fir.call @_QPassumed(%[[CONV]]) {{.*}}: (!fir.ref) -> () subroutine call_assumed_r() integer, target :: i(10) @@ -32,12 +32,9 @@ end subroutine ! CHECK-LABEL: func.func @_QMassumed_type_testPcall_assumed_r() { -! CHECK: %[[C10:.*]] = arith.constant 10 : index ! CHECK: %[[I:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "i", fir.target, uniq_name = "_QMassumed_type_testFcall_assumed_rEi"} -! CHECK: %[[SHAPE:.*]] = fir.shape %[[C10]] : (index) -> !fir.shape<1> -! CHECK: %[[BOX_NONE:.*]] = fir.embox %[[I]](%[[SHAPE]]) : (!fir.ref>, !fir.shape<1>) -> !fir.box> -! CHECK: %[[CONV:.*]] = fir.convert %[[BOX_NONE]] : (!fir.box>) -> !fir.box> -! CHECK: fir.call @_QPassumed_r(%[[CONV]]) {{.*}} : (!fir.box>) -> () +! CHECK: %[[CONV:.*]] = fir.convert %[[I]] : (!fir.ref>) -> !fir.ref> +! CHECK: fir.call @_QPassumed_r(%[[CONV]]) {{.*}} : (!fir.ref>) -> () subroutine assumed_type_optional_to_intrinsic(a) type(*), optional :: a(:) diff --git a/flang/test/Lower/polymorphic-types.f90 b/flang/test/Lower/polymorphic-types.f90 --- a/flang/test/Lower/polymorphic-types.f90 +++ b/flang/test/Lower/polymorphic-types.f90 @@ -179,6 +179,6 @@ end subroutine assumed_type_dummy_array ! CHECK-LABEL: func.func @assumed_type_dummy_array( - ! CHECK-SAME: %{{.*}}: !fir.ref + ! CHECK-SAME: %{{.*}}: !fir.box> end module