[flang-commits] [flang] [llvm] [OpenMP] Preview of auto-generating OpenMP definitions (PR #214244)

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Wed Aug 5 07:56:38 PDT 2026


https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/214244

The components of this commit:
1. Definitions of descriptors that will hold relevant data in LLVM and declarations of associated functions.
2. "Auto-generated" enum definitions and descriptor data
3. Changes to flang's modifier verification to use the new data instead of the previously hand-coded modifier information.

This does not contain the actual auto-generation infrastructure. The included descriptors were generated directly from JSON files by a custom python script.

>From 1be02682ca590eb05c051413276adc32219a09bd Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Tue, 28 Jul 2026 07:51:41 -0500
Subject: [PATCH] [OpenMP] Preview of auto-generating OpenMP definitions

The components of this commit:
1. Definitions of descriptors that will hold relevant data in LLVM
   and declarations of associated functions.
2. "Auto-generated" enum definitions and descriptor data
3. Changes to flang's modifier verification to use the new data
   instead of the previously hand-coded modifier information.

This does not contain the actual auto-generation infrastructure.
The included descriptors were generated directly from JSON files by
a custom python script.
---
 .../flang/Semantics/openmp-modifiers.h        |  251 +-
 flang/lib/Semantics/CMakeLists.txt            |    1 -
 flang/lib/Semantics/check-omp-loop.cpp        |    8 +-
 flang/lib/Semantics/check-omp-structure.cpp   |   33 +-
 flang/lib/Semantics/openmp-modifiers.cpp      |  791 --
 flang/test/Parser/OpenMP/map-modifiers.f90    |   29 +-
 .../Semantics/OpenMP/allocate-clause01.f90    |    2 +-
 .../test/Semantics/OpenMP/device-clause01.f90 |    2 +-
 .../test/Semantics/OpenMP/from-clause-v45.f90 |    8 -
 .../test/Semantics/OpenMP/linear-clause01.f90 |    9 +-
 flang/test/Semantics/OpenMP/map-modifiers.f90 |   14 +-
 flang/test/Semantics/OpenMP/scan1.f90         |    2 +-
 .../Semantics/OpenMP/simd-linear-array.f90    |    3 +-
 flang/test/Semantics/OpenMP/to-clause-v45.f90 |    8 -
 .../llvm/Frontend/OpenMP/OMPDescriptors.h     |  277 +
 llvm/lib/Frontend/OpenMP/CMakeLists.txt       |    1 +
 llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp   | 6582 +++++++++++++++++
 17 files changed, 7036 insertions(+), 985 deletions(-)
 delete mode 100644 flang/lib/Semantics/openmp-modifiers.cpp
 create mode 100644 llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
 create mode 100644 llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp

diff --git a/flang/include/flang/Semantics/openmp-modifiers.h b/flang/include/flang/Semantics/openmp-modifiers.h
index 41a4a87f60949..41d7bfed5f1b5 100644
--- a/flang/include/flang/Semantics/openmp-modifiers.h
+++ b/flang/include/flang/Semantics/openmp-modifiers.h
@@ -16,6 +16,7 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Frontend/OpenMP/OMP.h"
+#include "llvm/Frontend/OpenMP/OMPDescriptors.h"
 
 #include <cassert>
 #include <map>
@@ -39,77 +40,86 @@ namespace Fortran::semantics {
 // Argument defaults: Required,     Unique, Compatible, Free
 // Modifier defaults: Optional,     Unique, Compatible, Free
 //
-// ---
-// Each modifier is used as either pre-modifier (i.e. modifier: item),
-// or post-modifier (i.e. item: modifier). The default is pre-.
-// Add an additional property that reflects the type of modifier.
-
-ENUM_CLASS(OmpProperty, Required, Unique, Exclusive, Ultimate, Post)
-using OmpProperties = common::EnumSet<OmpProperty, OmpProperty_enumSize>;
-using OmpClauses =
-    llvm::omp::EnumSet<llvm::omp::Clause, llvm::omp::Clause_enumSize>;
-
-struct OmpModifierDescriptor {
-  // Modifier name for use in diagnostic messages.
-  const OmpProperties &props(unsigned version) const;
-  const OmpClauses &clauses(unsigned version) const;
-  unsigned since(llvm::omp::Clause id) const;
-
-  const llvm::StringRef name;
-  // Version-dependent properties of the modifier.
-  const std::map<unsigned, OmpProperties> props_;
-  // Version-dependent set of clauses to which the modifier can apply.
-  const std::map<unsigned, OmpClauses> clauses_;
-};
+template <typename SpecificTy> llvm::omp::Modifier OmpGetModifierId();
+template <typename SpecificTy>
+const llvm::omp::ModifierDesc &OmpGetDescriptor();
+
+#define DECLARE_DESCRIPTOR(name, id) \
+  template <> inline llvm::omp::Modifier OmpGetModifierId<name>() { \
+    return id; \
+  } \
+  template <> inline const llvm::omp::ModifierDesc &OmpGetDescriptor<name>() { \
+    return llvm::omp::getDescriptor(OmpGetModifierId<name>()); \
+  }
 
-template <typename SpecificTy> const OmpModifierDescriptor &OmpGetDescriptor();
-
-#define DECLARE_DESCRIPTOR(name) \
-  template <> const OmpModifierDescriptor &OmpGetDescriptor<name>()
-
-DECLARE_DESCRIPTOR(parser::OmpAccessGroup);
-DECLARE_DESCRIPTOR(parser::OmpAlignment);
-DECLARE_DESCRIPTOR(parser::OmpAlignModifier);
-DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier);
-DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier);
-DECLARE_DESCRIPTOR(parser::OmpAlwaysModifier);
-DECLARE_DESCRIPTOR(parser::OmpAttachModifier);
-DECLARE_DESCRIPTOR(parser::OmpAutomapModifier);
-DECLARE_DESCRIPTOR(parser::OmpChunkModifier);
-DECLARE_DESCRIPTOR(parser::OmpCloseModifier);
-DECLARE_DESCRIPTOR(parser::OmpContextSelector);
-DECLARE_DESCRIPTOR(parser::OmpDeleteModifier);
-DECLARE_DESCRIPTOR(parser::OmpDependenceType);
-DECLARE_DESCRIPTOR(parser::OmpDepinfoModifier);
-DECLARE_DESCRIPTOR(parser::OmpDeviceModifier);
-DECLARE_DESCRIPTOR(parser::OmpDimsModifier);
-DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier);
-DECLARE_DESCRIPTOR(parser::OmpExpectation);
-DECLARE_DESCRIPTOR(parser::OmpFallbackModifier);
-DECLARE_DESCRIPTOR(parser::OmpInteropType);
-DECLARE_DESCRIPTOR(parser::OmpIterator);
-DECLARE_DESCRIPTOR(parser::OmpLastprivateModifier);
-DECLARE_DESCRIPTOR(parser::OmpLinearModifier);
-DECLARE_DESCRIPTOR(parser::OmpLinearStep);
-DECLARE_DESCRIPTOR(parser::OmpLoopModifier);
-DECLARE_DESCRIPTOR(parser::OmpLowerBound);
-DECLARE_DESCRIPTOR(parser::OmpMapper);
-DECLARE_DESCRIPTOR(parser::OmpMapType);
-DECLARE_DESCRIPTOR(parser::OmpMapTypeModifier);
-DECLARE_DESCRIPTOR(parser::OmpOrderModifier);
-DECLARE_DESCRIPTOR(parser::OmpOrderingModifier);
-DECLARE_DESCRIPTOR(parser::OmpPreferType);
-DECLARE_DESCRIPTOR(parser::OmpPrescriptiveness);
-DECLARE_DESCRIPTOR(parser::OmpPresentModifier);
-DECLARE_DESCRIPTOR(parser::OmpReductionIdentifier);
-DECLARE_DESCRIPTOR(parser::OmpReductionModifier);
-DECLARE_DESCRIPTOR(parser::OmpRefModifier);
-DECLARE_DESCRIPTOR(parser::OmpSelfModifier);
-DECLARE_DESCRIPTOR(parser::OmpStepComplexModifier);
-DECLARE_DESCRIPTOR(parser::OmpStepSimpleModifier);
-DECLARE_DESCRIPTOR(parser::OmpTaskDependenceType);
-DECLARE_DESCRIPTOR(parser::OmpVariableCategory);
-DECLARE_DESCRIPTOR(parser::OmpxHoldModifier);
+DECLARE_DESCRIPTOR(parser::OmpAccessGroup, llvm::omp::Modifier::AccessGroup)
+DECLARE_DESCRIPTOR(parser::OmpAlignment, llvm::omp::Modifier::Alignment)
+DECLARE_DESCRIPTOR(parser::OmpAlignModifier, llvm::omp::Modifier::AlignModifier)
+DECLARE_DESCRIPTOR(parser::OmpAllocatorComplexModifier,
+    llvm::omp::Modifier::AllocatorComplexModifier)
+DECLARE_DESCRIPTOR(parser::OmpAllocatorSimpleModifier,
+    llvm::omp::Modifier::AllocatorSimpleModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpAlwaysModifier, llvm::omp::Modifier::AlwaysModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpAttachModifier, llvm::omp::Modifier::AttachModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpAutomapModifier, llvm::omp::Modifier::AutomapModifier)
+DECLARE_DESCRIPTOR(parser::OmpChunkModifier, llvm::omp::Modifier::ChunkModifier)
+DECLARE_DESCRIPTOR(parser::OmpCloseModifier, llvm::omp::Modifier::CloseModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpContextSelector, llvm::omp::Modifier::ContextSelector)
+DECLARE_DESCRIPTOR(
+    parser::OmpDeleteModifier, llvm::omp::Modifier::DeleteModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpDependenceType, llvm::omp::Modifier::DependenceType)
+DECLARE_DESCRIPTOR(
+    parser::OmpDepinfoModifier, llvm::omp::Modifier::DepinfoModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpDeviceModifier, llvm::omp::Modifier::DeviceModifier)
+DECLARE_DESCRIPTOR(parser::OmpDimsModifier, llvm::omp::Modifier::DimsModifier)
+DECLARE_DESCRIPTOR(parser::OmpDirectiveNameModifier,
+    llvm::omp::Modifier::DirectiveNameModifier)
+DECLARE_DESCRIPTOR(parser::OmpExpectation, llvm::omp::Modifier::Expectation)
+DECLARE_DESCRIPTOR(
+    parser::OmpFallbackModifier, llvm::omp::Modifier::FallbackModifier)
+DECLARE_DESCRIPTOR(parser::OmpInteropType, llvm::omp::Modifier::InteropType)
+DECLARE_DESCRIPTOR(parser::OmpIterator, llvm::omp::Modifier::Iterator)
+DECLARE_DESCRIPTOR(
+    parser::OmpLastprivateModifier, llvm::omp::Modifier::LastprivateModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpLinearModifier, llvm::omp::Modifier::LinearModifier)
+DECLARE_DESCRIPTOR(parser::OmpLinearStep, llvm::omp::Modifier::LinearStep)
+DECLARE_DESCRIPTOR(parser::OmpLoopModifier, llvm::omp::Modifier::LoopModifier)
+DECLARE_DESCRIPTOR(parser::OmpLowerBound, llvm::omp::Modifier::LowerBound)
+DECLARE_DESCRIPTOR(parser::OmpMapper, llvm::omp::Modifier::Mapper)
+DECLARE_DESCRIPTOR(parser::OmpMapType, llvm::omp::Modifier::MapType)
+DECLARE_DESCRIPTOR(
+    parser::OmpMapTypeModifier, llvm::omp::Modifier::MapTypeModifier)
+DECLARE_DESCRIPTOR(parser::OmpOrderModifier, llvm::omp::Modifier::OrderModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpOrderingModifier, llvm::omp::Modifier::OrderingModifier)
+DECLARE_DESCRIPTOR(parser::OmpPreferType, llvm::omp::Modifier::PreferType)
+DECLARE_DESCRIPTOR(
+    parser::OmpPrescriptiveness, llvm::omp::Modifier::Prescriptiveness)
+DECLARE_DESCRIPTOR(
+    parser::OmpPresentModifier, llvm::omp::Modifier::PresentModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpReductionIdentifier, llvm::omp::Modifier::ReductionIdentifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpReductionModifier, llvm::omp::Modifier::ReductionModifier)
+DECLARE_DESCRIPTOR(parser::OmpRefModifier, llvm::omp::Modifier::RefModifier)
+DECLARE_DESCRIPTOR(parser::OmpSelfModifier, llvm::omp::Modifier::SelfModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpStepComplexModifier, llvm::omp::Modifier::StepComplexModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpStepSimpleModifier, llvm::omp::Modifier::StepSimpleModifier)
+DECLARE_DESCRIPTOR(
+    parser::OmpTaskDependenceType, llvm::omp::Modifier::TaskDependenceType)
+DECLARE_DESCRIPTOR(
+    parser::OmpVariableCategory, llvm::omp::Modifier::VariableCategory)
+DECLARE_DESCRIPTOR(
+    parser::OmpxHoldModifier, llvm::omp::Modifier::OmpxHoldModifier)
 
 #undef DECLARE_DESCRIPTOR
 
@@ -140,7 +150,7 @@ DECLARE_DESCRIPTOR(parser::OmpxHoldModifier);
 //               "Specific2".
 
 template <typename UnionTy>
