[flang-commits] [flang] [flang][OpenMP] Use utility functions to get things from OmpObject (PR #206066)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Fri Jun 26 06:56:39 PDT 2026
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/206066
Instead of using std::get_if or parser::Unwrap, use utility functions. This also adds two additional functions: GetLocatorFromObj and GetCommonBlockFromObj.
>From a2924ca4ebbd7eee0da05a8269192fc0ec18dd20 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Fri, 26 Jun 2026 08:54:09 -0500
Subject: [PATCH] [flang][OpenMP] Use utility functions to get things from
OmpObject
Instead of using std::get_if or parser::Unwrap, use utility functions.
This also adds two additional functions: GetLocatorFromObj and
GetCommonBlockFromObj.
---
flang/include/flang/Parser/openmp-utils.h | 3 +++
flang/lib/Lower/OpenMP/Clauses.cpp | 6 ++---
flang/lib/Parser/openmp-utils.cpp | 12 +++++++--
flang/lib/Semantics/check-omp-structure.cpp | 27 +++++++++------------
flang/lib/Semantics/openmp-utils.cpp | 15 ++++++------
flang/lib/Semantics/resolve-directives.cpp | 2 +-
flang/lib/Semantics/resolve-names.cpp | 4 +--
7 files changed, 37 insertions(+), 32 deletions(-)
diff --git a/flang/include/flang/Parser/openmp-utils.h b/flang/include/flang/Parser/openmp-utils.h
index eab264f570122..0e3666e0dae94 100644
--- a/flang/include/flang/Parser/openmp-utils.h
+++ b/flang/include/flang/Parser/openmp-utils.h
@@ -38,6 +38,9 @@ template <typename T> constexpr auto addr_if(const std::optional<T> &x) {
const parser::Designator *GetDesignatorFromObj(const parser::OmpObject &object);
const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object);
+const parser::OmpLocator *GetLocatorFromObj(const parser::OmpObject &object);
+const parser::Name *GetCommonBlockFromObj(const parser::OmpObject &object);
+
const parser::ArrayElement *GetArrayElementFromObj(
const parser::OmpObject &object);
std::optional<parser::CharBlock> GetObjectSource(
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index 34dc6ed56b435..df0a129ff9c6f 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -141,16 +141,16 @@ Object makeObject(const parser::OmpObject &object,
semantics::SemanticsContext &semaCtx) {
// If object is a common block, expression analyzer won't be able to
// do anything.
- if (const auto *name = std::get_if<parser::Name>(&object.u)) {
+ if (const auto *name = parser::omp::GetCommonBlockFromObj(object)) {
assert(name->symbol && "Expecting Symbol");
return Object{name->symbol, std::nullopt};
}
assert(!std::holds_alternative<parser::OmpObject::Invalid>(object.u) &&
"Invalid object should have been caught in semantics");
// OmpObject is std::variant<Designator, OmpLocator, Name, Invalid>;
- if (auto *desg = std::get_if<parser::Designator>(&object.u))
+ if (auto *desg = parser::omp::GetDesignatorFromObj(object))
return makeObject(*desg, semaCtx);
- if (auto *locator = std::get_if<parser::OmpLocator>(&object.u)) {
+ if (auto *locator = parser::omp::GetLocatorFromObj(object)) {
return common::visit( //
common::visitors{
[&](const parser::OmpReservedIdentifier &x) {
diff --git a/flang/lib/Parser/openmp-utils.cpp b/flang/lib/Parser/openmp-utils.cpp
index ca563f2df892d..31ee877fd020e 100644
--- a/flang/lib/Parser/openmp-utils.cpp
+++ b/flang/lib/Parser/openmp-utils.cpp
@@ -37,6 +37,14 @@ const parser::DataRef *GetDataRefFromObj(const parser::OmpObject &object) {
return nullptr;
}
+const parser::OmpLocator *GetLocatorFromObj(const parser::OmpObject &object) {
+ return std::get_if<parser::OmpLocator>(&object.u);
+}
+
+const parser::Name *GetCommonBlockFromObj(const parser::OmpObject &object) {
+ return std::get_if<parser::Name>(&object.u);
+}
+
const parser::ArrayElement *GetArrayElementFromObj(
const parser::OmpObject &object) {
if (auto *dataRef{GetDataRefFromObj(object)}) {
@@ -52,9 +60,9 @@ std::optional<parser::CharBlock> GetObjectSource(
const parser::OmpObject &object) {
if (auto *name{std::get_if<parser::Name>(&object.u)}) {
return name->source;
- } else if (auto *desg{std::get_if<parser::Designator>(&object.u)}) {
+ } else if (auto *desg{GetDesignatorFromObj(object)}) {
return GetLastName(*desg).source;
- } else if (auto *locator{std::get_if<parser::OmpLocator>(&object.u)}) {
+ } else if (auto *locator{GetLocatorFromObj(object)}) {
return common::visit( //
common::visitors{
[](const parser::OmpReservedIdentifier &x) { return x.v.source; },
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 74ea19602d975..0189cf06ee285 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -417,7 +417,7 @@ bool OmpStructureChecker::CheckAllowedClause(llvm::omp::Clause clauseId,
}
void OmpStructureChecker::AnalyzeObject(const parser::OmpObject &object) {
- if (std::holds_alternative<parser::Name>(object.u) ||
+ if (GetCommonBlockFromObj(object) ||
std::holds_alternative<parser::OmpObject::Invalid>(object.u)) {
// Do not analyze common block names. The analyzer will flag an error
// on those.
@@ -1858,7 +1858,7 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar(
void OmpStructureChecker::Enter(const parser::OmpGroupprivateDirective &x) {
for (const parser::OmpArgument &arg : x.v.Arguments().v) {
- auto *object{std::get_if<parser::OmpObject>(&arg.u)};
+ auto *object{GetArgumentObject(arg)};
const Symbol *sym{GetArgumentSymbol(arg, /*ultimate=*/true)};
if (!object || !sym ||
@@ -3226,7 +3226,7 @@ void OmpStructureChecker::Enter(const parser::OpenMPCriticalConstruct &x) {
block, llvm::omp::Directive::OMPD_critical, beginSpec.DirName().source);
auto getNameFromArg{[](const parser::OmpArgument &arg) {
- if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
+ if (auto *object{GetArgumentObject(arg)}) {
if (auto *designator{GetDesignatorFromObj(*object)}) {
return parser::GetDesignatorNameIfDataRef(*designator);
}
@@ -4269,8 +4269,7 @@ void OmpStructureChecker::CheckReductionArraySection(
const parser::OmpObjectList &ompObjectList, llvm::omp::Clause clauseId) {
for (const auto &ompObject : ompObjectList.v) {
if (const auto *dataRef{parser::Unwrap<parser::DataRef>(ompObject)}) {
- if (const auto *arrayElement{
- parser::Unwrap<parser::ArrayElement>(ompObject)}) {
+ if (const auto *arrayElement{GetArrayElementFromObj(ompObject)}) {
CheckArraySection(*arrayElement, GetLastName(*dataRef), clauseId);
}
}
@@ -5004,20 +5003,16 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) {
}
}
for (const auto &object : objList.v) {
- if (const auto *name{std::get_if<parser::Name>(&object.u)}) {
+ if (const auto *name{GetCommonBlockFromObj(object)}) {
context_.Say(GetContext().clauseSource,
"Common block name ('%s') cannot appear in a DEPEND "
"clause"_err_en_US,
name->ToString());
- } else if (auto *designator{std::get_if<parser::Designator>(&object.u)}) {
- if (auto *dataRef{std::get_if<parser::DataRef>(&designator->u)}) {
- CheckDependList(*dataRef);
- if (const auto *arr{
- std::get_if<common::Indirection<parser::ArrayElement>>(
- &dataRef->u)}) {
- CheckArraySection(arr->value(), GetLastName(*dataRef),
- llvm::omp::Clause::OMPC_depend);
- }
+ } else if (auto *dataRef{GetDataRefFromObj(object)}) {
+ CheckDependList(*dataRef);
+ if (const auto *arr{GetArrayElementFromObj(object)}) {
+ CheckArraySection(
+ *arr, GetLastName(*dataRef), llvm::omp::Clause::OMPC_depend);
}
}
}
@@ -5194,7 +5189,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Copyin &x) {
void OmpStructureChecker::CheckStructureComponent(
const parser::OmpObject &object, llvm::omp::Clause clauseId) {
unsigned version{context_.langOptions().OpenMPVersion};
- if (auto *desg{parser::Unwrap<parser::Designator>(object)}) {
+ if (auto *desg{GetDesignatorFromObj(object)}) {
if (auto *symbol{GetLastName(*desg).symbol}) {
if (!IsTypeParamInquiry(*symbol) &&
std::holds_alternative<parser::DataRef>(desg->u)) {
diff --git a/flang/lib/Semantics/openmp-utils.cpp b/flang/lib/Semantics/openmp-utils.cpp
index ffda807c2dc32..d3e8a6dcc1fe7 100644
--- a/flang/lib/Semantics/openmp-utils.cpp
+++ b/flang/lib/Semantics/openmp-utils.cpp
@@ -140,20 +140,20 @@ static const Symbol *GetFunctionReferenceSymbol(
const Symbol *GetObjectSymbol(const parser::OmpObject &object, bool ultimate) {
// Some symbols may be missing if the resolution failed, e.g. when an
// undeclared name is used with implicit none.
- if (auto *name{std::get_if<parser::Name>(&object.u)}) {
+ if (auto *name{GetCommonBlockFromObj(object)}) {
if (ultimate) {
return name->symbol ? &name->symbol->GetUltimate() : nullptr;
} else {
return name->symbol;
}
- } else if (auto *desg{std::get_if<parser::Designator>(&object.u)}) {
+ } else if (auto *desg{GetDesignatorFromObj(object)}) {
const parser::Name &last{GetLastName(*desg)};
if (ultimate) {
return last.symbol ? &last.symbol->GetUltimate() : nullptr;
} else {
return last.symbol;
}
- } else if (auto *locator{std::get_if<parser::OmpLocator>(&object.u)}) {
+ } else if (auto *locator{GetLocatorFromObj(object)}) {
const Symbol *sym = common::visit( //
common::visitors{
[](const parser::OmpReservedIdentifier &x) { return x.v.symbol; },
@@ -261,7 +261,7 @@ bool IsExtendedListItem(
if (IsVariableListItem(object, semaCtx)) {
return true;
}
- if (!std::holds_alternative<parser::OmpLocator>(object.u)) {
+ if (!GetLocatorFromObj(object)) {
if (auto *sym{GetObjectSymbol(object, /*ultimate=*/true)}) {
return IsProcedure(*sym);
}
@@ -271,12 +271,11 @@ bool IsExtendedListItem(
bool IsLocatorListItem(
const parser::OmpObject &object, SemanticsContext *semaCtx) {
- if (IsVariableListItem(object, semaCtx) ||
- std::holds_alternative<parser::OmpLocator>(object.u)) {
+ if (IsVariableListItem(object, semaCtx) || GetLocatorFromObj(object)) {
return true;
}
// A statement function call may look like an array element access.
- if (auto *desg{parser::Unwrap<parser::Designator>(object)}) {
+ if (auto *desg{GetDesignatorFromObj(object)}) {
evaluate::ExpressionAnalyzer ea(*semaCtx);
auto restorer{ea.GetContextualMessages().DiscardMessages()};
return IsVarOrFunctionRef(ea.Analyze(*desg));
@@ -293,7 +292,7 @@ bool IsVariableListItem(
}
bool IsSubstring(const parser::OmpObject &object, SemanticsContext *semaCtx) {
- if (auto *desg{parser::Unwrap<parser::Designator>(object)}) {
+ if (auto *desg{GetDesignatorFromObj(object)}) {
evaluate::ExpressionAnalyzer ea(*semaCtx);
auto restorer{ea.GetContextualMessages().DiscardMessages()};
if (MaybeExpr expr{ea.Analyze(*desg)}) {
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 6c8f13f76a853..9370f280975ea 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -624,7 +624,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
PushContext(x.source, llvm::omp::Directive::OMPD_flush);
for (auto &arg : x.v.Arguments().v) {
if (auto *object{parser::omp::GetArgumentObject(arg)}) {
- if (auto *name{std::get_if<parser::Name>(&object->u)}) {
+ if (auto *name{parser::omp::GetCommonBlockFromObj(*object)}) {
// ResolveOmpCommonBlockName resolves the symbol as a side effect
if (!ResolveOmpCommonBlockName(name)) {
context_.Say(name->source, // 2.15.3
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index c3286035c8641..94c5a3f97474e 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -1770,7 +1770,7 @@ class OmpVisitor : public virtual DeclarationVisitor {
// Iterate over elements of x, and resolve any common blocks that
// are still unresolved.
for (const parser::OmpObject &obj : x.v) {
- auto *name{std::get_if<parser::Name>(&obj.u)};
+ auto *name{parser::omp::GetCommonBlockFromObj(obj)};
if (name && !name->symbol) {
Resolve(*name, currScope().MakeCommonBlock(name->source, name->source));
}
@@ -2195,7 +2195,7 @@ void OmpVisitor::ResolveCriticalName(const parser::OmpArgument &arg) {
llvm_unreachable("Cannot find global scope");
}()};
- if (auto *object{parser::Unwrap<parser::OmpObject>(arg.u)}) {
+ if (auto *object{parser::omp::GetArgumentObject(arg)}) {
if (auto *desg{parser::omp::GetDesignatorFromObj(*object)}) {
if (auto *name{parser::GetDesignatorNameIfDataRef(*desg)}) {
if (auto *symbol{FindInScope(globalScope, *name)}) {
More information about the flang-commits
mailing list