forked from OSchip/llvm-project
[OPENMP50]Initial support for scan directive.
Addedi basic parsing/sema/serialization support for scan directive.
This commit is contained in:
parent
ce6c95aaca
commit
fcba7c3534
|
@ -2578,7 +2578,11 @@ enum CXCursorKind {
|
||||||
*/
|
*/
|
||||||
CXCursor_OMPDepobjDirective = 286,
|
CXCursor_OMPDepobjDirective = 286,
|
||||||
|
|
||||||
CXCursor_LastStmt = CXCursor_OMPDepobjDirective,
|
/** OpenMP scan directive.
|
||||||
|
*/
|
||||||
|
CXCursor_OMPScanDirective = 287,
|
||||||
|
|
||||||
|
CXCursor_LastStmt = CXCursor_OMPScanDirective,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cursor that represents the translation unit itself.
|
* Cursor that represents the translation unit itself.
|
||||||
|
|
|
@ -2852,6 +2852,9 @@ DEF_TRAVERSE_STMT(OMPFlushDirective,
|
||||||
DEF_TRAVERSE_STMT(OMPDepobjDirective,
|
DEF_TRAVERSE_STMT(OMPDepobjDirective,
|
||||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||||
|
|
||||||
|
DEF_TRAVERSE_STMT(OMPScanDirective,
|
||||||
|
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||||
|
|
||||||
DEF_TRAVERSE_STMT(OMPOrderedDirective,
|
DEF_TRAVERSE_STMT(OMPOrderedDirective,
|
||||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||||
|
|
||||||
|
|
|
@ -4688,6 +4688,63 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// This represents '#pragma omp scan' directive.
|
||||||
|
///
|
||||||
|
/// \code
|
||||||
|
/// #pragma omp scan inclusive(a)
|
||||||
|
/// \endcode
|
||||||
|
/// In this example directive '#pragma omp scan' has clause 'inclusive' with
|
||||||
|
/// list item 'a'.
|
||||||
|
class OMPScanDirective final : public OMPExecutableDirective {
|
||||||
|
friend class ASTStmtReader;
|
||||||
|
/// Build directive with the given start and end location.
|
||||||
|
///
|
||||||
|
/// \param StartLoc Starting location of the directive kind.
|
||||||
|
/// \param EndLoc Ending location of the directive.
|
||||||
|
/// \param NumClauses Number of clauses.
|
||||||
|
///
|
||||||
|
OMPScanDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||||
|
unsigned NumClauses)
|
||||||
|
: OMPExecutableDirective(this, OMPScanDirectiveClass,
|
||||||
|
llvm::omp::OMPD_scan, StartLoc, EndLoc,
|
||||||
|
NumClauses, 0) {}
|
||||||
|
|
||||||
|
/// Build an empty directive.
|
||||||
|
///
|
||||||
|
/// \param NumClauses Number of clauses.
|
||||||
|
///
|
||||||
|
explicit OMPScanDirective(unsigned NumClauses)
|
||||||
|
: OMPExecutableDirective(this, OMPScanDirectiveClass,
|
||||||
|
llvm::omp::OMPD_scan, SourceLocation(),
|
||||||
|
SourceLocation(), NumClauses, 0) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// Creates directive with a list of \a Clauses.
|
||||||
|
///
|
||||||
|
/// \param C AST context.
|
||||||
|
/// \param StartLoc Starting location of the directive kind.
|
||||||
|
/// \param EndLoc Ending Location of the directive.
|
||||||
|
/// \param Clauses List of clauses (only single OMPFlushClause clause is
|
||||||
|
/// allowed).
|
||||||
|
///
|
||||||
|
static OMPScanDirective *Create(const ASTContext &C, SourceLocation StartLoc,
|
||||||
|
SourceLocation EndLoc,
|
||||||
|
ArrayRef<OMPClause *> Clauses);
|
||||||
|
|
||||||
|
/// Creates an empty directive with the place for \a NumClauses
|
||||||
|
/// clauses.
|
||||||
|
///
|
||||||
|
/// \param C AST context.
|
||||||
|
/// \param NumClauses Number of clauses.
|
||||||
|
///
|
||||||
|
static OMPScanDirective *CreateEmpty(const ASTContext &C, unsigned NumClauses,
|
||||||
|
EmptyShell);
|
||||||
|
|
||||||
|
static bool classof(const Stmt *T) {
|
||||||
|
return T->getStmtClass() == OMPScanDirectiveClass;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // end namespace clang
|
} // end namespace clang
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -9823,9 +9823,10 @@ def err_omp_prohibited_region : Error<
|
||||||
"%select{|; perhaps you forget to enclose 'omp %3' directive into a parallel region?|"
|
"%select{|; perhaps you forget to enclose 'omp %3' directive into a parallel region?|"
|
||||||
"; perhaps you forget to enclose 'omp %3' directive into a for or a parallel for region with 'ordered' clause?|"
|
"; perhaps you forget to enclose 'omp %3' directive into a for or a parallel for region with 'ordered' clause?|"
|
||||||
"; perhaps you forget to enclose 'omp %3' directive into a target region?|"
|
"; perhaps you forget to enclose 'omp %3' directive into a target region?|"
|
||||||
"; perhaps you forget to enclose 'omp %3' directive into a teams region?}2">;
|
"; perhaps you forget to enclose 'omp %3' directive into a teams region?|"
|
||||||
|
"; perhaps you forget to enclose 'omp %3' directive into a for, simd, or for simd region?}2">;
|
||||||
def err_omp_prohibited_region_simd : Error<
|
def err_omp_prohibited_region_simd : Error<
|
||||||
"OpenMP constructs may not be nested inside a simd region%select{| except for ordered simd, simd or atomic directive}0">;
|
"OpenMP constructs may not be nested inside a simd region%select{| except for ordered simd, simd, scan, or atomic directive}0">;
|
||||||
def err_omp_prohibited_region_atomic : Error<
|
def err_omp_prohibited_region_atomic : Error<
|
||||||
"OpenMP constructs may not be nested inside an atomic region">;
|
"OpenMP constructs may not be nested inside an atomic region">;
|
||||||
def err_omp_prohibited_region_critical_same_name : Error<
|
def err_omp_prohibited_region_critical_same_name : Error<
|
||||||
|
@ -10016,7 +10017,7 @@ def warn_omp_nesting_simd : Warning<
|
||||||
InGroup<SourceUsesOpenMP>;
|
InGroup<SourceUsesOpenMP>;
|
||||||
def err_omp_orphaned_device_directive : Error<
|
def err_omp_orphaned_device_directive : Error<
|
||||||
"orphaned 'omp %0' directives are prohibited"
|
"orphaned 'omp %0' directives are prohibited"
|
||||||
"; perhaps you forget to enclose the directive into a %select{|||target |teams }1region?">;
|
"; perhaps you forget to enclose the directive into a %select{|||target |teams|for, simd, or for simd }1region?">;
|
||||||
def err_omp_reduction_non_addressable_expression : Error<
|
def err_omp_reduction_non_addressable_expression : Error<
|
||||||
"expected addressable reduction item for the task-based directives">;
|
"expected addressable reduction item for the task-based directives">;
|
||||||
def err_omp_reduction_with_nogroup : Error<
|
def err_omp_reduction_with_nogroup : Error<
|
||||||
|
|
|
@ -233,6 +233,7 @@ def OMPTaskwaitDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPTaskgroupDirective : StmtNode<OMPExecutableDirective>;
|
def OMPTaskgroupDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPFlushDirective : StmtNode<OMPExecutableDirective>;
|
def OMPFlushDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPDepobjDirective : StmtNode<OMPExecutableDirective>;
|
def OMPDepobjDirective : StmtNode<OMPExecutableDirective>;
|
||||||
|
def OMPScanDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPOrderedDirective : StmtNode<OMPExecutableDirective>;
|
def OMPOrderedDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPAtomicDirective : StmtNode<OMPExecutableDirective>;
|
def OMPAtomicDirective : StmtNode<OMPExecutableDirective>;
|
||||||
def OMPTargetDirective : StmtNode<OMPExecutableDirective>;
|
def OMPTargetDirective : StmtNode<OMPExecutableDirective>;
|
||||||
|
|
|
@ -10094,6 +10094,10 @@ public:
|
||||||
StmtResult ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses,
|
StmtResult ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
SourceLocation StartLoc,
|
SourceLocation StartLoc,
|
||||||
SourceLocation EndLoc);
|
SourceLocation EndLoc);
|
||||||
|
/// Called on well-formed '\#pragma omp scan'.
|
||||||
|
StmtResult ActOnOpenMPScanDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
|
SourceLocation StartLoc,
|
||||||
|
SourceLocation EndLoc);
|
||||||
/// Called on well-formed '\#pragma omp ordered' after parsing of the
|
/// Called on well-formed '\#pragma omp ordered' after parsing of the
|
||||||
/// associated statement.
|
/// associated statement.
|
||||||
StmtResult ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
|
StmtResult ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
|
|
|
@ -1826,6 +1826,7 @@ namespace serialization {
|
||||||
STMT_OMP_TASKWAIT_DIRECTIVE,
|
STMT_OMP_TASKWAIT_DIRECTIVE,
|
||||||
STMT_OMP_FLUSH_DIRECTIVE,
|
STMT_OMP_FLUSH_DIRECTIVE,
|
||||||
STMT_OMP_DEPOBJ_DIRECTIVE,
|
STMT_OMP_DEPOBJ_DIRECTIVE,
|
||||||
|
STMT_OMP_SCAN_DIRECTIVE,
|
||||||
STMT_OMP_ORDERED_DIRECTIVE,
|
STMT_OMP_ORDERED_DIRECTIVE,
|
||||||
STMT_OMP_ATOMIC_DIRECTIVE,
|
STMT_OMP_ATOMIC_DIRECTIVE,
|
||||||
STMT_OMP_TARGET_DIRECTIVE,
|
STMT_OMP_TARGET_DIRECTIVE,
|
||||||
|
|
|
@ -781,6 +781,27 @@ OMPDepobjDirective *OMPDepobjDirective::CreateEmpty(const ASTContext &C,
|
||||||
return new (Mem) OMPDepobjDirective(NumClauses);
|
return new (Mem) OMPDepobjDirective(NumClauses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OMPScanDirective *OMPScanDirective::Create(const ASTContext &C,
|
||||||
|
SourceLocation StartLoc,
|
||||||
|
SourceLocation EndLoc,
|
||||||
|
ArrayRef<OMPClause *> Clauses) {
|
||||||
|
unsigned Size = llvm::alignTo(sizeof(OMPScanDirective), alignof(OMPClause *));
|
||||||
|
void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size(),
|
||||||
|
alignof(OMPScanDirective));
|
||||||
|
auto *Dir = new (Mem) OMPScanDirective(StartLoc, EndLoc, Clauses.size());
|
||||||
|
Dir->setClauses(Clauses);
|
||||||
|
return Dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
OMPScanDirective *OMPScanDirective::CreateEmpty(const ASTContext &C,
|
||||||
|
unsigned NumClauses,
|
||||||
|
EmptyShell) {
|
||||||
|
unsigned Size = llvm::alignTo(sizeof(OMPScanDirective), alignof(OMPClause *));
|
||||||
|
void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses,
|
||||||
|
alignof(OMPScanDirective));
|
||||||
|
return new (Mem) OMPScanDirective(NumClauses);
|
||||||
|
}
|
||||||
|
|
||||||
OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
|
OMPOrderedDirective *OMPOrderedDirective::Create(const ASTContext &C,
|
||||||
SourceLocation StartLoc,
|
SourceLocation StartLoc,
|
||||||
SourceLocation EndLoc,
|
SourceLocation EndLoc,
|
||||||
|
|
|
@ -758,6 +758,11 @@ void StmtPrinter::VisitOMPDepobjDirective(OMPDepobjDirective *Node) {
|
||||||
PrintOMPExecutableDirective(Node);
|
PrintOMPExecutableDirective(Node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StmtPrinter::VisitOMPScanDirective(OMPScanDirective *Node) {
|
||||||
|
Indent() << "#pragma omp scan";
|
||||||
|
PrintOMPExecutableDirective(Node);
|
||||||
|
}
|
||||||
|
|
||||||
void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
|
void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
|
||||||
Indent() << "#pragma omp ordered";
|
Indent() << "#pragma omp ordered";
|
||||||
PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>());
|
PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>());
|
||||||
|
|
|
@ -900,6 +900,10 @@ void StmtProfiler::VisitOMPDepobjDirective(const OMPDepobjDirective *S) {
|
||||||
VisitOMPExecutableDirective(S);
|
VisitOMPExecutableDirective(S);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StmtProfiler::VisitOMPScanDirective(const OMPScanDirective *S) {
|
||||||
|
VisitOMPExecutableDirective(S);
|
||||||
|
}
|
||||||
|
|
||||||
void StmtProfiler::VisitOMPOrderedDirective(const OMPOrderedDirective *S) {
|
void StmtProfiler::VisitOMPOrderedDirective(const OMPOrderedDirective *S) {
|
||||||
VisitOMPExecutableDirective(S);
|
VisitOMPExecutableDirective(S);
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,6 +608,18 @@ bool clang::isAllowedClauseForDirective(OpenMPDirectiveKind DKind,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case OMPD_scan:
|
||||||
|
if (OpenMPVersion < 50)
|
||||||
|
return false;
|
||||||
|
switch (CKind) {
|
||||||
|
#define OPENMP_SCAN_CLAUSE(Name) \
|
||||||
|
case OMPC_##Name: \
|
||||||
|
return true;
|
||||||
|
#include "clang/Basic/OpenMPKinds.def"
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
if (OpenMPVersion < 50 &&
|
if (OpenMPVersion < 50 &&
|
||||||
(CKind == OMPC_acq_rel || CKind == OMPC_acquire ||
|
(CKind == OMPC_acq_rel || CKind == OMPC_acquire ||
|
||||||
|
@ -1251,6 +1263,7 @@ void clang::getOpenMPCaptureRegions(
|
||||||
case OMPD_cancel:
|
case OMPD_cancel:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
|
|
@ -6992,6 +6992,7 @@ emitNumTeamsForTargetDirective(CodeGenFunction &CGF,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -7304,6 +7305,7 @@ emitNumThreadsForTargetDirective(CodeGenFunction &CGF,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -9089,6 +9091,7 @@ getNestedDistributeDirective(ASTContext &Ctx, const OMPExecutableDirective &D) {
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -9867,6 +9870,7 @@ void CGOpenMPRuntime::scanForTargetRegionsFunctions(const Stmt *S,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -10508,6 +10512,7 @@ void CGOpenMPRuntime::emitTargetDataStandAloneCall(
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_distribute:
|
case OMPD_distribute:
|
||||||
|
|
|
@ -787,6 +787,7 @@ static bool hasNestedSPMDDirective(ASTContext &Ctx,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -864,6 +865,7 @@ static bool supportsSPMDExecutionMode(ASTContext &Ctx,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -1034,6 +1036,7 @@ static bool hasNestedLightweightDirective(ASTContext &Ctx,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
@ -1117,6 +1120,7 @@ static bool supportsLightweightRuntime(ASTContext &Ctx,
|
||||||
case OMPD_atomic:
|
case OMPD_atomic:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_teams:
|
case OMPD_teams:
|
||||||
case OMPD_target_data:
|
case OMPD_target_data:
|
||||||
case OMPD_target_exit_data:
|
case OMPD_target_exit_data:
|
||||||
|
|
|
@ -250,6 +250,9 @@ void CodeGenFunction::EmitStmt(const Stmt *S, ArrayRef<const Attr *> Attrs) {
|
||||||
case Stmt::OMPDepobjDirectiveClass:
|
case Stmt::OMPDepobjDirectiveClass:
|
||||||
EmitOMPDepobjDirective(cast<OMPDepobjDirective>(*S));
|
EmitOMPDepobjDirective(cast<OMPDepobjDirective>(*S));
|
||||||
break;
|
break;
|
||||||
|
case Stmt::OMPScanDirectiveClass:
|
||||||
|
llvm_unreachable("Scan directive not supported yet.");
|
||||||
|
break;
|
||||||
case Stmt::OMPOrderedDirectiveClass:
|
case Stmt::OMPOrderedDirectiveClass:
|
||||||
EmitOMPOrderedDirective(cast<OMPOrderedDirective>(*S));
|
EmitOMPOrderedDirective(cast<OMPOrderedDirective>(*S));
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1843,6 +1843,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(
|
||||||
case OMPD_taskgroup:
|
case OMPD_taskgroup:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_for:
|
case OMPD_for:
|
||||||
case OMPD_for_simd:
|
case OMPD_for_simd:
|
||||||
case OMPD_sections:
|
case OMPD_sections:
|
||||||
|
@ -2066,6 +2067,7 @@ Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx) {
|
||||||
}
|
}
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_taskyield:
|
case OMPD_taskyield:
|
||||||
case OMPD_barrier:
|
case OMPD_barrier:
|
||||||
case OMPD_taskwait:
|
case OMPD_taskwait:
|
||||||
|
|
|
@ -1439,6 +1439,7 @@ CanThrowResult Sema::canThrow(const Stmt *S) {
|
||||||
case Stmt::OMPDistributeSimdDirectiveClass:
|
case Stmt::OMPDistributeSimdDirectiveClass:
|
||||||
case Stmt::OMPFlushDirectiveClass:
|
case Stmt::OMPFlushDirectiveClass:
|
||||||
case Stmt::OMPDepobjDirectiveClass:
|
case Stmt::OMPDepobjDirectiveClass:
|
||||||
|
case Stmt::OMPScanDirectiveClass:
|
||||||
case Stmt::OMPForDirectiveClass:
|
case Stmt::OMPForDirectiveClass:
|
||||||
case Stmt::OMPForSimdDirectiveClass:
|
case Stmt::OMPForSimdDirectiveClass:
|
||||||
case Stmt::OMPMasterDirectiveClass:
|
case Stmt::OMPMasterDirectiveClass:
|
||||||
|
|
|
@ -3858,6 +3858,7 @@ void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) {
|
||||||
case OMPD_cancel:
|
case OMPD_cancel:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -4202,12 +4203,14 @@ static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack,
|
||||||
ShouldBeInParallelRegion,
|
ShouldBeInParallelRegion,
|
||||||
ShouldBeInOrderedRegion,
|
ShouldBeInOrderedRegion,
|
||||||
ShouldBeInTargetRegion,
|
ShouldBeInTargetRegion,
|
||||||
ShouldBeInTeamsRegion
|
ShouldBeInTeamsRegion,
|
||||||
|
ShouldBeInLoopSimdRegion,
|
||||||
} Recommend = NoRecommend;
|
} Recommend = NoRecommend;
|
||||||
if (isOpenMPSimdDirective(ParentRegion) &&
|
if (isOpenMPSimdDirective(ParentRegion) &&
|
||||||
((SemaRef.LangOpts.OpenMP <= 45 && CurrentRegion != OMPD_ordered) ||
|
((SemaRef.LangOpts.OpenMP <= 45 && CurrentRegion != OMPD_ordered) ||
|
||||||
(SemaRef.LangOpts.OpenMP >= 50 && CurrentRegion != OMPD_ordered &&
|
(SemaRef.LangOpts.OpenMP >= 50 && CurrentRegion != OMPD_ordered &&
|
||||||
CurrentRegion != OMPD_simd && CurrentRegion != OMPD_atomic))) {
|
CurrentRegion != OMPD_simd && CurrentRegion != OMPD_atomic &&
|
||||||
|
CurrentRegion != OMPD_scan))) {
|
||||||
// OpenMP [2.16, Nesting of Regions]
|
// OpenMP [2.16, Nesting of Regions]
|
||||||
// OpenMP constructs may not be nested inside a simd region.
|
// OpenMP constructs may not be nested inside a simd region.
|
||||||
// OpenMP [2.8.1,simd Construct, Restrictions]
|
// OpenMP [2.8.1,simd Construct, Restrictions]
|
||||||
|
@ -4366,6 +4369,16 @@ static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack,
|
||||||
ParentRegion != OMPD_target);
|
ParentRegion != OMPD_target);
|
||||||
OrphanSeen = ParentRegion == OMPD_unknown;
|
OrphanSeen = ParentRegion == OMPD_unknown;
|
||||||
Recommend = ShouldBeInTargetRegion;
|
Recommend = ShouldBeInTargetRegion;
|
||||||
|
} else if (CurrentRegion == OMPD_scan) {
|
||||||
|
// OpenMP [2.16, Nesting of Regions]
|
||||||
|
// If specified, a teams construct must be contained within a target
|
||||||
|
// construct.
|
||||||
|
NestingProhibited =
|
||||||
|
SemaRef.LangOpts.OpenMP < 50 ||
|
||||||
|
(ParentRegion != OMPD_simd && ParentRegion != OMPD_for &&
|
||||||
|
ParentRegion != OMPD_for_simd);
|
||||||
|
OrphanSeen = ParentRegion == OMPD_unknown;
|
||||||
|
Recommend = ShouldBeInLoopSimdRegion;
|
||||||
}
|
}
|
||||||
if (!NestingProhibited &&
|
if (!NestingProhibited &&
|
||||||
!isOpenMPTargetExecutionDirective(CurrentRegion) &&
|
!isOpenMPTargetExecutionDirective(CurrentRegion) &&
|
||||||
|
@ -4874,6 +4887,11 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
||||||
"No associated statement allowed for 'omp depobj' directive");
|
"No associated statement allowed for 'omp depobj' directive");
|
||||||
Res = ActOnOpenMPDepobjDirective(ClausesWithImplicit, StartLoc, EndLoc);
|
Res = ActOnOpenMPDepobjDirective(ClausesWithImplicit, StartLoc, EndLoc);
|
||||||
break;
|
break;
|
||||||
|
case OMPD_scan:
|
||||||
|
assert(AStmt == nullptr &&
|
||||||
|
"No associated statement allowed for 'omp scan' directive");
|
||||||
|
Res = ActOnOpenMPScanDirective(ClausesWithImplicit, StartLoc, EndLoc);
|
||||||
|
break;
|
||||||
case OMPD_ordered:
|
case OMPD_ordered:
|
||||||
Res = ActOnOpenMPOrderedDirective(ClausesWithImplicit, AStmt, StartLoc,
|
Res = ActOnOpenMPOrderedDirective(ClausesWithImplicit, AStmt, StartLoc,
|
||||||
EndLoc);
|
EndLoc);
|
||||||
|
@ -8773,6 +8791,12 @@ StmtResult Sema::ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
return OMPDepobjDirective::Create(Context, StartLoc, EndLoc, Clauses);
|
return OMPDepobjDirective::Create(Context, StartLoc, EndLoc, Clauses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StmtResult Sema::ActOnOpenMPScanDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
|
SourceLocation StartLoc,
|
||||||
|
SourceLocation EndLoc) {
|
||||||
|
return OMPScanDirective::Create(Context, StartLoc, EndLoc, Clauses);
|
||||||
|
}
|
||||||
|
|
||||||
StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
|
StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
|
||||||
Stmt *AStmt,
|
Stmt *AStmt,
|
||||||
SourceLocation StartLoc,
|
SourceLocation StartLoc,
|
||||||
|
@ -11251,6 +11275,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11322,6 +11347,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11398,6 +11424,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11471,6 +11498,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11545,6 +11573,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11618,6 +11647,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11690,6 +11720,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
@ -11765,6 +11796,7 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPD_cancellation_point:
|
case OMPD_cancellation_point:
|
||||||
case OMPD_flush:
|
case OMPD_flush:
|
||||||
case OMPD_depobj:
|
case OMPD_depobj:
|
||||||
|
case OMPD_scan:
|
||||||
case OMPD_declare_reduction:
|
case OMPD_declare_reduction:
|
||||||
case OMPD_declare_mapper:
|
case OMPD_declare_mapper:
|
||||||
case OMPD_declare_simd:
|
case OMPD_declare_simd:
|
||||||
|
|
|
@ -8303,6 +8303,17 @@ TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Derived>
|
||||||
|
StmtResult
|
||||||
|
TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
|
||||||
|
DeclarationNameInfo DirName;
|
||||||
|
getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
|
||||||
|
D->getBeginLoc());
|
||||||
|
StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
|
||||||
|
getDerived().getSema().EndOpenMPDSABlock(Res.get());
|
||||||
|
return Res;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Derived>
|
template <typename Derived>
|
||||||
StmtResult
|
StmtResult
|
||||||
TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
|
TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
|
||||||
|
|
|
@ -2377,6 +2377,13 @@ void ASTStmtReader::VisitOMPDepobjDirective(OMPDepobjDirective *D) {
|
||||||
VisitOMPExecutableDirective(D);
|
VisitOMPExecutableDirective(D);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTStmtReader::VisitOMPScanDirective(OMPScanDirective *D) {
|
||||||
|
VisitStmt(D);
|
||||||
|
// The NumClauses field was read in ReadStmtFromStream.
|
||||||
|
Record.skipInts(1);
|
||||||
|
VisitOMPExecutableDirective(D);
|
||||||
|
}
|
||||||
|
|
||||||
void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
|
void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
|
||||||
VisitStmt(D);
|
VisitStmt(D);
|
||||||
// The NumClauses field was read in ReadStmtFromStream.
|
// The NumClauses field was read in ReadStmtFromStream.
|
||||||
|
@ -3213,6 +3220,11 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||||
Context, Record[ASTStmtReader::NumStmtFields], Empty);
|
Context, Record[ASTStmtReader::NumStmtFields], Empty);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case STMT_OMP_SCAN_DIRECTIVE:
|
||||||
|
S = OMPScanDirective::CreateEmpty(
|
||||||
|
Context, Record[ASTStmtReader::NumStmtFields], Empty);
|
||||||
|
break;
|
||||||
|
|
||||||
case STMT_OMP_ORDERED_DIRECTIVE:
|
case STMT_OMP_ORDERED_DIRECTIVE:
|
||||||
S = OMPOrderedDirective::CreateEmpty(
|
S = OMPOrderedDirective::CreateEmpty(
|
||||||
Context, Record[ASTStmtReader::NumStmtFields], Empty);
|
Context, Record[ASTStmtReader::NumStmtFields], Empty);
|
||||||
|
|
|
@ -2330,6 +2330,13 @@ void ASTStmtWriter::VisitOMPDepobjDirective(OMPDepobjDirective *D) {
|
||||||
Code = serialization::STMT_OMP_DEPOBJ_DIRECTIVE;
|
Code = serialization::STMT_OMP_DEPOBJ_DIRECTIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTStmtWriter::VisitOMPScanDirective(OMPScanDirective *D) {
|
||||||
|
VisitStmt(D);
|
||||||
|
Record.push_back(D->getNumClauses());
|
||||||
|
VisitOMPExecutableDirective(D);
|
||||||
|
Code = serialization::STMT_OMP_SCAN_DIRECTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
|
void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
|
||||||
VisitStmt(D);
|
VisitStmt(D);
|
||||||
Record.push_back(D->getNumClauses());
|
Record.push_back(D->getNumClauses());
|
||||||
|
|
|
@ -1258,6 +1258,7 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
||||||
case Stmt::OMPTaskgroupDirectiveClass:
|
case Stmt::OMPTaskgroupDirectiveClass:
|
||||||
case Stmt::OMPFlushDirectiveClass:
|
case Stmt::OMPFlushDirectiveClass:
|
||||||
case Stmt::OMPDepobjDirectiveClass:
|
case Stmt::OMPDepobjDirectiveClass:
|
||||||
|
case Stmt::OMPScanDirectiveClass:
|
||||||
case Stmt::OMPOrderedDirectiveClass:
|
case Stmt::OMPOrderedDirectiveClass:
|
||||||
case Stmt::OMPAtomicDirectiveClass:
|
case Stmt::OMPAtomicDirectiveClass:
|
||||||
case Stmt::OMPTargetDirectiveClass:
|
case Stmt::OMPTargetDirectiveClass:
|
||||||
|
|
|
@ -84,6 +84,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -230,7 +235,7 @@ void foo() {
|
||||||
// SIMD DIRECTIVE
|
// SIMD DIRECTIVE
|
||||||
#pragma omp simd
|
#pragma omp simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{OpenMP constructs may not be nested inside a simd region except for ordered simd, simd, scan, or atomic directive}}
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -332,6 +337,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp simd
|
#pragma omp simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -608,6 +618,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp for
|
#pragma omp for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -861,6 +876,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp for simd
|
#pragma omp for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-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 taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -1152,6 +1172,10 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp sections
|
#pragma omp sections
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'sections' region}}
|
||||||
|
}
|
||||||
|
#pragma omp sections
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
}
|
}
|
||||||
#pragma omp sections
|
#pragma omp sections
|
||||||
|
@ -1455,6 +1479,14 @@ void foo() {
|
||||||
{
|
{
|
||||||
#pragma omp section
|
#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
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -1755,6 +1787,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp single
|
#pragma omp single
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'single' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp single
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -2030,6 +2067,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp master
|
#pragma omp master
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'master' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp master
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -2292,6 +2334,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp critical
|
#pragma omp critical
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'critical' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp critical
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -2571,6 +2618,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -2840,6 +2892,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel for simd
|
#pragma omp parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#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}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -3120,6 +3177,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel master
|
#pragma omp parallel master
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel master' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp parallel master
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -3383,6 +3445,10 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel sections
|
#pragma omp parallel sections
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
|
||||||
|
}
|
||||||
|
#pragma omp parallel sections
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
}
|
}
|
||||||
#pragma omp parallel sections
|
#pragma omp parallel sections
|
||||||
|
@ -3585,6 +3651,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp task
|
#pragma omp task
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'task' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -3848,6 +3919,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp ordered
|
#pragma omp ordered
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'ordered' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp ordered
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -4142,6 +4218,13 @@ void foo() {
|
||||||
// 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 l-value expression with scalar type}}
|
// 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 l-value expression with scalar type}}
|
||||||
// expected-note@+1 {{expected an expression statement}}
|
// expected-note@+1 {{expected an expression statement}}
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // 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 l-value expression with scalar type}}
|
||||||
|
// expected-note@+1 {{expected an expression statement}}
|
||||||
|
{
|
||||||
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -4406,6 +4489,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -4640,6 +4728,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target parallel
|
#pragma omp target parallel
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target parallel' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target parallel
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -4906,6 +4999,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target parallel for
|
#pragma omp target parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // 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 taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -5140,6 +5238,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
{
|
{
|
||||||
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
||||||
|
@ -5439,6 +5543,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp taskloop
|
#pragma omp taskloop
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'taskloop' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp taskloop
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -5761,6 +5870,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute
|
#pragma omp distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
|
@ -6073,6 +6189,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'distribute parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for
|
#pragma omp distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
|
@ -6385,6 +6508,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute 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 {{region cannot be closely nested inside 'distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for simd
|
#pragma omp distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -6669,6 +6799,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target simd
|
#pragma omp target simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -6912,6 +7047,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute
|
#pragma omp teams distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
|
@ -7175,6 +7316,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute
|
#pragma omp teams distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
|
@ -7458,6 +7605,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute 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 {{region cannot be closely nested inside 'teams distribute simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd
|
#pragma omp teams distribute simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -7741,6 +7894,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute 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 {{region cannot be closely nested inside 'teams distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd
|
#pragma omp teams distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -8024,6 +8183,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams distribute parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for
|
#pragma omp teams distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
|
@ -8237,6 +8402,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams
|
#pragma omp target teams
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams
|
||||||
|
{
|
||||||
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -8511,6 +8681,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute
|
#pragma omp target teams distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target teams distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -8754,6 +8929,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute parallel for
|
#pragma omp target teams distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // 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 taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -8997,6 +9177,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute parallel for simd
|
#pragma omp target teams distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target teams distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute 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}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -9240,6 +9425,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute simd
|
#pragma omp target teams distribute simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target teams distribute simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -9433,6 +9623,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -9666,6 +9861,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp simd
|
#pragma omp simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -9916,6 +10116,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp for
|
#pragma omp for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{region cannot be closely nested inside 'for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -10156,6 +10361,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp for simd
|
#pragma omp for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-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 taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -10405,6 +10615,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp sections
|
#pragma omp sections
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'sections' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp sections
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
}
|
}
|
||||||
#pragma omp sections
|
#pragma omp sections
|
||||||
|
@ -10698,6 +10913,14 @@ void foo() {
|
||||||
{
|
{
|
||||||
#pragma omp section
|
#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
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -10991,6 +11214,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp single
|
#pragma omp single
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'single' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp single
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -11258,6 +11486,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp master
|
#pragma omp master
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'master' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp master
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -11513,6 +11746,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp critical
|
#pragma omp critical
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'critical' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp critical
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -11797,6 +12035,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel for
|
#pragma omp parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -12067,6 +12310,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel for simd
|
#pragma omp parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#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}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -12331,6 +12579,10 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp parallel sections
|
#pragma omp parallel sections
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'parallel sections' region}}
|
||||||
|
}
|
||||||
|
#pragma omp parallel sections
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
}
|
}
|
||||||
#pragma omp parallel sections
|
#pragma omp parallel sections
|
||||||
|
@ -12532,6 +12784,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp task
|
#pragma omp task
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'task' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp task
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -12804,6 +13061,13 @@ void foo() {
|
||||||
// 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 l-value expression with scalar type}}
|
// 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 l-value expression with scalar type}}
|
||||||
// expected-note@+1 {{expected an expression statement}}
|
// expected-note@+1 {{expected an expression statement}}
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // 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 l-value expression with scalar type}}
|
||||||
|
// expected-note@+1 {{expected an expression statement}}
|
||||||
|
{
|
||||||
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside an atomic region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -13067,6 +13331,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -13292,6 +13561,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target parallel
|
#pragma omp target parallel
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target parallel' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target parallel
|
||||||
|
{
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -13558,6 +13832,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target parallel for
|
#pragma omp target parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // 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 taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -13791,6 +14070,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
{
|
{
|
||||||
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
||||||
|
@ -14094,6 +14379,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp taskloop
|
#pragma omp taskloop
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'taskloop' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp taskloop
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -14386,6 +14676,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute
|
#pragma omp distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
|
@ -14708,6 +15005,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'distribute parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for
|
#pragma omp distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait
|
#pragma omp taskwait
|
||||||
|
@ -15028,6 +15332,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute 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 {{region cannot be closely nested inside 'distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute parallel for simd
|
#pragma omp distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -15340,6 +15651,13 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
#pragma omp teams
|
#pragma omp teams
|
||||||
|
#pragma omp distribute 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 {{region cannot be closely nested inside 'distribute simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
|
#pragma omp teams
|
||||||
#pragma omp distribute simd
|
#pragma omp distribute simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -15616,6 +15934,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target simd
|
#pragma omp target simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -15870,6 +16193,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute
|
#pragma omp teams distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
|
@ -16153,6 +16482,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute 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 {{region cannot be closely nested inside 'teams distribute simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute simd
|
#pragma omp teams distribute simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -16436,6 +16771,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute 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 {{region cannot be closely nested inside 'teams distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for simd
|
#pragma omp teams distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
|
@ -16719,6 +17060,12 @@ void foo() {
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
#pragma omp target
|
#pragma omp target
|
||||||
|
#pragma omp teams distribute parallel for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'teams distribute parallel for' region}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target
|
||||||
#pragma omp teams distribute parallel for
|
#pragma omp teams distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
|
@ -16932,6 +17279,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams
|
#pragma omp target teams
|
||||||
{
|
{
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams
|
||||||
|
{
|
||||||
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
#pragma omp taskwait // expected-error {{region cannot be closely nested inside 'target teams' region; perhaps you forget to enclose 'omp taskwait' directive into a parallel region?}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -17206,6 +17558,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute
|
#pragma omp target teams distribute
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // expected-error {{region cannot be closely nested inside 'target teams distribute' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
#pragma omp taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -17449,6 +17806,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute parallel for
|
#pragma omp target teams distribute parallel for
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // 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 taskwait // OK
|
#pragma omp taskwait // OK
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -17692,6 +18054,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute parallel for simd
|
#pragma omp target teams distribute parallel for simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target teams distribute parallel for simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute 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}}
|
#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -17935,6 +18302,11 @@ void foo() {
|
||||||
}
|
}
|
||||||
#pragma omp target teams distribute simd
|
#pragma omp target teams distribute simd
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan // omp45-error {{OpenMP constructs may not be nested inside a simd region}} omp50-error {{region cannot be closely nested inside 'target teams distribute simd' region; perhaps you forget to enclose 'omp scan' directive into a for, simd, or for simd region?}}
|
||||||
|
bar();
|
||||||
|
}
|
||||||
|
#pragma omp target teams distribute simd
|
||||||
|
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 // expected-error {{OpenMP constructs may not be nested inside a simd region}}
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s
|
||||||
|
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||||
|
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
|
||||||
|
|
||||||
|
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s
|
||||||
|
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
|
||||||
|
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
|
||||||
|
// expected-no-diagnostics
|
||||||
|
|
||||||
|
#ifndef HEADER
|
||||||
|
#define HEADER
|
||||||
|
|
||||||
|
void foo() {}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T tmain(T argc) {
|
||||||
|
static T a;
|
||||||
|
#pragma omp for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
return a + argc;
|
||||||
|
}
|
||||||
|
// CHECK: static T a;
|
||||||
|
// CHECK-NEXT: #pragma omp for
|
||||||
|
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
|
||||||
|
// CHECK-NEXT: #pragma omp scan{{$}}
|
||||||
|
// CHECK: static int a;
|
||||||
|
// CHECK-NEXT: #pragma omp for
|
||||||
|
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
|
||||||
|
// CHECK-NEXT: #pragma omp scan
|
||||||
|
// CHECK: static char a;
|
||||||
|
// CHECK-NEXT: #pragma omp for
|
||||||
|
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
|
||||||
|
// CHECK-NEXT: #pragma omp scan
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
static int a;
|
||||||
|
// CHECK: static int a;
|
||||||
|
#pragma omp for simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
// CHECK-NEXT: #pragma omp for simd
|
||||||
|
// CHECK-NEXT: for (int i = 0; i < 10; ++i) {
|
||||||
|
// CHECK-NEXT: #pragma omp scan{{$}}
|
||||||
|
return tmain(argc) + tmain(argv[0][0]) + a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,164 @@
|
||||||
|
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ferror-limit 100 %s
|
||||||
|
|
||||||
|
// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 %s
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T tmain(T argc) {
|
||||||
|
#pragma omp for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan
|
||||||
|
;
|
||||||
|
}
|
||||||
|
#pragma omp for
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan allocate(argc) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp scan'}}
|
||||||
|
#pragma omp scan untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp scan'}}
|
||||||
|
#pragma omp scan unknown // expected-warning {{extra tokens at the end of '#pragma omp scan' are ignored}}
|
||||||
|
}
|
||||||
|
#pragma omp for simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
if (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
if (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
while (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
while (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
do
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
while (argc)
|
||||||
|
;
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
do {
|
||||||
|
#pragma omp scan
|
||||||
|
} while (argc);
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
switch (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
switch (argc)
|
||||||
|
case 1:
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
switch (argc)
|
||||||
|
case 1: {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
switch (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
case 1:
|
||||||
|
#pragma omp scan
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
#pragma omp scan
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
for (;;)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
for (;;) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
label:
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
label1 : {
|
||||||
|
#pragma omp scan
|
||||||
|
}}
|
||||||
|
|
||||||
|
return T();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan
|
||||||
|
;
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
#pragma omp scan untied // expected-error {{unexpected OpenMP clause 'untied' in directive '#pragma omp scan'}}
|
||||||
|
#pragma omp scan unknown // expected-warning {{extra tokens at the end of '#pragma omp scan' are ignored}}
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
if (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
if (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
while (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
while (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
do
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
while (argc)
|
||||||
|
;
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
do {
|
||||||
|
#pragma omp scan
|
||||||
|
} while (argc);
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
switch (argc)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
switch (argc)
|
||||||
|
case 1:
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
switch (argc)
|
||||||
|
case 1: {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
switch (argc) {
|
||||||
|
#pragma omp scan
|
||||||
|
case 1:
|
||||||
|
#pragma omp scan
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
#pragma omp scan
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
for (;;)
|
||||||
|
#pragma omp scan // expected-error {{'#pragma omp scan' cannot be an immediate substatement}}
|
||||||
|
for (;;) {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
label:
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
#pragma omp simd
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
label1 : {
|
||||||
|
#pragma omp scan
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmain(argc);
|
||||||
|
}
|
|
@ -2048,6 +2048,7 @@ public:
|
||||||
void VisitOMPCancelDirective(const OMPCancelDirective *D);
|
void VisitOMPCancelDirective(const OMPCancelDirective *D);
|
||||||
void VisitOMPFlushDirective(const OMPFlushDirective *D);
|
void VisitOMPFlushDirective(const OMPFlushDirective *D);
|
||||||
void VisitOMPDepobjDirective(const OMPDepobjDirective *D);
|
void VisitOMPDepobjDirective(const OMPDepobjDirective *D);
|
||||||
|
void VisitOMPScanDirective(const OMPScanDirective *D);
|
||||||
void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
|
void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
|
||||||
void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
|
void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
|
||||||
void VisitOMPTargetDirective(const OMPTargetDirective *D);
|
void VisitOMPTargetDirective(const OMPTargetDirective *D);
|
||||||
|
@ -2885,6 +2886,10 @@ void EnqueueVisitor::VisitOMPDepobjDirective(const OMPDepobjDirective *D) {
|
||||||
VisitOMPExecutableDirective(D);
|
VisitOMPExecutableDirective(D);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnqueueVisitor::VisitOMPScanDirective(const OMPScanDirective *D) {
|
||||||
|
VisitOMPExecutableDirective(D);
|
||||||
|
}
|
||||||
|
|
||||||
void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
|
void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
|
||||||
VisitOMPExecutableDirective(D);
|
VisitOMPExecutableDirective(D);
|
||||||
}
|
}
|
||||||
|
@ -5519,6 +5524,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
|
||||||
return cxstring::createRef("OMPFlushDirective");
|
return cxstring::createRef("OMPFlushDirective");
|
||||||
case CXCursor_OMPDepobjDirective:
|
case CXCursor_OMPDepobjDirective:
|
||||||
return cxstring::createRef("OMPDepobjDirective");
|
return cxstring::createRef("OMPDepobjDirective");
|
||||||
|
case CXCursor_OMPScanDirective:
|
||||||
|
return cxstring::createRef("OMPScanDirective");
|
||||||
case CXCursor_OMPOrderedDirective:
|
case CXCursor_OMPOrderedDirective:
|
||||||
return cxstring::createRef("OMPOrderedDirective");
|
return cxstring::createRef("OMPOrderedDirective");
|
||||||
case CXCursor_OMPAtomicDirective:
|
case CXCursor_OMPAtomicDirective:
|
||||||
|
|
|
@ -638,6 +638,9 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
|
||||||
case Stmt::OMPDepobjDirectiveClass:
|
case Stmt::OMPDepobjDirectiveClass:
|
||||||
K = CXCursor_OMPDepobjDirective;
|
K = CXCursor_OMPDepobjDirective;
|
||||||
break;
|
break;
|
||||||
|
case Stmt::OMPScanDirectiveClass:
|
||||||
|
K = CXCursor_OMPScanDirective;
|
||||||
|
break;
|
||||||
case Stmt::OMPOrderedDirectiveClass:
|
case Stmt::OMPOrderedDirectiveClass:
|
||||||
K = CXCursor_OMPOrderedDirective;
|
K = CXCursor_OMPOrderedDirective;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -92,6 +92,7 @@ __OMP_DIRECTIVE_EXT(master_taskloop_simd, "master taskloop simd")
|
||||||
__OMP_DIRECTIVE_EXT(parallel_master_taskloop_simd,
|
__OMP_DIRECTIVE_EXT(parallel_master_taskloop_simd,
|
||||||
"parallel master taskloop simd")
|
"parallel master taskloop simd")
|
||||||
__OMP_DIRECTIVE(depobj)
|
__OMP_DIRECTIVE(depobj)
|
||||||
|
__OMP_DIRECTIVE(scan)
|
||||||
|
|
||||||
// Has to be the last because Clang implicitly expects it to be.
|
// Has to be the last because Clang implicitly expects it to be.
|
||||||
__OMP_DIRECTIVE(unknown)
|
__OMP_DIRECTIVE(unknown)
|
||||||
|
|
Loading…
Reference in New Issue