diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -1057,7 +1057,7 @@ /// Lower calls to intrinsic procedures with actual arguments that have been /// pre-lowered but have not yet been prepared according to the interface. -static hlfir::EntityWithAttributes genIntrinsicRefCore( +static std::optional genIntrinsicRefCore( PreparedActualArguments &loweredActuals, const Fortran::evaluate::SpecificIntrinsic &intrinsic, const Fortran::lower::IntrinsicArgumentLoweringRules *argLowering, @@ -1112,6 +1112,8 @@ auto [resultExv, mustBeFreed] = Fortran::lower::genIntrinsicCall( callContext.getBuilder(), loc, intrinsic.name, scalarResultType, operands); + if (!fir::getBase(resultExv)) + return std::nullopt; hlfir::EntityWithAttributes resultEntity = extendedValueToHlfirEntity( loc, builder, resultExv, ".tmp.intrinsic_result"); // Move result into memory into an hlfir.expr since they are immutable from @@ -1371,7 +1373,7 @@ } /// Lower an intrinsic procedure reference. -static hlfir::EntityWithAttributes +static std::optional genIntrinsicRef(const Fortran::evaluate::SpecificIntrinsic &intrinsic, CallContext &callContext) { mlir::Location loc = callContext.loc; @@ -1413,12 +1415,12 @@ .genElementalCall(loweredActuals, /*isImpure=*/!isFunction, callContext) .value(); } - hlfir::EntityWithAttributes result = + std::optional result = genIntrinsicRefCore(loweredActuals, intrinsic, argLowering, callContext); - if (result.getType().isa()) { + if (result && result->getType().isa()) { fir::FirOpBuilder *bldr = &callContext.getBuilder(); callContext.stmtCtx.attachCleanup( - [=]() { bldr->create(loc, result); }); + [=]() { bldr->create(loc, *result); }); } return result; } diff --git a/flang/test/Lower/HLFIR/intrinsic-subroutines.f90 b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/HLFIR/intrinsic-subroutines.f90 @@ -0,0 +1,14 @@ +! Test lowering of intrinsic subroutines to HLFIR what matters here +! is not to test each subroutine, but to check how their +! lowering interfaces with the rest of lowering. +! RUN: bbc -emit-fir -hlfir -o - %s | FileCheck %s + +subroutine test_subroutine(x) + real :: x + call cpu_time(x) +end subroutine +! CHECK-LABEL: func.func @_QPtest_subroutine( +! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}} +! CHECK: %[[VAL_2:.*]] = fir.call @_FortranACpuTime() fastmath : () -> f64 +! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]] : (f64) -> f32 +! CHECK: fir.store %[[VAL_3]] to %[[VAL_1]]#1 : !fir.ref