diff options
author | Krzysztof Parzyszek <Krzysztof.Parzyszek@amd.com> | 2024-06-27 07:16:27 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-27 07:16:27 -0500 |
commit | 34fe6da6e464e74a331c056d050074a6c9216527 (patch) | |
tree | e228559bbbe1c47cbcb5a9409566c5fb72f65a69 /clang/lib/Sema | |
parent | e035ef0e7423c1a4c78e922508da817dbd5b6a02 (diff) | |
download | llvm-34fe6da6e464e74a331c056d050074a6c9216527.zip llvm-34fe6da6e464e74a331c056d050074a6c9216527.tar.gz llvm-34fe6da6e464e74a331c056d050074a6c9216527.tar.bz2 |
[clang][OpenMP] Place some common code in functions (#96811)
There are chunks of code repeated in a number of functions. This patch
moves some of that code into individual functions.
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 1064 |
1 files changed, 165 insertions, 899 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 7697246..363e5ea 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -3010,6 +3010,29 @@ static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, Expr *NumIterations, Sema &SemaRef, Scope *S, DSAStackTy *Stack); +static bool finishLinearClauses(Sema &SemaRef, ArrayRef<OMPClause *> Clauses, + OMPLoopBasedDirective::HelperExprs &B, + DSAStackTy *Stack) { + assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && + "loop exprs were not built"); + + if (SemaRef.CurContext->isDependentContext()) + return false; + + // Finalize the clauses that need pre-built expressions for CodeGen. + for (OMPClause *C : Clauses) { + auto *LC = dyn_cast<OMPLinearClause>(C); + if (!LC) + continue; + if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), + B.NumIterations, SemaRef, + SemaRef.getCurScope(), Stack)) + return true; + } + + return false; +} + namespace { class VarDeclFilterCCC final : public CorrectionCandidateCallback { @@ -7994,14 +8017,10 @@ void SemaOpenMP::ActOnOpenMPDeclareVariantDirective( FD->addAttr(NewAttr); } -StmtResult -SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, - Stmt *AStmt, SourceLocation StartLoc, - SourceLocation EndLoc) { - if (!AStmt) - return StmtError(); - - auto *CS = cast<CapturedStmt>(AStmt); +static CapturedStmt * +setBranchProtectedScope(Sema &SemaRef, OpenMPDirectiveKind DKind, Stmt *AStmt) { + auto *CS = dyn_cast<CapturedStmt>(AStmt); + assert(CS && "Captured statement expected"); // 1.2.2 OpenMP Language Terminology // Structured block - An executable statement with a single entry at the // top and a single exit at the bottom. @@ -8009,7 +8028,28 @@ SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); + for (int ThisCaptureLevel = SemaRef.OpenMP().getOpenMPCaptureLevels(DKind); + ThisCaptureLevel > 1; --ThisCaptureLevel) { + CS = cast<CapturedStmt>(CS->getCapturedStmt()); + // 1.2.2 OpenMP Language Terminology + // Structured block - An executable statement with a single entry at the + // top and a single exit at the bottom. + // The point of exit cannot be a branch out of the structured block. + // longjmp() and throw() must not violate the entry/exit criteria. + CS->getCapturedDecl()->setNothrow(); + } SemaRef.setFunctionHasBranchProtectedScope(); + return CS; +} + +StmtResult +SemaOpenMP::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, + Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc) { + if (!AStmt) + return StmtError(); + + setBranchProtectedScope(SemaRef, OMPD_parallel, AStmt); return OMPParallelDirective::Create( getASTContext(), StartLoc, EndLoc, Clauses, AStmt, @@ -10678,19 +10718,8 @@ StmtResult SemaOpenMP::ActOnOpenMPSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); @@ -10721,19 +10750,8 @@ StmtResult SemaOpenMP::ActOnOpenMPForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); auto *ForDirective = OMPForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, @@ -10759,19 +10777,8 @@ StmtResult SemaOpenMP::ActOnOpenMPForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); @@ -10781,12 +10788,10 @@ StmtResult SemaOpenMP::ActOnOpenMPForSimdDirective( NestedLoopCount, Clauses, AStmt, B); } -StmtResult -SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, - Stmt *AStmt, SourceLocation StartLoc, - SourceLocation EndLoc) { +static bool checkSectionsDirective(Sema &SemaRef, OpenMPDirectiveKind DKind, + Stmt *AStmt, DSAStackTy *Stack) { if (!AStmt) - return StmtError(); + return true; assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); auto BaseStmt = AStmt; @@ -10795,23 +10800,34 @@ SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { auto S = C->children(); if (S.begin() == S.end()) - return StmtError(); + return true; // All associated statements must be '#pragma omp section' except for // the first one. for (Stmt *SectionStmt : llvm::drop_begin(S)) { if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { if (SectionStmt) - Diag(SectionStmt->getBeginLoc(), - diag::err_omp_sections_substmt_not_section); - return StmtError(); + SemaRef.Diag(SectionStmt->getBeginLoc(), + diag::err_omp_sections_substmt_not_section) + << getOpenMPDirectiveName(DKind); + return true; } cast<OMPSectionDirective>(SectionStmt) - ->setHasCancel(DSAStack->isCancelRegion()); + ->setHasCancel(Stack->isCancelRegion()); } } else { - Diag(AStmt->getBeginLoc(), diag::err_omp_sections_not_compound_stmt); - return StmtError(); + SemaRef.Diag(AStmt->getBeginLoc(), diag::err_omp_sections_not_compound_stmt) + << getOpenMPDirectiveName(DKind); + return true; } + return false; +} + +StmtResult +SemaOpenMP::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, + Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc) { + if (checkSectionsDirective(SemaRef, OMPD_sections, AStmt, DSAStack)) + return StmtError(); SemaRef.setFunctionHasBranchProtectedScope(); @@ -10928,13 +10944,7 @@ StmtResult SemaOpenMP::ActOnOpenMPGenericLoopDirective( if (checkGenericLoopLastprivate(SemaRef, Clauses, OMPD_loop, DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -10947,7 +10957,6 @@ StmtResult SemaOpenMP::ActOnOpenMPGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPGenericLoopDirective::Create(getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -10964,23 +10973,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsGenericLoopDirective( if (checkGenericLoopLastprivate(SemaRef, Clauses, OMPD_teams_loop, DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_teams_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope(SemaRef, OMPD_teams_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -10994,7 +10987,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsGenericLoopDirective::Create( @@ -11014,23 +11006,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_teams_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_teams_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11044,8 +11021,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPTargetTeamsGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, teamsLoopCanBeParallelFor(AStmt, SemaRef)); @@ -11064,23 +11039,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_parallel_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_parallel_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11094,8 +11054,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPParallelGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -11113,23 +11071,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelGenericLoopDirective( DSAStack)) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel_loop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_parallel_loop, AStmt); OMPLoopDirective::HelperExprs B; // In presence of clause 'collapse', it will define the nested loops number. @@ -11143,8 +11086,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelGenericLoopDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPTargetParallelGenericLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -11268,13 +11209,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -11286,21 +11221,9 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp parallel for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->getTaskgroupReductionRef(), DSAStack->isCancelRegion()); @@ -11312,13 +11235,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); + setBranchProtectedScope(SemaRef, OMPD_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -11330,21 +11247,12 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelForSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -11355,16 +11263,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_parallel_master, AStmt); return OMPParallelMasterDirective::Create( getASTContext(), StartLoc, EndLoc, Clauses, AStmt, @@ -11377,16 +11276,7 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_parallel_masked, AStmt); return OMPParallelMaskedDirective::Create( getASTContext(), StartLoc, EndLoc, Clauses, AStmt, @@ -11396,34 +11286,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedDirective( StmtResult SemaOpenMP::ActOnOpenMPParallelSectionsDirective( ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) { - if (!AStmt) - return StmtError(); - - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto BaseStmt = AStmt; - while (auto *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt)) - BaseStmt = CS->getCapturedStmt(); - if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { - auto S = C->children(); - if (S.begin() == S.end()) - return StmtError(); - // All associated statements must be '#pragma omp section' except for - // the first one. - for (Stmt *SectionStmt : llvm::drop_begin(S)) { - if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { - if (SectionStmt) - Diag(SectionStmt->getBeginLoc(), - diag::err_omp_parallel_sections_substmt_not_section); - return StmtError(); - } - cast<OMPSectionDirective>(SectionStmt) - ->setHasCancel(DSAStack->isCancelRegion()); - } - } else { - Diag(AStmt->getBeginLoc(), - diag::err_omp_parallel_sections_not_compound_stmt); + if (checkSectionsDirective(SemaRef, OMPD_parallel_sections, AStmt, DSAStack)) return StmtError(); - } SemaRef.setFunctionHasBranchProtectedScope(); @@ -11469,15 +11333,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses, {OMPC_detach, OMPC_mergeable})) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_task, AStmt); return OMPTaskDirective::Create(getASTContext(), StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion()); @@ -13404,23 +13260,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses, if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope(SemaRef, OMPD_target, AStmt); // OpenMP [2.16, Nesting of Regions] // If specified, a teams construct must be contained within a target @@ -13461,8 +13301,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses, } } - SemaRef.setFunctionHasBranchProtectedScope(); - return OMPTargetDirective::Create(getASTContext(), StartLoc, EndLoc, Clauses, AStmt); } @@ -13473,25 +13311,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } - - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_target_parallel, AStmt); return OMPTargetParallelDirective::Create( getASTContext(), StartLoc, EndLoc, Clauses, AStmt, @@ -13504,23 +13324,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel_for); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -13532,21 +13337,9 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target parallel for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetParallelForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->getTaskgroupReductionRef(), DSAStack->isCancelRegion()); @@ -13622,23 +13415,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetEnterDataDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_enter_data); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + setBranchProtectedScope(SemaRef, OMPD_target_enter_data, AStmt); // OpenMP [2.10.2, Restrictions, p. 99] // At least one map clause must appear on the directive. @@ -13658,23 +13435,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetExitDataDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_exit_data); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + setBranchProtectedScope(SemaRef, OMPD_target_exit_data, AStmt); // OpenMP [2.10.3, Restrictions, p. 102] // At least one map clause must appear on the directive. @@ -13694,23 +13455,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetUpdateDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_update); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + setBranchProtectedScope(SemaRef, OMPD_target_update, AStmt); if (!hasClauses(Clauses, OMPC_to, OMPC_from)) { Diag(StartLoc, diag::err_omp_at_least_one_motion_clause_required); @@ -13737,15 +13482,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses, if (getLangOpts().HIP && (DSAStack->getParentDirective() == OMPD_target)) Diag(StartLoc, diag::warn_hip_omp_target_directives); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_teams, AStmt); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -13866,19 +13603,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTaskLoopSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); // OpenMP, [2.9.2 taskloop Construct, Restrictions] // The grainsize clause and num_tasks clause are mutually exclusive and may @@ -13992,19 +13718,8 @@ StmtResult SemaOpenMP::ActOnOpenMPMasterTaskLoopSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); // OpenMP, [2.9.2 taskloop Construct, Restrictions] // The grainsize clause and num_tasks clause are mutually exclusive and may @@ -14042,19 +13757,8 @@ StmtResult SemaOpenMP::ActOnOpenMPMaskedTaskLoopSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); // OpenMP, [2.9.2 taskloop Construct, Restrictions] // The grainsize clause and num_tasks clause are mutually exclusive and may @@ -14081,25 +13785,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterTaskLoopDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_parallel_master_taskloop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_parallel_master_taskloop, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -14126,7 +13813,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterTaskLoopDirective( if (checkReductionClauseWithNogroup(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelMasterTaskLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -14138,25 +13824,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedTaskLoopDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_parallel_masked_taskloop); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_parallel_masked_taskloop, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -14183,7 +13852,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedTaskLoopDirective( if (checkReductionClauseWithNogroup(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelMaskedTaskLoopDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -14195,25 +13863,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterTaskLoopSimdDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_parallel_master_taskloop_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_parallel_master_taskloop_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -14225,19 +13876,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterTaskLoopSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); // OpenMP, [2.9.2 taskloop Construct, Restrictions] // The grainsize clause and num_tasks clause are mutually exclusive and may @@ -14253,7 +13893,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMasterTaskLoopSimdDirective( if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelMasterTaskLoopSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14264,25 +13903,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedTaskLoopSimdDirective( if (!AStmt) return StmtError(); - assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_parallel_masked_taskloop_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_parallel_masked_taskloop_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -14294,19 +13916,8 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedTaskLoopSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); // OpenMP, [2.9.2 taskloop Construct, Restrictions] // The grainsize clause and num_tasks clause are mutually exclusive and may @@ -14322,7 +13933,6 @@ StmtResult SemaOpenMP::ActOnOpenMPParallelMaskedTaskLoopSimdDirective( if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPParallelMaskedTaskLoopSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14363,24 +13973,8 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_distribute_parallel_for); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_distribute_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14395,7 +13989,6 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeParallelForDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp for loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPDistributeParallelForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->getTaskgroupReductionRef(), DSAStack->isCancelRegion()); @@ -14407,24 +14000,8 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_distribute_parallel_for_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_distribute_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14436,24 +14013,12 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeParallelForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPDistributeParallelForSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14464,23 +14029,8 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_distribute_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_distribute_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14492,24 +14042,12 @@ StmtResult SemaOpenMP::ActOnOpenMPDistributeSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPDistributeSimdDirective::Create(getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14520,24 +14058,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_target_parallel_for_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' or 'ordered' with number of loops, it will @@ -14549,23 +14071,12 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetParallelForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target parallel for simd loop exprs were not built"); + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetParallelForSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14576,23 +14087,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope(SemaRef, OMPD_target_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will define the @@ -14604,24 +14099,12 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetSimdDirective::Create(getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14632,23 +14115,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_teams_distribute); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_teams_distribute, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14663,8 +14131,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp teams distribute loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsDistributeDirective::Create( @@ -14677,24 +14143,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_teams_distribute_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_teams_distribute_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14703,29 +14153,15 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeSimdDirective( OMPD_teams_distribute_simd, getCollapseNumberExpr(Clauses), nullptr /*ordered not a clause on distribute*/, CS, SemaRef, *DSAStack, VarsWithImplicitDSA, B); - if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp teams distribute simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); - DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsDistributeSimdDirective::Create( @@ -14738,25 +14174,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_teams_distribute_parallel_for_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_teams_distribute_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14765,29 +14184,15 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeParallelForSimdDirective( OMPD_teams_distribute_parallel_for_simd, getCollapseNumberExpr(Clauses), nullptr /*ordered not a clause on distribute*/, CS, SemaRef, *DSAStack, VarsWithImplicitDSA, B); - if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); - DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsDistributeParallelForSimdDirective::Create( @@ -14800,25 +14205,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_teams_distribute_parallel_for); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_teams_distribute_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14834,8 +14222,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTeamsDistributeParallelForDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp for loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); - DSAStack->setParentTeamsRegionLoc(StartLoc); return OMPTeamsDistributeParallelForDirective::Create( @@ -14849,25 +14235,7 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - - for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_teams); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } - SemaRef.setFunctionHasBranchProtectedScope(); + setBranchProtectedScope(SemaRef, OMPD_target_teams, AStmt); const OMPClause *BareClause = nullptr; bool HasThreadLimitAndNumTeamsClause = hasClauses(Clauses, OMPC_num_teams) && @@ -14892,24 +14260,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_target_teams_distribute); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = + setBranchProtectedScope(SemaRef, OMPD_target_teams_distribute, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14924,7 +14276,6 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeDirective( assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && "omp target teams distribute loop exprs were not built"); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -14935,24 +14286,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_target_teams_distribute_parallel_for); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_target_teams_distribute_parallel_for, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -14964,21 +14299,9 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target teams distribute parallel for loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeParallelForDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->getTaskgroupReductionRef(), DSAStack->isCancelRegion()); @@ -14990,24 +14313,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = getOpenMPCaptureLevels( - OMPD_target_teams_distribute_parallel_for_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_target_teams_distribute_parallel_for_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -15020,25 +14327,12 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target teams distribute parallel for simd loop exprs were not " - "built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeParallelForSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -15049,24 +14343,8 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeSimdDirective( if (!AStmt) return StmtError(); - auto *CS = cast<CapturedStmt>(AStmt); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - for (int ThisCaptureLevel = - getOpenMPCaptureLevels(OMPD_target_teams_distribute_simd); - ThisCaptureLevel > 1; --ThisCaptureLevel) { - CS = cast<CapturedStmt>(CS->getCapturedStmt()); - // 1.2.2 OpenMP Language Terminology - // Structured block - An executable statement with a single entry at the - // top and a single exit at the bottom. - // The point of exit cannot be a branch out of the structured block. - // longjmp() and throw() must not violate the entry/exit criteria. - CS->getCapturedDecl()->setNothrow(); - } + CapturedStmt *CS = setBranchProtectedScope( + SemaRef, OMPD_target_teams_distribute_simd, AStmt); OMPLoopBasedDirective::HelperExprs B; // In presence of clause 'collapse' with number of loops, it will @@ -15078,24 +14356,12 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeSimdDirective( if (NestedLoopCount == 0) return StmtError(); - assert((SemaRef.CurContext->isDependentContext() || B.builtAll()) && - "omp target teams distribute simd loop exprs were not built"); - - if (!SemaRef.CurContext->isDependentContext()) { - // Finalize the clauses that need pre-built expressions for CodeGen. - for (OMPClause *C : Clauses) { - if (auto *LC = dyn_cast<OMPLinearClause>(C)) - if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef), - B.NumIterations, SemaRef, - SemaRef.getCurScope(), DSAStack)) - return StmtError(); - } - } + if (finishLinearClauses(SemaRef, Clauses, B, DSAStack)) + return StmtError(); if (checkSimdlenSafelenSpecified(SemaRef, Clauses)) return StmtError(); - SemaRef.setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeSimdDirective::Create( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } |