[flang-commits] [flang] [flang] Fix purity checking for internal subprograms (PR #91759)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri May 10 09:00:46 PDT 2024
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/91759
ELEMENTAL internal subprograms are pure unless explicitly IMPURE.
>From 5ba70a64df399a648fbc4d93f9c4c46afd7eaee8 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 10 May 2024 08:41:31 -0700
Subject: [PATCH] [flang] Fix purity checking for internal subprograms
ELEMENTAL internal subprograms are pure unless explicitly IMPURE.
---
flang/lib/Semantics/check-purity.cpp | 10 +++--
flang/test/Semantics/pure02.f90 | 59 ++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 3 deletions(-)
create mode 100644 flang/test/Semantics/pure02.f90
diff --git a/flang/lib/Semantics/check-purity.cpp b/flang/lib/Semantics/check-purity.cpp
index 5176390f366bd..55a9a2f107388 100644
--- a/flang/lib/Semantics/check-purity.cpp
+++ b/flang/lib/Semantics/check-purity.cpp
@@ -39,12 +39,16 @@ bool PurityChecker::InPureSubprogram() const {
bool PurityChecker::HasPurePrefix(
const std::list<parser::PrefixSpec> &prefixes) const {
+ bool result{false};
for (const parser::PrefixSpec &prefix : prefixes) {
- if (std::holds_alternative<parser::PrefixSpec::Pure>(prefix.u)) {
- return true;
+ if (std::holds_alternative<parser::PrefixSpec::Impure>(prefix.u)) {
+ return false;
+ } else if (std::holds_alternative<parser::PrefixSpec::Pure>(prefix.u) ||
+ std::holds_alternative<parser::PrefixSpec::Elemental>(prefix.u)) {
+ result = true;
}
}
- return false;
+ return result;
}
void PurityChecker::Entered(
diff --git a/flang/test/Semantics/pure02.f90 b/flang/test/Semantics/pure02.f90
new file mode 100644
index 0000000000000..11dc0fd268293
--- /dev/null
+++ b/flang/test/Semantics/pure02.f90
@@ -0,0 +1,59 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+pure subroutine s1
+ contains
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ subroutine t1
+ end
+ pure subroutine t2 ! ok
+ end
+ elemental subroutine t3(k) ! ok
+ integer, intent(in) :: k
+ end
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ impure elemental subroutine t4(k)
+ integer, intent(in) :: k
+ end
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ elemental impure subroutine t5(k)
+ integer, intent(in) :: k
+ end
+end
+
+elemental subroutine s2(j)
+ integer, intent(in) :: j
+ contains
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ subroutine t1
+ end
+ pure subroutine t2 ! ok
+ end
+ elemental subroutine t3(k) ! ok
+ integer, intent(in) :: k
+ end
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ impure elemental subroutine t4(k)
+ integer, intent(in) :: k
+ end
+ !ERROR: An internal subprogram of a pure subprogram must also be pure
+ elemental impure subroutine t5(k)
+ integer, intent(in) :: k
+ end
+end
+
+impure elemental subroutine s3(j)
+ integer, intent(in) :: j
+ contains
+ subroutine t1
+ end
+ pure subroutine t2
+ end
+ elemental subroutine t3(k)
+ integer, intent(in) :: k
+ end
+ impure elemental subroutine t4(k)
+ integer, intent(in) :: k
+ end
+ elemental impure subroutine t5(k)
+ integer, intent(in) :: k
+ end
+end
More information about the flang-commits
mailing list