diff options
-rw-r--r-- | flang/lib/Lower/ConvertCall.cpp | 8 | ||||
-rw-r--r-- | flang/test/Lower/Intrinsics/associated.f90 | 23 |
2 files changed, 28 insertions, 3 deletions
diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp index 7ec719a..4dc0b46 100644 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -1790,7 +1790,8 @@ static std::optional<hlfir::EntityWithAttributes> genCustomIntrinsicRefCore( if (loadArg && fir::conformsWithPassByRef(actual.getType())) { return hlfir::loadTrivialScalar(loc, builder, actual); } - return actual; + return Fortran::lower::translateToExtendedValue(loc, builder, actual, + callContext.stmtCtx); }; // helper to get the isPresent flag for a particular prepared argument auto isPresent = [&](std::size_t i) -> std::optional<mlir::Value> { @@ -2436,8 +2437,9 @@ genCustomIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic *intrinsic, getActualFortranElementType()); break; case fir::LowerIntrinsicArgAs::Inquired: - TODO(loc, "Inquired non-optional arg to intrinsic with custom handling"); - return; + exv = Fortran::lower::translateToExtendedValue(loc, builder, actual, + stmtCtx); + break; } if (!exv) llvm_unreachable("bad switch"); diff --git a/flang/test/Lower/Intrinsics/associated.f90 b/flang/test/Lower/Intrinsics/associated.f90 index f09d054..9308ec7 100644 --- a/flang/test/Lower/Intrinsics/associated.f90 +++ b/flang/test/Lower/Intrinsics/associated.f90 @@ -151,3 +151,26 @@ subroutine associated_test(scalar, array) ! CHECK: fir.call @_FortranAPointerIsAssociatedWith(%[[VAL_9]], %[[VAL_10]]) {{.*}}: (!fir.box<none>, !fir.box<none>) -> i1 print *, associated(p, allocatable_ziel) end subroutine + +subroutine test_optional_argument(a, b) + integer, pointer :: a + integer, optional, pointer :: b + logical :: assoc + + assoc = associated(a, b) +end subroutine + +! CHECK-LABEL: func.func @_QPtest_optional_argument( +! CHECK-SAME: %[[A:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "a"}, %[[B:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>> {fir.bindc_name = "b", fir.optional}) { +! CHECK: %[[IS_PRESENT_B:.*]] = fir.is_present %[[B]] : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> i1 +! CHECK: %[[BOX_B:.*]] = fir.if %[[IS_PRESENT_B]] -> (!fir.box<!fir.ptr<i32>>) { +! CHECK: %[[LOADED_B:.*]] = fir.load %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>> +! CHECK: fir.result %[[LOADED_B]] : !fir.box<!fir.ptr<i32>> +! CHECK: } else { +! CHECK: %[[ABSENT_B:.*]] = fir.absent !fir.box<!fir.ptr<i32>> +! CHECK: fir.result %[[ABSENT_B]] : !fir.box<!fir.ptr<i32>> +! CHECK: } +! CHECK: %[[LOADED_A:.*]] = fir.load %[[A]] : !fir.ref<!fir.box<!fir.ptr<i32>>> +! CHECK: %[[BOX_NONE_A:.*]] = fir.convert %[[LOADED_A]] : (!fir.box<!fir.ptr<i32>>) -> !fir.box<none> +! CHECK: %[[BOX_NONE_B:.*]] = fir.convert %[[BOX_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.box<none> +! CHECK: %{{.*}} fir.call @_FortranAPointerIsAssociatedWith(%[[BOX_NONE_A]], %[[BOX_NONE_B]]) fastmath<contract> : (!fir.box<none>, !fir.box<none>) -> i1 |