r255001 - Add parse and sema for OpenMP distribute directive and all its clauses excluding dist_schedule.

Alexey Samsonov via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 8 09:36:31 PST 2015


ASan bootstrap provides an error report as well:

http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/8407/steps/check-clang%20asan/logs/stdio
Please investigate or revert.

On Tue, Dec 8, 2015 at 6:06 AM, NAKAMURA Takumi via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> It crashes on i686-clang. See
> http://bb.pgr.jp/builders/clang-3stage-i686-linux/builds/4055
> Investigating.
>
> #6  0xf7ea482f in operator delete(void*) () from /usr/lib32/libstdc++.so.6
> #7  0x0bef8cce in llvm::DenseMap<clang::VarDecl*,
> llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<clang::VarDecl*>,
> llvm::detail::DenseSetPair<clang::VarDecl*> >::~DenseMap (this=0xf2419d8)
>     at llvm/include/llvm/ADT/DenseMap.h:575
> #8  0x0bef8c86 in llvm::DenseSet<clang::VarDecl*,
> llvm::DenseMapInfo<clang::VarDecl*> >::~DenseSet (this=0xf2419d8)
>     at llvm/include/llvm/ADT/DenseSet.h:39
> #9  0x0cf988a4 in (anonymous
> namespace)::DSAStackTy::SharingMapTy::~SharingMapTy (this=0xf2412c0)
>     at clang/lib/Sema/SemaOpenMP.cpp:95
> #10 0x0cf9e24b in llvm::SmallVectorTemplateBase<(anonymous
> namespace)::DSAStackTy::SharingMapTy, false>::pop_back (this=0xf23fca0)
>     at llvm/include/llvm/ADT/SmallVector.h:245
> #11 0x0cf68ed2 in (anonymous namespace)::DSAStackTy::pop (this=0xf23fca0)
>     at clang/lib/Sema/SemaOpenMP.cpp:163
> #12 0x0cf68a50 in clang::Sema::EndOpenMPDSABlock (this=0xf23e188,
>     CurDirective=0xf2901a0)
>     at clang/lib/Sema/SemaOpenMP.cpp:957
> #13 0x0c603bf0 in
> clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
>     this=0xf25d3c0, StandAloneAllowed=false)
>     at clang/lib/Parse/ParseOpenMP.cpp:314
> #14 0x0c61c641 in
> clang::Parser::ParseStatementOrDeclarationAfterAttributes (
>     this=0xf25d3c0, Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0,
>     Attrs=...)
>     at clang/lib/Parse/ParseStmt.cpp:349
> #15 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
> (this=0xf25d3c0,
>     Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0)
>     at clang/lib/Parse/ParseStmt.cpp:106
> #16 0x0c61b064 in clang::Parser::ParseStatement (this=0xf25d3c0,
>     TrailingElseLoc=0x0)
>     at clang/lib/Parse/ParseStmt.cpp:42
> #17 0x0c6039ff in
> clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
>     this=0xf25d3c0, StandAloneAllowed=false)
>     at clang/lib/Parse/ParseOpenMP.cpp:305
> #18 0x0c61c641 in
> clang::Parser::ParseStatementOrDeclarationAfterAttributes (
>     this=0xf25d3c0, Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0,
>     Attrs=...)
>     at clang/lib/Parse/ParseStmt.cpp:349
> #19 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
> (this=0xf25d3c0,
>     Stmts=..., OnlyStatement=true, TrailingElseLoc=0x0)
>     at clang/lib/Parse/ParseStmt.cpp:106
> #20 0x0c61b064 in clang::Parser::ParseStatement (this=0xf25d3c0,
>     TrailingElseLoc=0x0)
>     at clang/lib/Parse/ParseStmt.cpp:42
> #21 0x0c6039ff in
> clang::Parser::ParseOpenMPDeclarativeOrExecutableDirective (
>     this=0xf25d3c0, StandAloneAllowed=true)
>     at clang/lib/Parse/ParseOpenMP.cpp:305
> #22 0x0c61c641 in
> clang::Parser::ParseStatementOrDeclarationAfterAttributes (
>     this=0xf25d3c0, Stmts=..., OnlyStatement=false, TrailingElseLoc=0x0,
>     Attrs=...)
>     at clang/lib/Parse/ParseStmt.cpp:349
> #23 0x0c61b1e9 in clang::Parser::ParseStatementOrDeclaration
> (this=0xf25d3c0,
>     Stmts=..., OnlyStatement=false, TrailingElseLoc=0x0)
>     at clang/lib/Parse/ParseStmt.cpp:106
> #24 0x0c625955 in clang::Parser::ParseCompoundStatementBody
> (this=0xf25d3c0,
>     isStmtExpr=false)
>     at clang/lib/Parse/ParseStmt.cpp:968
> #25 0x0c62692d in clang::Parser::ParseFunctionStatementBody
> (this=0xf25d3c0,
>     Decl=0xf27a948, BodyScope=...)
>     at clang/lib/Parse/ParseStmt.cpp:1914
> #26 0x0c53f639 in clang::Parser::ParseFunctionDefinition (this=0xf25d3c0,
>     D=..., TemplateInfo=..., LateParsedAttrs=0xffffb630)
>     at clang/lib/Parse/Parser.cpp:1147
> #27 0x0c56c1ca in clang::Parser::ParseDeclGroup (this=0xf25d3c0, DS=...,
>     Context=0, DeclEnd=0x0, FRI=0x0)
>     at clang/lib/Parse/ParseDecl.cpp:1757
> #28 0x0c53e13b in clang::Parser::ParseDeclOrFunctionDefInternal (
>     this=0xf25d3c0, attrs=..., DS=..., AS=clang::AS_none)
>     at clang/lib/Parse/Parser.cpp:927
> #29 0x0c53d527 in clang::Parser::ParseDeclarationOrFunctionDefinition (
>     this=0xf25d3c0, attrs=..., DS=0x0, AS=clang::AS_none)
>     at clang/lib/Parse/Parser.cpp:943
> #30 0x0c53c9c4 in clang::Parser::ParseExternalDeclaration (this=0xf25d3c0,
>     attrs=..., DS=0x0)
>     at clang/lib/Parse/Parser.cpp:801
> #31 0x0c53b4af in clang::Parser::ParseTopLevelDecl (this=0xf25d3c0,
> Result=...)
>     at clang/lib/Parse/Parser.cpp:593
> #32 0x0c535b0d in clang::ParseAST (S=..., PrintStats=false,
>     SkipFunctionBodies=false)
>     at clang/lib/Parse/ParseAST.cpp:161
> #33 0x0b3bec76 in clang::ASTFrontendAction::ExecuteAction (this=0xf200980)
>     at clang/lib/Frontend/FrontendAction.cpp:538
> #34 0x0b3be581 in clang::FrontendAction::Execute (this=0xf200980)
>     at clang/lib/Frontend/FrontendAction.cpp:439
> #35 0x0b355071 in clang::CompilerInstance::ExecuteAction (this=0xf1ff128,
>     Act=...)
>     at clang/lib/Frontend/CompilerInstance.cpp:841
> #36 0x0b52d118 in clang::ExecuteCompilerInvocation (Clang=0xf1ff128)
>     at clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222
> #37 0x086e8734 in cc1_main (Argv=...,
>     Argv0=0xffffd7c0 "/home/tnakamura/llvm/2-32/bin/clang",
>     MainAddr=0x86d7820 <GetExecutablePath(char const*, bool)>)
>     at clang/tools/driver/cc1_main.cpp:116
> #38 0x086d9823 in ExecuteCC1Tool (argv=..., Tool=...)
>     at clang/tools/driver/driver.cpp:301
> #39 0x086d8316 in main (argc_=8, argv_=0xffffd684)
>     at clang/tools/driver/driver.cpp:366
>
>
> On Tue, Dec 8, 2015 at 1:24 PM Carlo Bertolli via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: cbertol
>> Date: Mon Dec  7 22:21:03 2015
>> New Revision: 255001
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=255001&view=rev
>> Log:
>> Add parse and sema for OpenMP distribute directive and all its clauses
>> excluding dist_schedule.
>>
>> Added:
>>     cfe/trunk/test/OpenMP/distribute_ast_print.cpp
>>     cfe/trunk/test/OpenMP/distribute_collapse_messages.cpp
>>     cfe/trunk/test/OpenMP/distribute_firstprivate_messages.cpp
>>     cfe/trunk/test/OpenMP/distribute_private_messages.cpp
>> Modified:
>>     cfe/trunk/include/clang-c/Index.h
>>     cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>     cfe/trunk/include/clang/AST/StmtOpenMP.h
>>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>     cfe/trunk/include/clang/Basic/OpenMPKinds.def
>>     cfe/trunk/include/clang/Basic/OpenMPKinds.h
>>     cfe/trunk/include/clang/Basic/StmtNodes.td
>>     cfe/trunk/include/clang/Sema/Sema.h
>>     cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>>     cfe/trunk/lib/AST/StmtOpenMP.cpp
>>     cfe/trunk/lib/AST/StmtPrinter.cpp
>>     cfe/trunk/lib/AST/StmtProfile.cpp
>>     cfe/trunk/lib/Basic/OpenMPKinds.cpp
>>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>>     cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
>>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>>     cfe/trunk/lib/Parse/ParseOpenMP.cpp
>>     cfe/trunk/lib/Sema/SemaOpenMP.cpp
>>     cfe/trunk/lib/Sema/TreeTransform.h
>>     cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>>     cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>>     cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>>     cfe/trunk/test/OpenMP/nesting_of_regions.cpp
>>     cfe/trunk/tools/libclang/CIndex.cpp
>>     cfe/trunk/tools/libclang/CXCursor.cpp
>>
>> Modified: cfe/trunk/include/clang-c/Index.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang-c/Index.h (original)
>> +++ cfe/trunk/include/clang-c/Index.h Mon Dec  7 22:21:03 2015
>> @@ -2264,7 +2264,11 @@ enum CXCursorKind {
>>     */
>>    CXCursor_OMPTaskLoopSimdDirective      = 259,
>>
>> -  CXCursor_LastStmt                      =
>> CXCursor_OMPTaskLoopSimdDirective,
>> +   /** \brief OpenMP distribute directive.
>> +   */
>> +  CXCursor_OMPDistributeDirective        = 260,
>> +
>> +  CXCursor_LastStmt                      =
>> CXCursor_OMPDistributeDirective,
>>
>>    /**
>>     * \brief Cursor that represents the translation unit itself.
>>
>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Dec  7 22:21:03
>> 2015
>> @@ -2439,6 +2439,9 @@ DEF_TRAVERSE_STMT(OMPTaskLoopDirective,
>>  DEF_TRAVERSE_STMT(OMPTaskLoopSimdDirective,
>>                    { TRY_TO(TraverseOMPExecutableDirective(S)); })
>>
>> +DEF_TRAVERSE_STMT(OMPDistributeDirective,
>> +                  { TRY_TO(TraverseOMPExecutableDirective(S)); })
>> +
>>  // OpenMP clauses.
>>  template <typename Derived>
>>  bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
>>
>> Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original)
>> +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Mon Dec  7 22:21:03 2015
>> @@ -424,43 +424,50 @@ protected:
>>    void setInc(Expr *Inc) { *std::next(child_begin(), IncOffset) = Inc; }
>>    void setIsLastIterVariable(Expr *IL) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), IsLastIterVariableOffset) = IL;
>>    }
>>    void setLowerBoundVariable(Expr *LB) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), LowerBoundVariableOffset) = LB;
>>    }
>>    void setUpperBoundVariable(Expr *UB) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), UpperBoundVariableOffset) = UB;
>>    }
>>    void setStrideVariable(Expr *ST) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), StrideVariableOffset) = ST;
>>    }
>>    void setEnsureUpperBound(Expr *EUB) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), EnsureUpperBoundOffset) = EUB;
>>    }
>>    void setNextLowerBound(Expr *NLB) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), NextLowerBoundOffset) = NLB;
>>    }
>>    void setNextUpperBound(Expr *NUB) {
>>      assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
>> -            isOpenMPTaskLoopDirective(getDirectiveKind())) &&
>> +            isOpenMPTaskLoopDirective(getDirectiveKind()) ||
>> +            isOpenMPDistributeDirective(getDirectiveKind())) &&
>>             "expected worksharing loop directive");
>>      *std::next(child_begin(), NextUpperBoundOffset) = NUB;
>>    }
>> @@ -683,7 +690,8 @@ public:
>>             T->getStmtClass() == OMPParallelForDirectiveClass ||
>>             T->getStmtClass() == OMPParallelForSimdDirectiveClass ||
>>             T->getStmtClass() == OMPTaskLoopDirectiveClass ||
>> -           T->getStmtClass() == OMPTaskLoopSimdDirectiveClass;
>> +           T->getStmtClass() == OMPTaskLoopSimdDirectiveClass ||
>> +           T->getStmtClass() == OMPDistributeDirectiveClass;
>>    }
>>  };
>>
>> @@ -2333,6 +2341,73 @@ public:
>>    }
>>  };
>>
>> +/// \brief This represents '#pragma omp distribute' directive.
>> +///
>> +/// \code
>> +/// #pragma omp distribute private(a,b)
>> +/// \endcode
>> +/// In this example directive '#pragma omp distribute' has clauses
>> 'private'
>> +/// with the variables 'a' and 'b'
>> +///
>> +class OMPDistributeDirective : public OMPLoopDirective {
>> +  friend class ASTStmtReader;
>> +
>> +  /// \brief Build directive with the given start and end location.
>> +  ///
>> +  /// \param StartLoc Starting location of the directive kind.
>> +  /// \param EndLoc Ending location of the directive.
>> +  /// \param CollapsedNum Number of collapsed nested loops.
>> +  /// \param NumClauses Number of clauses.
>> +  ///
>> +  OMPDistributeDirective(SourceLocation StartLoc, SourceLocation EndLoc,
>> +                         unsigned CollapsedNum, unsigned NumClauses)
>> +      : OMPLoopDirective(this, OMPDistributeDirectiveClass,
>> OMPD_distribute,
>> +                         StartLoc, EndLoc, CollapsedNum, NumClauses)
>> +        {}
>> +
>> +  /// \brief Build an empty directive.
>> +  ///
>> +  /// \param CollapsedNum Number of collapsed nested loops.
>> +  /// \param NumClauses Number of clauses.
>> +  ///
>> +  explicit OMPDistributeDirective(unsigned CollapsedNum, unsigned
>> NumClauses)
>> +      : OMPLoopDirective(this, OMPDistributeDirectiveClass,
>> OMPD_distribute,
>> +                         SourceLocation(), SourceLocation(),
>> CollapsedNum,
>> +                         NumClauses)
>> +        {}
>> +
>> +public:
>> +  /// \brief Creates directive with a list of \a Clauses.
>> +  ///
>> +  /// \param C AST context.
>> +  /// \param StartLoc Starting location of the directive kind.
>> +  /// \param EndLoc Ending Location of the directive.
>> +  /// \param CollapsedNum Number of collapsed loops.
>> +  /// \param Clauses List of clauses.
>> +  /// \param AssociatedStmt Statement, associated with the directive.
>> +  /// \param Exprs Helper expressions for CodeGen.
>> +    ///
>> +  static OMPDistributeDirective *
>> +  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation
>> EndLoc,
>> +         unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
>> +         Stmt *AssociatedStmt, const HelperExprs &Exprs);
>> +
>> +  /// \brief Creates an empty directive with the place
>> +  /// for \a NumClauses clauses.
>> +  ///
>> +  /// \param C AST context.
>> +  /// \param CollapsedNum Number of collapsed nested loops.
>> +  /// \param NumClauses Number of clauses.
>> +  ///
>> +  static OMPDistributeDirective *CreateEmpty(const ASTContext &C,
>> +                                             unsigned NumClauses,
>> +                                             unsigned CollapsedNum,
>> EmptyShell);
>> +
>> +  static bool classof(const Stmt *T) {
>> +    return T->getStmtClass() == OMPDistributeDirectiveClass;
>> +  }
>> +};
>> +
>>  } // end namespace clang
>>
>>  #endif
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Dec  7
>> 22:21:03 2015
>> @@ -7801,7 +7801,8 @@ def err_omp_prohibited_region : Error<
>>    "region cannot be%select{| closely}0 nested inside '%1' region"
>>    "%select{|; perhaps you forget to enclose 'omp %3' directive into a
>> parallel region?|"
>>    "; perhaps you forget to enclose 'omp %3' directive into a for or a
>> parallel for region with 'ordered' clause?|"
>> -  "; perhaps you forget to enclose 'omp %3' directive into a target
>> region?}2">;
>> +  "; perhaps you forget to enclose 'omp %3' directive into a target
>> region?|"
>> +  "; perhaps you forget to enclose 'omp %3' directive into a teams
>> region?}2">;
>>  def err_omp_prohibited_region_simd : Error<
>>    "OpenMP constructs may not be nested inside a simd region">;
>>  def err_omp_prohibited_region_atomic : Error<
>> @@ -7920,6 +7921,12 @@ def err_omp_wrong_ordered_loop_count : E
>>    "the parameter of the 'ordered' clause must be greater than or equal
>> to the parameter of the 'collapse' clause">;
>>  def note_collapse_loop_count : Note<
>>    "parameter of the 'collapse' clause">;
>> +def err_omp_firstprivate_distribute_private_teams : Error<
>> +  "private variable in '#pragma omp teams' cannot be firstprivate in
>> '#pragma omp distribute'">;
>> +def err_omp_firstprivate_and_lastprivate_in_distribute : Error<
>> +  "lastprivate variable cannot be firstprivate in '#pragma omp
>> distribute'">;
>> +def err_omp_firstprivate_distribute_in_teams_reduction : Error<
>> +  "reduction variable in '#pragma omp teams' cannot be firstprivate in
>> '#pragma omp distribute'">;
>>  } // end of OpenMP category
>>
>>  let CategoryName = "Related Result Type Issue" in {
>>
>> Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Mon Dec  7 22:21:03 2015
>> @@ -75,6 +75,9 @@
>>  #ifndef OPENMP_TASKLOOP_SIMD_CLAUSE
>>  #  define OPENMP_TASKLOOP_SIMD_CLAUSE(Name)
>>  #endif
>> +#ifndef OPENMP_DISTRIBUTE_CLAUSE
>> +#define OPENMP_DISTRIBUTE_CLAUSE(Name)
>> +#endif
>>  #ifndef OPENMP_DEFAULT_KIND
>>  #  define OPENMP_DEFAULT_KIND(Name)
>>  #endif
>> @@ -123,6 +126,7 @@ OPENMP_DIRECTIVE_EXT(for_simd, "for simd
>>  OPENMP_DIRECTIVE_EXT(cancellation_point, "cancellation point")
>>  OPENMP_DIRECTIVE(taskloop)
>>  OPENMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd")
>> +OPENMP_DIRECTIVE(distribute)
>>
>>  // OpenMP clauses.
>>  OPENMP_CLAUSE(if, OMPIfClause)
>> @@ -388,6 +392,12 @@ OPENMP_TASKLOOP_SIMD_CLAUSE(simdlen)
>>  OPENMP_TASKLOOP_SIMD_CLAUSE(grainsize)
>>  OPENMP_TASKLOOP_SIMD_CLAUSE(nogroup)
>>
>> +// Clauses allowed for OpenMP directive 'distribute'
>> +OPENMP_DISTRIBUTE_CLAUSE(private)
>> +OPENMP_DISTRIBUTE_CLAUSE(firstprivate)
>> +OPENMP_DISTRIBUTE_CLAUSE(lastprivate)
>> +OPENMP_DISTRIBUTE_CLAUSE(collapse)
>> +
>>  #undef OPENMP_TASKLOOP_SIMD_CLAUSE
>>  #undef OPENMP_TASKLOOP_CLAUSE
>>  #undef OPENMP_LINEAR_KIND
>> @@ -415,3 +425,4 @@ OPENMP_TASKLOOP_SIMD_CLAUSE(nogroup)
>>  #undef OPENMP_FOR_CLAUSE
>>  #undef OPENMP_FOR_SIMD_CLAUSE
>>  #undef OPENMP_MAP_KIND
>> +#undef OPENMP_DISTRIBUTE_CLAUSE
>>
>> Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/OpenMPKinds.h (original)
>> +++ cfe/trunk/include/clang/Basic/OpenMPKinds.h Mon Dec  7 22:21:03 2015
>> @@ -141,6 +141,13 @@ bool isOpenMPTeamsDirective(OpenMPDirect
>>  /// otherwise - false.
>>  bool isOpenMPSimdDirective(OpenMPDirectiveKind DKind);
>>
>> +/// \brief Checks if the specified directive is a distribute directive.
>> +/// \param DKind Specified directive.
>> +/// \return true - the directive is a distribute-directive like 'omp
>> +/// distribute',
>> +/// otherwise - false.
>> +bool isOpenMPDistributeDirective(OpenMPDirectiveKind DKind);
>> +
>>  /// \brief Checks if the specified clause is one of private clauses like
>>  /// 'private', 'firstprivate', 'reduction' etc..
>>  /// \param Kind Clause kind.
>>
>> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
>> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Mon Dec  7 22:21:03 2015
>> @@ -221,4 +221,4 @@ def OMPCancellationPointDirective : DStm
>>  def OMPCancelDirective : DStmt<OMPExecutableDirective>;
>>  def OMPTaskLoopDirective : DStmt<OMPLoopDirective>;
>>  def OMPTaskLoopSimdDirective : DStmt<OMPLoopDirective>;
>> -
>> +def OMPDistributeDirective : DStmt<OMPLoopDirective>;
>>
>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Dec  7 22:21:03 2015
>> @@ -7961,6 +7961,12 @@ public:
>>        ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation
>> StartLoc,
>>        SourceLocation EndLoc,
>>        llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA);
>> +  /// \brief Called on well-formed '\#pragma omp distribute' after
>> parsing
>> +  /// of the associated statement.
>> +  StmtResult ActOnOpenMPDistributeDirective(
>> +      ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation
>> StartLoc,
>> +      SourceLocation EndLoc,
>> +      llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA);
>>
>>    OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
>>                                           Expr *Expr,
>>
>> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
>> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Mon Dec  7
>> 22:21:03 2015
>> @@ -1449,6 +1449,7 @@ namespace clang {
>>        STMT_OMP_CANCEL_DIRECTIVE,
>>        STMT_OMP_TASKLOOP_DIRECTIVE,
>>        STMT_OMP_TASKLOOP_SIMD_DIRECTIVE,
>> +      STMT_OMP_DISTRIBUTE_DIRECTIVE,
>>        EXPR_OMP_ARRAY_SECTION,
>>
>>        // ARC
>>
>> Modified: cfe/trunk/lib/AST/StmtOpenMP.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/StmtOpenMP.cpp (original)
>> +++ cfe/trunk/lib/AST/StmtOpenMP.cpp Mon Dec  7 22:21:03 2015
>> @@ -832,3 +832,48 @@ OMPTaskLoopSimdDirective::CreateEmpty(co
>>    return new (Mem) OMPTaskLoopSimdDirective(CollapsedNum, NumClauses);
>>  }
>>
>> +OMPDistributeDirective *OMPDistributeDirective::Create(
>> +    const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
>> +    unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses, Stmt
>> *AssociatedStmt,
>> +    const HelperExprs &Exprs) {
>> +  unsigned Size =
>> llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective),
>> +                                           llvm::alignOf<OMPClause *>());
>> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
>> +                         sizeof(Stmt *) *
>> +                             numLoopChildren(CollapsedNum,
>> OMPD_distribute));
>> +  OMPDistributeDirective *Dir = new (Mem)
>> +      OMPDistributeDirective(StartLoc, EndLoc, CollapsedNum,
>> Clauses.size());
>> +  Dir->setClauses(Clauses);
>> +  Dir->setAssociatedStmt(AssociatedStmt);
>> +  Dir->setIterationVariable(Exprs.IterationVarRef);
>> +  Dir->setLastIteration(Exprs.LastIteration);
>> +  Dir->setCalcLastIteration(Exprs.CalcLastIteration);
>> +  Dir->setPreCond(Exprs.PreCond);
>> +  Dir->setCond(Exprs.Cond);
>> +  Dir->setInit(Exprs.Init);
>> +  Dir->setInc(Exprs.Inc);
>> +  Dir->setIsLastIterVariable(Exprs.IL);
>> +  Dir->setLowerBoundVariable(Exprs.LB);
>> +  Dir->setUpperBoundVariable(Exprs.UB);
>> +  Dir->setStrideVariable(Exprs.ST);
>> +  Dir->setEnsureUpperBound(Exprs.EUB);
>> +  Dir->setNextLowerBound(Exprs.NLB);
>> +  Dir->setNextUpperBound(Exprs.NUB);
>> +  Dir->setCounters(Exprs.Counters);
>> +  Dir->setPrivateCounters(Exprs.PrivateCounters);
>> +  Dir->setInits(Exprs.Inits);
>> +  Dir->setUpdates(Exprs.Updates);
>> +  Dir->setFinals(Exprs.Finals);
>> +  return Dir;
>> +}
>> +
>> +OMPDistributeDirective *
>> +OMPDistributeDirective::CreateEmpty(const ASTContext &C, unsigned
>> NumClauses,
>> +                                    unsigned CollapsedNum, EmptyShell) {
>> +  unsigned Size =
>> llvm::RoundUpToAlignment(sizeof(OMPDistributeDirective),
>> +                                           llvm::alignOf<OMPClause *>());
>> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
>> +                         sizeof(Stmt *) *
>> +                             numLoopChildren(CollapsedNum,
>> OMPD_distribute));
>> +  return new (Mem) OMPDistributeDirective(CollapsedNum, NumClauses);
>> +}
>>
>> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
>> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Mon Dec  7 22:21:03 2015
>> @@ -1057,6 +1057,11 @@ void StmtPrinter::VisitOMPTaskLoopSimdDi
>>    PrintOMPExecutableDirective(Node);
>>  }
>>
>> +void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective
>> *Node) {
>> +  Indent() << "#pragma omp distribute ";
>> +  PrintOMPExecutableDirective(Node);
>> +}
>> +
>>
>>  //===----------------------------------------------------------------------===//
>>  //  Expr printing methods.
>>
>>  //===----------------------------------------------------------------------===//
>>
>> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
>> +++ cfe/trunk/lib/AST/StmtProfile.cpp Mon Dec  7 22:21:03 2015
>> @@ -599,6 +599,11 @@ void StmtProfiler::VisitOMPTaskLoopSimdD
>>    VisitOMPLoopDirective(S);
>>  }
>>
>> +void StmtProfiler::VisitOMPDistributeDirective(
>> +    const OMPDistributeDirective *S) {
>> +  VisitOMPLoopDirective(S);
>> +}
>> +
>>  void StmtProfiler::VisitExpr(const Expr *S) {
>>    VisitStmt(S);
>>  }
>>
>> Modified: cfe/trunk/lib/Basic/OpenMPKinds.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/OpenMPKinds.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/OpenMPKinds.cpp (original)
>> +++ cfe/trunk/lib/Basic/OpenMPKinds.cpp Mon Dec  7 22:21:03 2015
>> @@ -436,6 +436,16 @@ bool clang::isAllowedClauseForDirective(
>>        break;
>>      }
>>      break;
>> +  case OMPD_distribute:
>> +    switch (CKind) {
>> +#define OPENMP_DISTRIBUTE_CLAUSE(Name)
>>        \
>> +  case OMPC_##Name:
>>       \
>> +    return true;
>> +#include "clang/Basic/OpenMPKinds.def"
>> +    default:
>> +      break;
>> +    }
>> +    break;
>>    case OMPD_unknown:
>>    case OMPD_threadprivate:
>>    case OMPD_section:
>> @@ -455,7 +465,8 @@ bool clang::isOpenMPLoopDirective(OpenMP
>>    return DKind == OMPD_simd || DKind == OMPD_for || DKind ==
>> OMPD_for_simd ||
>>           DKind == OMPD_parallel_for || DKind == OMPD_parallel_for_simd ||
>>           DKind == OMPD_taskloop ||
>> -         DKind == OMPD_taskloop_simd; // TODO add next directives.
>> +         DKind == OMPD_taskloop_simd ||
>> +         DKind == OMPD_distribute; // TODO add next directives.
>>  }
>>
>>  bool clang::isOpenMPWorksharingDirective(OpenMPDirectiveKind DKind) {
>> @@ -490,6 +501,10 @@ bool clang::isOpenMPSimdDirective(OpenMP
>>           DKind == OMPD_taskloop_simd; // TODO add next directives.
>>  }
>>
>> +bool clang::isOpenMPDistributeDirective(OpenMPDirectiveKind Kind) {
>> +  return Kind == OMPD_distribute; // TODO add next directives.
>> +}
>> +
>>  bool clang::isOpenMPPrivate(OpenMPClauseKind Kind) {
>>    return Kind == OMPC_private || Kind == OMPC_firstprivate ||
>>           Kind == OMPC_lastprivate || Kind == OMPC_linear ||
>>
>> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Mon Dec  7 22:21:03 2015
>> @@ -262,6 +262,9 @@ void CodeGenFunction::EmitStmt(const Stm
>>    case Stmt::OMPTaskLoopSimdDirectiveClass:
>>      EmitOMPTaskLoopSimdDirective(cast<OMPTaskLoopSimdDirective>(*S));
>>      break;
>> +case Stmt::OMPDistributeDirectiveClass:
>> +    EmitOMPDistributeDirective(cast<OMPDistributeDirective>(*S));
>> +       break;
>>    }
>>  }
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp Mon Dec  7 22:21:03 2015
>> @@ -2045,6 +2045,11 @@ void CodeGenFunction::EmitOMPFlushDirect
>>    }(), S.getLocStart());
>>  }
>>
>> +void CodeGenFunction::EmitOMPDistributeDirective(
>> +    const OMPDistributeDirective &S) {
>> +  llvm_unreachable("CodeGen for 'omp distribute' is not supported yet.");
>> +}
>> +
>>  static llvm::Function *emitOutlinedOrderedFunction(CodeGenModule &CGM,
>>                                                     const CapturedStmt
>> *S) {
>>    CodeGenFunction CGF(CGM, /*suppressNewContext=*/true);
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Dec  7 22:21:03 2015
>> @@ -2339,6 +2339,7 @@ public:
>>    void EmitOMPCancelDirective(const OMPCancelDirective &S);
>>    void EmitOMPTaskLoopDirective(const OMPTaskLoopDirective &S);
>>    void EmitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective &S);
>> +  void EmitOMPDistributeDirective(const OMPDistributeDirective &S);
>>
>>    /// \brief Emit inner loop of the worksharing/simd construct.
>>    ///
>>
>> Modified: cfe/trunk/lib/Parse/ParseOpenMP.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Parse/ParseOpenMP.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseOpenMP.cpp Mon Dec  7 22:21:03 2015
>> @@ -140,6 +140,7 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
>>    case OMPD_target_data:
>>    case OMPD_taskloop:
>>    case OMPD_taskloop_simd:
>> +  case OMPD_distribute:
>>      Diag(Tok, diag::err_omp_unexpected_directive)
>>          << getOpenMPDirectiveName(DKind);
>>      break;
>> @@ -160,7 +161,8 @@ Parser::DeclGroupPtrTy Parser::ParseOpen
>>  ///         'parallel for' | 'parallel sections' | 'task' | 'taskyield' |
>>  ///         'barrier' | 'taskwait' | 'flush' | 'ordered' | 'atomic' |
>>  ///         'for simd' | 'parallel for simd' | 'target' | 'target data' |
>> -///         'taskgroup' | 'teams' | 'taskloop' | 'taskloop simd' {clause}
>> +///         'taskgroup' | 'teams' | 'taskloop' | 'taskloop simd'
>> {clause} |
>> +///         'distribute'
>>  ///         annot_pragma_openmp_end
>>  ///
>>  StmtResult
>> @@ -237,7 +239,8 @@ Parser::ParseOpenMPDeclarativeOrExecutab
>>    case OMPD_taskgroup:
>>    case OMPD_target_data:
>>    case OMPD_taskloop:
>> -  case OMPD_taskloop_simd: {
>> +  case OMPD_taskloop_simd:
>> +  case OMPD_distribute: {
>>      ConsumeToken();
>>      // Parse directive name of the 'critical' directive if any.
>>      if (DKind == OMPD_critical) {
>>
>> Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Mon Dec  7 22:21:03 2015
>> @@ -1568,6 +1568,14 @@ void Sema::ActOnOpenMPRegionStart(OpenMP
>>                               Params);
>>      break;
>>    }
>> +  case OMPD_distribute: {
>> +    Sema::CapturedParamNameType Params[] = {
>> +        std::make_pair(StringRef(), QualType()) // __context with shared
>> vars
>> +    };
>> +    ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope,
>> CR_OpenMP,
>> +                             Params);
>> +    break;
>> +  }
>>    case OMPD_threadprivate:
>>    case OMPD_taskyield:
>>    case OMPD_barrier:
>> @@ -1652,6 +1660,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | parallel         | cancel          | !
>>       |
>>    // | parallel         | taskloop        | *
>>       |
>>    // | parallel         | taskloop simd   | *
>>       |
>> +  // | parallel         | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | for              | parallel        | *
>>       |
>>    // | for              | for             | +
>>       |
>> @@ -1680,6 +1689,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | for              | cancel          | !
>>       |
>>    // | for              | taskloop        | *
>>       |
>>    // | for              | taskloop simd   | *
>>       |
>> +  // | for              | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | master           | parallel        | *
>>       |
>>    // | master           | for             | +
>>       |
>> @@ -1708,6 +1718,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | master           | cancel          |
>>       |
>>    // | master           | taskloop        | *
>>       |
>>    // | master           | taskloop simd   | *
>>       |
>> +  // | master           | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | critical         | parallel        | *
>>       |
>>    // | critical         | for             | +
>>       |
>> @@ -1735,6 +1746,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | critical         | cancel          |
>>       |
>>    // | critical         | taskloop        | *
>>       |
>>    // | critical         | taskloop simd   | *
>>       |
>> +  // | critical         | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | simd             | parallel        |
>>       |
>>    // | simd             | for             |
>>       |
>> @@ -1763,6 +1775,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | simd             | cancel          |
>>       |
>>    // | simd             | taskloop        |
>>       |
>>    // | simd             | taskloop simd   |
>>       |
>> +  // | simd             | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | for simd         | parallel        |
>>       |
>>    // | for simd         | for             |
>>       |
>> @@ -1791,6 +1804,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | for simd         | cancel          |
>>       |
>>    // | for simd         | taskloop        |
>>       |
>>    // | for simd         | taskloop simd   |
>>       |
>> +  // | for simd         | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | parallel for simd| parallel        |
>>       |
>>    // | parallel for simd| for             |
>>       |
>> @@ -1819,6 +1833,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | parallel for simd| cancel          |
>>       |
>>    // | parallel for simd| taskloop        |
>>       |
>>    // | parallel for simd| taskloop simd   |
>>       |
>> +  // | parallel for simd| distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | sections         | parallel        | *
>>       |
>>    // | sections         | for             | +
>>       |
>> @@ -1847,6 +1862,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | sections         | cancel          | !
>>       |
>>    // | sections         | taskloop        | *
>>       |
>>    // | sections         | taskloop simd   | *
>>       |
>> +  // | sections         | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | section          | parallel        | *
>>       |
>>    // | section          | for             | +
>>       |
>> @@ -1875,6 +1891,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | section          | cancel          | !
>>       |
>>    // | section          | taskloop        | *
>>       |
>>    // | section          | taskloop simd   | *
>>       |
>> +  // | section          | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | single           | parallel        | *
>>       |
>>    // | single           | for             | +
>>       |
>> @@ -1903,6 +1920,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | single           | cancel          |
>>       |
>>    // | single           | taskloop        | *
>>       |
>>    // | single           | taskloop simd   | *
>>       |
>> +  // | single           | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | parallel for     | parallel        | *
>>       |
>>    // | parallel for     | for             | +
>>       |
>> @@ -1931,6 +1949,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | parallel for     | cancel          | !
>>       |
>>    // | parallel for     | taskloop        | *
>>       |
>>    // | parallel for     | taskloop simd   | *
>>       |
>> +  // | parallel for     | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | parallel sections| parallel        | *
>>       |
>>    // | parallel sections| for             | +
>>       |
>> @@ -1959,6 +1978,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | parallel sections| cancel          | !
>>       |
>>    // | parallel sections| taskloop        | *
>>       |
>>    // | parallel sections| taskloop simd   | *
>>       |
>> +  // | parallel sections| distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | task             | parallel        | *
>>       |
>>    // | task             | for             | +
>>       |
>> @@ -1987,6 +2007,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | task             | cancel          | !
>>       |
>>    // | task             | taskloop        | *
>>       |
>>    // | task             | taskloop simd   | *
>>       |
>> +  // | task             | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | ordered          | parallel        | *
>>       |
>>    // | ordered          | for             | +
>>       |
>> @@ -2015,6 +2036,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | ordered          | cancel          |
>>       |
>>    // | ordered          | taskloop        | *
>>       |
>>    // | ordered          | taskloop simd   | *
>>       |
>> +  // | ordered          | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | atomic           | parallel        |
>>       |
>>    // | atomic           | for             |
>>       |
>> @@ -2043,6 +2065,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | atomic           | cancel          |
>>       |
>>    // | atomic           | taskloop        |
>>       |
>>    // | atomic           | taskloop simd   |
>>       |
>> +  // | atomic           | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | target           | parallel        | *
>>       |
>>    // | target           | for             | *
>>       |
>> @@ -2071,6 +2094,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | target           | cancel          |
>>       |
>>    // | target           | taskloop        | *
>>       |
>>    // | target           | taskloop simd   | *
>>       |
>> +  // | target           | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | teams            | parallel        | *
>>       |
>>    // | teams            | for             | +
>>       |
>> @@ -2099,6 +2123,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // | teams            | cancel          |
>>       |
>>    // | teams            | taskloop        | +
>>       |
>>    // | teams            | taskloop simd   | +
>>       |
>> +  // | teams            | distribute      | !
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | taskloop         | parallel        | *
>>       |
>>    // | taskloop         | for             | +
>>       |
>> @@ -2126,6 +2151,7 @@ static bool CheckNestingOfRegions(Sema &
>>    // |                  | point           |
>>       |
>>    // | taskloop         | cancel          |
>>       |
>>    // | taskloop         | taskloop        | *
>>       |
>> +  // | taskloop         | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    // | taskloop simd    | parallel        |
>>       |
>>    // | taskloop simd    | for             |
>>       |
>> @@ -2154,6 +2180,36 @@ static bool CheckNestingOfRegions(Sema &
>>    // | taskloop simd    | cancel          |
>>       |
>>    // | taskloop simd    | taskloop        |
>>       |
>>    // | taskloop simd    | taskloop simd   |
>>       |
>> +  // | taskloop simd    | distribute      |
>>       |
>> +  //
>> +------------------+-----------------+------------------------------------+
>> +  // | distribute       | parallel        | *
>>       |
>> +  // | distribute       | for             | *
>>       |
>> +  // | distribute       | for simd        | *
>>       |
>> +  // | distribute       | master          | *
>>       |
>> +  // | distribute       | critical        | *
>>       |
>> +  // | distribute       | simd            | *
>>       |
>> +  // | distribute       | sections        | *
>>       |
>> +  // | distribute       | section         | *
>>       |
>> +  // | distribute       | single          | *
>>       |
>> +  // | distribute       | parallel for    | *
>>       |
>> +  // | distribute       |parallel for simd| *
>>       |
>> +  // | distribute       |parallel sections| *
>>       |
>> +  // | distribute       | task            | *
>>       |
>> +  // | distribute       | taskyield       | *
>>       |
>> +  // | distribute       | barrier         | *
>>       |
>> +  // | distribute       | taskwait        | *
>>       |
>> +  // | distribute       | taskgroup       | *
>>       |
>> +  // | distribute       | flush           | *
>>       |
>> +  // | distribute       | ordered         | +
>>       |
>> +  // | distribute       | atomic          | *
>>       |
>> +  // | distribute       | target          |
>>       |
>> +  // | distribute       | teams           |
>>       |
>> +  // | distribute       | cancellation    | +
>>       |
>> +  // |                  | point           |
>>       |
>> +  // | distribute       | cancel          | +
>>       |
>> +  // | distribute       | taskloop        | *
>>       |
>> +  // | distribute       | taskloop simd   | *
>>       |
>> +  // | distribute       | distribute      |
>>       |
>>    //
>> +------------------+-----------------+------------------------------------+
>>    if (Stack->getCurScope()) {
>>      auto ParentRegion = Stack->getParentDirective();
>> @@ -2163,7 +2219,8 @@ static bool CheckNestingOfRegions(Sema &
>>        NoRecommend,
>>        ShouldBeInParallelRegion,
>>        ShouldBeInOrderedRegion,
>> -      ShouldBeInTargetRegion
>> +      ShouldBeInTargetRegion,
>> +      ShouldBeInTeamsRegion
>>      } Recommend = NoRecommend;
>>      if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion !=
>> OMPD_ordered) {
>>        // OpenMP [2.16, Nesting of Regions]
>> @@ -2303,10 +2360,17 @@ static bool CheckNestingOfRegions(Sema &
>>        // distribute, parallel, parallel sections, parallel workshare,
>> and the
>>        // parallel loop and parallel loop SIMD constructs are the only
>> OpenMP
>>        // constructs that can be closely nested in the teams region.
>> -      // TODO: add distribute directive.
>> -      NestingProhibited = !isOpenMPParallelDirective(CurrentRegion);
>> +      NestingProhibited = !isOpenMPParallelDirective(CurrentRegion) &&
>> +                          !isOpenMPDistributeDirective(CurrentRegion);
>>        Recommend = ShouldBeInParallelRegion;
>>      }
>> +    if (!NestingProhibited &&
>> isOpenMPDistributeDirective(CurrentRegion)) {
>> +      // OpenMP 4.5 [2.17 Nesting of Regions]
>> +      // The region associated with the distribute construct must be
>> strictly
>> +      // nested inside a teams region
>> +      NestingProhibited = !isOpenMPTeamsDirective(ParentRegion);
>> +      Recommend = ShouldBeInTeamsRegion;
>> +    }
>>      if (NestingProhibited) {
>>        SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region)
>>            << CloseNesting << getOpenMPDirectiveName(ParentRegion) <<
>> Recommend
>> @@ -2574,6 +2638,10 @@ StmtResult Sema::ActOnOpenMPExecutableDi
>>                                             EndLoc, VarsWithInheritedDSA);
>>      AllowedNameModifiers.push_back(OMPD_taskloop);
>>      break;
>> +  case OMPD_distribute:
>> +    Res = ActOnOpenMPDistributeDirective(ClausesWithImplicit, AStmt,
>> StartLoc,
>> +                                         EndLoc, VarsWithInheritedDSA);
>> +    break;
>>    case OMPD_threadprivate:
>>      llvm_unreachable("OpenMP Directive is not allowed");
>>    case OMPD_unknown:
>> @@ -3402,7 +3470,8 @@ static bool CheckOpenMPIterationSpace(
>>            : OMPC_private;
>>    if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
>>          DVar.CKind != OMPC_threadprivate && DVar.CKind !=
>> PredeterminedCKind) ||
>> -       ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop)
>> &&
>> +       ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop ||
>> +        isOpenMPDistributeDirective(DKind)) &&
>>          !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
>>          DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate &&
>>          DVar.CKind != OMPC_threadprivate)) &&
>> @@ -3441,7 +3510,8 @@ static bool CheckOpenMPIterationSpace(
>>    ResultIterSpace.PreCond = ISC.BuildPreCond(DSA.getCurScope(),
>> For->getCond());
>>    ResultIterSpace.NumIterations = ISC.BuildNumIterations(
>>        DSA.getCurScope(), (isOpenMPWorksharingDirective(DKind) ||
>> -                          isOpenMPTaskLoopDirective(DKind)));
>> +                          isOpenMPTaskLoopDirective(DKind) ||
>> +                          isOpenMPDistributeDirective(DKind)));
>>    ResultIterSpace.CounterVar = ISC.BuildCounterVar();
>>    ResultIterSpace.PrivateCounterVar = ISC.BuildPrivateCounterVar();
>>    ResultIterSpace.CounterInit = ISC.BuildCounterInit();
>> @@ -3749,7 +3819,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>>    QualType VType = LastIteration.get()->getType();
>>    // Build variables passed into runtime, nesessary for worksharing
>> directives.
>>    ExprResult LB, UB, IL, ST, EUB;
>> -  if (isOpenMPWorksharingDirective(DKind) ||
>> isOpenMPTaskLoopDirective(DKind)) {
>> +  if (isOpenMPWorksharingDirective(DKind) ||
>> isOpenMPTaskLoopDirective(DKind) ||
>> +      isOpenMPDistributeDirective(DKind)) {
>>      // Lower bound variable, initialized with zero.
>>      VarDecl *LBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.lb");
>>      LB = buildDeclRefExpr(SemaRef, LBDecl, VType, InitLoc);
>> @@ -3798,7 +3869,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>>      VarDecl *IVDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.iv");
>>      IV = buildDeclRefExpr(SemaRef, IVDecl, VType, InitLoc);
>>      Expr *RHS = (isOpenMPWorksharingDirective(DKind) ||
>> -                 isOpenMPTaskLoopDirective(DKind))
>> +                 isOpenMPTaskLoopDirective(DKind) ||
>> +                 isOpenMPDistributeDirective(DKind))
>>                      ? LB.get()
>>                      : SemaRef.ActOnIntegerConstant(SourceLocation(),
>> 0).get();
>>      Init = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, IV.get(),
>> RHS);
>> @@ -3808,7 +3880,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>>    // Loop condition (IV < NumIterations) or (IV <= UB) for worksharing
>> loops.
>>    SourceLocation CondLoc;
>>    ExprResult Cond =
>> -      (isOpenMPWorksharingDirective(DKind) ||
>> isOpenMPTaskLoopDirective(DKind))
>> +      (isOpenMPWorksharingDirective(DKind) ||
>> +       isOpenMPTaskLoopDirective(DKind) ||
>> isOpenMPDistributeDirective(DKind))
>>            ? SemaRef.BuildBinOp(CurScope, CondLoc, BO_LE, IV.get(),
>> UB.get())
>>            : SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
>>                                 NumIterations.get());
>> @@ -3828,7 +3901,8 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKin
>>    // Increments for worksharing loops (LB = LB + ST; UB = UB + ST).
>>    // Used for directives with static scheduling.
>>    ExprResult NextLB, NextUB;
>> -  if (isOpenMPWorksharingDirective(DKind) ||
>> isOpenMPTaskLoopDirective(DKind)) {
>> +  if (isOpenMPWorksharingDirective(DKind) ||
>> isOpenMPTaskLoopDirective(DKind) ||
>> +      isOpenMPDistributeDirective(DKind)) {
>>      // LB + ST
>>      NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, LB.get(),
>> ST.get());
>>      if (!NextLB.isUsable())
>> @@ -5345,6 +5419,32 @@ StmtResult Sema::ActOnOpenMPTaskLoopSimd
>>                                            NestedLoopCount, Clauses,
>> AStmt, B);
>>  }
>>
>> +StmtResult Sema::ActOnOpenMPDistributeDirective(
>> +    ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
>> +    SourceLocation EndLoc,
>> +    llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
>> +  if (!AStmt)
>> +    return StmtError();
>> +
>> +  assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
>> +  OMPLoopDirective::HelperExprs B;
>> +  // In presence of clause 'collapse' with number of loops, it will
>> +  // define the nested loops number.
>> +  unsigned NestedLoopCount =
>> +      CheckOpenMPLoop(OMPD_distribute, getCollapseNumberExpr(Clauses),
>> +                      nullptr /*ordered not a clause on distribute*/,
>> AStmt,
>> +                      *this, *DSAStack, VarsWithImplicitDSA, B);
>> +  if (NestedLoopCount == 0)
>> +    return StmtError();
>> +
>> +  assert((CurContext->isDependentContext() || B.builtAll()) &&
>> +         "omp for loop exprs were not built");
>> +
>> +  getCurFunction()->setHasBranchProtectedScope();
>> +  return OMPDistributeDirective::Create(Context, StartLoc, EndLoc,
>> +                                        NestedLoopCount, Clauses, AStmt,
>> B);
>> +}
>> +
>>  OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr
>> *Expr,
>>                                               SourceLocation StartLoc,
>>                                               SourceLocation LParenLoc,
>> @@ -6381,6 +6481,49 @@ OMPClause *Sema::ActOnOpenMPFirstprivate
>>            continue;
>>          }
>>        }
>> +
>> +      // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
>> +      // A list item that is private within a teams region must not
>> appear in a
>> +      // firstprivate clause on a distribute construct if any of the
>> distribute
>> +      // regions arising from the distribute construct ever bind to any
>> of the
>> +      // teams regions arising from the teams construct.
>> +      // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
>> +      // A list item that appears in a reduction clause of a teams
>> construct
>> +      // must not appear in a firstprivate clause on a distribute
>> construct if
>> +      // any of the distribute regions arising from the distribute
>> construct
>> +      // ever bind to any of the teams regions arising from the teams
>> construct.
>> +      // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
>> +      // A list item may appear in a firstprivate or lastprivate clause
>> but not
>> +      // both.
>> +      if (CurrDir == OMPD_distribute) {
>> +        DVar = DSAStack->hasInnermostDSA(VD,
>> MatchesAnyClause(OMPC_private),
>> +                                         [](OpenMPDirectiveKind K) ->
>> bool {
>> +                                           return
>> isOpenMPTeamsDirective(K);
>> +                                         },
>> +                                         false);
>> +        if (DVar.CKind == OMPC_private &&
>> isOpenMPTeamsDirective(DVar.DKind)) {
>> +          Diag(ELoc,
>> diag::err_omp_firstprivate_distribute_private_teams);
>> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
>> +          continue;
>> +        }
>> +        DVar = DSAStack->hasInnermostDSA(VD,
>> MatchesAnyClause(OMPC_reduction),
>> +                                         [](OpenMPDirectiveKind K) ->
>> bool {
>> +                                           return
>> isOpenMPTeamsDirective(K);
>> +                                         },
>> +                                         false);
>> +        if (DVar.CKind == OMPC_reduction &&
>> +            isOpenMPTeamsDirective(DVar.DKind)) {
>> +          Diag(ELoc,
>> diag::err_omp_firstprivate_distribute_in_teams_reduction);
>> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
>> +          continue;
>> +        }
>> +        DVar = DSAStack->getTopDSA(VD, false);
>> +        if (DVar.CKind == OMPC_lastprivate) {
>> +          Diag(ELoc,
>> diag::err_omp_firstprivate_and_lastprivate_in_distribute);
>> +          ReportOriginalDSA(*this, DSAStack, VD, DVar);
>> +          continue;
>> +        }
>> +      }
>>      }
>>
>>      // Variably modified types are not supported for tasks.
>> @@ -6577,6 +6720,18 @@ OMPClause *Sema::ActOnOpenMPLastprivateC
>>      if (AssignmentOp.isInvalid())
>>        continue;
>>
>> +    // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
>> +    // A list item may appear in a firstprivate or lastprivate clause
>> but not
>> +    // both.
>> +    if (CurrDir == OMPD_distribute) {
>> +      DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
>> +      if (DVar.CKind == OMPC_firstprivate) {
>> +        Diag(ELoc,
>> diag::err_omp_firstprivate_and_lastprivate_in_distribute);
>> +        ReportOriginalDSA(*this, DSAStack, VD, DVar);
>> +        continue;
>> +      }
>> +    }
>> +
>>      if (TopDVar.CKind != OMPC_firstprivate)
>>        DSAStack->addDSA(VD, DE, OMPC_lastprivate);
>>      Vars.push_back(DE);
>>
>> Modified: cfe/trunk/lib/Sema/TreeTransform.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
>> +++ cfe/trunk/lib/Sema/TreeTransform.h Mon Dec  7 22:21:03 2015
>> @@ -7386,6 +7386,17 @@ StmtResult TreeTransform<Derived>::Trans
>>    return Res;
>>  }
>>
>> +template <typename Derived>
>> +StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
>> +    OMPDistributeDirective *D) {
>> +  DeclarationNameInfo DirName;
>> +  getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName,
>> nullptr,
>> +                                             D->getLocStart());
>> +  StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
>> +  getDerived().getSema().EndOpenMPDSABlock(Res.get());
>> +  return Res;
>> +}
>> +
>>
>>  //===----------------------------------------------------------------------===//
>>  // OpenMP clause transformation
>>
>>  //===----------------------------------------------------------------------===//
>>
>> Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
>> +++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Mon Dec  7 22:21:03 2015
>> @@ -2441,6 +2441,10 @@ void ASTStmtReader::VisitOMPTaskLoopSimd
>>    VisitOMPLoopDirective(D);
>>  }
>>
>> +void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective
>> *D) {
>> +  VisitOMPLoopDirective(D);
>> +}
>> +
>>
>>  //===----------------------------------------------------------------------===//
>>  // ASTReader Implementation
>>
>>  //===----------------------------------------------------------------------===//
>> @@ -3079,6 +3083,14 @@ Stmt *ASTReader::ReadStmtFromStream(Modu
>>        break;
>>      }
>>
>> +    case STMT_OMP_DISTRIBUTE_DIRECTIVE: {
>> +      unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
>> +      unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
>> +      S = OMPDistributeDirective::CreateEmpty(Context, NumClauses,
>> CollapsedNum,
>> +                                              Empty);
>> +      break;
>> +    }
>> +
>>      case EXPR_CXX_OPERATOR_CALL:
>>        S = new (Context) CXXOperatorCallExpr(Context, Empty);
>>        break;
>>
>> Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
>> +++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Mon Dec  7 22:21:03 2015
>> @@ -2261,6 +2261,11 @@ void ASTStmtWriter::VisitOMPTaskLoopSimd
>>    Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;
>>  }
>>
>> +void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective
>> *D) {
>> +  VisitOMPLoopDirective(D);
>> +  Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;
>> +}
>> +
>>
>>  //===----------------------------------------------------------------------===//
>>  // ASTWriter Implementation
>>
>>  //===----------------------------------------------------------------------===//
>>
>> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=255001&r1=255000&r2=255001&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
>> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Mon Dec  7 22:21:03
>> 2015
>> @@ -831,6 +831,7 @@ void ExprEngine::Visit(const Stmt *S, Ex
>>      case Stmt::OMPCancelDirectiveClass:
>>      case Stmt::OMPTaskLoopDirectiveClass:
>>      case Stmt::OMPTaskLoopSimdDirectiveClass:
>> +    case Stmt::OMPDist
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>


-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151208/a02b1557/attachment-0001.html>


More information about the cfe-commits mailing list