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 @@ -1838,6 +1838,15 @@ for (const auto &arg : llvm::enumerate(procRef.arguments())) { auto *expr = Fortran::evaluate::UnwrapExpr(arg.value()); + + if (!expr && arg.value() && arg.value()->GetAssumedTypeDummy()) { + // Assumed type optional. + const Fortran::evaluate::Symbol *assumedTypeSym = + arg.value()->GetAssumedTypeDummy(); + auto symBox = symMap.lookupSymbol(*assumedTypeSym); + operands.emplace_back(symBox.getAddr()); + continue; + } if (!expr) { // Absent optional. operands.emplace_back(fir::getAbsentIntrinsicArgument()); 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 @@ -39,4 +39,13 @@ ! CHECK: %[[CONV:.*]] = fir.convert %[[BOX_NONE]] : (!fir.box>) -> !fir.box> ! CHECK: fir.call @_QPassumed_r(%[[CONV]]) {{.*}} : (!fir.box>) -> () + subroutine assumed_type_optional_to_intrinsic(a) + type(*), optional :: a(:) + if (present(a)) print*, 'present' + end subroutine + +! CHECK-LABEL: func.func @_QMassumed_type_testPassumed_type_optional_to_intrinsic( +! CHECK-SAME: %[[ARG0:.*]]: !fir.box> {fir.bindc_name = "a", fir.optional}) { +! CHECK: %{{.*}} = fir.is_present %[[ARG0]] : (!fir.box>) -> i1 + end module