aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaOpenMP.cpp
diff options
context:
space:
mode:
authorRobert Imschweiler <robert.imschweiler@amd.com>2025-06-24 21:12:40 +0200
committerGitHub <noreply@github.com>2025-06-24 21:12:40 +0200
commitf624ba2d9d2143a0c2679ee9792cf455f965adec (patch)
tree9972bd391d8473a37c3ea2219583f4d3aaac6c06 /clang/lib/Sema/SemaOpenMP.cpp
parent4d21da002a056c64231fb89ee9e4eba90080e9bb (diff)
downloadllvm-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.cpp76
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: