<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jul 4, 2016 at 10:00 PM, Kelvin Li via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kli<br>
Date: Tue Jul 5 00:00:15 2016<br>
New Revision: 274530<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=274530&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=274530&view=rev</a><br>
Log:<br>
[OpenMP] Sema and parse for 'distribute parallel for simd'<br>
<br>
Summary: This patch is an implementation of sema and parsing for the OpenMP composite pragma 'distribute parallel for simd'.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D21977" rel="noreferrer" target="_blank">http://reviews.llvm.org/D21977</a><br>
<br>
<br>
Added:<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>aligned_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>ast_print.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>collapse_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>copyin_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>default_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>dist_schedule_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>firstprivate_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>if_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>lastprivate_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>linear_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>num_threads_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>private_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>proc_bind_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>reduction_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>safelen_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>schedule_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>shared_messages.cpp<br>
cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>simdlen_messages.cpp<br>
Modified:<br>
cfe/trunk/include/clang-c/<wbr>Index.h<br>
cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br>
cfe/trunk/include/clang/AST/<wbr>StmtOpenMP.h<br>
cfe/trunk/include/clang/Basic/<wbr>OpenMPKinds.def<br>
cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td<br>
cfe/trunk/include/clang/Sema/<wbr>Sema.h<br>
cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br>
cfe/trunk/lib/AST/StmtOpenMP.<wbr>cpp<br>
cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp<br>
cfe/trunk/lib/AST/StmtProfile.<wbr>cpp<br>
cfe/trunk/lib/Basic/<wbr>OpenMPKinds.cpp<br>
cfe/trunk/lib/CodeGen/CGStmt.<wbr>cpp<br>
cfe/trunk/lib/CodeGen/<wbr>CGStmtOpenMP.cpp<br>
cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
cfe/trunk/lib/Parse/<wbr>ParseOpenMP.cpp<br>
cfe/trunk/lib/Sema/SemaOpenMP.<wbr>cpp<br>
cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp<br>
cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp<br>
cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp<br>
cfe/trunk/test/OpenMP/nesting_<wbr>of_regions.cpp<br>
cfe/trunk/tools/libclang/<wbr>CIndex.cpp<br>
cfe/trunk/tools/libclang/<wbr>CXCursor.cpp<br>
<br>
Modified: cfe/trunk/include/clang-c/<wbr>Index.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang-c/Index.h?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang-c/<wbr>Index.h (original)<br>
+++ cfe/trunk/include/clang-c/<wbr>Index.h Tue Jul 5 00:00:15 2016<br>
@@ -326,7 +326,7 @@ clang_<wbr>isFileMultipleIncludeGuarded(<wbr>CXTra<br>
*<br>
* \param tu the translation unit<br>
*<br>
- * \param file_name the name of the file.<br>
+* \param file_name the name of the file.<br>
*<br>
* \returns the file handle for the named file in the translation unit \p tu,<br>
* or a NULL file handle if the file was not a part of this translation unit.<br>
@@ -2309,7 +2309,11 @@ enum CXCursorKind {<br>
*/<br>
CXCursor_<wbr>OMPDistributeParallelForDirect<wbr>ive = 266,<br>
<br>
- CXCursor_LastStmt = CXCursor_<wbr>OMPDistributeParallelForDirect<wbr>ive,<br>
+ /** \brief OpenMP distribute parallel for simd directive.<br>
+ */<br>
+ CXCursor_<wbr>OMPDistributeParallelForSimdDi<wbr>rective = 267,<br>
+<br>
+ CXCursor_LastStmt = CXCursor_<wbr>OMPDistributeParallelForSimdDi<wbr>rective,<br>
<br>
/**<br>
* \brief Cursor that represents the translation unit itself.<br>
<br>
Modified: cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/RecursiveASTVisitor.<wbr>h?rev=274530&r1=274529&r2=<wbr>274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h (original)<br>
+++ cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h Tue Jul 5 00:00:15 2016<br>
@@ -2518,6 +2518,9 @@ DEF_TRAVERSE_STMT(<wbr>OMPDistributeDirective<br>
DEF_TRAVERSE_STMT(<wbr>OMPDistributeParallelForDirect<wbr>ive,<br>
{ TRY_TO(<wbr>TraverseOMPExecutableDirective<wbr>(S)); })<br>
<br>
+DEF_TRAVERSE_STMT(<wbr>OMPDistributeParallelForSimdDi<wbr>rective,<br>
+ { TRY_TO(<wbr>TraverseOMPExecutableDirective<wbr>(S)); })<br>
+<br>
// OpenMP clauses.<br>
template <typename Derived><br>
bool RecursiveASTVisitor<Derived>::<wbr>TraverseOMPClause(OMPClause *C) {<br>
<br>
Modified: cfe/trunk/include/clang/AST/<wbr>StmtOpenMP.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/StmtOpenMP.h?rev=<wbr>274530&r1=274529&r2=274530&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/AST/<wbr>StmtOpenMP.h (original)<br>
+++ cfe/trunk/include/clang/AST/<wbr>StmtOpenMP.h Tue Jul 5 00:00:15 2016<br>
@@ -770,7 +770,8 @@ public:<br>
T->getStmtClass() == OMPTaskLoopSimdDirectiveClass ||<br>
T->getStmtClass() == OMPDistributeDirectiveClass ||<br>
T->getStmtClass() == OMPTargetParallelForDirectiveC<wbr>lass ||<br>
- T->getStmtClass() == OMPDistributeParallelForDirect<wbr>iveClass;<br>
+ T->getStmtClass() == OMPDistributeParallelForDirect<wbr>iveClass ||<br>
+ T->getStmtClass() == OMPDistributeParallelForSimdDi<wbr>rectiveClass;<br>
}<br>
};<br>
<br>
@@ -2881,6 +2882,77 @@ public:<br>
return T->getStmtClass() == OMPDistributeParallelForDirect<wbr>iveClass;<br>
}<br>
};<br>
+<br>
+/// This represents '#pragma omp distribute parallel for simd' composite<br>
+/// directive.<br>
+///<br>
+/// \code<br>
+/// #pragma omp distribute parallel for simd private(x)<br>
+/// \endcode<br>
+/// In this example directive '#pragma omp distribute parallel for simd' has<br>
+/// clause 'private' with the variables 'x'<br>
+///<br>
+class OMPDistributeParallelForSimdDi<wbr>rective final : public OMPLoopDirective {<br>
+ friend class ASTStmtReader;<br>
+<br>
+ /// Build directive with the given start and end location.<br>
+ ///<br>
+ /// \param StartLoc Starting location of the directive kind.<br>
+ /// \param EndLoc Ending location of the directive.<br>
+ /// \param CollapsedNum Number of collapsed nested loops.<br>
+ /// \param NumClauses Number of clauses.<br>
+ ///<br>
+ OMPDistributeParallelForSimdDi<wbr>rective(SourceLocation StartLoc,<br>
+ SourceLocation EndLoc,<br>
+ unsigned CollapsedNum,<br>
+ unsigned NumClauses)<br>
+ : OMPLoopDirective(this, OMPDistributeParallelForSimdDi<wbr>rectiveClass,<br>
+ OMPD_distribute_parallel_for_<wbr>simd, StartLoc,<br>
+ EndLoc, CollapsedNum, NumClauses) {}<br>
+<br>
+ /// Build an empty directive.<br>
+ ///<br>
+ /// \param CollapsedNum Number of collapsed nested loops.<br>
+ /// \param NumClauses Number of clauses.<br>
+ ///<br>
+ explicit OMPDistributeParallelForSimdDi<wbr>rective(unsigned CollapsedNum,<br>
+ unsigned NumClauses)<br>
+ : OMPLoopDirective(this, OMPDistributeParallelForSimdDi<wbr>rectiveClass,<br>
+ OMPD_distribute_parallel_for_<wbr>simd,<br>
+ SourceLocation(), SourceLocation(), CollapsedNum,<br>
+ NumClauses) {}<br>
+<br>
+public:<br>
+ /// Creates directive with a list of \a Clauses.<br>
+ ///<br>
+ /// \param C AST context.<br>
+ /// \param StartLoc Starting location of the directive kind.<br>
+ /// \param EndLoc Ending Location of the directive.<br>
+ /// \param CollapsedNum Number of collapsed loops.<br>
+ /// \param Clauses List of clauses.<br>
+ /// \param AssociatedStmt Statement, associated with the directive.<br>
+ /// \param Exprs Helper expressions for CodeGen.<br>
+ ///<br>
+ static OMPDistributeParallelForSimdDi<wbr>rective *Create(<br>
+ const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,<br>
+ unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,<br>
+ Stmt *AssociatedStmt, const HelperExprs &Exprs);<br>
+<br>
+ /// Creates an empty directive with the place for \a NumClauses clauses.<br>
+ ///<br>
+ /// \param C AST context.<br>
+ /// \param CollapsedNum Number of collapsed nested loops.<br>
+ /// \param NumClauses Number of clauses.<br>
+ ///<br>
+ static OMPDistributeParallelForSimdDi<wbr>rective *CreateEmpty(<br>
+ const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,<br>
+ EmptyShell);<br>
+<br>
+ static bool classof(const Stmt *T) {<br>
+ return T->getStmtClass() == OMPDistributeParallelForSimdDi<wbr>rectiveClass;<br>
+ }<br>
+};<br>
+<br>
} // end namespace clang<br>
<br>
#endif<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>OpenMPKinds.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/OpenMPKinds.def?<wbr>rev=274530&r1=274529&r2=<wbr>274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>OpenMPKinds.def (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>OpenMPKinds.def Tue Jul 5 00:00:15 2016<br>
@@ -129,6 +129,9 @@<br>
#ifndef OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE<br>
#define OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE(Name)<br>
#endif<br>
+#ifndef OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE<br>
+#define OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(Name)<br>
+#endif<br>
<br>
// OpenMP directives.<br>
OPENMP_DIRECTIVE(<wbr>threadprivate)<br>
@@ -170,6 +173,7 @@ OPENMP_DIRECTIVE(distribute)<br>
OPENMP_DIRECTIVE_EXT(declare_<wbr>target, "declare target")<br>
OPENMP_DIRECTIVE_EXT(end_<wbr>declare_target, "end declare target")<br>
OPENMP_DIRECTIVE_EXT(<wbr>distribute_parallel_for, "distribute parallel for")<br>
+OPENMP_DIRECTIVE_EXT(<wbr>distribute_parallel_for_simd, "distribute parallel for simd")<br>
<br>
// OpenMP clauses.<br>
OPENMP_CLAUSE(if, OMPIfClause)<br>
@@ -550,6 +554,25 @@ OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE(re<br>
OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE(copyin)<br>
OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE(schedule)<br>
<br>
+// Clauses allowed for OpenMP directive 'distribute parallel for simd'<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(firstprivate)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(lastprivate)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(collapse)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(dist_schedule)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(if)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(num_threads)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(default)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(proc_bind)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(private)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(shared)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(reduction)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(copyin)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(schedule)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(linear)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(aligned)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(safelen)<br>
+OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(simdlen)<br>
+<br>
#undef OPENMP_TASKLOOP_SIMD_CLAUSE<br>
#undef OPENMP_TASKLOOP_CLAUSE<br>
#undef OPENMP_LINEAR_KIND<br>
@@ -589,3 +612,4 @@ OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE(sc<br>
#undef OPENMP_DEFAULTMAP_MODIFIER<br>
#undef OPENMP_TARGET_UPDATE_CLAUSE<br>
#undef OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_CLAUSE<br>
+#undef OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/StmtNodes.td?rev=<wbr>274530&r1=274529&r2=274530&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>StmtNodes.td Tue Jul 5 00:00:15 2016<br>
@@ -229,3 +229,4 @@ def OMPTaskLoopDirective : DStmt<OMPLoop<br>
def OMPTaskLoopSimdDirective : DStmt<OMPLoopDirective>;<br>
def OMPDistributeDirective : DStmt<OMPLoopDirective>;<br>
def OMPDistributeParallelForDirect<wbr>ive : DStmt<OMPLoopDirective>;<br>
+def OMPDistributeParallelForSimdDi<wbr>rective : DStmt<OMPLoopDirective>;<br>
<br>
Modified: cfe/trunk/include/clang/Sema/<wbr>Sema.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Sema/Sema.h?rev=274530&<wbr>r1=274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Sema/<wbr>Sema.h (original)<br>
+++ cfe/trunk/include/clang/Sema/<wbr>Sema.h Tue Jul 5 00:00:15 2016<br>
@@ -8206,6 +8206,12 @@ public:<br>
ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,<br>
SourceLocation EndLoc,<br>
llvm::DenseMap<ValueDecl *, Expr *> &VarsWithImplicitDSA);<br>
+ /// \brief Called on well-formed '\#pragma omp distribute parallel for simd'<br>
+ /// after parsing of the associated statement.<br>
+ StmtResult ActOnOpenMPDistributeParallelF<wbr>orSimdDirective(<br>
+ ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,<br>
+ SourceLocation EndLoc,<br>
+ llvm::DenseMap<ValueDecl *, Expr *> &VarsWithImplicitDSA);<br>
<br>
/// Checks correctness of linear modifiers.<br>
bool CheckOpenMPLinearModifier(<wbr>OpenMPLinearClauseKind LinKind,<br>
<br>
Modified: cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Serialization/<wbr>ASTBitCodes.h?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h (original)<br>
+++ cfe/trunk/include/clang/<wbr>Serialization/ASTBitCodes.h Tue Jul 5 00:00:15 2016<br>
@@ -1476,6 +1476,7 @@ namespace clang {<br>
STMT_OMP_DISTRIBUTE_DIRECTIVE,<br>
STMT_OMP_TARGET_UPDATE_<wbr>DIRECTIVE,<br>
STMT_OMP_DISTRIBUTE_PARALLEL_<wbr>FOR_DIRECTIVE,<br>
+ STMT_OMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_DIRECTIVE,<br>
EXPR_OMP_ARRAY_SECTION,<br>
<br>
// ARC<br>
<br>
Modified: cfe/trunk/lib/AST/StmtOpenMP.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtOpenMP.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>StmtOpenMP.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/StmtOpenMP.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/AST/StmtOpenMP.<wbr>cpp Tue Jul 5 00:00:15 2016<br>
@@ -1105,3 +1105,60 @@ OMPDistributeParallelForDirect<wbr>ive::Creat<br>
numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for))<wbr>;<br>
return new (Mem) OMPDistributeParallelForDirect<wbr>ive(CollapsedNum, NumClauses);<br>
}<br>
+<br>
+<wbr>OMPDistributeParallelForSimdDi<wbr>rective *<br>
+<wbr>OMPDistributeParallelForSimdDi<wbr>rective::Create(<br>
+ const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,<br>
+ unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt,<br>
+ const HelperExprs &Exprs) {<br>
+ unsigned Size = llvm::alignTo(sizeof(<wbr>OMPDistributeParallelForSimdDi<wbr>rective),<br>
+ llvm::alignOf<OMPClause *>());<br>
+ void *Mem = C.Allocate(<br>
+ Size + sizeof(OMPClause *) * Clauses.size() +<br>
+ sizeof(Stmt *) *<br>
+ numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_<wbr>simd));<br>
+ OMPDistributeParallelForSimdDi<wbr>rective *Dir = new (Mem)<br>
+ OMPDistributeParallelForSimdDi<wbr>rective(StartLoc, EndLoc, CollapsedNum,<br>
+ Clauses.size());<br>
+ Dir->setClauses(Clauses);<br>
+ Dir->setAssociatedStmt(<wbr>AssociatedStmt);<br>
+ Dir->setIterationVariable(<wbr>Exprs.IterationVarRef);<br>
+ Dir->setLastIteration(Exprs.<wbr>LastIteration);<br>
+ Dir->setCalcLastIteration(<wbr>Exprs.CalcLastIteration);<br>
+ Dir->setPreCond(Exprs.PreCond)<wbr>;<br>
+ Dir->setCond(Exprs.Cond);<br>
+ Dir->setInit(Exprs.Init);<br>
+ Dir->setInc(Exprs.Inc);<br>
+ Dir->setIsLastIterVariable(<wbr>Exprs.IL);<br>
+ Dir->setLowerBoundVariable(<wbr>Exprs.LB);<br>
+ Dir->setUpperBoundVariable(<wbr>Exprs.UB);<br>
+ Dir->setStrideVariable(Exprs.<wbr>ST);<br>
+ Dir->setEnsureUpperBound(<wbr>Exprs.EUB);<br>
+ Dir->setNextLowerBound(Exprs.<wbr>NLB);<br>
+ Dir->setNextUpperBound(Exprs.<wbr>NUB);<br>
+ Dir->setNumIterations(Exprs.<wbr>NumIterations);<br>
+ Dir-><wbr>setPrevLowerBoundVariable(<wbr>Exprs.PrevLB);<br>
+ Dir-><wbr>setPrevUpperBoundVariable(<wbr>Exprs.PrevUB);<br>
+ Dir->setCounters(Exprs.<wbr>Counters);<br>
+ Dir->setPrivateCounters(Exprs.<wbr>PrivateCounters);<br>
+ Dir->setInits(Exprs.Inits);<br>
+ Dir->setUpdates(Exprs.Updates)<wbr>;<br>
+ Dir->setFinals(Exprs.Finals);<br>
+ Dir->setPreInits(Exprs.<wbr>PreInits);<br>
+ return Dir;<br>
+}<br>
+<br>
+<wbr>OMPDistributeParallelForSimdDi<wbr>rective *<br>
+<wbr>OMPDistributeParallelForSimdDi<wbr>rective::CreateEmpty(const ASTContext &C,<br>
+ unsigned NumClauses,<br>
+ unsigned CollapsedNum,<br>
+ EmptyShell) {<br>
+ unsigned Size = llvm::alignTo(sizeof(<wbr>OMPDistributeParallelForSimdDi<wbr>rective),<br>
+ llvm::alignOf<OMPClause *>());<br>
+ void *Mem = C.Allocate(<br>
+ Size + sizeof(OMPClause *) * NumClauses +<br>
+ sizeof(Stmt *) *<br>
+ numLoopChildren(CollapsedNum, OMPD_distribute_parallel_for_<wbr>simd));<br>
+ return new (Mem)<br>
+ OMPDistributeParallelForSimdDi<wbr>rective(CollapsedNum, NumClauses);<br>
+}<br>
<br>
Modified: cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>StmtPrinter.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/AST/StmtPrinter.<wbr>cpp Tue Jul 5 00:00:15 2016<br>
@@ -1159,6 +1159,12 @@ void StmtPrinter::<wbr>VisitOMPDistributePara<br>
PrintOMPExecutableDirective(<wbr>Node);<br>
}<br>
<br>
+void StmtPrinter::<wbr>VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ OMPDistributeParallelForSimdDi<wbr>rective *Node) {<br>
+ Indent() << "#pragma omp distribute parallel for simd ";<br>
+ PrintOMPExecutableDirective(<wbr>Node);<br>
+}<br>
+<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
// Expr printing methods.<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
<br>
Modified: cfe/trunk/lib/AST/StmtProfile.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>StmtProfile.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/StmtProfile.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/AST/StmtProfile.<wbr>cpp Tue Jul 5 00:00:15 2016<br>
@@ -704,6 +704,11 @@ void StmtProfiler::<wbr>VisitOMPDistributePar<br>
VisitOMPLoopDirective(S);<br>
}<br>
<br>
+void StmtProfiler::<wbr>VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ const OMPDistributeParallelForSimdDi<wbr>rective *S) {<br>
+ VisitOMPLoopDirective(S);<br>
+}<br>
+<br>
void StmtProfiler::VisitExpr(const Expr *S) {<br>
VisitStmt(S);<br>
}<br>
<br>
Modified: cfe/trunk/lib/Basic/<wbr>OpenMPKinds.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/OpenMPKinds.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Basic/<wbr>OpenMPKinds.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Basic/<wbr>OpenMPKinds.cpp (original)<br>
+++ cfe/trunk/lib/Basic/<wbr>OpenMPKinds.cpp Tue Jul 5 00:00:15 2016<br>
@@ -576,6 +576,16 @@ bool clang::<wbr>isAllowedClauseForDirective(<br>
break;<br>
}<br>
break;<br>
+ case OMPD_distribute_parallel_for_<wbr>simd:<br>
+ switch (CKind) {<br>
+#define OPENMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_CLAUSE(Name) \<br>
+ case OMPC_##Name: \<br>
+ return true;<br>
+#include "clang/Basic/OpenMPKinds.def"<br>
+ default:<br>
+ break;<br>
+ }<br>
+ break;<br>
case OMPD_declare_target:<br>
case OMPD_end_declare_target:<br>
case OMPD_unknown:<br>
@@ -598,7 +608,9 @@ bool clang::isOpenMPLoopDirective(<wbr>OpenMP<br>
DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||<br>
DKind == OMPD_taskloop || DKind == OMPD_taskloop_simd ||<br>
DKind == OMPD_distribute || DKind == OMPD_target_parallel_for ||<br>
- DKind == OMPD_distribute_parallel_for; // TODO add next directives.<br>
+ DKind == OMPD_distribute_parallel_for ||<br>
+ DKind == OMPD_distribute_parallel_for_<wbr>simd;<br>
+ // TODO add next directives.<br>
}<br>
<br>
bool clang::<wbr>isOpenMPWorksharingDirective(<wbr>OpenMPDirectiveKind DKind) {<br>
@@ -607,7 +619,9 @@ bool clang::<wbr>isOpenMPWorksharingDirective<br>
DKind == OMPD_single || DKind == OMPD_parallel_for ||<br>
DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||<br>
DKind == OMPD_target_parallel_for ||<br>
- DKind == OMPD_distribute_parallel_for; // TODO add next directives.<br>
+ DKind == OMPD_distribute_parallel_for ||<br>
+ DKind == OMPD_distribute_parallel_for_<wbr>simd;<br>
+ // TODO add next directives.<br>
}<br>
<br>
bool clang::<wbr>isOpenMPTaskLoopDirective(<wbr>OpenMPDirectiveKind DKind) {<br>
@@ -618,7 +632,8 @@ bool clang::<wbr>isOpenMPParallelDirective(Op<br>
return DKind == OMPD_parallel || DKind == OMPD_parallel_for ||<br>
DKind == OMPD_parallel_for_simd || DKind == OMPD_parallel_sections ||<br>
DKind == OMPD_target_parallel || DKind == OMPD_target_parallel_for ||<br>
- DKind == OMPD_distribute_parallel_for;<br>
+ DKind == OMPD_distribute_parallel_for ||<br>
+ DKind == OMPD_distribute_parallel_for_<wbr>simd;<br>
// TODO add next directives.<br>
}<br>
<br>
@@ -640,13 +655,15 @@ bool clang::isOpenMPTeamsDirective(<wbr>OpenM<br>
<br>
bool clang::isOpenMPSimdDirective(<wbr>OpenMPDirectiveKind DKind) {<br>
return DKind == OMPD_simd || DKind == OMPD_for_simd ||<br>
- DKind == OMPD_parallel_for_simd ||<br>
- DKind == OMPD_taskloop_simd; // TODO add next directives.<br>
+ DKind == OMPD_parallel_for_simd || DKind == OMPD_taskloop_simd ||<br>
+ DKind == OMPD_distribute_parallel_for_<wbr>simd;<br>
+ // TODO add next directives.<br>
}<br>
<br>
bool clang::<wbr>isOpenMPDistributeDirective(<wbr>OpenMPDirectiveKind Kind) {<br>
- return Kind == OMPD_distribute ||<br>
- Kind == OMPD_distribute_parallel_for; // TODO add next directives.<br>
+ return Kind == OMPD_distribute || Kind == OMPD_distribute_parallel_for ||<br>
+ Kind == OMPD_distribute_parallel_for_<wbr>simd;<br>
+ // TODO add next directives.<br>
}<br>
<br>
bool clang::isOpenMPPrivate(<wbr>OpenMPClauseKind Kind) {<br>
@@ -664,5 +681,6 @@ bool clang::<wbr>isOpenMPTaskingDirective(Ope<br>
}<br>
<br>
bool clang::<wbr>isOpenMPLoopBoundSharingDirect<wbr>ive(OpenMPDirectiveKind Kind) {<br>
- return Kind == OMPD_distribute_parallel_for;<br>
+ return Kind == OMPD_distribute_parallel_for ||<br>
+ Kind == OMPD_distribute_parallel_for_<wbr>simd;<br>
}<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGStmt.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGStmt.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/CGStmt.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGStmt.<wbr>cpp Tue Jul 5 00:00:15 2016<br>
@@ -284,6 +284,10 @@ void CodeGenFunction::EmitStmt(<wbr>const Stm<br>
EmitOMPDistributeParallelForDi<wbr>rective(<br>
cast<<wbr>OMPDistributeParallelForDirect<wbr>ive>(*S));<br>
break;<br>
+ case Stmt::<wbr>OMPDistributeParallelForSimdDi<wbr>rectiveClass:<br>
+ EmitOMPDistributeParallelForSi<wbr>mdDirective(<br>
+ cast<<wbr>OMPDistributeParallelForSimdDi<wbr>rective>(*S));<br>
+ break;<br>
}<br>
}<br>
<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGStmtOpenMP.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGStmtOpenMP.cpp?rev=274530&<wbr>r1=274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGStmtOpenMP.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGStmtOpenMP.cpp Tue Jul 5 00:00:15 2016<br>
@@ -1877,6 +1877,17 @@ void CodeGenFunction::<wbr>EmitOMPDistributeP<br>
});<br>
}<br>
<br>
+void CodeGenFunction::<wbr>EmitOMPDistributeParallelForSi<wbr>mdDirective(<br>
+ const OMPDistributeParallelForSimdDi<wbr>rective &S) {<br>
+ OMPLexicalScope Scope(*this, S, /*AsInlined=*/true);<br>
+ CGM.getOpenMPRuntime().<wbr>emitInlinedDirective(<br>
+ *this, OMPD_distribute_parallel_for_<wbr>simd,<br>
+ [&S](CodeGenFunction &CGF, PrePostActionTy &) {<br>
+ OMPLoopScope PreInitScope(CGF, S);<br>
+ CGF.EmitStmt(<br>
+ cast<CapturedStmt>(S.<wbr>getAssociatedStmt())-><wbr>getCapturedStmt());<br>
+ });<br>
+}<br>
/// \brief Emit a helper variable and return corresponding lvalue.<br>
static LValue EmitOMPHelperVar(<wbr>CodeGenFunction &CGF,<br>
const DeclRefExpr *Helper) {<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h?rev=274530&<wbr>r1=274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h Tue Jul 5 00:00:15 2016<br>
@@ -2499,6 +2499,8 @@ public:<br>
void EmitOMPDistributeLoop(const OMPDistributeDirective &S);<br>
void EmitOMPDistributeParallelForDi<wbr>rective(<br>
const OMPDistributeParallelForDirect<wbr>ive &S);<br>
+ void EmitOMPDistributeParallelForSi<wbr>mdDirective(<br>
+ const OMPDistributeParallelForSimdDi<wbr>rective &S);<br>
<br>
/// Emit outlined function for the target directive.<br>
static std::pair<llvm::Function * /*OutlinedFn*/,<br>
<br>
Modified: cfe/trunk/lib/Parse/<wbr>ParseOpenMP.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Parse/<wbr>ParseOpenMP.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Parse/<wbr>ParseOpenMP.cpp (original)<br>
+++ cfe/trunk/lib/Parse/<wbr>ParseOpenMP.cpp Tue Jul 5 00:00:15 2016<br>
@@ -90,6 +90,8 @@ static OpenMPDirectiveKind ParseOpenMPDi<br>
{ OMPD_declare, OMPD_target, OMPD_declare_target },<br>
{ OMPD_distribute, OMPD_parallel, OMPD_distribute_parallel },<br>
{ OMPD_distribute_parallel, OMPD_for, OMPD_distribute_parallel_for },<br>
+ { OMPD_distribute_parallel_for, OMPD_simd,<br>
+ OMPD_distribute_parallel_for_<wbr>simd },<br>
{ OMPD_end, OMPD_declare, OMPD_end_declare },<br>
{ OMPD_end_declare, OMPD_target, OMPD_end_declare_target },<br>
{ OMPD_target, OMPD_data, OMPD_target_data },<br>
@@ -734,6 +736,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpen<br>
case OMPD_end_declare_target:<br>
case OMPD_target_update:<br>
case OMPD_distribute_parallel_for:<br>
+ case OMPD_distribute_parallel_for_<wbr>simd:<br>
Diag(Tok, diag::err_omp_unexpected_<wbr>directive)<br>
<< getOpenMPDirectiveName(DKind);<br>
break;<br>
@@ -765,7 +768,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpen<br>
/// 'taskgroup' | 'teams' | 'taskloop' | 'taskloop simd' |<br>
/// 'distribute' | 'target enter data' | 'target exit data' |<br>
/// 'target parallel' | 'target parallel for' |<br>
-/// 'target update' | 'distribute parallel for' {clause}<br>
+/// 'target update' | 'distribute parallel for' |<br>
+/// 'distribute paralle for simd' {clause}<br>
/// annot_pragma_openmp_end<br>
///<br>
StmtResult Parser::<wbr>ParseOpenMPDeclarativeOrExecut<wbr>ableDirective(<br>
@@ -870,7 +874,8 @@ StmtResult Parser::ParseOpenMPDeclarativ<br>
case OMPD_taskloop:<br>
case OMPD_taskloop_simd:<br>
case OMPD_distribute:<br>
- case OMPD_distribute_parallel_for: {<br>
+ case OMPD_distribute_parallel_for:<br>
+ case OMPD_distribute_parallel_for_<wbr>simd: {<br>
ConsumeToken();<br>
// Parse directive name of the 'critical' directive if any.<br>
if (DKind == OMPD_critical) {<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaOpenMP.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaOpenMP.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaOpenMP.<wbr>cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaOpenMP.<wbr>cpp Tue Jul 5 00:00:15 2016<br>
@@ -1814,6 +1814,7 @@ void Sema::ActOnOpenMPRegionStart(<wbr>OpenMP<br>
Params);<br>
break;<br>
}<br>
+ case OMPD_distribute_parallel_for_<wbr>simd:<br>
case OMPD_distribute_parallel_for: {<br>
QualType KmpInt32Ty = Context.getIntTypeForBitwidth(<wbr>32, 1);<br>
QualType KmpInt32PtrTy =<br>
@@ -2038,6 +2039,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | parallel | distribute | + |<br>
// | parallel | distribute | + |<br>
// | | parallel for | |<br>
+ // | parallel | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | for | parallel | * |<br>
// | for | for | + |<br>
@@ -2076,6 +2079,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | for | distribute | + |<br>
// | for | distribute | + |<br>
// | | parallel for | |<br>
+ // | for | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | master | parallel | * |<br>
// | master | for | + |<br>
@@ -2114,6 +2119,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | master | distribute | + |<br>
// | master | distribute | + |<br>
// | | parallel for | |<br>
+ // | master | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | critical | parallel | * |<br>
// | critical | for | + |<br>
@@ -2151,6 +2158,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | critical | distribute | + |<br>
// | critical | distribute | + |<br>
// | | parallel for | |<br>
+ // | critical | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | simd | parallel | |<br>
// | simd | for | |<br>
@@ -2189,6 +2198,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | simd | distribute | |<br>
// | simd | distribute | |<br>
// | | parallel for | |<br>
+ // | simd | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | for simd | parallel | |<br>
// | for simd | for | |<br>
@@ -2227,6 +2238,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | for simd | distribute | |<br>
// | for simd | distribute | |<br>
// | | parallel for | |<br>
+ // | for simd | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | parallel for simd| parallel | |<br>
// | parallel for simd| for | |<br>
@@ -2265,6 +2278,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | parallel for simd| distribute | |<br>
// | parallel for simd| distribute | |<br>
// | | parallel for | |<br>
+ // | parallel for simd| distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | sections | parallel | * |<br>
// | sections | for | + |<br>
@@ -2303,6 +2318,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | sections | distribute | + |<br>
// | sections | distribute | + |<br>
// | | parallel for | |<br>
+ // | sections | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | section | parallel | * |<br>
// | section | for | + |<br>
@@ -2341,6 +2358,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | section | distribute | + |<br>
// | section | distribute | + |<br>
// | | parallel for | |<br>
+ // | section | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | single | parallel | * |<br>
// | single | for | + |<br>
@@ -2379,6 +2398,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | single | distribute | + |<br>
// | single | distribute | + |<br>
// | | parallel for | |<br>
+ // | single | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | parallel for | parallel | * |<br>
// | parallel for | for | + |<br>
@@ -2417,6 +2438,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | parallel for | distribute | + |<br>
// | parallel for | distribute | + |<br>
// | | parallel for | |<br>
+ // | parallel for | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | parallel sections| parallel | * |<br>
// | parallel sections| for | + |<br>
@@ -2455,6 +2478,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | parallel sections| distribute | + |<br>
// | parallel sections| distribute | + |<br>
// | | parallel for | |<br>
+ // | parallel sections| distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | task | parallel | * |<br>
// | task | for | + |<br>
@@ -2493,6 +2518,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | task | distribute | + |<br>
// | task | distribute | + |<br>
// | | parallel for | |<br>
+ // | task | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | ordered | parallel | * |<br>
// | ordered | for | + |<br>
@@ -2531,6 +2558,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | ordered | distribute | + |<br>
// | ordered | distribute | + |<br>
// | | parallel for | |<br>
+ // | ordered | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | atomic | parallel | |<br>
// | atomic | for | |<br>
@@ -2569,6 +2598,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | atomic | distribute | |<br>
// | atomic | distribute | |<br>
// | | parallel for | |<br>
+ // | atomic | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | target | parallel | * |<br>
// | target | for | * |<br>
@@ -2607,6 +2638,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | target | distribute | + |<br>
// | target | distribute | + |<br>
// | | parallel for | |<br>
+ // | target | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | target parallel | parallel | * |<br>
// | target parallel | for | * |<br>
@@ -2645,6 +2678,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | target parallel | distribute | |<br>
// | target parallel | distribute | |<br>
// | | parallel for | |<br>
+ // | target parallel | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | target parallel | parallel | * |<br>
// | for | | |<br>
@@ -2710,6 +2745,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | for | | |<br>
// | parallel | distribute | |<br>
// | for | parallel for | |<br>
+ // | parallel | distribute | |<br>
+ // | for |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | teams | parallel | * |<br>
// | teams | for | + |<br>
@@ -2748,6 +2785,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | teams | distribute | ! |<br>
// | teams | distribute | ! |<br>
// | | parallel for | |<br>
+ // | teams | distribute | ! |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | taskloop | parallel | * |<br>
// | taskloop | for | + |<br>
@@ -2785,6 +2824,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | taskloop | distribute | + |<br>
// | taskloop | distribute | + |<br>
// | | parallel for | |<br>
+ // | taskloop | distribute | + |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | taskloop simd | parallel | |<br>
// | taskloop simd | for | |<br>
@@ -2823,6 +2864,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | taskloop simd | distribute | |<br>
// | taskloop simd | distribute | |<br>
// | | parallel for | |<br>
+ // | taskloop simd | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | distribute | parallel | * |<br>
// | distribute | for | * |<br>
@@ -2861,6 +2904,8 @@ static bool CheckNestingOfRegions(Sema &<br>
// | distribute | distribute | |<br>
// | distribute | distribute | |<br>
// | | parallel for | |<br>
+ // | distribute | distribute | |<br>
+ // | |parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
// | distribute | parallel | * |<br>
// | parallel for | | |<br>
@@ -2927,6 +2972,75 @@ static bool CheckNestingOfRegions(Sema &<br>
// | parallel for | | |<br>
// | distribute | distribute | |<br>
// | parallel for | parallel for | |<br>
+ // | distribute | distribute | |<br>
+ // | parallel for |parallel for simd| |<br>
+ // +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
+ // | distribute | parallel | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | for | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | for simd | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | master | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | critical | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | simd | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | sections | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | section | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | single | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | parallel for | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute |parallel for simd| * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute |parallel sections| * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | task | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | taskyield | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | barrier | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | taskwait | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | taskgroup | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | flush | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | ordered | + |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | atomic | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | target | |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | target parallel | |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | target parallel | |<br>
+ // | parallel for simd| for | |<br>
+ // | distribute | target enter | |<br>
+ // | parallel for simd| data | |<br>
+ // | distribute | target exit | |<br>
+ // | parallel for simd| data | |<br>
+ // | distribute | teams | |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | cancellation | + |<br>
+ // | parallel for simd| point | |<br>
+ // | distribute | cancel | + |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | taskloop | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | taskloop simd | * |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | distribute | |<br>
+ // | parallel for simd| | |<br>
+ // | distribute | distribute | * |<br>
+ // | parallel for simd| parallel for | |<br>
+ // | distribute | distribute | * |<br>
+ // | parallel for simd|parallel for simd| |<br>
// +------------------+----------<wbr>-------+----------------------<wbr>--------------+<br>
if (Stack->getCurScope()) {<br>
auto ParentRegion = Stack->getParentDirective();<br>
@@ -3417,6 +3531,11 @@ StmtResult Sema::ActOnOpenMPExecutableDi<br>
ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);<br>
AllowedNameModifiers.push_<wbr>back(OMPD_parallel);<br>
break;<br>
+ case OMPD_distribute_parallel_for_<wbr>simd:<br>
+ Res = ActOnOpenMPDistributeParallelF<wbr>orSimdDirective(<br>
+ ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);<br>
+ AllowedNameModifiers.push_<wbr>back(OMPD_parallel);<br>
+ break;<br>
case OMPD_declare_target:<br>
case OMPD_end_declare_target:<br>
case OMPD_threadprivate:<br>
@@ -6929,6 +7048,39 @@ StmtResult Sema::ActOnOpenMPDistributePa<br>
Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);<br>
}<br>
<br>
+StmtResult Sema::<wbr>ActOnOpenMPDistributeParallelF<wbr>orSimdDirective(<br>
+ ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,<br>
+ SourceLocation EndLoc,<br>
+ llvm::DenseMap<ValueDecl *, Expr *> &VarsWithImplicitDSA) {<br>
+ if (!AStmt)<br>
+ return StmtError();<br>
+<br>
+ CapturedStmt *CS = cast<CapturedStmt>(AStmt);<br>
+ // 1.2.2 OpenMP Language Terminology<br>
+ // Structured block - An executable statement with a single entry at the<br>
+ // top and a single exit at the bottom.<br>
+ // The point of exit cannot be a branch out of the structured block.<br>
+ // longjmp() and throw() must not violate the entry/exit criteria.<br>
+ CS->getCapturedDecl()-><wbr>setNothrow();<br>
+<br>
+ OMPLoopDirective::HelperExprs B;<br>
+ // In presence of clause 'collapse' with number of loops, it will<br>
+ // define the nested loops number.<br>
+ unsigned NestedLoopCount = CheckOpenMPLoop(<br>
+ OMPD_distribute_parallel_for_<wbr>simd, getCollapseNumberExpr(Clauses)<wbr>,<br>
+ nullptr /*ordered not a clause on distribute*/, AStmt, *this, *DSAStack,<br>
+ VarsWithImplicitDSA, B);<br>
+ if (NestedLoopCount == 0)<br>
+ return StmtError();<br>
+<br>
+ assert((CurContext-><wbr>isDependentContext() || B.builtAll()) &&<br>
+ "omp for loop exprs were not built");<br>
+<br>
+ getCurFunction()-><wbr>setHasBranchProtectedScope();<br>
+ return OMPDistributeParallelForSimdDi<wbr>rective::Create(<br>
+ Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);<br>
+}<br>
+<br>
OMPClause *Sema::<wbr>ActOnOpenMPSingleExprClause(<wbr>OpenMPClauseKind Kind, Expr *Expr,<br>
SourceLocation StartLoc,<br>
SourceLocation LParenLoc,<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>TreeTransform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>TreeTransform.h?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>TreeTransform.h (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>TreeTransform.h Tue Jul 5 00:00:15 2016<br>
@@ -7548,6 +7548,18 @@ StmtResult TreeTransform<Derived>::Trans<br>
return Res;<br>
}<br>
<br>
+template <typename Derived><br>
+StmtResult<br>
+TreeTransform<Derived>::<wbr>TransformOMPDistributeParallel<wbr>ForSimdDirective(<br>
+ OMPDistributeParallelForSimdDi<wbr>rective *D) {<br>
+ DeclarationNameInfo DirName;<br>
+ getDerived().getSema().<wbr>StartOpenMPDSABlock(<br>
+ OMPD_distribute_parallel_for_<wbr>simd, DirName, nullptr, D->getLocStart());<br>
+ StmtResult Res = getDerived().<wbr>TransformOMPExecutableDirectiv<wbr>e(D);<br>
+ getDerived().getSema().<wbr>EndOpenMPDSABlock(Res.get());<br>
+ return Res;<br>
+}<br>
+<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
// OpenMP clause transformation<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
<br>
Modified: cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTReaderStmt.<wbr>cpp?rev=274530&r1=274529&r2=<wbr>274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/<wbr>ASTReaderStmt.cpp Tue Jul 5 00:00:15 2016<br>
@@ -2720,6 +2720,11 @@ void ASTStmtReader::<wbr>VisitOMPDistributePa<br>
VisitOMPLoopDirective(D);<br>
}<br>
<br>
+void ASTStmtReader::<wbr>VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ OMPDistributeParallelForSimdDi<wbr>rective *D) {<br>
+ VisitOMPLoopDirective(D);<br>
+}<br>
+<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
// ASTReader Implementation<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
@@ -3403,6 +3408,15 @@ Stmt *ASTReader::<wbr>ReadStmtFromStream(Modu<br>
break;<br>
}<br>
<br>
+ case STMT_OMP_DISTRIBUTE_PARALLEL_<wbr>FOR_SIMD_DIRECTIVE: {<br>
+ unsigned NumClauses = Record[ASTStmtReader::<wbr>NumStmtFields];<br>
+ unsigned CollapsedNum = Record[ASTStmtReader::<wbr>NumStmtFields + 1];<br>
+ S = OMPDistributeParallelForSimdDi<wbr>rective::CreateEmpty(Context, NumClauses,<br>
+ CollapsedNum,<br>
+ Empty);<br>
+ break;<br>
+ }<br>
+<br>
case EXPR_CXX_OPERATOR_CALL:<br>
S = new (Context) CXXOperatorCallExpr(Context, Empty);<br>
break;<br>
<br>
Modified: cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>Serialization/ASTWriterStmt.<wbr>cpp?rev=274530&r1=274529&r2=<wbr>274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/<wbr>ASTWriterStmt.cpp Tue Jul 5 00:00:15 2016<br>
@@ -2436,6 +2436,12 @@ void ASTStmtWriter::<wbr>VisitOMPDistributePa<br>
Code = serialization::STMT_OMP_<wbr>DISTRIBUTE_PARALLEL_FOR_<wbr>DIRECTIVE;<br>
}<br>
<br>
+void ASTStmtWriter::<wbr>VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ OMPDistributeParallelForSimdDi<wbr>rective *D) {<br>
+ VisitOMPLoopDirective(D);<br>
+ Code = serialization::STMT_OMP_<wbr>DISTRIBUTE_PARALLEL_FOR_SIMD_<wbr>DIRECTIVE;<br>
+}<br>
+<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
// ASTWriter Implementation<br>
//===-------------------------<wbr>------------------------------<wbr>---------------===//<br>
<br>
Modified: cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/<wbr>StaticAnalyzer/Core/<wbr>ExprEngine.cpp?rev=274530&r1=<wbr>274529&r2=274530&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp (original)<br>
+++ cfe/trunk/lib/StaticAnalyzer/<wbr>Core/ExprEngine.cpp Tue Jul 5 00:00:15 2016<br>
@@ -844,6 +844,7 @@ void ExprEngine::Visit(const Stmt *S, Ex<br>
case Stmt::<wbr>OMPTaskLoopSimdDirectiveClass:<br>
case Stmt::<wbr>OMPDistributeDirectiveClass:<br>
case Stmt::<wbr>OMPDistributeParallelForDirect<wbr>iveClass:<br>
+ case Stmt::<wbr>OMPDistributeParallelForSimdDi<wbr>rectiveClass:<br>
llvm_unreachable("Stmt should not be in analyzer evaluation loop");<br>
<br>
case Stmt::<wbr>ObjCSubscriptRefExprClass:<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>aligned_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_aligned_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>aligned_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>aligned_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>aligned_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,306 @@<br>
+// RUN: %clang_cc1 -x c++ -std=c++11 -verify -fopenmp %s<br>
+<br>
+struct B {<br>
+ static int ib[20]; // expected-note 0 {{'B::ib' declared here}}<br>
+ static constexpr int bfoo() { return 8; }<br>
+};<br>
+namespace X {<br>
+ B x; // expected-note {{'x' defined here}}<br>
+};<br>
+constexpr int bfoo() { return 4; }<br>
+<br>
+int **z;<br>
+const int C1 = 1;<br>
+const int C2 = 2;<br>
+void test_aligned_colons(int *&rp)<br>
+{<br>
+ int *B = 0;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B:bfoo())<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B:B::bfoo())<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(z:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B:B::bfoo())<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(X::x : ::z) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'int **'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'B'}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B,rp,::z: X::x) // expected-error {{integral constant expression must have integral or unscoped enumeration type, not 'B'}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(::z)<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp distribute parallel for simd aligned(B::bfoo()) // expected-error {{expected variable name}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(B::ib,B:C1+C2) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+}<br>
+<br>
+// expected-note@+1 {{'num' defined here}}<br>
+template<int L, class T, class N> T test_template(T* arr, N num) {<br>
+ N i;<br>
+ T sum = (T)0;<br>
+ T ind2 = - num * L;<br>
+ // Negative number is passed as L.<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(arr:L) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}}<br>
+ for (i = 0; i < num; ++i) {<br>
+ T cur = arr[(int)ind2];<br>
+ ind2 += L;<br>
+ sum += cur;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(num:4) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}<br>
+ for (i = 0; i < num; ++i);<br>
+<br>
+ return T();<br>
+}<br>
+<br>
+template<int LEN> int test_warn() {<br>
+ int *ind2 = 0;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(ind2:LEN) // expected-error {{argument to 'aligned' clause must be a strictly positive integer value}}<br>
+ for (int i = 0; i < 100; i++) {<br>
+ ind2 += LEN;<br>
+ }<br>
+ return 0;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}}<br>
+extern S1 a; // expected-note {{'a' declared here}}<br>
+class S2 {<br>
+ mutable int a;<br>
+public:<br>
+ S2():a(0) { }<br>
+};<br>
+const S2 b; // expected-note 1 {{'b' defined here}}<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+public:<br>
+ S3():a(0) { }<br>
+};<br>
+const S3 ca[5];<br>
+class S4 {<br>
+ int a;<br>
+ S4();<br>
+public:<br>
+ S4(int v):a(v) { }<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5():a(0) {}<br>
+public:<br>
+ S5(int v):a(v) { }<br>
+};<br>
+<br>
+S3 h; // expected-note 2 {{'h' defined here}}<br>
+#pragma omp threadprivate(h)<br>
+<br>
+template<class I, class C> int foomain(I argc, C **argv) {<br>
+ I e(argc);<br>
+ I g(argc);<br>
+ int i; // expected-note {{declared here}} expected-note {{'i' defined here}}<br>
+ // expected-note@+2 {{declared here}}<br>
+ // expected-note@+1 {{reference to 'i' is not a constant expression}}<br>
+ int &j = i;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned // expected-error {{expected '(' after 'aligned'}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned () // expected-error {{expected expression}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc : 5) // expected-warning {{aligned clause will be ignored because the requested alignment is not a power of 2}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(e, g)<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(i) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+ #pragma omp parallel<br>
+ {<br>
+ int *v = 0;<br>
+ I i;<br>
+ #pragma omp target<br>
+ #pragma omp teams<br>
+ #pragma omp distribute parallel for simd aligned(v:16)<br>
+ for (I k = 0; k < argc; ++k) { i = k; v += 2; }<br>
+ }<br>
+ float *f;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(f)<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+ int v = 0;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(f:j) // expected-note {{initializer of 'j' is not a constant expression}} expected-error {{expression is not an integral constant expression}}<br>
+<br>
+ for (I k = 0; k < argc; ++k) { ++k; v += j; }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(f)<br>
+ for (I k = 0; k < argc; ++k) ++k;<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+// expected-note@+1 2 {{'argc' defined here}}<br>
+int main(int argc, char **argv) {<br>
+ double darr[100];<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}<br>
+ test_template<-4>(darr, 4);<br>
+ test_warn<4>(); // ok<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}<br>
+ test_warn<0>();<br>
+<br>
+ int i;<br>
+ int &j = i;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned // expected-error {{expected '(' after 'aligned'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned () // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argv // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argc) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'int'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (a, b) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S1'}} expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S2'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned (argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(h) // expected-error {{argument of aligned clause should be array, pointer, reference to array or reference to pointer, not 'S3'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ int *pargc = &argc;<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'foomain<int *, char>' requested here}}<br>
+ foomain<int*,char>(pargc,argv)<wbr>;<br></blockquote><div><br></div><div>Did you really mean to instantiate 'foomain' with 'int*' as the type of argc? This makes most of the code within the function be complete nonsense:</div><div><br></div><div> for (int *k = 0; k < argc; ++k)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ return 0;<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>ast_print.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_ast_print.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>ast_print.cpp?rev=274530&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>ast_print.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>ast_print.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,152 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s<br>
+// RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s<br>
+// RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s<br>
+// expected-no-diagnostics<br>
+<br>
+#ifndef HEADER<br>
+#define HEADER<br>
+<br>
+struct S {<br>
+ S(): a(0) {}<br>
+ S(int v) : a(v) {}<br>
+ int a;<br>
+ typedef int type;<br>
+};<br>
+<br>
+template <typename T><br>
+class S7 : public T {<br>
+protected:<br>
+ T a;<br>
+ S7() : a(0) {}<br>
+<br>
+public:<br>
+ S7(typename T::type v) : a(v) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(T::a)<br>
+ for (int k = 0; k < a.a; ++k)<br>
+ ++this->a.a;<br>
+ }<br>
+ S7 &operator=(S7 &s) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a)<br>
+ for (int k = 0; k < s.a.a; ++k)<br>
+ ++s.a.a;<br>
+ return *this;<br>
+ }<br>
+};<br>
+<br>
+// CHECK: #pragma omp distribute parallel for simd private(this->a) private(this->a) private(this->S::a)<br>
+// CHECK: #pragma omp distribute parallel for simd private(this->a) private(this->a) private(T::a)<br>
+// CHECK: #pragma omp distribute parallel for simd private(this->a) private(this->a)<br>
+<br>
+class S8 : public S7<S> {<br>
+ S8() {}<br>
+<br>
+public:<br>
+ S8(int v) : S7<S>(v){<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(S7<S>::a)<br>
+ for (int k = 0; k < a.a; ++k)<br>
+ ++this->a.a;<br>
+ }<br>
+ S8 &operator=(S8 &s) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a)<br>
+ for (int k = 0; k < s.a.a; ++k)<br>
+ ++s.a.a;<br>
+ return *this;<br>
+ }<br>
+};<br>
+<br>
+// CHECK: #pragma omp distribute parallel for simd private(this->a) private(this->a) private(this->S7<S>::a)<br>
+// CHECK: #pragma omp distribute parallel for simd private(this->a) private(this->a)<br>
+<br>
+template <class T, int N><br>
+T tmain(T argc) {<br>
+ T b = argc, c, d, e, f, h;<br>
+ static T a;<br>
+// CHECK: static T a;<br>
+ static T g;<br>
+#pragma omp threadprivate(g)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule(static, a) schedule(dynamic) default(none) copyin(g) firstprivate(a)<br>
+ // CHECK: #pragma omp distribute parallel for simd dist_schedule(static, a) schedule(dynamic) default(none) copyin(g)<br>
+ for (int i = 0; i < 2; ++i)<br>
+ a = 2;<br>
+// CHECK-NEXT: for (int i = 0; i < 2; ++i)<br>
+// CHECK-NEXT: a = 2;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) schedule(static, N) if (parallel :argc) num_threads(N) default(shared) shared(e) reduction(+ : h) dist_schedule(static,N)<br>
+ for (int i = 0; i < 2; ++i)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int i = 0; i < 2; ++i)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ for (int j = 0; j < 2; ++j)<br>
+ a++;<br>
+ // CHECK: #pragma omp distribute parallel for simd private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) schedule(static, N) if(parallel: argc) num_threads(N) default(shared) shared(e) reduction(+: h) dist_schedule(static, N)<br>
+ // CHECK-NEXT: for (int i = 0; i < 2; ++i)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int i = 0; i < 2; ++i)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: for (int j = 0; j < 2; ++j)<br>
+ // CHECK-NEXT: a++;<br>
+ return T();<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int b = argc, c, d, e, f, h;<br>
+ int x[200];<br>
+ static int a;<br>
+// CHECK: static int a;<br>
+ static float g;<br>
+#pragma omp threadprivate(g)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)<br>
+ // CHECK: #pragma omp distribute parallel for simd schedule(guided, argc) default(none) copyin(g) dist_schedule(static, a) private(a)<br>
+ for (int i = 0; i < 2; ++i)<br>
+ a = 2;<br>
+// CHECK-NEXT: for (int i = 0; i < 2; ++i)<br>
+// CHECK-NEXT: a = 2;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) if (argc) num_threads(a) default(shared) shared(e) reduction(+ : h) dist_schedule(static, b)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ for (int j = 0; j < 10; ++j)<br>
+ a++;<br>
+ // CHECK: #pragma omp distribute parallel for simd private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) if(argc) num_threads(a) default(shared) shared(e) reduction(+: h) dist_schedule(static, b)<br>
+ // CHECK-NEXT: for (int i = 0; i < 10; ++i)<br>
+ // CHECK-NEXT: for (int j = 0; j < 10; ++j)<br>
+ // CHECK-NEXT: a++;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd aligned(x:8) linear(h:2) safelen(8) simdlen(8)<br>
+ for (int i = 0; i < 100; i++)<br>
+ for (int j = 0; j < 200; j++)<br>
+ a += h + x[j];<br>
+ // CHECK: #pragma omp distribute parallel for simd aligned(x: 8) linear(h: 2) safelen(8) simdlen(8)<br>
+ // CHECK-NEXT: for (int i = 0; i < 100; i++)<br>
+ // CHECK-NEXT: for (int j = 0; j < 200; j++)<br>
+ // CHECK-NEXT: a += h + x[j];<br>
+<br>
+ return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0]));<br>
+}<br>
+<br>
+#endif<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>collapse_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_collapse_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>collapse_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>collapse_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>collapse_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,154 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+#if __cplusplus >= 201103L<br>
+// expected-note@+2 4 {{declared here}}<br>
+#endif<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, typename S, int N, int ST> // expected-note {{declared here}}<br>
+T tmain(T argc, S **argv) { //expected-note 2 {{declared here}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse // expected-error {{expected '(' after 'collapse'}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse () // expected-error {{expected expression}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+ // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}<br>
+ // expected-error@+2 2 {{expression is not an integral constant expression}}<br>
+ // expected-note@+1 2 {{read of non-const variable 'argc' is not allowed in a constant expression}}<br>
+#pragma omp distribute parallel for simd collapse (argc<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+ // expected-error@+1 2 {{argument to 'collapse' clause must be a strictly positive integer value}}<br>
+#pragma omp distribute parallel for simd collapse (ST // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (1)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse ((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'collapse' clause}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; // expected-error 2 {{expected 2 for loops after '#pragma omp distribute parallel for simd', but found only 1}}<br>
+ // expected-error@+8 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'collapse' clause}}<br>
+ // expected-error@+7 2 {{argument to 'collapse' clause must be a strictly positive integer value}}<br>
+ // expected-error@+6 2 {{expression is not an integral constant expression}}<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (foobool(argc)), collapse (true), collapse (-5)<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (S) // expected-error {{'S' does not refer to a value}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 2 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (1)<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (N) // expected-error {{argument to 'collapse' clause must be a strictly positive integer value}}<br>
+ for (T i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (2) // expected-note {{as specified in 'collapse' clause}}<br>
+ foo(); // expected-error {{expected 2 for loops after '#pragma omp distribute parallel for simd'}}<br>
+ return argc;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse // expected-error {{expected '(' after 'collapse'}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse () // expected-error {{expected expression}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (4 // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{as specified in 'collapse' clause}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp distribute parallel for simd', but found only 1}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}} expected-note {{as specified in 'collapse' clause}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp distribute parallel for simd', but found only 1}}<br>
+ // expected-error@+6 {{expression is not an integral constant expression}}<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (foobool(1) > 0 ? 1 : 2)<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ // expected-error@+8 {{expression is not an integral constant expression}}<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+6{{non-<wbr>constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+ // expected-error@+4 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'collapse' clause}}<br>
+ // expected-error@+3 2 {{argument to 'collapse' clause must be a strictly positive integer value}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (foobool(argc)), collapse (true), collapse (-5)<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ // expected-error@+5 {{statement after '#pragma omp distribute parallel for simd' must be a for loop}}<br>
+ // expected-note@+3 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse(collapse(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd collapse (2) // expected-note {{as specified in 'collapse' clause}}<br>
+ foo(); // expected-error {{expected 2 for loops after '#pragma omp distribute parallel for simd'}}<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}<br>
+ return tmain<int, char, 1, 0>(argc, argv);<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>copyin_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_copyin_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>copyin_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>copyin_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>copyin_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,190 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}}<br>
+class S2 {<br>
+ mutable int a;<br>
+<br>
+public:<br>
+ S2() : a(0) {}<br>
+ S2 &operator=(S2 &s2) { return *this; }<br>
+};<br>
+class S3 {<br>
+ int a;<br>
+<br>
+public:<br>
+ S3() : a(0) {}<br>
+ S3 &operator=(S3 &s3) { return *this; }<br>
+};<br>
+class S4 {<br>
+ int a;<br>
+ S4();<br>
+ S4 &operator=(const S4 &s4); // expected-note 3 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S4(int v) : a(v) {}<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5() : a(0) {}<br>
+ S5 &operator=(const S5 &s5) { return *this; } // expected-note 3 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S5(int v) : a(v) {}<br>
+};<br>
+template <class T><br>
+class ST {<br>
+public:<br>
+ static T s;<br>
+};<br>
+<br>
+S2 k;<br>
+S3 h;<br>
+S4 l(3);<br>
+S5 m(4);<br>
+#pragma omp threadprivate(h, k, l, m)<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x)<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+template <class T, typename S, int N><br>
+T tmain(T argc, S **argv) {<br>
+ T i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin // expected-error {{expected '(' after 'copyin'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin() // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(k // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(l) // expected-error 2 {{'operator=' is a private member of 'S4'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(argv[1]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(i) // expected-error {{copyin variable must be threadprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(m) // expected-error 2 {{'operator=' is a private member of 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(ST<int>::s, B::x) // expected-error {{copyin variable must be threadprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin // expected-error {{expected '(' after 'copyin'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin() // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(k // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(l) // expected-error {{'operator=' is a private member of 'S4'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(argv[1]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(i) // expected-error {{copyin variable must be threadprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(m) // expected-error {{'operator=' is a private member of 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd copyin(ST<int>::s, B::x) // expected-error {{copyin variable must be threadprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+ return tmain<int, char, 3>(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char, 3>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>default_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_default_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>default_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>default_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>default_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,100 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s<br>
+<br>
+void foo();<br>
+<br>
+template <class T, int N><br>
+T tmain(T argc) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default // expected-error {{expected '(' after 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(shared), default(shared) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'default' clause}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(none)<br>
+ for (i = 0; i < argc; ++i) // expected-error 2 {{variable 'argc' must have explicitly specified data sharing attributes}}<br>
+ foo();<br>
+<br>
+#pragma omp parallel default(none)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(shared)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+ return T();<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default // expected-error {{expected '(' after 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default( // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default() // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(none // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(shared), default(shared) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'default' clause}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(x) // expected-error {{expected 'none' or 'shared' in OpenMP clause 'default'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(none)<br>
+ for (i = 0; i < argc; ++i) // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}<br>
+ foo();<br>
+<br>
+#pragma omp parallel default(none)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd default(shared)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+ return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>dist_schedule_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_dist_schedule_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>dist_schedule_messages.cpp?<wbr>rev=274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>dist_schedule_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>dist_schedule_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,103 @@<br>
+// RUN: %clang_cc1 -triple x86_64-apple-macos10.7.0 -verify -fopenmp -ferror-limit 100 -o - %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}} expected-note {{declared here}}<br>
+<br>
+template <class T, int N><br>
+T tmain(T argc) {<br>
+ T b = argc, c, d, e, f, g;<br>
+ char ** argv;<br>
+ static T a;<br>
+// CHECK: static T a;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule // expected-error {{expected '(' after 'dist_schedule'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule ( // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule () // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (argc)) // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, argc > 0 ? argv[1] : argv[2]) // expected-error2 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static), dist_schedule (static, 1) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'dist_schedule' clause}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error3 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+ return T();<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule // expected-error {{expected '(' after 'dist_schedule'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule ( // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule () // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (argc)) // expected-error {{expected 'static' in OpenMP clause 'dist_schedule'}} expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, argc > 0 ? argv[1] : argv[2]) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static), dist_schedule (static, 1) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'dist_schedule' clause}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd dist_schedule (static, argv[1]=2) // expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i) foo();<br>
+ return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0])); // expected-note {{in instantiation of function template specialization 'tmain<int, 5>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<char, 1>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>firstprivate_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>firstprivate_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>firstprivate_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>firstprivate_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,359 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+<br>
+public:<br>
+ S2() : a(0) {}<br>
+ S2(const S2 &s2) : a(s2.a) {}<br>
+ static float S2s;<br>
+ static const float S2sc;<br>
+};<br>
+const float S2::S2sc = 0;<br>
+const S2 b;<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+ S3 &operator=(const S3 &s3);<br>
+<br>
+public:<br>
+ S3() : a(0) {}<br>
+ S3(const S3 &s3) : a(s3.a) {}<br>
+};<br>
+const S3 c;<br>
+const S3 ca[5];<br>
+extern const int f;<br>
+class S4 {<br>
+ int a;<br>
+ S4();<br>
+ S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S4(int v) : a(v) {}<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S5() : a(0) {}<br>
+ S5(int v) : a(v) {}<br>
+};<br>
+class S6 {<br>
+ int a;<br>
+ S6() : a(0) {}<br>
+<br>
+public:<br>
+ S6(const S6 &s6) : a(s6.a) {}<br>
+ S6(int v) : a(v) {}<br>
+};<br>
+<br>
+S3 h;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+template <class I, class C><br>
+int foomain(int argc, char **argv) {<br>
+ I e(4);<br>
+ C g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate() // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp parallel<br>
+ {<br>
+ int v = 0;<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i)<br>
+ for (int k = 0; k < argc; ++k) {<br>
+ i = k;<br>
+ v += i;<br>
+ }<br>
+ }<br>
+#pragma omp parallel shared(i)<br>
+#pragma omp parallel private(i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(j)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp parallel private(i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be firstprivate, predetermined as linear}}<br>
+ foo();<br>
+#pragma omp parallel reduction(+ : i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be firstprivate, predetermined as linear}}<br>
+ foo();<br>
+ return 0;<br>
+}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ const int d = 5;<br>
+ const int da[5] = {0};<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ S3 m;<br>
+ S6 n(2);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate // expected-error {{expected '(' after 'firstprivate'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate() // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argc)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(argv[1]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(2 * 2) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(ba) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(ca) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(da) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+ int xa;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(xa) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(S2::S2s) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(S2::S2sc) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen(5) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(m) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be firstprivate, predetermined as linear}}<br>
+ foo();<br>
+#pragma omp parallel shared(xa)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(xa) // OK: may be firstprivate<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(j)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(n) firstprivate(n) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp parallel<br>
+ {<br>
+ int v = 0;<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i)<br>
+ for (int k = 0; k < argc; ++k) {<br>
+ i = k;<br>
+ v += i;<br>
+ }<br>
+ }<br>
+#pragma omp parallel private(i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be firstprivate, predetermined as linear}}<br>
+ foo();<br>
+#pragma omp parallel reduction(+ : i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be firstprivate, predetermined as linear}}<br>
+ foo();<br>
+ static int si;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(si) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ si = i + 1;<br>
+<br>
+ return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>if_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_if_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>if_messages.cpp?rev=274530&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>if_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>if_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,179 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, class S> // expected-note {{declared here}}<br>
+int tmain(T argc, S **argv) {<br>
+ T i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if // expected-error {{expected '(' after 'if'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if () // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc > 0 ? argv[1] : argv[2])<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (foobool(argc)), if (true) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'if' clause}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (S) // expected-error {{'S' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc argc) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(argc)<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel // expected-warning {{missing ':' after directive name modifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc)<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp distribute parallel for simd'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp distribute parallel for simd'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if // expected-error {{expected '(' after 'if'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if () // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc > 0 ? argv[1] : argv[2])<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (foobool(argc)), if (true) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'if' clause}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (argc argc) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if (1 0) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(if(tmain(argc, argv) // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel // expected-warning {{missing ':' after directive name modifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc)<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (for:argc) // expected-error {{directive name modifier 'for' is not allowed for '#pragma omp distribute parallel for simd'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (parallel:argc) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'if' clause with 'parallel' name modifier}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(parallel : argc) if (argc) // expected-error {{no more 'if' clause is allowed}} expected-note {{previous clause with directive name modifier specified here}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd if(distribute : argc) // expected-error {{directive name modifier 'distribute' is not allowed for '#pragma omp distribute parallel for simd'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+<br>
+ return tmain(argc, argv);<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>lastprivate_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_lastprivate_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>lastprivate_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>lastprivate_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>lastprivate_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,333 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+<br>
+public:<br>
+ S2() : a(0) {}<br>
+ S2(S2 &s2) : a(s2.a) {}<br>
+ const S2 &operator =(const S2&) const;<br>
+ S2 &operator =(const S2&);<br>
+ static float S2s; // expected-note {{static data member is predetermined as shared}}<br>
+ static const float S2sc;<br>
+};<br>
+const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}}<br>
+const S2 b;<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+ S3 &operator=(const S3 &s3); // expected-note 2 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S3() : a(0) {}<br>
+ S3(S3 &s3) : a(s3.a) {}<br>
+};<br>
+const S3 c; // expected-note {{global variable is predetermined as shared}}<br>
+const S3 ca[5]; // expected-note {{global variable is predetermined as shared}}<br>
+extern const int f; // expected-note {{global variable is predetermined as shared}}<br>
+class S4 {<br>
+ int a;<br>
+ S4(); // expected-note 3 {{implicitly declared private here}}<br>
+ S4(const S4 &s4);<br>
+<br>
+public:<br>
+ S4(int v) : a(v) {}<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5() : a(0) {} // expected-note {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S5(const S5 &s5) : a(s5.a) {}<br>
+ S5(int v) : a(v) {}<br>
+};<br>
+class S6 {<br>
+ int a;<br>
+ S6() : a(0) {}<br>
+<br>
+public:<br>
+ S6(const S6 &s6) : a(s6.a) {}<br>
+ S6(int v) : a(v) {}<br>
+};<br>
+<br>
+S3 h;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+template <class I, class C><br>
+int foomain(int argc, char **argv) {<br>
+ I e(4);<br>
+ I g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate() // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+<br>
+ int v = 0;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+ {<br>
+#pragma omp distribute parallel for simd lastprivate(i)<br>
+ for (int k = 0; k < argc; ++k) {<br>
+ i = k;<br>
+ v += i;<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams private(i)<br>
+#pragma omp distribute parallel for simd lastprivate(j)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(i)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+ return 0;<br>
+}<br>
+<br>
+void bar(S4 a[2]) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(a)<br>
+ for (int i = 0; i < 2; ++i)<br>
+ foo();<br>
+}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ const int d = 5; // expected-note {{constant variable is predetermined as shared}}<br>
+ const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}}<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ S3 m;<br>
+ S6 n(2);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate() // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argc)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(argv[1]) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(2 * 2) // expected-error {{expected variable name}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(ba)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(da) // expected-error {{shared variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+ int xa;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(xa) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen(5) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(i) // expected-note {{defined as lastprivate}}<br>
+ for (i = 0; i < argc; ++i) // expected-error{{loop iteration variable in the associated loop of 'omp distribute parallel for simd' directive may not be lastprivate, predetermined as linear}}<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(xa)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(xa)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(j)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(n) firstprivate(n) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+ static int si;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd lastprivate(si) // OK<br>
+ for (i = 0; i < argc; ++i)<br>
+ si = i + 1;<br>
+ return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>linear_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>linear_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>linear_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>linear_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,338 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+<br>
+namespace X {<br>
+ int x;<br>
+};<br>
+<br>
+struct B {<br>
+ static int ib; // expected-note {{'B::ib' declared here}}<br>
+ static int bfoo() { return 8; }<br>
+};<br>
+<br>
+int bfoo() { return 4; }<br>
+<br>
+int z;<br>
+const int C1 = 1;<br>
+const int C2 = 2;<br>
+void test_linear_colons()<br>
+{<br>
+ int B = 0;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B:bfoo())<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B::ib:B:bfoo()) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B:ib) // expected-error {{use of undeclared identifier 'ib'; did you mean 'B::ib'}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(z:B:ib) // expected-error {{unexpected ':' in nested name specifier; did you mean '::'?}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B:B::bfoo())<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(X::x : ::z)<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B,::z, X::x)<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(::z)<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B::bfoo()) // expected-error {{expected variable name}}<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(B::ib,B:C1+C2)<br>
+ for (int i = 0; i < 10; ++i) ;<br>
+}<br>
+<br>
+template<int L, class T, class N> T test_template(T* arr, N num) {<br>
+ N i;<br>
+ T sum = (T)0;<br>
+ T ind2 = - num * L; // expected-note {{'ind2' defined here}}<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(ind2:L) // expected-error {{argument of a linear clause should be of integral or pointer type}}<br>
+ for (i = 0; i < num; ++i) {<br>
+ T cur = arr[(int)ind2];<br>
+ ind2 += L;<br>
+ sum += cur;<br>
+ }<br>
+ return T();<br>
+}<br>
+<br>
+template<int LEN> int test_warn() {<br>
+ int ind2 = 0;<br>
+ #pragma omp target<br>
+ #pragma omp teams<br>
+ #pragma omp parallel for simd linear(ind2:LEN) // expected-warning {{zero linear step (ind2 should probably be const)}}<br>
+ for (int i = 0; i < 100; i++) {<br>
+ ind2 += LEN;<br>
+ }<br>
+ return ind2;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+public:<br>
+ S2():a(0) { }<br>
+};<br>
+const S2 b; // expected-note 2 {{'b' defined here}}<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+public:<br>
+ S3():a(0) { }<br>
+};<br>
+const S3 ca[5];<br>
+class S4 {<br>
+ int a;<br>
+ S4();<br>
+public:<br>
+ S4(int v):a(v) { }<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5():a(0) {}<br>
+public:<br>
+ S5(int v):a(v) { }<br>
+};<br>
+<br>
+S3 h;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+template<class I, class C> int foomain(I argc, C **argv) {<br>
+ I e(4);<br>
+ I g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear // expected-error {{expected '(' after 'linear'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear () // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc : 5)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (a, b:B::ib) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(e, g)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(i)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ #pragma omp parallel<br>
+ {<br>
+ int v = 0;<br>
+ int i;<br>
+ #pragma omp target<br>
+ #pragma omp teams<br>
+ #pragma omp distribute parallel for simd linear(v:i)<br>
+ for (int k = 0; k < argc; ++k) { i = k; v += i; }<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd linear(j)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ int v = 0;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(v:j)<br>
+ for (int k = 0; k < argc; ++k) { ++k; v += j; }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(i)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+ return 0;<br>
+}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace C {<br>
+using A::x;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ double darr[100];<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}<br>
+ test_template<-4>(darr, 4);<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}<br>
+ test_warn<0>();<br>
+<br>
+ S4 e(4); // expected-note {{'e' defined here}}<br>
+ S5 g(5); // expected-note {{'g' defined here}}<br>
+ int i;<br>
+ int &j = i;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear // expected-error {{expected '(' after 'linear'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear () // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argc)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (a, b) // expected-error {{linear variable with incomplete type 'S1'}} expected-error {{const-qualified variable cannot be linear}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear (argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(e, g) // expected-error {{argument of a linear clause should be of integral or pointer type, not 'S4'}} expected-error {{argument of a linear clause should be of integral or pointer type, not 'S5'}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}}<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ #pragma omp parallel<br>
+ {<br>
+ int i;<br>
+ #pragma omp target<br>
+ #pragma omp teams<br>
+ #pragma omp distribute parallel for simd linear(i)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ #pragma omp target<br>
+ #pragma omp teams<br>
+ #pragma omp distribute parallel for simd linear(i : 4)<br>
+ for (int k = 0; k < argc; ++k) { ++k; i += 4; }<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(j)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd linear(i)<br>
+ for (int k = 0; k < argc; ++k) ++k;<br>
+<br>
+ foomain<int,char>(argc,argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}<br>
+ return 0;<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>num_threads_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_num_threads_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>num_threads_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>num_threads_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>num_threads_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,107 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, typename S, int N> // expected-note {{declared here}}<br>
+T tmain(T argc, S **argv) {<br>
+ T i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads // expected-error {{expected '(' after 'num_threads'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads () // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads ((argc > 0) ? argv[1] : argv[2]) // expected-error 2 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (foobool(argc)), num_threads (true), num_threads (-5) // expected-error 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'num_threads' clause}} expected-error {{argument to 'num_threads' clause must be a strictly positive integer value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (S) // expected-error {{'S' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error 2 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc)<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (N) // expected-error {{argument to 'num_threads' clause must be a strictly positive integer value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+<br>
+ return argc;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads // expected-error {{expected '(' after 'num_threads'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads () // expected-error {{expected expression}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argc > 0 ? argv[1] : argv[2]) // expected-error {{integral }}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (foobool(argc)), num_threads (true), num_threads (-5) // expected-error 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'num_threads' clause}} expected-error {{argument to 'num_threads' clause must be a strictly positive integer value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd num_threads (num_threads(tmain<int, char, -1>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} expected-note {{in instantiation of function template specialization 'tmain<int, char, -1>' requested here}}<br>
+ for (i = 0; i < argc; ++i) foo();<br>
+<br>
+ return tmain<int, char, 3>(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char, 3>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>private_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_private_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>private_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>private_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>private_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,315 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+<br>
+public:<br>
+ S2() : a(0) {}<br>
+};<br>
+const S2 b;<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+<br>
+public:<br>
+ S3() : a(0) {}<br>
+};<br>
+const S3 ca[5];<br>
+class S4 {<br>
+ int a;<br>
+ S4(); // expected-note {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S4(int v) : a(v) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a)<br>
+ for (int k = 0; k < v; ++k)<br>
+ ++this->a;<br>
+ }<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5() : a(0) {} // expected-note {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S5(int v) : a(v) {}<br>
+ S5 &operator=(S5 &s) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}<br>
+ for (int k = 0; k < s.a; ++k)<br>
+ ++s.a;<br>
+ return *this;<br>
+ }<br>
+};<br>
+<br>
+template <typename T><br>
+class S6 {<br>
+public:<br>
+ T a;<br>
+<br>
+ S6() : a(0) {}<br>
+ S6(T v) : a(v) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a)<br>
+ for (int k = 0; k < v; ++k)<br>
+ ++this->a;<br>
+ }<br>
+ S6 &operator=(S6 &s) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}<br>
+ for (int k = 0; k < s.a; ++k)<br>
+ ++s.a;<br>
+ return *this;<br>
+ }<br>
+};<br>
+<br>
+template <typename T><br>
+class S7 : public T {<br>
+ T a;<br>
+ S7() : a(0) {}<br>
+<br>
+public:<br>
+ S7(T v) : a(v) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(T::a)<br>
+ for (int k = 0; k < a.a; ++k)<br>
+ ++this->a.a;<br>
+ }<br>
+ S7 &operator=(S7 &s) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}<br>
+ for (int k = 0; k < s.a.a; ++k)<br>
+ ++s.a.a;<br>
+ return *this;<br>
+ }<br>
+};<br>
+<br>
+S3 h;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+template <class I, class C><br>
+int foomain(I argc, C **argv) {<br>
+ I e(4);<br>
+ I g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private // expected-error {{expected '(' after 'private'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private() // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(e, g)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp distribute parallel for simd'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp parallel<br>
+ {<br>
+ int v = 0;<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for (int k = 0; k < argc; ++k) {<br>
+ i = k;<br>
+ v += i;<br>
+ }<br>
+ }<br>
+#pragma omp parallel shared(i)<br>
+#pragma omp parallel private(i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(j)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+ return 0;<br>
+}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ S6<float> s6(0.0) , s6_0(1.0);<br>
+ S7<S6<float> > s7(0.0) , s7_0(1.0);<br>
+ int i;<br>
+ int &j = i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private // expected-error {{expected '(' after 'private'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private() // expected-error {{expected expression}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argc)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(argv[1]) // expected-error {{expected variable name}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp distribute parallel for simd'}}<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp parallel<br>
+ {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+ }<br>
+#pragma omp parallel shared(i)<br>
+#pragma omp parallel private(i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(j)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ ++k;<br>
+ static int m;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(m)<br>
+ for (int k = 0; k < argc; ++k)<br>
+ m = k + 2;<br>
+<br>
+ s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}<br>
+ s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float> >::operator=' requested here}}<br>
+ return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>proc_bind_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_proc_bind_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>proc_bind_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>proc_bind_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>proc_bind_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,101 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s<br>
+<br>
+void foo();<br>
+<br>
+template <class T, typename S, int N><br>
+T tmain(T argc, S **argv) {<br>
+ T i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind // expected-error {{expected '(' after 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind( // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind() // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(master // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(close), proc_bind(spread) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'proc_bind' clause}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(x) // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(master)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+#pragma omp parallel proc_bind(close)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(spread)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+ return T();<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ int i;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind // expected-error {{expected '(' after 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind( // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind() // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(master // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(close), proc_bind(spread) // expected-error {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'proc_bind' clause}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(x) // expected-error {{expected 'master', 'close' or 'spread' in OpenMP clause 'proc_bind'}}<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(master)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+<br>
+#pragma omp parallel proc_bind(close)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd proc_bind(spread)<br>
+ for (i = 0; i < argc; ++i)<br>
+ foo();<br>
+ return tmain<int, char, 3>(argc, argv);<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>reduction_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_reduction_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>reduction_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>reduction_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>reduction_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,441 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 150 -o - %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++98 -ferror-limit 150 -o - %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ferror-limit 150 -o - %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+ S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}}<br>
+<br>
+public:<br>
+ S2() : a(0) {}<br>
+ S2(S2 &s2) : a(s2.a) {}<br>
+ static float S2s; // expected-note 2 {{static data member is predetermined as shared}}<br>
+ static const float S2sc;<br>
+};<br>
+const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}}<br>
+S2 b; // expected-note 3 {{'b' defined here}}<br>
+const S2 ba[5]; // expected-note 2 {{'ba' defined here}}<br>
+class S3 {<br>
+ int a;<br>
+<br>
+public:<br>
+ int b;<br>
+ S3() : a(0) {}<br>
+ S3(const S3 &s3) : a(s3.a) {}<br>
+ S3 operator+(const S3 &arg1) { return arg1; }<br>
+};<br>
+int operator+(const S3 &arg1, const S3 &arg2) { return 5; }<br>
+S3 c; // expected-note 3 {{'c' defined here}}<br>
+const S3 ca[5]; // expected-note 2 {{'ca' defined here}}<br>
+extern const int f; // expected-note 4 {{'f' declared here}}<br>
+class S4 {<br>
+ int a;<br>
+ S4(); // expected-note {{implicitly declared private here}}<br>
+ S4(const S4 &s4);<br>
+ S4 &operator+(const S4 &arg) { return (*this); }<br>
+<br>
+public:<br>
+ S4(int v) : a(v) {}<br>
+};<br>
+S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; }<br>
+class S5 {<br>
+ int a;<br>
+ S5() : a(0) {} // expected-note {{implicitly declared private here}}<br>
+ S5(const S5 &s5) : a(s5.a) {}<br>
+ S5 &operator+(const S5 &arg);<br>
+<br>
+public:<br>
+ S5(int v) : a(v) {}<br>
+};<br>
+class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}}<br>
+#if __cplusplus >= 201103L // C++11 or later<br>
+// expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}}<br>
+#endif<br>
+ int a;<br>
+<br>
+public:<br>
+ S6() : a(6) {}<br>
+ operator int() { return 6; }<br>
+} o;<br>
+<br>
+S3 h, k;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+template <class T> // expected-note {{declared here}}<br>
+T tmain(T argc) {<br>
+ const T d = T(); // expected-note 4 {{'d' defined here}}<br>
+ const T da[5] = {T()}; // expected-note 2 {{'da' defined here}}<br>
+ T qa[5] = {T()};<br>
+ T i;<br>
+ T &j = i; // expected-note 4 {{'j' defined here}}<br>
+ S3 &p = k; // expected-note 2 {{'p' defined here}}<br>
+ const T &r = da[(int)i]; // expected-note 2 {{'r' defined here}}<br>
+ T &q = qa[(int)i]; // expected-note 2 {{'q' defined here}}<br>
+ T fl;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction // expected-error {{expected '(' after 'reduction'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name, array element or array section}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(foo : argc) //expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : argc)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(^ : T) // expected-error {{'T' does not refer to a value}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified list item cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}} expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : o) // expected-error 2 {{no viable overloaded '='}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel private(k)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : r) // expected-error 2 {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel shared(i)<br>
+#pragma omp parallel reduction(min : i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel private(fl)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : fl)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel reduction(* : fl)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : fl)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+<br>
+ return T();<br>
+}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ const int d = 5; // expected-note 2 {{'d' defined here}}<br>
+ const int da[5] = {0}; // expected-note {{'da' defined here}}<br>
+ int qa[5] = {0};<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ int i;<br>
+ int &j = i; // expected-note 2 {{'j' defined here}}<br>
+ S3 &p = k; // expected-note 2 {{'p' defined here}}<br>
+ const int &r = da[i]; // expected-note {{'r' defined here}}<br>
+ int &q = qa[i]; // expected-note {{'q' defined here}}<br>
+ float fl;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction // expected-error {{expected '(' after 'reduction'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name, array element or array section}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(~ : argc) // expected-error {{expected unqualified-id}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : argc)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified list item cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : ba) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(* : ca) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(- : da) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{invalid operands to binary expression ('S4' and 'S4')}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : h, k, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : o) // expected-error {{no viable overloaded '='}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel private(k)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : r) // expected-error {{const-qualified list item cannot be reduction}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel shared(i)<br>
+#pragma omp parallel reduction(min : i)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel private(fl)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : fl)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+#pragma omp parallel reduction(* : fl)<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : fl)<br>
+ for (int i = 0; i < 10; ++i)<br>
+ foo();<br>
+ static int m;<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd reduction(+ : m) // OK<br>
+ for (int i = 0; i < 10; ++i)<br>
+ m++;<br>
+<br>
+ return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>safelen_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_safelen_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>safelen_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>safelen_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>safelen_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,177 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+#if __cplusplus >= 201103L<br>
+// expected-note@+2 4 {{declared here}}<br>
+#endif<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, typename S, int N, int ST> // expected-note {{declared here}}<br>
+T tmain(T argc, S **argv) { //expected-note 2 {{declared here}}<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen // expected-error {{expected '(' after 'safelen'}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen () // expected-error {{expected expression}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (argc // expected-note {{to match this '('}} expected-error 2 {{expression is not an integral constant expression}} expected-note 2 {{read of non-const variable 'argc' is not allowed in a constant expression}} expected-error {{expected ')'}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (ST // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (1)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen ((ST > 0) ? 1 + ST : 2)<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'safelen' clause}} expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{expression is not an integral constant expression}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (S) // expected-error {{'S' does not refer to a value}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 2 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (4)<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (N) // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}}<br>
+ for (T i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+ return argc;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen // expected-error {{expected '(' after 'safelen'}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen () // expected-error {{expected expression}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen (4 // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp parallel for simd' are ignored}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen (foobool(argc)), safelen (true), safelen (-5) // expected-error 2 {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error 2 {{directive '#pragma omp parallel for simd' cannot contain more than one 'safelen' clause}} expected-error {{expression is not an integral constant expression}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp parallel for simd safelen (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+ // expected-note@+3 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd safelen(safelen(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}<br>
+ foo(); // expected-error {{statement after '#pragma omp distribute parallel for simd' must be a for loop}}<br>
+<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 12, 4>' requested here}}<br>
+ return tmain<int, char, 12, 4>(argc, argv);<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>schedule_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_schedule_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>schedule_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>schedule_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>schedule_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,151 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, typename S, int N, int ST> // expected-note {{declared here}}<br>
+T tmain(T argc, S **argv) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule // expected-error {{expected '(' after 'schedule'}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule ( // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule () // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto_dynamic // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto, // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (runtime, 3) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided argc<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ // expected-error@+3 2 {{argument to 'schedule' clause must be a strictly positive integer value}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, ST // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (dynamic, 1)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided, (ST > 0) ? 1 + ST : 2)<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ // expected-error@+4 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'schedule' clause}}<br>
+ // expected-error@+3 {{argument to 'schedule' clause must be a strictly positive integer value}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, foobool(argc)), schedule (dynamic, true), schedule (guided, -5)<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, S) // expected-error {{'S' does not refer to a value}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ // expected-error@+3 2 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided, argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (dynamic, 1)<br>
+ for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, N) // expected-error {{argument to 'schedule' clause must be a strictly positive integer value}}<br>
+ for (T i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+ return argc;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule // expected-error {{expected '(' after 'schedule'}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule ( // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule () // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto_dynamic // expected-error {{expected 'static', 'dynamic', 'guided', 'auto', 'runtime', 'monotonic', 'nonmonotonic' or 'simd' in OpenMP clause 'schedule'}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (auto, // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (runtime, 3) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided, 4 // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, 2+2)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (dynamic, foobool(1) > 0 ? 1 : 2)<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ // expected-error@+4 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'schedule' clause}}<br>
+ // expected-error@+3 {{argument to 'schedule' clause must be a strictly positive integer value}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided, foobool(argc)), schedule (static, true), schedule (dynamic, -5)<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (guided, S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ // expected-error@+3 {{expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+ #pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule (static, argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+ // expected-error@+5 {{statement after '#pragma omp distribute parallel for simd' must be a for loop}}<br>
+ // expected-note@+3 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd schedule(dynamic, schedule(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}<br>
+ foo();<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}<br>
+ return tmain<int, char, 1, 0>(argc, argv);<br>
+}<br>
+<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>shared_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_shared_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>shared_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>shared_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>shared_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,396 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s<br>
+<br>
+<br>
+struct S1; // expected-note 2 {{declared here}}<br>
+extern S1 a;<br>
+class S2 {<br>
+ mutable int a;<br>
+public:<br>
+ S2():a(0) { }<br>
+ S2(S2 &s2):a(s2.a) { }<br>
+};<br>
+const S2 b;<br>
+const S2 ba[5];<br>
+class S3 {<br>
+ int a;<br>
+public:<br>
+ S3():a(0) { }<br>
+ S3(S3 &s3):a(s3.a) { }<br>
+};<br>
+const S3 c;<br>
+const S3 ca[5];<br>
+extern const int f;<br>
+class S4 {<br>
+ int a;<br>
+ S4();<br>
+ S4(const S4 &s4);<br>
+public:<br>
+ S4(int v):a(v) { }<br>
+};<br>
+class S5 {<br>
+ int a;<br>
+ S5():a(0) {}<br>
+ S5(const S5 &s5):a(s5.a) { }<br>
+public:<br>
+ S5(int v):a(v) { }<br>
+};<br>
+<br>
+S3 h;<br>
+#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+<br>
+namespace A {<br>
+double x;<br>
+#pragma omp threadprivate(x) // expected-note 2 {{defined as threadprivate or thread local}}<br>
+}<br>
+namespace B {<br>
+using A::x;<br>
+}<br>
+<br>
+template <class T, typename S, int N><br>
+T tmain(T argc, S **argv) {<br>
+ const int d = 5;<br>
+ const int da[5] = { 0 };<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+ int acc = 0;<br>
+ int n = 1000;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared // expected-error {{expected '(' after 'shared'}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared () // expected-error {{expected expression}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (a, b, c, d, f)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argv[1]) // expected-error {{expected variable name}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(ba)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(ca)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(da)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(e, g)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(j)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(j)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+return T();<br>
+}<br>
+<br>
+<br>
+int main(int argc, char **argv) {<br>
+ const int d = 5;<br>
+ const int da[5] = { 0 };<br>
+ S4 e(4);<br>
+ S5 g(5);<br>
+ int i;<br>
+ int &j = i;<br>
+ int acc = 0;<br>
+ int n = argc;<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared // expected-error {{expected '(' after 'shared'}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared () // expected-error {{expected expression}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argc)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (a, b, c, d, f)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared (argv[1]) // expected-error {{expected variable name}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(ba)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(ca)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(da)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(e, g)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}}<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd private(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(j)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd firstprivate(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(i)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd shared(j)<br>
+ for(int k = 0 ; k < n ; k++) {<br>
+ acc++;<br>
+ }<br>
+<br>
+return tmain<int, char, 1000>(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char, 1000>' requested here}}<br>
+}<br>
<br>
Added: cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>simdlen_messages.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_simdlen_messages.cpp?rev=274530&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>simdlen_messages.cpp?rev=<wbr>274530&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>simdlen_messages.cpp (added)<br>
+++ cfe/trunk/test/OpenMP/<wbr>distribute_parallel_for_simd_<wbr>simdlen_messages.cpp Tue Jul 5 00:00:15 2016<br>
@@ -0,0 +1,181 @@<br>
+// RUN: %clang_cc1 -verify -fopenmp %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s<br>
+// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s<br>
+<br>
+void foo() {<br>
+}<br>
+<br>
+#if __cplusplus >= 201103L<br>
+// expected-note@+2 4 {{declared here}}<br>
+#endif<br>
+bool foobool(int argc) {<br>
+ return argc;<br>
+}<br>
+<br>
+struct S1; // expected-note {{declared here}}<br>
+<br>
+template <class T, typename S, int N, int ST> // expected-note {{declared here}}<br>
+T tmain(T argc, S **argv) { //expected-note 2 {{declared here}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen // expected-error {{expected '(' after 'simdlen'}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen () // expected-error {{expected expression}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+// expected-error@+5 {{expected ')'}} expected-note@+5 {{to match this '('}}<br>
+// expected-error@+4 2 {{expression is not an integral constant expression}}<br>
+// expected-note@+3 2 {{read of non-const variable 'argc' is not allowed in a constant expression}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (argc<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+// expected-error@+3 {{argument to 'simdlen' clause must be a strictly positive integer value}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (ST // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (1)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen ((ST > 0) ? 1 + ST : 2)<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (foobool(argc)), simdlen (true), simdlen (-5) // expected-error 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'simdlen' clause}} expected-error 2 {{argument to 'simdlen' clause must be a strictly positive integer value}} expected-error 2 {{expression is not an integral constant expression}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (S) // expected-error {{'S' does not refer to a value}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 2 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (4)<br>
+ for (int i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (N) // expected-error {{argument to 'simdlen' clause must be a strictly positive integer value}}<br>
+ for (T i = ST; i < N; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-ST];<br>
+<br>
+ return argc;<br>
+}<br>
+<br>
+int main(int argc, char **argv) {<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen // expected-error {{expected '(' after 'simdlen'}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen () // expected-error {{expected expression}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (4 // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (foobool(1) > 0 ? 1 : 2) // expected-error {{expression is not an integral constant expression}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+<br>
+#if __cplusplus >= 201103L<br>
+ // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (foobool(argc)), simdlen (true), simdlen (-5) // expected-error {{expression is not an integral constant expression}} expected-error 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'simdlen' clause}} expected-error 2 {{argument to 'simdlen' clause must be a strictly positive integer value}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (S1) // expected-error {{'S1' does not refer to a value}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#if __cplusplus <= 199711L<br>
+ // expected-error@+6 {{expression is not an integral constant expression}}<br>
+#else<br>
+ // expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}<br>
+#endif<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}<br>
+ for (int i = 4; i < 12; i++)<br>
+ argv[0][i] = argv[0][i] - argv[0][i-4];<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd simdlen(simdlen(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} expected-note {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}<br>
+ foo(); // expected-error {{statement after '#pragma omp distribute parallel for simd' must be a for loop}}<br>
+<br>
+ // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 12, 4>' requested here}}<br>
+ return tmain<int, char, 12, 4>(argc, argv);<br>
+}<br>
+<br>
<br>
Modified: cfe/trunk/test/OpenMP/nesting_<wbr>of_regions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/nesting_of_regions.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/OpenMP/<wbr>nesting_of_regions.cpp?rev=<wbr>274530&r1=274529&r2=274530&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/OpenMP/nesting_<wbr>of_regions.cpp (original)<br>
+++ cfe/trunk/test/OpenMP/nesting_<wbr>of_regions.cpp Tue Jul 5 00:00:15 2016<br>
@@ -143,6 +143,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// SIMD DIRECTIVE<br>
#pragma omp simd<br>
@@ -323,6 +329,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// FOR DIRECTIVE<br>
#pragma omp for<br>
@@ -516,6 +528,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// FOR SIMD DIRECTIVE<br>
#pragma omp for simd<br>
@@ -697,6 +715,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// SECTIONS DIRECTIVE<br>
#pragma omp sections<br>
@@ -895,6 +919,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp sections<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// SECTION DIRECTIVE<br>
#pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}<br>
@@ -1148,6 +1178,13 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp sections<br>
+ {<br>
+#pragma omp section<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// SINGLE DIRECTIVE<br>
#pragma omp single<br>
@@ -1332,6 +1369,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp single<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// MASTER DIRECTIVE<br>
#pragma omp master<br>
@@ -1516,6 +1559,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp master<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// CRITICAL DIRECTIVE<br>
#pragma omp critical<br>
@@ -1714,6 +1763,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp critical<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL FOR DIRECTIVE<br>
#pragma omp parallel for<br>
@@ -1912,6 +1967,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp parallel for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#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?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL FOR SIMD DIRECTIVE<br>
#pragma omp parallel for simd<br>
@@ -2111,6 +2172,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL SECTIONS DIRECTIVE<br>
#pragma omp parallel sections<br>
@@ -2298,6 +2365,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp parallel sections<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TASK DIRECTIVE<br>
#pragma omp task<br>
@@ -2432,6 +2505,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp task<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// ORDERED DIRECTIVE<br>
#pragma omp ordered<br>
@@ -2637,6 +2716,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp ordered<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'ordered' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// ATOMIC DIRECTIVE<br>
#pragma omp atomic<br>
@@ -2866,6 +2951,14 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp atomic<br>
+ // 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}}<br>
+ // expected-note@+1 {{expected an expression statement}}<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET DIRECTIVE<br>
#pragma omp target<br>
@@ -3016,6 +3109,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp target<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET PARALLEL DIRECTIVE<br>
#pragma omp target parallel<br>
@@ -3160,6 +3259,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp target parallel<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target parallel' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET PARALLEL FOR DIRECTIVE<br>
#pragma omp target parallel for<br>
@@ -3358,6 +3463,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp target parallel for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target parallel for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// TEAMS DIRECTIVE<br>
#pragma omp target<br>
@@ -3536,6 +3647,17 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+ {<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp distribute parallel for simd<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
+<br>
// TASKLOOP DIRECTIVE<br>
#pragma omp taskloop<br>
for (int i = 0; i < 10; ++i) {<br>
@@ -3724,7 +3846,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
++a;<br>
}<br>
-<br>
+#pragma omp taskloop<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ++a;<br>
+ }<br>
<br>
// DISTRIBUTE DIRECTIVE<br>
#pragma omp target<br>
@@ -4183,162 +4310,401 @@ void foo() {<br>
#pragma omp target update to(a) // expected-error {{region cannot be nested inside 'target' region}}<br>
++a;<br>
}<br>
-}<br>
<br>
-void foo() {<br>
- int a = 0;<br>
-// PARALLEL DIRECTIVE<br>
-#pragma omp parallel<br>
-#pragma omp for<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
-#pragma omp simd<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
-#pragma omp for simd<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
-#pragma omp sections<br>
- {<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
-#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}<br>
- {<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
-#pragma omp sections<br>
- {<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
-#pragma omp single<br>
- bar();<br>
-#pragma omp parallel<br>
-#pragma omp master<br>
- bar();<br>
-#pragma omp parallel<br>
-#pragma omp critical<br>
- bar();<br>
-#pragma omp parallel<br>
-#pragma omp parallel for<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
-#pragma omp parallel for simd<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
-#pragma omp parallel sections<br>
- {<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
-#pragma omp task<br>
- {<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp taskyield<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp barrier<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp taskwait<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp flush<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}<br>
- bar();<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp atomic<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
+// DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE<br>
#pragma omp target<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp target parallel<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
-#pragma omp target parallel for<br>
- for (int i = 0; i < 10; ++i)<br>
- ;<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp target enter data map(to: a)<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp target exit data map(from: a)<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp taskloop<br>
- for (int i = 0; i < 10; ++i)<br>
- ++a;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp target update to(a)<br>
- a++;<br>
- }<br>
-#pragma omp parallel<br>
- {<br>
-#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
-<br>
-// SIMD DIRECTIVE<br>
-#pragma omp simd<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
for (int i = 0; i < 10; ++i) {<br>
#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
-#pragma omp simd<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
for (int i = 0; i < 10; ++i) {<br>
#pragma omp simd // expected-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}}<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
-#pragma omp simd<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+#pragma omp single<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+}<br>
+<br>
+void foo() {<br>
+ int a = 0;<br>
+// PARALLEL DIRECTIVE<br>
+#pragma omp parallel<br>
+#pragma omp for<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+#pragma omp simd<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+#pragma omp for simd<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+#pragma omp sections<br>
+ {<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+#pragma omp section // expected-error {{'omp section' directive must be closely nested to a sections region, not a parallel region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+#pragma omp sections<br>
+ {<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+#pragma omp single<br>
+ bar();<br>
+#pragma omp parallel<br>
+#pragma omp master<br>
+ bar();<br>
+#pragma omp parallel<br>
+#pragma omp critical<br>
+ bar();<br>
+#pragma omp parallel<br>
+#pragma omp parallel for<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+#pragma omp parallel for simd<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+#pragma omp parallel sections<br>
+ {<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+#pragma omp task<br>
+ {<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp taskyield<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp barrier<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp taskwait<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp flush<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp ordered // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp ordered' directive into a for or a parallel for region with 'ordered' clause?}}<br>
+ bar();<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp atomic<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp target<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp target parallel<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+#pragma omp target parallel for<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp target enter data map(to: a)<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp target exit data map(from: a)<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp teams // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp teams' directive into a target region?}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp taskloop<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ++a;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp distribute // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp target update to(a)<br>
+ a++;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp distribute parallel for // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute parallel for' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp parallel<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'parallel' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+<br>
+// SIMD DIRECTIVE<br>
+#pragma omp simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp simd // expected-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp simd<br>
for (int i = 0; i < 10; ++i) {<br>
#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
for (int i = 0; i < 10; ++i)<br>
@@ -4488,6 +4854,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// FOR DIRECTIVE<br>
#pragma omp for<br>
@@ -4672,6 +5044,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// FOR SIMD DIRECTIVE<br>
#pragma omp for simd<br>
@@ -4836,6 +5214,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// SECTIONS DIRECTIVE<br>
#pragma omp sections<br>
@@ -5009,6 +5393,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp sections<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// SECTION DIRECTIVE<br>
#pragma omp section // expected-error {{orphaned 'omp section' directives are prohibited, it must be closely nested to a sections region}}<br>
@@ -5272,6 +5662,13 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp sections<br>
+ {<br>
+#pragma omp section<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// SINGLE DIRECTIVE<br>
#pragma omp single<br>
@@ -5446,6 +5843,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp single<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// MASTER DIRECTIVE<br>
#pragma omp master<br>
@@ -5630,6 +6033,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp master<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// CRITICAL DIRECTIVE<br>
#pragma omp critical<br>
@@ -5833,6 +6242,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp critical<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL FOR DIRECTIVE<br>
#pragma omp parallel for<br>
@@ -6032,6 +6447,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp parallel for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#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?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL FOR SIMD DIRECTIVE<br>
#pragma omp parallel for simd<br>
@@ -6231,6 +6652,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// PARALLEL SECTIONS DIRECTIVE<br>
#pragma omp parallel sections<br>
@@ -6410,7 +6837,13 @@ void foo() {<br>
}<br>
#pragma omp parallel sections<br>
{<br>
-#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?}}<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp parallel sections<br>
+ {<br>
+#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?}}<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
@@ -6547,6 +6980,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp task<br>
+ {<br>
+#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?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// ATOMIC DIRECTIVE<br>
#pragma omp atomic<br>
@@ -6775,6 +7214,14 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp atomic<br>
+ // 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}}<br>
+ // expected-note@+1 {{expected an expression statement}}<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside an atomic region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET DIRECTIVE<br>
#pragma omp target<br>
@@ -6922,6 +7369,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp target<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET PARALLEL DIRECTIVE<br>
#pragma omp target parallel<br>
@@ -7066,7 +7519,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
-<br>
+#pragma omp target parallel<br>
+ {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target parallel' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// TARGET PARALLEL FOR DIRECTIVE<br>
#pragma omp target parallel for<br>
@@ -7266,6 +7724,12 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp target parallel for<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'target parallel for' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
<br>
// TEAMS DIRECTIVE<br>
#pragma omp target<br>
@@ -7448,6 +7912,17 @@ void foo() {<br>
for (int j = 0; j < 10; ++j)<br>
;<br>
}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+ {<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+#pragma omp distribute parallel for simd<br>
+ for (int j = 0; j < 10; ++j)<br>
+ ;<br>
+ }<br>
+<br>
// TASKLOOP DIRECTIVE<br>
#pragma omp taskloop<br>
for (int i = 0; i < 10; ++i) {<br>
@@ -7636,6 +8111,12 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
;<br>
}<br>
+#pragma omp taskloop<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'taskloop' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
<br>
// DISTRIBUTE DIRECTIVE<br>
#pragma omp target<br>
@@ -7870,6 +8351,14 @@ void foo() {<br>
for (int i = 0; i < 10; ++i)<br>
++a;<br>
}<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{region cannot be closely nested inside 'distribute' region; perhaps you forget to enclose 'omp distribute parallel for simd' directive into a teams region?}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ++a;<br>
+ }<br>
<br>
// DISTRIBUTE PARALLEL FOR DIRECTIVE<br>
#pragma omp target<br>
@@ -8105,4 +8594,239 @@ void foo() {<br>
#pragma omp target update to(a) // expected-error {{region cannot be nested inside 'target' region}}<br>
++a;<br>
}<br>
+<br>
+// DISTRIBUTE PARALLEL FOR SIMD DIRECTIVE<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp distribute // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp simd // expected-warning {{OpenMP only allows an ordered construct with the simd clause nested in a simd construct}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp section // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp single // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp master // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp critical // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+#pragma omp single<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel for simd // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp parallel sections // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp task // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ {<br>
+ bar();<br>
+ }<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp taskyield // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp barrier // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp taskwait // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp flush // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ bar();<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp atomic // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target parallel // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target parallel for // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ for (int i = 0; i < 10; ++i)<br>
+ ;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp teams // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+ return foo<int>();<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target enter data map(to: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target exit data map(from: a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
+#pragma omp target<br>
+#pragma omp teams<br>
+#pragma omp distribute parallel for simd<br>
+ for (int i = 0; i < 10; ++i) {<br>
+#pragma omp target update to(a) // expected-error {{OpenMP constructs may not be nested inside a simd region}}<br>
+ ++a;<br>
+ }<br>
}<br>
<br>
Modified: cfe/trunk/tools/libclang/<wbr>CIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/<wbr>libclang/CIndex.cpp?rev=<wbr>274530&r1=274529&r2=274530&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/libclang/<wbr>CIndex.cpp (original)<br>
+++ cfe/trunk/tools/libclang/<wbr>CIndex.cpp Tue Jul 5 00:00:15 2016<br>
@@ -1971,6 +1971,8 @@ public:<br>
void VisitOMPDistributeDirective(<wbr>const OMPDistributeDirective *D);<br>
void VisitOMPDistributeParallelForD<wbr>irective(<br>
const OMPDistributeParallelForDirect<wbr>ive *D);<br>
+ void VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ const OMPDistributeParallelForSimdDi<wbr>rective *D);<br>
<br>
private:<br>
void AddDeclarationNameInfo(const Stmt *S);<br>
@@ -2729,6 +2731,11 @@ void EnqueueVisitor::<wbr>VisitOMPDistributeP<br>
VisitOMPLoopDirective(D);<br>
}<br>
<br>
+void EnqueueVisitor::<wbr>VisitOMPDistributeParallelForS<wbr>imdDirective(<br>
+ const OMPDistributeParallelForSimdDi<wbr>rective *D) {<br>
+ VisitOMPLoopDirective(D);<br>
+}<br>
+<br>
void CursorVisitor::<wbr>EnqueueWorkList(<wbr>VisitorWorkList &WL, const Stmt *S) {<br>
EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S)<wbr>;<br>
}<br>
@@ -4847,6 +4854,8 @@ CXString clang_getCursorKindSpelling(<wbr>enu<br>
return cxstring::createRef("<wbr>OMPDistributeDirective");<br>
case CXCursor_<wbr>OMPDistributeParallelForDirect<wbr>ive:<br>
return cxstring::createRef("<wbr>OMPDistributeParallelForDirect<wbr>ive");<br>
+ case CXCursor_<wbr>OMPDistributeParallelForSimdDi<wbr>rective:<br>
+ return cxstring::createRef("<wbr>OMPDistributeParallelForSimdDi<wbr>rective");<br>
case CXCursor_OverloadCandidate:<br>
return cxstring::createRef("<wbr>OverloadCandidate");<br>
case CXCursor_<wbr>TypeAliasTemplateDecl:<br>
<br>
Modified: cfe/trunk/tools/libclang/<wbr>CXCursor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=274530&r1=274529&r2=274530&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/tools/<wbr>libclang/CXCursor.cpp?rev=<wbr>274530&r1=274529&r2=274530&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/tools/libclang/<wbr>CXCursor.cpp (original)<br>
+++ cfe/trunk/tools/libclang/<wbr>CXCursor.cpp Tue Jul 5 00:00:15 2016<br>
@@ -637,6 +637,9 @@ CXCursor cxcursor::MakeCXCursor(const St<br>
case Stmt::<wbr>OMPDistributeParallelForDirect<wbr>iveClass:<br>
K = CXCursor_<wbr>OMPDistributeParallelForDirect<wbr>ive;<br>
break;<br>
+ case Stmt::<wbr>OMPDistributeParallelForSimdDi<wbr>rectiveClass:<br>
+ K = CXCursor_<wbr>OMPDistributeParallelForSimdDi<wbr>rective;<br>
+ break;<br>
}<br>
<br>
CXCursor C = { K, 0, { Parent, S, TU } };<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>