diff options
author | Peter Klausler <pklausler@nvidia.com> | 2023-07-05 11:19:47 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2023-07-17 11:41:10 -0700 |
commit | 486be17ddaf639dc13b8df4ba078f2677f0c5829 (patch) | |
tree | 1cad16647264411684969f87b1269cf86cc1e64d /flang/lib/Evaluate/intrinsics.cpp | |
parent | 0d21b7cbdeb2f2eb5ef123a15099da0b651b24c0 (diff) | |
download | llvm-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.cpp | 4 |
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}}, |