[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