[flang-commits] [flang] [Flang][OpenMP] Fix DEFAULT(NONE) check for Cray pointers in nested OpenMP directives (PR #190764)
Urvi Rav via flang-commits
flang-commits at lists.llvm.org
Sun Apr 12 23:29:29 PDT 2026
https://github.com/ravurvi20 updated https://github.com/llvm/llvm-project/pull/190764
>From b3d3adfd0ced4686f7dc3c361dfd29ce54adb6c8 Mon Sep 17 00:00:00 2001
From: Urvi Rav <urvi.rav20 at gmail.com>
Date: Tue, 7 Apr 2026 04:46:26 -0500
Subject: [PATCH 1/3] Updated resolve-directives.cpp for nested openmp regions
---
flang/lib/Semantics/resolve-directives.cpp | 2 +-
.../Semantics/OpenMP/cray-pointer-usage.f90 | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index fb241d2606b47..991dce801bb01 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2780,7 +2780,7 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
if (sym->GetUltimate().test(Symbol::Flag::CrayPointee)) {
std::string crayPtrName{
semantics::GetCrayPointer(*sym).name().ToString()};
- if (!IsObjectWithDSA(*currScope().FindSymbol(crayPtrName))) {
+ if (!IsObjectWithVisibleDSA(*currScope().FindSymbol(crayPtrName))) {
context_.Say(loc,
"The DEFAULT(NONE) clause requires that the Cray Pointer '%s' must be listed in a data-sharing attribute clause"_err_en_US,
crayPtrName);
diff --git a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90 b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
index 3f13338a19f7f..ba9166d6a47e8 100644
--- a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
+++ b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
@@ -43,3 +43,20 @@ subroutine test_cray_pointer_usage
print *, var(1)
!$omp end parallel
end subroutine test_cray_pointer_usage
+
+subroutine test_nested_cray_pointer
+ implicit none
+ real :: X, B
+ pointer(P, B)
+
+ X = 1.0
+ P = loc(X)
+
+ ! Test nested constructs: pointer declared in outer parallel, pointee used in nested critical
+ ! This should compile successfully - pointer P is in shared clause of parallel
+ !$omp parallel default(none) shared(P, X)
+ !$omp critical
+ B = B + 2.0
+ !$omp end critical
+ !$omp end parallel
+end subroutine test_nested_cray_pointer
>From f198f5c5a5cbc4f6d4280dec4fc70f98fc7be0a2 Mon Sep 17 00:00:00 2001
From: Urvi Rav <urvi.rav20 at gmail.com>
Date: Wed, 8 Apr 2026 01:20:51 -0500
Subject: [PATCH 2/3] Updated the fix
---
flang/lib/Semantics/resolve-directives.cpp | 61 +++++++++++--------
.../Semantics/OpenMP/cray-pointer-usage.f90 | 15 ++++-
2 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 991dce801bb01..8cae6a59f40de 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2692,20 +2692,24 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
Symbol::Flags dsa;
Scope &scope{context_.FindScope(dirContext.directiveSource)};
- auto it{scope.find(symbol->name())};
- if (it != scope.end()) {
- // There is already a symbol in the current scope, use its DSA.
- dsa = GetSymbolDSA(*it->second);
- } else {
- for (auto symMap : dirContext.objectWithDSA) {
- if (symMap.first->name() == symbol->name()) {
- // `symbol` already has a data-sharing attribute in the current
- // context, use it.
- dsa.set(symMap.second);
- break;
+
+ auto initSymbolDSA = [&](const Symbol *symbol, Symbol::Flags &dsa) {
+ auto it{scope.find(symbol->name())};
+ if (it != scope.end()) {
+ // There is already a symbol in the current scope, use its DSA.
+ dsa = GetSymbolDSA(*it->second);
+ } else {
+ for (auto symMap : dirContext.objectWithDSA) {
+ if (symMap.first->name() == symbol->name()) {
+ // `symbol` already has a data-sharing attribute in the current
+ // context, use it.
+ dsa.set(symMap.second);
+ break;
+ }
}
}
- }
+ };
+ initSymbolDSA(symbol, dsa);
// When handling each implicit rule for a given symbol, one of the
// following actions may be taken:
@@ -2773,27 +2777,34 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
LLVM_DEBUG(llvm::dbgs()
<< "HasStaticStorageDuration(" << symbol->name() << "):\n");
- if ((checkDefaultNone = checkDefaultNone |
- (dsa.none() &&
- dirContext.defaultDSA == Symbol::Flag::OmpNone))) {
+ const Symbol *crayPtr = nullptr;
+ Symbol::Flags crayPtrDSA;
+ if (symbol->GetUltimate().test(Symbol::Flag::CrayPointee)) {
+ std::string crayPtrName{
+ semantics::GetCrayPointer(*symbol).name().ToString()};
+ crayPtr = currScope().FindSymbol(crayPtrName);
+ initSymbolDSA(crayPtr, crayPtrDSA);
+ }
+ if (dsa.none() && crayPtrDSA.none() &&
+ dirContext.defaultDSA == Symbol::Flag::OmpNone) {
+ checkDefaultNone = true;
+ }
+ if (checkDefaultNone) {
auto defaultNoneError = [&](parser::CharBlock loc, const Symbol *sym) {
- if (sym->GetUltimate().test(Symbol::Flag::CrayPointee)) {
- std::string crayPtrName{
- semantics::GetCrayPointer(*sym).name().ToString()};
- if (!IsObjectWithVisibleDSA(*currScope().FindSymbol(crayPtrName))) {
- context_.Say(loc,
- "The DEFAULT(NONE) clause requires that the Cray Pointer '%s' must be listed in a data-sharing attribute clause"_err_en_US,
- crayPtrName);
- }
+ if (crayPtr) {
+ context_.Say(loc,
+ "The DEFAULT(NONE) clause requires that the Cray Pointer '%s' must be listed in a data-sharing attribute clause"_err_en_US,
+ crayPtr->name());
} else {
context_.Say(loc,
"The DEFAULT(NONE) clause requires that '%s' must be listed in a data-sharing attribute clause"_err_en_US,
sym->name());
}
};
- if (dsa.test(Symbol::Flag::OmpPrivate)) {
+ if (dsa.test(Symbol::Flag::OmpPrivate) ||
+ crayPtrDSA.test(Symbol::Flag::OmpPrivate)) {
checkDefaultNone = false;
- } else if (dsa.any()) {
+ } else if (dsa.any() || crayPtrDSA.any()) {
defaultNoneError(dirContext.directiveSource, symbol);
} else if (dirDepth == (int)dirContext_.size() - 1) {
defaultNoneError(name.source, symbol);
diff --git a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90 b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
index ba9166d6a47e8..16d8405b19ea6 100644
--- a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
+++ b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
@@ -52,11 +52,22 @@ subroutine test_nested_cray_pointer
X = 1.0
P = loc(X)
- ! Test nested constructs: pointer declared in outer parallel, pointee used in nested critical
- ! This should compile successfully - pointer P is in shared clause of parallel
!$omp parallel default(none) shared(P, X)
!$omp critical
B = B + 2.0
!$omp end critical
!$omp end parallel
+
+ !$omp parallel default(none) shared(P, X)
+ !$omp parallel default(none)
+ ! ERROR: The DEFAULT(NONE) clause requires that the Cray Pointer 'p' must be listed in a data-sharing attribute clause
+ B = B + 1.0
+ !$omp end parallel
+ !$omp end parallel
+
+ !$omp parallel default(none) shared(P, X)
+ !$omp parallel default(none) shared(P, X)
+ B = B + 1.0
+ !$omp end parallel
+ !$omp end parallel
end subroutine test_nested_cray_pointer
>From bb4f543bf02f987fe61e273203694cbcb8b013ca Mon Sep 17 00:00:00 2001
From: Urvi Rav <urvi.rav20 at gmail.com>
Date: Mon, 13 Apr 2026 01:19:43 -0500
Subject: [PATCH 3/3] Added a case and updated resolve-directives.cpp
---
flang/lib/Semantics/resolve-directives.cpp | 9 +++++----
flang/test/Semantics/OpenMP/cray-pointer-usage.f90 | 7 +++++++
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 8cae6a59f40de..3a239b552f9da 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2780,10 +2780,11 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
const Symbol *crayPtr = nullptr;
Symbol::Flags crayPtrDSA;
if (symbol->GetUltimate().test(Symbol::Flag::CrayPointee)) {
- std::string crayPtrName{
- semantics::GetCrayPointer(*symbol).name().ToString()};
- crayPtr = currScope().FindSymbol(crayPtrName);
- initSymbolDSA(crayPtr, crayPtrDSA);
+ crayPtr =
+ currScope().FindSymbol(semantics::GetCrayPointer(*symbol).name());
+ if (crayPtr) {
+ initSymbolDSA(crayPtr, crayPtrDSA);
+ }
}
if (dsa.none() && crayPtrDSA.none() &&
dirContext.defaultDSA == Symbol::Flag::OmpNone) {
diff --git a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90 b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
index 16d8405b19ea6..78d33588a354f 100644
--- a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
+++ b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
@@ -70,4 +70,11 @@ subroutine test_nested_cray_pointer
B = B + 1.0
!$omp end parallel
!$omp end parallel
+
+ !$omp parallel default(none)
+ ! ERROR: The DEFAULT(NONE) clause requires that the Cray Pointer 'p' must be listed in a data-sharing attribute clause
+ !$omp parallel default(none) shared(P)
+ B = B + 1.0
+ !$omp end parallel
+ !$omp end parallel
end subroutine test_nested_cray_pointer
More information about the flang-commits
mailing list