<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>