[flang-commits] [flang] [Flang] Fix IsProcedure() for procedure-valued function references (PR #216322)
via flang-commits
flang-commits at lists.llvm.org
Fri Aug 21 03:07:52 PDT 2026
https://github.com/keepyixiao updated https://github.com/llvm/llvm-project/pull/216322
>From df06eda7fd8b51294ec7bcae680aa92ffd4637f9 Mon Sep 17 00:00:00 2001
From: yixiao <yixiao at hygon.cn>
Date: Fri, 14 Aug 2026 21:02:41 +0800
Subject: [PATCH] [Flang] Fix IsProcedure() for procedure-valued function
references
IsProcedure() does not recognize function references whose results are
procedures. This can cause an assertion failure in intrinsic argument
checking when such an expression is passed as an actual argument.
Update IsProcedure() to inspect the result symbol of a ProcedureRef
and determine whether the function result is a procedure.
Add a regression test for procedure-valued function references.
---
flang/lib/Evaluate/tools.cpp | 12 +++++++++++-
flang/test/Semantics/func-proc-result.f90 | 13 +++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Evaluate/tools.cpp b/flang/lib/Evaluate/tools.cpp
index 589aab5132a65..b1d6a6bf82f32 100644
--- a/flang/lib/Evaluate/tools.cpp
+++ b/flang/lib/Evaluate/tools.cpp
@@ -1003,7 +1003,17 @@ bool IsProcedurePointer(const Expr<SomeType> &expr) {
}
bool IsProcedure(const Expr<SomeType> &expr) {
- return IsProcedureDesignator(expr) || IsProcedurePointer(expr);
+ if (IsProcedureDesignator(expr) || IsProcedurePointer(expr)) {
+ return true;
+ }
+ if (const auto *funcRef{UnwrapProcedureRef(expr)}) {
+ if (const Symbol *proc{funcRef->proc().GetSymbol()}) {
+ if (const Symbol *result{FindFunctionResult(*proc)}) {
+ return IsProcedure(*result);
+ }
+ }
+ }
+ return false;
}
bool IsProcedurePointerTarget(const Expr<SomeType> &expr) {
diff --git a/flang/test/Semantics/func-proc-result.f90 b/flang/test/Semantics/func-proc-result.f90
index 5bf8ac9c4ddea..26c25749d211b 100644
--- a/flang/test/Semantics/func-proc-result.f90
+++ b/flang/test/Semantics/func-proc-result.f90
@@ -16,3 +16,16 @@ function bad2() result(res2)
!ERROR: EXTERNAL attribute not allowed on 'res2'
external res2
end
+
+function s(x) result(i)
+ !ERROR: A function result may not be a procedure unless it is a procedure pointer
+ procedure() :: i
+ !ERROR: Actual argument for 'array=' may not be a procedure
+ print *, size(S(dd))
+end
+
+function s1(x) result(i)
+ procedure(), pointer :: i
+ !ERROR: Actual argument for 'array=' may not be a procedure
+ print *, size(S1(dd))
+end
More information about the flang-commits
mailing list