diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index d857d36ed05d9..725dfcd9ced83 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -44,7 +44,8 @@ bool OmpStructureChecker::HasInvalidWorksharingNesting( void OmpStructureChecker::CheckAllowed(llvm::omp::Clause type) { if (!GetContext().allowedClauses.test(type) && !GetContext().allowedOnceClauses.test(type) && - !GetContext().allowedExclusiveClauses.test(type)) { + !GetContext().allowedExclusiveClauses.test(type) && + !GetContext().requiredClauses.test(type)) { context_.Say(GetContext().clauseSource, "%s clause is not allowed on the %s directive"_err_en_US, parser::ToUpperCaseLetters(llvm::omp::getOpenMPClauseName(type).str()), diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td index 2df1d2c2bec26..a0d694533e4d5 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMP.td +++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td @@ -402,7 +402,6 @@ def OMP_Requires : Directive<"requires"> { } def OMP_TargetData : Directive<"target data"> { let allowedClauses = [ - VersionedClause, VersionedClause, VersionedClause ]; @@ -416,19 +415,20 @@ def OMP_TargetData : Directive<"target data"> { } def OMP_TargetEnterData : Directive<"target enter data"> { let allowedClauses = [ - VersionedClause, - VersionedClause + VersionedClause ]; let allowedOnceClauses = [ VersionedClause, VersionedClause, VersionedClause ]; + let requiredClauses = [ + VersionedClause + ]; } def OMP_TargetExitData : Directive<"target exit data"> { let allowedClauses = [ - VersionedClause, - VersionedClause + VersionedClause ]; let allowedOnceClauses = [ VersionedClause,