[flang-commits] [flang] [flang][OpenMP] Simplify checks for type-parameter inquiry (PR #198217)
Krzysztof Parzyszek via flang-commits
flang-commits at lists.llvm.org
Mon May 18 04:47:05 PDT 2026
https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/198217
>From e557242fda964fae6f6278732c352b5d4ca4caab Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Sat, 16 May 2026 17:30:03 -0500
Subject: [PATCH] [flang][OpenMP] Simplify checks for type-parameter inquiry
Remove the no longer needed IsDataRefTypeParamInquiry.
---
flang/lib/Semantics/check-omp-structure.cpp | 70 +++++++--------------
flang/lib/Semantics/check-omp-structure.h | 3 +-
2 files changed, 25 insertions(+), 48 deletions(-)
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 505643fa617f1..5bda1832eff59 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -3929,8 +3929,8 @@ void OmpStructureChecker::CheckReductionObjects(
}
// Type parameter inquiries are not allowed.
for (const parser::OmpObject &object : objects.v) {
- if (auto *dataRef{GetDataRefFromObj(object)}) {
- if (IsDataRefTypeParamInquiry(dataRef)) {
+ if (auto *symbol{GetObjectSymbol(object)}) {
+ if (IsTypeParamInquiry(*symbol)) {
auto source{GetObjectSource(object)};
context_.Say(source ? *source : GetContext().clauseSource,
"Type parameter inquiry is not permitted in %s clause"_err_en_US,
@@ -4231,26 +4231,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Nowait &x) {
CheckAllowedClause(llvm::omp::Clause::OMPC_nowait);
}
-bool OmpStructureChecker::IsDataRefTypeParamInquiry(
- const parser::DataRef *dataRef) {
- bool dataRefIsTypeParamInquiry{false};
- if (const auto *structComp{
- parser::Unwrap<parser::StructureComponent>(dataRef)}) {
- if (const auto *compSymbol{structComp->Component().symbol}) {
- if (const auto *compSymbolMiscDetails{
- std::get_if<MiscDetails>(&compSymbol->details())}) {
- const auto detailsKind = compSymbolMiscDetails->kind();
- dataRefIsTypeParamInquiry =
- (detailsKind == MiscDetails::Kind::KindParamInquiry ||
- detailsKind == MiscDetails::Kind::LenParamInquiry);
- } else if (compSymbol->has<TypeParamDetails>()) {
- dataRefIsTypeParamInquiry = true;
- }
- }
- }
- return dataRefIsTypeParamInquiry;
-}
-
void OmpStructureChecker::CheckVarIsNotPartOfAnotherVar(
const parser::CharBlock &source, const parser::OmpObjectList &objList,
llvm::StringRef clause) {
@@ -4265,14 +4245,13 @@ void OmpStructureChecker::CheckVarIsNotPartOfAnotherVar(
common::visit(
common::visitors{
[&](const parser::Designator &designator) {
- if (const auto *dataRef{
- std::get_if<parser::DataRef>(&designator.u)}) {
- if (IsDataRefTypeParamInquiry(dataRef)) {
- context_.Say(source,
- "A type parameter inquiry cannot appear on the %s directive"_err_en_US,
- ContextDirectiveAsFortran());
- } else if (parser::Unwrap<parser::StructureComponent>(
- ompObject) ||
+ if (auto *symbol{GetLastName(designator).symbol};
+ symbol && IsTypeParamInquiry(*symbol)) {
+ context_.Say(source,
+ "A type parameter inquiry cannot appear on the %s directive"_err_en_US,
+ ContextDirectiveAsFortran());
+ } else if (std::holds_alternative<parser::DataRef>(designator.u)) {
+ if (parser::Unwrap<parser::StructureComponent>(ompObject) ||
parser::Unwrap<parser::ArrayElement>(ompObject)) {
if (llvm::omp::nonPartialVarSet.test(GetContext().directive)) {
context_.Say(source,
@@ -5023,32 +5002,29 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Copyin &x) {
}
void OmpStructureChecker::CheckStructureComponent(
- const parser::OmpObjectList &objects, llvm::omp::Clause clauseId) {
+ const parser::OmpObject &object, llvm::omp::Clause clauseId) {
unsigned version{context_.langOptions().OpenMPVersion};
-
- auto CheckComponent{[&](const parser::Designator &designator) {
- if (const parser::DataRef *dataRef{
- std::get_if<parser::DataRef>(&designator.u)}) {
- if (!IsDataRefTypeParamInquiry(dataRef)) {
+ if (auto *desg{parser::Unwrap<parser::Designator>(object)}) {
+ if (auto *symbol{GetLastName(*desg).symbol}) {
+ if (!IsTypeParamInquiry(*symbol) &&
+ std::holds_alternative<parser::DataRef>(desg->u)) {
evaluate::ExpressionAnalyzer ea{context_};
auto restore{ea.AllowWholeAssumedSizeArray(true)};
- const auto expr{ea.Analyze(designator)};
- if (expr.has_value() && evaluate::HasStructureComponent(expr.value())) {
- context_.Say(designator.source,
+ MaybeExpr expr{ea.Analyze(*desg)};
+ if (expr && evaluate::HasStructureComponent(*expr)) {
+ context_.Say(desg->source,
"A variable that is part of another variable cannot appear on the %s clause"_err_en_US,
parser::omp::GetUpperName(clauseId, version));
}
}
}
- }};
+ }
+}
- for (const auto &object : objects.v) {
- common::visit(common::visitors{
- CheckComponent,
- [&](const parser::Name &name) {},
- [&](const parser::OmpObject::Invalid &invalid) {},
- },
- object.u);
+void OmpStructureChecker::CheckStructureComponent(
+ const parser::OmpObjectList &objects, llvm::omp::Clause clauseId) {
+ for (const parser::OmpObject &object : objects.v) {
+ CheckStructureComponent(object, clauseId);
}
}
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index ac3332f9a52ba..a7cf3a32561b3 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -301,6 +301,8 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
const std::list<parser::Name> &nameList, const parser::CharBlock &item,
const std::string &clauseName);
void CheckMultListItems();
+ void CheckStructureComponent(
+ const parser::OmpObject &object, llvm::omp::Clause clauseId);
void CheckStructureComponent(
const parser::OmpObjectList &objects, llvm::omp::Clause clauseId);
bool HasInvalidWorksharingNesting(
@@ -328,7 +330,6 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
void CheckDoacross(const parser::OmpDoacross &doa);
void CheckDimsModifier(parser::CharBlock source, size_t numValues,
const parser::OmpDimsModifier &x);
- bool IsDataRefTypeParamInquiry(const parser::DataRef *dataRef);
void CheckVarIsNotPartOfAnotherVar(const parser::CharBlock &source,
const parser::OmpObject &obj, llvm::StringRef clause = "");
void CheckVarIsNotPartOfAnotherVar(const parser::CharBlock &source,
More information about the flang-commits
mailing list