[flang-commits] [flang] [flang][OpenMP] Detect conflicting data-sharing clauses for common blocks (PR #213913)
via flang-commits
flang-commits at lists.llvm.org
Tue Aug 4 04:34:47 PDT 2026
https://github.com/ejose02 created https://github.com/llvm/llvm-project/pull/213913
Fixes #205779
OpenMP treats a named common block in a data-sharing clause as equivalent to listing every explicit member. Extend CheckMultipleAppearances to detect conflicts between a common block and its members, and register all explicit members when a common block is listed. Added a regression test.
>From fe29f5db742926fa251d54ba61166af19782511d Mon Sep 17 00:00:00 2001
From: ejose <ejose at amd.com>
Date: Tue, 4 Aug 2026 10:13:24 +0000
Subject: [PATCH] [flang][OpenMP] Detect conflicting data-sharing clauses for
common blocks
OpenMP treats a named common block in a data-sharing clause as equivalent to listing every explicit member. Extend CheckMultipleAppearances to detect conflicts between a common block and its members, and register all explicit members when a common block is listed. Added a regression test.
---
flang/lib/Semantics/resolve-directives.cpp | 27 ++++++++++++++++---
.../OpenMP/common-block-data-sharing.f90 | 11 ++++++++
2 files changed, 35 insertions(+), 3 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/common-block-data-sharing.f90
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 15bb84d7e486f..bb93524ae5223 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -3311,14 +3311,35 @@ void OmpAttributeVisitor::CheckMultipleAppearances(
target = &details->symbol();
}
}
- if (HasDataSharingAttributeObject(target->GetUltimate()) &&
- !WithMultipleAppearancesOmpException(symbol, ompFlag)) {
+ const Symbol &ultimate = target->GetUltimate();
+ auto alreadyListed{[&](const Symbol &sym) {
+ return HasDataSharingAttributeObject(sym);
+ }};
+ bool conflicts = alreadyListed(ultimate);
+ if (!conflicts) {
+ if (const Symbol *commonBlock = FindCommonBlockContaining(ultimate)) {
+ conflicts = alreadyListed(*commonBlock);
+ } else if (const auto *details = ultimate.detailsIf<CommonBlockDetails>()) {
+ for (const auto &object : details->objects()) {
+ if (alreadyListed(object->GetUltimate())) {
+ conflicts = true;
+ break;
+ }
+ }
+ }
+ }
+ if (conflicts && !WithMultipleAppearancesOmpException(symbol, ompFlag)) {
context_.Say(name.source,
"'%s' appears in more than one data-sharing clause "
"on the same OpenMP directive"_err_en_US,
name.ToString());
} else {
- AddDataSharingAttributeObject(target->GetUltimate());
+ AddDataSharingAttributeObject(ultimate);
+ if (const auto *details{ultimate.detailsIf<CommonBlockDetails>()}) {
+ for (const auto &object : details->objects()) {
+ AddDataSharingAttributeObject(object->GetUltimate());
+ }
+ }
}
}
diff --git a/flang/test/Semantics/OpenMP/common-block-data-sharing.f90 b/flang/test/Semantics/OpenMP/common-block-data-sharing.f90
new file mode 100644
index 0000000000000..f0ddf8e048441
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/common-block-data-sharing.f90
@@ -0,0 +1,11 @@
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+
+! a common block in a data-sharing clause is equivalent to
+! listing every explicit member of the common block.
+
+subroutine common_block_dsa()
+ common /c/ x, y
+ !ERROR: 'x' appears in more than one data-sharing clause on the same OpenMP directive
+ !$omp parallel private(/c/) shared(x)
+ !$omp end parallel
+end subroutine
More information about the flang-commits
mailing list