[flang-commits] [flang] [flang][OpenMP] Properly resolve CRITICAL construct names (PR #205904)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Thu Jun 25 13:10:20 PDT 2026
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/205904
Resolve the names of CRITICAL constructs even if they are reserved names.
Fixes https://github.com/llvm/llvm-project/issues/205855
>From 2727c4cbdc03f0da2527e56870e6b1fc7ef6eadf Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Thu, 25 Jun 2026 13:05:22 -0500
Subject: [PATCH] [flang][OpenMP] Properly resolve CRITICAL construct names
Resolve the names of CRITICAL constructs even if they are reserved names.
Fixes https://github.com/llvm/llvm-project/issues/205855
---
flang/lib/Semantics/check-omp-structure.cpp | 7 ++-
flang/lib/Semantics/resolve-names.cpp | 52 +++++++++++--------
.../OpenMP/critical-reserved-name.f90 | 8 +++
.../Semantics/OpenMP/reserved-locator.f90 | 2 +-
4 files changed, 46 insertions(+), 23 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/critical-reserved-name.f90
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 061b2bdf775d0..fcd5e884db18d 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -649,7 +649,7 @@ void OmpStructureChecker::Enter(const parser::OmpLocator &x) {
if (auto *reserved{parser::Unwrap<parser::OmpReservedIdentifier>(x.u)}) {
std::string name{parser::ToLowerCaseLetters(reserved->v.source.ToString())};
if (!llvm::is_contained(llvm::omp::getReservedLocatorNames(), name)) {
- context_.Say(reserved->v.source, "'%s' is not a valid locator"_err_en_US,
+ context_.Say(reserved->v.source, "Invalid use of a reserved name '%s'"_err_en_US,
parser::ToUpperCaseLetters(name));
}
}
@@ -3099,6 +3099,11 @@ void OmpStructureChecker::Enter(const parser::OpenMPCriticalConstruct &x) {
if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
if (auto *designator{GetDesignatorFromObj(*object)}) {
return parser::GetDesignatorNameIfDataRef(*designator);
+ } else if (auto *locator{std::get_if<parser::OmpLocator>(&object->u)}) {
+ if (auto *res{
+ std::get_if<parser::OmpReservedIdentifier>(&locator->u)}) {
+ return &res->v;
+ }
}
}
return static_cast<const parser::Name *>(nullptr);
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 11e24a5e1cccb..8f7d5f0d3f959 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -2168,29 +2168,39 @@ void OmpVisitor::ProcessReductionSpecifier(
}
void OmpVisitor::ResolveCriticalName(const parser::OmpArgument &arg) {
- auto &globalScope{[&]() -> Scope & {
- for (Scope *s{&currScope()};; s = &s->parent()) {
- if (s->IsTopLevel()) {
- return *s;
- }
- }
- llvm_unreachable("Cannot find global scope");
- }()};
+ auto *object{parser::Unwrap<parser::OmpObject>(arg.u)};
+ if (!object) {
+ return;
+ }
- if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
- if (auto *desg{parser::omp::GetDesignatorFromObj(*object)}) {
- if (auto *name{parser::GetDesignatorNameIfDataRef(*desg)}) {
- if (auto *symbol{FindInScope(globalScope, *name)}) {
- if (!symbol->test(Symbol::Flag::OmpCriticalLock)) {
- SayWithDecl(*name, *symbol,
- "CRITICAL construct name '%s' conflicts with a previous declaration"_warn_en_US,
- name->ToString());
- }
- } else {
- name->symbol = &MakeSymbol(globalScope, name->source, Attrs{});
- name->symbol->set(Symbol::Flag::OmpCriticalLock);
- }
+ const parser::Name *name{common::visit( //
+ common::visitors{//
+ [&](const parser::Designator &x) -> const parser::Name * {
+ return parser::GetDesignatorNameIfDataRef(x);
+ },
+ [&](const parser::OmpLocator &x) -> const parser::Name * {
+ if (auto *res{std::get_if<parser::OmpReservedIdentifier>(&x.u)}) {
+ return &res->v;
+ }
+ return nullptr;
+ },
+ [&](const parser::Name &) -> const parser::Name * { return nullptr; },
+ [&](const parser::OmpObject::Invalid &) -> const parser::Name * {
+ return nullptr;
+ }},
+ object->u)};
+
+ if (name) {
+ if (auto *symbol{FindInScope(context().globalScope(), *name)}) {
+ if (!symbol->test(Symbol::Flag::OmpCriticalLock)) {
+ SayWithDecl(*name, *symbol,
+ "CRITICAL construct name '%s' conflicts with a previous declaration"_warn_en_US,
+ name->ToString());
}
+ } else {
+ name->symbol =
+ &MakeSymbol(context().globalScope(), name->source, Attrs{});
+ name->symbol->set(Symbol::Flag::OmpCriticalLock);
}
}
}
diff --git a/flang/test/Semantics/OpenMP/critical-reserved-name.f90 b/flang/test/Semantics/OpenMP/critical-reserved-name.f90
new file mode 100644
index 0000000000000..9516f0c07d7b7
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/critical-reserved-name.f90
@@ -0,0 +1,8 @@
+! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+
+subroutine f
+ !ERROR: Invalid use of a reserved name 'OMP_C'
+ !$omp critical(omp_c)
+ !ERROR: Invalid use of a reserved name 'OMP_C'
+ !$omp end critical(omp_c)
+end
diff --git a/flang/test/Semantics/OpenMP/reserved-locator.f90 b/flang/test/Semantics/OpenMP/reserved-locator.f90
index 3fc45ffa0f54c..ae2a6d59f4c74 100644
--- a/flang/test/Semantics/OpenMP/reserved-locator.f90
+++ b/flang/test/Semantics/OpenMP/reserved-locator.f90
@@ -1,6 +1,6 @@
!RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp -fopenmp-version=60
subroutine f
-!ERROR: 'OMP_SOME_MEMORY' is not a valid locator
+!ERROR: Invalid use of a reserved name 'OMP_SOME_MEMORY'
!$omp target update from(omp_some_memory)
end
More information about the flang-commits
mailing list