[flang-commits] [flang] [flang] Exempt construct entities from SAVE check for PURE (PR #131383)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Mar 14 12:48:21 PDT 2025
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/131383
A PURE subprogram can't have a local variable with the SAVE attribute. An ASSOCIATE or SELECT TYPE construct entity whose selector is a variable will return true from IsSave(); exclude them from the local variable check.
Fixes https://github.com/llvm/llvm-project/issues/131356.
>From 0176aca1f289d72d155ed6ae60cd12a42dab2af4 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 14 Mar 2025 12:44:50 -0700
Subject: [PATCH] [flang] Exempt construct entities from SAVE check for PURE
A PURE subprogram can't have a local variable with the SAVE
attribute. An ASSOCIATE or SELECT TYPE construct entity whose
selector is a variable will return true from IsSave(); exclude
them from the local variable check.
Fixes https://github.com/llvm/llvm-project/issues/131356.
---
flang/lib/Semantics/check-declarations.cpp | 5 ++++-
flang/test/Semantics/call10.f90 | 4 ++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp
index e5a01657e4a15..0a0601cb04c85 100644
--- a/flang/lib/Semantics/check-declarations.cpp
+++ b/flang/lib/Semantics/check-declarations.cpp
@@ -363,7 +363,10 @@ void CheckHelper::Check(const Symbol &symbol) {
// are not pertinent to the characteristics of the procedure.
// Restrictions on entities in pure procedure interfaces don't need
// enforcement.
- } else if (!FindCommonBlockContaining(symbol) && IsSaved(symbol)) {
+ } else if (symbol.has<AssocEntityDetails>() ||
+ FindCommonBlockContaining(symbol)) {
+ // can look like they have SAVE but are fine in PURE
+ } else if (IsSaved(symbol)) {
if (IsInitialized(symbol)) {
messages_.Say(
"A pure subprogram may not initialize a variable"_err_en_US);
diff --git a/flang/test/Semantics/call10.f90 b/flang/test/Semantics/call10.f90
index 81c28082a843f..47976ca9630cd 100644
--- a/flang/test/Semantics/call10.f90
+++ b/flang/test/Semantics/call10.f90
@@ -36,6 +36,8 @@ pure subroutine s05a
end subroutine
end interface
+ real :: moduleVar = 1.
+
contains
subroutine impure(x)
@@ -117,6 +119,8 @@ pure subroutine s05 ! C1589
!ERROR: A pure subprogram may not initialize a variable
real :: v6 = 0.
end block
+ associate (x => moduleVar) ! ok
+ end associate
end subroutine
pure subroutine s06 ! C1589
!ERROR: A pure subprogram may not have a variable with the VOLATILE attribute
More information about the flang-commits
mailing list