[flang] handle intrinsic interfaces in FunctionRef::GetType (#89583)

User functions may be declared with an interface that is a specific
intrinsic. In such case, there is no result type available from the
procedure symbol (at least without using evaluate::Probe), and
FunctionRef::GetType() returned nullopt. This caused lowering to crash.
The result type of specific intrinsic procedures is always a lengthless
intrinsic type, so it is fully defined in the template argument of
FunctionRef. Use it.
This commit is contained in:
jeanPerier
2024-04-23 09:20:02 +02:00
committed by GitHub
parent a04624206d
commit 35159c2e81
2 changed files with 18 additions and 2 deletions

View File

@@ -287,15 +287,18 @@ public:
: ProcedureRef{std::move(p), std::move(a)} {}
std::optional<DynamicType> GetType() const {
if (auto type{proc_.GetType()}) {
if constexpr (IsLengthlessIntrinsicType<A>) {
return A::GetType();
} else if (auto type{proc_.GetType()}) {
// TODO: Non constant explicit length parameters of PDTs result should
// likely be dropped too. This is not as easy as for characters since some
// long lived DerivedTypeSpec pointer would need to be created here. It is
// not clear if this is causing any issue so far since the storage size of
// PDTs is independent of length parameters.
return type->DropNonConstantCharacterLength();
} else {
return std::nullopt;
}
return std::nullopt;
}
};
} // namespace Fortran::evaluate

View File

@@ -186,3 +186,16 @@ subroutine alternate_return_call(n1, n2, k)
! CHECK: ^[[block2]]: // pred: ^bb0
7 k = 1; return
end
! -----------------------------------------------------------------------------
! Test calls to user procedures with intrinsic interfaces
! -----------------------------------------------------------------------------
! CHECK-NAME: func.func @_QPintrinsic_iface()
subroutine intrinsic_iface()
intrinsic acos
real :: x
procedure(acos) :: proc
x = proc(1.0)
end subroutine
! CHECK" fir.call @_QPproc(%{{.*}}) {{.*}}: (!fir.ref<f32>) -> f32