[flang-commits] [flang] 325d1d0 - [flang] Fix purity checking for internal subprograms (#91759)
via flang-commits
flang-commits at lists.llvm.org
Wed May 15 15:58:23 PDT 2024
Author: Peter Klausler
Date: 2024-05-15T15:58:20-07:00
New Revision: 325d1d0b73aa6bff0ce4174b45a7601f6b32a793
URL: https://github.com/llvm/llvm-project/commit/325d1d0b73aa6bff0ce4174b45a7601f6b32a793
DIFF: https://github.com/llvm/llvm-project/commit/325d1d0b73aa6bff0ce4174b45a7601f6b32a793.diff
LOG: [flang] Fix purity checking for internal subprograms (#91759)
ELEMENTAL internal subprograms are pure unless explicitly IMPURE.
Added:
flang/test/Semantics/pure02.f90
Modified:
flang/lib/Semantics/check-purity.cpp
Removed:
################################################################################
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