LCOV - code coverage report
Current view: top level - clang/AST - OpenMPClause.h (source / functions) Hit Total Coverage
Test: clang.info Lines: 0 70 0.0 %
Date: 2016-01-31 12:01:00 Functions: 0 102 0.0 %

          Line data    Source code
       1             : //===- OpenMPClause.h - Classes for OpenMP clauses --------------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : /// \file
      10             : /// \brief This file defines OpenMP AST classes for clauses.
      11             : /// There are clauses for executable directives, clauses for declarative
      12             : /// directives and clauses which can be used in both kinds of directives.
      13             : ///
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #ifndef LLVM_CLANG_AST_OPENMPCLAUSE_H
      17             : #define LLVM_CLANG_AST_OPENMPCLAUSE_H
      18             : 
      19             : #include "clang/AST/Expr.h"
      20             : #include "clang/AST/Stmt.h"
      21             : #include "clang/Basic/OpenMPKinds.h"
      22             : #include "clang/Basic/SourceLocation.h"
      23             : 
      24             : namespace clang {
      25             : 
      26             : //===----------------------------------------------------------------------===//
      27             : // AST classes for clauses.
      28             : //===----------------------------------------------------------------------===//
      29             : 
      30             : /// \brief This is a basic class for representing single OpenMP clause.
      31             : ///
      32             : class OMPClause {
      33             :   /// \brief Starting location of the clause (the clause keyword).
      34             :   SourceLocation StartLoc;
      35             :   /// \brief Ending location of the clause.
      36             :   SourceLocation EndLoc;
      37             :   /// \brief Kind of the clause.
      38             :   OpenMPClauseKind Kind;
      39             : 
      40             : protected:
      41             :   OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
      42             :       : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
      43             : 
      44             : public:
      45             :   /// \brief Returns the starting location of the clause.
      46             :   SourceLocation getLocStart() const { return StartLoc; }
      47             :   /// \brief Returns the ending location of the clause.
      48             :   SourceLocation getLocEnd() const { return EndLoc; }
      49             : 
      50             :   /// \brief Sets the starting location of the clause.
      51             :   void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
      52             :   /// \brief Sets the ending location of the clause.
      53             :   void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
      54             : 
      55             :   /// \brief Returns kind of OpenMP clause (private, shared, reduction, etc.).
      56           0 :   OpenMPClauseKind getClauseKind() const { return Kind; }
      57             : 
      58             :   bool isImplicit() const { return StartLoc.isInvalid(); }
      59             : 
      60             :   StmtRange children();
      61             :   ConstStmtRange children() const {
      62             :     return const_cast<OMPClause *>(this)->children();
      63             :   }
      64             :   static bool classof(const OMPClause *) { return true; }
      65             : };
      66             : 
      67             : /// \brief This represents clauses with the list of variables like 'private',
      68             : /// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
      69             : /// '#pragma omp ...' directives.
      70             : template <class T> class OMPVarListClause : public OMPClause {
      71             :   friend class OMPClauseReader;
      72             :   /// \brief Location of '('.
      73             :   SourceLocation LParenLoc;
      74             :   /// \brief Number of variables in the list.
      75             :   unsigned NumVars;
      76             : 
      77             : protected:
      78             :   /// \brief Fetches list of variables associated with this clause.
      79             :   MutableArrayRef<Expr *> getVarRefs() {
      80           0 :     return MutableArrayRef<Expr *>(
      81           0 :         reinterpret_cast<Expr **>(
      82           0 :             reinterpret_cast<char *>(this) +
      83           0 :             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<Expr *>())),
      84           0 :         NumVars);
      85             :   }
      86             : 
      87             :   /// \brief Sets the list of variables for this clause.
      88             :   void setVarRefs(ArrayRef<Expr *> VL) {
      89             :     assert(VL.size() == NumVars &&
      90             :            "Number of variables is not the same as the preallocated buffer");
      91             :     std::copy(
      92             :         VL.begin(), VL.end(),
      93             :         reinterpret_cast<Expr **>(
      94             :             reinterpret_cast<char *>(this) +
      95             :             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<Expr *>())));
      96             :   }
      97             : 
      98             :   /// \brief Build a clause with \a N variables
      99             :   ///
     100             :   /// \param K Kind of the clause.
     101             :   /// \param StartLoc Starting location of the clause (the clause keyword).
     102             :   /// \param LParenLoc Location of '('.
     103             :   /// \param EndLoc Ending location of the clause.
     104             :   /// \param N Number of the variables in the clause.
     105             :   ///
     106             :   OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
     107             :                    SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
     108             :       : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
     109             : 
     110             : public:
     111             :   typedef MutableArrayRef<Expr *>::iterator varlist_iterator;
     112             :   typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
     113             :   typedef llvm::iterator_range<varlist_iterator> varlist_range;
     114             :   typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
     115             : 
     116           0 :   unsigned varlist_size() const { return NumVars; }
     117             :   bool varlist_empty() const { return NumVars == 0; }
     118             : 
     119             :   varlist_range varlists() {
     120           0 :     return varlist_range(varlist_begin(), varlist_end());
     121             :   }
     122             :   varlist_const_range varlists() const {
     123             :     return varlist_const_range(varlist_begin(), varlist_end());
     124             :   }
     125             : 
     126           0 :   varlist_iterator varlist_begin() { return getVarRefs().begin(); }
     127           0 :   varlist_iterator varlist_end() { return getVarRefs().end(); }
     128             :   varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
     129             :   varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
     130             : 
     131             :   /// \brief Sets the location of '('.
     132             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     133             :   /// \brief Returns the location of '('.
     134             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     135             : 
     136             :   /// \brief Fetches list of all variables in the clause.
     137             :   ArrayRef<const Expr *> getVarRefs() const {
     138             :     return llvm::makeArrayRef(
     139             :         reinterpret_cast<const Expr *const *>(
     140             :             reinterpret_cast<const char *>(this) +
     141             :             llvm::RoundUpToAlignment(sizeof(T), llvm::alignOf<const Expr *>())),
     142             :         NumVars);
     143             :   }
     144             : };
     145             : 
     146             : /// \brief This represents 'if' clause in the '#pragma omp ...' directive.
     147             : ///
     148             : /// \code
     149             : /// #pragma omp parallel if(a > 5)
     150             : /// \endcode
     151             : /// In this example directive '#pragma omp parallel' has simple 'if'
     152             : /// clause with condition 'a > 5'.
     153             : ///
     154             : class OMPIfClause : public OMPClause {
     155             :   friend class OMPClauseReader;
     156             :   /// \brief Location of '('.
     157             :   SourceLocation LParenLoc;
     158             :   /// \brief Condition of the 'if' clause.
     159             :   Stmt *Condition;
     160             : 
     161             :   /// \brief Set condition.
     162             :   ///
     163             :   void setCondition(Expr *Cond) { Condition = Cond; }
     164             : 
     165             : public:
     166             :   /// \brief Build 'if' clause with condition \a Cond.
     167             :   ///
     168             :   /// \param StartLoc Starting location of the clause.
     169             :   /// \param LParenLoc Location of '('.
     170             :   /// \param Cond Condition of the clause.
     171             :   /// \param EndLoc Ending location of the clause.
     172             :   ///
     173             :   OMPIfClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc,
     174             :               SourceLocation EndLoc)
     175             :       : OMPClause(OMPC_if, StartLoc, EndLoc), LParenLoc(LParenLoc),
     176             :         Condition(Cond) {}
     177             : 
     178             :   /// \brief Build an empty clause.
     179             :   ///
     180             :   OMPIfClause()
     181             :       : OMPClause(OMPC_if, SourceLocation(), SourceLocation()),
     182             :         LParenLoc(SourceLocation()), Condition(nullptr) {}
     183             : 
     184             :   /// \brief Sets the location of '('.
     185             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     186             :   /// \brief Returns the location of '('.
     187             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     188             : 
     189             :   /// \brief Returns condition.
     190           0 :   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
     191             : 
     192             :   static bool classof(const OMPClause *T) {
     193             :     return T->getClauseKind() == OMPC_if;
     194             :   }
     195             : 
     196             :   StmtRange children() { return StmtRange(&Condition, &Condition + 1); }
     197             : };
     198             : 
     199             : /// \brief This represents 'final' clause in the '#pragma omp ...' directive.
     200             : ///
     201             : /// \code
     202             : /// #pragma omp task final(a > 5)
     203             : /// \endcode
     204             : /// In this example directive '#pragma omp task' has simple 'final'
     205             : /// clause with condition 'a > 5'.
     206             : ///
     207             : class OMPFinalClause : public OMPClause {
     208             :   friend class OMPClauseReader;
     209             :   /// \brief Location of '('.
     210             :   SourceLocation LParenLoc;
     211             :   /// \brief Condition of the 'if' clause.
     212             :   Stmt *Condition;
     213             : 
     214             :   /// \brief Set condition.
     215             :   ///
     216             :   void setCondition(Expr *Cond) { Condition = Cond; }
     217             : 
     218             : public:
     219             :   /// \brief Build 'final' clause with condition \a Cond.
     220             :   ///
     221             :   /// \param StartLoc Starting location of the clause.
     222             :   /// \param LParenLoc Location of '('.
     223             :   /// \param Cond Condition of the clause.
     224             :   /// \param EndLoc Ending location of the clause.
     225             :   ///
     226             :   OMPFinalClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc,
     227             :                  SourceLocation EndLoc)
     228             :       : OMPClause(OMPC_final, StartLoc, EndLoc), LParenLoc(LParenLoc),
     229             :         Condition(Cond) {}
     230             : 
     231             :   /// \brief Build an empty clause.
     232             :   ///
     233             :   OMPFinalClause()
     234             :       : OMPClause(OMPC_final, SourceLocation(), SourceLocation()),
     235             :         LParenLoc(SourceLocation()), Condition(nullptr) {}
     236             : 
     237             :   /// \brief Sets the location of '('.
     238             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     239             :   /// \brief Returns the location of '('.
     240             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     241             : 
     242             :   /// \brief Returns condition.
     243           0 :   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
     244             : 
     245             :   static bool classof(const OMPClause *T) {
     246             :     return T->getClauseKind() == OMPC_final;
     247             :   }
     248             : 
     249             :   StmtRange children() { return StmtRange(&Condition, &Condition + 1); }
     250             : };
     251             : 
     252             : /// \brief This represents 'num_threads' clause in the '#pragma omp ...'
     253             : /// directive.
     254             : ///
     255             : /// \code
     256             : /// #pragma omp parallel num_threads(6)
     257             : /// \endcode
     258             : /// In this example directive '#pragma omp parallel' has simple 'num_threads'
     259             : /// clause with number of threads '6'.
     260             : ///
     261             : class OMPNumThreadsClause : public OMPClause {
     262             :   friend class OMPClauseReader;
     263             :   /// \brief Location of '('.
     264             :   SourceLocation LParenLoc;
     265             :   /// \brief Condition of the 'num_threads' clause.
     266             :   Stmt *NumThreads;
     267             : 
     268             :   /// \brief Set condition.
     269             :   ///
     270             :   void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
     271             : 
     272             : public:
     273             :   /// \brief Build 'num_threads' clause with condition \a NumThreads.
     274             :   ///
     275             :   /// \param NumThreads Number of threads for the construct.
     276             :   /// \param StartLoc Starting location of the clause.
     277             :   /// \param LParenLoc Location of '('.
     278             :   /// \param EndLoc Ending location of the clause.
     279             :   ///
     280             :   OMPNumThreadsClause(Expr *NumThreads, SourceLocation StartLoc,
     281             :                       SourceLocation LParenLoc, SourceLocation EndLoc)
     282             :       : OMPClause(OMPC_num_threads, StartLoc, EndLoc), LParenLoc(LParenLoc),
     283             :         NumThreads(NumThreads) {}
     284             : 
     285             :   /// \brief Build an empty clause.
     286             :   ///
     287             :   OMPNumThreadsClause()
     288             :       : OMPClause(OMPC_num_threads, SourceLocation(), SourceLocation()),
     289             :         LParenLoc(SourceLocation()), NumThreads(nullptr) {}
     290             : 
     291             :   /// \brief Sets the location of '('.
     292             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     293             :   /// \brief Returns the location of '('.
     294             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     295             : 
     296             :   /// \brief Returns number of threads.
     297           0 :   Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
     298             : 
     299             :   static bool classof(const OMPClause *T) {
     300             :     return T->getClauseKind() == OMPC_num_threads;
     301             :   }
     302             : 
     303             :   StmtRange children() { return StmtRange(&NumThreads, &NumThreads + 1); }
     304             : };
     305             : 
     306             : /// \brief This represents 'safelen' clause in the '#pragma omp ...'
     307             : /// directive.
     308             : ///
     309             : /// \code
     310             : /// #pragma omp simd safelen(4)
     311             : /// \endcode
     312             : /// In this example directive '#pragma omp simd' has clause 'safelen'
     313             : /// with single expression '4'.
     314             : /// If the safelen clause is used then no two iterations executed
     315             : /// concurrently with SIMD instructions can have a greater distance
     316             : /// in the logical iteration space than its value. The parameter of
     317             : /// the safelen clause must be a constant positive integer expression.
     318             : ///
     319             : class OMPSafelenClause : public OMPClause {
     320             :   friend class OMPClauseReader;
     321             :   /// \brief Location of '('.
     322             :   SourceLocation LParenLoc;
     323             :   /// \brief Safe iteration space distance.
     324             :   Stmt *Safelen;
     325             : 
     326             :   /// \brief Set safelen.
     327             :   void setSafelen(Expr *Len) { Safelen = Len; }
     328             : 
     329             : public:
     330             :   /// \brief Build 'safelen' clause.
     331             :   ///
     332             :   /// \param Len Expression associated with this clause.
     333             :   /// \param StartLoc Starting location of the clause.
     334             :   /// \param EndLoc Ending location of the clause.
     335             :   ///
     336             :   OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
     337             :                    SourceLocation EndLoc)
     338             :       : OMPClause(OMPC_safelen, StartLoc, EndLoc), LParenLoc(LParenLoc),
     339             :         Safelen(Len) {}
     340             : 
     341             :   /// \brief Build an empty clause.
     342             :   ///
     343             :   explicit OMPSafelenClause()
     344             :       : OMPClause(OMPC_safelen, SourceLocation(), SourceLocation()),
     345             :         LParenLoc(SourceLocation()), Safelen(nullptr) {}
     346             : 
     347             :   /// \brief Sets the location of '('.
     348             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     349             :   /// \brief Returns the location of '('.
     350             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     351             : 
     352             :   /// \brief Return safe iteration space distance.
     353           0 :   Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
     354             : 
     355             :   static bool classof(const OMPClause *T) {
     356             :     return T->getClauseKind() == OMPC_safelen;
     357             :   }
     358             : 
     359             :   StmtRange children() { return StmtRange(&Safelen, &Safelen + 1); }
     360             : };
     361             : 
     362             : /// \brief This represents 'collapse' clause in the '#pragma omp ...'
     363             : /// directive.
     364             : ///
     365             : /// \code
     366             : /// #pragma omp simd collapse(3)
     367             : /// \endcode
     368             : /// In this example directive '#pragma omp simd' has clause 'collapse'
     369             : /// with single expression '3'.
     370             : /// The parameter must be a constant positive integer expression, it specifies
     371             : /// the number of nested loops that should be collapsed into a single iteration
     372             : /// space.
     373             : ///
     374             : class OMPCollapseClause : public OMPClause {
     375             :   friend class OMPClauseReader;
     376             :   /// \brief Location of '('.
     377             :   SourceLocation LParenLoc;
     378             :   /// \brief Number of for-loops.
     379             :   Stmt *NumForLoops;
     380             : 
     381             :   /// \brief Set the number of associated for-loops.
     382             :   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
     383             : 
     384             : public:
     385             :   /// \brief Build 'collapse' clause.
     386             :   ///
     387             :   /// \param Num Expression associated with this clause.
     388             :   /// \param StartLoc Starting location of the clause.
     389             :   /// \param LParenLoc Location of '('.
     390             :   /// \param EndLoc Ending location of the clause.
     391             :   ///
     392             :   OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
     393             :                     SourceLocation LParenLoc, SourceLocation EndLoc)
     394             :       : OMPClause(OMPC_collapse, StartLoc, EndLoc), LParenLoc(LParenLoc),
     395             :         NumForLoops(Num) {}
     396             : 
     397             :   /// \brief Build an empty clause.
     398             :   ///
     399             :   explicit OMPCollapseClause()
     400             :       : OMPClause(OMPC_collapse, SourceLocation(), SourceLocation()),
     401             :         LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
     402             : 
     403             :   /// \brief Sets the location of '('.
     404             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     405             :   /// \brief Returns the location of '('.
     406             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     407             : 
     408             :   /// \brief Return the number of associated for-loops.
     409           0 :   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
     410             : 
     411             :   static bool classof(const OMPClause *T) {
     412             :     return T->getClauseKind() == OMPC_collapse;
     413             :   }
     414             : 
     415             :   StmtRange children() { return StmtRange(&NumForLoops, &NumForLoops + 1); }
     416             : };
     417             : 
     418             : /// \brief This represents 'default' clause in the '#pragma omp ...' directive.
     419             : ///
     420             : /// \code
     421             : /// #pragma omp parallel default(shared)
     422             : /// \endcode
     423             : /// In this example directive '#pragma omp parallel' has simple 'default'
     424             : /// clause with kind 'shared'.
     425             : ///
     426             : class OMPDefaultClause : public OMPClause {
     427             :   friend class OMPClauseReader;
     428             :   /// \brief Location of '('.
     429             :   SourceLocation LParenLoc;
     430             :   /// \brief A kind of the 'default' clause.
     431             :   OpenMPDefaultClauseKind Kind;
     432             :   /// \brief Start location of the kind in source code.
     433             :   SourceLocation KindKwLoc;
     434             : 
     435             :   /// \brief Set kind of the clauses.
     436             :   ///
     437             :   /// \param K Argument of clause.
     438             :   ///
     439             :   void setDefaultKind(OpenMPDefaultClauseKind K) { Kind = K; }
     440             : 
     441             :   /// \brief Set argument location.
     442             :   ///
     443             :   /// \param KLoc Argument location.
     444             :   ///
     445             :   void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
     446             : 
     447             : public:
     448             :   /// \brief Build 'default' clause with argument \a A ('none' or 'shared').
     449             :   ///
     450             :   /// \param A Argument of the clause ('none' or 'shared').
     451             :   /// \param ALoc Starting location of the argument.
     452             :   /// \param StartLoc Starting location of the clause.
     453             :   /// \param LParenLoc Location of '('.
     454             :   /// \param EndLoc Ending location of the clause.
     455             :   ///
     456             :   OMPDefaultClause(OpenMPDefaultClauseKind A, SourceLocation ALoc,
     457             :                    SourceLocation StartLoc, SourceLocation LParenLoc,
     458             :                    SourceLocation EndLoc)
     459             :       : OMPClause(OMPC_default, StartLoc, EndLoc), LParenLoc(LParenLoc),
     460             :         Kind(A), KindKwLoc(ALoc) {}
     461             : 
     462             :   /// \brief Build an empty clause.
     463             :   ///
     464             :   OMPDefaultClause()
     465             :       : OMPClause(OMPC_default, SourceLocation(), SourceLocation()),
     466             :         LParenLoc(SourceLocation()), Kind(OMPC_DEFAULT_unknown),
     467             :         KindKwLoc(SourceLocation()) {}
     468             : 
     469             :   /// \brief Sets the location of '('.
     470             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     471             :   /// \brief Returns the location of '('.
     472             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     473             : 
     474             :   /// \brief Returns kind of the clause.
     475             :   OpenMPDefaultClauseKind getDefaultKind() const { return Kind; }
     476             : 
     477             :   /// \brief Returns location of clause kind.
     478             :   SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
     479             : 
     480             :   static bool classof(const OMPClause *T) {
     481             :     return T->getClauseKind() == OMPC_default;
     482             :   }
     483             : 
     484             :   StmtRange children() { return StmtRange(); }
     485             : };
     486             : 
     487             : /// \brief This represents 'proc_bind' clause in the '#pragma omp ...'
     488             : /// directive.
     489             : ///
     490             : /// \code
     491             : /// #pragma omp parallel proc_bind(master)
     492             : /// \endcode
     493             : /// In this example directive '#pragma omp parallel' has simple 'proc_bind'
     494             : /// clause with kind 'master'.
     495             : ///
     496             : class OMPProcBindClause : public OMPClause {
     497             :   friend class OMPClauseReader;
     498             :   /// \brief Location of '('.
     499             :   SourceLocation LParenLoc;
     500             :   /// \brief A kind of the 'proc_bind' clause.
     501             :   OpenMPProcBindClauseKind Kind;
     502             :   /// \brief Start location of the kind in source code.
     503             :   SourceLocation KindKwLoc;
     504             : 
     505             :   /// \brief Set kind of the clause.
     506             :   ///
     507             :   /// \param K Kind of clause.
     508             :   ///
     509             :   void setProcBindKind(OpenMPProcBindClauseKind K) { Kind = K; }
     510             : 
     511             :   /// \brief Set clause kind location.
     512             :   ///
     513             :   /// \param KLoc Kind location.
     514             :   ///
     515             :   void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
     516             : 
     517             : public:
     518             :   /// \brief Build 'proc_bind' clause with argument \a A ('master', 'close' or
     519             :   ///        'spread').
     520             :   ///
     521             :   /// \param A Argument of the clause ('master', 'close' or 'spread').
     522             :   /// \param ALoc Starting location of the argument.
     523             :   /// \param StartLoc Starting location of the clause.
     524             :   /// \param LParenLoc Location of '('.
     525             :   /// \param EndLoc Ending location of the clause.
     526             :   ///
     527             :   OMPProcBindClause(OpenMPProcBindClauseKind A, SourceLocation ALoc,
     528             :                     SourceLocation StartLoc, SourceLocation LParenLoc,
     529             :                     SourceLocation EndLoc)
     530             :       : OMPClause(OMPC_proc_bind, StartLoc, EndLoc), LParenLoc(LParenLoc),
     531             :         Kind(A), KindKwLoc(ALoc) {}
     532             : 
     533             :   /// \brief Build an empty clause.
     534             :   ///
     535             :   OMPProcBindClause()
     536             :       : OMPClause(OMPC_proc_bind, SourceLocation(), SourceLocation()),
     537             :         LParenLoc(SourceLocation()), Kind(OMPC_PROC_BIND_unknown),
     538             :         KindKwLoc(SourceLocation()) {}
     539             : 
     540             :   /// \brief Sets the location of '('.
     541             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     542             :   /// \brief Returns the location of '('.
     543             :   SourceLocation getLParenLoc() const { return LParenLoc; }
     544             : 
     545             :   /// \brief Returns kind of the clause.
     546             :   OpenMPProcBindClauseKind getProcBindKind() const { return Kind; }
     547             : 
     548             :   /// \brief Returns location of clause kind.
     549             :   SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
     550             : 
     551             :   static bool classof(const OMPClause *T) {
     552             :     return T->getClauseKind() == OMPC_proc_bind;
     553             :   }
     554             : 
     555             :   StmtRange children() { return StmtRange(); }
     556             : };
     557             : 
     558             : /// \brief This represents 'schedule' clause in the '#pragma omp ...' directive.
     559             : ///
     560             : /// \code
     561             : /// #pragma omp for schedule(static, 3)
     562             : /// \endcode
     563             : /// In this example directive '#pragma omp for' has 'schedule' clause with
     564             : /// arguments 'static' and '3'.
     565             : ///
     566             : class OMPScheduleClause : public OMPClause {
     567             :   friend class OMPClauseReader;
     568             :   /// \brief Location of '('.
     569             :   SourceLocation LParenLoc;
     570             :   /// \brief A kind of the 'schedule' clause.
     571             :   OpenMPScheduleClauseKind Kind;
     572             :   /// \brief Start location of the schedule ind in source code.
     573             :   SourceLocation KindLoc;
     574             :   /// \brief Location of ',' (if any).
     575             :   SourceLocation CommaLoc;
     576             :   /// \brief Chunk size and a reference to pseudo variable for combined
     577             :   /// directives.
     578             :   enum { CHUNK_SIZE, HELPER_CHUNK_SIZE, NUM_EXPRS };
     579             :   Stmt *ChunkSizes[NUM_EXPRS];
     580             : 
     581             :   /// \brief Set schedule kind.
     582             :   ///
     583             :   /// \param K Schedule kind.
     584             :   ///
     585             :   void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
     586             :   /// \brief Sets the location of '('.
     587             :   ///
     588             :   /// \param Loc Location of '('.
     589             :   ///
     590             :   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
     591             :   /// \brief Set schedule kind start location.
     592             :   ///
     593             :   /// \param KLoc Schedule kind location.
     594             :   ///
     595             :   void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
     596             :   /// \brief Set location of ','.
     597             :   ///
     598             :   /// \param Loc Location of ','.
     599             :   ///
     600             :   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
     601             :   /// \brief Set chunk size.
     602             :   ///
     603             :   /// \param E Chunk size.
     604             :   ///
     605             :   void setChunkSize(Expr *E) { ChunkSizes[CHUNK_SIZE] = E; }
     606             :   /// \brief Set helper chunk size.
     607             :   ///
     608             :   /// \param E Helper chunk size.
     609             :   ///
     610             :   void setHelperChunkSize(Expr *E) { ChunkSizes[HELPER_CHUNK_SIZE] = E; }
     611             : 
     612             : public:
     613             :   /// \brief Build 'schedule' clause with schedule kind \a Kind and chunk size
     614             :   /// expression \a ChunkSize.
     615             :   ///
     616             :   /// \param StartLoc Starting location of the clause.
     617             :   /// \param LParenLoc Location of '('.
     618             :   /// \param KLoc Starting location of the argument.
     619             :   /// \param CommaLoc Location of ','.
     620             :   /// \param EndLoc Ending location of the clause.
     621             :   /// \param Kind Schedule kind.
     622             :   /// \param ChunkSize Chunk size.
     623             :   /// \param HelperChunkSize Helper chunk size for combined directives.
     624             :   ///
     625             :   OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
     626             :                     SourceLocation KLoc, SourceLocation CommaLoc,
     627             :                     SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
     628             :                     Expr *ChunkSize, Expr *HelperChunkSize)
     629             :       : OMPClause(OMPC_schedule, StartLoc, EndLoc), LParenLoc(LParenLoc),
     630             :         Kind(Kind), KindLoc(KLoc), CommaLoc(CommaLoc) {
     631             :     ChunkSizes[CHUNK_SIZE] = ChunkSize;
     632             :     ChunkSizes[HELPER_CHUNK_SIZE] = HelperChunkSize;
     633             :   }
     634             : 
     635             :   /// \brief Build an empty clause.
     636             :   ///
     637             :   explicit OMPScheduleClause()
     638             :       : OMPClause(OMPC_schedule, SourceLocation(), SourceLocation()),
     639             :         Kind(OMPC_SCHEDULE_unknown) {
     640             :     ChunkSizes[CHUNK_SIZE] = nullptr;
     641             :     ChunkSizes[HELPER_CHUNK_SIZE] = nullptr;
     642             :   }
     643             : 
     644             :   /// \brief Get kind of the clause.
     645             :   ///
     646             :   OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
     647             :   /// \brief Get location of '('.
     648             :   ///
     649             :   SourceLocation getLParenLoc() { return LParenLoc; }
     650             :   /// \brief Get kind location.
     651             :   ///
     652             :   SourceLocation getScheduleKindLoc() { return KindLoc; }
     653             :   /// \brief Get location of ','.
     654             :   ///
     655             :   SourceLocation getCommaLoc() { return CommaLoc; }
     656             :   /// \brief Get chunk size.
     657             :   ///
     658           0 :   Expr *getChunkSize() { return dyn_cast_or_null<Expr>(ChunkSizes[CHUNK_SIZE]); }
     659             :   /// \brief Get chunk size.
     660             :   ///
     661             :   Expr *getChunkSize() const {
     662             :     return dyn_cast_or_null<Expr>(ChunkSizes[CHUNK_SIZE]);
     663             :   }
     664             :   /// \brief Get helper chunk size.
     665             :   ///
     666             :   Expr *getHelperChunkSize() {
     667           0 :     return dyn_cast_or_null<Expr>(ChunkSizes[HELPER_CHUNK_SIZE]);
     668             :   }
     669             :   /// \brief Get helper chunk size.
     670             :   ///
     671             :   Expr *getHelperChunkSize() const {
     672             :     return dyn_cast_or_null<Expr>(ChunkSizes[HELPER_CHUNK_SIZE]);
     673             :   }
     674             : 
     675             :   static bool classof(const OMPClause *T) {
     676             :     return T->getClauseKind() == OMPC_schedule;
     677             :   }
     678             : 
     679             :   StmtRange children() {
     680             :     return StmtRange(&ChunkSizes[CHUNK_SIZE], &ChunkSizes[CHUNK_SIZE] + 1);
     681             :   }
     682             : };
     683             : 
     684             : /// \brief This represents 'ordered' clause in the '#pragma omp ...' directive.
     685             : ///
     686             : /// \code
     687             : /// #pragma omp for ordered
     688             : /// \endcode
     689             : /// In this example directive '#pragma omp for' has 'ordered' clause.
     690             : ///
     691             : class OMPOrderedClause : public OMPClause {
     692             : public:
     693             :   /// \brief Build 'ordered' clause.
     694             :   ///
     695             :   /// \param StartLoc Starting location of the clause.
     696             :   /// \param EndLoc Ending location of the clause.
     697             :   ///
     698             :   OMPOrderedClause(SourceLocation StartLoc, SourceLocation EndLoc)
     699             :       : OMPClause(OMPC_ordered, StartLoc, EndLoc) {}
     700             : 
     701             :   /// \brief Build an empty clause.
     702             :   ///
     703             :   OMPOrderedClause()
     704             :       : OMPClause(OMPC_ordered, SourceLocation(), SourceLocation()) {}
     705             : 
     706             :   static bool classof(const OMPClause *T) {
     707             :     return T->getClauseKind() == OMPC_ordered;
     708             :   }
     709             : 
     710             :   StmtRange children() { return StmtRange(); }
     711             : };
     712             : 
     713             : /// \brief This represents 'nowait' clause in the '#pragma omp ...' directive.
     714             : ///
     715             : /// \code
     716             : /// #pragma omp for nowait
     717             : /// \endcode
     718             : /// In this example directive '#pragma omp for' has 'nowait' clause.
     719             : ///
     720             : class OMPNowaitClause : public OMPClause {
     721             : public:
     722             :   /// \brief Build 'nowait' clause.
     723             :   ///
     724             :   /// \param StartLoc Starting location of the clause.
     725             :   /// \param EndLoc Ending location of the clause.
     726             :   ///
     727             :   OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
     728             :       : OMPClause(OMPC_nowait, StartLoc, EndLoc) {}
     729             : 
     730             :   /// \brief Build an empty clause.
     731             :   ///
     732             :   OMPNowaitClause()
     733             :       : OMPClause(OMPC_nowait, SourceLocation(), SourceLocation()) {}
     734             : 
     735             :   static bool classof(const OMPClause *T) {
     736             :     return T->getClauseKind() == OMPC_nowait;
     737             :   }
     738             : 
     739             :   StmtRange children() { return StmtRange(); }
     740             : };
     741             : 
     742             : /// \brief This represents 'untied' clause in the '#pragma omp ...' directive.
     743             : ///
     744             : /// \code
     745             : /// #pragma omp task untied
     746             : /// \endcode
     747             : /// In this example directive '#pragma omp task' has 'untied' clause.
     748             : ///
     749             : class OMPUntiedClause : public OMPClause {
     750             : public:
     751             :   /// \brief Build 'untied' clause.
     752             :   ///
     753             :   /// \param StartLoc Starting location of the clause.
     754             :   /// \param EndLoc Ending location of the clause.
     755             :   ///
     756             :   OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
     757             :       : OMPClause(OMPC_untied, StartLoc, EndLoc) {}
     758             : 
     759             :   /// \brief Build an empty clause.
     760             :   ///
     761             :   OMPUntiedClause()
     762             :       : OMPClause(OMPC_untied, SourceLocation(), SourceLocation()) {}
     763             : 
     764             :   static bool classof(const OMPClause *T) {
     765             :     return T->getClauseKind() == OMPC_untied;
     766             :   }
     767             : 
     768             :   StmtRange children() { return StmtRange(); }
     769             : };
     770             : 
     771             : /// \brief This represents 'mergeable' clause in the '#pragma omp ...'
     772             : /// directive.
     773             : ///
     774             : /// \code
     775             : /// #pragma omp task mergeable
     776             : /// \endcode
     777             : /// In this example directive '#pragma omp task' has 'mergeable' clause.
     778             : ///
     779             : class OMPMergeableClause : public OMPClause {
     780             : public:
     781             :   /// \brief Build 'mergeable' clause.
     782             :   ///
     783             :   /// \param StartLoc Starting location of the clause.
     784             :   /// \param EndLoc Ending location of the clause.
     785             :   ///
     786             :   OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
     787             :       : OMPClause(OMPC_mergeable, StartLoc, EndLoc) {}
     788             : 
     789             :   /// \brief Build an empty clause.
     790             :   ///
     791             :   OMPMergeableClause()
     792             :       : OMPClause(OMPC_mergeable, SourceLocation(), SourceLocation()) {}
     793             : 
     794             :   static bool classof(const OMPClause *T) {
     795             :     return T->getClauseKind() == OMPC_mergeable;
     796             :   }
     797             : 
     798             :   StmtRange children() { return StmtRange(); }
     799             : };
     800             : 
     801             : /// \brief This represents 'read' clause in the '#pragma omp atomic' directive.
     802             : ///
     803             : /// \code
     804             : /// #pragma omp atomic read
     805             : /// \endcode
     806             : /// In this example directive '#pragma omp atomic' has 'read' clause.
     807             : ///
     808             : class OMPReadClause : public OMPClause {
     809             : public:
     810             :   /// \brief Build 'read' clause.
     811             :   ///
     812             :   /// \param StartLoc Starting location of the clause.
     813             :   /// \param EndLoc Ending location of the clause.
     814             :   ///
     815             :   OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
     816             :       : OMPClause(OMPC_read, StartLoc, EndLoc) {}
     817             : 
     818             :   /// \brief Build an empty clause.
     819             :   ///
     820             :   OMPReadClause() : OMPClause(OMPC_read, SourceLocation(), SourceLocation()) {}
     821             : 
     822             :   static bool classof(const OMPClause *T) {
     823             :     return T->getClauseKind() == OMPC_read;
     824             :   }
     825             : 
     826             :   StmtRange children() { return StmtRange(); }
     827             : };
     828             : 
     829             : /// \brief This represents 'write' clause in the '#pragma omp atomic' directive.
     830             : ///
     831             : /// \code
     832             : /// #pragma omp atomic write
     833             : /// \endcode
     834             : /// In this example directive '#pragma omp atomic' has 'write' clause.
     835             : ///
     836             : class OMPWriteClause : public OMPClause {
     837             : public:
     838             :   /// \brief Build 'write' clause.
     839             :   ///
     840             :   /// \param StartLoc Starting location of the clause.
     841             :   /// \param EndLoc Ending location of the clause.
     842             :   ///
     843             :   OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
     844             :       : OMPClause(OMPC_write, StartLoc, EndLoc) {}
     845             : 
     846             :   /// \brief Build an empty clause.
     847             :   ///
     848             :   OMPWriteClause()
     849             :       : OMPClause(OMPC_write, SourceLocation(), SourceLocation()) {}
     850             : 
     851             :   static bool classof(const OMPClause *T) {
     852             :     return T->getClauseKind() == OMPC_write;
     853             :   }
     854             : 
     855             :   StmtRange children() { return StmtRange(); }
     856             : };
     857             : 
     858             : /// \brief This represents 'update' clause in the '#pragma omp atomic'
     859             : /// directive.
     860             : ///
     861             : /// \code
     862             : /// #pragma omp atomic update
     863             : /// \endcode
     864             : /// In this example directive '#pragma omp atomic' has 'update' clause.
     865             : ///
     866             : class OMPUpdateClause : public OMPClause {
     867             : public:
     868             :   /// \brief Build 'update' clause.
     869             :   ///
     870             :   /// \param StartLoc Starting location of the clause.
     871             :   /// \param EndLoc Ending location of the clause.
     872             :   ///
     873             :   OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc)
     874             :       : OMPClause(OMPC_update, StartLoc, EndLoc) {}
     875             : 
     876             :   /// \brief Build an empty clause.
     877             :   ///
     878             :   OMPUpdateClause()
     879             :       : OMPClause(OMPC_update, SourceLocation(), SourceLocation()) {}
     880             : 
     881             :   static bool classof(const OMPClause *T) {
     882             :     return T->getClauseKind() == OMPC_update;
     883             :   }
     884             : 
     885             :   StmtRange children() { return StmtRange(); }
     886             : };
     887             : 
     888             : /// \brief This represents 'capture' clause in the '#pragma omp atomic'
     889             : /// directive.
     890             : ///
     891             : /// \code
     892             : /// #pragma omp atomic capture
     893             : /// \endcode
     894             : /// In this example directive '#pragma omp atomic' has 'capture' clause.
     895             : ///
     896             : class OMPCaptureClause : public OMPClause {
     897             : public:
     898             :   /// \brief Build 'capture' clause.
     899             :   ///
     900             :   /// \param StartLoc Starting location of the clause.
     901             :   /// \param EndLoc Ending location of the clause.
     902             :   ///
     903             :   OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
     904             :       : OMPClause(OMPC_capture, StartLoc, EndLoc) {}
     905             : 
     906             :   /// \brief Build an empty clause.
     907             :   ///
     908             :   OMPCaptureClause()
     909             :       : OMPClause(OMPC_capture, SourceLocation(), SourceLocation()) {}
     910             : 
     911             :   static bool classof(const OMPClause *T) {
     912             :     return T->getClauseKind() == OMPC_capture;
     913             :   }
     914             : 
     915             :   StmtRange children() { return StmtRange(); }
     916             : };
     917             : 
     918             : /// \brief This represents 'seq_cst' clause in the '#pragma omp atomic'
     919             : /// directive.
     920             : ///
     921             : /// \code
     922             : /// #pragma omp atomic seq_cst
     923             : /// \endcode
     924             : /// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
     925             : ///
     926             : class OMPSeqCstClause : public OMPClause {
     927             : public:
     928             :   /// \brief Build 'seq_cst' clause.
     929             :   ///
     930             :   /// \param StartLoc Starting location of the clause.
     931             :   /// \param EndLoc Ending location of the clause.
     932             :   ///
     933             :   OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
     934             :       : OMPClause(OMPC_seq_cst, StartLoc, EndLoc) {}
     935             : 
     936             :   /// \brief Build an empty clause.
     937             :   ///
     938             :   OMPSeqCstClause()
     939             :       : OMPClause(OMPC_seq_cst, SourceLocation(), SourceLocation()) {}
     940             : 
     941             :   static bool classof(const OMPClause *T) {
     942             :     return T->getClauseKind() == OMPC_seq_cst;
     943             :   }
     944             : 
     945             :   StmtRange children() { return StmtRange(); }
     946             : };
     947             : 
     948             : /// \brief This represents clause 'private' in the '#pragma omp ...' directives.
     949             : ///
     950             : /// \code
     951             : /// #pragma omp parallel private(a,b)
     952             : /// \endcode
     953             : /// In this example directive '#pragma omp parallel' has clause 'private'
     954             : /// with the variables 'a' and 'b'.
     955             : ///
     956             : class OMPPrivateClause : public OMPVarListClause<OMPPrivateClause> {
     957             :   friend class OMPClauseReader;
     958             :   /// \brief Build clause with number of variables \a N.
     959             :   ///
     960             :   /// \param StartLoc Starting location of the clause.
     961             :   /// \param LParenLoc Location of '('.
     962             :   /// \param EndLoc Ending location of the clause.
     963             :   /// \param N Number of the variables in the clause.
     964             :   ///
     965             :   OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
     966             :                    SourceLocation EndLoc, unsigned N)
     967             :       : OMPVarListClause<OMPPrivateClause>(OMPC_private, StartLoc, LParenLoc,
     968             :                                            EndLoc, N) {}
     969             : 
     970             :   /// \brief Build an empty clause.
     971             :   ///
     972             :   /// \param N Number of variables.
     973             :   ///
     974             :   explicit OMPPrivateClause(unsigned N)
     975             :       : OMPVarListClause<OMPPrivateClause>(OMPC_private, SourceLocation(),
     976             :                                            SourceLocation(), SourceLocation(),
     977             :                                            N) {}
     978             : 
     979             :   /// \brief Sets the list of references to private copies with initializers for
     980             :   /// new private variables.
     981             :   /// \param VL List of references.
     982             :   void setPrivateCopies(ArrayRef<Expr *> VL);
     983             : 
     984             :   /// \brief Gets the list of references to private copies with initializers for
     985             :   /// new private variables.
     986             :   MutableArrayRef<Expr *> getPrivateCopies() {
     987           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
     988             :   }
     989             :   ArrayRef<const Expr *> getPrivateCopies() const {
     990             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
     991             :   }
     992             : 
     993             : public:
     994             :   /// \brief Creates clause with a list of variables \a VL.
     995             :   ///
     996             :   /// \param C AST context.
     997             :   /// \param StartLoc Starting location of the clause.
     998             :   /// \param LParenLoc Location of '('.
     999             :   /// \param EndLoc Ending location of the clause.
    1000             :   /// \param VL List of references to the variables.
    1001             :   /// \param PrivateVL List of references to private copies with initializers.
    1002             :   ///
    1003             :   static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
    1004             :                                   SourceLocation LParenLoc,
    1005             :                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
    1006             :                                   ArrayRef<Expr *> PrivateVL);
    1007             :   /// \brief Creates an empty clause with the place for \a N variables.
    1008             :   ///
    1009             :   /// \param C AST context.
    1010             :   /// \param N The number of variables.
    1011             :   ///
    1012             :   static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
    1013             : 
    1014             :   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
    1015             :   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
    1016             :   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
    1017             :   typedef llvm::iterator_range<private_copies_const_iterator>
    1018             :       private_copies_const_range;
    1019             : 
    1020             :   private_copies_range private_copies() {
    1021           0 :     return private_copies_range(getPrivateCopies().begin(),
    1022           0 :                                 getPrivateCopies().end());
    1023             :   }
    1024             :   private_copies_const_range private_copies() const {
    1025             :     return private_copies_const_range(getPrivateCopies().begin(),
    1026             :                                       getPrivateCopies().end());
    1027             :   }
    1028             : 
    1029             :   StmtRange children() {
    1030             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1031             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1032             :   }
    1033             : 
    1034             :   static bool classof(const OMPClause *T) {
    1035             :     return T->getClauseKind() == OMPC_private;
    1036             :   }
    1037             : };
    1038             : 
    1039             : /// \brief This represents clause 'firstprivate' in the '#pragma omp ...'
    1040             : /// directives.
    1041             : ///
    1042             : /// \code
    1043             : /// #pragma omp parallel firstprivate(a,b)
    1044             : /// \endcode
    1045             : /// In this example directive '#pragma omp parallel' has clause 'firstprivate'
    1046             : /// with the variables 'a' and 'b'.
    1047             : ///
    1048             : class OMPFirstprivateClause : public OMPVarListClause<OMPFirstprivateClause> {
    1049             :   friend class OMPClauseReader;
    1050             : 
    1051             :   /// \brief Build clause with number of variables \a N.
    1052             :   ///
    1053             :   /// \param StartLoc Starting location of the clause.
    1054             :   /// \param LParenLoc Location of '('.
    1055             :   /// \param EndLoc Ending location of the clause.
    1056             :   /// \param N Number of the variables in the clause.
    1057             :   ///
    1058             :   OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1059             :                         SourceLocation EndLoc, unsigned N)
    1060             :       : OMPVarListClause<OMPFirstprivateClause>(OMPC_firstprivate, StartLoc,
    1061             :                                                 LParenLoc, EndLoc, N) {}
    1062             : 
    1063             :   /// \brief Build an empty clause.
    1064             :   ///
    1065             :   /// \param N Number of variables.
    1066             :   ///
    1067             :   explicit OMPFirstprivateClause(unsigned N)
    1068             :       : OMPVarListClause<OMPFirstprivateClause>(
    1069             :             OMPC_firstprivate, SourceLocation(), SourceLocation(),
    1070             :             SourceLocation(), N) {}
    1071             :   /// \brief Sets the list of references to private copies with initializers for
    1072             :   /// new private variables.
    1073             :   /// \param VL List of references.
    1074             :   void setPrivateCopies(ArrayRef<Expr *> VL);
    1075             : 
    1076             :   /// \brief Gets the list of references to private copies with initializers for
    1077             :   /// new private variables.
    1078             :   MutableArrayRef<Expr *> getPrivateCopies() {
    1079           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    1080             :   }
    1081             :   ArrayRef<const Expr *> getPrivateCopies() const {
    1082             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    1083             :   }
    1084             : 
    1085             :   /// \brief Sets the list of references to initializer variables for new
    1086             :   /// private variables.
    1087             :   /// \param VL List of references.
    1088             :   void setInits(ArrayRef<Expr *> VL);
    1089             : 
    1090             :   /// \brief Gets the list of references to initializer variables for new
    1091             :   /// private variables.
    1092             :   MutableArrayRef<Expr *> getInits() {
    1093           0 :     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
    1094             :   }
    1095             :   ArrayRef<const Expr *> getInits() const {
    1096             :     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
    1097             :   }
    1098             : 
    1099             : public:
    1100             :   /// \brief Creates clause with a list of variables \a VL.
    1101             :   ///
    1102             :   /// \param C AST context.
    1103             :   /// \param StartLoc Starting location of the clause.
    1104             :   /// \param LParenLoc Location of '('.
    1105             :   /// \param EndLoc Ending location of the clause.
    1106             :   /// \param VL List of references to the original variables.
    1107             :   /// \param PrivateVL List of references to private copies with initializers.
    1108             :   /// \param InitVL List of references to auto generated variables used for
    1109             :   /// initialization of a single array element. Used if firstprivate variable is
    1110             :   /// of array type.
    1111             :   ///
    1112             :   static OMPFirstprivateClause *
    1113             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    1114             :          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
    1115             :          ArrayRef<Expr *> InitVL);
    1116             :   /// \brief Creates an empty clause with the place for \a N variables.
    1117             :   ///
    1118             :   /// \param C AST context.
    1119             :   /// \param N The number of variables.
    1120             :   ///
    1121             :   static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
    1122             : 
    1123             :   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
    1124             :   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
    1125             :   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
    1126             :   typedef llvm::iterator_range<private_copies_const_iterator>
    1127             :       private_copies_const_range;
    1128             : 
    1129             :   private_copies_range private_copies() {
    1130           0 :     return private_copies_range(getPrivateCopies().begin(),
    1131           0 :                                 getPrivateCopies().end());
    1132             :   }
    1133             :   private_copies_const_range private_copies() const {
    1134             :     return private_copies_const_range(getPrivateCopies().begin(),
    1135             :                                       getPrivateCopies().end());
    1136             :   }
    1137             : 
    1138             :   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
    1139             :   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
    1140             :   typedef llvm::iterator_range<inits_iterator> inits_range;
    1141             :   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
    1142             : 
    1143             :   inits_range inits() {
    1144           0 :     return inits_range(getInits().begin(), getInits().end());
    1145             :   }
    1146             :   inits_const_range inits() const {
    1147             :     return inits_const_range(getInits().begin(), getInits().end());
    1148             :   }
    1149             : 
    1150             :   StmtRange children() {
    1151             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1152             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1153             :   }
    1154             : 
    1155             :   static bool classof(const OMPClause *T) {
    1156             :     return T->getClauseKind() == OMPC_firstprivate;
    1157             :   }
    1158             : };
    1159             : 
    1160             : /// \brief This represents clause 'lastprivate' in the '#pragma omp ...'
    1161             : /// directives.
    1162             : ///
    1163             : /// \code
    1164             : /// #pragma omp simd lastprivate(a,b)
    1165             : /// \endcode
    1166             : /// In this example directive '#pragma omp simd' has clause 'lastprivate'
    1167             : /// with the variables 'a' and 'b'.
    1168             : class OMPLastprivateClause : public OMPVarListClause<OMPLastprivateClause> {
    1169             :   // There are 4 additional tail-allocated arrays at the end of the class:
    1170             :   // 1. Contains list of pseudo variables with the default initialization for
    1171             :   // each non-firstprivate variables. Used in codegen for initialization of
    1172             :   // lastprivate copies.
    1173             :   // 2. List of helper expressions for proper generation of assignment operation
    1174             :   // required for lastprivate clause. This list represents private variables
    1175             :   // (for arrays, single array element).
    1176             :   // 3. List of helper expressions for proper generation of assignment operation
    1177             :   // required for lastprivate clause. This list represents original variables
    1178             :   // (for arrays, single array element).
    1179             :   // 4. List of helper expressions that represents assignment operation:
    1180             :   // \code
    1181             :   // DstExprs = SrcExprs;
    1182             :   // \endcode
    1183             :   // Required for proper codegen of final assignment performed by the
    1184             :   // lastprivate clause.
    1185             :   //
    1186             :   friend class OMPClauseReader;
    1187             : 
    1188             :   /// \brief Build clause with number of variables \a N.
    1189             :   ///
    1190             :   /// \param StartLoc Starting location of the clause.
    1191             :   /// \param LParenLoc Location of '('.
    1192             :   /// \param EndLoc Ending location of the clause.
    1193             :   /// \param N Number of the variables in the clause.
    1194             :   ///
    1195             :   OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1196             :                        SourceLocation EndLoc, unsigned N)
    1197             :       : OMPVarListClause<OMPLastprivateClause>(OMPC_lastprivate, StartLoc,
    1198             :                                                LParenLoc, EndLoc, N) {}
    1199             : 
    1200             :   /// \brief Build an empty clause.
    1201             :   ///
    1202             :   /// \param N Number of variables.
    1203             :   ///
    1204             :   explicit OMPLastprivateClause(unsigned N)
    1205             :       : OMPVarListClause<OMPLastprivateClause>(
    1206             :             OMPC_lastprivate, SourceLocation(), SourceLocation(),
    1207             :             SourceLocation(), N) {}
    1208             : 
    1209             :   /// \brief Get the list of helper expressions for initialization of private
    1210             :   /// copies for lastprivate variables.
    1211             :   MutableArrayRef<Expr *> getPrivateCopies() {
    1212           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    1213             :   }
    1214             :   ArrayRef<const Expr *> getPrivateCopies() const {
    1215             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    1216             :   }
    1217             : 
    1218             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1219             :   /// clause. These expressions represent private variables (for arrays, single
    1220             :   /// array element) in the final assignment statement performed by the
    1221             :   /// lastprivate clause.
    1222             :   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
    1223             : 
    1224             :   /// \brief Get the list of helper source expressions.
    1225             :   MutableArrayRef<Expr *> getSourceExprs() {
    1226           0 :     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
    1227             :   }
    1228             :   ArrayRef<const Expr *> getSourceExprs() const {
    1229             :     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
    1230             :   }
    1231             : 
    1232             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1233             :   /// clause. These expressions represent original variables (for arrays, single
    1234             :   /// array element) in the final assignment statement performed by the
    1235             :   /// lastprivate clause.
    1236             :   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
    1237             : 
    1238             :   /// \brief Get the list of helper destination expressions.
    1239             :   MutableArrayRef<Expr *> getDestinationExprs() {
    1240           0 :     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
    1241             :   }
    1242             :   ArrayRef<const Expr *> getDestinationExprs() const {
    1243             :     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
    1244             :   }
    1245             : 
    1246             :   /// \brief Set list of helper assignment expressions, required for proper
    1247             :   /// codegen of the clause. These expressions are assignment expressions that
    1248             :   /// assign private copy of the variable to original variable.
    1249             :   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
    1250             : 
    1251             :   /// \brief Get the list of helper assignment expressions.
    1252             :   MutableArrayRef<Expr *> getAssignmentOps() {
    1253           0 :     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
    1254             :   }
    1255             :   ArrayRef<const Expr *> getAssignmentOps() const {
    1256             :     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
    1257             :   }
    1258             : 
    1259             : public:
    1260             :   /// \brief Creates clause with a list of variables \a VL.
    1261             :   ///
    1262             :   /// \param C AST context.
    1263             :   /// \param StartLoc Starting location of the clause.
    1264             :   /// \param LParenLoc Location of '('.
    1265             :   /// \param EndLoc Ending location of the clause.
    1266             :   /// \param VL List of references to the variables.
    1267             :   /// \param SrcExprs List of helper expressions for proper generation of
    1268             :   /// assignment operation required for lastprivate clause. This list represents
    1269             :   /// private variables (for arrays, single array element).
    1270             :   /// \param DstExprs List of helper expressions for proper generation of
    1271             :   /// assignment operation required for lastprivate clause. This list represents
    1272             :   /// original variables (for arrays, single array element).
    1273             :   /// \param AssignmentOps List of helper expressions that represents assignment
    1274             :   /// operation:
    1275             :   /// \code
    1276             :   /// DstExprs = SrcExprs;
    1277             :   /// \endcode
    1278             :   /// Required for proper codegen of final assignment performed by the
    1279             :   /// lastprivate clause.
    1280             :   ///
    1281             :   ///
    1282             :   static OMPLastprivateClause *
    1283             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    1284             :          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    1285             :          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
    1286             :   /// \brief Creates an empty clause with the place for \a N variables.
    1287             :   ///
    1288             :   /// \param C AST context.
    1289             :   /// \param N The number of variables.
    1290             :   ///
    1291             :   static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
    1292             : 
    1293             :   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
    1294             :   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
    1295             :   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
    1296             :   typedef llvm::iterator_range<helper_expr_const_iterator>
    1297             :       helper_expr_const_range;
    1298             : 
    1299             :   /// \brief Set list of helper expressions, required for generation of private
    1300             :   /// copies of original lastprivate variables.
    1301             :   void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
    1302             : 
    1303             :   helper_expr_const_range private_copies() const {
    1304             :     return helper_expr_const_range(getPrivateCopies().begin(),
    1305             :                                    getPrivateCopies().end());
    1306             :   }
    1307             :   helper_expr_range private_copies() {
    1308           0 :     return helper_expr_range(getPrivateCopies().begin(),
    1309           0 :                              getPrivateCopies().end());
    1310             :   }
    1311             :   helper_expr_const_range source_exprs() const {
    1312             :     return helper_expr_const_range(getSourceExprs().begin(),
    1313             :                                    getSourceExprs().end());
    1314             :   }
    1315             :   helper_expr_range source_exprs() {
    1316           0 :     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
    1317             :   }
    1318             :   helper_expr_const_range destination_exprs() const {
    1319             :     return helper_expr_const_range(getDestinationExprs().begin(),
    1320             :                                    getDestinationExprs().end());
    1321             :   }
    1322             :   helper_expr_range destination_exprs() {
    1323           0 :     return helper_expr_range(getDestinationExprs().begin(),
    1324           0 :                              getDestinationExprs().end());
    1325             :   }
    1326             :   helper_expr_const_range assignment_ops() const {
    1327             :     return helper_expr_const_range(getAssignmentOps().begin(),
    1328             :                                    getAssignmentOps().end());
    1329             :   }
    1330             :   helper_expr_range assignment_ops() {
    1331           0 :     return helper_expr_range(getAssignmentOps().begin(),
    1332           0 :                              getAssignmentOps().end());
    1333             :   }
    1334             : 
    1335             :   StmtRange children() {
    1336             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1337             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1338             :   }
    1339             : 
    1340             :   static bool classof(const OMPClause *T) {
    1341             :     return T->getClauseKind() == OMPC_lastprivate;
    1342             :   }
    1343             : };
    1344             : 
    1345             : /// \brief This represents clause 'shared' in the '#pragma omp ...' directives.
    1346             : ///
    1347             : /// \code
    1348             : /// #pragma omp parallel shared(a,b)
    1349             : /// \endcode
    1350             : /// In this example directive '#pragma omp parallel' has clause 'shared'
    1351             : /// with the variables 'a' and 'b'.
    1352             : ///
    1353             : class OMPSharedClause : public OMPVarListClause<OMPSharedClause> {
    1354             :   /// \brief Build clause with number of variables \a N.
    1355             :   ///
    1356             :   /// \param StartLoc Starting location of the clause.
    1357             :   /// \param LParenLoc Location of '('.
    1358             :   /// \param EndLoc Ending location of the clause.
    1359             :   /// \param N Number of the variables in the clause.
    1360             :   ///
    1361             :   OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1362             :                   SourceLocation EndLoc, unsigned N)
    1363             :       : OMPVarListClause<OMPSharedClause>(OMPC_shared, StartLoc, LParenLoc,
    1364             :                                           EndLoc, N) {}
    1365             : 
    1366             :   /// \brief Build an empty clause.
    1367             :   ///
    1368             :   /// \param N Number of variables.
    1369             :   ///
    1370             :   explicit OMPSharedClause(unsigned N)
    1371             :       : OMPVarListClause<OMPSharedClause>(OMPC_shared, SourceLocation(),
    1372             :                                           SourceLocation(), SourceLocation(),
    1373             :                                           N) {}
    1374             : 
    1375             : public:
    1376             :   /// \brief Creates clause with a list of variables \a VL.
    1377             :   ///
    1378             :   /// \param C AST context.
    1379             :   /// \param StartLoc Starting location of the clause.
    1380             :   /// \param LParenLoc Location of '('.
    1381             :   /// \param EndLoc Ending location of the clause.
    1382             :   /// \param VL List of references to the variables.
    1383             :   ///
    1384             :   static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
    1385             :                                  SourceLocation LParenLoc,
    1386             :                                  SourceLocation EndLoc, ArrayRef<Expr *> VL);
    1387             :   /// \brief Creates an empty clause with \a N variables.
    1388             :   ///
    1389             :   /// \param C AST context.
    1390             :   /// \param N The number of variables.
    1391             :   ///
    1392             :   static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
    1393             : 
    1394             :   StmtRange children() {
    1395             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1396             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1397             :   }
    1398             : 
    1399             :   static bool classof(const OMPClause *T) {
    1400             :     return T->getClauseKind() == OMPC_shared;
    1401             :   }
    1402             : };
    1403             : 
    1404             : /// \brief This represents clause 'reduction' in the '#pragma omp ...'
    1405             : /// directives.
    1406             : ///
    1407             : /// \code
    1408             : /// #pragma omp parallel reduction(+:a,b)
    1409             : /// \endcode
    1410             : /// In this example directive '#pragma omp parallel' has clause 'reduction'
    1411             : /// with operator '+' and the variables 'a' and 'b'.
    1412             : ///
    1413             : class OMPReductionClause : public OMPVarListClause<OMPReductionClause> {
    1414             :   friend class OMPClauseReader;
    1415             :   /// \brief Location of ':'.
    1416             :   SourceLocation ColonLoc;
    1417             :   /// \brief Nested name specifier for C++.
    1418             :   NestedNameSpecifierLoc QualifierLoc;
    1419             :   /// \brief Name of custom operator.
    1420             :   DeclarationNameInfo NameInfo;
    1421             : 
    1422             :   /// \brief Build clause with number of variables \a N.
    1423             :   ///
    1424             :   /// \param StartLoc Starting location of the clause.
    1425             :   /// \param LParenLoc Location of '('.
    1426             :   /// \param EndLoc Ending location of the clause.
    1427             :   /// \param ColonLoc Location of ':'.
    1428             :   /// \param N Number of the variables in the clause.
    1429             :   /// \param QualifierLoc The nested-name qualifier with location information
    1430             :   /// \param NameInfo The full name info for reduction identifier.
    1431             :   ///
    1432             :   OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1433             :                      SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N,
    1434             :                      NestedNameSpecifierLoc QualifierLoc,
    1435             :                      const DeclarationNameInfo &NameInfo)
    1436             :       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, StartLoc,
    1437             :                                              LParenLoc, EndLoc, N),
    1438             :         ColonLoc(ColonLoc), QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
    1439             : 
    1440             :   /// \brief Build an empty clause.
    1441             :   ///
    1442             :   /// \param N Number of variables.
    1443             :   ///
    1444             :   explicit OMPReductionClause(unsigned N)
    1445             :       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, SourceLocation(),
    1446             :                                              SourceLocation(), SourceLocation(),
    1447             :                                              N),
    1448             :         ColonLoc(), QualifierLoc(), NameInfo() {}
    1449             : 
    1450             :   /// \brief Sets location of ':' symbol in clause.
    1451             :   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
    1452             :   /// \brief Sets the name info for specified reduction identifier.
    1453             :   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
    1454             :   /// \brief Sets the nested name specifier.
    1455             :   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
    1456             : 
    1457             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1458             :   /// clause. These expressions represent LHS expression in the final
    1459             :   /// reduction expression performed by the reduction clause.
    1460             :   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
    1461             : 
    1462             :   /// \brief Get the list of helper LHS expressions.
    1463             :   MutableArrayRef<Expr *> getLHSExprs() {
    1464           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    1465             :   }
    1466             :   ArrayRef<const Expr *> getLHSExprs() const {
    1467             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    1468             :   }
    1469             : 
    1470             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1471             :   /// clause. These expressions represent RHS expression in the final
    1472             :   /// reduction expression performed by the reduction clause.
    1473             :   /// Also, variables in these expressions are used for proper initialization of
    1474             :   /// reduction copies.
    1475             :   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
    1476             : 
    1477             :   /// \brief Get the list of helper destination expressions.
    1478             :   MutableArrayRef<Expr *> getRHSExprs() {
    1479           0 :     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
    1480             :   }
    1481             :   ArrayRef<const Expr *> getRHSExprs() const {
    1482             :     return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
    1483             :   }
    1484             : 
    1485             :   /// \brief Set list of helper reduction expressions, required for proper
    1486             :   /// codegen of the clause. These expressions are binary expressions or
    1487             :   /// operator/custom reduction call that calculates new value from source
    1488             :   /// helper expressions to destination helper expressions.
    1489             :   void setReductionOps(ArrayRef<Expr *> ReductionOps);
    1490             : 
    1491             :   /// \brief Get the list of helper reduction expressions.
    1492             :   MutableArrayRef<Expr *> getReductionOps() {
    1493           0 :     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
    1494             :   }
    1495             :   ArrayRef<const Expr *> getReductionOps() const {
    1496             :     return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
    1497             :   }
    1498             : 
    1499             : public:
    1500             :   /// \brief Creates clause with a list of variables \a VL.
    1501             :   ///
    1502             :   /// \param StartLoc Starting location of the clause.
    1503             :   /// \param LParenLoc Location of '('.
    1504             :   /// \param ColonLoc Location of ':'.
    1505             :   /// \param EndLoc Ending location of the clause.
    1506             :   /// \param VL The variables in the clause.
    1507             :   /// \param QualifierLoc The nested-name qualifier with location information
    1508             :   /// \param NameInfo The full name info for reduction identifier.
    1509             :   /// \param LHSExprs List of helper expressions for proper generation of
    1510             :   /// assignment operation required for copyprivate clause. This list represents
    1511             :   /// LHSs of the reduction expressions.
    1512             :   /// \param RHSExprs List of helper expressions for proper generation of
    1513             :   /// assignment operation required for copyprivate clause. This list represents
    1514             :   /// RHSs of the reduction expressions.
    1515             :   /// Also, variables in these expressions are used for proper initialization of
    1516             :   /// reduction copies.
    1517             :   /// \param ReductionOps List of helper expressions that represents reduction
    1518             :   /// expressions:
    1519             :   /// \code
    1520             :   /// LHSExprs binop RHSExprs;
    1521             :   /// operator binop(LHSExpr, RHSExpr);
    1522             :   /// <CutomReduction>(LHSExpr, RHSExpr);
    1523             :   /// \endcode
    1524             :   /// Required for proper codegen of final reduction operation performed by the
    1525             :   /// reduction clause.
    1526             :   ///
    1527             :   static OMPReductionClause *
    1528             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    1529             :          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
    1530             :          NestedNameSpecifierLoc QualifierLoc,
    1531             :          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> LHSExprs,
    1532             :          ArrayRef<Expr *> RHSExprs, ArrayRef<Expr *> ReductionOps);
    1533             :   /// \brief Creates an empty clause with the place for \a N variables.
    1534             :   ///
    1535             :   /// \param C AST context.
    1536             :   /// \param N The number of variables.
    1537             :   ///
    1538             :   static OMPReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
    1539             : 
    1540             :   /// \brief Gets location of ':' symbol in clause.
    1541             :   SourceLocation getColonLoc() const { return ColonLoc; }
    1542             :   /// \brief Gets the name info for specified reduction identifier.
    1543           0 :   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
    1544             :   /// \brief Gets the nested name specifier.
    1545           0 :   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
    1546             : 
    1547             :   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
    1548             :   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
    1549             :   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
    1550             :   typedef llvm::iterator_range<helper_expr_const_iterator>
    1551             :       helper_expr_const_range;
    1552             : 
    1553             :   helper_expr_const_range lhs_exprs() const {
    1554             :     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
    1555             :   }
    1556             :   helper_expr_range lhs_exprs() {
    1557           0 :     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
    1558             :   }
    1559             :   helper_expr_const_range rhs_exprs() const {
    1560             :     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
    1561             :   }
    1562             :   helper_expr_range rhs_exprs() {
    1563           0 :     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
    1564             :   }
    1565             :   helper_expr_const_range reduction_ops() const {
    1566             :     return helper_expr_const_range(getReductionOps().begin(),
    1567             :                                    getReductionOps().end());
    1568             :   }
    1569             :   helper_expr_range reduction_ops() {
    1570           0 :     return helper_expr_range(getReductionOps().begin(),
    1571           0 :                              getReductionOps().end());
    1572             :   }
    1573             : 
    1574             :   StmtRange children() {
    1575             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1576             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1577             :   }
    1578             : 
    1579             :   static bool classof(const OMPClause *T) {
    1580             :     return T->getClauseKind() == OMPC_reduction;
    1581             :   }
    1582             : };
    1583             : 
    1584             : /// \brief This represents clause 'linear' in the '#pragma omp ...'
    1585             : /// directives.
    1586             : ///
    1587             : /// \code
    1588             : /// #pragma omp simd linear(a,b : 2)
    1589             : /// \endcode
    1590             : /// In this example directive '#pragma omp simd' has clause 'linear'
    1591             : /// with variables 'a', 'b' and linear step '2'.
    1592             : ///
    1593             : class OMPLinearClause : public OMPVarListClause<OMPLinearClause> {
    1594             :   friend class OMPClauseReader;
    1595             :   /// \brief Location of ':'.
    1596             :   SourceLocation ColonLoc;
    1597             : 
    1598             :   /// \brief Sets the linear step for clause.
    1599             :   void setStep(Expr *Step) { *(getFinals().end()) = Step; }
    1600             : 
    1601             :   /// \brief Sets the expression to calculate linear step for clause.
    1602             :   void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
    1603             : 
    1604             :   /// \brief Build 'linear' clause with given number of variables \a NumVars.
    1605             :   ///
    1606             :   /// \param StartLoc Starting location of the clause.
    1607             :   /// \param LParenLoc Location of '('.
    1608             :   /// \param ColonLoc Location of ':'.
    1609             :   /// \param EndLoc Ending location of the clause.
    1610             :   /// \param NumVars Number of variables.
    1611             :   ///
    1612             :   OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1613             :                   SourceLocation ColonLoc, SourceLocation EndLoc,
    1614             :                   unsigned NumVars)
    1615             :       : OMPVarListClause<OMPLinearClause>(OMPC_linear, StartLoc, LParenLoc,
    1616             :                                           EndLoc, NumVars),
    1617             :         ColonLoc(ColonLoc) {}
    1618             : 
    1619             :   /// \brief Build an empty clause.
    1620             :   ///
    1621             :   /// \param NumVars Number of variables.
    1622             :   ///
    1623             :   explicit OMPLinearClause(unsigned NumVars)
    1624             :       : OMPVarListClause<OMPLinearClause>(OMPC_linear, SourceLocation(),
    1625             :                                           SourceLocation(), SourceLocation(),
    1626             :                                           NumVars),
    1627             :         ColonLoc(SourceLocation()) {}
    1628             : 
    1629             :   /// \brief Gets the list of initial values for linear variables.
    1630             :   ///
    1631             :   /// There are NumVars expressions with initial values allocated after the
    1632             :   /// varlist, they are followed by NumVars update expressions (used to update
    1633             :   /// the linear variable's value on current iteration) and they are followed by
    1634             :   /// NumVars final expressions (used to calculate the linear variable's
    1635             :   /// value after the loop body). After these lists, there are 2 helper
    1636             :   /// expressions - linear step and a helper to calculate it before the
    1637             :   /// loop body (used when the linear step is not constant):
    1638             :   ///
    1639             :   /// { Vars[] /* in OMPVarListClause */; Inits[]; Updates[]; Finals[];
    1640             :   ///   Step; CalcStep; }
    1641             :   ///
    1642             :   MutableArrayRef<Expr *> getInits() {
    1643           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    1644             :   }
    1645             :   ArrayRef<const Expr *> getInits() const {
    1646             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    1647             :   }
    1648             : 
    1649             :   /// \brief Sets the list of update expressions for linear variables.
    1650             :   MutableArrayRef<Expr *> getUpdates() {
    1651           0 :     return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
    1652             :   }
    1653             :   ArrayRef<const Expr *> getUpdates() const {
    1654             :     return llvm::makeArrayRef(getInits().end(), varlist_size());
    1655             :   }
    1656             : 
    1657             :   /// \brief Sets the list of final update expressions for linear variables.
    1658             :   MutableArrayRef<Expr *> getFinals() {
    1659           0 :     return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
    1660             :   }
    1661             :   ArrayRef<const Expr *> getFinals() const {
    1662             :     return llvm::makeArrayRef(getUpdates().end(), varlist_size());
    1663             :   }
    1664             : 
    1665             :   /// \brief Sets the list of the initial values for linear variables.
    1666             :   /// \param IL List of expressions.
    1667             :   void setInits(ArrayRef<Expr *> IL);
    1668             : 
    1669             : public:
    1670             :   /// \brief Creates clause with a list of variables \a VL and a linear step
    1671             :   /// \a Step.
    1672             :   ///
    1673             :   /// \param C AST Context.
    1674             :   /// \param StartLoc Starting location of the clause.
    1675             :   /// \param LParenLoc Location of '('.
    1676             :   /// \param ColonLoc Location of ':'.
    1677             :   /// \param EndLoc Ending location of the clause.
    1678             :   /// \param VL List of references to the variables.
    1679             :   /// \param IL List of initial values for the variables.
    1680             :   /// \param Step Linear step.
    1681             :   /// \param CalcStep Calculation of the linear step.
    1682             :   static OMPLinearClause *Create(const ASTContext &C, SourceLocation StartLoc,
    1683             :                                  SourceLocation LParenLoc,
    1684             :                                  SourceLocation ColonLoc, SourceLocation EndLoc,
    1685             :                                  ArrayRef<Expr *> VL, ArrayRef<Expr *> IL,
    1686             :                                  Expr *Step, Expr *CalcStep);
    1687             : 
    1688             :   /// \brief Creates an empty clause with the place for \a NumVars variables.
    1689             :   ///
    1690             :   /// \param C AST context.
    1691             :   /// \param NumVars Number of variables.
    1692             :   ///
    1693             :   static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
    1694             : 
    1695             :   /// \brief Sets the location of ':'.
    1696             :   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
    1697             :   /// \brief Returns the location of '('.
    1698             :   SourceLocation getColonLoc() const { return ColonLoc; }
    1699             : 
    1700             :   /// \brief Returns linear step.
    1701           0 :   Expr *getStep() { return *(getFinals().end()); }
    1702             :   /// \brief Returns linear step.
    1703             :   const Expr *getStep() const { return *(getFinals().end()); }
    1704             :   /// \brief Returns expression to calculate linear step.
    1705           0 :   Expr *getCalcStep() { return *(getFinals().end() + 1); }
    1706             :   /// \brief Returns expression to calculate linear step.
    1707             :   const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
    1708             : 
    1709             :   /// \brief Sets the list of update expressions for linear variables.
    1710             :   /// \param UL List of expressions.
    1711             :   void setUpdates(ArrayRef<Expr *> UL);
    1712             : 
    1713             :   /// \brief Sets the list of final update expressions for linear variables.
    1714             :   /// \param FL List of expressions.
    1715             :   void setFinals(ArrayRef<Expr *> FL);
    1716             : 
    1717             :   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
    1718             :   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
    1719             :   typedef llvm::iterator_range<inits_iterator> inits_range;
    1720             :   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
    1721             : 
    1722             :   inits_range inits() {
    1723           0 :     return inits_range(getInits().begin(), getInits().end());
    1724             :   }
    1725             :   inits_const_range inits() const {
    1726             :     return inits_const_range(getInits().begin(), getInits().end());
    1727             :   }
    1728             : 
    1729             :   typedef MutableArrayRef<Expr *>::iterator updates_iterator;
    1730             :   typedef ArrayRef<const Expr *>::iterator updates_const_iterator;
    1731             :   typedef llvm::iterator_range<updates_iterator> updates_range;
    1732             :   typedef llvm::iterator_range<updates_const_iterator> updates_const_range;
    1733             : 
    1734             :   updates_range updates() {
    1735           0 :     return updates_range(getUpdates().begin(), getUpdates().end());
    1736             :   }
    1737             :   updates_const_range updates() const {
    1738             :     return updates_const_range(getUpdates().begin(), getUpdates().end());
    1739             :   }
    1740             : 
    1741             :   typedef MutableArrayRef<Expr *>::iterator finals_iterator;
    1742             :   typedef ArrayRef<const Expr *>::iterator finals_const_iterator;
    1743             :   typedef llvm::iterator_range<finals_iterator> finals_range;
    1744             :   typedef llvm::iterator_range<finals_const_iterator> finals_const_range;
    1745             : 
    1746             :   finals_range finals() {
    1747           0 :     return finals_range(getFinals().begin(), getFinals().end());
    1748             :   }
    1749             :   finals_const_range finals() const {
    1750             :     return finals_const_range(getFinals().begin(), getFinals().end());
    1751             :   }
    1752             : 
    1753             :   StmtRange children() {
    1754             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1755             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1756             :   }
    1757             : 
    1758             :   static bool classof(const OMPClause *T) {
    1759             :     return T->getClauseKind() == OMPC_linear;
    1760             :   }
    1761             : };
    1762             : 
    1763             : /// \brief This represents clause 'aligned' in the '#pragma omp ...'
    1764             : /// directives.
    1765             : ///
    1766             : /// \code
    1767             : /// #pragma omp simd aligned(a,b : 8)
    1768             : /// \endcode
    1769             : /// In this example directive '#pragma omp simd' has clause 'aligned'
    1770             : /// with variables 'a', 'b' and alignment '8'.
    1771             : ///
    1772             : class OMPAlignedClause : public OMPVarListClause<OMPAlignedClause> {
    1773             :   friend class OMPClauseReader;
    1774             :   /// \brief Location of ':'.
    1775             :   SourceLocation ColonLoc;
    1776             : 
    1777             :   /// \brief Sets the alignment for clause.
    1778             :   void setAlignment(Expr *A) { *varlist_end() = A; }
    1779             : 
    1780             :   /// \brief Build 'aligned' clause with given number of variables \a NumVars.
    1781             :   ///
    1782             :   /// \param StartLoc Starting location of the clause.
    1783             :   /// \param LParenLoc Location of '('.
    1784             :   /// \param ColonLoc Location of ':'.
    1785             :   /// \param EndLoc Ending location of the clause.
    1786             :   /// \param NumVars Number of variables.
    1787             :   ///
    1788             :   OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1789             :                    SourceLocation ColonLoc, SourceLocation EndLoc,
    1790             :                    unsigned NumVars)
    1791             :       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, StartLoc, LParenLoc,
    1792             :                                            EndLoc, NumVars),
    1793             :         ColonLoc(ColonLoc) {}
    1794             : 
    1795             :   /// \brief Build an empty clause.
    1796             :   ///
    1797             :   /// \param NumVars Number of variables.
    1798             :   ///
    1799             :   explicit OMPAlignedClause(unsigned NumVars)
    1800             :       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, SourceLocation(),
    1801             :                                            SourceLocation(), SourceLocation(),
    1802             :                                            NumVars),
    1803             :         ColonLoc(SourceLocation()) {}
    1804             : 
    1805             : public:
    1806             :   /// \brief Creates clause with a list of variables \a VL and alignment \a A.
    1807             :   ///
    1808             :   /// \param C AST Context.
    1809             :   /// \param StartLoc Starting location of the clause.
    1810             :   /// \param LParenLoc Location of '('.
    1811             :   /// \param ColonLoc Location of ':'.
    1812             :   /// \param EndLoc Ending location of the clause.
    1813             :   /// \param VL List of references to the variables.
    1814             :   /// \param A Alignment.
    1815             :   static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
    1816             :                                   SourceLocation LParenLoc,
    1817             :                                   SourceLocation ColonLoc,
    1818             :                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
    1819             :                                   Expr *A);
    1820             : 
    1821             :   /// \brief Creates an empty clause with the place for \a NumVars variables.
    1822             :   ///
    1823             :   /// \param C AST context.
    1824             :   /// \param NumVars Number of variables.
    1825             :   ///
    1826             :   static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
    1827             : 
    1828             :   /// \brief Sets the location of ':'.
    1829             :   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
    1830             :   /// \brief Returns the location of ':'.
    1831             :   SourceLocation getColonLoc() const { return ColonLoc; }
    1832             : 
    1833             :   /// \brief Returns alignment.
    1834           0 :   Expr *getAlignment() { return *varlist_end(); }
    1835             :   /// \brief Returns alignment.
    1836             :   const Expr *getAlignment() const { return *varlist_end(); }
    1837             : 
    1838             :   StmtRange children() {
    1839             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1840             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1841             :   }
    1842             : 
    1843             :   static bool classof(const OMPClause *T) {
    1844             :     return T->getClauseKind() == OMPC_aligned;
    1845             :   }
    1846             : };
    1847             : 
    1848             : /// \brief This represents clause 'copyin' in the '#pragma omp ...' directives.
    1849             : ///
    1850             : /// \code
    1851             : /// #pragma omp parallel copyin(a,b)
    1852             : /// \endcode
    1853             : /// In this example directive '#pragma omp parallel' has clause 'copyin'
    1854             : /// with the variables 'a' and 'b'.
    1855             : ///
    1856             : class OMPCopyinClause : public OMPVarListClause<OMPCopyinClause> {
    1857             :   // Class has 3 additional tail allocated arrays:
    1858             :   // 1. List of helper expressions for proper generation of assignment operation
    1859             :   // required for copyin clause. This list represents sources.
    1860             :   // 2. List of helper expressions for proper generation of assignment operation
    1861             :   // required for copyin clause. This list represents destinations.
    1862             :   // 3. List of helper expressions that represents assignment operation:
    1863             :   // \code
    1864             :   // DstExprs = SrcExprs;
    1865             :   // \endcode
    1866             :   // Required for proper codegen of propagation of master's thread values of
    1867             :   // threadprivate variables to local instances of that variables in other
    1868             :   // implicit threads.
    1869             : 
    1870             :   friend class OMPClauseReader;
    1871             :   /// \brief Build clause with number of variables \a N.
    1872             :   ///
    1873             :   /// \param StartLoc Starting location of the clause.
    1874             :   /// \param LParenLoc Location of '('.
    1875             :   /// \param EndLoc Ending location of the clause.
    1876             :   /// \param N Number of the variables in the clause.
    1877             :   ///
    1878             :   OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    1879             :                   SourceLocation EndLoc, unsigned N)
    1880             :       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, StartLoc, LParenLoc,
    1881             :                                           EndLoc, N) {}
    1882             : 
    1883             :   /// \brief Build an empty clause.
    1884             :   ///
    1885             :   /// \param N Number of variables.
    1886             :   ///
    1887             :   explicit OMPCopyinClause(unsigned N)
    1888             :       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, SourceLocation(),
    1889             :                                           SourceLocation(), SourceLocation(),
    1890             :                                           N) {}
    1891             : 
    1892             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1893             :   /// clause. These expressions represent source expression in the final
    1894             :   /// assignment statement performed by the copyin clause.
    1895             :   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
    1896             : 
    1897             :   /// \brief Get the list of helper source expressions.
    1898             :   MutableArrayRef<Expr *> getSourceExprs() {
    1899           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    1900             :   }
    1901             :   ArrayRef<const Expr *> getSourceExprs() const {
    1902             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    1903             :   }
    1904             : 
    1905             :   /// \brief Set list of helper expressions, required for proper codegen of the
    1906             :   /// clause. These expressions represent destination expression in the final
    1907             :   /// assignment statement performed by the copyin clause.
    1908             :   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
    1909             : 
    1910             :   /// \brief Get the list of helper destination expressions.
    1911             :   MutableArrayRef<Expr *> getDestinationExprs() {
    1912           0 :     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
    1913             :   }
    1914             :   ArrayRef<const Expr *> getDestinationExprs() const {
    1915             :     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
    1916             :   }
    1917             : 
    1918             :   /// \brief Set list of helper assignment expressions, required for proper
    1919             :   /// codegen of the clause. These expressions are assignment expressions that
    1920             :   /// assign source helper expressions to destination helper expressions
    1921             :   /// correspondingly.
    1922             :   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
    1923             : 
    1924             :   /// \brief Get the list of helper assignment expressions.
    1925             :   MutableArrayRef<Expr *> getAssignmentOps() {
    1926           0 :     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
    1927             :   }
    1928             :   ArrayRef<const Expr *> getAssignmentOps() const {
    1929             :     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
    1930             :   }
    1931             : 
    1932             : public:
    1933             :   /// \brief Creates clause with a list of variables \a VL.
    1934             :   ///
    1935             :   /// \param C AST context.
    1936             :   /// \param StartLoc Starting location of the clause.
    1937             :   /// \param LParenLoc Location of '('.
    1938             :   /// \param EndLoc Ending location of the clause.
    1939             :   /// \param VL List of references to the variables.
    1940             :   /// \param SrcExprs List of helper expressions for proper generation of
    1941             :   /// assignment operation required for copyin clause. This list represents
    1942             :   /// sources.
    1943             :   /// \param DstExprs List of helper expressions for proper generation of
    1944             :   /// assignment operation required for copyin clause. This list represents
    1945             :   /// destinations.
    1946             :   /// \param AssignmentOps List of helper expressions that represents assignment
    1947             :   /// operation:
    1948             :   /// \code
    1949             :   /// DstExprs = SrcExprs;
    1950             :   /// \endcode
    1951             :   /// Required for proper codegen of propagation of master's thread values of
    1952             :   /// threadprivate variables to local instances of that variables in other
    1953             :   /// implicit threads.
    1954             :   ///
    1955             :   static OMPCopyinClause *
    1956             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    1957             :          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    1958             :          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
    1959             :   /// \brief Creates an empty clause with \a N variables.
    1960             :   ///
    1961             :   /// \param C AST context.
    1962             :   /// \param N The number of variables.
    1963             :   ///
    1964             :   static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
    1965             : 
    1966             :   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
    1967             :   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
    1968             :   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
    1969             :   typedef llvm::iterator_range<helper_expr_const_iterator>
    1970             :       helper_expr_const_range;
    1971             : 
    1972             :   helper_expr_const_range source_exprs() const {
    1973             :     return helper_expr_const_range(getSourceExprs().begin(),
    1974             :                                    getSourceExprs().end());
    1975             :   }
    1976             :   helper_expr_range source_exprs() {
    1977           0 :     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
    1978             :   }
    1979             :   helper_expr_const_range destination_exprs() const {
    1980             :     return helper_expr_const_range(getDestinationExprs().begin(),
    1981             :                                    getDestinationExprs().end());
    1982             :   }
    1983             :   helper_expr_range destination_exprs() {
    1984           0 :     return helper_expr_range(getDestinationExprs().begin(),
    1985           0 :                              getDestinationExprs().end());
    1986             :   }
    1987             :   helper_expr_const_range assignment_ops() const {
    1988             :     return helper_expr_const_range(getAssignmentOps().begin(),
    1989             :                                    getAssignmentOps().end());
    1990             :   }
    1991             :   helper_expr_range assignment_ops() {
    1992           0 :     return helper_expr_range(getAssignmentOps().begin(),
    1993           0 :                              getAssignmentOps().end());
    1994             :   }
    1995             : 
    1996             :   StmtRange children() {
    1997             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    1998             :                      reinterpret_cast<Stmt **>(varlist_end()));
    1999             :   }
    2000             : 
    2001             :   static bool classof(const OMPClause *T) {
    2002             :     return T->getClauseKind() == OMPC_copyin;
    2003             :   }
    2004             : };
    2005             : 
    2006             : /// \brief This represents clause 'copyprivate' in the '#pragma omp ...'
    2007             : /// directives.
    2008             : ///
    2009             : /// \code
    2010             : /// #pragma omp single copyprivate(a,b)
    2011             : /// \endcode
    2012             : /// In this example directive '#pragma omp single' has clause 'copyprivate'
    2013             : /// with the variables 'a' and 'b'.
    2014             : ///
    2015             : class OMPCopyprivateClause : public OMPVarListClause<OMPCopyprivateClause> {
    2016             :   friend class OMPClauseReader;
    2017             :   /// \brief Build clause with number of variables \a N.
    2018             :   ///
    2019             :   /// \param StartLoc Starting location of the clause.
    2020             :   /// \param LParenLoc Location of '('.
    2021             :   /// \param EndLoc Ending location of the clause.
    2022             :   /// \param N Number of the variables in the clause.
    2023             :   ///
    2024             :   OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    2025             :                        SourceLocation EndLoc, unsigned N)
    2026             :       : OMPVarListClause<OMPCopyprivateClause>(OMPC_copyprivate, StartLoc,
    2027             :                                                LParenLoc, EndLoc, N) {}
    2028             : 
    2029             :   /// \brief Build an empty clause.
    2030             :   ///
    2031             :   /// \param N Number of variables.
    2032             :   ///
    2033             :   explicit OMPCopyprivateClause(unsigned N)
    2034             :       : OMPVarListClause<OMPCopyprivateClause>(
    2035             :             OMPC_copyprivate, SourceLocation(), SourceLocation(),
    2036             :             SourceLocation(), N) {}
    2037             : 
    2038             :   /// \brief Set list of helper expressions, required for proper codegen of the
    2039             :   /// clause. These expressions represent source expression in the final
    2040             :   /// assignment statement performed by the copyprivate clause.
    2041             :   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
    2042             : 
    2043             :   /// \brief Get the list of helper source expressions.
    2044             :   MutableArrayRef<Expr *> getSourceExprs() {
    2045           0 :     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
    2046             :   }
    2047             :   ArrayRef<const Expr *> getSourceExprs() const {
    2048             :     return llvm::makeArrayRef(varlist_end(), varlist_size());
    2049             :   }
    2050             : 
    2051             :   /// \brief Set list of helper expressions, required for proper codegen of the
    2052             :   /// clause. These expressions represent destination expression in the final
    2053             :   /// assignment statement performed by the copyprivate clause.
    2054             :   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
    2055             : 
    2056             :   /// \brief Get the list of helper destination expressions.
    2057             :   MutableArrayRef<Expr *> getDestinationExprs() {
    2058           0 :     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
    2059             :   }
    2060             :   ArrayRef<const Expr *> getDestinationExprs() const {
    2061             :     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
    2062             :   }
    2063             : 
    2064             :   /// \brief Set list of helper assignment expressions, required for proper
    2065             :   /// codegen of the clause. These expressions are assignment expressions that
    2066             :   /// assign source helper expressions to destination helper expressions
    2067             :   /// correspondingly.
    2068             :   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
    2069             : 
    2070             :   /// \brief Get the list of helper assignment expressions.
    2071             :   MutableArrayRef<Expr *> getAssignmentOps() {
    2072           0 :     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
    2073             :   }
    2074             :   ArrayRef<const Expr *> getAssignmentOps() const {
    2075             :     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
    2076             :   }
    2077             : 
    2078             : public:
    2079             :   /// \brief Creates clause with a list of variables \a VL.
    2080             :   ///
    2081             :   /// \param C AST context.
    2082             :   /// \param StartLoc Starting location of the clause.
    2083             :   /// \param LParenLoc Location of '('.
    2084             :   /// \param EndLoc Ending location of the clause.
    2085             :   /// \param VL List of references to the variables.
    2086             :   /// \param SrcExprs List of helper expressions for proper generation of
    2087             :   /// assignment operation required for copyprivate clause. This list represents
    2088             :   /// sources.
    2089             :   /// \param DstExprs List of helper expressions for proper generation of
    2090             :   /// assignment operation required for copyprivate clause. This list represents
    2091             :   /// destinations.
    2092             :   /// \param AssignmentOps List of helper expressions that represents assignment
    2093             :   /// operation:
    2094             :   /// \code
    2095             :   /// DstExprs = SrcExprs;
    2096             :   /// \endcode
    2097             :   /// Required for proper codegen of final assignment performed by the
    2098             :   /// copyprivate clause.
    2099             :   ///
    2100             :   static OMPCopyprivateClause *
    2101             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    2102             :          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
    2103             :          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
    2104             :   /// \brief Creates an empty clause with \a N variables.
    2105             :   ///
    2106             :   /// \param C AST context.
    2107             :   /// \param N The number of variables.
    2108             :   ///
    2109             :   static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
    2110             : 
    2111             :   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
    2112             :   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
    2113             :   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
    2114             :   typedef llvm::iterator_range<helper_expr_const_iterator>
    2115             :       helper_expr_const_range;
    2116             : 
    2117             :   helper_expr_const_range source_exprs() const {
    2118             :     return helper_expr_const_range(getSourceExprs().begin(),
    2119             :                                    getSourceExprs().end());
    2120             :   }
    2121             :   helper_expr_range source_exprs() {
    2122           0 :     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
    2123             :   }
    2124             :   helper_expr_const_range destination_exprs() const {
    2125             :     return helper_expr_const_range(getDestinationExprs().begin(),
    2126             :                                    getDestinationExprs().end());
    2127             :   }
    2128             :   helper_expr_range destination_exprs() {
    2129           0 :     return helper_expr_range(getDestinationExprs().begin(),
    2130           0 :                              getDestinationExprs().end());
    2131             :   }
    2132             :   helper_expr_const_range assignment_ops() const {
    2133             :     return helper_expr_const_range(getAssignmentOps().begin(),
    2134             :                                    getAssignmentOps().end());
    2135             :   }
    2136             :   helper_expr_range assignment_ops() {
    2137           0 :     return helper_expr_range(getAssignmentOps().begin(),
    2138           0 :                              getAssignmentOps().end());
    2139             :   }
    2140             : 
    2141             :   StmtRange children() {
    2142             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    2143             :                      reinterpret_cast<Stmt **>(varlist_end()));
    2144             :   }
    2145             : 
    2146             :   static bool classof(const OMPClause *T) {
    2147             :     return T->getClauseKind() == OMPC_copyprivate;
    2148             :   }
    2149             : };
    2150             : 
    2151             : /// \brief This represents implicit clause 'flush' for the '#pragma omp flush'
    2152             : /// directive.
    2153             : /// This clause does not exist by itself, it can be only as a part of 'omp
    2154             : /// flush' directive. This clause is introduced to keep the original structure
    2155             : /// of \a OMPExecutableDirective class and its derivatives and to use the
    2156             : /// existing infrastructure of clauses with the list of variables.
    2157             : ///
    2158             : /// \code
    2159             : /// #pragma omp flush(a,b)
    2160             : /// \endcode
    2161             : /// In this example directive '#pragma omp flush' has implicit clause 'flush'
    2162             : /// with the variables 'a' and 'b'.
    2163             : ///
    2164             : class OMPFlushClause : public OMPVarListClause<OMPFlushClause> {
    2165             :   /// \brief Build clause with number of variables \a N.
    2166             :   ///
    2167             :   /// \param StartLoc Starting location of the clause.
    2168             :   /// \param LParenLoc Location of '('.
    2169             :   /// \param EndLoc Ending location of the clause.
    2170             :   /// \param N Number of the variables in the clause.
    2171             :   ///
    2172             :   OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    2173             :                  SourceLocation EndLoc, unsigned N)
    2174             :       : OMPVarListClause<OMPFlushClause>(OMPC_flush, StartLoc, LParenLoc,
    2175             :                                          EndLoc, N) {}
    2176             : 
    2177             :   /// \brief Build an empty clause.
    2178             :   ///
    2179             :   /// \param N Number of variables.
    2180             :   ///
    2181             :   explicit OMPFlushClause(unsigned N)
    2182             :       : OMPVarListClause<OMPFlushClause>(OMPC_flush, SourceLocation(),
    2183             :                                          SourceLocation(), SourceLocation(),
    2184             :                                          N) {}
    2185             : 
    2186             : public:
    2187             :   /// \brief Creates clause with a list of variables \a VL.
    2188             :   ///
    2189             :   /// \param C AST context.
    2190             :   /// \param StartLoc Starting location of the clause.
    2191             :   /// \param LParenLoc Location of '('.
    2192             :   /// \param EndLoc Ending location of the clause.
    2193             :   /// \param VL List of references to the variables.
    2194             :   ///
    2195             :   static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
    2196             :                                 SourceLocation LParenLoc, SourceLocation EndLoc,
    2197             :                                 ArrayRef<Expr *> VL);
    2198             :   /// \brief Creates an empty clause with \a N variables.
    2199             :   ///
    2200             :   /// \param C AST context.
    2201             :   /// \param N The number of variables.
    2202             :   ///
    2203             :   static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
    2204             : 
    2205             :   StmtRange children() {
    2206             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    2207             :                      reinterpret_cast<Stmt **>(varlist_end()));
    2208             :   }
    2209             : 
    2210             :   static bool classof(const OMPClause *T) {
    2211             :     return T->getClauseKind() == OMPC_flush;
    2212             :   }
    2213             : };
    2214             : 
    2215             : /// \brief This represents implicit clause 'depend' for the '#pragma omp task'
    2216             : /// directive.
    2217             : ///
    2218             : /// \code
    2219             : /// #pragma omp task depend(in:a,b)
    2220             : /// \endcode
    2221             : /// In this example directive '#pragma omp task' with clause 'depend' with the
    2222             : /// variables 'a' and 'b' with dependency 'in'.
    2223             : ///
    2224             : class OMPDependClause : public OMPVarListClause<OMPDependClause> {
    2225             :   friend class OMPClauseReader;
    2226             :   /// \brief Dependency type (one of in, out, inout).
    2227             :   OpenMPDependClauseKind DepKind;
    2228             :   /// \brief Dependency type location.
    2229             :   SourceLocation DepLoc;
    2230             :   /// \brief Colon location.
    2231             :   SourceLocation ColonLoc;
    2232             :   /// \brief Build clause with number of variables \a N.
    2233             :   ///
    2234             :   /// \param StartLoc Starting location of the clause.
    2235             :   /// \param LParenLoc Location of '('.
    2236             :   /// \param EndLoc Ending location of the clause.
    2237             :   /// \param N Number of the variables in the clause.
    2238             :   ///
    2239             :   OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    2240             :                   SourceLocation EndLoc, unsigned N)
    2241             :       : OMPVarListClause<OMPDependClause>(OMPC_depend, StartLoc, LParenLoc,
    2242             :                                           EndLoc, N),
    2243             :         DepKind(OMPC_DEPEND_unknown) {}
    2244             : 
    2245             :   /// \brief Build an empty clause.
    2246             :   ///
    2247             :   /// \param N Number of variables.
    2248             :   ///
    2249             :   explicit OMPDependClause(unsigned N)
    2250             :       : OMPVarListClause<OMPDependClause>(OMPC_depend, SourceLocation(),
    2251             :                                           SourceLocation(), SourceLocation(),
    2252             :                                           N),
    2253             :         DepKind(OMPC_DEPEND_unknown) {}
    2254             :   /// \brief Set dependency kind.
    2255             :   void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; }
    2256             : 
    2257             :   /// \brief Set dependency kind and its location.
    2258             :   void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; }
    2259             : 
    2260             :   /// \brief Set colon location.
    2261             :   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
    2262             : 
    2263             : public:
    2264             :   /// \brief Creates clause with a list of variables \a VL.
    2265             :   ///
    2266             :   /// \param C AST context.
    2267             :   /// \param StartLoc Starting location of the clause.
    2268             :   /// \param LParenLoc Location of '('.
    2269             :   /// \param EndLoc Ending location of the clause.
    2270             :   /// \param DepKind Dependency type.
    2271             :   /// \param DepLoc Location of the dependency type.
    2272             :   /// \param ColonLoc Colon location.
    2273             :   /// \param VL List of references to the variables.
    2274             :   ///
    2275             :   static OMPDependClause *
    2276             :   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
    2277             :          SourceLocation EndLoc, OpenMPDependClauseKind DepKind,
    2278             :          SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL);
    2279             :   /// \brief Creates an empty clause with \a N variables.
    2280             :   ///
    2281             :   /// \param C AST context.
    2282             :   /// \param N The number of variables.
    2283             :   ///
    2284             :   static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N);
    2285             : 
    2286             :   /// \brief Get dependency type.
    2287             :   OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
    2288             :   /// \brief Get dependency type location.
    2289             :   SourceLocation getDependencyLoc() const { return DepLoc; }
    2290             :   /// \brief Get colon location.
    2291             :   SourceLocation getColonLoc() const { return ColonLoc; }
    2292             : 
    2293             :   StmtRange children() {
    2294             :     return StmtRange(reinterpret_cast<Stmt **>(varlist_begin()),
    2295             :                      reinterpret_cast<Stmt **>(varlist_end()));
    2296             :   }
    2297             : 
    2298             :   static bool classof(const OMPClause *T) {
    2299             :     return T->getClauseKind() == OMPC_depend;
    2300             :   }
    2301             : };
    2302             : 
    2303             : } // end namespace clang
    2304             : 
    2305             : #endif
    2306             : 

Generated by: LCOV version 1.11