https://github.com/kevinsala updated https://github.com/llvm/llvm-project/pull/207305
>From 94acbb703bf3ad759853c2b25eaa36750462c25f Mon Sep 17 00:00:00 2001 From: Kevin Sala <[email protected]> Date: Thu, 2 Jul 2026 18:57:59 -0700 Subject: [PATCH 1/3] [NFC][Clang][OpenMP] Simplify checks for num_teams and thread_limit expressions --- clang/lib/Sema/SemaOpenMP.cpp | 119 ++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 57 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 134b98d8e80cf..3b2192d80911c 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -13621,23 +13621,64 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetUpdateDirective( Clauses, AStmt); } -/// This checks whether a \p ClauseType clause \p C has at most \p Max -/// expression. If not, a diag of number \p Diag will be emitted. -template <typename ClauseType> -static bool checkNumExprsInClause(SemaBase &SemaRef, - ArrayRef<OMPClause *> Clauses, - unsigned MaxNum, unsigned Diag) { - auto ClauseItr = llvm::find_if(Clauses, llvm::IsaPred<ClauseType>); - if (ClauseItr == Clauses.end()) - return true; - const auto *C = cast<ClauseType>(*ClauseItr); - auto VarList = C->getVarRefs(); - if (VarList.size() > MaxNum) { - SemaRef.Diag(VarList[MaxNum]->getBeginLoc(), Diag) - << getOpenMPClauseNameForDiag(C->getClauseKind()); +/// Check the number of expressions specified in a multidimensional clause and +/// return whether an error was encountered. +template <typename ClauseT> +static bool checkExprsInMultidimClause(SemaBase &SemaRef, const ClauseT *Clause, + const OMPXBareClause *BareClause) { + if (!Clause) return false; + + const uint64_t NumVars = Clause->getVarRefs().size(); + + // The ompx_bare clause allows up to three expressions. + if (BareClause && NumVars > 3) { + SemaRef.Diag(Clause->getBeginLoc(), + diag::err_ompx_more_than_three_expr_not_allowed) + << getOpenMPClauseName(Clause->getClauseKind()); + return true; } - return true; + + // Only one expression is allowed otherwise. + if (!BareClause && NumVars != 1) { + SemaRef.Diag(Clause->getBeginLoc(), diag::err_omp_multi_expr_not_allowed) + << getOpenMPClauseName(Clause->getClauseKind()); + return true; + } + return false; +} + +/// Check the number of expressions specified in clauses that can contain +/// multidimensional values, e.g., num_teams and thread_limit. The function +/// returns true on error. +static bool checkMultidimClauses(SemaBase &SemaRef, + ArrayRef<OMPClause *> Clauses, + bool MayHaveBareClause = false) { + auto BareClauseIt = + (MayHaveBareClause) + ? llvm::find_if(Clauses, llvm::IsaPred<OMPXBareClause>) + : Clauses.end(); + auto ThreadLimitIt = + llvm::find_if(Clauses, llvm::IsaPred<OMPThreadLimitClause>); + auto NumTeamsIt = llvm::find_if(Clauses, llvm::IsaPred<OMPNumTeamsClause>); + + const auto *BareClause = BareClauseIt != Clauses.end() + ? cast<OMPXBareClause>(*BareClauseIt) + : nullptr; + const auto *ThreadLimitClause = + ThreadLimitIt != Clauses.end() + ? cast<OMPThreadLimitClause>(*ThreadLimitIt) + : nullptr; + const auto *NumTeamsClause = NumTeamsIt != Clauses.end() + ? cast<OMPNumTeamsClause>(*NumTeamsIt) + : nullptr; + + if (BareClause && (!NumTeamsClause || !ThreadLimitClause)) { + SemaRef.Diag(BareClause->getBeginLoc(), diag::err_ompx_bare_no_grid); + return true; + } + return checkExprsInMultidimClause(SemaRef, ThreadLimitClause, BareClause) || + checkExprsInMultidimClause(SemaRef, NumTeamsClause, BareClause); } StmtResult SemaOpenMP::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses, @@ -13647,10 +13688,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses, if (!AStmt) return StmtError(); - if (!checkNumExprsInClause<OMPNumTeamsClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed) || - !checkNumExprsInClause<OMPThreadLimitClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed)) + if (checkMultidimClauses(*this, Clauses)) return StmtError(); // Report affected OpenMP target offloading behavior when in HIP lang-mode. @@ -14414,30 +14452,9 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDirective( setBranchProtectedScope(SemaRef, OMPD_target_teams, AStmt); - const OMPClause *BareClause = nullptr; - bool HasThreadLimitAndNumTeamsClause = hasClauses(Clauses, OMPC_num_teams) && - hasClauses(Clauses, OMPC_thread_limit); - bool HasBareClause = llvm::any_of(Clauses, [&](const OMPClause *C) { - BareClause = C; - return C->getClauseKind() == OMPC_ompx_bare; - }); - - if (HasBareClause && !HasThreadLimitAndNumTeamsClause) { - Diag(BareClause->getBeginLoc(), diag::err_ompx_bare_no_grid); + if (checkMultidimClauses(*this, Clauses, /*MayHaveBareClause=*/true)) return StmtError(); - } - - unsigned ClauseMaxNumExprs = HasBareClause ? 3 : 1; - unsigned DiagNo = HasBareClause - ? diag::err_ompx_more_than_three_expr_not_allowed - : diag::err_omp_multi_expr_not_allowed; - if (!checkNumExprsInClause<OMPNumTeamsClause>(*this, Clauses, - ClauseMaxNumExprs, DiagNo) || - !checkNumExprsInClause<OMPThreadLimitClause>(*this, Clauses, - ClauseMaxNumExprs, DiagNo)) { - return StmtError(); - } return OMPTargetTeamsDirective::Create(getASTContext(), StartLoc, EndLoc, Clauses, AStmt); } @@ -14448,10 +14465,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeDirective( if (!AStmt) return StmtError(); - if (!checkNumExprsInClause<OMPNumTeamsClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed) || - !checkNumExprsInClause<OMPThreadLimitClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed)) + if (checkMultidimClauses(*this, Clauses)) return StmtError(); CapturedStmt *CS = @@ -14480,10 +14494,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForDirective( if (!AStmt) return StmtError(); - if (!checkNumExprsInClause<OMPNumTeamsClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed) || - !checkNumExprsInClause<OMPThreadLimitClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed)) + if (checkMultidimClauses(*this, Clauses)) return StmtError(); CapturedStmt *CS = setBranchProtectedScope( @@ -14513,10 +14524,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( if (!AStmt) return StmtError(); - if (!checkNumExprsInClause<OMPNumTeamsClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed) || - !checkNumExprsInClause<OMPThreadLimitClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed)) + if (checkMultidimClauses(*this, Clauses)) return StmtError(); CapturedStmt *CS = setBranchProtectedScope( @@ -14549,10 +14557,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeSimdDirective( if (!AStmt) return StmtError(); - if (!checkNumExprsInClause<OMPNumTeamsClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed) || - !checkNumExprsInClause<OMPThreadLimitClause>( - *this, Clauses, /*MaxNum=*/1, diag::err_omp_multi_expr_not_allowed)) + if (checkMultidimClauses(*this, Clauses)) return StmtError(); CapturedStmt *CS = setBranchProtectedScope( >From 98e8ac71ce0b4ed8edff88714985a170908a3c63 Mon Sep 17 00:00:00 2001 From: Kevin Sala <[email protected]> Date: Thu, 2 Jul 2026 20:07:06 -0700 Subject: [PATCH 2/3] Fix review comment --- clang/lib/Sema/SemaOpenMP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 3b2192d80911c..4f4cd85d769cd 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -13655,7 +13655,7 @@ static bool checkMultidimClauses(SemaBase &SemaRef, ArrayRef<OMPClause *> Clauses, bool MayHaveBareClause = false) { auto BareClauseIt = - (MayHaveBareClause) + MayHaveBareClause ? llvm::find_if(Clauses, llvm::IsaPred<OMPXBareClause>) : Clauses.end(); auto ThreadLimitIt = >From 5467f715a19e760f5d6a92d4c131ea63aa264e7c Mon Sep 17 00:00:00 2001 From: Kevin Sala <[email protected]> Date: Thu, 2 Jul 2026 20:11:13 -0700 Subject: [PATCH 3/3] Fix format --- clang/lib/Sema/SemaOpenMP.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 4f4cd85d769cd..0f45a21c5e461 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -13655,9 +13655,8 @@ static bool checkMultidimClauses(SemaBase &SemaRef, ArrayRef<OMPClause *> Clauses, bool MayHaveBareClause = false) { auto BareClauseIt = - MayHaveBareClause - ? llvm::find_if(Clauses, llvm::IsaPred<OMPXBareClause>) - : Clauses.end(); + MayHaveBareClause ? llvm::find_if(Clauses, llvm::IsaPred<OMPXBareClause>) + : Clauses.end(); auto ThreadLimitIt = llvm::find_if(Clauses, llvm::IsaPred<OMPThreadLimitClause>); auto NumTeamsIt = llvm::find_if(Clauses, llvm::IsaPred<OMPNumTeamsClause>); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