-const OmpModifierDescriptor &OmpGetDescriptor(const UnionTy &modifier) {
+const llvm::omp::ModifierDesc &OmpGetDescriptor(const UnionTy &modifier) {
   return common::visit(
       [](auto &&m) -> decltype(auto) {
         using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
@@ -281,18 +291,31 @@ bool verifyVersions(const std::optional<std::list<UnionTy>> &modifiers,
   unsigned version{semaCtx.langOptions().OpenMPVersion};
   bool result{true};
   for (auto &m : *modifiers) {
-    const OmpModifierDescriptor &desc{OmpGetDescriptor(m)};
-    unsigned since{desc.since(id)};
+    const llvm::omp::ModifierDesc &desc{OmpGetDescriptor(m)};
+    const auto &versions{desc.getVersions()};
+    if (llvm::is_contained(versions, std::max(version, 45u))) {
+      if (desc.getClauses(version).test(id)) {
+        continue;
+      }
+    }
+    // Find the next higher version that allows this modifier on this clause.
+    unsigned since{~0u};
+    for (unsigned v : versions) {
+      if (v > version && desc.getClauses(v).test(id)) {
+        since = v;
+        break;
+      }
+    }
     if (since == ~0u) {
       // This shouldn't really happen, but have it just in case.
       semaCtx.Say(m.source,
           "'%s' modifier is not supported on %s clause"_err_en_US,
-          desc.name.str(),
+          desc.getName().str(),
           parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(id)));
     } else if (version < since) {
       semaCtx.Say(m.source,
           "'%s' modifier is not supported in OpenMP v%d.%d, try -fopenmp-version=%d"_warn_en_US,
-          desc.name.str(), version / 10, version % 10, since);
+          desc.getName().str(), version / 10, version % 10, since);
       result = false;
     }
   }
@@ -308,8 +331,8 @@ bool verifyIfRequired(const SpecificTy *,
     const std::optional<std::list<UnionTy>> &modifiers,
     parser::CharBlock clauseSource, SemanticsContext &semaCtx) {
   unsigned version{semaCtx.langOptions().OpenMPVersion};
-  const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
-  if (!desc.props(version).test(OmpProperty::Required)) {
+  const llvm::omp::ModifierDesc &desc{OmpGetDescriptor<SpecificTy>()};
+  if (!desc.getProperties(version).test(llvm::omp::Property::Required)) {
     // If the modifier is not required, there is nothing to do.
     return true;
   }
@@ -318,8 +341,8 @@ bool verifyIfRequired(const SpecificTy *,
     return std::holds_alternative<SpecificTy>(m.u);
   });
   if (!present) {
-    semaCtx.Say(
-        clauseSource, "'%s' modifier is required"_err_en_US, desc.name.str());
+    semaCtx.Say(clauseSource, "'%s' modifier is required"_err_en_US,
+        desc.getName().str());
   }
   return present;
 }
@@ -362,10 +385,10 @@ bool verifyIfUnique(const SpecificTy *,
   assert(specific != end && "`specific` must be a valid location");
 
   unsigned version{semaCtx.langOptions().OpenMPVersion};
-  const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
+  const llvm::omp::ModifierDesc &desc{OmpGetDescriptor<SpecificTy>()};
   // Ultimate implies Unique.
-  if (!desc.props(version).test(OmpProperty::Unique) &&
-      !desc.props(version).test(OmpProperty::Ultimate)) {
+  if (!desc.getProperties(version).test(llvm::omp::Property::Unique) &&
+      !desc.getProperties(version).test(llvm::omp::Property::Ultimate)) {
     return true;
   }
   if (std::next(specific) != end) {
@@ -374,7 +397,7 @@ bool verifyIfUnique(const SpecificTy *,
     if (next != end) {
       semaCtx.Say(next->source,
           "'%s' modifier cannot occur multiple times"_err_en_US,
-          desc.name.str());
+          desc.getName().str());
     }
   }
   return true;
@@ -421,28 +444,30 @@ bool verifyUltimate(const std::optional<std::list<UnionTy>> &modifiers,
   // Walk over the list, and if a given item has the Ultimate property but is
   // not at the right position, mark it as an error.
   for (auto it{first}, end{modifiers->cend()}; it != end; ++it) {
-    result =
-        common::visit(
-            [&](auto &&m) {
-              using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
-              const OmpModifierDescriptor &desc{OmpGetDescriptor<SpecificTy>()};
-              auto &props{desc.props(version)};
-
-              if (props.test(OmpProperty::Ultimate)) {
-                bool isPre = !props.test(OmpProperty::Post);
-                if (it == (isPre ? last : first)) {
-                  // Skip, since this is the correct place for this modifier.
-                  return true;
-                }
-                llvm::StringRef where{isPre ? "last" : "first"};
-                semaCtx.Say(it->source,
-                    "'%s' should be the %s modifier"_err_en_US, desc.name.str(),
-                    where.str());
-                return false;
-              }
-              return true;
-            },
-            it->u) &&
+    result = common::visit(
+                 [&](auto &&m) {
+                   using SpecificTy = llvm::remove_cvref_t<decltype(m)>;
+                   const llvm::omp::ModifierDesc &desc{
+                       OmpGetDescriptor<SpecificTy>()};
+                   const auto &props{desc.getProperties(version)};
+
+                   if (props.test(llvm::omp::Property::Ultimate)) {
+                     bool isPre = !llvm::omp::getProperties(id, version)
+                                       .test(llvm::omp::Property::PostModified);
+                     if (it == (isPre ? last : first)) {
+                       // Skip, since this is the correct place for this
+                       // modifier.
+                       return true;
+                     }
+                     llvm::StringRef where{isPre ? "last" : "first"};
+                     semaCtx.Say(it->source,
+                         "'%s' should be the %s modifier"_err_en_US,
+                         desc.getName().str(), where.str());
+                     return false;
+                   }
+                   return true;
+                 },
+                 it->u) &&
         result;
   }
   return result;
@@ -459,24 +484,24 @@ bool verifyExclusive(const std::optional<std::list<UnionTy>> &modifiers,
   }
   unsigned version{semaCtx.langOptions().OpenMPVersion};
   const UnionTy &front{modifiers->front()};
-  const OmpModifierDescriptor &frontDesc{OmpGetDescriptor(front)};
+  const llvm::omp::ModifierDesc &frontDesc{OmpGetDescriptor(front)};
 
   auto second{std::next(modifiers->cbegin())};
   auto end{modifiers->end()};
 
   auto emitErrorMessage{[&](const UnionTy &excl, const UnionTy &other) {
-    const OmpModifierDescriptor &descExcl{OmpGetDescriptor(excl)};
-    const OmpModifierDescriptor &descOther{OmpGetDescriptor(other)};
+    const llvm::omp::ModifierDesc &descExcl{OmpGetDescriptor(excl)};
+    const llvm::omp::ModifierDesc &descOther{OmpGetDescriptor(other)};
     parser::MessageFormattedText txt(
         "An exclusive '%s' modifier cannot be specified together with a modifier of a different type"_err_en_US,
-        descExcl.name.str());
+        descExcl.getName().str());
     parser::Message message(excl.source, txt);
     message.Attach(
-        other.source, "'%s' provided here"_en_US, descOther.name.str());
+        other.source, "'%s' provided here"_en_US, descOther.getName().str());
     semaCtx.Say(std::move(message));
   }};
 
-  if (frontDesc.props(version).test(OmpProperty::Exclusive)) {
+  if (frontDesc.getProperties(version).test(llvm::omp::Property::Exclusive)) {
     // If the first item has the Exclusive property, then check if there is
     // another item in the rest of the list with a different SpecificTy as
     // the alternative, and mark it as an error. This allows multiple Exclusive
@@ -497,8 +522,8 @@ bool verifyExclusive(const std::optional<std::list<UnionTy>> &modifiers,
     // mark it as an error if so.
     bool result{true};
     for (auto it{second}; it != end; ++it) {
-      const OmpModifierDescriptor &desc{OmpGetDescriptor(*it)};
-      if (desc.props(version).test(OmpProperty::Exclusive)) {
+      const llvm::omp::ModifierDesc &desc{OmpGetDescriptor(*it)};
+      if (desc.getProperties(version).test(llvm::omp::Property::Exclusive)) {
         emitErrorMessage(*it, front);
         result = false;
         break;
diff --git a/flang/lib/Semantics/CMakeLists.txt b/flang/lib/Semantics/CMakeLists.txt
index efe3c5fa875dc..649314a023704 100644
--- a/flang/lib/Semantics/CMakeLists.txt
+++ b/flang/lib/Semantics/CMakeLists.txt
@@ -36,7 +36,6 @@ add_flang_library(FortranSemantics
   expression.cpp
   mod-file.cpp
   openmp-dsa.cpp
-  openmp-modifiers.cpp
   openmp-utils.cpp
   pointer-assignment.cpp
   program-tree.cpp
diff --git a/flang/lib/Semantics/check-omp-loop.cpp b/flang/lib/Semantics/check-omp-loop.cpp
index 65d097b5a31f7..481f9e4bd997b 100644
--- a/flang/lib/Semantics/check-omp-loop.cpp
+++ b/flang/lib/Semantics/check-omp-loop.cpp
@@ -734,7 +734,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
       auto &desc{OmpGetDescriptor<parser::OmpLinearModifier>()};
       context_.Say(source,
           "The list item '%s' specified without the REF '%s' must be of INTEGER type"_err_en_US,
-          symbol->name(), desc.name.str());
+          symbol->name(), desc.getName().str());
     }
   }};
 
@@ -760,7 +760,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
           if (dir != llvm::omp::Directive::OMPD_declare_simd) {
             context_.Say(modSource,
                 "A REF or UVAL '%s' may not be specified in a LINEAR clause on the %s directive"_err_en_US,
-                desc.name.str(), parser::omp::GetUpperName(dir, version));
+                desc.getName().str(), parser::omp::GetUpperName(dir, version));
             valid = false;
           }
         }
@@ -780,7 +780,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
                 !IsPolymorphic(*symbol)) {
               context_.Say(source,
                   "The list item `%s` specified with the REF '%s' must be polymorphic variable, assumed-shape array, or a variable with the `ALLOCATABLE` attribute"_err_en_US,
-                  symbol->name(), desc.name.str());
+                  symbol->name(), desc.getName().str());
             }
           }
           if (linearMod->v == parser::OmpLinearModifier::Value::Ref ||
@@ -788,7 +788,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) {
             if (!IsDummy(*symbol) || IsValue(*symbol)) {
               context_.Say(source,
                   "If the `%s` is REF or UVAL, the list item '%s' must be a dummy argument without the VALUE attribute"_err_en_US,
-                  desc.name.str(), symbol->name());
+                  desc.getName().str(), symbol->name());
             }
           }
         } // for (symbol, source)
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index 7bd5f1720fb3c..3516e13ee154b 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -2120,19 +2120,19 @@ void OmpStructureChecker::CheckInitOnDepobj(
       auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
       context_.Say(OmpGetModifierSource(modifiers, depInfo),
           "'%s' is not an allowed value of the '%s' modifier"_err_en_US,
-          parser::ToUpperCaseLetters(EnumToString(depKind)), desc.name.str());
+          parser::ToUpperCaseLetters(EnumToString(depKind)), desc.getName().str());
     }
   } else {
     auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
     context_.Say(initClause.source,
         "The '%s' modifier is required on a DEPOBJ construct"_err_en_US,
-        desc.name.str());
+        desc.getName().str());
   }
   if (auto *prefType{OmpGetUniqueModifier<parser::OmpPreferType>(modifiers)}) {
     auto &desc{OmpGetDescriptor<parser::OmpPreferType>()};
     context_.Say(OmpGetModifierSource(modifiers, prefType),
         "The '%s' modifier is not allowed on a DEPOBJ construct"_err_en_US,
-        desc.name.str());
+        desc.getName().str());
   }
 }
 
