aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Evaluate/intrinsics.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2023-07-05 11:19:47 -0700
committerPeter Klausler <pklausler@nvidia.com>2023-07-17 11:41:10 -0700
commit486be17ddaf639dc13b8df4ba078f2677f0c5829 (patch)
tree1cad16647264411684969f87b1269cf86cc1e64d /flang/lib/Evaluate/intrinsics.cpp
parent0d21b7cbdeb2f2eb5ef123a15099da0b651b24c0 (diff)
downloadllvm-486be17ddaf639dc13b8df4ba078f2677f0c5829.zip
llvm-486be17ddaf639dc13b8df4ba078f2677f0c5829.tar.gz
llvm-486be17ddaf639dc13b8df4ba078f2677f0c5829.tar.bz2
[flang] Catch impure specifics called in DO CONCURRENT
Rework the code used to check for calls to impure procedures in DO CONCURRENT constructs. The current code wasn't checking the representation of the procedure references in the strongly typed expressions, so it was missing calls to impure subprograms made via generic interfaces. While here, improve error messages, and fix some minor issues exposed by testing the improved checks. Differential Revision: https://reviews.llvm.org/D155489
Diffstat (limited to 'flang/lib/Evaluate/intrinsics.cpp')
-rw-r--r--flang/lib/Evaluate/intrinsics.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index 04cc7b3..c6f32c0 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -2361,6 +2361,10 @@ std::optional<SpecificCall> IntrinsicInterface::Match(
attrs.set(characteristics::Procedure::Attr::Elemental);
}
if (call.isSubroutineCall) {
+ if (intrinsicClass == IntrinsicClass::pureSubroutine /* MOVE_ALLOC */ ||
+ intrinsicClass == IntrinsicClass::elementalSubroutine /* MVBITS */) {
+ attrs.set(characteristics::Procedure::Attr::Pure);
+ }
return SpecificCall{
SpecificIntrinsic{
name, characteristics::Procedure{std::move(dummyArgs), attrs}},