[flang-commits] [flang] [flang][OpenMP] Properly resolve CRITICAL construct names (PR #205904)
via flang-commits
flang-commits at lists.llvm.org
Thu Jun 25 13:10:57 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: Krzysztof Parzyszek (kparzysz)
<details>
<summary>Changes</summary>
Resolve the names of CRITICAL constructs even if they are reserved names.
Fixes https://github.com/llvm/llvm-project/issues/205855
---
Full diff: https://github.com/llvm/llvm-project/pull/205904.diff
4 Files Affected:
- (modified) flang/lib/Semantics/check-omp-structure.cpp (+6-1)
- (modified) flang/lib/Semantics/resolve-names.cpp (+31-21)
- (added) flang/test/Semantics/OpenMP/critical-reserved-name.f90 (+8)
- (modified) flang/test/Semantics/OpenMP/reserved-locator.f90 (+1-1)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/205904
More information about the flang-commits
mailing list