[flang-commits] [flang] 5113f6d - [flang][OpenMP] Properly resolve CRITICAL construct names (#205904)
via flang-commits
flang-commits at lists.llvm.org
Fri Jun 26 09:45:55 PDT 2026
Author: Krzysztof Parzyszek
Date: 2026-06-26T11:45:50-05:00
New Revision: 5113f6dff01797f2ae9d04ad39e1c273d4621cf2
URL: https://github.com/llvm/llvm-project/commit/5113f6dff01797f2ae9d04ad39e1c273d4621cf2
DIFF: https://github.com/llvm/llvm-project/commit/5113f6dff01797f2ae9d04ad39e1c273d4621cf2.diff
LOG: [flang][OpenMP] Properly resolve CRITICAL construct names (#205904)
Resolve the names of CRITICAL constructs even if they are reserved
names.
This also limits locator parsing to known reserved names.
Fixes https://github.com/llvm/llvm-project/issues/205855
Added:
Modified:
flang/lib/Parser/openmp-parsers.cpp
flang/lib/Semantics/check-omp-structure.cpp
flang/lib/Semantics/check-omp-structure.h
flang/lib/Semantics/resolve-names.cpp
Removed:
flang/test/Semantics/OpenMP/reserved-locator.f90
################################################################################
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 8a18bcc9e4485..1957c7c5947cd 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -290,10 +290,27 @@ static bool IsReservedName(const Name &name) {
TYPE_PARSER( //
construct<OmpReservedIdentifier>(predicated(name, IsReservedName)))
-// Parse x(...)(...) as a substring instead of a function reference.
-TYPE_PARSER( //
- construct<OmpLocator>(functionReference / !lookAhead("("_tok)) ||
- construct<OmpLocator>(Parser<OmpReservedIdentifier>{}))
+struct LocatorParser {
+ using resultType = OmpLocator;
+ using Token = TokenStringMatch<false, false>;
+
+ std::optional<resultType> Parse(ParseState &state) const {
+ // Parse x(...)(...) as a substring instead of a function reference.
+ auto funcRef{functionReference / !lookAhead("("_tok)};
+ if (auto &&result{attempt(funcRef).Parse(state)}) {
+ return std::move(*result);
+ }
+ for (llvm::StringRef n : llvm::omp::getReservedLocatorNames()) {
+ auto match{Token(n.data(), n.size())};
+ if (auto &&result{attempt(match >= name).Parse(state)}) {
+ return OmpReservedIdentifier(std::move(*result));
+ }
+ }
+ return std::nullopt;
+ }
+};
+
+TYPE_PARSER(construct<OmpLocator>(LocatorParser{}))
TYPE_PARSER( //
construct<OmpObject>(Parser<OmpLocator>{}) ||
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 74ea19602d975..faced12ae92ac 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -649,16 +649,6 @@ bool OmpStructureChecker::HasRequires(llvm::omp::Clause req) {
DEREF(unit.symbol()).details());
}
-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,
- parser::ToUpperCaseLetters(name));
- }
- }
-}
-
void OmpStructureChecker::CheckArgumentObjectKind(const parser::OmpClause &x) {
unsigned version{context_.langOptions().OpenMPVersion};
llvm::omp::Directive dirId{GetContext().directive};
@@ -3229,6 +3219,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/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index f275717135874..011b29d370ba3 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -128,7 +128,6 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
void Enter(const parser::OpenMPCriticalConstruct &);
void Enter(const parser::OpenMPAtomicConstruct &);
- void Enter(const parser::OmpLocator &x);
void Enter(const parser::OmpClauseList &);
void Leave(const parser::OmpClauseList &);
void Enter(const parser::OmpClause &);
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index c3286035c8641..f497cd50f9c42 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -2186,29 +2186,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/reserved-locator.f90 b/flang/test/Semantics/OpenMP/reserved-locator.f90
deleted file mode 100644
index 3fc45ffa0f54c..0000000000000
--- a/flang/test/Semantics/OpenMP/reserved-locator.f90
+++ /dev/null
@@ -1,6 +0,0 @@
-!RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp -fopenmp-version=60
-
-subroutine f
-!ERROR: 'OMP_SOME_MEMORY' is not a valid locator
- !$omp target update from(omp_some_memory)
-end
More information about the flang-commits
mailing list