[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