[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:35:23 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-openmp

Author: ejose02

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/213913.diff


2 Files Affected:

- (modified) flang/lib/Semantics/resolve-directives.cpp (+24-3) 
- (added) flang/test/Semantics/OpenMP/common-block-data-sharing.f90 (+11) 


``````````diff
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

``````````

</details>


https://github.com/llvm/llvm-project/pull/213913


More information about the flang-commits mailing list