[flang-commits] [flang] [Flang][Semantics] Treat function result variables as local in pure definability checks. (PR #192892)

via flang-commits flang-commits at lists.llvm.org
Tue May 5 05:54:47 PDT 2026


https://github.com/ShashwathiNavada updated https://github.com/llvm/llvm-project/pull/192892

>From 9453e59c29fc11a706d2c37d07a399ae7dcee5b5 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Sun, 19 Apr 2026 23:20:53 -0500
Subject: [PATCH 1/4] Treat function result variables as local in pure
 definability checks

---
 flang/lib/Semantics/tools.cpp                 |  4 ++
 .../pure-function-result-pointer.f90          | 53 +++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 flang/test/Semantics/pure-function-result-pointer.f90

diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 68307f7504e28..d2a10930ae9dc 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -338,6 +338,10 @@ const Symbol *FindExternallyVisibleObject(
         IsPureProcedure(ultimate.owner()) && IsFunction(ultimate.owner())) {
       return &ultimate;
     }
+  } else if (IsFunctionResult(ultimate)) {
+    // A function result variable is local to its function and not an
+    // externally visible object for C1594 checks.
+    return nullptr;
   } else if (ultimate.owner().IsDerivedType()) {
     return nullptr;
   } else if (&GetProgramUnitContaining(ultimate) !=
diff --git a/flang/test/Semantics/pure-function-result-pointer.f90 b/flang/test/Semantics/pure-function-result-pointer.f90
new file mode 100644
index 0000000000000..fc98f50b6d8dc
--- /dev/null
+++ b/flang/test/Semantics/pure-function-result-pointer.f90
@@ -0,0 +1,53 @@
+! RUN: %flang_fc1 -fsyntax-only %s
+
+module associated_func_call
+  implicit none
+
+  private
+  public :: type_t
+  public :: test_function_i
+
+  abstract interface
+    function test_function_i() result(passes)
+      implicit none
+      logical passes
+    end function
+  end interface
+
+  type type_t
+    private
+    procedure(test_function_i), pointer, nopass :: test_function_ => null()
+  contains
+    generic :: operator(==) => equals
+    procedure, private :: equals
+  end type
+
+  interface type_t
+
+    module function construct(test_function) result(test_description)
+      implicit none
+      procedure(test_function_i), intent(in), pointer :: test_function
+      type(type_t) test_description
+    end function
+
+  end interface
+
+  interface
+
+    elemental module function equals(lhs, rhs) result(lhs_eq_rhs)
+      implicit none
+      class(type_t), intent(in) :: lhs, rhs
+      logical lhs_eq_rhs
+    end function
+
+  end interface
+
+contains
+    module procedure construct
+      test_description%test_function_ => test_function
+    end procedure
+
+    module procedure equals
+      lhs_eq_rhs = associated(lhs%test_function_, rhs%test_function_)
+    end procedure
+end module associated_func_call

>From f0307f2fb5b766ece78177234ec417700bcfd0f5 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Sun, 19 Apr 2026 23:32:30 -0500
Subject: [PATCH 2/4] Simple

---
 flang/lib/Semantics/tools.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index d2a10930ae9dc..b338ef6e085e8 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -347,7 +347,7 @@ const Symbol *FindExternallyVisibleObject(
   } else if (&GetProgramUnitContaining(ultimate) !=
       &GetProgramUnitContaining(scope)) {
     return &object;
-  } else if (const Symbol * block{FindCommonBlockContaining(ultimate)}) {
+  } else if (const Symbol *block{FindCommonBlockContaining(ultimate)}) {
     return block;
   }
   return nullptr;

>From d07b249f1db418cc55ce4b20302d7f255d8e7467 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Mon, 20 Apr 2026 10:03:56 +0530
Subject: [PATCH 3/4] Update tools.cpp

---
 flang/lib/Semantics/tools.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 1575de7d43c8e..47cafffdce8d8 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -347,7 +347,7 @@ const Symbol *FindExternallyVisibleObject(
   } else if (&GetProgramUnitContaining(ultimate) !=
       &GetProgramUnitContaining(scope)) {
     return &object;
-  } else if (const Symbol * block{FindCommonBlockContaining(ultimate)}) {
+  } else if (const Symbol *block{FindCommonBlockContaining(ultimate)}) {
     return block;
   }
   return nullptr;

>From 4bed3f209f032a330ee80d3f070fa5ac1a7adc59 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Tue, 5 May 2026 07:54:02 -0500
Subject: [PATCH 4/4] Updated the Check

---
 flang/lib/Semantics/tools.cpp | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/flang/lib/Semantics/tools.cpp b/flang/lib/Semantics/tools.cpp
index 47cafffdce8d8..d61b376237265 100644
--- a/flang/lib/Semantics/tools.cpp
+++ b/flang/lib/Semantics/tools.cpp
@@ -330,7 +330,12 @@ const Symbol *FindExternallyVisibleObject(
   // TODO: Storage association with any object for which this predicate holds,
   // once EQUIVALENCE is supported.
   const Symbol &ultimate{GetAssociationRoot(object)};
-  if (IsDummy(ultimate)) {
+  if (ultimate.owner().IsDerivedType()) {
+    return nullptr;
+  } else if (!IsDummy(ultimate) && (IsUseAssociated(object, scope) ||
+      IsHostAssociatedIntoSubprogram(object, scope)) ){
+    return &object;
+  } else if (IsDummy(ultimate)) {
     if (IsIntentIn(ultimate)) {
       return &ultimate;
     }
@@ -338,16 +343,7 @@ const Symbol *FindExternallyVisibleObject(
         IsPureProcedure(ultimate.owner()) && IsFunction(ultimate.owner())) {
       return &ultimate;
     }
-  } else if (IsFunctionResult(ultimate)) {
-    // A function result variable is local to its function and not an
-    // externally visible object for C1594 checks.
-    return nullptr;
-  } else if (ultimate.owner().IsDerivedType()) {
-    return nullptr;
-  } else if (&GetProgramUnitContaining(ultimate) !=
-      &GetProgramUnitContaining(scope)) {
-    return &object;
-  } else if (const Symbol *block{FindCommonBlockContaining(ultimate)}) {
+  } else if (const Symbol *block {FindCommonBlockContaining(ultimate)}) {
     return block;
   }
   return nullptr;



More information about the flang-commits mailing list