diff options
author | Robert Imschweiler <robert.imschweiler@amd.com> | 2025-06-24 21:12:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-24 21:12:40 +0200 |
commit | f624ba2d9d2143a0c2679ee9792cf455f965adec (patch) | |
tree | 9972bd391d8473a37c3ea2219583f4d3aaac6c06 /clang/lib/Sema/SemaOpenMP.cpp | |
parent | 4d21da002a056c64231fb89ee9e4eba90080e9bb (diff) | |
download | llvm-f624ba2d9d2143a0c2679ee9792cf455f965adec.zip llvm-f624ba2d9d2143a0c2679ee9792cf455f965adec.tar.gz llvm-f624ba2d9d2143a0c2679ee9792cf455f965adec.tar.bz2 |
[OpenMP][clang] 6.0: parsing/sema for num_threads 'strict' modifier (#145490)
Implement parsing and semantic analysis support for the optional
'strict' modifier of the num_threads clause. This modifier has been
introduced in OpenMP 6.0, section 12.1.2.
Note: this is basically 1:1 https://reviews.llvm.org/D138328.
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 76 |
1 files changed, 46 insertions, 30 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 00f4658..a30acbe 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -15509,9 +15509,6 @@ OMPClause *SemaOpenMP::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, case OMPC_final: Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc); break; - case OMPC_num_threads: - Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc); - break; case OMPC_safelen: Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc); break; @@ -15565,6 +15562,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, break; case OMPC_grainsize: case OMPC_num_tasks: + case OMPC_num_threads: case OMPC_device: case OMPC_if: case OMPC_default: @@ -15911,10 +15909,41 @@ isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef, OpenMPClauseKind CKind, return true; } -OMPClause *SemaOpenMP::ActOnOpenMPNumThreadsClause(Expr *NumThreads, - SourceLocation StartLoc, - SourceLocation LParenLoc, - SourceLocation EndLoc) { +static std::string getListOfPossibleValues(OpenMPClauseKind K, unsigned First, + unsigned Last, + ArrayRef<unsigned> Exclude = {}) { + SmallString<256> Buffer; + llvm::raw_svector_ostream Out(Buffer); + unsigned Skipped = Exclude.size(); + for (unsigned I = First; I < Last; ++I) { + if (llvm::is_contained(Exclude, I)) { + --Skipped; + continue; + } + Out << "'" << getOpenMPSimpleClauseTypeName(K, I) << "'"; + if (I + Skipped + 2 == Last) + Out << " or "; + else if (I + Skipped + 1 != Last) + Out << ", "; + } + return std::string(Out.str()); +} + +OMPClause *SemaOpenMP::ActOnOpenMPNumThreadsClause( + OpenMPNumThreadsClauseModifier Modifier, Expr *NumThreads, + SourceLocation StartLoc, SourceLocation LParenLoc, + SourceLocation ModifierLoc, SourceLocation EndLoc) { + assert((ModifierLoc.isInvalid() || getLangOpts().OpenMP >= 60) && + "Unexpected num_threads modifier in OpenMP < 60."); + + if (ModifierLoc.isValid() && Modifier == OMPC_NUMTHREADS_unknown) { + std::string Values = getListOfPossibleValues(OMPC_num_threads, /*First=*/0, + OMPC_NUMTHREADS_unknown); + Diag(ModifierLoc, diag::err_omp_unexpected_clause_value) + << Values << getOpenMPClauseNameForDiag(OMPC_num_threads); + return nullptr; + } + Expr *ValExpr = NumThreads; Stmt *HelperValStmt = nullptr; @@ -15935,8 +15964,9 @@ OMPClause *SemaOpenMP::ActOnOpenMPNumThreadsClause(Expr *NumThreads, HelperValStmt = buildPreInits(getASTContext(), Captures); } - return new (getASTContext()) OMPNumThreadsClause( - ValExpr, HelperValStmt, CaptureRegion, StartLoc, LParenLoc, EndLoc); + return new (getASTContext()) + OMPNumThreadsClause(Modifier, ValExpr, HelperValStmt, CaptureRegion, + StartLoc, LParenLoc, ModifierLoc, EndLoc); } ExprResult SemaOpenMP::VerifyPositiveIntegerConstantInClause( @@ -16301,26 +16331,6 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause( return Res; } -static std::string getListOfPossibleValues(OpenMPClauseKind K, unsigned First, - unsigned Last, - ArrayRef<unsigned> Exclude = {}) { - SmallString<256> Buffer; - llvm::raw_svector_ostream Out(Buffer); - unsigned Skipped = Exclude.size(); - for (unsigned I = First; I < Last; ++I) { - if (llvm::is_contained(Exclude, I)) { - --Skipped; - continue; - } - Out << "'" << getOpenMPSimpleClauseTypeName(K, I) << "'"; - if (I + Skipped + 2 == Last) - Out << " or "; - else if (I + Skipped + 1 != Last) - Out << ", "; - } - return std::string(Out.str()); -} - OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, SourceLocation StartLoc, @@ -16693,8 +16703,14 @@ OMPClause *SemaOpenMP::ActOnOpenMPSingleExprWithArgClause( static_cast<OpenMPNumTasksClauseModifier>(Argument.back()), Expr, StartLoc, LParenLoc, ArgumentLoc.back(), EndLoc); break; - case OMPC_final: case OMPC_num_threads: + assert(Argument.size() == 1 && ArgumentLoc.size() == 1 && + "Modifier for num_threads clause and its location are expected."); + Res = ActOnOpenMPNumThreadsClause( + static_cast<OpenMPNumThreadsClauseModifier>(Argument.back()), Expr, + StartLoc, LParenLoc, ArgumentLoc.back(), EndLoc); + break; + case OMPC_final: case OMPC_safelen: case OMPC_simdlen: case OMPC_sizes: |