@@ -4637,7 +4637,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::If &x) {
 
     parser::CharBlock modifierSource{OmpGetModifierSource(modifiers, dnm)};
     auto desc{OmpGetDescriptor<parser::OmpDirectiveNameModifier>()};
-    std::string modName{desc.name.str()};
+    std::string modName{desc.getName().str()};
 
     if (!isConstituent(dir, sub)) {
       context_.Say(modifierSource,
@@ -4864,7 +4864,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
       const auto &desc{OmpGetDescriptor<parser::OmpAttachModifier>()};
       context_.Say(OmpGetModifierSource(modifiers, attach),
           "The '%s' modifier can only appear on a map-entering construct or on a DECLARE_MAPPER directive"_err_en_US,
-          desc.name.str());
+          desc.getName().str());
     }
 
     auto hasBasePointer{[&](const SomeExpr &item) {
@@ -4889,23 +4889,6 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) {
     }
   }
 
-  auto &&typeMods{
-      OmpGetRepeatableModifier<parser::OmpMapTypeModifier>(modifiers)};
-  struct Less {
-    using Iterator = decltype(typeMods.begin());
-    bool operator()(Iterator a, Iterator b) const {
-      const parser::OmpMapTypeModifier *pa = *a;
-      const parser::OmpMapTypeModifier *pb = *b;
-      return pa->v < pb->v;
-    }
-  };
-  if (auto maybeIter{FindDuplicate<Less>(typeMods)}) {
-    context_.Say(GetContext().clauseSource,
-        "Duplicate map-type-modifier entry '%s' will be ignored"_warn_en_US,
-        parser::ToUpperCaseLetters(
-            parser::OmpMapTypeModifier::EnumToString((**maybeIter)->v)));
-  }
-
   if (version < 60) {
     for (const parser::OmpObject &object : objects.v) {
       if (IsWholeAssumedSizeArray(object)) {
@@ -5020,7 +5003,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Device &x) {
             OmpGetUniqueModifier<parser::OmpDeviceModifier>(modifiers)}) {
       using Value = parser::OmpDeviceModifier::Value;
       if (dir != llvm::omp::OMPD_target && deviceMod->v == Value::Ancestor) {
-        auto name{OmpGetDescriptor<parser::OmpDeviceModifier>().name};
+        auto name{OmpGetDescriptor<parser::OmpDeviceModifier>().getName()};
         context_.Say(OmpGetModifierSource(modifiers, deviceMod),
             "The ANCESTOR %s must not appear on the DEVICE clause on any directive other than the TARGET construct. Found on %s construct."_err_en_US,
             name.str(), parser::omp::GetUpperName(dir, version));
@@ -5957,7 +5940,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause::SelfMaps &x) {
 
 void OmpStructureChecker::CheckDimsModifier(parser::CharBlock source,
     size_t numValues, const parser::OmpDimsModifier &x) {
-  std::string name{OmpGetDescriptor<parser::OmpDimsModifier>().name.str()};
+  std::string name{OmpGetDescriptor<parser::OmpDimsModifier>().getName().str()};
 
   if (auto dimsVal{GetIntValue(x.v)}) {
     if (*dimsVal > 0) {
@@ -6135,7 +6118,7 @@ void OmpStructureChecker::Enter(const parser::OpenMPInteropConstruct &x) {
                   auto &desc{OmpGetDescriptor<parser::OmpDepinfoModifier>()};
                   context_.Say(OmpGetModifierSource(modifiers, depInfo),
                       "The '%s' is not allowed on INTEROP construct"_err_en_US,
-                      desc.name.str());
+                      desc.getName().str());
                 }
                 // A prefer_type foreign-runtime-identifier must be a
                 // constant expression of integer OpenMP type or a base
diff --git a/flang/lib/Semantics/openmp-modifiers.cpp b/flang/lib/Semantics/openmp-modifiers.cpp
deleted file mode 100644
index 293136d3649ad..0000000000000
--- a/flang/lib/Semantics/openmp-modifiers.cpp
+++ /dev/null
@@ -1,791 +0,0 @@
-//===-- flang/lib/Semantics/openmp-modifiers.cpp --------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "flang/Semantics/openmp-modifiers.h"
-
-#include "flang/Parser/parse-tree.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/Frontend/OpenMP/OMP.h"
-
-#include <algorithm>
-#include <cassert>
-#include <map>
-
-namespace Fortran::semantics {
-using namespace llvm::omp;
-
-/// Find the highest version that exists as a key in the given map,
-/// and is less than or equal to `version`.
-/// Account for "version" not being a value from getOpenMPVersions().
-template <typename ValueTy>
-static unsigned findVersion(
-    unsigned version, const std::map<unsigned, ValueTy> &map) {
-  llvm::ArrayRef<unsigned> versions{llvm::omp::getOpenMPVersions()};
-  assert(!versions.empty() && "getOpenMPVersions returned empty list");
-  version = std::clamp(version, versions.front(), versions.back());
-
-  // std::map is sorted with respect to keys, by default in the ascending
-  // order.
-  unsigned found{0};
-  for (auto &[v, _] : map) {
-    if (v <= version) {
-      found = v;
-    } else {
-      break;
-    }
-  }
-
-  // It can happen that the above search will not find any version, for
-  // example when the minimum version in the map is higher than the current
-  // version. This is really an error, but this situation should be handled
-  // gracefully, so make some sensible choice and return it.
-  if (found == 0) {
-    found = !map.empty() ? map.begin()->first : versions.front();
-  }
-  return found;
-}
-
-const OmpProperties &OmpModifierDescriptor::props(unsigned version) const {
-  return props_.at(findVersion(version, props_));
-}
-
-const OmpClauses &OmpModifierDescriptor::clauses(unsigned version) const {
-  return clauses_.at(findVersion(version, clauses_));
-}
-
-unsigned OmpModifierDescriptor::since(llvm::omp::Clause id) const {
-  unsigned found{[&]() {
-    for (auto &[v, cs] : clauses_) {
-      if (cs.test(id)) {
-        return v;
-      }
-    }
-    return ~0u;
-  }()};
-
-  return found <= 45 ? 0 : found;
-}
-
-// Note: The intent for these functions is to have them be automatically-
-// generated in the future.
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAccessGroup>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"access-group",
-      /*props=*/
-      {
-          {61, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {61, {Clause::OMPC_dyn_groupprivate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignment>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"alignment",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique, OmpProperty::Ultimate, OmpProperty::Post}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_aligned}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlignModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"align-modifier",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_allocate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpAllocatorComplexModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"allocator-complex-modifier",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_allocate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpAllocatorSimpleModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"allocator-simple-modifier",
-      /*props=*/
-      {
-          {50, {OmpProperty::Exclusive, OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {50, {Clause::OMPC_allocate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAlwaysModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"always-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAttachModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"attach-modifier",
-      /*props=*/
-      {
-          {61, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {61, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpAutomapModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"automap-modifier",
-      /*props=*/
-      {
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {60, {Clause::OMPC_enter}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpChunkModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"chunk-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_schedule}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpCloseModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"close-modifier",
-      /*props=*/
-      {
-          {50, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {50, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpContextSelector>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"context-selector",
-      /*props=*/
-      {
-          {50, {OmpProperty::Required, OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          // The MATCH clause takes a selector as an argument, not modifier.
-          {50, {Clause::OMPC_when}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeleteModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"delete-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique, OmpProperty::Ultimate}},
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDependenceType>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"dependence-type",
-      /*props=*/
-      {
-          {45, {OmpProperty::Required, OmpProperty::Ultimate}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_depend}},
-          {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
-          {52, {Clause::OMPC_doacross}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDepinfoModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"depinfo-modifier",
-      /*props=*/
-      {
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {60, {Clause::OMPC_init}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDimsModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"dims-modifier",
-      /*props=*/
-      {
-          {61, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {61,
-              {Clause::OMPC_num_teams, Clause::OMPC_num_threads,
-                  Clause::OMPC_thread_limit}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDeviceModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"device-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_device}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpDirectiveNameModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"directive-name-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_if}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpExpectation>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"expectation",
-      /*props=*/
-      {
-          {52, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {52, {Clause::OMPC_from, Clause::OMPC_to}},
-          {60, {}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpFallbackModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"fallback-modifier",
-      /*props=*/
-      {
-          {61, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {61, {Clause::OMPC_dyn_groupprivate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpInteropType>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"interop-type",
-      /*props=*/
-      {
-          {52, {OmpProperty::Required}},
-          {60, {}},
-      },
-      /*clauses=*/
-      {
-          {52, {Clause::OMPC_init}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpIterator>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"iterator",
-      /*props=*/
-      {
-          {50, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {50, {Clause::OMPC_affinity, Clause::OMPC_depend}},
-          {51,
-              {Clause::OMPC_affinity, Clause::OMPC_depend, Clause::OMPC_from,
-                  Clause::OMPC_map, Clause::OMPC_to}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpLastprivateModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"lastprivate-modifier",
-      /*props=*/
-      {
-          {50, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {50, {Clause::OMPC_lastprivate}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLinearModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"linear-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_linear}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLinearStep>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"linear-step",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_linear}},
-          {52, {}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLoopModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"loop-modifier",
-      /*props=*/
-      {
-          {60, {}},
-      },
-      /*clauses=*/
-      {
-          {60, {Clause::OMPC_apply}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpLowerBound>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"lower-bound",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique, OmpProperty::Ultimate}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_num_teams}},
-      },
-  };
-  return desc;
-}
-
-template <> //
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapper>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"mapper",
-      /*props=*/
-      {
-          {50, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {50, {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapType>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"map-type",
-      /*props=*/
-      {
-          {45, {OmpProperty::Ultimate}},
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpMapTypeModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"map-type-modifier",
-      /*props=*/
-      {
-          {45, {}}, // Repeatable
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_map}},
-          {60, {}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"order-modifier",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_order}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpOrderingModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"ordering-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_schedule}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPreferType>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"prefer-type",
-      /*props=*/
-      {
-          {52, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {52, {Clause::OMPC_init}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPrescriptiveness>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"prescriptiveness",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpPresentModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"present-modifier",
-      /*props=*/
-      {
-          {51, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {51, {Clause::OMPC_from, Clause::OMPC_to}},
-          {52, {}},
-          {60, {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpReductionIdentifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"reduction-identifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Required, OmpProperty::Ultimate}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_reduction}},
-          {50,
-              {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
-                  Clause::OMPC_task_reduction}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpReductionModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"reduction-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_reduction}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpRefModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"ref-modifier",
-      /*props=*/
-      {
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {60, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpSelfModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"self-modifier",
-      /*props=*/
-      {
-          {60, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {60, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &
-OmpGetDescriptor<parser::OmpStepComplexModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"step-complex-modifier",
-      /*props=*/
-      {
-          {52, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {52, {Clause::OMPC_linear}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpStepSimpleModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"step-simple-modifier",
-      /*props=*/
-      {
-          {52, {OmpProperty::Unique, OmpProperty::Exclusive}},
-      },
-      /*clauses=*/
-      {
-          {52, {Clause::OMPC_linear}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpTaskDependenceType>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"task-dependence-type",
-      /*props=*/
-      {
-          {45, {OmpProperty::Required, OmpProperty::Ultimate}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_depend}},
-          {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpVariableCategory>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"variable-category",
-      /*props=*/
-      {
-          {45, {OmpProperty::Required, OmpProperty::Unique}},
-          {50, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_defaultmap}},
-      },
-  };
-  return desc;
-}
-
-template <>
-const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpxHoldModifier>() {
-  static const OmpModifierDescriptor desc{
-      /*name=*/"ompx-hold-modifier",
-      /*props=*/
-      {
-          {45, {OmpProperty::Unique}},
-      },
-      /*clauses=*/
-      {
-          {45, {Clause::OMPC_map}},
-      },
-  };
-  return desc;
-}
-} // namespace Fortran::semantics
diff --git a/flang/test/Parser/OpenMP/map-modifiers.f90 b/flang/test/Parser/OpenMP/map-modifiers.f90
index 48d5172bcdefd..9efc14638977f 100644
--- a/flang/test/Parser/OpenMP/map-modifiers.f90
+++ b/flang/test/Parser/OpenMP/map-modifiers.f90
@@ -3,14 +3,14 @@
 
 subroutine f00(x)
   integer :: x
-  !$omp target map(ompx_hold, always, present, close, to: x)
+  !$omp target map(ompx_hold, always, to: x)
   x = x + 1
   !$omp end target
 end
 
 !UNPARSE: SUBROUTINE f00 (x)
 !UNPARSE:  INTEGER x
-!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE, TO: x)
+!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, ALWAYS, TO: x)
 !UNPARSE:   x=x+1_4
 !UNPARSE: !$OMP END TARGET
 !UNPARSE: END SUBROUTINE
@@ -20,22 +20,20 @@ subroutine f00(x)
 !PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
 !PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
 !PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
 !PARSE-TREE: | | Modifier -> OmpMapType -> Value = To
 !PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
 !PARSE-TREE: | | bool = 'true'
 
 subroutine f01(x)
   integer :: x
-  !$omp target map(ompx_hold, always, present, close: x)
+  !$omp target map(ompx_hold, present: x)
   x = x + 1
   !$omp end target
 end
 
 !UNPARSE: SUBROUTINE f01 (x)
 !UNPARSE:  INTEGER x
-!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE: x)
+!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, PRESENT: x)
 !UNPARSE:   x=x+1_4
 !UNPARSE: !$OMP END TARGET
 !UNPARSE: END SUBROUTINE
@@ -44,9 +42,7 @@ subroutine f01(x)
 !PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
 !PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
 !PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
 !PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
 !PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
 !PARSE-TREE: | | bool = 'true'
 
@@ -93,14 +89,14 @@ subroutine f03(x)
 
 subroutine f04(x)
   integer :: x
-  !$omp target map(ompx_hold always, present, close, to: x)
+  !$omp target map(ompx_hold close, to: x)
   x = x + 1
   !$omp end target
 end
 
 !UNPARSE: SUBROUTINE f04 (x)
 !UNPARSE:  INTEGER x
-!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE, TO: x)
+!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, CLOSE, TO: x)
 !UNPARSE:   x=x+1_4
 !UNPARSE: !$OMP END TARGET
 !UNPARSE: END SUBROUTINE
@@ -109,8 +105,6 @@ subroutine f04(x)
 !PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
 !PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
 !PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
 !PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
 !PARSE-TREE: | | Modifier -> OmpMapType -> Value = To
 !PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
@@ -118,14 +112,14 @@ subroutine f04(x)
 
 subroutine f05(x)
   integer :: x
-  !$omp target map(ompx_hold, always, present, close: x)
+  !$omp target map(ompx_hold, present: x)
   x = x + 1
   !$omp end target
 end
 
 !UNPARSE: SUBROUTINE f05 (x)
 !UNPARSE:  INTEGER x
-!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, ALWAYS, PRESENT, CLOSE: x)
+!UNPARSE: !$OMP TARGET  MAP(OMPX_HOLD, PRESENT: x)
 !UNPARSE:   x=x+1_4
 !UNPARSE: !$OMP END TARGET
 !UNPARSE: END SUBROUTINE
@@ -134,9 +128,7 @@ subroutine f05(x)
 !PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = target
 !PARSE-TREE: | OmpClauseList -> OmpClause -> Map -> OmpMapClause
 !PARSE-TREE: | | Modifier -> OmpxHoldModifier -> Value = Ompx_Hold
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Always
 !PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Present
-!PARSE-TREE: | | Modifier -> OmpMapTypeModifier -> Value = Close
 !PARSE-TREE: | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
 
 !PARSE-TREE: | | bool = 'true'
@@ -343,21 +335,20 @@ subroutine f21(x, y)
 
 subroutine f22(x)
   integer :: x(10)
-  !$omp target map(present, iterator(i = 1:10), always, from: x(i))
+  !$omp target map(iterator(i = 1:10), always, from: x(i))
   x = x + 1
   !$omp end target
 end
 
 !UNPARSE: SUBROUTINE f22 (x)
 !UNPARSE:  INTEGER x(10_4)
-!UNPARSE: !$OMP TARGET  MAP(PRESENT, ITERATOR(INTEGER i = 1_4:10_4), ALWAYS, FROM: x(i))
+!UNPARSE: !$OMP TARGET  MAP(ITERATOR(INTEGER i = 1_4:10_4), ALWAYS, FROM: x(i))
 !UNPARSE:   x=x+1_4
 !UNPARSE: !$OMP END TARGET
 !UNPARSE: END SUBROUTINE
 
 !PARSE-TREE: OmpDirectiveName -> llvm::omp::Directive = target
 !PARSE-TREE: OmpClauseList -> OmpClause -> Map -> OmpMapClause
-!PARSE-TREE: | Modifier -> OmpMapTypeModifier -> Value = Present
 !PARSE-TREE: | Modifier -> OmpIterator -> OmpIteratorSpecifier
 !PARSE-TREE: | | TypeDeclarationStmt
 !PARSE-TREE: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
diff --git a/flang/test/Semantics/OpenMP/allocate-clause01.f90 b/flang/test/Semantics/OpenMP/allocate-clause01.f90
index d5e22871943fb..6aa96a19c15cc 100644
--- a/flang/test/Semantics/OpenMP/allocate-clause01.f90
+++ b/flang/test/Semantics/OpenMP/allocate-clause01.f90
@@ -1,6 +1,6 @@
 ! REQUIRES: openmp_runtime
 
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=51
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
 ! OpenMP Version 5.2
 ! The allocate clause's allocator modifier must be of type allocator_handle
 ! and the align modifier must be constant, positive integer expression
diff --git a/flang/test/Semantics/OpenMP/device-clause01.f90 b/flang/test/Semantics/OpenMP/device-clause01.f90
index 008a31a00bc3a..77270b1f97a3f 100644
--- a/flang/test/Semantics/OpenMP/device-clause01.f90
+++ b/flang/test/Semantics/OpenMP/device-clause01.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang -fopenmp
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=50
 ! OpenMP Version 5.2
 ! 13.2 Device clause
 
diff --git a/flang/test/Semantics/OpenMP/from-clause-v45.f90 b/flang/test/Semantics/OpenMP/from-clause-v45.f90
index 284511acfdd59..007a51b9ea11d 100644
--- a/flang/test/Semantics/OpenMP/from-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/from-clause-v45.f90
@@ -19,14 +19,6 @@ subroutine f02(x)
   !$omp target update from(present, iterator(i = 1:5): x(i))
 end
 
-subroutine f03(x)
-  integer :: x(10)
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!ERROR: 'present-modifier' modifier cannot occur multiple times
-  !$omp target update from(present, present: x)
-end
-
 subroutine f04
 !ERROR: 'f04' must be a variable list item
   !$omp target update from(f04)
diff --git a/flang/test/Semantics/OpenMP/linear-clause01.f90 b/flang/test/Semantics/OpenMP/linear-clause01.f90
index bb87b832d6aa9..bd7783e7c2421 100644
--- a/flang/test/Semantics/OpenMP/linear-clause01.f90
+++ b/flang/test/Semantics/OpenMP/linear-clause01.f90
@@ -1,5 +1,5 @@
 ! REQUIRES: openmp_runtime
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
 ! OpenMP Version 5.2
 ! Various checks for the linear clause
 ! 5.4.6 `linear` Clause
@@ -7,8 +7,9 @@
 ! Case 1
 subroutine linear_clause_01(arg)
     integer, intent(in) :: arg(:)
-    !ERROR: A modifier may not be specified in a LINEAR clause on the DO directive
+    !ERROR: A REF or UVAL 'linear-modifier' may not be specified in a LINEAR clause on the DO directive
     !ERROR: List item 'arg' in LINEAR clause must be a scalar variable
+    !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
     !$omp do linear(uval(arg))
     do i = 1, 5
         print *, arg(i)
@@ -19,16 +20,19 @@ end subroutine linear_clause_01
 subroutine linear_clause_02(arg_01, arg_02)
     !ERROR: The list item 'arg_01' specified without the REF 'linear-modifier' must be of INTEGER type
     !ERROR: List item 'arg_01' in LINEAR clause must be a scalar variable
+    !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
     !$omp declare simd linear(val(arg_01))
     real, intent(in) :: arg_01(:)
 
     !ERROR: If the `linear-modifier` is REF or UVAL, the list item 'arg_02' must be a dummy argument without the VALUE attribute
+    !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
     !$omp declare simd linear(uval(arg_02))
     integer, value, intent(in) :: arg_02
 
     !ERROR: If the `linear-modifier` is REF or UVAL, the list item 'var' must be a dummy argument without the VALUE attribute
     !ERROR: The list item `var` must be a dummy argument
     !ERROR: The list item `var` in a LINEAR clause must not be Cray Pointer or a variable with POINTER attribute
+    !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
     !$omp declare simd linear(uval(var))
     integer, pointer :: var
 end subroutine linear_clause_02
@@ -39,6 +43,7 @@ subroutine linear_clause_03(arg)
     !ERROR: The list item `arg` specified with the REF 'linear-modifier' must be polymorphic variable, assumed-shape array, or a variable with the `ALLOCATABLE` attribute
     !ERROR: List item 'arg' present at multiple LINEAR clauses
     !ERROR: 'arg' appears in more than one data-sharing clause on the same OpenMP directive
+    !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
     !$omp declare simd linear(ref(arg)) linear(arg)
 
     integer :: i
diff --git a/flang/test/Semantics/OpenMP/map-modifiers.f90 b/flang/test/Semantics/OpenMP/map-modifiers.f90
index 3851336c33f3d..7f1788634398b 100644
--- a/flang/test/Semantics/OpenMP/map-modifiers.f90
+++ b/flang/test/Semantics/OpenMP/map-modifiers.f90
@@ -1,24 +1,18 @@
 !RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=52 -Werror -Wno-experimental-option
 
-subroutine f10(x)
-  integer :: x
-!PORTABILITY: The specification of modifiers without comma separators for the 'MAP' clause has been deprecated in OpenMP 5.2
-  !$omp target map(always, present close, to: x)
-  x = x + 1
-  !$omp end target
-end
-
 subroutine f11(x)
   integer :: x
 !PORTABILITY: The specification of modifiers without comma separators for the 'MAP' clause has been deprecated in OpenMP 5.2
-  !$omp target map(always, present, close to: x)
+  !$omp target map(close to: x)
   x = x + 1
   !$omp end target
 end
 
 subroutine f12(x)
   integer :: x
-!WARNING: Duplicate map-type-modifier entry 'PRESENT' will be ignored
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
+!ERROR: 'map-type-modifier' modifier cannot occur multiple times
   !$omp target map(always, present, close, present, to: x)
   x = x + 1
   !$omp end target
diff --git a/flang/test/Semantics/OpenMP/scan1.f90 b/flang/test/Semantics/OpenMP/scan1.f90
index f0b9be96f90b9..e6b1ccf695fff 100644
--- a/flang/test/Semantics/OpenMP/scan1.f90
+++ b/flang/test/Semantics/OpenMP/scan1.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp -fopenmp-version=50
 
 subroutine test_scan()
  integer x, y, k, z
diff --git a/flang/test/Semantics/OpenMP/simd-linear-array.f90 b/flang/test/Semantics/OpenMP/simd-linear-array.f90
index e904f348ae47a..94c1fe43f8f81 100644
--- a/flang/test/Semantics/OpenMP/simd-linear-array.f90
+++ b/flang/test/Semantics/OpenMP/simd-linear-array.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp -fopenmp-version=52
 ! OpenMP Version 5.2
 ! Test that arrays in LINEAR clause are rejected on SIMD directive
 ! This test addresses issue #171007 - crash with array in LINEAR clause
@@ -75,6 +75,7 @@ subroutine test_declare_simd_ref_array_valid(arr)
   implicit none
   integer, intent(in) :: arr(:)
   
+  !WARNING: The 'modifier(<list>)' syntax is deprecated in OpenMP v5.2, use '<list> : modifier' instead
   !$omp declare simd linear(ref(arr))
   ! No error expected - REF modifier allows assumed-shape arrays
 end subroutine
diff --git a/flang/test/Semantics/OpenMP/to-clause-v45.f90 b/flang/test/Semantics/OpenMP/to-clause-v45.f90
index 2fff681d621b1..927a79f7dfd5f 100644
--- a/flang/test/Semantics/OpenMP/to-clause-v45.f90
+++ b/flang/test/Semantics/OpenMP/to-clause-v45.f90
@@ -19,14 +19,6 @@ subroutine f02(x)
   !$omp target update to(present, iterator(i = 1:5): x(i))
 end
 
-subroutine f03(x)
-  integer :: x(10)
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!WARNING: 'present-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=51
-!ERROR: 'present-modifier' modifier cannot occur multiple times
-  !$omp target update to(present, present: x)
-end
-
 subroutine f04
 !ERROR: 'f04' must be a variable list item
   !$omp target update to(f04)
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h b/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
new file mode 100644
index 0000000000000..f00ac308c212e
--- /dev/null
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPDescriptors.h
@@ -0,0 +1,277 @@
+//===-- OMPDescriptors.h - OpenMP descriptors --------------------- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains definitions and declarations of OpenMP elements.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
+#define LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
+
+namespace llvm::omp {
+// The enumerations will be auto-generated.
+
+enum class Property {
+  AllDataEnvironments,
+  First_ = AllDataEnvironments,
+  AllPrivatizing,
+  Complex,
+  Constant,
+  DataCopying,
+  DataEnvironmentAttribute,
+  DataMappingAttribute,
+  DataMotionAttribute,
+  DataSharingAttribute,
+  DefaultAttribute,
+  DeviceAssociated,
+  DeviceGlobalRequirement,
+  DispatchCompliant,
+  DispatchRequirement,
+  EndClause,
+  Exclusive,
+  IcvDefaulted,
+  IcvModifying,
+  InnermostLeaf,
+  MapTypeModifying,
+  OnceForAllConstituents,
+  Optional,
+  OriginalListItemUpdating,
+  OutermostLeaf,
+  Positive,
+  PostModified,
+  Privatization,
+  ReductionParticipating,
+  ReductionScoping,
+  RegionInvariant,
+  Repeatable,
+  Required,
+  ScheduleSpecification,
+  SpaceConfiguring,
+  TargetConsistent,
+  TaskInherited,
+  TaskSynchronizing,
+  TaskgraphAltering,
+  Ultimate,
+  Unique,
+  Last_ = Unique,
+};
+
+static constexpr size_t Property_enumSize =
+    llvm::to_underlying(Property::Last_) -
+    llvm::to_underlying(Property::First_) + 1;
+
+enum class Modifier {
+  AccessGroup,
+  First_ = AccessGroup,
+  AdjustOp,
+  AlignModifier,
+  Alignment,
+  AllocatorComplexModifier,
+  AllocatorSimpleModifier,
+  AlwaysModifier,
+  AttachModifier,
+  AutomapModifier,
+  ChunkModifier,
+  CloseModifier,
+  ContextSelector,
+  DefaultModifier,
+  DeleteModifier,
+  DependenceType,
+  DepinfoModifier,
+  DepobjModifier,
+  DeviceModifier,
+  DimsModifier,
+  DirectiveNameModifier,
+  Expectation,
+  Fallback,
+  FallbackModifier,
+  InductionIdentifier,
+  InductionModifier,
+  InscanModifier,
+  InteropType,
+  Iterator,
+  LastprivateModifier,
+  LinearModifier,
+  LinearStep,
+  LocModifier,
+  LoopModifier,
+  LowerBound,
+  MapType,
+  MapTypeModifier,
+  Mapper,
+  MemSpace,
+  Monotonic,
+  NeedDeviceAddr,
+  NeedDevicePtr,
+  NoncommutativeModifier,
+  Nonmonotonic,
+  Nothing,
+  OmpxHoldModifier,
+  OptionalModifier,
+  OrderModifier,
+  OrderingModifier,
+  OriginalSharingModifier,
+  PerThreadModifier,
+  PreferType,
+  Prescriptiveness,
+  PrescriptivenessModifier,
+  PresentModifier,
+  ReductionIdentifier,
+  ReductionModifier,
+  RefModifier,
+  Saved,
+  ScaledModifier,
+  SelfModifier,
+  Simd,
+  SizesSelector,
+  StepComplexModifier,
+  StepModifier,
+  StepSimpleModifier,
+  TargetType,
+  TargetsyncType,
+  TaskDependenceType,
+  TaskModifier,
+  TraitsArray,
+  VariableCategory,
+  Last_ = VariableCategory,
+};
+
+static constexpr size_t Modifier_enumSize =
+    llvm::to_underlying(Modifier::Last_) -
+    llvm::to_underlying(Modifier::First_) + 1;
+
+enum class ModifierSet {
+  DependModifierSet1,
+  First_ = DependModifierSet1,
+  NumTeamsModifierSet1,
+  ReductionModifierSet1,
+  Last_ = ReductionModifierSet1,
+};
+
+static constexpr size_t ModifierSet_enumSize =
+    llvm::to_underlying(ModifierSet::Last_) -
+    llvm::to_underlying(ModifierSet::First_) + 1;
+
+enum class ModifierGroup {
+  AdjustOp,
+  First_ = AdjustOp,
+  DependListType,
+  InteropType,
+  MapTypeModifying,
+  ReductionType,
+  VariableSelector,
+  Last_ = VariableSelector,
+};
+
+static constexpr size_t ModifierGroup_enumSize =
+    llvm::to_underlying(ModifierGroup::Last_) -
+    llvm::to_underlying(ModifierGroup::First_) + 1;
+
+using Properties = EnumSet<Property, Property_enumSize>;
+using Modifiers = EnumSet<Modifier, Modifier_enumSize>;
+using ModifierSets = EnumSet<ModifierSet, ModifierSet_enumSize>;
+using ModifierGroups = EnumSet<ModifierGroup, ModifierGroup_enumSize>;
+
+using Clauses = llvm::omp::ClauseSet;
+using Directives = llvm::omp::DirectiveSet;
+
+namespace desc {
+struct BaseDetails {
+  Properties Props;
+};
+
+// struct DirectiveDetails : public BaseDetails {
+//   Association Assoc;
+//   Category Cat;
+//   Clauses Cls;
+//   SourceLanguage Langs;
+//   StringRef Spelling;
+// };
+
+struct ClauseDetails : public BaseDetails {
+  Directives Dirs;
+  //  SourceLanguage Langs;
+  Modifiers Mods;
+  ModifierSets ModSets;
+  ModifierGroups ModGroups;
+  //  StringRef Spelling;
+};
+
+struct ModifierDetails : public BaseDetails {
+  Clauses Cls;
+};
+
+struct ModifierSetDetails : public BaseDetails {
+  Modifiers Mods;
+};
+
+struct ModifierGroupDetails : public ModifierSetDetails {
+  Clauses Cls;
+};
+
+template <typename DetailsTy> using DetailsMap = DenseMap<unsigned, DetailsTy>;
+} // namespace desc
+
+template <typename DetailsTy> struct Descriptor {
+  //  Descriptor(StringRef N, desc::DetailsMap<DetailsTy> &&D) : Name(N),
+  //  Details(std::move(D)) {}
+  StringRef getName() const { return Name; }
+  SmallVector<unsigned> getVersions() const {
+    SmallVector<unsigned> Vs;
+    for (unsigned V : llvm::omp::getOpenMPVersions()) {
+      if (auto F = Details.find(V); F != Details.end())
+        Vs.push_back(V);
+    }
+    return Vs;
+  }
+  // private:
+  StringRef Name;
+  // protected:
+  desc::DetailsMap<DetailsTy> Details;
+};
+
+template <typename Enum, typename DescriptorTy>
+using DescriptorMap = DenseMap<Enum, DescriptorTy>;
+
+struct ClauseDesc : public Descriptor<desc::ClauseDetails> {
+  Properties getProperties(unsigned V) const;
+  Directives getDirectives(unsigned V) const;
+  Modifiers getModifiers(unsigned V) const;
+  ModifierSets getModifierSets(unsigned V) const;
+  ModifierGroups getModifierGroups(unsigned V) const;
+};
+
+struct ModifierDesc : public Descriptor<desc::ModifierDetails> {
+  Properties getProperties(unsigned V) const;
+  Clauses getClauses(unsigned V) const;
+};
+
+struct ModifierSetDesc : public Descriptor<desc::ModifierSetDetails> {
+  Properties getProperties(unsigned V) const;
+  Modifiers getModifiers(unsigned V) const;
+};
+
+struct ModifierGroupDesc : public Descriptor<desc::ModifierGroupDetails> {
+  Properties getProperties(unsigned V) const;
+  Modifiers getModifiers(unsigned V) const;
+  Clauses getClauses(unsigned V) const;
+};
+
+const ClauseDesc &getDescriptor(llvm::omp::Clause C);
+const ModifierDesc &getDescriptor(llvm::omp::Modifier M);
+const ModifierSetDesc &getDescriptor(llvm::omp::ModifierSet S);
+const ModifierGroupDesc &getDescriptor(llvm::omp::ModifierGroup G);
+
+Properties getProperties(Clause C, unsigned Version);
+} // namespace llvm::omp
+
+#endif // LLVM_FRONTEND_OPENMP_OMPDESCRIPTORS_H
diff --git a/llvm/lib/Frontend/OpenMP/CMakeLists.txt b/llvm/lib/Frontend/OpenMP/CMakeLists.txt
index e60b59c1203b9..a51a849a098ab 100644
--- a/llvm/lib/Frontend/OpenMP/CMakeLists.txt
+++ b/llvm/lib/Frontend/OpenMP/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_llvm_component_library(LLVMFrontendOpenMP
   OMP.cpp
   OMPContext.cpp
+  OMPDescriptors.cpp
   OMPIRBuilder.cpp
   DirectiveNameParser.cpp
 
diff --git a/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp b/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
new file mode 100644
index 0000000000000..fecbea01eb75c
--- /dev/null
+++ b/llvm/lib/Frontend/OpenMP/OMPDescriptors.cpp
@@ -0,0 +1,6582 @@
+//===-- OMPDescriptors.cpp - OpenMP descriptors ------------------- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file contains descriptors of OpenMP elements.
+// This file will be auto-generated.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Frontend/OpenMP/OMPDescriptors.h"
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/Frontend/OpenMP/OMP.h"
+
+namespace llvm::omp {
+
+const DescriptorMap<Clause, ClauseDesc> &getClauseMap() {
+  static const DescriptorMap<Clause, ClauseDesc> Map{
+      {
+          Clause::OMPC_aligned,
+          {
+              "aligned",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::PostModified}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::Alignment, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_capture,
+          {
+              "capture",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_collapse,
+          {
+              "collapse",
+              {
+                  {45,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_copyin,
+          {
+              "copyin",
+              {
+                  {45,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataCopying, Property::OutermostLeaf}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_copyprivate,
+          {
+              "copyprivate",
+              {
+                  {45,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataCopying, Property::EndClause,
+                      Property::InnermostLeaf}},
+                    {Directive::OMPD_single},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_default,
+          {
+              "default",
+              {
+                  {45,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_parallel, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DefaultAttribute, Property::PostModified}},
+                    {Directive::OMPD_parallel, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {ModifierGroup::VariableSelector}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_defaultmap,
+          {
+              "defaultmap",
+              {
+                  {45,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_target},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_target},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_target},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_target},
+                    {Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DefaultAttribute, Property::PostModified,
+                      Property::Unique}},
+                    {Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::VariableCategory},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DefaultAttribute, Property::PostModified}},
+                    {Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {ModifierGroup::VariableSelector}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_depend,
+          {
+              "depend",
+              {
+                  {45,
+                   {{{}},
+                    {Directive::OMPD_ordered, Directive::OMPD_target,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task},
+                    {Modifier::DependenceType, Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {50,
+                   {{{}},
+                    {Directive::OMPD_depobj, Directive::OMPD_ordered,
+                     Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskwait},
+                    {Modifier::DependenceType, Modifier::Iterator,
+                     Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DispatchRequirement}},
+                    {Directive::OMPD_depobj, Directive::OMPD_dispatch,
+                     Directive::OMPD_interop, Directive::OMPD_ordered,
+                     Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskwait},
+                    {Modifier::DependenceType, Modifier::Iterator,
+                     Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DispatchRequirement}},
+                    {Directive::OMPD_depobj, Directive::OMPD_dispatch,
+                     Directive::OMPD_interop, Directive::OMPD_target,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskwait},
+                    {Modifier::Iterator, Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DispatchRequirement, Property::TaskInherited,
+                      Property::TaskgraphAltering}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskwait},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DispatchRequirement, Property::TaskInherited,
+                      Property::TaskSynchronizing,
+                      Property::TaskgraphAltering}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskwait},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::TaskDependenceType},
+                    {ModifierSet::DependModifierSet1},
+                    {ModifierGroup::DependListType}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_device,
+          {
+              "device",
+              {
+                  {45,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {Modifier::DeviceModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {Modifier::DeviceModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {Modifier::DeviceModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {Modifier::DeviceModifier, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_interop,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {Modifier::DeviceModifier, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_dist_schedule,
+          {
+              "dist_schedule",
+              {
+                  {45,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_final,
+          {
+              "final",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_firstprivate,
+          {
+              "firstprivate",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier, Modifier::Saved},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier, Modifier::Saved},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_from,
+          {
+              "from",
+              {
+                  {45,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::Mapper},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::Iterator, Modifier::Mapper,
+                     Modifier::PresentModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::Expectation, Modifier::Iterator,
+                     Modifier::Mapper},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::Mapper, Modifier::PresentModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::Mapper, Modifier::PresentModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_grainsize,
+          {
+              "grainsize",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::TaskgraphAltering, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::TaskgraphAltering, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_hint,
+          {
+              "hint",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_critical},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_critical},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_critical},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_critical},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_critical},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_critical},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_if,
+          {
+              "if",
+              {
+                  {45,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_simd, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_simd, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_simd, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_simd, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskgraph, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_cancel, Directive::OMPD_parallel,
+                     Directive::OMPD_simd, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskgraph, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_inbranch,
+          {
+              "inbranch",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_is_device_ptr,
+          {
+              "is_device_ptr",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::InnermostLeaf, Property::Privatization}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::InnermostLeaf, Property::Privatization}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::InnermostLeaf, Property::Privatization}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::InnermostLeaf, Property::Privatization}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_lastprivate,
+          {
+              "lastprivate",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::LastprivateModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::LastprivateModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::LastprivateModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::LastprivateModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::LastprivateModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_linear,
+          {
+              "linear",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::LinearStep},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::LinearModifier, Modifier::LinearStep},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::LinearModifier, Modifier::LinearStep},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::LinearModifier, Modifier::StepComplexModifier,
+                     Modifier::StepSimpleModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier, Modifier::LinearModifier,
+                     Modifier::StepComplexModifier,
+                     Modifier::StepSimpleModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::PostModified, Property::Privatization}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier, Modifier::LinearModifier,
+                     Modifier::StepComplexModifier,
+                     Modifier::StepSimpleModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_link,
+          {
+              "link",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_map,
+          {
+              "map",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::MapType, Modifier::MapTypeModifier,
+                     Modifier::OmpxHoldModifier},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::MapType, Modifier::MapTypeModifier,
+                     Modifier::Mapper, Modifier::OmpxHoldModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::Iterator, Modifier::MapType,
+                     Modifier::MapTypeModifier, Modifier::Mapper,
+                     Modifier::OmpxHoldModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::Iterator, Modifier::MapType,
+                     Modifier::MapTypeModifier, Modifier::Mapper,
+                     Modifier::OmpxHoldModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::AlwaysModifier, Modifier::CloseModifier,
+                     Modifier::DeleteModifier, Modifier::DirectiveNameModifier,
+                     Modifier::Iterator, Modifier::MapType, Modifier::Mapper,
+                     Modifier::OmpxHoldModifier, Modifier::PresentModifier,
+                     Modifier::RefModifier, Modifier::SelfModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_mapper, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data},
+                    {Modifier::AttachModifier, Modifier::DirectiveNameModifier,
+                     Modifier::Iterator, Modifier::MapType, Modifier::Mapper,
+                     Modifier::OmpxHoldModifier, Modifier::RefModifier},
+                    {},
+                    {ModifierGroup::MapTypeModifying}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_mergeable,
+          {
+              "mergeable",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_nogroup,
+          {
+              "nogroup",
+              {
+                  {45,
+                   {{{Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_taskgraph,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::OutermostLeaf, Property::TaskSynchronizing,
+                      Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_taskgraph,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_notinbranch,
+          {
+              "notinbranch",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_nowait,
+          {
+              "nowait",
+              {
+                  {45,
+                   {{{Property::EndClause, Property::OutermostLeaf,
+                      Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::EndClause, Property::OutermostLeaf,
+                      Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_taskwait,
+                     Directive::OMPD_workshare},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DispatchRequirement, Property::EndClause,
+                      Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_interop,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_taskwait,
+                     Directive::OMPD_workshare},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DispatchRequirement, Property::EndClause,
+                      Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_interop,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_taskwait,
+                     Directive::OMPD_workshare},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DispatchRequirement, Property::EndClause,
+                      Property::OutermostLeaf, Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_interop,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_taskwait,
+                     Directive::OMPD_workshare},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DispatchRequirement, Property::EndClause,
+                      Property::OutermostLeaf, Property::TaskSynchronizing,
+                      Property::Unique}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_interop,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_taskwait,
+                     Directive::OMPD_workshare},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_num_tasks,
+          {
+              "num_tasks",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::TaskgraphAltering, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::TaskgraphAltering, Property::Unique}},
+                    {Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_num_teams,
+          {
+              "num_teams",
+              {
+                  {45,
+                   {{{Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {Modifier::LowerBound},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {Modifier::LowerBound},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {Modifier::LowerBound},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier, Modifier::LowerBound},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::SpaceConfiguring, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+                     Modifier::LowerBound},
+                    {ModifierSet::NumTeamsModifierSet1},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_num_threads,
+          {
+              "num_threads",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::Prescriptiveness},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::SpaceConfiguring, Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+                     Modifier::PrescriptivenessModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_ordered,
+          {
+              "ordered",
+              {
+                  {45,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::OnceForAllConstituents, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_priority,
+          {
+              "priority",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskgraph, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskgraph, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_private,
+          {
+              "private",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_parallel, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_proc_bind,
+          {
+              "proc_bind",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_read,
+          {
+              "read",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_reduction,
+          {
+              "reduction",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_parallel, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_teams},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_loop, Directive::OMPD_parallel,
+                     Directive::OMPD_sections, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::ReductionIdentifier,
+                     Modifier::ReductionModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_loop, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::ReductionIdentifier,
+                     Modifier::ReductionModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_loop, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::ReductionIdentifier,
+                     Modifier::ReductionModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_loop, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::OriginalSharingModifier,
+                     Modifier::ReductionIdentifier,
+                     Modifier::ReductionModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionParticipating,
+                      Property::ReductionScoping}},
+                    {Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_loop, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_simd, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::OriginalSharingModifier,
+                     Modifier::PerThreadModifier,
+                     Modifier::ReductionIdentifier},
+                    {ModifierSet::ReductionModifierSet1},
+                    {ModifierGroup::ReductionType}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_safelen,
+          {
+              "safelen",
+              {
+                  {45,
+                   {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {50,
+                   {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {51,
+                   {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {52,
+                   {{{Property::Unique}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_schedule,
+          {
+              "schedule",
+              {
+                  {45,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::OrderingModifier},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::OrderingModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::OrderingModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::OrderingModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::DirectiveNameModifier,
+                     Modifier::OrderingModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_do, Directive::OMPD_for},
+                    {Modifier::ChunkModifier, Modifier::DirectiveNameModifier,
+                     Modifier::OrderingModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_seq_cst,
+          {
+              "seq_cst",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_shared,
+          {
+              "shared",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_parallel, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_simd,
+          {
+              "simd",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_simdlen,
+          {
+              "simdlen",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_simd, Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier, Modifier::ScaledModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_thread_limit,
+          {
+              "thread_limit",
+              {
+                  {45,
+                   {{{Property::IcvModifying, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::IcvModifying, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::IcvModifying, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::IcvModifying, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::IcvModifying, Property::TargetConsistent,
+                      Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::IcvModifying, Property::SpaceConfiguring,
+                      Property::TargetConsistent, Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {Modifier::DimsModifier, Modifier::DirectiveNameModifier,
+                     Modifier::PrescriptivenessModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_threads,
+          {
+              "threads",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_to,
+          {
+              "to",
+              {
+                  {45,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_declare_target,
+                     Directive::OMPD_target_update},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_declare_target,
+                     Directive::OMPD_target_update},
+                    {Modifier::Mapper},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_declare_target,
+                     Directive::OMPD_target_update},
+                    {Modifier::Iterator, Modifier::Mapper,
+                     Modifier::PresentModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::Expectation, Modifier::Iterator,
+                     Modifier::Mapper},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::Mapper, Modifier::PresentModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataMotionAttribute}},
+                    {Directive::OMPD_target_update},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator,
+                     Modifier::Mapper, Modifier::PresentModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_uniform,
+          {
+              "uniform",
+              {
+                  {45,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_untied,
+          {
+              "untied",
+              {
+                  {45,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_update,
+          {
+              "update",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_use_device_ptr,
+          {
+              "use_device_ptr",
+              {
+                  {45,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::Privatization}},
+                    {Directive::OMPD_target_data},
+                    {Modifier::DirectiveNameModifier, Modifier::Fallback},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_write,
+          {
+              "write",
+              {
+                  {45,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_acq_rel,
+          {
+              "acq_rel",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_acquire,
+          {
+              "acquire",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_affinity,
+          {
+              "affinity",
+              {
+                  {50,
+                   {{{}},
+                    {Directive::OMPD_task},
+                    {Modifier::Iterator},
+                    {},
+                    {}}},
+                  {51,
+                   {{{}},
+                    {Directive::OMPD_task},
+                    {Modifier::Iterator},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task},
+                    {Modifier::Iterator},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::TaskInherited}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::TaskInherited}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task},
+                    {Modifier::DirectiveNameModifier, Modifier::Iterator},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_allocate,
+          {
+              "allocate",
+              {
+                  {50,
+                   {{{Property::AllPrivatizing}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskgroup, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::AllocatorSimpleModifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::AllPrivatizing}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_parallel,
+                     Directive::OMPD_scope, Directive::OMPD_sections,
+                     Directive::OMPD_single, Directive::OMPD_target,
+                     Directive::OMPD_task, Directive::OMPD_taskgroup,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::AlignModifier,
+                     Modifier::AllocatorSimpleModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::AllPrivatizing}},
+                    {Directive::OMPD_allocators, Directive::OMPD_distribute,
+                     Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskgroup, Directive::OMPD_taskloop,
+                     Directive::OMPD_teams},
+                    {Modifier::AlignModifier,
+                     Modifier::AllocatorComplexModifier,
+                     Modifier::AllocatorSimpleModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::AllPrivatizing}},
+                    {Directive::OMPD_allocators, Directive::OMPD_distribute,
+                     Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskgroup,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::AlignModifier,
+                     Modifier::AllocatorComplexModifier,
+                     Modifier::AllocatorSimpleModifier,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::AllPrivatizing, Property::TargetConsistent}},
+                    {Directive::OMPD_allocators, Directive::OMPD_distribute,
+                     Directive::OMPD_do, Directive::OMPD_for,
+                     Directive::OMPD_parallel, Directive::OMPD_scope,
+                     Directive::OMPD_sections, Directive::OMPD_single,
+                     Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskgroup,
+                     Directive::OMPD_taskloop, Directive::OMPD_teams},
+                    {Modifier::AlignModifier,
+                     Modifier::AllocatorComplexModifier,
+                     Modifier::AllocatorSimpleModifier,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_allocator,
+          {
+              "allocator",
+              {
+                  {50,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::IcvDefaulted, Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_atomic_default_mem_order,
+          {
+              "atomic_default_mem_order",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_bind,
+          {
+              "bind",
+              {
+                  {50,
+                   {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+                  {51,
+                   {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+                  {52,
+                   {{{Property::Unique}}, {Directive::OMPD_loop}, {}, {}, {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_loop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_loop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_default_variant,
+          {
+              "default-variant",
+              {
+                  {50,
+                   {{{Property::Ultimate, Property::Unique}},
+                    {Directive::OMPD_metadirective},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Ultimate, Property::Unique}},
+                    {Directive::OMPD_metadirective},
+                    {},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_destroy,
+          {
+              "destroy",
+              {
+                  {50, {{{}}, {Directive::OMPD_depobj}, {}, {}, {}}},
+                  {51,
+                   {{{}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_detach,
+          {
+              "detach",
+              {
+                  {50,
+                   {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization, Property::Unique}},
+                    {Directive::OMPD_task},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization, Property::Unique}},
+                    {Directive::OMPD_task},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization, Property::Unique}},
+                    {Directive::OMPD_task},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization, Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataSharingAttribute, Property::InnermostLeaf,
+                      Property::Privatization, Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_device_type,
+          {
+              "device_type",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target,
+                     Directive::OMPD_groupprivate, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target,
+                     Directive::OMPD_groupprivate, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_dynamic_allocators,
+          {
+              "dynamic_allocators",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_exclusive,
+          {
+              "exclusive",
+              {
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_in_reduction,
+          {
+              "in_reduction",
+              {
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization,
+                      Property::ReductionParticipating}},
+                    {Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization,
+                      Property::ReductionParticipating}},
+                    {Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization,
+                      Property::ReductionParticipating}},
+                    {Directive::OMPD_target, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization,
+                      Property::ReductionParticipating}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute, Property::Privatization,
+                      Property::ReductionParticipating}},
+                    {Directive::OMPD_target, Directive::OMPD_target_data,
+                     Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_inclusive,
+          {
+              "inclusive",
+              {
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_initializer,
+          {
+              "initializer",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_match,
+          {
+              "match",
+              {
+                  {50,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_variant},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_begin_declare_variant,
+                     Directive::OMPD_declare_variant},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_begin_declare_variant,
+                     Directive::OMPD_declare_variant},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_begin_declare_variant,
+                     Directive::OMPD_declare_variant},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_begin_declare_variant,
+                     Directive::OMPD_declare_variant},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_nontemporal,
+          {
+              "nontemporal",
+              {
+                  {50, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {51, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {52, {{{}}, {Directive::OMPD_simd}, {}, {}, {}}},
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{}},
+                    {Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_order,
+          {
+              "order",
+              {
+                  {50,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd},
+                    {Modifier::OrderModifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd},
+                    {Modifier::OrderModifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier, Modifier::OrderModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::ScheduleSpecification, Property::Unique}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_loop,
+                     Directive::OMPD_simd},
+                    {Modifier::DirectiveNameModifier, Modifier::OrderModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_relaxed,
+          {
+              "relaxed",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_release,
+          {
+              "release",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_reverse_offload,
+          {
+              "reverse_offload",
+              {
+                  {50,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_task_reduction,
+          {
+              "task_reduction",
+              {
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionScoping}},
+                    {Directive::OMPD_taskgroup},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionScoping}},
+                    {Directive::OMPD_taskgroup},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionScoping}},
+                    {Directive::OMPD_taskgroup},
+                    {Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionScoping}},
+                    {Directive::OMPD_taskgroup},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization, Property::ReductionScoping}},
+                    {Directive::OMPD_taskgroup},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::ReductionIdentifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_unified_address,
+          {
+              "unified_address",
+              {
+                  {50,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_unified_shared_memory,
+          {
+              "unified_shared_memory",
+              {
+                  {50,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_update_depend_objects,
+          {
+              "update-depend_objects",
+              {
+                  {50,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_depobj},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_depobj},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_depobj},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_depobj},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_depobj},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::TaskDependenceType},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_use_device_addr,
+          {
+              "use_device_addr",
+              {
+                  {50,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated}},
+                    {Directive::OMPD_target_data},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated}},
+                    {Directive::OMPD_target_data},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::AllDataEnvironments,
+                      Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated}},
+                    {Directive::OMPD_target_data},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_uses_allocators,
+          {
+              "uses_allocators",
+              {
+                  {50,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_target},
+                    {Modifier::TraitsArray},
+                    {},
+                    {}}},
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_target},
+                    {Modifier::MemSpace, Modifier::TraitsArray},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_target},
+                    {Modifier::MemSpace, Modifier::TraitsArray},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier, Modifier::MemSpace,
+                     Modifier::TraitsArray},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute}},
+                    {Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier, Modifier::MemSpace,
+                     Modifier::TraitsArray},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_when,
+          {
+              "when",
+              {
+                  {50,
+                   {{{}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::ContextSelector},
+                    {},
+                    {}}},
+                  {51,
+                   {{{}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::ContextSelector},
+                    {},
+                    {}}},
+                  {52,
+                   {{{}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::ContextSelector},
+                    {},
+                    {}}},
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::ContextSelector,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::ContextSelector,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_absent,
+          {
+              "absent",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_adjust_args,
+          {
+              "adjust_args",
+              {
+                  {51,
+                   {{{Property::DispatchCompliant}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::AdjustOp},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DispatchCompliant}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::AdjustOp},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DispatchCompliant}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::AdjustOp, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DispatchCompliant}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {ModifierGroup::AdjustOp}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_align,
+          {
+              "align",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_allocate},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_append_args,
+          {
+              "append_args",
+              {
+                  {51,
+                   {{{Property::DispatchCompliant, Property::Unique}},
+                    {Directive::OMPD_declare_variant},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DispatchCompliant, Property::Unique}},
+                    {Directive::OMPD_declare_variant},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DispatchCompliant, Property::Unique}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DispatchCompliant, Property::Unique}},
+                    {Directive::OMPD_declare_variant},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_at,
+          {
+              "at",
+              {
+                  {51,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {52,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_compare,
+          {
+              "compare",
+              {
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_contains,
+          {
+              "contains",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_fail,
+          {
+              "fail",
+              {
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_filter,
+          {
+              "filter",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_masked},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_masked},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_masked},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_masked},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_full,
+          {
+              "full",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_has_device_addr,
+          {
+              "has_device_addr",
+              {
+                  {51,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::OutermostLeaf}},
+                    {Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::OutermostLeaf}},
+                    {Directive::OMPD_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::OutermostLeaf}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::DeviceAssociated, Property::DispatchRequirement,
+                      Property::OutermostLeaf}},
+                    {Directive::OMPD_dispatch, Directive::OMPD_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_holds,
+          {
+              "holds",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_indirect,
+          {
+              "indirect",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_begin_declare_target,
+                     Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_init,
+          {
+              "init",
+              {
+                  {51,
+                   {{{Property::InnermostLeaf}},
+                    {Directive::OMPD_interop},
+                    {Modifier::InteropType},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf}},
+                    {Directive::OMPD_interop},
+                    {Modifier::InteropType},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {Modifier::DepinfoModifier, Modifier::DirectiveNameModifier,
+                     Modifier::InteropType, Modifier::PreferType},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf}},
+                    {Directive::OMPD_depobj, Directive::OMPD_interop},
+                    {Modifier::DepinfoModifier, Modifier::DirectiveNameModifier,
+                     Modifier::PreferType},
+                    {},
+                    {ModifierGroup::InteropType}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_message,
+          {
+              "message",
+              {
+                  {51,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {52,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error, Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error, Directive::OMPD_parallel,
+                     Directive::OMPD_target, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_no_openmp,
+          {
+              "no_openmp",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_no_openmp_routines,
+          {
+              "no_openmp_routines",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_no_parallelism,
+          {
+              "no_parallelism",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_nocontext,
+          {
+              "nocontext",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_novariants,
+          {
+              "novariants",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_partial,
+          {
+              "partial",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_severity,
+          {
+              "severity",
+              {
+                  {51,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {52,
+                   {{{Property::Unique}}, {Directive::OMPD_error}, {}, {}, {}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error, Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_error, Directive::OMPD_parallel,
+                     Directive::OMPD_target, Directive::OMPD_teams},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_sizes,
+          {
+              "sizes",
+              {
+                  {51,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_tile},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_tile},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_stripe, Directive::OMPD_tile},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_stripe, Directive::OMPD_tile},
+                    {Modifier::DirectiveNameModifier, Modifier::SizesSelector},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_use,
+          {
+              "use",
+              {
+                  {51, {{{}}, {Directive::OMPD_interop}, {}, {}, {}}},
+                  {52, {{{}}, {Directive::OMPD_interop}, {}, {}, {}}},
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_interop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{}},
+                    {Directive::OMPD_interop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_weak,
+          {
+              "weak",
+              {
+                  {51,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {52,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_atomic},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_doacross,
+          {
+              "doacross",
+              {
+                  {52,
+                   {{{Property::Required}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DependenceType},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Required}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DependenceType, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required}},
+                    {Directive::OMPD_ordered},
+                    {Modifier::DependenceType, Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_enter,
+          {
+              "enter",
+              {
+                  {52,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::AutomapModifier,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataMappingAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::AutomapModifier,
+                     Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_otherwise,
+          {
+              "otherwise",
+              {
+                  {52,
+                   {{{Property::Ultimate, Property::Unique}},
+                    {Directive::OMPD_metadirective},
+                    {},
+                    {},
+                    {}}},
+                  {60,
+                   {{{Property::Ultimate, Property::Unique}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Ultimate, Property::Unique}},
+                    {Directive::OMPD_metadirective},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_apply,
+          {
+              "apply",
+              {
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_fuse, Directive::OMPD_interchange,
+                     Directive::OMPD_nothing, Directive::OMPD_reverse,
+                     Directive::OMPD_split, Directive::OMPD_stripe,
+                     Directive::OMPD_tile, Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier, Modifier::LoopModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{}},
+                    {Directive::OMPD_flatten, Directive::OMPD_fuse,
+                     Directive::OMPD_interchange, Directive::OMPD_nothing,
+                     Directive::OMPD_reverse, Directive::OMPD_split,
+                     Directive::OMPD_stripe, Directive::OMPD_tile,
+                     Directive::OMPD_unroll},
+                    {Modifier::DirectiveNameModifier, Modifier::LoopModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_collector,
+          {
+              "collector",
+              {
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_induction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_induction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_combiner,
+          {
+              "combiner",
+              {
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_reduction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_counts,
+          {
+              "counts",
+              {
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_split},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_split},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_device_safesync,
+          {
+              "device_safesync",
+              {
+                  {60,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_graph_id,
+          {
+              "graph_id",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskgraph},
+                    {},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskgraph},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_graph_reset,
+          {
+              "graph_reset",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskgraph},
+                    {},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_taskgraph},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_induction,
+          {
+              "induction",
+              {
+                  {60,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::InductionIdentifier, Modifier::InductionModifier,
+                     Modifier::StepModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute,
+                      Property::DataSharingAttribute,
+                      Property::OriginalListItemUpdating,
+                      Property::Privatization}},
+                    {Directive::OMPD_distribute, Directive::OMPD_do,
+                     Directive::OMPD_for, Directive::OMPD_simd,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier,
+                     Modifier::InductionIdentifier, Modifier::InductionModifier,
+                     Modifier::StepModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_inductor,
+          {
+              "inductor",
+              {
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_induction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Directive::OMPD_declare_induction},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_init_complete,
+          {
+              "init_complete",
+              {
+                  {60,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::InnermostLeaf, Property::Unique}},
+                    {Directive::OMPD_scan},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_interop,
+          {
+              "interop",
+              {
+                  {60,
+                   {{{Property::DispatchRequirement, Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DispatchRequirement, Property::Unique}},
+                    {Directive::OMPD_dispatch},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_local,
+          {
+              "local",
+              {
+                  {60,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DataEnvironmentAttribute}},
+                    {Directive::OMPD_declare_target},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_looprange,
+          {
+              "looprange",
+              {
+                  {60,
+                   {{{Property::Unique}}, {Directive::OMPD_fuse}, {}, {}, {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_fuse},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_memscope,
+          {
+              "memscope",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_atomic, Directive::OMPD_flush},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_no_openmp_constructs,
+          {
+              "no_openmp_constructs",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_assume, Directive::OMPD_assumes,
+                     Directive::OMPD_begin_assumes},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_permutation,
+          {
+              "permutation",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_interchange},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_interchange},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_replayable,
+          {
+              "replayable",
+              {
+                  {60,
+                   {{{}},
+                    {Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_taskwait},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target, Directive::OMPD_target_enter_data,
+                     Directive::OMPD_target_exit_data,
+                     Directive::OMPD_target_update, Directive::OMPD_task,
+                     Directive::OMPD_taskloop, Directive::OMPD_taskwait},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_safesync,
+          {
+              "safesync",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_parallel},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_self_maps,
+          {
+              "self_maps",
+              {
+                  {60,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::DeviceGlobalRequirement, Property::Unique}},
+                    {Directive::OMPD_requires},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_threadset,
+          {
+              "threadset",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_task, Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_transparent,
+          {
+              "transparent",
+              {
+                  {60,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_target_data, Directive::OMPD_task,
+                     Directive::OMPD_taskloop},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_depth,
+          {
+              "depth",
+              {
+                  {61,
+                   {{{Property::Unique}},
+                    {Directive::OMPD_flatten, Directive::OMPD_fuse},
+                    {Modifier::DirectiveNameModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+      {
+          Clause::OMPC_dyn_groupprivate,
+          {
+              "dyn_groupprivate",
+              {
+                  {61,
+                   {{{Property::TargetConsistent}},
+                    {Directive::OMPD_target, Directive::OMPD_teams},
+                    {Modifier::AccessGroup, Modifier::DirectiveNameModifier,
+                     Modifier::FallbackModifier},
+                    {},
+                    {}}},
+              },
+          },
+      },
+  };
+  return Map;
+}
+
+const DescriptorMap<Modifier, ModifierDesc> &getModifierMap() {
+  static const DescriptorMap<Modifier, ModifierDesc> Map{
+      {
+          Modifier::Alignment,
+          {
+              "alignment",
+              {
+                  {45,
+                   {{{Property::Constant, Property::Positive,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+                  {50,
+                   {{{Property::Constant, Property::Positive,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+                  {51,
+                   {{{Property::Positive, Property::RegionInvariant,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+                  {52,
+                   {{{Property::Positive, Property::RegionInvariant,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+                  {60,
+                   {{{Property::Constant, Property::Positive,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+                  {61,
+                   {{{Property::Constant, Property::Positive,
+                      Property::Ultimate, Property::Unique}},
+                    {Clause::OMPC_aligned}}},
+              },
+          },
+      },
+      {
+          Modifier::ChunkModifier,
+          {
+              "chunk-modifier",
+              {
+                  {45, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {50, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+              },
+          },
+      },
+      {
+          Modifier::DependenceType,
+          {
+              "dependence-type",
+              {
+                  {45, {{{Property::Required}}, {Clause::OMPC_depend}}},
+                  {50, {{{Property::Required}}, {Clause::OMPC_depend}}},
+                  {51, {{{Property::Required}}, {Clause::OMPC_depend}}},
+                  {52, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+                  {60, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+                  {61, {{{Property::Required}}, {Clause::OMPC_doacross}}},
+              },
+          },
+      },
+      {
+          Modifier::DirectiveNameModifier,
+          {
+              "directive-name-modifier",
+              {
+                  {45, {{{Property::Unique}}, {Clause::OMPC_if}}},
+                  {50, {{{Property::Unique}}, {Clause::OMPC_if}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_if}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_if}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_absent,
+                     Clause::OMPC_acq_rel,
+                     Clause::OMPC_acquire,
+                     Clause::OMPC_adjust_args,
+                     Clause::OMPC_affinity,
+                     Clause::OMPC_align,
+                     Clause::OMPC_aligned,
+                     Clause::OMPC_allocate,
+                     Clause::OMPC_allocator,
+                     Clause::OMPC_append_args,
+                     Clause::OMPC_apply,
+                     Clause::OMPC_at,
+                     Clause::OMPC_atomic_default_mem_order,
+                     Clause::OMPC_bind,
+                     Clause::OMPC_capture,
+                     Clause::OMPC_collapse,
+                     Clause::OMPC_collector,
+                     Clause::OMPC_combiner,
+                     Clause::OMPC_compare,
+                     Clause::OMPC_contains,
+                     Clause::OMPC_copyin,
+                     Clause::OMPC_copyprivate,
+                     Clause::OMPC_counts,
+                     Clause::OMPC_default,
+                     Clause::OMPC_defaultmap,
+                     Clause::OMPC_depend,
+                     Clause::OMPC_destroy,
+                     Clause::OMPC_detach,
+                     Clause::OMPC_device,
+                     Clause::OMPC_device_safesync,
+                     Clause::OMPC_device_type,
+                     Clause::OMPC_dist_schedule,
+                     Clause::OMPC_doacross,
+                     Clause::OMPC_dynamic_allocators,
+                     Clause::OMPC_enter,
+                     Clause::OMPC_exclusive,
+                     Clause::OMPC_fail,
+                     Clause::OMPC_filter,
+                     Clause::OMPC_final,
+                     Clause::OMPC_firstprivate,
+                     Clause::OMPC_from,
+                     Clause::OMPC_full,
+                     Clause::OMPC_grainsize,
+                     Clause::OMPC_graph_id,
+                     Clause::OMPC_graph_reset,
+                     Clause::OMPC_has_device_addr,
+                     Clause::OMPC_hint,
+                     Clause::OMPC_holds,
+                     Clause::OMPC_if,
+                     Clause::OMPC_in_reduction,
+                     Clause::OMPC_inbranch,
+                     Clause::OMPC_inclusive,
+                     Clause::OMPC_indirect,
+                     Clause::OMPC_induction,
+                     Clause::OMPC_inductor,
+                     Clause::OMPC_init,
+                     Clause::OMPC_init_complete,
+                     Clause::OMPC_initializer,
+                     Clause::OMPC_interop,
+                     Clause::OMPC_is_device_ptr,
+                     Clause::OMPC_lastprivate,
+                     Clause::OMPC_linear,
+                     Clause::OMPC_link,
+                     Clause::OMPC_local,
+                     Clause::OMPC_looprange,
+                     Clause::OMPC_map,
+                     Clause::OMPC_match,
+                     Clause::OMPC_memscope,
+                     Clause::OMPC_mergeable,
+                     Clause::OMPC_message,
+                     Clause::OMPC_no_openmp,
+                     Clause::OMPC_no_openmp_constructs,
+                     Clause::OMPC_no_openmp_routines,
+                     Clause::OMPC_no_parallelism,
+                     Clause::OMPC_nocontext,
+                     Clause::OMPC_nogroup,
+                     Clause::OMPC_nontemporal,
+                     Clause::OMPC_notinbranch,
+                     Clause::OMPC_novariants,
+                     Clause::OMPC_nowait,
+                     Clause::OMPC_num_tasks,
+                     Clause::OMPC_num_teams,
+                     Clause::OMPC_num_threads,
+                     Clause::OMPC_order,
+                     Clause::OMPC_ordered,
+                     Clause::OMPC_otherwise,
+                     Clause::OMPC_partial,
+                     Clause::OMPC_permutation,
+                     Clause::OMPC_priority,
+                     Clause::OMPC_private,
+                     Clause::OMPC_proc_bind,
+                     Clause::OMPC_read,
+                     Clause::OMPC_reduction,
+                     Clause::OMPC_relaxed,
+                     Clause::OMPC_release,
+                     Clause::OMPC_replayable,
+                     Clause::OMPC_reverse_offload,
+                     Clause::OMPC_safelen,
+                     Clause::OMPC_safesync,
+                     Clause::OMPC_schedule,
+                     Clause::OMPC_self_maps,
+                     Clause::OMPC_seq_cst,
+                     Clause::OMPC_severity,
+                     Clause::OMPC_shared,
+                     Clause::OMPC_simd,
+                     Clause::OMPC_simdlen,
+                     Clause::OMPC_sizes,
+                     Clause::OMPC_task_reduction,
+                     Clause::OMPC_thread_limit,
+                     Clause::OMPC_threads,
+                     Clause::OMPC_threadset,
+                     Clause::OMPC_to,
+                     Clause::OMPC_transparent,
+                     Clause::OMPC_unified_address,
+                     Clause::OMPC_unified_shared_memory,
+                     Clause::OMPC_uniform,
+                     Clause::OMPC_untied,
+                     Clause::OMPC_update,
+                     Clause::OMPC_update_depend_objects,
+                     Clause::OMPC_use,
+                     Clause::OMPC_use_device_addr,
+                     Clause::OMPC_use_device_ptr,
+                     Clause::OMPC_uses_allocators,
+                     Clause::OMPC_weak,
+                     Clause::OMPC_when,
+                     Clause::OMPC_write}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_absent,
+                     Clause::OMPC_acq_rel,
+                     Clause::OMPC_acquire,
+                     Clause::OMPC_adjust_args,
+                     Clause::OMPC_affinity,
+                     Clause::OMPC_align,
+                     Clause::OMPC_aligned,
+                     Clause::OMPC_allocate,
+                     Clause::OMPC_allocator,
+                     Clause::OMPC_append_args,
+                     Clause::OMPC_apply,
+                     Clause::OMPC_at,
+                     Clause::OMPC_atomic_default_mem_order,
+                     Clause::OMPC_bind,
+                     Clause::OMPC_capture,
+                     Clause::OMPC_collapse,
+                     Clause::OMPC_collector,
+                     Clause::OMPC_combiner,
+                     Clause::OMPC_compare,
+                     Clause::OMPC_contains,
+                     Clause::OMPC_copyin,
+                     Clause::OMPC_copyprivate,
+                     Clause::OMPC_counts,
+                     Clause::OMPC_default,
+                     Clause::OMPC_defaultmap,
+                     Clause::OMPC_depend,
+                     Clause::OMPC_depth,
+                     Clause::OMPC_destroy,
+                     Clause::OMPC_detach,
+                     Clause::OMPC_device,
+                     Clause::OMPC_device_safesync,
+                     Clause::OMPC_device_type,
+                     Clause::OMPC_dist_schedule,
+                     Clause::OMPC_doacross,
+                     Clause::OMPC_dyn_groupprivate,
+                     Clause::OMPC_dynamic_allocators,
+                     Clause::OMPC_enter,
+                     Clause::OMPC_exclusive,
+                     Clause::OMPC_fail,
+                     Clause::OMPC_filter,
+                     Clause::OMPC_final,
+                     Clause::OMPC_firstprivate,
+                     Clause::OMPC_from,
+                     Clause::OMPC_full,
+                     Clause::OMPC_grainsize,
+                     Clause::OMPC_graph_id,
+                     Clause::OMPC_graph_reset,
+                     Clause::OMPC_has_device_addr,
+                     Clause::OMPC_hint,
+                     Clause::OMPC_holds,
+                     Clause::OMPC_if,
+                     Clause::OMPC_in_reduction,
+                     Clause::OMPC_inbranch,
+                     Clause::OMPC_inclusive,
+                     Clause::OMPC_indirect,
+                     Clause::OMPC_induction,
+                     Clause::OMPC_inductor,
+                     Clause::OMPC_init,
+                     Clause::OMPC_init_complete,
+                     Clause::OMPC_initializer,
+                     Clause::OMPC_interop,
+                     Clause::OMPC_is_device_ptr,
+                     Clause::OMPC_lastprivate,
+                     Clause::OMPC_linear,
+                     Clause::OMPC_link,
+                     Clause::OMPC_local,
+                     Clause::OMPC_looprange,
+                     Clause::OMPC_map,
+                     Clause::OMPC_match,
+                     Clause::OMPC_memscope,
+                     Clause::OMPC_mergeable,
+                     Clause::OMPC_message,
+                     Clause::OMPC_no_openmp,
+                     Clause::OMPC_no_openmp_constructs,
+                     Clause::OMPC_no_openmp_routines,
+                     Clause::OMPC_no_parallelism,
+                     Clause::OMPC_nocontext,
+                     Clause::OMPC_nogroup,
+                     Clause::OMPC_nontemporal,
+                     Clause::OMPC_notinbranch,
+                     Clause::OMPC_novariants,
+                     Clause::OMPC_nowait,
+                     Clause::OMPC_num_tasks,
+                     Clause::OMPC_num_teams,
+                     Clause::OMPC_num_threads,
+                     Clause::OMPC_order,
+                     Clause::OMPC_ordered,
+                     Clause::OMPC_otherwise,
+                     Clause::OMPC_partial,
+                     Clause::OMPC_permutation,
+                     Clause::OMPC_priority,
+                     Clause::OMPC_private,
+                     Clause::OMPC_proc_bind,
+                     Clause::OMPC_read,
+                     Clause::OMPC_reduction,
+                     Clause::OMPC_relaxed,
+                     Clause::OMPC_release,
+                     Clause::OMPC_replayable,
+                     Clause::OMPC_reverse_offload,
+                     Clause::OMPC_safelen,
+                     Clause::OMPC_safesync,
+                     Clause::OMPC_schedule,
+                     Clause::OMPC_self_maps,
+                     Clause::OMPC_seq_cst,
+                     Clause::OMPC_severity,
+                     Clause::OMPC_shared,
+                     Clause::OMPC_simd,
+                     Clause::OMPC_simdlen,
+                     Clause::OMPC_sizes,
+                     Clause::OMPC_task_reduction,
+                     Clause::OMPC_thread_limit,
+                     Clause::OMPC_threads,
+                     Clause::OMPC_threadset,
+                     Clause::OMPC_to,
+                     Clause::OMPC_transparent,
+                     Clause::OMPC_unified_address,
+                     Clause::OMPC_unified_shared_memory,
+                     Clause::OMPC_uniform,
+                     Clause::OMPC_untied,
+                     Clause::OMPC_update,
+                     Clause::OMPC_update_depend_objects,
+                     Clause::OMPC_use,
+                     Clause::OMPC_use_device_addr,
+                     Clause::OMPC_use_device_ptr,
+                     Clause::OMPC_uses_allocators,
+                     Clause::OMPC_weak,
+                     Clause::OMPC_when,
+                     Clause::OMPC_write}}},
+              },
+          },
+      },
+      {
+          Modifier::LinearStep,
+          {
+              "linear-step",
+              {
+                  {45,
+                   {{{Property::RegionInvariant, Property::Unique}},
+                    {Clause::OMPC_linear}}},
+                  {50,
+                   {{{Property::RegionInvariant, Property::Unique}},
+                    {Clause::OMPC_linear}}},
+                  {51,
+                   {{{Property::RegionInvariant, Property::Unique}},
+                    {Clause::OMPC_linear}}},
+              },
+          },
+      },
+      {
+          Modifier::MapType,
+          {
+              "map-type",
+              {
+                  {45, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {52, {{{Property::Ultimate}}, {Clause::OMPC_map}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::MapTypeModifier,
+          {
+              "map-type-modifier",
+              {
+                  {45, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+                  {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::OrderingModifier,
+          {
+              "ordering-modifier",
+              {
+                  {45, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {50, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_schedule}}},
+              },
+          },
+      },
+      {
+          Modifier::OmpxHoldModifier,
+          {"ompx-hold-modifier",
+           {
+               {45, {{{Property::Unique}}, {Clause::OMPC_map}}},
+               {50, {{{Property::Unique}}, {Clause::OMPC_map}}},
+               {51, {{{Property::Unique}}, {Clause::OMPC_map}}},
+               {52, {{{Property::Unique}}, {Clause::OMPC_map}}},
+               {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+               {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+           }},
+      },
+      {
+          Modifier::ReductionIdentifier,
+          {
+              "reduction-identifier",
+              {
+                  {45,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_reduction}}},
+                  {50,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+                     Clause::OMPC_task_reduction}}},
+                  {51,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+                     Clause::OMPC_task_reduction}}},
+                  {52,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+                     Clause::OMPC_task_reduction}}},
+                  {60,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+                     Clause::OMPC_task_reduction}}},
+                  {61,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_in_reduction, Clause::OMPC_reduction,
+                     Clause::OMPC_task_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::TaskDependenceType,
+          {
+              "task-dependence-type",
+              {
+                  {45,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_depend}}},
+                  {50,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_depend}}},
+                  {51,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_depend}}},
+                  {52,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_depend}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}}},
+              },
+          },
+      },
+      {
+          Modifier::VariableCategory,
+          {
+              "variable-category",
+              {
+                  {45,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_defaultmap}}},
+                  {50,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+              },
+          },
+      },
+      {
+          Modifier::AllocatorSimpleModifier,
+          {
+              "allocator-simple-modifier",
+              {
+                  {50,
+                   {{{Property::Exclusive, Property::Unique}},
+                    {Clause::OMPC_allocate}}},
+                  {51,
+                   {{{Property::Exclusive, Property::Unique}},
+                    {Clause::OMPC_allocate}}},
+                  {52,
+                   {{{Property::Exclusive, Property::Unique}},
+                    {Clause::OMPC_allocate}}},
+                  {60,
+                   {{{Property::Exclusive, Property::Unique}},
+                    {Clause::OMPC_allocate}}},
+                  {61,
+                   {{{Property::Exclusive, Property::Unique}},
+                    {Clause::OMPC_allocate}}},
+              },
+          },
+      },
+      {
+          Modifier::ContextSelector,
+          {
+              "context-selector",
+              {
+                  {50,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_when}}},
+                  {51,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_when}}},
+                  {52,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_when}}},
+                  {60,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_when}}},
+                  {61,
+                   {{{Property::Required, Property::Unique}},
+                    {Clause::OMPC_when}}},
+              },
+          },
+      },
+      {
+          Modifier::DeviceModifier,
+          {
+              "device-modifier",
+              {
+                  {50, {{{Property::Unique}}, {Clause::OMPC_device}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_device}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_device}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_device}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_device}}},
+              },
+          },
+      },
+      {
+          Modifier::Iterator,
+          {
+              "iterator",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_affinity, Clause::OMPC_depend}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_affinity, Clause::OMPC_depend,
+                     Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_affinity, Clause::OMPC_depend,
+                     Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_affinity, Clause::OMPC_depend,
+                     Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_affinity, Clause::OMPC_depend,
+                     Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+              },
+          },
+      },
+      {
+          Modifier::LastprivateModifier,
+          {
+              "lastprivate-modifier",
+              {
+                  {50, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_lastprivate}}},
+              },
+          },
+      },
+      {
+          Modifier::LinearModifier,
+          {
+              "linear-modifier",
+              {
+                  {50, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+              },
+          },
+      },
+      {
+          Modifier::LowerBound,
+          {
+              "lower-bound",
+              {
+                  {50,
+                   {{{Property::Positive, Property::Ultimate,
+                      Property::Unique}},
+                    {Clause::OMPC_num_teams}}},
+                  {51,
+                   {{{Property::Positive, Property::Ultimate,
+                      Property::Unique}},
+                    {Clause::OMPC_num_teams}}},
+                  {52,
+                   {{{Property::Positive, Property::Ultimate,
+                      Property::Unique}},
+                    {Clause::OMPC_num_teams}}},
+                  {60,
+                   {{{Property::Positive, Property::Ultimate,
+                      Property::Unique}},
+                    {Clause::OMPC_num_teams}}},
+                  {61,
+                   {{{Property::Positive, Property::Ultimate,
+                      Property::Unique}},
+                    {Clause::OMPC_num_teams}}},
+              },
+          },
+      },
+      {
+          Modifier::Mapper,
+          {
+              "mapper",
+              {
+                  {50,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {51,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+              },
+          },
+      },
+      {
+          Modifier::ReductionModifier,
+          {
+              "reduction-modifier",
+              {
+                  {50, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::TraitsArray,
+          {
+              "traits-array",
+              {
+                  {50, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {51, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+              },
+          },
+      },
+      {
+          Modifier::AdjustOp,
+          {
+              "adjust-op",
+              {
+                  {51, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+                  {52, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+                  {60, {{{Property::Required}}, {Clause::OMPC_adjust_args}}},
+              },
+          },
+      },
+      {
+          Modifier::AlignModifier,
+          {
+              "align-modifier",
+              {
+                  {51, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+              },
+          },
+      },
+      {
+          Modifier::InteropType,
+          {
+              "interop-type",
+              {
+                  {51, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+                  {52, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+                  {60, {{{Property::Repeatable}}, {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          Modifier::MemSpace,
+          {
+              "mem-space",
+              {
+                  {51, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_uses_allocators}}},
+              },
+          },
+      },
+      {
+          Modifier::OrderModifier,
+          {
+              "order-modifier",
+              {
+                  {51, {{{Property::Unique}}, {Clause::OMPC_order}}},
+                  {52, {{{Property::Unique}}, {Clause::OMPC_order}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_order}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_order}}},
+              },
+          },
+      },
+      {
+          Modifier::Prescriptiveness,
+          {
+              "prescriptiveness",
+              {
+                  {51,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+                  {52,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+                  {60,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_grainsize, Clause::OMPC_num_tasks,
+                     Clause::OMPC_num_threads}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_grainsize, Clause::OMPC_num_tasks}}},
+              },
+          },
+      },
+      {
+          Modifier::PresentModifier,
+          {
+              "present-modifier",
+              {
+                  {51,
+                   {{{Property::MapTypeModifying, Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_to}}},
+                  {60,
+                   {{{Property::MapTypeModifying, Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_map, Clause::OMPC_to}}},
+              },
+          },
+      },
+      {
+          Modifier::AllocatorComplexModifier,
+          {
+              "allocator-complex-modifier",
+              {
+                  {52, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_allocate}}},
+              },
+          },
+      },
+      {
+          Modifier::Expectation,
+          {
+              "expectation",
+              {
+                  {52,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_from, Clause::OMPC_to}}},
+              },
+          },
+      },
+      {
+          Modifier::StepComplexModifier,
+          {
+              "step-complex-modifier",
+              {
+                  {52, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {60, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_linear}}},
+              },
+          },
+      },
+      {
+          Modifier::StepModifier,
+          {
+              "step-modifier",
+              {
+                  {52, {{{Property::Required}}, {}}},
+                  {60, {{{Property::Required}}, {Clause::OMPC_induction}}},
+                  {61, {{{Property::Required}}, {Clause::OMPC_induction}}},
+              },
+          },
+      },
+      {
+          Modifier::StepSimpleModifier,
+          {
+              "step-simple-modifier",
+              {
+                  {52,
+                   {{{Property::Exclusive, Property::RegionInvariant,
+                      Property::Unique}},
+                    {Clause::OMPC_linear}}},
+                  {60,
+                   {{{Property::Exclusive, Property::RegionInvariant,
+                      Property::Unique}},
+                    {Clause::OMPC_linear}}},
+                  {61,
+                   {{{Property::Exclusive, Property::RegionInvariant,
+                      Property::Unique}},
+                    {Clause::OMPC_linear}}},
+              },
+          },
+      },
+      {
+          Modifier::AlwaysModifier,
+          {
+              "always-modifier",
+              {
+                  {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::AutomapModifier,
+          {
+              "automap-modifier",
+              {
+                  {60, {{{Property::Unique}}, {Clause::OMPC_enter}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_enter}}},
+              },
+          },
+      },
+      {
+          Modifier::CloseModifier,
+          {
+              "close-modifier",
+              {
+                  {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::DeleteModifier,
+          {
+              "delete-modifier",
+              {
+                  {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::DepinfoModifier,
+          {
+              "depinfo-modifier",
+              {
+                  {60,
+                   {{{Property::Complex, Property::Unique}},
+                    {Clause::OMPC_init}}},
+                  {61,
+                   {{{Property::Complex, Property::Unique}},
+                    {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          Modifier::InductionIdentifier,
+          {
+              "induction-identifier",
+              {
+                  {60,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_induction}}},
+                  {61,
+                   {{{Property::Required, Property::Ultimate}},
+                    {Clause::OMPC_induction}}},
+              },
+          },
+      },
+      {
+          Modifier::InductionModifier,
+          {
+              "induction-modifier",
+              {
+                  {60, {{{Property::Unique}}, {Clause::OMPC_induction}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_induction}}},
+              },
+          },
+      },
+      {
+          Modifier::LoopModifier,
+          {
+              "loop-modifier",
+              {
+                  {60, {{{Property::Optional}}, {Clause::OMPC_apply}}},
+                  {61, {{{Property::Optional}}, {Clause::OMPC_apply}}},
+              },
+          },
+      },
+      {
+          Modifier::OriginalSharingModifier,
+          {
+              "original-sharing-modifier",
+              {
+                  {60, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::PreferType,
+          {
+              "prefer-type",
+              {
+                  {60,
+                   {{{Property::Complex, Property::Unique}},
+                    {Clause::OMPC_init}}},
+                  {61,
+                   {{{Property::Complex, Property::Unique}},
+                    {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          Modifier::RefModifier,
+          {
+              "ref-modifier",
+              {
+                  {60, {{{Property::Unique}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::Saved,
+          {
+              "saved",
+              {
+                  {60, {{{Property::Unique}}, {Clause::OMPC_firstprivate}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_firstprivate}}},
+              },
+          },
+      },
+      {
+          Modifier::SelfModifier,
+          {
+              "self-modifier",
+              {
+                  {60, {{{Property::MapTypeModifying}}, {Clause::OMPC_map}}},
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::AccessGroup,
+          {
+              "access-group",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_dyn_groupprivate}}},
+              },
+          },
+      },
+      {
+          Modifier::AttachModifier,
+          {
+              "attach-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          Modifier::DefaultModifier,
+          {
+              "default-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::DepobjModifier,
+          {
+              "depobj-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_depend}}},
+              },
+          },
+      },
+      {
+          Modifier::DimsModifier,
+          {
+              "dims-modifier",
+              {
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_num_teams, Clause::OMPC_num_threads,
+                     Clause::OMPC_thread_limit}}},
+              },
+          },
+      },
+      {
+          Modifier::Fallback,
+          {
+              "fallback",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_use_device_ptr}}},
+              },
+          },
+      },
+      {
+          Modifier::FallbackModifier,
+          {
+              "fallback-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_dyn_groupprivate}}},
+              },
+          },
+      },
+      {
+          Modifier::InscanModifier,
+          {
+              "inscan-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::LocModifier,
+          {
+              "loc-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_depend}}},
+              },
+          },
+      },
+      {
+          Modifier::NeedDeviceAddr,
+          {
+              "need-device-addr",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+              },
+          },
+      },
+      {
+          Modifier::NeedDevicePtr,
+          {
+              "need-device-ptr",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+              },
+          },
+      },
+      {
+          Modifier::NoncommutativeModifier,
+          {
+              "noncommutative-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::Nothing,
+          {
+              "nothing",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_adjust_args}}},
+              },
+          },
+      },
+      {
+          Modifier::OptionalModifier,
+          {
+              "optional-modifier",
+              {
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+              },
+          },
+      },
+      {
+          Modifier::PerThreadModifier,
+          {
+              "per-thread-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          Modifier::PrescriptivenessModifier,
+          {
+              "prescriptiveness-modifier",
+              {
+                  {61,
+                   {{{Property::Unique}},
+                    {Clause::OMPC_num_threads, Clause::OMPC_thread_limit}}},
+              },
+          },
+      },
+      {
+          Modifier::ScaledModifier,
+          {
+              "scaled-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_simdlen}}},
+              },
+          },
+      },
+      {
+          Modifier::SizesSelector,
+          {
+              "sizes-selector",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_sizes}}},
+              },
+          },
+      },
+      {
+          Modifier::TargetType,
+          {
+              "target-type",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          Modifier::TargetsyncType,
+          {
+              "targetsync-type",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          Modifier::TaskModifier,
+          {
+              "task-modifier",
+              {
+                  {61, {{{Property::Unique}}, {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+  };
+  return Map;
+}
+
+const DescriptorMap<ModifierSet, ModifierSetDesc> &getModifierSetMap() {
+  static const DescriptorMap<ModifierSet, ModifierSetDesc> Map{
+      {
+          ModifierSet::DependModifierSet1,
+          {
+              "depend_modifier_set_1",
+              {
+                  {61,
+                   {{{Property::Exclusive}},
+                    {Modifier::DepobjModifier, Modifier::TaskDependenceType}}},
+              },
+          },
+      },
+      {
+          ModifierSet::NumTeamsModifierSet1,
+          {
+              "num_teams_modifier_set_1",
+              {
+                  {61,
+                   {{{Property::Exclusive}},
+                    {Modifier::DimsModifier, Modifier::LowerBound}}},
+              },
+          },
+      },
+      {
+          ModifierSet::ReductionModifierSet1,
+          {
+              "reduction_modifier_set_1",
+              {
+                  {61,
+                   {{{Property::Exclusive}},
+                    {Modifier::InscanModifier, Modifier::NoncommutativeModifier,
+                     Modifier::PerThreadModifier}}},
+              },
+          },
+      },
+  };
+  return Map;
+}
+
+const DescriptorMap<ModifierGroup, ModifierGroupDesc> getModifierGroupMap() {
+  static const DescriptorMap<ModifierGroup, ModifierGroupDesc> Map{
+      {
+          ModifierGroup::AdjustOp,
+          {
+              "adjust-op",
+              {
+                  {61,
+                   {{{{Property::Exclusive, Property::Required}},
+                     {Modifier::NeedDeviceAddr, Modifier::NeedDevicePtr,
+                      Modifier::Nothing}},
+                    {Clause::OMPC_adjust_args}}},
+              },
+          },
+      },
+      {
+          ModifierGroup::DependListType,
+          {
+              "depend-list-type",
+              {
+                  {61,
+                   {{{{Property::Exclusive}},
+                     {Modifier::DepobjModifier, Modifier::LocModifier}},
+                    {Clause::OMPC_depend}}},
+              },
+          },
+      },
+      {
+          ModifierGroup::InteropType,
+          {
+              "interop-type",
+              {
+                  {61,
+                   {{{{Property::Unique}},
+                     {Modifier::TargetType, Modifier::TargetsyncType}},
+                    {Clause::OMPC_init}}},
+              },
+          },
+      },
+      {
+          ModifierGroup::MapTypeModifying,
+          {
+              "map-type-modifying",
+              {
+                  {61,
+                   {{{{Property::Unique}},
+                     {Modifier::AlwaysModifier, Modifier::CloseModifier,
+                      Modifier::DeleteModifier, Modifier::PresentModifier,
+                      Modifier::SelfModifier}},
+                    {Clause::OMPC_map}}},
+              },
+          },
+      },
+      {
+          ModifierGroup::ReductionType,
+          {
+              "reduction-type",
+              {
+                  {61,
+                   {{{{Property::Exclusive}},
+                     {Modifier::DefaultModifier, Modifier::InscanModifier,
+                      Modifier::NoncommutativeModifier,
+                      Modifier::TaskModifier}},
+                    {Clause::OMPC_reduction}}},
+              },
+          },
+      },
+      {
+          ModifierGroup::VariableSelector,
+          {
+              "variable-selector",
+              {
+                  {61,
+                   {{{{Property::Required}},
+                     {Modifier::OptionalModifier, Modifier::VariableCategory}},
+                    {Clause::OMPC_default, Clause::OMPC_defaultmap}}},
+              },
+          },
+      },
+  };
+  return Map;
+}
+
+#define GET_THING_OR_EMPTY(Thing, Member)                                      \
+  template <typename DetailsTy>                                                \
+  static Thing get##Thing##OrEmpty(const DetailsTy &D, unsigned V) {           \
+    V = std::max(V, 45u);                                                      \
+    if (auto Found = D.find(V); Found != D.end())                              \
+      return Found->second.Member;                                             \
+    return Thing{};                                                            \
+  }
+
+GET_THING_OR_EMPTY(Clauses, Cls)
+GET_THING_OR_EMPTY(Directives, Dirs)
+GET_THING_OR_EMPTY(Modifiers, Mods)
+GET_THING_OR_EMPTY(ModifierGroups, ModGroups)
+GET_THING_OR_EMPTY(ModifierSets, ModSets)
+GET_THING_OR_EMPTY(Properties, Props)
+
+#undef GET_THING_OR_EMPTY
+
+Properties ClauseDesc::getProperties(unsigned V) const {
+  return getPropertiesOrEmpty(Details, V);
+}
+Directives ClauseDesc::getDirectives(unsigned V) const {
+  return getDirectivesOrEmpty(Details, V);
+}
+Modifiers ClauseDesc::getModifiers(unsigned V) const {
+  return getModifiersOrEmpty(Details, V);
+}
+ModifierSets ClauseDesc::getModifierSets(unsigned V) const {
+  return getModifierSetsOrEmpty(Details, V);
+}
+ModifierGroups ClauseDesc::getModifierGroups(unsigned V) const {
+  return getModifierGroupsOrEmpty(Details, V);
+}
+Properties ModifierDesc::getProperties(unsigned V) const {
+  return getPropertiesOrEmpty(Details, V);
+}
+Clauses ModifierDesc::getClauses(unsigned V) const {
+  return getClausesOrEmpty(Details, V);
+}
+Properties ModifierSetDesc::getProperties(unsigned V) const {
+  return getPropertiesOrEmpty(Details, V);
+}
+Modifiers ModifierSetDesc::getModifiers(unsigned V) const {
+  return getModifiersOrEmpty(Details, V);
+}
+Properties ModifierGroupDesc::getProperties(unsigned V) const {
+  return getPropertiesOrEmpty(Details, V);
+}
+Modifiers ModifierGroupDesc::getModifiers(unsigned V) const {
+  return getModifiersOrEmpty(Details, V);
+}
+Clauses ModifierGroupDesc::getClauses(unsigned V) const {
+  return getClausesOrEmpty(Details, V);
+}
+
+const ClauseDesc &getDescriptor(llvm::omp::Clause C) {
+  return getClauseMap().at(C);
+}
+
+const ModifierDesc &getDescriptor(llvm::omp::Modifier M) {
+  return getModifierMap().at(M);
+}
+
+const ModifierSetDesc &getDescriptor(llvm::omp::ModifierSet S) {
+  return getModifierSetMap().at(S);
+}
+
+const ModifierGroupDesc &getDescriptor(llvm::omp::ModifierGroup G) {
+  return getModifierGroupMap().at(G);
+}
+
+Properties getProperties(Clause C, unsigned Version) {
+  return getDescriptor(C).Details.at(std::max(Version, 45u)).Props;
+}
+} // namespace llvm::omp



More information about the flang-commits mailing list