[flang-commits] [flang] [flang] Test SYNC IMAGES, increase checking (PR #132279)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Thu Mar 20 13:40:09 PDT 2025
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/132279
Add a test for the SYNC IMAGES statement, and add a check for invalid image numbers.
>From d8a2ae8b65a5fa9f0ab202685a4d3b34aa292545 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Thu, 20 Mar 2025 13:38:37 -0700
Subject: [PATCH] [flang] Test SYNC IMAGES, increase checking
Add a test for the SYNC IMAGES statement, and add a check for
invalid image numbers.
---
flang/lib/Semantics/check-coarray.cpp | 21 ++++++++++++++++++++-
flang/test/Semantics/sync-images.f90 | 12 ++++++++++++
2 files changed, 32 insertions(+), 1 deletion(-)
create mode 100644 flang/test/Semantics/sync-images.f90
diff --git a/flang/lib/Semantics/check-coarray.cpp b/flang/lib/Semantics/check-coarray.cpp
index 9dd287e9d2495..b21e3cd757d6b 100644
--- a/flang/lib/Semantics/check-coarray.cpp
+++ b/flang/lib/Semantics/check-coarray.cpp
@@ -194,7 +194,6 @@ void CoarrayChecker::Leave(const parser::SyncAllStmt &x) {
void CoarrayChecker::Leave(const parser::SyncImagesStmt &x) {
CheckSyncStatList(context_, std::get<std::list<parser::StatOrErrmsg>>(x.t));
-
const auto &imageSet{std::get<parser::SyncImagesStmt::ImageSet>(x.t)};
if (const auto *intExpr{std::get_if<parser::IntExpr>(&imageSet.u)}) {
if (const auto *expr{GetExpr(context_, *intExpr)}) {
@@ -202,6 +201,26 @@ void CoarrayChecker::Leave(const parser::SyncImagesStmt &x) {
context_.Say(parser::FindSourceLocation(imageSet), // C1174
"An image-set that is an int-expr must be a scalar or a rank-one array"_err_en_US);
}
+ if (const auto *someInt{
+ std::get_if<evaluate::Expr<evaluate::SomeInteger>>(&expr->u)};
+ someInt && evaluate::IsActuallyConstant(*someInt)) {
+ auto converted{evaluate::Fold(context_.foldingContext(),
+ evaluate::ConvertToType<evaluate::SubscriptInteger>(
+ common::Clone(*someInt)))};
+ if (const auto *cst{
+ evaluate::UnwrapConstantValue<evaluate::SubscriptInteger>(
+ converted)}) {
+ for (auto elt : cst->values()) {
+ auto n{elt.ToInt64()};
+ if (n < 1) {
+ context_.Say(parser::FindSourceLocation(imageSet),
+ "Image number %jd in the image-set is not valid"_err_en_US,
+ std::intmax_t{n});
+ break;
+ }
+ }
+ }
+ }
}
}
}
diff --git a/flang/test/Semantics/sync-images.f90 b/flang/test/Semantics/sync-images.f90
new file mode 100644
index 0000000000000..637fa263354d0
--- /dev/null
+++ b/flang/test/Semantics/sync-images.f90
@@ -0,0 +1,12 @@
+!RUN: %python %S/test_errors.py %s %flang_fc1
+integer twod(1,1)
+sync images (*) ! ok
+!ERROR: An image-set that is an int-expr must be a scalar or a rank-one array
+sync images (twod)
+!ERROR: Must have INTEGER type, but is REAL(4)
+sync images (3.14159)
+!ERROR: Image number -1 in the image-set is not valid
+sync images (-1)
+!ERROR: Image number -1 in the image-set is not valid
+sync images ([2, -1, 3])
+end
More information about the flang-commits
mailing list