[llvm-branch-commits] [flang] [flang][OpenMP] Improve diagnostics about modifier properties (PR #229526)

Krzysztof Parzyszek via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Oct 6 12:49:38 PDT 2026


https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/229526

>From 57f7dee9ffb8f32d051b115afbf2a976e84854c3 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Thu, 1 Oct 2026 13:41:06 -0500
Subject: [PATCH] [flang][OpenMP] Improve diagnostics about modifier properties

Use OpenMPDeprecated and OpenMPFuture warning categories for modifier
diagnostics as well, analogously to how they are used for clauses.
---
 flang/lib/Semantics/check-omp-syntax.cpp      | 96 +++++++++++++------
 flang/test/Semantics/OpenMP/allocate_do1.f90  |  4 +-
 .../Semantics/OpenMP/clause-validity01.f90    |  2 +-
 flang/test/Semantics/OpenMP/depend05.f90      |  2 +-
 .../Semantics/OpenMP/depobj-construct-v52.f90 |  2 +-
 .../test/Semantics/OpenMP/from-clause-v45.f90 |  6 +-
 .../test/Semantics/OpenMP/linear-clause02.f90 |  2 +-
 .../Semantics/OpenMP/map-modifiers-v60.f90    |  8 +-
 flang/test/Semantics/OpenMP/task-depend.f90   |  2 +-
 flang/test/Semantics/OpenMP/to-clause-v45.f90 |  6 +-
 .../OpenMP/uses-allocators-version50.f90      |  6 +-
 .../OpenMP/uses-allocators-version51.f90      |  4 +-
 12 files changed, 88 insertions(+), 52 deletions(-)

diff --git a/flang/lib/Semantics/check-omp-syntax.cpp b/flang/lib/Semantics/check-omp-syntax.cpp
index 429c4e74d2acd0..37585d3a0e5389 100644
--- a/flang/lib/Semantics/check-omp-syntax.cpp
+++ b/flang/lib/Semantics/check-omp-syntax.cpp
@@ -19,6 +19,7 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SetVector.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/Frontend/Directive/Spelling.h"
 #include "llvm/Frontend/OpenMP/OMP.h"
 #include "llvm/Frontend/OpenMP/OMPDescriptors.h"
@@ -52,6 +53,42 @@ static llvm::omp::Version GetClosestVersion(
   return llvm::omp::Version();
 }
 
+static llvm::omp::Version NextVersion(llvm::omp::Version version) {
+  auto versions{llvm::omp::getOpenMPVersions()};
+  for (auto [idx, ver] : llvm::enumerate(versions)) {
+    if (ver == version && idx + 1 < versions.size()) {
+      return versions[idx + 1];
+    }
+  }
+  return llvm::omp::Version();
+}
+
+static std::string EnumSetToString(
+    llvm::omp::Modifiers set, llvm::omp::Version version) {
+  llvm::SmallVector<std::string> names;
+  for (llvm::omp::Modifier m : set) {
+    names.emplace_back(llvm::omp::getDescriptor(m).getName().str());
+  }
+  if (names.size() == 1) {
+    return names.front();
+  }
+  return llvm::join(llvm::ArrayRef(names).drop_back(), ", ") + " or " +
+      names.back();
+}
+
+static std::string OneOfModifiers(
+    llvm::omp::ModifierSet set, llvm::omp::Version version) {
+  auto &sdesc{llvm::omp::getDescriptor(set)};
+  llvm::omp::Modifiers members{sdesc.getModifiers(version)};
+
+  if (size_t count{members.size()}; count == 1) {
+    return EnumSetToString(members, version) + " modifier";
+  } else if (count > 1) {
+    return "One of " + EnumSetToString(members, version) + " modifiers";
+  }
+  return "";
+}
+
 template < //
     typename ElemTy, typename SetsSetTy, typename OwnerTy,
     typename ResultTy = llvm::DenseMap<ElemTy,
@@ -179,13 +216,13 @@ static ResultTy VerifyExclusive(
 
 template < //
     typename ElemTy, typename SetsSetTy, typename OwnerTy,
+    typename SetTy = typename SetsSetTy::value_type,
     typename ResultTy = llvm::DenseMap<ElemTy,
-        std::tuple<ElemTy, parser::CharBlock, parser::CharBlock>>>
+        std::tuple<ElemTy, SetTy, parser::CharBlock, parser::CharBlock>>>
 static ResultTy VerifyMutuallyExclusive(
     const AppliedElementInfo<ElemTy, SetsSetTy> &info, OwnerTy ownerId,
     llvm::omp::Version version) {
   using AppliedElementTy = AppliedElement<ElemTy, SetsSetTy>;
-  using SetTy = typename SetsSetTy::value_type;
 
   ResultTy result;
 
@@ -235,7 +272,7 @@ static ResultTy VerifyMutuallyExclusive(
           const AppliedElementTy *prev{where->second};
           if (prev->id.value != elem.id.value) {
             result.insert({elem.id.value,
-                {prev->id.value, elem.id.source, prev->id.source}});
+                {prev->id.value, s, elem.id.source, prev->id.source}});
             // Stop version traversal.
             break;
           }
@@ -294,25 +331,27 @@ bool OmpStructureChecker::VerifyModifierVersion(
   auto result = VerifyVersions(info, clause.value, version);
 
   for (auto &[m, svr] : result) {
-    std::string modName{llvm::omp::getDescriptor(m).getName().str()};
+    std::string modName{llvm::omp::getDescriptor(m).getName()};
     std::string clauseName{GetUpperName(clause.value, version)};
     llvm::omp::Version since(svr.second.Min);
     llvm::omp::Version until(svr.second.Max);
 
     if (since == ~0u && until == 0u) {
-      // This shouldn't really happen, but have it just in case.
+      // This shouldn't really happen because the set of allowed modifiers
+      // is specified in the AST node for the clause, but have this check
+      // just to cover all bases.
       context_.Say(svr.first,
-          "'%s' modifier is not supported on %s clause"_err_en_US, modName,
+          "'%s' modifier is not allowed on %s clause"_err_en_US, modName,
           clauseName);
     } else if (since != ~0u && version < since) {
-      context_.Say(svr.first,
-          "'%s' modifier is not supported on %s clause in %s, %s"_warn_en_US,
+      context_.Warn(common::UsageWarning::OpenMPFuture, svr.first,
+          "'%s' modifier is not allowed on %s clause in %s, %s"_warn_en_US,
           modName, clauseName, omp::ThisVersion(version),
           omp::TryVersion(since));
     } else if (until != 0u && version > until) {
-      context_.Say(svr.first,
-          "'%s' modifier is no longer supported on %s clause in %s"_warn_en_US,
-          modName, clauseName, omp::ThisVersion(version));
+      context_.Warn(common::UsageWarning::OpenMPDeprecated, svr.first,
+          "'%s' modifier is no longer allowed on %s clause since %s"_warn_en_US,
+          modName, clauseName, omp::ThisVersion(NextVersion(until)));
     }
   }
 
@@ -331,18 +370,8 @@ bool OmpStructureChecker::VerifyModifierRequired(
         clause.source, "'%s' modifier is required"_err_en_US, mdesc.getName());
   }
   for (llvm::omp::ModifierSet s : result.second) {
-    auto &sdesc{llvm::omp::getDescriptor(s)};
-    // If the group is required, at least one modifier from that group must
-    // be present.
-    if (llvm::omp::isModifierGroup(s)) {
-      context_.Say(clause.source,
-          "modifier from '%s' modifier group is required"_err_en_US,
-          sdesc.getName());
-    } else {
-      context_.Say(clause.source,
-          "modifier from the modifier set on %s clause is required"_err_en_US,
-          GetUpperName(clause.value, version));
-    }
+    context_.Say(clause.source, "%s is required on %s clause"_err_en_US,
+        OneOfModifiers(s, version), GetUpperName(clause.value, version));
   }
 
   return result.first.empty() && result.second.empty();
@@ -357,9 +386,10 @@ bool OmpStructureChecker::VerifyModifierUnique(
   for (auto [id, where] : result) {
     auto &mdesc{llvm::omp::getDescriptor(id)};
     context_
-        .Say(where.first, "'%s' modifier cannot occur multiple times"_err_en_US,
+        .Say(where.second,
+            "'%s' modifier cannot occur multiple times"_err_en_US,
             mdesc.getName())
-        .Attach(where.second, "previous occurrence of this modifier"_en_US);
+        .Attach(where.first, "previous occurrence of this modifier"_en_US);
   }
 
   return result.empty();
@@ -375,7 +405,7 @@ bool OmpStructureChecker::VerifyModifierExclusive(
     auto [otherId, source, otherSource] = wrong;
     context_
         .Say(source,
-            "An exclusive '%s' modifier cannot be specified together with a modifier of a different type"_err_en_US,
+            "'%s' modifier cannot be specified together with a modifier of a different type"_err_en_US,
             llvm::omp::getDescriptor(id).getName())
         .Attach(otherSource, "'%s' provided here"_en_US,
             llvm::omp::getDescriptor(otherId).getName());
@@ -384,12 +414,17 @@ bool OmpStructureChecker::VerifyModifierExclusive(
   auto resultMut = VerifyMutuallyExclusive(info, clause.value, version);
 
   for (auto [id, wrong] : resultMut) {
-    auto [otherId, source, otherSource] = wrong;
-    auto thisName{llvm::omp::getDescriptor(id).getName().str()};
+    auto [otherId, setId, source, otherSource] = wrong;
+    auto thisName{llvm::omp::getDescriptor(id).getName()};
+    std::string annot;
+    if (llvm::omp::isModifierGroup(setId)) {
+      auto &sdesc{llvm::omp::getDescriptor(setId)};
+      annot = " as members of '" + sdesc.getName().str() + "' modifier group";
+    }
     context_
         .Say(otherSource,
-            "The '%s' and '%s' modifiers are mutually exclusive"_err_en_US,
-            llvm::omp::getDescriptor(otherId).getName(), thisName)
+            "'%s' and '%s' modifiers are mutually exclusive%s"_err_en_US,
+            llvm::omp::getDescriptor(otherId).getName(), thisName, annot)
         .Attach(source, "'%s' modifier specified here"_en_US, thisName);
   }
 
@@ -427,6 +462,7 @@ template <typename UnionTy>
 AppliedModifierInfo GetAppliedModifiers(llvm::omp::Clause clauseId,
     llvm::omp::Version version,
     const std::optional<std::list<UnionTy>> &modifiers) {
+  using AppliedModifier = AppliedModifierInfo::ElementTy;
   AppliedModifierInfo info;
   if (modifiers) {
     auto cdesc{llvm::omp::getDescriptor(clauseId)};
diff --git a/flang/test/Semantics/OpenMP/allocate_do1.f90 b/flang/test/Semantics/OpenMP/allocate_do1.f90
index 6f5e4355af86c6..0fd6f9d0f30727 100644
--- a/flang/test/Semantics/OpenMP/allocate_do1.f90
+++ b/flang/test/Semantics/OpenMP/allocate_do1.f90
@@ -22,7 +22,7 @@ subroutine test_omp_do()
     use all_mod
     !$omp parallel shared(AAA,BBB,CCC,DDD,val)
     !ERROR: ALLOCATE clause is not allowed on DO directive in OpenMP v4.5, try -fopenmp-version=50 [-Wopenmp-future]
-    !ERROR: 'allocator-simple-modifier' modifier is not supported on ALLOCATE clause in OpenMP v4.5, try -fopenmp-version=50
+    !ERROR: 'allocator-simple-modifier' modifier is not allowed on ALLOCATE clause in OpenMP v4.5, try -fopenmp-version=50 [-Wopenmp-future]
     !$omp do private(CCC, val) allocate(0:CCC, val)
     do i=1,N
         CCC(i) = AAA(i) + BBB(i)
@@ -36,7 +36,7 @@ end subroutine test_omp_do
 subroutine test_omp_parallel_do()
     use all_mod
     !ERROR: ALLOCATE clause is not allowed on PARALLEL DO directive in OpenMP v4.5, try -fopenmp-version=50 [-Wopenmp-future]
-    !ERROR: 'allocator-simple-modifier' modifier is not supported on ALLOCATE clause in OpenMP v4.5, try -fopenmp-version=50
+    !ERROR: 'allocator-simple-modifier' modifier is not allowed on ALLOCATE clause in OpenMP v4.5, try -fopenmp-version=50 [-Wopenmp-future]
     !$omp parallel do private(CCC, val) allocate(0:CCC, val) shared(AAA,BBB,DDD)
     do i=1,N
         CCC(i) = AAA(i) + BBB(i)
diff --git a/flang/test/Semantics/OpenMP/clause-validity01.f90 b/flang/test/Semantics/OpenMP/clause-validity01.f90
index a01f0cff43ccf3..62c45818822c68 100644
--- a/flang/test/Semantics/OpenMP/clause-validity01.f90
+++ b/flang/test/Semantics/OpenMP/clause-validity01.f90
@@ -509,7 +509,7 @@
   !$omp taskwait depend(mutexinoutset: x)
   !ERROR: 'task-dependence-type' modifier is required
   !ERROR: The SINK and SOURCE dependence types can only be used with the ORDERED directive, used here in the TASKWAIT construct
-  !WARNING: 'dependence-type' modifier is no longer supported on DEPEND clause in OpenMP v5.2
+  !WARNING: 'dependence-type' modifier is no longer allowed on DEPEND clause since OpenMP v5.2 [-Wopenmp-deprecated]
   !$omp taskwait depend(source)
   ! !$omp taskwait depend(sink:i-1)
   ! !$omp target enter data map(to:arrayA) map(alloc:arrayB)
diff --git a/flang/test/Semantics/OpenMP/depend05.f90 b/flang/test/Semantics/OpenMP/depend05.f90
index 7cbe6c24089b11..aa579fb0058642 100644
--- a/flang/test/Semantics/OpenMP/depend05.f90
+++ b/flang/test/Semantics/OpenMP/depend05.f90
@@ -2,7 +2,7 @@
 
 subroutine f00(x)
   integer :: x(10)
-!WARNING: 'iterator' modifier is not supported on DEPEND clause in OpenMP v4.5, try -fopenmp-version=50
+!WARNING: 'iterator' modifier is not allowed on DEPEND clause in OpenMP v4.5, try -fopenmp-version=50 [-Wopenmp-future]
   !$omp task depend(iterator(i = 1:10), in: x(i))
   x = 0
   !$omp end task
diff --git a/flang/test/Semantics/OpenMP/depobj-construct-v52.f90 b/flang/test/Semantics/OpenMP/depobj-construct-v52.f90
index 37bd6191f215ef..6d59d98568ab5a 100644
--- a/flang/test/Semantics/OpenMP/depobj-construct-v52.f90
+++ b/flang/test/Semantics/OpenMP/depobj-construct-v52.f90
@@ -3,7 +3,7 @@
 subroutine f00
   integer :: obj
 !ERROR: 'task-dependence-type' modifier is required
-!WARNING: 'dependence-type' modifier is no longer supported on DEPEND clause in OpenMP v5.2
+!WARNING: 'dependence-type' modifier is no longer allowed on DEPEND clause since OpenMP v5.2 [-Wopenmp-deprecated]
 !ERROR: A DEPEND clause on a DEPOBJ construct must not have SINK or SOURCE as dependence type
   !$omp depobj(obj) depend(source)
 end
diff --git a/flang/test/Semantics/OpenMP/from-clause-v45.f90 b/flang/test/Semantics/OpenMP/from-clause-v45.f90
index 35787f872ea898..fcd9158e4adfb1 100644
--- a/flang/test/Semantics/OpenMP/from-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/from-clause-v45.f90
@@ -8,14 +8,14 @@ subroutine f00(x)
 
 subroutine f01(x)
   integer :: x(10)
-!WARNING: 'iterator' modifier is not supported on FROM clause in OpenMP v4.5, try -fopenmp-version=51
+!WARNING: 'iterator' modifier is not allowed on FROM clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
   !$omp target update from(iterator(i = 1:5): x(i))
 end
 
 subroutine f02(x)
   integer :: x(10)
-!WARNING: 'motion-modifier' modifier is not supported on FROM clause in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'iterator' modifier is not supported on FROM clause in OpenMP v4.5, try -fopenmp-version=51
+!WARNING: 'motion-modifier' modifier is not allowed on FROM clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
+!WARNING: 'iterator' modifier is not allowed on FROM clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
   !$omp target update from(present, iterator(i = 1:5): x(i))
 end
 
diff --git a/flang/test/Semantics/OpenMP/linear-clause02.f90 b/flang/test/Semantics/OpenMP/linear-clause02.f90
index e6eedbcae7c92c..16c470646a3463 100644
--- a/flang/test/Semantics/OpenMP/linear-clause02.f90
+++ b/flang/test/Semantics/OpenMP/linear-clause02.f90
@@ -9,7 +9,7 @@ subroutine f00(x)
 subroutine f01(x)
   integer :: x
   !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
-  !ERROR: An exclusive 'step-simple-modifier' modifier cannot be specified together with a modifier of a different type
+  !ERROR: 'step-simple-modifier' modifier cannot be specified together with a modifier of a different type
   !$omp declare simd linear(uval(x) : 2)
 end
 
diff --git a/flang/test/Semantics/OpenMP/map-modifiers-v60.f90 b/flang/test/Semantics/OpenMP/map-modifiers-v60.f90
index 00fd524ab12a9a..0599034467c8da 100644
--- a/flang/test/Semantics/OpenMP/map-modifiers-v60.f90
+++ b/flang/test/Semantics/OpenMP/map-modifiers-v60.f90
@@ -2,7 +2,7 @@
 
 subroutine f00(x)
   integer :: x
-!WARNING: 'self-modifier' modifier is not supported on MAP clause in OpenMP v5.2, try -fopenmp-version=60
+!WARNING: 'self-modifier' modifier is not allowed on MAP clause in OpenMP v5.2, try -fopenmp-version=60 [-Wopenmp-future]
   !$omp target map(self: x)
   x = x + 1
   !$omp end target
@@ -10,7 +10,7 @@ subroutine f00(x)
 
 subroutine f01(x)
   integer, pointer :: x
-!WARNING: 'ref-modifier' modifier is not supported on MAP clause in OpenMP v5.2, try -fopenmp-version=60
+!WARNING: 'ref-modifier' modifier is not allowed on MAP clause in OpenMP v5.2, try -fopenmp-version=60 [-Wopenmp-future]
   !$omp target map(ref_ptr: x)
   x = x + 1
   !$omp end target
@@ -18,7 +18,7 @@ subroutine f01(x)
 
 subroutine f02(x)
   integer, pointer :: x
-!WARNING: 'ref-modifier' modifier is not supported on MAP clause in OpenMP v5.2, try -fopenmp-version=60
+!WARNING: 'ref-modifier' modifier is not allowed on MAP clause in OpenMP v5.2, try -fopenmp-version=60 [-Wopenmp-future]
   !$omp target map(ref_ptee: x)
   x = x + 1
   !$omp end target
@@ -26,7 +26,7 @@ subroutine f02(x)
 
 subroutine f03(x)
   integer, pointer :: x
-!WARNING: 'ref-modifier' modifier is not supported on MAP clause in OpenMP v5.2, try -fopenmp-version=60
+!WARNING: 'ref-modifier' modifier is not allowed on MAP clause in OpenMP v5.2, try -fopenmp-version=60 [-Wopenmp-future]
   !$omp target map(ref_ptr_ptee: x)
   x = x + 1
   !$omp end target
diff --git a/flang/test/Semantics/OpenMP/task-depend.f90 b/flang/test/Semantics/OpenMP/task-depend.f90
index def3e2cf24c0c3..51cadf17b8001a 100644
--- a/flang/test/Semantics/OpenMP/task-depend.f90
+++ b/flang/test/Semantics/OpenMP/task-depend.f90
@@ -1,7 +1,7 @@
 ! RUN: %python %S/../test_errors.py %s %flang -fopenmp
 
 program test
-! ERROR: modifier from the modifier set on DEPEND clause is required
+! ERROR: One of dependence-type or task-dependence-type modifiers is required on DEPEND clause
 ! ERROR: A DEPEND clause on a TASK construct must have a valid task dependence type
 !$omp task depend(ii)
 !$omp end task
diff --git a/flang/test/Semantics/OpenMP/to-clause-v45.f90 b/flang/test/Semantics/OpenMP/to-clause-v45.f90
index b336005699377f..9e6b1790dc9cca 100644
--- a/flang/test/Semantics/OpenMP/to-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/to-clause-v45.f90
@@ -8,14 +8,14 @@ subroutine f00(x)
 
 subroutine f01(x)
   integer :: x(10)
-!WARNING: 'iterator' modifier is not supported on TO clause in OpenMP v4.5, try -fopenmp-version=51
+!WARNING: 'iterator' modifier is not allowed on TO clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
   !$omp target update to(iterator(i = 1:5): x(i))
 end
 
 subroutine f02(x)
   integer :: x(10)
-!WARNING: 'motion-modifier' modifier is not supported on TO clause in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'iterator' modifier is not supported on TO clause in OpenMP v4.5, try -fopenmp-version=51
+!WARNING: 'motion-modifier' modifier is not allowed on TO clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
+!WARNING: 'iterator' modifier is not allowed on TO clause in OpenMP v4.5, try -fopenmp-version=51 [-Wopenmp-future]
   !$omp target update to(present, iterator(i = 1:5): x(i))
 end
 
diff --git a/flang/test/Semantics/OpenMP/uses-allocators-version50.f90 b/flang/test/Semantics/OpenMP/uses-allocators-version50.f90
index 2bc3a07859682d..74f5856b841390 100644
--- a/flang/test/Semantics/OpenMP/uses-allocators-version50.f90
+++ b/flang/test/Semantics/OpenMP/uses-allocators-version50.f90
@@ -33,20 +33,20 @@ subroutine uses_allocators_50
   x = 3
   !$omp end target
 
-  !WARNING: 'traits-array' modifier is not supported on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52
+  !WARNING: 'traits-array' modifier is not allowed on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52 [-Wopenmp-future]
   !$omp target uses_allocators(traits(tr): my_alloc)
   x = 4
   !$omp end target
 
   ! Accepting the newer syntax with a warning does not skip the remaining
   ! checks on the specification.
-  !WARNING: 'traits-array' modifier is not supported on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52
+  !WARNING: 'traits-array' modifier is not allowed on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52 [-Wopenmp-future]
   !ERROR: The traits array must be a named constant array
   !$omp target uses_allocators(traits(1): my_alloc)
   x = 5
   !$omp end target
 
-  !WARNING: 'mem-space' modifier is not supported on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52
+  !WARNING: 'mem-space' modifier is not allowed on USES_ALLOCATORS clause in OpenMP v5.0, try -fopenmp-version=52 [-Wopenmp-future]
   !ERROR: A non-predefined allocator 'my_alloc' in a USES_ALLOCATORS clause must have traits specified in OpenMP v5.0
   !$omp target uses_allocators(memspace(omp_default_mem_space): my_alloc)
   x = 6
diff --git a/flang/test/Semantics/OpenMP/uses-allocators-version51.f90 b/flang/test/Semantics/OpenMP/uses-allocators-version51.f90
index 01e1b01ed36bce..dd5c40e5f899c8 100644
--- a/flang/test/Semantics/OpenMP/uses-allocators-version51.f90
+++ b/flang/test/Semantics/OpenMP/uses-allocators-version51.f90
@@ -27,14 +27,14 @@ subroutine uses_allocators_51
   x = 2
   !$omp end target
 
-  !WARNING: 'traits-array' modifier is not supported on USES_ALLOCATORS clause in OpenMP v5.1, try -fopenmp-version=52
+  !WARNING: 'traits-array' modifier is not allowed on USES_ALLOCATORS clause in OpenMP v5.1, try -fopenmp-version=52 [-Wopenmp-future]
   !$omp target uses_allocators(traits(tr): my_alloc)
   x = 3
   !$omp end target
 
   ! Accepting the newer syntax with a warning does not skip the remaining
   ! checks on the specification.
-  !WARNING: 'traits-array' modifier is not supported on USES_ALLOCATORS clause in OpenMP v5.1, try -fopenmp-version=52
+  !WARNING: 'traits-array' modifier is not allowed on USES_ALLOCATORS clause in OpenMP v5.1, try -fopenmp-version=52 [-Wopenmp-future]
   !ERROR: The traits array must be a named constant array
   !$omp target uses_allocators(traits(1): my_alloc)
   x = 4



More information about the llvm-branch-commits mailing list