[flang-commits] [flang] [flang][OpenMP] Do not emit an error for CRITICAL inside DEFAULT(NONE) (PR #216403)

Leandro Lupori via flang-commits flang-commits at lists.llvm.org
Fri Aug 14 14:14:17 PDT 2026


https://github.com/luporl created https://github.com/llvm/llvm-project/pull/216403

Fixes #197394


>From 0e7ab9926d42194e0b163b5de687e5426c9d81f7 Mon Sep 17 00:00:00 2001
From: Leandro Lupori <leandro.lupori at linaro.org>
Date: Fri, 14 Aug 2026 17:56:57 -0300
Subject: [PATCH] [flang][OpenMP] Do not emit an error for CRITICAL inside
 DEFAULT(NONE)

Fixes #197394
---
 flang/lib/Semantics/resolve-directives.cpp    | 16 +++++++++++--
 flang/test/Semantics/OpenMP/default-none.f90  | 12 ++++++++++
 .../test/Semantics/OpenMP/default-none02.f90  | 23 +++++++++++++++++++
 3 files changed, 49 insertions(+), 2 deletions(-)
 create mode 100644 flang/test/Semantics/OpenMP/default-none02.f90

diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 15bb84d7e486f..fa7d2b1957b91 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2725,6 +2725,7 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
         dirContext.defaultDSA == Symbol::Flag::OmpNone) {
       checkDefaultNone = true;
     }
+    bool hasDefaultNoneError{false};
     if (checkDefaultNone) {
       auto defaultNoneError = [&](parser::CharBlock loc, const Symbol *sym) {
         if (crayPtr) {
@@ -2736,6 +2737,7 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
               "The DEFAULT(NONE) clause requires that '%s' must be listed in a data-sharing attribute clause"_err_en_US,
               sym->name());
         }
+        hasDefaultNoneError = true;
       };
       if (dsa.test(Symbol::Flag::OmpPrivate) ||
           crayPtrDSA.test(Symbol::Flag::OmpPrivate)) {
@@ -2779,14 +2781,18 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
 
     if (dirContext.defaultDSA == Symbol::Flag::OmpPrivate ||
         dirContext.defaultDSA == Symbol::Flag::OmpFirstPrivate ||
-        dirContext.defaultDSA == Symbol::Flag::OmpShared) {
+        dirContext.defaultDSA == Symbol::Flag::OmpShared ||
+        (dirContext.defaultDSA == Symbol::Flag::OmpNone &&
+            !hasDefaultNoneError)) {
       // 1) default
       // Allowed only with parallel, teams and task generating constructs.
       if (!parallelDir && !taskGenDir && !teamsDir) {
         return;
       }
       dsa = {dirContext.defaultDSA};
-      makeSymbol(dsa);
+      if (dirContext.defaultDSA != Symbol::Flag::OmpNone) {
+        makeSymbol(dsa);
+      }
       PRINT_IMPLICIT_RULE("1) default");
     } else if (parallelDir) {
       // 2) parallel -> shared
@@ -2828,6 +2834,12 @@ void OmpAttributeVisitor::CreateImplicitSymbols(
         PRINT_IMPLICIT_RULE("7) taskgen: firstprivate");
       }
     }
+    if (hasDefaultNoneError &&
+        (dsa.none() || dsa == Symbol::Flags{Symbol::Flag::OmpNone})) {
+      // Set DSA to avoid reporting the same error multiple times.
+      dsa = {Symbol::Flag::OmpShared};
+      makeSymbol(dsa);
+    }
     prevDSA = dsa;
   }
 }
diff --git a/flang/test/Semantics/OpenMP/default-none.f90 b/flang/test/Semantics/OpenMP/default-none.f90
index a56657ccee467..0eb6e22ebd7ab 100644
--- a/flang/test/Semantics/OpenMP/default-none.f90
+++ b/flang/test/Semantics/OpenMP/default-none.f90
@@ -73,3 +73,15 @@ subroutine internal()
 !$omp end parallel
   end subroutine internal
 end subroutine host_assoc
+
+subroutine parallel_critical()
+  integer :: i
+  !$omp parallel default(none)
+  !$omp critical
+  !$omp parallel
+    do i = 1, 10
+    end do
+  !$omp end parallel
+  !$omp end critical
+  !$omp end parallel
+end subroutine
diff --git a/flang/test/Semantics/OpenMP/default-none02.f90 b/flang/test/Semantics/OpenMP/default-none02.f90
new file mode 100644
index 0000000000000..d2d2c876af65c
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/default-none02.f90
@@ -0,0 +1,23 @@
+!RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! Negative tests for default(none)
+
+! Check that the same error is not displayed for every use of a symbol.
+subroutine repeated_error()
+  real :: B
+
+  !$omp parallel default(none)
+    ! ERROR: The DEFAULT(NONE) clause requires that 'b' must be listed in a data-sharing attribute clause
+    B = B + 1.0 + B
+  !$omp end parallel
+
+  !$omp parallel default(none)
+  !$omp critical
+    ! ERROR: The DEFAULT(NONE) clause requires that 'b' must be listed in a data-sharing attribute clause
+    B = B + 2.0 + B
+    !$omp parallel default(none)
+      ! ERROR: The DEFAULT(NONE) clause requires that 'b' must be listed in a data-sharing attribute clause
+      B = B + 3.0 + B
+    !$omp end parallel
+  !$omp end critical
+  !$omp end parallel
+end subroutine



More information about the flang-commits mailing list