[flang-commits] [flang] [Flang] Fix IsProcedure() for procedure-valued function references (PR #216322)

via flang-commits flang-commits at lists.llvm.org
Fri Aug 14 07:23:30 PDT 2026


https://github.com/keepyixiao created https://github.com/llvm/llvm-project/pull/216322

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.

>From 554967c4c63699068d27cfd5c9468f564d418608 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/procedure-function-result01.f90 |  8 ++++++++
 flang/test/Semantics/procedure-function-result02.f90 |  7 +++++++
 3 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 flang/test/Semantics/procedure-function-result01.f90
 create mode 100644 flang/test/Semantics/procedure-function-result02.f90

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/procedure-function-result01.f90 b/flang/test/Semantics/procedure-function-result01.f90
new file mode 100644
index 0000000000000..f6743d76faad2
--- /dev/null
+++ b/flang/test/Semantics/procedure-function-result01.f90
@@ -0,0 +1,8 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+
+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
diff --git a/flang/test/Semantics/procedure-function-result02.f90 b/flang/test/Semantics/procedure-function-result02.f90
new file mode 100644
index 0000000000000..ed49b8b8847c6
--- /dev/null
+++ b/flang/test/Semantics/procedure-function-result02.f90
@@ -0,0 +1,7 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+
+function s(x) result(i)
+  procedure(), pointer :: i
+  ! ERROR: Actual argument for 'array=' may not be a procedure
+  print *, size(S(dd))
+end



More information about the flang-commits mailing list