[llvm-branch-commits] [flang] [flang][OpenMP] Move directive deprecation check to semantic checks (PR #192796)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Apr 18 08:49:24 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-semantics
Author: Krzysztof Parzyszek (kparzysz)
<details>
<summary>Changes</summary>
Replace IssueNonConformanceWarning in resolve-directives.cpp with CheckDirectiveDeprecation in check-omp-structure.cpp.
---
Full diff: https://github.com/llvm/llvm-project/pull/192796.diff
5 Files Affected:
- (modified) flang/lib/Semantics/check-omp-structure.cpp (+31)
- (modified) flang/lib/Semantics/check-omp-structure.h (+1)
- (modified) flang/lib/Semantics/resolve-directives.cpp (-59)
- (modified) flang/test/Semantics/OpenMP/clause-validity01.f90 (+2-2)
- (modified) flang/test/Semantics/OpenMP/deprecation.f90 (+6-6)
``````````diff
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index b4765bdeb009d..849c0bd876d07 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -569,6 +569,34 @@ void OmpStructureChecker::CheckDirectiveSpelling(
}
}
+void OmpStructureChecker::CheckDirectiveDeprecation(
+ const parser::OpenMPConstruct &x) {
+ parser::OmpDirectiveName dirName{GetOmpDirectiveName(x)};
+ unsigned version{context_.langOptions().OpenMPVersion};
+ // We only want to emit the warning when the version being used has the
+ // directive deprecated
+ if (version >= 52) {
+ // Check MASTER.
+ llvm::SmallVector<llvm::omp::Directive> leafs{
+ llvm::omp::getLeafConstructsOrSelf(dirName.v)};
+ if (llvm::is_contained(leafs, llvm::omp::Directive::OMPD_master)) {
+ for (auto &id : leafs) {
+ if (id == llvm::omp::Directive::OMPD_master) {
+ id = llvm::omp::Directive::OMPD_masked;
+ }
+ }
+
+ auto preferredId{llvm::omp::getCompoundConstruct(leafs)};
+ context_.Warn(common::UsageWarning::OpenMPUsage, dirName.source,
+ "OpenMP directive %s has been deprecated, please use %s instead"_warn_en_US,
+ GetUpperName(dirName.v, version), GetUpperName(preferredId, version));
+ }
+ }
+
+ // Executable allocate is checked separately because these can be nested in
+ // one another, but only the top-level directive should cause a warning.
+}
+
void OmpStructureChecker::CheckMultipleOccurrence(
semantics::UnorderedSymbolSet &listVars,
const std::list<parser::Name> &nameList, const parser::CharBlock &item,
@@ -780,6 +808,9 @@ void OmpStructureChecker::Enter(const parser::OpenMPConstruct &x) {
return CheckDirectiveSpelling(source, id);
});
parser::Walk(x, visitor);
+
+ CheckDirectiveDeprecation(x);
+
if (GetOmpDirectiveName(x).v != llvm::omp::Directive::OMPD_section) {
dirStack_.push_back(&GetOmpDirectiveSpecification(x));
}
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index 3425b9af61b4b..ab4e32858ca53 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -272,6 +272,7 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
void CheckVariableListItem(const SymbolSourceMap &symbols);
void CheckDirectiveSpelling(
parser::CharBlock spelling, llvm::omp::Directive id);
+ void CheckDirectiveDeprecation(const parser::OpenMPConstruct &x);
void AnalyzeObject(const parser::OmpObject &object);
void AnalyzeObjects(const parser::OmpObjectList &objects);
void CheckMultipleOccurrence(semantics::UnorderedSymbolSet &listVars,
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index a110607c3c72e..40e2e9f6adcd9 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -1144,8 +1144,6 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
void AddOmpRequiresToScope(Scope &,
const WithOmpDeclarative::RequiresClauses *,
const common::OmpMemoryOrderType *);
- void IssueNonConformanceWarning(llvm::omp::Directive D,
- parser::CharBlock source, unsigned EmitFromVersion);
void CreateImplicitSymbols(const parser::Name &, const Symbol *symbol);
@@ -1994,10 +1992,6 @@ bool OmpAttributeVisitor::Pre(const parser::OmpBlockConstruct &x) {
const parser::OmpDirectiveSpecification &dirSpec{x.BeginDir()};
llvm::omp::Directive dirId{dirSpec.DirId()};
PushContext(dirSpec.source, dirId);
-
- if (dirId == llvm::omp::Directive::OMPD_master ||
- dirId == llvm::omp::Directive::OMPD_parallel_master)
- IssueNonConformanceWarning(dirId, dirSpec.source, 52);
ClearDataSharingAttributeObjects();
ClearPrivateDataSharingAttributeObjects();
return true;
@@ -2019,14 +2013,6 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPLoopConstruct &x) {
const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()};
const parser::OmpDirectiveName &beginName{beginSpec.DirName()};
PushContext(beginName.source, beginName.v);
-
- if (beginName.v == llvm::omp::OMPD_master_taskloop ||
- beginName.v == llvm::omp::OMPD_master_taskloop_simd ||
- beginName.v == llvm::omp::OMPD_parallel_master_taskloop ||
- beginName.v == llvm::omp::OMPD_parallel_master_taskloop_simd) {
- unsigned version{context_.langOptions().OpenMPVersion};
- IssueNonConformanceWarning(beginName.v, beginName.source, version);
- }
ClearDataSharingAttributeObjects();
if (beginName.v == llvm::omp::Directive::OMPD_do) {
@@ -3342,51 +3328,6 @@ void OmpAttributeVisitor::AddOmpRequiresToScope(Scope &scope,
}
}
-void OmpAttributeVisitor::IssueNonConformanceWarning(llvm::omp::Directive D,
- parser::CharBlock source, unsigned EmitFromVersion) {
- std::string warnStr;
- llvm::raw_string_ostream warnStrOS(warnStr);
- unsigned version{context_.langOptions().OpenMPVersion};
- // We only want to emit the warning when the version being used has the
- // directive deprecated
- if (version < EmitFromVersion) {
- return;
- }
- warnStrOS << "OpenMP directive " << parser::omp::GetUpperName(D, version)
- << " has been deprecated";
-
- auto setAlternativeStr = [&warnStrOS](llvm::StringRef alt) {
- warnStrOS << ", please use " << alt << " instead.";
- };
- switch (D) {
- case llvm::omp::OMPD_master:
- setAlternativeStr("MASKED");
- break;
- case llvm::omp::OMPD_master_taskloop:
- setAlternativeStr("MASKED TASKLOOP");
- break;
- case llvm::omp::OMPD_master_taskloop_simd:
- setAlternativeStr("MASKED TASKLOOP SIMD");
- break;
- case llvm::omp::OMPD_parallel_master:
- setAlternativeStr("PARALLEL MASKED");
- break;
- case llvm::omp::OMPD_parallel_master_taskloop:
- setAlternativeStr("PARALLEL MASKED TASKLOOP");
- break;
- case llvm::omp::OMPD_parallel_master_taskloop_simd:
- setAlternativeStr("PARALLEL_MASKED TASKLOOP SIMD");
- break;
- case llvm::omp::OMPD_allocate:
- setAlternativeStr("ALLOCATORS");
- break;
- default:
- break;
- }
- context_.Warn(common::UsageWarning::OpenMPUsage, source, "%s"_warn_en_US,
- warnStrOS.str());
-}
-
#ifndef NDEBUG
static llvm::raw_ostream &operator<<(
diff --git a/flang/test/Semantics/OpenMP/clause-validity01.f90 b/flang/test/Semantics/OpenMP/clause-validity01.f90
index 9371a2fc6fd58..7ba40ba1f8313 100644
--- a/flang/test/Semantics/OpenMP/clause-validity01.f90
+++ b/flang/test/Semantics/OpenMP/clause-validity01.f90
@@ -483,14 +483,14 @@
! 2.13.1 master
!$omp parallel
- !WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead. [-Wopen-mp-usage]
+ !WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead [-Wopen-mp-usage]
!$omp master
a=3.14
!$omp end master
!$omp end parallel
!$omp parallel
- !WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead. [-Wopen-mp-usage]
+ !WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead [-Wopen-mp-usage]
!ERROR: NUM_THREADS clause is not allowed on the MASTER directive
!$omp master num_threads(4)
a=3.14
diff --git a/flang/test/Semantics/OpenMP/deprecation.f90 b/flang/test/Semantics/OpenMP/deprecation.f90
index 4acccb1bf4b7f..a5f71413ab9c5 100644
--- a/flang/test/Semantics/OpenMP/deprecation.f90
+++ b/flang/test/Semantics/OpenMP/deprecation.f90
@@ -4,7 +4,7 @@
subroutine test_master()
integer :: c = 1
-!WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive MASTER has been deprecated, please use MASKED instead [-Wopen-mp-usage]
!$omp master
c = c + 1
!$omp end master
@@ -12,7 +12,7 @@ subroutine test_master()
subroutine test_parallel_master
integer :: c = 2
-!WARNING: OpenMP directive PARALLEL MASTER has been deprecated, please use PARALLEL MASKED instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive PARALLEL MASTER has been deprecated, please use PARALLEL MASKED instead [-Wopen-mp-usage]
!$omp parallel master
c = c + 2
!$omp end parallel master
@@ -20,7 +20,7 @@ subroutine test_parallel_master
subroutine test_master_taskloop_simd()
integer :: i, j = 1
-!WARNING: OpenMP directive MASTER TASKLOOP SIMD has been deprecated, please use MASKED TASKLOOP SIMD instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive MASTER TASKLOOP SIMD has been deprecated, please use MASKED TASKLOOP SIMD instead [-Wopen-mp-usage]
!$omp master taskloop simd
do i=1,10
j = j + 1
@@ -30,7 +30,7 @@ subroutine test_master_taskloop_simd()
subroutine test_master_taskloop
integer :: i, j = 1
-!WARNING: OpenMP directive MASTER TASKLOOP has been deprecated, please use MASKED TASKLOOP instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive MASTER TASKLOOP has been deprecated, please use MASKED TASKLOOP instead [-Wopen-mp-usage]
!$omp master taskloop
do i=1,10
j = j + 1
@@ -40,7 +40,7 @@ subroutine test_master_taskloop
subroutine test_parallel_master_taskloop_simd
integer :: i, j = 1
-!WARNING: OpenMP directive PARALLEL MASTER TASKLOOP SIMD has been deprecated, please use PARALLEL_MASKED TASKLOOP SIMD instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive PARALLEL MASTER TASKLOOP SIMD has been deprecated, please use PARALLEL MASKED TASKLOOP SIMD instead [-Wopen-mp-usage]
!$omp parallel master taskloop simd
do i=1,10
j = j + 1
@@ -50,7 +50,7 @@ subroutine test_parallel_master_taskloop_simd
subroutine test_parallel_master_taskloop
integer :: i, j = 1
-!WARNING: OpenMP directive PARALLEL MASTER TASKLOOP has been deprecated, please use PARALLEL MASKED TASKLOOP instead. [-Wopen-mp-usage]
+!WARNING: OpenMP directive PARALLEL MASTER TASKLOOP has been deprecated, please use PARALLEL MASKED TASKLOOP instead [-Wopen-mp-usage]
!$omp parallel master taskloop
do i=1,10
j = j + 1
``````````
</details>
https://github.com/llvm/llvm-project/pull/192796
More information about the llvm-branch-commits
mailing list