diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -2584,7 +2584,11 @@ */ CXCursor_OMPDispatchDirective = 291, - CXCursor_LastStmt = CXCursor_OMPDispatchDirective, + /** OpenMP mask directive. + */ + CXCursor_OMPMaskedDirective = 292, + + CXCursor_LastStmt = CXCursor_OMPMaskedDirective, /** * Cursor that represents the translation unit itself. diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -8225,6 +8225,78 @@ } }; +/// This represents 'filter' clause in the '#pragma omp ...' directive. +/// +/// \code +/// #pragma omp masked filter(tid) +/// \endcode +/// In this example directive '#pragma omp masked' has 'filter' clause with +/// thread id. +class OMPFilterClause final : public OMPClause, public OMPClauseWithPreInit { + friend class OMPClauseReader; + + /// Location of '('. + SourceLocation LParenLoc; + + /// Express of the 'filter' clause. + Stmt *ThreadID = nullptr; + + /// Sets the thread identifier. + void setThreadID(Expr *TID) { ThreadID = TID; } + + /// Sets the location of '('. + void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } + +public: + /// Build 'filter' clause with thread-id \a ThreadID. + /// + /// \param ThreadID Thread identifier. + /// \param HelperE Helper expression associated with this clause. + /// \param CaptureRegion Innermost OpenMP region where expressions in this + /// clause must be captured. + /// \param StartLoc Starting location of the clause. + /// \param LParenLoc Location of '('. + /// \param EndLoc Ending location of the clause. + OMPFilterClause(Expr *ThreadID, Stmt *HelperE, + OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc, + SourceLocation LParenLoc, SourceLocation EndLoc) + : OMPClause(llvm::omp::OMPC_filter, StartLoc, EndLoc), + OMPClauseWithPreInit(this), LParenLoc(LParenLoc), ThreadID(ThreadID) { + setPreInitStmt(HelperE, CaptureRegion); + } + + /// Build an empty clause. + OMPFilterClause() + : OMPClause(llvm::omp::OMPC_filter, SourceLocation(), SourceLocation()), + OMPClauseWithPreInit(this) {} + + /// Returns the location of '('. + SourceLocation getLParenLoc() const { return LParenLoc; } + + /// Return thread identifier. + Expr *getThreadID() { return cast(ThreadID); } + + /// Return thread identifier. + Expr *getThreadID() const { return cast(ThreadID); } + + child_range children() { return child_range(&ThreadID, &ThreadID + 1); } + + const_child_range children() const { + return const_child_range(&ThreadID, &ThreadID + 1); + } + + child_range used_children() { + return child_range(child_iterator(), child_iterator()); + } + const_child_range used_children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } + + static bool classof(const OMPClause *T) { + return T->getClauseKind() == llvm::omp::OMPC_filter; + } +}; + /// This class implements a simple visitor for OMPClause /// subclasses. template class Ptr, typename RetTy> diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -2974,6 +2974,9 @@ DEF_TRAVERSE_STMT(OMPDispatchDirective, { TRY_TO(TraverseOMPExecutableDirective(S)); }) +DEF_TRAVERSE_STMT(OMPMaskedDirective, + { TRY_TO(TraverseOMPExecutableDirective(S)); }) + // OpenMP clauses. template bool RecursiveASTVisitor::TraverseOMPClause(OMPClause *C) { @@ -3609,6 +3612,13 @@ return true; } +template +bool RecursiveASTVisitor::VisitOMPFilterClause(OMPFilterClause *C) { + TRY_TO(VisitOMPClauseWithPreInit(C)); + TRY_TO(TraverseStmt(C->getThreadID())); + return true; +} + // FIXME: look at the following tricky-seeming exprs to see if we // need to recurse on anything. These are ones that have methods // returning decls or qualtypes or nestednamespecifier -- though I'm diff --git a/clang/include/clang/AST/StmtOpenMP.h b/clang/include/clang/AST/StmtOpenMP.h --- a/clang/include/clang/AST/StmtOpenMP.h +++ b/clang/include/clang/AST/StmtOpenMP.h @@ -5205,6 +5205,56 @@ } }; +/// This represents '#pragma omp masked' directive. +/// \code +/// #pragma omp masked filter(tid) +/// \endcode +/// This example shows a directive '#pragma omp masked' with a filter clause +/// with variable 'tid'. +/// +class OMPMaskedDirective final : public OMPExecutableDirective { + friend class ASTStmtReader; + friend class OMPExecutableDirective; + + /// Build directive with the given start and end location. + /// + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending location of the directive. + /// + OMPMaskedDirective(SourceLocation StartLoc, SourceLocation EndLoc) + : OMPExecutableDirective(OMPMaskedDirectiveClass, llvm::omp::OMPD_masked, + StartLoc, EndLoc) {} + + /// Build an empty directive. + /// + explicit OMPMaskedDirective() + : OMPExecutableDirective(OMPMaskedDirectiveClass, llvm::omp::OMPD_masked, + SourceLocation(), SourceLocation()) {} + +public: + /// Creates directive. + /// + /// \param C AST context. + /// \param StartLoc Starting location of the directive kind. + /// \param EndLoc Ending Location of the directive. + /// \param AssociatedStmt Statement, associated with the directive. + /// + static OMPMaskedDirective * + Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc, + ArrayRef Clauses, Stmt *AssociatedStmt); + + /// Creates an empty directive. + /// + /// \param C AST context. + /// + static OMPMaskedDirective *CreateEmpty(const ASTContext &C, + unsigned NumClauses, EmptyShell); + + static bool classof(const Stmt *T) { + return T->getStmtClass() == OMPMaskedDirectiveClass; + } +}; + } // end namespace clang #endif diff --git a/clang/include/clang/Basic/StmtNodes.td b/clang/include/clang/Basic/StmtNodes.td --- a/clang/include/clang/Basic/StmtNodes.td +++ b/clang/include/clang/Basic/StmtNodes.td @@ -277,3 +277,4 @@ def OMPTargetTeamsDistributeSimdDirective : StmtNode; def OMPInteropDirective : StmtNode; def OMPDispatchDirective : StmtNode; +def OMPMaskedDirective : StmtNode; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -10803,6 +10803,11 @@ StmtResult ActOnOpenMPDispatchDirective(ArrayRef Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc); + /// Called on well-formed '\#pragma omp masked' after parsing of the + // /associated statement. + StmtResult ActOnOpenMPMaskedDirective(ArrayRef Clauses, + Stmt *AStmt, SourceLocation StartLoc, + SourceLocation EndLoc); /// Checks correctness of linear modifiers. bool CheckOpenMPLinearModifier(OpenMPLinearClauseKind LinKind, @@ -11021,6 +11026,9 @@ SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc); + OMPClause *ActOnOpenMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc); /// Called on well-formed 'threads' clause. OMPClause *ActOnOpenMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc); diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -1942,6 +1942,7 @@ STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE, STMT_OMP_INTEROP_DIRECTIVE, STMT_OMP_DISPATCH_DIRECTIVE, + STMT_OMP_MASKED_DIRECTIVE, EXPR_OMP_ARRAY_SECTION, EXPR_OMP_ARRAY_SHAPING, EXPR_OMP_ITERATOR, diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -100,6 +100,8 @@ return static_cast(C); case OMPC_nocontext: return static_cast(C); + case OMPC_filter: + return static_cast(C); case OMPC_default: case OMPC_proc_bind: case OMPC_safelen: @@ -2245,6 +2247,12 @@ OS << ")"; } +void OMPClausePrinter::VisitOMPFilterClause(OMPFilterClause *Node) { + OS << "filter("; + Node->getThreadID()->printPretty(OS, nullptr, Policy, 0); + OS << ")"; +} + void OMPTraitInfo::getAsVariantMatchInfo(ASTContext &ASTCtx, VariantMatchInfo &VMI) const { for (const OMPTraitSet &Set : Sets) { diff --git a/clang/lib/AST/StmtOpenMP.cpp b/clang/lib/AST/StmtOpenMP.cpp --- a/clang/lib/AST/StmtOpenMP.cpp +++ b/clang/lib/AST/StmtOpenMP.cpp @@ -1977,3 +1977,20 @@ /*HasAssociatedStmt=*/true, /*NumChildren=*/0); } + +OMPMaskedDirective *OMPMaskedDirective::Create(const ASTContext &C, + SourceLocation StartLoc, + SourceLocation EndLoc, + ArrayRef Clauses, + Stmt *AssociatedStmt) { + return createDirective(C, Clauses, AssociatedStmt, + /*NumChildren=*/0, StartLoc, + EndLoc); +} + +OMPMaskedDirective *OMPMaskedDirective::CreateEmpty(const ASTContext &C, + unsigned NumClauses, + EmptyShell) { + return createEmptyDirective(C, NumClauses, + /*HasAssociatedStmt=*/true); +} diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -972,6 +972,11 @@ PrintOMPExecutableDirective(Node); } +void StmtPrinter::VisitOMPMaskedDirective(OMPMaskedDirective *Node) { + Indent() << "#pragma omp masked"; + PrintOMPExecutableDirective(Node); +} + //===----------------------------------------------------------------------===// // Expr printing methods. //===----------------------------------------------------------------------===// diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -569,6 +569,12 @@ Profiler->VisitStmt(C->getInteropVar()); } +void OMPClauseProfiler::VisitOMPFilterClause(const OMPFilterClause *C) { + VistOMPClauseWithPreInit(C); + if (C->getThreadID()) + Profiler->VisitStmt(C->getThreadID()); +} + template void OMPClauseProfiler::VisitOMPClauseList(T *Node) { for (auto *E : Node->varlists()) { @@ -1160,6 +1166,10 @@ VisitOMPExecutableDirective(S); } +void StmtProfiler::VisitOMPMaskedDirective(const OMPMaskedDirective *S) { + VisitOMPExecutableDirective(S); +} + void StmtProfiler::VisitExpr(const Expr *S) { VisitStmt(S); } diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -380,6 +380,8 @@ break; case Stmt::OMPDispatchDirectiveClass: llvm_unreachable("Dispatch directive not supported yet."); + case Stmt::OMPMaskedDirectiveClass: + llvm_unreachable("Masked directive not supported yet."); break; } } diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -5614,6 +5614,7 @@ case OMPC_use: case OMPC_novariants: case OMPC_nocontext: + case OMPC_filter: llvm_unreachable("Clause is not allowed in 'omp atomic'."); } } diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2208,6 +2208,7 @@ case OMPD_target_teams_distribute_parallel_for_simd: case OMPD_target_teams_distribute_simd: case OMPD_dispatch: + case OMPD_masked: Diag(Tok, diag::err_omp_unexpected_directive) << 1 << getOpenMPDirectiveName(DKind); break; @@ -2257,7 +2258,7 @@ /// simd' | 'teams distribute parallel for simd' | 'teams distribute /// parallel for' | 'target teams' | 'target teams distribute' | 'target /// teams distribute parallel for' | 'target teams distribute parallel -/// for simd' | 'target teams distribute simd' {clause} +/// for simd' | 'target teams distribute simd' | 'masked' {clause} /// annot_pragma_openmp_end /// StmtResult @@ -2432,7 +2433,8 @@ case OMPD_target_teams_distribute_parallel_for: case OMPD_target_teams_distribute_parallel_for_simd: case OMPD_target_teams_distribute_simd: - case OMPD_dispatch: { + case OMPD_dispatch: + case OMPD_masked: { // Special processing for flush and depobj clauses. Token ImplicitTok; bool ImplicitClauseAllowed = false; @@ -2778,6 +2780,7 @@ case OMPC_detach: case OMPC_novariants: case OMPC_nocontext: + case OMPC_filter: // OpenMP [2.5, Restrictions] // At most one num_threads clause can appear on the directive. // OpenMP [2.8.1, simd construct, Restrictions] diff --git a/clang/lib/Sema/SemaExceptionSpec.cpp b/clang/lib/Sema/SemaExceptionSpec.cpp --- a/clang/lib/Sema/SemaExceptionSpec.cpp +++ b/clang/lib/Sema/SemaExceptionSpec.cpp @@ -1488,6 +1488,7 @@ case Stmt::OMPTeamsDistributeSimdDirectiveClass: case Stmt::OMPInteropDirectiveClass: case Stmt::OMPDispatchDirectiveClass: + case Stmt::OMPMaskedDirectiveClass: case Stmt::ReturnStmtClass: case Stmt::SEHExceptStmtClass: case Stmt::SEHFinallyStmtClass: diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -3425,6 +3425,7 @@ S->getDirectiveKind() == OMPD_critical || S->getDirectiveKind() == OMPD_section || S->getDirectiveKind() == OMPD_master || + S->getDirectiveKind() == OMPD_masked || isOpenMPLoopTransformationDirective(S->getDirectiveKind())) { Visit(S->getAssociatedStmt()); return; @@ -3969,6 +3970,7 @@ case OMPD_section: case OMPD_master: case OMPD_tile: + case OMPD_masked: break; case OMPD_simd: case OMPD_for: @@ -4450,7 +4452,8 @@ if (DSAStack->getCurrentDirective() == OMPD_atomic || DSAStack->getCurrentDirective() == OMPD_critical || DSAStack->getCurrentDirective() == OMPD_section || - DSAStack->getCurrentDirective() == OMPD_master) + DSAStack->getCurrentDirective() == OMPD_master || + DSAStack->getCurrentDirective() == OMPD_masked) return S; bool ErrorFound = false; @@ -4719,10 +4722,10 @@ (ParentRegion == OMPD_section || ParentRegion == OMPD_sections || ParentRegion == OMPD_parallel_sections))); OrphanSeen = ParentRegion == OMPD_unknown; - } else if (CurrentRegion == OMPD_master) { - // OpenMP [2.16, Nesting of Regions] - // A master region may not be closely nested inside a worksharing, - // atomic, or explicit task region. + } else if (CurrentRegion == OMPD_master || CurrentRegion == OMPD_masked) { + // OpenMP 5.1 [2.22, Nesting of Regions] + // A masked region may not be closely nested inside a worksharing, loop, + // atomic, task, or taskloop region. NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) || isOpenMPTaskingDirective(ParentRegion); } else if (CurrentRegion == OMPD_critical && CurrentName.getName()) { @@ -4752,27 +4755,28 @@ return true; } } else if (CurrentRegion == OMPD_barrier) { - // OpenMP [2.16, Nesting of Regions] - // A barrier region may not be closely nested inside a worksharing, - // explicit task, critical, ordered, atomic, or master region. - NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) || - isOpenMPTaskingDirective(ParentRegion) || - ParentRegion == OMPD_master || - ParentRegion == OMPD_parallel_master || - ParentRegion == OMPD_critical || - ParentRegion == OMPD_ordered; + // OpenMP 5.1 [2.22, Nesting of Regions] + // A barrier region may not be closely nested inside a worksharing, loop, + // task, taskloop, critical, ordered, atomic, or masked region. + NestingProhibited = + isOpenMPWorksharingDirective(ParentRegion) || + isOpenMPTaskingDirective(ParentRegion) || + ParentRegion == OMPD_master || ParentRegion == OMPD_masked || + ParentRegion == OMPD_parallel_master || + ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered; } else if (isOpenMPWorksharingDirective(CurrentRegion) && !isOpenMPParallelDirective(CurrentRegion) && !isOpenMPTeamsDirective(CurrentRegion)) { - // OpenMP [2.16, Nesting of Regions] - // A worksharing region may not be closely nested inside a worksharing, - // explicit task, critical, ordered, atomic, or master region. - NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) || - isOpenMPTaskingDirective(ParentRegion) || - ParentRegion == OMPD_master || - ParentRegion == OMPD_parallel_master || - ParentRegion == OMPD_critical || - ParentRegion == OMPD_ordered; + // OpenMP 5.1 [2.22, Nesting of Regions] + // A loop region that binds to a parallel region or a worksharing region + // may not be closely nested inside a worksharing, loop, task, taskloop, + // critical, ordered, atomic, or masked region. + NestingProhibited = + isOpenMPWorksharingDirective(ParentRegion) || + isOpenMPTaskingDirective(ParentRegion) || + ParentRegion == OMPD_master || ParentRegion == OMPD_masked || + ParentRegion == OMPD_parallel_master || + ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered; Recommend = ShouldBeInParallelRegion; } else if (CurrentRegion == OMPD_ordered) { // OpenMP [2.16, Nesting of Regions] @@ -5699,7 +5703,7 @@ ClausesWithImplicit.append(Clauses.begin(), Clauses.end()); if (AStmt && !CurContext->isDependentContext() && Kind != OMPD_atomic && Kind != OMPD_critical && Kind != OMPD_section && Kind != OMPD_master && - !isOpenMPLoopTransformationDirective(Kind)) { + Kind != OMPD_masked && !isOpenMPLoopTransformationDirective(Kind)) { assert(isa(AStmt) && "Captured statement expected"); // Check default data sharing attributes for referenced variables. @@ -5854,6 +5858,10 @@ "No clauses are allowed for 'omp master' directive"); Res = ActOnOpenMPMasterDirective(AStmt, StartLoc, EndLoc); break; + case OMPD_masked: + Res = ActOnOpenMPMaskedDirective(ClausesWithImplicit, AStmt, StartLoc, + EndLoc); + break; case OMPD_critical: Res = ActOnOpenMPCriticalDirective(DirName, ClausesWithImplicit, AStmt, StartLoc, EndLoc); @@ -9865,6 +9873,18 @@ return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt); } +StmtResult Sema::ActOnOpenMPMaskedDirective(ArrayRef Clauses, + Stmt *AStmt, + SourceLocation StartLoc, + SourceLocation EndLoc) { + if (!AStmt) + return StmtError(); + + setFunctionHasBranchProtectedScope(); + + return OMPMaskedDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); +} + StmtResult Sema::ActOnOpenMPCriticalDirective( const DeclarationNameInfo &DirName, ArrayRef Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) { @@ -12793,6 +12813,9 @@ case OMPC_nocontext: Res = ActOnOpenMPNocontextClause(Expr, StartLoc, LParenLoc, EndLoc); break; + case OMPC_filter: + Res = ActOnOpenMPFilterClause(Expr, StartLoc, LParenLoc, EndLoc); + break; case OMPC_device: case OMPC_if: case OMPC_default: @@ -13000,6 +13023,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13158,6 +13182,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13236,6 +13261,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13313,6 +13339,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13393,6 +13420,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_ordered: @@ -13472,6 +13500,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13552,6 +13581,7 @@ case OMPD_section: case OMPD_single: case OMPD_master: + case OMPD_masked: case OMPD_critical: case OMPD_taskgroup: case OMPD_distribute: @@ -13575,6 +13605,9 @@ llvm_unreachable("Unexpected OpenMP directive"); } break; + case OMPC_filter: + // Do not capture filter-clause expressions. + break; case OMPC_firstprivate: case OMPC_lastprivate: case OMPC_reduction: @@ -14945,6 +14978,27 @@ StartLoc, LParenLoc, EndLoc); } +OMPClause *Sema::ActOnOpenMPFilterClause(Expr *ThreadID, + SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + Expr *ValExpr = ThreadID; + Stmt *HelperValStmt = nullptr; + + OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective(); + OpenMPDirectiveKind CaptureRegion = + getOpenMPCaptureRegionForClause(DKind, OMPC_filter, LangOpts.OpenMP); + if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) { + ValExpr = MakeFullExpr(ValExpr).get(); + llvm::MapVector Captures; + ValExpr = tryBuildCapture(*this, ValExpr, Captures).get(); + HelperValStmt = buildPreInits(Context, Captures); + } + + return new (Context) OMPFilterClause(ValExpr, HelperValStmt, CaptureRegion, + StartLoc, LParenLoc, EndLoc); +} + OMPClause *Sema::ActOnOpenMPVarListClause( OpenMPClauseKind Kind, ArrayRef VarList, Expr *DepModOrTailExpr, const OMPVarListLocTy &Locs, SourceLocation ColonLoc, diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -2231,6 +2231,17 @@ EndLoc); } + /// Build a new OpenMP 'filter' clause. + /// + /// By default, performs semantic analysis to build the new OpenMP clause. + /// Subclasses may override this routine to provide different behavior. + OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, + EndLoc); + } + /// Rebuild the operand to an Objective-C \@synchronized statement. /// /// By default, performs semantic analysis to build the new statement. @@ -9103,6 +9114,17 @@ return Res; } +template +StmtResult +TreeTransform::TransformOMPMaskedDirective(OMPMaskedDirective *D) { + DeclarationNameInfo DirName; + getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, + D->getBeginLoc()); + StmtResult Res = getDerived().TransformOMPExecutableDirective(D); + getDerived().getSema().EndOpenMPDSABlock(Res.get()); + return Res; +} + //===----------------------------------------------------------------------===// // OpenMP clause transformation //===----------------------------------------------------------------------===// @@ -9420,6 +9442,16 @@ Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); } +template +OMPClause * +TreeTransform::TransformOMPFilterClause(OMPFilterClause *C) { + ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); + if (ThreadID.isInvalid()) + return nullptr; + return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), + C->getLParenLoc(), C->getEndLoc()); +} + template OMPClause *TreeTransform::TransformOMPUnifiedAddressClause( OMPUnifiedAddressClause *C) { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -11993,6 +11993,9 @@ case llvm::omp::OMPC_affinity: C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); break; + case llvm::omp::OMPC_filter: + C = new (Context) OMPFilterClause(); + break; #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ case llvm::omp::Enum: \ break; @@ -12964,6 +12967,12 @@ C->setKindKwLoc(Record.readSourceLocation()); } +void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { + VisitOMPClauseWithPreInit(C); + C->setThreadID(Record.readSubExpr()); + C->setLParenLoc(Record.readSourceLocation()); +} + OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); TI.Sets.resize(readUInt32()); diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -2599,6 +2599,11 @@ D->setTargetCallLoc(Record.readSourceLocation()); } +void ASTStmtReader::VisitOMPMaskedDirective(OMPMaskedDirective *D) { + VisitStmt(D); + VisitOMPExecutableDirective(D); +} + //===----------------------------------------------------------------------===// // ASTReader Implementation //===----------------------------------------------------------------------===// @@ -3524,6 +3529,12 @@ Context, Record[ASTStmtReader::NumStmtFields], Empty); break; + case STMT_OMP_MASKED_DIRECTIVE: { + S = OMPMaskedDirective::CreateEmpty( + Context, Record[ASTStmtReader::NumStmtFields], Empty); + break; + } + case EXPR_CXX_OPERATOR_CALL: S = CXXOperatorCallExpr::CreateEmpty( Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -6246,6 +6246,11 @@ void OMPClauseWriter::VisitOMPNocontextClause(OMPNocontextClause *C) { VisitOMPClauseWithPreInit(C); Record.AddStmt(C->getCondition()); +} + +void OMPClauseWriter::VisitOMPFilterClause(OMPFilterClause *C) { + VisitOMPClauseWithPreInit(C); + Record.AddStmt(C->getThreadID()); Record.AddSourceLocation(C->getLParenLoc()); } diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -2554,6 +2554,12 @@ Code = serialization::STMT_OMP_DISPATCH_DIRECTIVE; } +void ASTStmtWriter::VisitOMPMaskedDirective(OMPMaskedDirective *D) { + VisitStmt(D); + VisitOMPExecutableDirective(D); + Code = serialization::STMT_OMP_MASKED_DIRECTIVE; +} + //===----------------------------------------------------------------------===// // ASTWriter Implementation //===----------------------------------------------------------------------===// diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -1296,6 +1296,7 @@ case Stmt::OMPTileDirectiveClass: case Stmt::OMPInteropDirectiveClass: case Stmt::OMPDispatchDirectiveClass: + case Stmt::OMPMaskedDirectiveClass: case Stmt::CapturedStmtClass: { const ExplodedNode *node = Bldr.generateSink(S, Pred, Pred->getState()); Engine.addAbortedBlock(node, currBldrCtx->getBlock()); diff --git a/clang/test/OpenMP/masked_ast_print.cpp b/clang/test/OpenMP/masked_ast_print.cpp new file mode 100644 --- /dev/null +++ b/clang/test/OpenMP/masked_ast_print.cpp @@ -0,0 +1,54 @@ +// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s + +// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck %s +// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s +// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s +// expected-no-diagnostics + +#ifndef HEADER +#define HEADER + +void foo() {} + +int main (int argc, char **argv) { + int b = argc, c, d, e, f, g; + static int a; +// CHECK: static int a; +#pragma omp parallel +{ +#pragma omp masked +{ + a=2; +} + +#pragma omp masked filter(1) +{ + a=3; +} + +#pragma omp masked filter(a) +{ + a=4; +} +} +// CHECK-NEXT: #pragma omp parallel +// CHECK-NEXT: { +// CHECK-NEXT: #pragma omp masked{{$}} +// CHECK-NEXT: { +// CHECK-NEXT: a = 2; +// CHECK-NEXT: } +// CHECK-NEXT: #pragma omp masked filter(1){{$}} +// CHECK-NEXT: { +// CHECK-NEXT: a = 3; +// CHECK-NEXT: } +// CHECK-NEXT: #pragma omp masked filter(a){{$}} +// CHECK-NEXT: { +// CHECK-NEXT: a = 4; +// CHECK-NEXT: } +// CHECK-NEXT: } + return (0); +} + +#endif diff --git a/clang/test/OpenMP/masked_messages.cpp b/clang/test/OpenMP/masked_messages.cpp new file mode 100644 --- /dev/null +++ b/clang/test/OpenMP/masked_messages.cpp @@ -0,0 +1,86 @@ +// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized + +// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized + +void xxx(int argc) { + int x; // expected-note {{initialize the variable 'x' to silence this warning}} +#pragma omp masked + argc = x; // expected-warning {{variable 'x' is uninitialized when used here}} +} + +void yyy(int argc) { + int x; // expected-note {{initialize the variable 'x' to silence this warning}} +#pragma omp masked filter(1) + argc = x; // expected-warning {{variable 'x' is uninitialized when used here}} +} + +int foo(); + +int main() { + #pragma omp masked + ; + #pragma omp masked filter(1) filter(2) // expected-error {{directive '#pragma omp masked' cannot contain more than one 'filter' clause}} + ; + int x,y,z; + #pragma omp masked filter(x) filter(y) filter(z) // expected-error 2 {{directive '#pragma omp masked' cannot contain more than one 'filter' clause}} + ; + #pragma omp masked nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp masked'}} + #pragma omp masked unknown // expected-warning {{extra tokens at the end of '#pragma omp masked' are ignored}} + foo(); + { + #pragma omp masked + } // expected-error {{expected statement}} + { + #pragma omp masked filter(2) + } // expected-error {{expected statement}} + #pragma omp for + for (int i = 0; i < 10; ++i) { + foo(); + #pragma omp masked filter(1) // expected-error {{region cannot be closely nested inside 'for' region}} + foo(); + } + #pragma omp sections + { + foo(); + #pragma omp masked // expected-error {{region cannot be closely nested inside 'sections' region}} + foo(); + } + #pragma omp single + for (int i = 0; i < 10; ++i) { + foo(); + #pragma omp masked allocate(i) // expected-error {{region cannot be closely nested inside 'single' region}} expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp masked'}} + foo(); + } + #pragma omp masked + for (int i = 0; i < 10; ++i) { + foo(); + #pragma omp masked + foo(); + } + #pragma omp for ordered + for (int i = 0; i < 10; ++i) + #pragma omp masked // expected-error {{region cannot be closely nested inside 'for' region}} + { + foo(); + } + + return 0; +} + +int foo() { + L1: // expected-note {{jump exits scope of OpenMP structured block}} + foo(); + #pragma omp masked filter(0) + { + foo(); + goto L1; // expected-error {{cannot jump from this goto statement to its label}} + } + goto L2; // expected-error {{cannot jump from this goto statement to its label}} + #pragma omp masked filter(-2) + { // expected-note {{jump bypasses OpenMP structured block}} + L2: + foo(); + } + + return 0; +} diff --git a/clang/test/OpenMP/nesting_of_regions.cpp b/clang/test/OpenMP/nesting_of_regions.cpp --- a/clang/test/OpenMP/nesting_of_regions.cpp +++ b/clang/test/OpenMP/nesting_of_regions.cpp @@ -45,6 +45,11 @@ bar(); } #pragma omp parallel +#pragma omp masked + { + bar(); + } +#pragma omp parallel #pragma omp critical { bar(); @@ -287,6 +292,13 @@ } #pragma omp simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -551,6 +563,13 @@ } #pragma omp for for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'for' region}} + { + bar(); + } + } +#pragma omp for + for (int i = 0; i < 10; ++i) { #pragma omp critical { bar(); @@ -826,6 +845,13 @@ } #pragma omp for simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp for simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -1121,6 +1147,25 @@ { #pragma omp parallel { +#pragma omp masked // OK + { + bar(); + } +#pragma omp for // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp masked // expected-error {{region cannot be closely nested inside 'sections' region}} + bar(); + } +#pragma omp sections + { +#pragma omp parallel + { #pragma omp critical(A) // OK { bar(); @@ -1394,6 +1439,8 @@ bar(); #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); #pragma omp critical bar(); } @@ -1710,6 +1757,13 @@ } #pragma omp single { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'single' region}} + { + bar(); + } + } +#pragma omp single + { #pragma omp parallel master { bar(); @@ -2216,64 +2270,64 @@ ; } -// CRITICAL DIRECTIVE -#pragma omp critical +// MASKED DIRECTIVE +#pragma omp masked { -#pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +#pragma omp for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp parallel for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} +#pragma omp single // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } } -#pragma omp critical +#pragma omp masked { -#pragma omp master // OK, though second 'master' is redundant +#pragma omp masked // OK, though second 'masked' is redundant { bar(); } } -#pragma omp critical +#pragma omp masked { #pragma omp critical { bar(); } } -#pragma omp critical +#pragma omp masked { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} +#pragma omp sections // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { bar(); } } -#pragma omp critical +#pragma omp masked { #pragma omp parallel { -#pragma omp master // OK +#pragma omp masked // OK { bar(); } @@ -2289,282 +2343,275 @@ } } } -#pragma omp critical +#pragma omp masked { -#pragma omp parallel master +#pragma omp parallel { - bar(); +#pragma omp for // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp for simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp sections // OK + { + bar(); + } } } -#pragma omp critical +#pragma omp masked { #pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp parallel sections { bar(); } } -#pragma omp critical +#pragma omp masked { #pragma omp task { bar(); } } -#pragma omp critical +#pragma omp masked { #pragma omp taskyield bar(); } -#pragma omp critical +#pragma omp masked { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'masked' region}} bar(); } -#pragma omp critical +#pragma omp masked { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'critical' region}} +#pragma omp scan // expected-error {{region cannot be closely nested inside 'masked' region}} bar(); } -#pragma omp critical +#pragma omp masked { #pragma omp taskwait bar(); } -#pragma omp critical(Tuzik) +#pragma omp masked { -#pragma omp critical(grelka) +#pragma omp flush bar(); } -#pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}} - { -#pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}} - { -#pragma omp critical(Tuzik) - { -#pragma omp parallel -#pragma omp critical(grelka) - { - bar(); - } - } - } - } -#pragma omp critical +#pragma omp masked { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp critical +#pragma omp masked { #pragma omp atomic ++a; } -#pragma omp critical +#pragma omp masked { #pragma omp target ++a; } -#pragma omp critical +#pragma omp masked { #pragma omp target parallel ++a; } -#pragma omp critical +#pragma omp masked { #pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target enter data map(to: a) ++a; } -#pragma omp critical +#pragma omp masked { #pragma omp target exit data map(from: a) ++a; } -#pragma omp critical +#pragma omp masked { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp critical +#pragma omp masked { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp critical +#pragma omp masked { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target update to(a) bar(); } -#pragma omp critical +#pragma omp masked { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target teams // OK a++; } -#pragma omp critical +#pragma omp masked { #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp critical +#pragma omp masked { #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) ; } -// PARALLEL FOR DIRECTIVE -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +// CRITICAL DIRECTIVE +#pragma omp critical + { +#pragma omp for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp critical + { +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp parallel for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} +#pragma omp critical + { +#pragma omp single // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} +#pragma omp critical + { +#pragma omp master // OK, though second 'master' is redundant { bar(); } - } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} +#pragma omp masked // OK, though second 'masked' is redundant { bar(); } } - -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} +#pragma omp critical + { +#pragma omp critical { bar(); } } - -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { #pragma omp critical + { +#pragma omp sections // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { bar(); } } - -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp parallel { -#pragma omp single // OK +#pragma omp master // OK + { + bar(); + } +#pragma omp masked // OK { bar(); } @@ -2580,820 +2627,833 @@ } } } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { +#pragma omp parallel master + { + bar(); + } + } +#pragma omp critical + { #pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp parallel sections { bar(); } } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp task { bar(); } } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp taskyield bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} +#pragma omp critical + { +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'critical' region}} bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp scan // omp45-error {{region cannot be closely nested inside 'parallel for' region}} omp50-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}} +#pragma omp critical + { +#pragma omp scan // expected-error {{region cannot be closely nested inside 'critical' region}} bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp taskwait bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp flush - bar(); - } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} - bar(); - } -#pragma omp parallel for ordered - for (int i = 0; i < 10; ++i) { -#pragma omp ordered // OK +#pragma omp critical(Tuzik) + { +#pragma omp critical(grelka) bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical(Belka) // expected-note {{previous 'critical' region starts here}} + { +#pragma omp critical(Belka) // expected-error {{cannot nest 'critical' regions having the same name 'Belka'}} + { +#pragma omp critical(Tuzik) + { +#pragma omp parallel +#pragma omp critical(grelka) + { + bar(); + } + } + } + } +#pragma omp critical + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp critical + { #pragma omp atomic ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target parallel ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target enter data map(to: a) ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target exit data map(from: a) ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp critical + { +#pragma omp teams // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target update to(a) + bar(); } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target simd // OK - for (int j = 0; j < 10; ++j) + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} - for (int j = 0; j < 10; ++j) +#pragma omp critical + { +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'critical' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target teams // OK a++; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target teams distribute // OK - for (int j = 0; j < 10; ++j) + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target teams distribute parallel for // OK - for (int j = 0; j < 10; ++j) + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target teams distribute parallel for simd // OK - for (int j = 0; j < 10; ++j) + for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for - for (int i = 0; i < 10; ++i) { +#pragma omp critical + { #pragma omp target teams distribute simd // OK - for (int j = 0; j < 10; ++j) + for (int i = 0; i < 10; ++i) ; } -// PARALLEL FOR SIMD DIRECTIVE -#pragma omp parallel for simd +// PARALLEL FOR DIRECTIVE +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp simd // omp45warn-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}} +#pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp parallel for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel for region}} { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp single // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp master // expected-error {{region cannot be closely nested inside 'parallel for' region}} + { + bar(); + } +#pragma omp masked // expected-error {{region cannot be closely nested inside 'parallel for' region}} { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp critical { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp parallel { -#pragma omp single +#pragma omp single // OK { bar(); } -#pragma omp for +#pragma omp for // OK for (int i = 0; i < 10; ++i) ; -#pragma omp for simd +#pragma omp for simd // OK for (int i = 0; i < 10; ++i) ; -#pragma omp sections +#pragma omp sections // OK { bar(); } } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp parallel sections { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp task { bar(); } } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp taskyield bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel for' region}} bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}} +#pragma omp scan // omp45-error {{region cannot be closely nested inside 'parallel for' region}} omp50-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}} bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp taskwait bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp flush bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp parallel for simd +#pragma omp parallel for ordered for (int i = 0; i < 10; ++i) { -#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp ordered // OK bar(); } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp atomic // omp45-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp atomic ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target parallel ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target enter data map(to: a) ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target exit data map(from: a) ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} - bar(); +#pragma omp target update to(a) } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target simd // OK for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams // OK a++; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams distribute // OK for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams distribute parallel for // OK for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams distribute parallel for simd // OK for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel for simd +#pragma omp parallel for for (int i = 0; i < 10; ++i) { -#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} +#pragma omp target teams distribute simd // OK for (int j = 0; j < 10; ++j) ; } -// PARALLEL MASTER DIRECTIVE -#pragma omp parallel master - { -#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +// PARALLEL FOR SIMD DIRECTIVE +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp simd +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp simd // omp45warn-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp parallel +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp single // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp master // OK, though second 'master' is redundant +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp critical +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp parallel + +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { -#pragma omp parallel master // OK - { - bar(); - } -#pragma omp for // OK - for (int i = 0; i < 10; ++i) - ; -#pragma omp for simd // OK - for (int i = 0; i < 10; ++i) - ; -#pragma omp sections // OK - { - bar(); - } + bar(); } } -#pragma omp parallel master - { -#pragma omp parallel master // OK + +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { +#pragma omp single { bar(); } -#pragma omp parallel - { -#pragma omp for // OK +#pragma omp for for (int i = 0; i < 10; ++i) ; -#pragma omp for simd // OK +#pragma omp for simd for (int i = 0; i < 10; ++i) ; -#pragma omp sections // OK +#pragma omp sections { bar(); } } } -#pragma omp parallel master - { -#pragma omp parallel for +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { #pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel for simd// expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp parallel sections +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp task +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); } } -#pragma omp parallel master - { -#pragma omp taskyield +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel master' region}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel master' region}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{exactly one of 'inclusive' or 'exclusive' clauses is expected}} bar(); } -#pragma omp parallel master - { -#pragma omp taskwait +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp flush +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp atomic - ++a; +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); } -#pragma omp parallel master - { -#pragma omp target +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp atomic // omp45-error {{OpenMP constructs may not be nested inside a simd region}} ++a; } -#pragma omp parallel master - { -#pragma omp target parallel +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}} ++a; } -#pragma omp parallel master - { -#pragma omp target parallel for +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}} + ++a; + } +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel master - { -#pragma omp target enter data map(to: a) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} ++a; } -#pragma omp parallel master - { -#pragma omp target exit data map(from: a) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} ++a; } -#pragma omp parallel master - { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} ++a; } -#pragma omp parallel master - { -#pragma omp taskloop +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp taskloop // expected-error {{OpenMP constructs may not be nested inside a simd region}} for (int i = 0; i < 10; ++i) ++a; } -#pragma omp parallel master - { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target update to(a) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); } -#pragma omp parallel master - { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target simd // OK - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target teams // OK +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams // expected-error {{OpenMP constructs may not be nested inside a simd region}} a++; } -#pragma omp parallel master - { -#pragma omp target teams distribute // OK - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target teams distribute parallel for // OK - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target teams distribute parallel for simd // OK - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -#pragma omp parallel master - { -#pragma omp target teams distribute simd // OK - for (int i = 0; i < 10; ++i) +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp target teams distribute simd // expected-error {{OpenMP constructs may not be nested inside a simd region}} + for (int j = 0; j < 10; ++j) ; } -// PARALLEL SECTIONS DIRECTIVE -#pragma omp parallel sections +// PARALLEL MASTER DIRECTIVE +#pragma omp parallel master { -#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp parallel for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} +#pragma omp single // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp section +#pragma omp master // OK, though second 'master' is redundant { bar(); } - } -#pragma omp parallel sections - { -#pragma omp section +#pragma omp masked // OK, though second 'master' is redundant { -#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp section +#pragma omp critical { -#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp section +#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { -#pragma omp critical bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp parallel { -#pragma omp single // OK +#pragma omp parallel master // OK { bar(); } @@ -3409,326 +3469,621 @@ } } } -#pragma omp parallel sections +#pragma omp parallel master + { +#pragma omp parallel master // OK + { + bar(); + } +#pragma omp parallel + { +#pragma omp for // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp for simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp sections // OK + { + bar(); + } + } + } +#pragma omp parallel master { #pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp parallel sections { bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp task { bar(); } } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp taskyield + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel master' region}} + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel sections' region}} +#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel master' region}} + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp taskwait + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp flush + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp atomic ++a; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target ++a; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target parallel ++a; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target enter data map(to: a) + ++a; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target exit data map(from: a) + ++a; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target update to(a) + bar(); } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel master' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target teams // OK a++; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp parallel sections +#pragma omp parallel master { #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) ; } -// TASK DIRECTIVE -#pragma omp task -#pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} - for (int i = 0; i < 10; ++i) - ; -#pragma omp task +// PARALLEL SECTIONS DIRECTIVE +#pragma omp parallel sections + { +#pragma omp for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { #pragma omp simd - for (int i = 0; i < 10; ++i) - ; -#pragma omp task -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} - for (int i = 0; i < 10; ++i) - ; -#pragma omp task -#pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections { - bar(); +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; } -#pragma omp task -#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} +#pragma omp parallel sections { - bar(); +#pragma omp parallel + for (int i = 0; i < 10; ++i) + ; } -#pragma omp task -#pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} - bar(); -#pragma omp task -#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} - bar(); -#pragma omp task +#pragma omp parallel sections + { +#pragma omp sections // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + { + bar(); + } + } +#pragma omp parallel sections + { +#pragma omp section + { + bar(); + } + } +#pragma omp parallel sections + { +#pragma omp section + { +#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} + bar(); + } + } +#pragma omp parallel sections + { +#pragma omp section + { +#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); + } + } +#pragma omp parallel sections + { +#pragma omp section + { #pragma omp critical - bar(); - -#pragma omp task + bar(); + } + } +#pragma omp parallel sections + { +#pragma omp parallel + { +#pragma omp single // OK + { + bar(); + } +#pragma omp for // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp for simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp sections // OK + { + bar(); + } + } + } +#pragma omp parallel sections + { #pragma omp parallel for - for (int i = 0; i < 10; ++i) - ; -#pragma omp task -#pragma omp parallel for simd - for (int i = 0; i < 10; ++i) - ; -#pragma omp task + for (int i = 0; i < 10; ++i) + ; + } #pragma omp parallel sections { - bar(); +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) + ; } -#pragma omp task -#pragma omp task +#pragma omp parallel sections { - bar(); +#pragma omp parallel sections + { + bar(); + } } +#pragma omp parallel sections + { #pragma omp task + { + bar(); + } + } +#pragma omp parallel sections { #pragma omp taskyield - bar(); } -#pragma omp task +#pragma omp parallel sections { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} - bar(); +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'parallel sections' region}} } -#pragma omp task +#pragma omp parallel sections { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'task' region}} - bar(); +#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel sections' region}} } -#pragma omp task +#pragma omp parallel sections { #pragma omp taskwait - bar(); } -#pragma omp task +#pragma omp parallel sections { #pragma omp flush - bar(); } -#pragma omp task +#pragma omp parallel sections { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp task +#pragma omp parallel sections { #pragma omp atomic ++a; } -#pragma omp task +#pragma omp parallel sections { #pragma omp target ++a; } -#pragma omp task +#pragma omp parallel sections { #pragma omp target parallel ++a; } -#pragma omp task +#pragma omp parallel sections + { #pragma omp target parallel for - for (int i = 0; i < 10; ++i) - ; -#pragma omp task + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections { #pragma omp target enter data map(to: a) - ++a; } -#pragma omp task +#pragma omp parallel sections { #pragma omp target exit data map(from: a) - ++a; } -#pragma omp task +#pragma omp parallel sections { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp task +#pragma omp parallel sections { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp task +#pragma omp parallel sections { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp task +#pragma omp parallel sections { #pragma omp target update to(a) - bar(); } -#pragma omp task +#pragma omp parallel sections { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp task +#pragma omp parallel sections { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp target simd // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel sections' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp target teams // OK + a++; + } +#pragma omp parallel sections + { +#pragma omp target teams distribute // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp target teams distribute parallel for // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp target teams distribute parallel for simd // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp parallel sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } + +// TASK DIRECTIVE +#pragma omp task +#pragma omp for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; +#pragma omp task +#pragma omp simd + for (int i = 0; i < 10; ++i) + ; +#pragma omp task +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; +#pragma omp task +#pragma omp sections // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + { + bar(); + } +#pragma omp task +#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a task region}} + { + bar(); + } +#pragma omp task +#pragma omp single // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} + bar(); +#pragma omp task +#pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} + bar(); +#pragma omp task +#pragma omp masked // expected-error {{region cannot be closely nested inside 'task' region}} + bar(); +#pragma omp task +#pragma omp critical + bar(); + +#pragma omp task +#pragma omp parallel for + for (int i = 0; i < 10; ++i) + ; +#pragma omp task +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) + ; +#pragma omp task +#pragma omp parallel sections + { + bar(); + } +#pragma omp task +#pragma omp task + { + bar(); + } +#pragma omp task + { +#pragma omp taskyield + bar(); + } +#pragma omp task + { +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'task' region}} + bar(); + } +#pragma omp task + { +#pragma omp scan // expected-error {{region cannot be closely nested inside 'task' region}} + bar(); + } +#pragma omp task + { +#pragma omp taskwait + bar(); + } +#pragma omp task + { +#pragma omp flush + bar(); + } +#pragma omp task + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp task + { +#pragma omp atomic + ++a; + } +#pragma omp task + { +#pragma omp target + ++a; + } +#pragma omp task + { +#pragma omp target parallel + ++a; + } +#pragma omp task +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) + ; +#pragma omp task + { +#pragma omp target enter data map(to: a) + ++a; + } +#pragma omp task + { +#pragma omp target exit data map(from: a) + ++a; + } +#pragma omp task + { +#pragma omp teams // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} + ++a; + } +#pragma omp task + { +#pragma omp taskloop + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp task + { +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp task + { +#pragma omp target update to(a) + bar(); + } +#pragma omp task + { +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp task + { +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } @@ -3836,6 +4191,10 @@ { bar(); } +#pragma omp masked // OK, though second 'ordered' is redundant + { + bar(); + } } #pragma omp ordered { @@ -4147,6 +4506,10 @@ { bar(); } +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside an atomic region}} + { + bar(); + } } #pragma omp atomic // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an lvalue expression with scalar type}} @@ -4455,6 +4818,11 @@ bar(); } #pragma omp target +#pragma omp masked + { + bar(); + } +#pragma omp target #pragma omp critical { bar(); @@ -4688,6 +5056,11 @@ { bar(); } +#pragma omp target parallel +#pragma omp masked + { + bar(); + } #pragma omp target #pragma omp parallel master { @@ -4933,6 +5306,14 @@ } } +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target parallel for' region}} + { + bar(); + } + } + #pragma omp target parallel for for (int i = 0; i < 10; ++i) { #pragma omp critical @@ -5199,6 +5580,12 @@ } #pragma omp target #pragma omp teams +#pragma omp masked // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp masked' directive into a parallel region?}} + { + bar(); + } +#pragma omp target +#pragma omp teams #pragma omp critical // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}} { bar(); @@ -5483,6 +5870,13 @@ } #pragma omp taskloop for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'taskloop' region}} + { + bar(); + } + } +#pragma omp taskloop + for (int i = 0; i < 10; ++i) { #pragma omp critical { bar(); @@ -5801,6 +6195,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute + for (int i = 0; i < 10; ++i) { +#pragma omp masked + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute for (int i = 0; i < 10; ++i) { #pragma omp critical @@ -6122,7 +6525,7 @@ #pragma omp teams #pragma omp distribute parallel for for (int i = 0; i < 10; ++i) { -#pragma omp critical +#pragma omp masked // expected-error {{region cannot be closely nested inside 'distribute parallel for' region}} { bar(); } @@ -6131,7 +6534,16 @@ #pragma omp teams #pragma omp distribute parallel for for (int i = 0; i < 10; ++i) { -#pragma omp parallel +#pragma omp critical + { + bar(); + } + } +#pragma omp target +#pragma omp teams +#pragma omp distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp parallel { #pragma omp single { @@ -6439,6 +6851,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute parallel for simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -6746,6 +7167,13 @@ } #pragma omp target simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -6986,6 +7414,14 @@ } } #pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute for (int i = 0; i < 10; ++i) { #pragma omp critical // OK @@ -7255,6 +7691,14 @@ } } #pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute for (int i = 0; i < 10; ++i) { #pragma omp critical // OK @@ -7544,6 +7988,14 @@ } } #pragma omp target +#pragma omp teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -7833,6 +8285,14 @@ } } #pragma omp target +#pragma omp teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute parallel for simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -8122,6 +8582,14 @@ } } #pragma omp target +#pragma omp teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'teams distribute parallel for' region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute parallel for for (int i = 0; i < 10; ++i) { #pragma omp critical // OK @@ -8368,6 +8836,11 @@ bar(); } #pragma omp target teams +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp masked' directive into a parallel region?}} + { + bar(); + } +#pragma omp target teams #pragma omp critical // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}} { bar(); @@ -8628,6 +9101,13 @@ } #pragma omp target teams distribute for (int i = 0; i < 10; ++i) { +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp target teams distribute + for (int i = 0; i < 10; ++i) { #pragma omp critical // OK { bar(); @@ -8876,6 +9356,13 @@ } #pragma omp target teams distribute parallel for for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target teams distribute parallel for' region}} + { + bar(); + } + } +#pragma omp target teams distribute parallel for + for (int i = 0; i < 10; ++i) { #pragma omp critical // OK { bar(); @@ -9124,6 +9611,13 @@ } #pragma omp target teams distribute parallel for simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -9372,6 +9866,13 @@ } #pragma omp target teams distribute simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -9588,6 +10089,9 @@ #pragma omp parallel #pragma omp master bar(); +#pragma omp parallel +#pragma omp masked + bar(); #pragma omp parallel master bar(); #pragma omp parallel @@ -9815,6 +10319,8 @@ bar(); #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); } #pragma omp simd for (int i = 0; i < 10; ++i) { @@ -10055,6 +10561,8 @@ bar(); #pragma omp master // expected-error {{region cannot be closely nested inside 'for' region}} bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'for' region}} + bar(); #pragma omp critical bar(); } @@ -10315,6 +10823,8 @@ bar(); #pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}} bar(); +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + bar(); } #pragma omp for simd for (int i = 0; i < 10; ++i) { @@ -10557,6 +11067,8 @@ bar(); #pragma omp master // expected-error {{region cannot be closely nested inside 'sections' region}} bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'sections' region}} + bar(); } #pragma omp sections { @@ -10628,539 +11140,808 @@ } #pragma omp sections { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} - bar(); +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } +#pragma omp sections + { +#pragma omp atomic + ++a; + } +#pragma omp sections + { +#pragma omp target + ++a; + } +#pragma omp sections + { +#pragma omp target parallel + ++a; + } +#pragma omp sections + { +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target enter data map(to: a) + } +#pragma omp sections + { +#pragma omp target exit data map(from: a) + } +#pragma omp sections + { +#pragma omp teams // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} + ++a; + } +#pragma omp sections + { +#pragma omp taskloop + for (int i = 0; i < 10; ++i) + ++a; + } +#pragma omp sections + { +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target update to(a) + } +#pragma omp sections + { +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target simd // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target teams // OK + a++; + } +#pragma omp sections + { +#pragma omp target teams distribute // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target teams distribute parallel for // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target teams distribute parallel for simd // OK + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp sections + { +#pragma omp target teams distribute simd // OK + for (int i = 0; i < 10; ++i) + ; + } + +// SECTION DIRECTIVE +#pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} + { + bar(); + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp simd + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp parallel + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} + { + bar(); + } + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} + { + bar(); + } + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} + bar(); +#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); +#pragma omp critical + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp parallel + { +#pragma omp single // OK + { + bar(); + } +#pragma omp for // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp for simd // OK + for (int i = 0; i < 10; ++i) + ; +#pragma omp sections // OK + { + bar(); + } + } + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp parallel for + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) + ; + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp parallel sections + { + bar(); + } + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp task + { + bar(); + } + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp taskyield + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp scan // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp taskwait + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp flush + bar(); + } + } +#pragma omp sections + { +#pragma omp section + { +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); + } } #pragma omp sections { +#pragma omp section + { #pragma omp atomic - ++a; + ++a; + } } #pragma omp sections { +#pragma omp section + { #pragma omp target - ++a; + ++a; + } } #pragma omp sections { +#pragma omp section + { #pragma omp target parallel - ++a; + ++a; + } } #pragma omp sections { +#pragma omp section + { #pragma omp target parallel for - for (int i = 0; i < 10; ++i) - ; + for (int i = 0; i < 10; ++i) + ; + } } #pragma omp sections { +#pragma omp section + { #pragma omp target enter data map(to: a) + ++a; + } } #pragma omp sections { +#pragma omp section + { #pragma omp target exit data map(from: a) + ++a; + } } #pragma omp sections { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} - ++a; +#pragma omp section + { +#pragma omp teams // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} + ++a; + } } #pragma omp sections { +#pragma omp section + { #pragma omp taskloop for (int i = 0; i < 10; ++i) - ++a; + ++a; + } } #pragma omp sections { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp section +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section + { #pragma omp target update to(a) + a++; + } } #pragma omp sections { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp section +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp section +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp section +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp section +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp section +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp section +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'sections' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp section +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section #pragma omp target teams // OK a++; } #pragma omp sections { +#pragma omp section #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } #pragma omp sections { +#pragma omp section #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) ; } -// SECTION DIRECTIVE -#pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}} - { - bar(); - } -#pragma omp sections +// SINGLE DIRECTIVE +#pragma omp single { -#pragma omp section - { -#pragma omp for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} - for (int i = 0; i < 10; ++i) - ; - } +#pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp simd - for (int i = 0; i < 10; ++i) - ; - } + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} - for (int i = 0; i < 10; ++i) - ; - } +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp parallel - for (int i = 0; i < 10; ++i) - ; - } - } -#pragma omp sections - { -#pragma omp section - { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} - { - bar(); - } - } + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section +#pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { -#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a section region}} - { - bar(); - } + bar(); } +#pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} + bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'single' region}} + bar(); +#pragma omp critical + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section +#pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { -#pragma omp single // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} - bar(); -#pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} - bar(); -#pragma omp critical bar(); } } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp parallel - { + { #pragma omp single // OK - { - bar(); - } + { + bar(); + } #pragma omp for // OK - for (int i = 0; i < 10; ++i) - ; + for (int i = 0; i < 10; ++i) + ; #pragma omp for simd // OK - for (int i = 0; i < 10; ++i) - ; + for (int i = 0; i < 10; ++i) + ; #pragma omp sections // OK - { - bar(); - } + { + bar(); } } } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp parallel for - for (int i = 0; i < 10; ++i) - ; - } + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp parallel for simd - for (int i = 0; i < 10; ++i) - ; - } + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp parallel sections - { - bar(); - } + { + bar(); } } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp task - { - bar(); - } + { + bar(); } } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp taskyield - bar(); - } + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'section' region}} - bar(); - } +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'section' region}} - bar(); - } +#pragma omp scan // expected-error {{region cannot be closely nested inside 'single' region}} + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp taskwait - bar(); - } + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp flush - bar(); - } + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} - bar(); - } +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} + bar(); } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp atomic - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target parallel - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target parallel for - for (int i = 0; i < 10; ++i) - ; - } + for (int i = 0; i < 10; ++i) + ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target enter data map(to: a) - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target exit data map(from: a) - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} - ++a; - } +#pragma omp teams // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp taskloop for (int i = 0; i < 10; ++i) - ++a; - } + ++a; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section - { #pragma omp target update to(a) - a++; - } + a++; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'section' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section -#pragma omp target teams // OK +#pragma omp target teams // oK a++; } -#pragma omp sections +#pragma omp single { -#pragma omp section #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp sections +#pragma omp single { -#pragma omp section #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) ; } -// SINGLE DIRECTIVE -#pragma omp single +// MASTER DIRECTIVE +#pragma omp master { -#pragma omp for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +#pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp parallel for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp parallel master { -#pragma omp single // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} + for (int i = 0; i < 10; ++i) + ; + } +#pragma omp master + { +#pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } -#pragma omp master // expected-error {{region cannot be closely nested inside 'single' region}} - bar(); + } +#pragma omp master + { +#pragma omp master // OK, though second 'master' is redundant + { + bar(); + } + } +#pragma omp master + { #pragma omp critical - bar(); + { + bar(); + } } -#pragma omp single +#pragma omp master { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} +#pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { bar(); } } -#pragma omp single +#pragma omp master { #pragma omp parallel { -#pragma omp single // OK +#pragma omp master // OK { bar(); } @@ -11176,213 +11957,220 @@ } } } -#pragma omp single +#pragma omp master + { +#pragma omp parallel master + { + bar(); + } + } +#pragma omp master { #pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp parallel sections { bar(); } } -#pragma omp single +#pragma omp master { #pragma omp task { bar(); } } -#pragma omp single +#pragma omp master { #pragma omp taskyield bar(); } -#pragma omp single +#pragma omp master { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'single' region}} +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} bar(); } -#pragma omp single +#pragma omp master { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'single' region}} +#pragma omp scan // expected-error {{region cannot be closely nested inside 'master' region}} bar(); } -#pragma omp single +#pragma omp master { #pragma omp taskwait bar(); } -#pragma omp single +#pragma omp master { #pragma omp flush bar(); } -#pragma omp single +#pragma omp master { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp single +#pragma omp master { #pragma omp atomic ++a; } -#pragma omp single +#pragma omp master { #pragma omp target ++a; } -#pragma omp single +#pragma omp master { #pragma omp target parallel ++a; } -#pragma omp single +#pragma omp master { #pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target enter data map(to: a) ++a; } -#pragma omp single +#pragma omp master { #pragma omp target exit data map(from: a) ++a; } -#pragma omp single +#pragma omp master { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp single +#pragma omp master { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp single +#pragma omp master { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target update to(a) - a++; + ++a; } -#pragma omp single +#pragma omp master { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'single' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { -#pragma omp target teams // oK +#pragma omp target teams // OK a++; } -#pragma omp single +#pragma omp master { #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp single +#pragma omp master { #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) ; } -// MASTER DIRECTIVE -#pragma omp master +// MASKED DIRECTIVE +#pragma omp masked { -#pragma omp for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} +#pragma omp for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp simd for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} +#pragma omp for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp for simd' directive into a parallel region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp parallel for (int i = 0; i < 10; ++i) @@ -11393,39 +12181,39 @@ for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp single // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} +#pragma omp single // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp single' directive into a parallel region?}} { bar(); } } -#pragma omp master +#pragma omp masked { -#pragma omp master // OK, though second 'master' is redundant +#pragma omp masked // OK, though second 'masked' is redundant { bar(); } } -#pragma omp master +#pragma omp masked { #pragma omp critical { bar(); } } -#pragma omp master +#pragma omp masked { -#pragma omp sections // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} +#pragma omp sections // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp sections' directive into a parallel region?}} { bar(); } } -#pragma omp master +#pragma omp masked { #pragma omp parallel { -#pragma omp master // OK +#pragma omp masked // OK { bar(); } @@ -11441,194 +12229,194 @@ } } } -#pragma omp master +#pragma omp masked { #pragma omp parallel master { bar(); } } -#pragma omp master +#pragma omp masked { #pragma omp parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp parallel for simd for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp parallel sections { bar(); } } -#pragma omp master +#pragma omp masked { #pragma omp task { bar(); } } -#pragma omp master +#pragma omp masked { #pragma omp taskyield bar(); } -#pragma omp master +#pragma omp masked { -#pragma omp barrier // expected-error {{region cannot be closely nested inside 'master' region}} +#pragma omp barrier // expected-error {{region cannot be closely nested inside 'masked' region}} bar(); } -#pragma omp master +#pragma omp masked { -#pragma omp scan // expected-error {{region cannot be closely nested inside 'master' region}} +#pragma omp scan // expected-error {{region cannot be closely nested inside 'masked' region}} bar(); } -#pragma omp master +#pragma omp masked { #pragma omp taskwait bar(); } -#pragma omp master +#pragma omp masked { #pragma omp flush bar(); } -#pragma omp master +#pragma omp masked { -#pragma omp ordered // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} +#pragma omp ordered // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}} bar(); } -#pragma omp master +#pragma omp masked { #pragma omp atomic ++a; } -#pragma omp master +#pragma omp masked { #pragma omp target ++a; } -#pragma omp master +#pragma omp masked { #pragma omp target parallel ++a; } -#pragma omp master +#pragma omp masked { #pragma omp target parallel for for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target enter data map(to: a) ++a; } -#pragma omp master +#pragma omp masked { #pragma omp target exit data map(from: a) ++a; } -#pragma omp master +#pragma omp masked { -#pragma omp teams // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} +#pragma omp teams // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams' directive into a target region?}} ++a; } -#pragma omp master +#pragma omp masked { #pragma omp taskloop for (int i = 0; i < 10; ++i) ++a; } -#pragma omp master +#pragma omp masked { -#pragma omp distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} +#pragma omp distribute // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target update to(a) ++a; } -#pragma omp master +#pragma omp masked { -#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} +#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} +#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} +#pragma omp distribute simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp distribute simd' directive into a teams region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} +#pragma omp teams distribute // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} +#pragma omp teams distribute simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} +#pragma omp teams distribute parallel for simd // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute parallel for simd' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { -#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'master' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} +#pragma omp teams distribute parallel for // expected-error {{region cannot be closely nested inside 'masked' region; perhaps you forget to enclose 'omp teams distribute parallel for' directive into a target region?}} for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target teams // OK a++; } -#pragma omp master +#pragma omp masked { #pragma omp target teams distribute // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target teams distribute parallel for // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target teams distribute parallel for simd // OK for (int i = 0; i < 10; ++i) ; } -#pragma omp master +#pragma omp masked { #pragma omp target teams distribute simd // OK for (int i = 0; i < 10; ++i) @@ -11673,6 +12461,10 @@ { bar(); } +#pragma omp masked // OK, though second 'master' is redundant + { + bar(); + } } #pragma omp critical { @@ -11696,6 +12488,10 @@ { bar(); } +#pragma omp masked // OK + { + bar(); + } #pragma omp for // OK for (int i = 0; i < 10; ++i) ; @@ -11964,6 +12760,10 @@ { bar(); } +#pragma omp masked // expected-error {{region cannot be closely nested inside 'parallel for' region}} + { + bar(); + } #pragma omp critical { bar(); @@ -11981,6 +12781,10 @@ { bar(); } +#pragma omp masked // OK + { + bar(); + } #pragma omp critical // OK { bar(); @@ -12243,6 +13047,13 @@ bar(); } } +#pragma omp parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } #pragma omp parallel for simd for (int i = 0; i < 10; ++i) { @@ -12511,6 +13322,8 @@ bar(); #pragma omp master // expected-error {{region cannot be closely nested inside 'section' region}} bar(); +#pragma omp masked // expected-error {{region cannot be closely nested inside 'section' region}} + bar(); #pragma omp critical bar(); } @@ -12527,6 +13340,10 @@ { bar(); } +#pragma omp masked // OK + { + bar(); + } #pragma omp critical // OK { bar(); @@ -12752,6 +13569,9 @@ #pragma omp master // expected-error {{region cannot be closely nested inside 'task' region}} bar(); #pragma omp task +#pragma omp masked // expected-error {{region cannot be closely nested inside 'task' region}} + bar(); +#pragma omp task #pragma omp critical bar(); #pragma omp task @@ -13004,6 +13824,15 @@ // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an lvalue expression with scalar type}} // expected-note@+1 {{expected an expression statement}} { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside an atomic region}} + { + bar(); + } + } +#pragma omp atomic + // expected-error@+2 {{the statement for 'atomic' must be an expression statement of form '++x;', '--x;', 'x++;', 'x--;', 'x binop= expr;', 'x = x binop expr' or 'x = expr binop x', where x is an lvalue expression with scalar type}} + // expected-note@+1 {{expected an expression statement}} + { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside an atomic region}} { bar(); @@ -13297,6 +14126,11 @@ bar(); } #pragma omp target +#pragma omp masked + { + bar(); + } +#pragma omp target #pragma omp critical { bar(); @@ -13527,6 +14361,11 @@ bar(); } #pragma omp target parallel +#pragma omp masked + { + bar(); + } +#pragma omp target parallel #pragma omp critical { bar(); @@ -13765,6 +14604,13 @@ bar(); } } +#pragma omp target parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target parallel for' region}} + { + bar(); + } + } #pragma omp target parallel for for (int i = 0; i < 10; ++i) { @@ -14031,6 +14877,12 @@ } #pragma omp target #pragma omp teams +#pragma omp masked // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp masked' directive into a parallel region?}} + { + bar(); + } +#pragma omp target +#pragma omp teams #pragma omp critical // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}} { bar(); @@ -14319,6 +15171,13 @@ } #pragma omp taskloop for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'taskloop' region}} + { + bar(); + } + } +#pragma omp taskloop + for (int i = 0; i < 10; ++i) { #pragma omp critical { bar(); @@ -14607,6 +15466,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute + for (int i = 0; i < 10; ++i) { +#pragma omp masked + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute for (int i = 0; i < 10; ++i) { #pragma omp critical @@ -14936,6 +15804,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'distribute parallel for' region}} + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute parallel for for (int i = 0; i < 10; ++i) { #pragma omp critical @@ -15263,6 +16140,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute parallel for simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -15582,6 +16468,15 @@ } #pragma omp target #pragma omp teams +#pragma omp distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target +#pragma omp teams #pragma omp distribute simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -15881,6 +16776,13 @@ } #pragma omp target simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -16132,6 +17034,14 @@ } } #pragma omp target +#pragma omp teams distribute + for (int i = 0; i < 10; ++i) { +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute for (int i = 0; i < 10; ++i) { #pragma omp critical // OK @@ -16421,6 +17331,14 @@ } } #pragma omp target +#pragma omp teams distribute simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -16710,6 +17628,14 @@ } } #pragma omp target +#pragma omp teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute parallel for simd for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} @@ -16999,6 +17925,14 @@ } } #pragma omp target +#pragma omp teams distribute parallel for + for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'teams distribute parallel for' region}} + { + bar(); + } + } +#pragma omp target #pragma omp teams distribute parallel for for (int i = 0; i < 10; ++i) { #pragma omp critical // OK @@ -17245,6 +18179,11 @@ bar(); } #pragma omp target teams +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp masked' directive into a parallel region?}} + { + bar(); + } +#pragma omp target teams #pragma omp critical // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp critical' directive into a parallel region?}} { bar(); @@ -17505,6 +18444,13 @@ } #pragma omp target teams distribute for (int i = 0; i < 10; ++i) { +#pragma omp masked // OK + { + bar(); + } + } +#pragma omp target teams distribute + for (int i = 0; i < 10; ++i) { #pragma omp critical // OK { bar(); @@ -17753,6 +18699,13 @@ } #pragma omp target teams distribute parallel for for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{region cannot be closely nested inside 'target teams distribute parallel for' region}} + { + bar(); + } + } +#pragma omp target teams distribute parallel for + for (int i = 0; i < 10; ++i) { #pragma omp critical // OK { bar(); @@ -18001,6 +18954,13 @@ } #pragma omp target teams distribute parallel for simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute parallel for simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); @@ -18249,6 +19209,13 @@ } #pragma omp target teams distribute simd for (int i = 0; i < 10; ++i) { +#pragma omp masked // expected-error {{OpenMP constructs may not be nested inside a simd region}} + { + bar(); + } + } +#pragma omp target teams distribute simd + for (int i = 0; i < 10; ++i) { #pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}} { bar(); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -2299,6 +2299,11 @@ Visitor->AddStmt(C->getCondition()); } +void OMPClauseEnqueue::VisitOMPFilterClause(const OMPFilterClause *C) { + VisitOMPClauseWithPreInit(C); + Visitor->AddStmt(C->getThreadID()); +} + void OMPClauseEnqueue::VisitOMPUnifiedAddressClause( const OMPUnifiedAddressClause *) {} @@ -5678,6 +5683,8 @@ return cxstring::createRef("OMPInteropDirective"); case CXCursor_OMPDispatchDirective: return cxstring::createRef("OMPDispatchDirective"); + case CXCursor_OMPMaskedDirective: + return cxstring::createRef("OMPMaskedDirective"); case CXCursor_OverloadCandidate: return cxstring::createRef("OverloadCandidate"); case CXCursor_TypeAliasTemplateDecl: diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -813,6 +813,9 @@ case Stmt::OMPDispatchDirectiveClass: K = CXCursor_OMPDispatchDirective; break; + case Stmt::OMPMaskedDirectiveClass: + K = CXCursor_OMPMaskedDirective; + break; case Stmt::BuiltinBitCastExprClass: K = CXCursor_BuiltinBitCastExpr; } diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -731,6 +731,7 @@ CHECK_SIMPLE_CLAUSE(Use, OMPC_use) CHECK_SIMPLE_CLAUSE(Novariants, OMPC_novariants) CHECK_SIMPLE_CLAUSE(Nocontext, OMPC_nocontext) +CHECK_SIMPLE_CLAUSE(Filter, OMPC_filter) CHECK_REQ_SCALAR_INT_CLAUSE(Allocator, OMPC_allocator) CHECK_REQ_SCALAR_INT_CLAUSE(Grainsize, OMPC_grainsize) diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td --- a/llvm/include/llvm/Frontend/OpenMP/OMP.td +++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td @@ -331,6 +331,10 @@ } def OMPC_Inbranch : Clause<"inbranch"> {} def OMPC_Notinbranch : Clause<"notinbranch"> {} +def OMPC_Filter : Clause<"filter"> { + let clangClass = "OMPFilterClause"; + let flangClass = "ScalarIntExpr"; +} //===----------------------------------------------------------------------===// // Definition of OpenMP directives @@ -1675,6 +1679,11 @@ VersionedClause ]; } +def OMP_masked : Directive<"masked"> { + let allowedOnceClauses = [ + VersionedClause + ]; +} def OMP_Unknown : Directive<"unknown"> { let isDefault = true; }