[flang-commits] [PATCH] D146584: [flang] Detect image control statements in non-construct IF statements
Peter Klausler via Phabricator via flang-commits
flang-commits at lists.llvm.org
Tue Mar 21 15:15:09 PDT 2023
klausler created this revision.
klausler added a reviewer: vdonaldson.
klausler added a project: Flang.
Herald added subscribers: sunshaoce, jdoerfert.
Herald added a project: All.
klausler requested review of this revision.
The utility routine in semantics that determines whether an
executable construct constitutes an image control statement
was not examining the single action statement controlled by
a non-construct IF statement, e.g. 'IF(P) STOP'.
https://reviews.llvm.org/D146584
Files:
flang/lib/Semantics/tools.cpp
flang/test/Semantics/doconcurrent01.f90
Index: flang/test/Semantics/doconcurrent01.f90
===================================================================
--- flang/test/Semantics/doconcurrent01.f90
+++ flang/test/Semantics/doconcurrent01.f90
@@ -22,6 +22,11 @@
SYNC IMAGES (*)
!ERROR: An image control statement is not allowed in DO CONCURRENT
SYNC MEMORY
+!ERROR: An image control statement is not allowed in DO CONCURRENT
+ stop
+!ERROR: An image control statement is not allowed in DO CONCURRENT
+ if (.false.) stop
+ error stop ! ok
!ERROR: RETURN is not allowed in DO CONCURRENT
return
10 continue
Index: flang/lib/Semantics/tools.cpp
===================================================================
--- flang/lib/Semantics/tools.cpp
+++ flang/lib/Semantics/tools.cpp
@@ -848,6 +848,9 @@
template <typename T> bool operator()(const common::Indirection<T> &x) {
return (*this)(x.value());
}
+ template <typename A> bool operator()(const parser::Statement<A> &x) {
+ return (*this)(x.statement);
+ }
bool operator()(const parser::AllocateStmt &stmt) {
const auto &allocationList{std::get<std::list<parser::Allocation>>(stmt.t)};
for (const auto &allocation : allocationList) {
@@ -894,8 +897,13 @@
return std::get<parser::StopStmt::Kind>(stmt.t) ==
parser::StopStmt::Kind::Stop;
}
- bool operator()(const parser::Statement<parser::ActionStmt> &stmt) {
- return common::visit(*this, stmt.statement.u);
+ bool operator()(const parser::IfStmt &stmt) {
+ return (*this)(
+ std::get<parser::UnlabeledStatement<parser::ActionStmt>>(stmt.t)
+ .statement);
+ }
+ bool operator()(const parser::ActionStmt &stmt) {
+ return common::visit(*this, stmt.u);
}
private:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146584.507153.patch
Type: text/x-patch
Size: 1738 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230321/b14f26c0/attachment-0001.bin>
More information about the flang-commits
mailing list