Home | History | Annotate | Download | only in AST
      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   OpenMPClauseKind getClauseKind() const { return Kind; }
     57 
     58   bool isImplicit() const { return StartLoc.isInvalid(); }
     59 
     60   typedef StmtIterator child_iterator;
     61   typedef ConstStmtIterator const_child_iterator;
     62   typedef llvm::iterator_range<child_iterator> child_range;
     63   typedef llvm::iterator_range<const_child_iterator> const_child_range;
     64 
     65   child_range children();
     66   const_child_range children() const {
     67     auto Children = const_cast<OMPClause *>(this)->children();
     68     return const_child_range(Children.begin(), Children.end());
     69   }
     70   static bool classof(const OMPClause *) { return true; }
     71 };
     72 
     73 /// Class that handles pre-initialization statement for some clauses, like
     74 /// 'shedule', 'firstprivate' etc.
     75 class OMPClauseWithPreInit {
     76   friend class OMPClauseReader;
     77   /// Pre-initialization statement for the clause.
     78   Stmt *PreInit;
     79 protected:
     80   /// Set pre-initialization statement for the clause.
     81   void setPreInitStmt(Stmt *S) { PreInit = S; }
     82   OMPClauseWithPreInit(const OMPClause *This) : PreInit(nullptr) {
     83     assert(get(This) && "get is not tuned for pre-init.");
     84   }
     85 
     86 public:
     87   /// Get pre-initialization statement for the clause.
     88   const Stmt *getPreInitStmt() const { return PreInit; }
     89   /// Get pre-initialization statement for the clause.
     90   Stmt *getPreInitStmt() { return PreInit; }
     91   static OMPClauseWithPreInit *get(OMPClause *C);
     92   static const OMPClauseWithPreInit *get(const OMPClause *C);
     93 };
     94 
     95 /// Class that handles post-update expression for some clauses, like
     96 /// 'lastprivate', 'reduction' etc.
     97 class OMPClauseWithPostUpdate : public OMPClauseWithPreInit {
     98   friend class OMPClauseReader;
     99   /// Post-update expression for the clause.
    100   Expr *PostUpdate;
    101 protected:
    102   /// Set pre-initialization statement for the clause.
    103   void setPostUpdateExpr(Expr *S) { PostUpdate = S; }
    104   OMPClauseWithPostUpdate(const OMPClause *This)
    105       : OMPClauseWithPreInit(This), PostUpdate(nullptr) {
    106     assert(get(This) && "get is not tuned for post-update.");
    107   }
    108 
    109 public:
    110   /// Get post-update expression for the clause.
    111   const Expr *getPostUpdateExpr() const { return PostUpdate; }
    112   /// Get post-update expression for the clause.
    113   Expr *getPostUpdateExpr() { return PostUpdate; }
    114   static OMPClauseWithPostUpdate *get(OMPClause *C);
    115   static const OMPClauseWithPostUpdate *get(const OMPClause *C);
    116 };
    117 
    118 /// \brief This represents clauses with the list of variables like 'private',
    119 /// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
    120 /// '#pragma omp ...' directives.
    121 template <class T> class OMPVarListClause : public OMPClause {
    122   friend class OMPClauseReader;
    123   /// \brief Location of '('.
    124   SourceLocation LParenLoc;
    125   /// \brief Number of variables in the list.
    126   unsigned NumVars;
    127 
    128 protected:
    129   /// \brief Fetches list of variables associated with this clause.
    130   MutableArrayRef<Expr *> getVarRefs() {
    131     return MutableArrayRef<Expr *>(
    132         static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
    133   }
    134 
    135   /// \brief Sets the list of variables for this clause.
    136   void setVarRefs(ArrayRef<Expr *> VL) {
    137     assert(VL.size() == NumVars &&
    138            "Number of variables is not the same as the preallocated buffer");
    139     std::copy(VL.begin(), VL.end(),
    140               static_cast<T *>(this)->template getTrailingObjects<Expr *>());
    141   }
    142 
    143   /// \brief Build a clause with \a N variables
    144   ///
    145   /// \param K Kind of the clause.
    146   /// \param StartLoc Starting location of the clause (the clause keyword).
    147   /// \param LParenLoc Location of '('.
    148   /// \param EndLoc Ending location of the clause.
    149   /// \param N Number of the variables in the clause.
    150   ///
    151   OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
    152                    SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
    153       : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
    154 
    155 public:
    156   typedef MutableArrayRef<Expr *>::iterator varlist_iterator;
    157   typedef ArrayRef<const Expr *>::iterator varlist_const_iterator;
    158   typedef llvm::iterator_range<varlist_iterator> varlist_range;
    159   typedef llvm::iterator_range<varlist_const_iterator> varlist_const_range;
    160 
    161   unsigned varlist_size() const { return NumVars; }
    162   bool varlist_empty() const { return NumVars == 0; }
    163 
    164   varlist_range varlists() {
    165     return varlist_range(varlist_begin(), varlist_end());
    166   }
    167   varlist_const_range varlists() const {
    168     return varlist_const_range(varlist_begin(), varlist_end());
    169   }
    170 
    171   varlist_iterator varlist_begin() { return getVarRefs().begin(); }
    172   varlist_iterator varlist_end() { return getVarRefs().end(); }
    173   varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
    174   varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
    175 
    176   /// \brief Sets the location of '('.
    177   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    178   /// \brief Returns the location of '('.
    179   SourceLocation getLParenLoc() const { return LParenLoc; }
    180 
    181   /// \brief Fetches list of all variables in the clause.
    182   ArrayRef<const Expr *> getVarRefs() const {
    183     return llvm::makeArrayRef(
    184         static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
    185         NumVars);
    186   }
    187 };
    188 
    189 /// \brief This represents 'if' clause in the '#pragma omp ...' directive.
    190 ///
    191 /// \code
    192 /// #pragma omp parallel if(parallel:a > 5)
    193 /// \endcode
    194 /// In this example directive '#pragma omp parallel' has simple 'if' clause with
    195 /// condition 'a > 5' and directive name modifier 'parallel'.
    196 ///
    197 class OMPIfClause : public OMPClause {
    198   friend class OMPClauseReader;
    199   /// \brief Location of '('.
    200   SourceLocation LParenLoc;
    201   /// \brief Condition of the 'if' clause.
    202   Stmt *Condition;
    203   /// \brief Location of ':' (if any).
    204   SourceLocation ColonLoc;
    205   /// \brief Directive name modifier for the clause.
    206   OpenMPDirectiveKind NameModifier;
    207   /// \brief Name modifier location.
    208   SourceLocation NameModifierLoc;
    209 
    210   /// \brief Set condition.
    211   ///
    212   void setCondition(Expr *Cond) { Condition = Cond; }
    213   /// \brief Set directive name modifier for the clause.
    214   ///
    215   void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
    216   /// \brief Set location of directive name modifier for the clause.
    217   ///
    218   void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
    219   /// \brief Set location of ':'.
    220   ///
    221   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
    222 
    223 public:
    224   /// \brief Build 'if' clause with condition \a Cond.
    225   ///
    226   /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
    227   /// \param Cond Condition of the clause.
    228   /// \param StartLoc Starting location of the clause.
    229   /// \param LParenLoc Location of '('.
    230   /// \param NameModifierLoc Location of directive name modifier.
    231   /// \param ColonLoc [OpenMP 4.1] Location of ':'.
    232   /// \param EndLoc Ending location of the clause.
    233   ///
    234   OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond,
    235               SourceLocation StartLoc, SourceLocation LParenLoc,
    236               SourceLocation NameModifierLoc, SourceLocation ColonLoc,
    237               SourceLocation EndLoc)
    238       : OMPClause(OMPC_if, StartLoc, EndLoc), LParenLoc(LParenLoc),
    239         Condition(Cond), ColonLoc(ColonLoc), NameModifier(NameModifier),
    240         NameModifierLoc(NameModifierLoc) {}
    241 
    242   /// \brief Build an empty clause.
    243   ///
    244   OMPIfClause()
    245       : OMPClause(OMPC_if, SourceLocation(), SourceLocation()), LParenLoc(),
    246         Condition(nullptr), ColonLoc(), NameModifier(OMPD_unknown),
    247         NameModifierLoc() {}
    248 
    249   /// \brief Sets the location of '('.
    250   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    251   /// \brief Returns the location of '('.
    252   SourceLocation getLParenLoc() const { return LParenLoc; }
    253 
    254   /// \brief Return the location of ':'.
    255   SourceLocation getColonLoc() const { return ColonLoc; }
    256 
    257   /// \brief Returns condition.
    258   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
    259   /// \brief Return directive name modifier associated with the clause.
    260   OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
    261 
    262   /// \brief Return the location of directive name modifier.
    263   SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
    264 
    265   static bool classof(const OMPClause *T) {
    266     return T->getClauseKind() == OMPC_if;
    267   }
    268 
    269   child_range children() { return child_range(&Condition, &Condition + 1); }
    270 };
    271 
    272 /// \brief This represents 'final' clause in the '#pragma omp ...' directive.
    273 ///
    274 /// \code
    275 /// #pragma omp task final(a > 5)
    276 /// \endcode
    277 /// In this example directive '#pragma omp task' has simple 'final'
    278 /// clause with condition 'a > 5'.
    279 ///
    280 class OMPFinalClause : public OMPClause {
    281   friend class OMPClauseReader;
    282   /// \brief Location of '('.
    283   SourceLocation LParenLoc;
    284   /// \brief Condition of the 'if' clause.
    285   Stmt *Condition;
    286 
    287   /// \brief Set condition.
    288   ///
    289   void setCondition(Expr *Cond) { Condition = Cond; }
    290 
    291 public:
    292   /// \brief Build 'final' clause with condition \a Cond.
    293   ///
    294   /// \param StartLoc Starting location of the clause.
    295   /// \param LParenLoc Location of '('.
    296   /// \param Cond Condition of the clause.
    297   /// \param EndLoc Ending location of the clause.
    298   ///
    299   OMPFinalClause(Expr *Cond, SourceLocation StartLoc, SourceLocation LParenLoc,
    300                  SourceLocation EndLoc)
    301       : OMPClause(OMPC_final, StartLoc, EndLoc), LParenLoc(LParenLoc),
    302         Condition(Cond) {}
    303 
    304   /// \brief Build an empty clause.
    305   ///
    306   OMPFinalClause()
    307       : OMPClause(OMPC_final, SourceLocation(), SourceLocation()),
    308         LParenLoc(SourceLocation()), Condition(nullptr) {}
    309 
    310   /// \brief Sets the location of '('.
    311   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    312   /// \brief Returns the location of '('.
    313   SourceLocation getLParenLoc() const { return LParenLoc; }
    314 
    315   /// \brief Returns condition.
    316   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
    317 
    318   static bool classof(const OMPClause *T) {
    319     return T->getClauseKind() == OMPC_final;
    320   }
    321 
    322   child_range children() { return child_range(&Condition, &Condition + 1); }
    323 };
    324 
    325 /// \brief This represents 'num_threads' clause in the '#pragma omp ...'
    326 /// directive.
    327 ///
    328 /// \code
    329 /// #pragma omp parallel num_threads(6)
    330 /// \endcode
    331 /// In this example directive '#pragma omp parallel' has simple 'num_threads'
    332 /// clause with number of threads '6'.
    333 ///
    334 class OMPNumThreadsClause : public OMPClause {
    335   friend class OMPClauseReader;
    336   /// \brief Location of '('.
    337   SourceLocation LParenLoc;
    338   /// \brief Condition of the 'num_threads' clause.
    339   Stmt *NumThreads;
    340 
    341   /// \brief Set condition.
    342   ///
    343   void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
    344 
    345 public:
    346   /// \brief Build 'num_threads' clause with condition \a NumThreads.
    347   ///
    348   /// \param NumThreads Number of threads for the construct.
    349   /// \param StartLoc Starting location of the clause.
    350   /// \param LParenLoc Location of '('.
    351   /// \param EndLoc Ending location of the clause.
    352   ///
    353   OMPNumThreadsClause(Expr *NumThreads, SourceLocation StartLoc,
    354                       SourceLocation LParenLoc, SourceLocation EndLoc)
    355       : OMPClause(OMPC_num_threads, StartLoc, EndLoc), LParenLoc(LParenLoc),
    356         NumThreads(NumThreads) {}
    357 
    358   /// \brief Build an empty clause.
    359   ///
    360   OMPNumThreadsClause()
    361       : OMPClause(OMPC_num_threads, SourceLocation(), SourceLocation()),
    362         LParenLoc(SourceLocation()), NumThreads(nullptr) {}
    363 
    364   /// \brief Sets the location of '('.
    365   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    366   /// \brief Returns the location of '('.
    367   SourceLocation getLParenLoc() const { return LParenLoc; }
    368 
    369   /// \brief Returns number of threads.
    370   Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
    371 
    372   static bool classof(const OMPClause *T) {
    373     return T->getClauseKind() == OMPC_num_threads;
    374   }
    375 
    376   child_range children() { return child_range(&NumThreads, &NumThreads + 1); }
    377 };
    378 
    379 /// \brief This represents 'safelen' clause in the '#pragma omp ...'
    380 /// directive.
    381 ///
    382 /// \code
    383 /// #pragma omp simd safelen(4)
    384 /// \endcode
    385 /// In this example directive '#pragma omp simd' has clause 'safelen'
    386 /// with single expression '4'.
    387 /// If the safelen clause is used then no two iterations executed
    388 /// concurrently with SIMD instructions can have a greater distance
    389 /// in the logical iteration space than its value. The parameter of
    390 /// the safelen clause must be a constant positive integer expression.
    391 ///
    392 class OMPSafelenClause : public OMPClause {
    393   friend class OMPClauseReader;
    394   /// \brief Location of '('.
    395   SourceLocation LParenLoc;
    396   /// \brief Safe iteration space distance.
    397   Stmt *Safelen;
    398 
    399   /// \brief Set safelen.
    400   void setSafelen(Expr *Len) { Safelen = Len; }
    401 
    402 public:
    403   /// \brief Build 'safelen' clause.
    404   ///
    405   /// \param Len Expression associated with this clause.
    406   /// \param StartLoc Starting location of the clause.
    407   /// \param EndLoc Ending location of the clause.
    408   ///
    409   OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
    410                    SourceLocation EndLoc)
    411       : OMPClause(OMPC_safelen, StartLoc, EndLoc), LParenLoc(LParenLoc),
    412         Safelen(Len) {}
    413 
    414   /// \brief Build an empty clause.
    415   ///
    416   explicit OMPSafelenClause()
    417       : OMPClause(OMPC_safelen, SourceLocation(), SourceLocation()),
    418         LParenLoc(SourceLocation()), Safelen(nullptr) {}
    419 
    420   /// \brief Sets the location of '('.
    421   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    422   /// \brief Returns the location of '('.
    423   SourceLocation getLParenLoc() const { return LParenLoc; }
    424 
    425   /// \brief Return safe iteration space distance.
    426   Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
    427 
    428   static bool classof(const OMPClause *T) {
    429     return T->getClauseKind() == OMPC_safelen;
    430   }
    431 
    432   child_range children() { return child_range(&Safelen, &Safelen + 1); }
    433 };
    434 
    435 /// \brief This represents 'simdlen' clause in the '#pragma omp ...'
    436 /// directive.
    437 ///
    438 /// \code
    439 /// #pragma omp simd simdlen(4)
    440 /// \endcode
    441 /// In this example directive '#pragma omp simd' has clause 'simdlen'
    442 /// with single expression '4'.
    443 /// If the 'simdlen' clause is used then it specifies the preferred number of
    444 /// iterations to be executed concurrently. The parameter of the 'simdlen'
    445 /// clause must be a constant positive integer expression.
    446 ///
    447 class OMPSimdlenClause : public OMPClause {
    448   friend class OMPClauseReader;
    449   /// \brief Location of '('.
    450   SourceLocation LParenLoc;
    451   /// \brief Safe iteration space distance.
    452   Stmt *Simdlen;
    453 
    454   /// \brief Set simdlen.
    455   void setSimdlen(Expr *Len) { Simdlen = Len; }
    456 
    457 public:
    458   /// \brief Build 'simdlen' clause.
    459   ///
    460   /// \param Len Expression associated with this clause.
    461   /// \param StartLoc Starting location of the clause.
    462   /// \param EndLoc Ending location of the clause.
    463   ///
    464   OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
    465                    SourceLocation EndLoc)
    466       : OMPClause(OMPC_simdlen, StartLoc, EndLoc), LParenLoc(LParenLoc),
    467         Simdlen(Len) {}
    468 
    469   /// \brief Build an empty clause.
    470   ///
    471   explicit OMPSimdlenClause()
    472       : OMPClause(OMPC_simdlen, SourceLocation(), SourceLocation()),
    473         LParenLoc(SourceLocation()), Simdlen(nullptr) {}
    474 
    475   /// \brief Sets the location of '('.
    476   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    477   /// \brief Returns the location of '('.
    478   SourceLocation getLParenLoc() const { return LParenLoc; }
    479 
    480   /// \brief Return safe iteration space distance.
    481   Expr *getSimdlen() const { return cast_or_null<Expr>(Simdlen); }
    482 
    483   static bool classof(const OMPClause *T) {
    484     return T->getClauseKind() == OMPC_simdlen;
    485   }
    486 
    487   child_range children() { return child_range(&Simdlen, &Simdlen + 1); }
    488 };
    489 
    490 /// \brief This represents 'collapse' clause in the '#pragma omp ...'
    491 /// directive.
    492 ///
    493 /// \code
    494 /// #pragma omp simd collapse(3)
    495 /// \endcode
    496 /// In this example directive '#pragma omp simd' has clause 'collapse'
    497 /// with single expression '3'.
    498 /// The parameter must be a constant positive integer expression, it specifies
    499 /// the number of nested loops that should be collapsed into a single iteration
    500 /// space.
    501 ///
    502 class OMPCollapseClause : public OMPClause {
    503   friend class OMPClauseReader;
    504   /// \brief Location of '('.
    505   SourceLocation LParenLoc;
    506   /// \brief Number of for-loops.
    507   Stmt *NumForLoops;
    508 
    509   /// \brief Set the number of associated for-loops.
    510   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
    511 
    512 public:
    513   /// \brief Build 'collapse' clause.
    514   ///
    515   /// \param Num Expression associated with this clause.
    516   /// \param StartLoc Starting location of the clause.
    517   /// \param LParenLoc Location of '('.
    518   /// \param EndLoc Ending location of the clause.
    519   ///
    520   OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
    521                     SourceLocation LParenLoc, SourceLocation EndLoc)
    522       : OMPClause(OMPC_collapse, StartLoc, EndLoc), LParenLoc(LParenLoc),
    523         NumForLoops(Num) {}
    524 
    525   /// \brief Build an empty clause.
    526   ///
    527   explicit OMPCollapseClause()
    528       : OMPClause(OMPC_collapse, SourceLocation(), SourceLocation()),
    529         LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
    530 
    531   /// \brief Sets the location of '('.
    532   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    533   /// \brief Returns the location of '('.
    534   SourceLocation getLParenLoc() const { return LParenLoc; }
    535 
    536   /// \brief Return the number of associated for-loops.
    537   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
    538 
    539   static bool classof(const OMPClause *T) {
    540     return T->getClauseKind() == OMPC_collapse;
    541   }
    542 
    543   child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
    544 };
    545 
    546 /// \brief This represents 'default' clause in the '#pragma omp ...' directive.
    547 ///
    548 /// \code
    549 /// #pragma omp parallel default(shared)
    550 /// \endcode
    551 /// In this example directive '#pragma omp parallel' has simple 'default'
    552 /// clause with kind 'shared'.
    553 ///
    554 class OMPDefaultClause : public OMPClause {
    555   friend class OMPClauseReader;
    556   /// \brief Location of '('.
    557   SourceLocation LParenLoc;
    558   /// \brief A kind of the 'default' clause.
    559   OpenMPDefaultClauseKind Kind;
    560   /// \brief Start location of the kind in source code.
    561   SourceLocation KindKwLoc;
    562 
    563   /// \brief Set kind of the clauses.
    564   ///
    565   /// \param K Argument of clause.
    566   ///
    567   void setDefaultKind(OpenMPDefaultClauseKind K) { Kind = K; }
    568 
    569   /// \brief Set argument location.
    570   ///
    571   /// \param KLoc Argument location.
    572   ///
    573   void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
    574 
    575 public:
    576   /// \brief Build 'default' clause with argument \a A ('none' or 'shared').
    577   ///
    578   /// \param A Argument of the clause ('none' or 'shared').
    579   /// \param ALoc Starting location of the argument.
    580   /// \param StartLoc Starting location of the clause.
    581   /// \param LParenLoc Location of '('.
    582   /// \param EndLoc Ending location of the clause.
    583   ///
    584   OMPDefaultClause(OpenMPDefaultClauseKind A, SourceLocation ALoc,
    585                    SourceLocation StartLoc, SourceLocation LParenLoc,
    586                    SourceLocation EndLoc)
    587       : OMPClause(OMPC_default, StartLoc, EndLoc), LParenLoc(LParenLoc),
    588         Kind(A), KindKwLoc(ALoc) {}
    589 
    590   /// \brief Build an empty clause.
    591   ///
    592   OMPDefaultClause()
    593       : OMPClause(OMPC_default, SourceLocation(), SourceLocation()),
    594         LParenLoc(SourceLocation()), Kind(OMPC_DEFAULT_unknown),
    595         KindKwLoc(SourceLocation()) {}
    596 
    597   /// \brief Sets the location of '('.
    598   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    599   /// \brief Returns the location of '('.
    600   SourceLocation getLParenLoc() const { return LParenLoc; }
    601 
    602   /// \brief Returns kind of the clause.
    603   OpenMPDefaultClauseKind getDefaultKind() const { return Kind; }
    604 
    605   /// \brief Returns location of clause kind.
    606   SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
    607 
    608   static bool classof(const OMPClause *T) {
    609     return T->getClauseKind() == OMPC_default;
    610   }
    611 
    612   child_range children() {
    613     return child_range(child_iterator(), child_iterator());
    614   }
    615 };
    616 
    617 /// \brief This represents 'proc_bind' clause in the '#pragma omp ...'
    618 /// directive.
    619 ///
    620 /// \code
    621 /// #pragma omp parallel proc_bind(master)
    622 /// \endcode
    623 /// In this example directive '#pragma omp parallel' has simple 'proc_bind'
    624 /// clause with kind 'master'.
    625 ///
    626 class OMPProcBindClause : public OMPClause {
    627   friend class OMPClauseReader;
    628   /// \brief Location of '('.
    629   SourceLocation LParenLoc;
    630   /// \brief A kind of the 'proc_bind' clause.
    631   OpenMPProcBindClauseKind Kind;
    632   /// \brief Start location of the kind in source code.
    633   SourceLocation KindKwLoc;
    634 
    635   /// \brief Set kind of the clause.
    636   ///
    637   /// \param K Kind of clause.
    638   ///
    639   void setProcBindKind(OpenMPProcBindClauseKind K) { Kind = K; }
    640 
    641   /// \brief Set clause kind location.
    642   ///
    643   /// \param KLoc Kind location.
    644   ///
    645   void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
    646 
    647 public:
    648   /// \brief Build 'proc_bind' clause with argument \a A ('master', 'close' or
    649   ///        'spread').
    650   ///
    651   /// \param A Argument of the clause ('master', 'close' or 'spread').
    652   /// \param ALoc Starting location of the argument.
    653   /// \param StartLoc Starting location of the clause.
    654   /// \param LParenLoc Location of '('.
    655   /// \param EndLoc Ending location of the clause.
    656   ///
    657   OMPProcBindClause(OpenMPProcBindClauseKind A, SourceLocation ALoc,
    658                     SourceLocation StartLoc, SourceLocation LParenLoc,
    659                     SourceLocation EndLoc)
    660       : OMPClause(OMPC_proc_bind, StartLoc, EndLoc), LParenLoc(LParenLoc),
    661         Kind(A), KindKwLoc(ALoc) {}
    662 
    663   /// \brief Build an empty clause.
    664   ///
    665   OMPProcBindClause()
    666       : OMPClause(OMPC_proc_bind, SourceLocation(), SourceLocation()),
    667         LParenLoc(SourceLocation()), Kind(OMPC_PROC_BIND_unknown),
    668         KindKwLoc(SourceLocation()) {}
    669 
    670   /// \brief Sets the location of '('.
    671   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    672   /// \brief Returns the location of '('.
    673   SourceLocation getLParenLoc() const { return LParenLoc; }
    674 
    675   /// \brief Returns kind of the clause.
    676   OpenMPProcBindClauseKind getProcBindKind() const { return Kind; }
    677 
    678   /// \brief Returns location of clause kind.
    679   SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
    680 
    681   static bool classof(const OMPClause *T) {
    682     return T->getClauseKind() == OMPC_proc_bind;
    683   }
    684 
    685   child_range children() {
    686     return child_range(child_iterator(), child_iterator());
    687   }
    688 };
    689 
    690 /// \brief This represents 'schedule' clause in the '#pragma omp ...' directive.
    691 ///
    692 /// \code
    693 /// #pragma omp for schedule(static, 3)
    694 /// \endcode
    695 /// In this example directive '#pragma omp for' has 'schedule' clause with
    696 /// arguments 'static' and '3'.
    697 ///
    698 class OMPScheduleClause : public OMPClause, public OMPClauseWithPreInit {
    699   friend class OMPClauseReader;
    700   /// \brief Location of '('.
    701   SourceLocation LParenLoc;
    702   /// \brief A kind of the 'schedule' clause.
    703   OpenMPScheduleClauseKind Kind;
    704   /// \brief Modifiers for 'schedule' clause.
    705   enum {FIRST, SECOND, NUM_MODIFIERS};
    706   OpenMPScheduleClauseModifier Modifiers[NUM_MODIFIERS];
    707   /// \brief Locations of modifiers.
    708   SourceLocation ModifiersLoc[NUM_MODIFIERS];
    709   /// \brief Start location of the schedule ind in source code.
    710   SourceLocation KindLoc;
    711   /// \brief Location of ',' (if any).
    712   SourceLocation CommaLoc;
    713   /// \brief Chunk size.
    714   Expr *ChunkSize;
    715 
    716   /// \brief Set schedule kind.
    717   ///
    718   /// \param K Schedule kind.
    719   ///
    720   void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
    721   /// \brief Set the first schedule modifier.
    722   ///
    723   /// \param M Schedule modifier.
    724   ///
    725   void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
    726     Modifiers[FIRST] = M;
    727   }
    728   /// \brief Set the second schedule modifier.
    729   ///
    730   /// \param M Schedule modifier.
    731   ///
    732   void setSecondScheduleModifier(OpenMPScheduleClauseModifier M) {
    733     Modifiers[SECOND] = M;
    734   }
    735   /// \brief Set location of the first schedule modifier.
    736   ///
    737   void setFirstScheduleModifierLoc(SourceLocation Loc) {
    738     ModifiersLoc[FIRST] = Loc;
    739   }
    740   /// \brief Set location of the second schedule modifier.
    741   ///
    742   void setSecondScheduleModifierLoc(SourceLocation Loc) {
    743     ModifiersLoc[SECOND] = Loc;
    744   }
    745   /// \brief Set schedule modifier location.
    746   ///
    747   /// \param M Schedule modifier location.
    748   ///
    749   void setScheduleModifer(OpenMPScheduleClauseModifier M) {
    750     if (Modifiers[FIRST] == OMPC_SCHEDULE_MODIFIER_unknown)
    751       Modifiers[FIRST] = M;
    752     else {
    753       assert(Modifiers[SECOND] == OMPC_SCHEDULE_MODIFIER_unknown);
    754       Modifiers[SECOND] = M;
    755     }
    756   }
    757   /// \brief Sets the location of '('.
    758   ///
    759   /// \param Loc Location of '('.
    760   ///
    761   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    762   /// \brief Set schedule kind start location.
    763   ///
    764   /// \param KLoc Schedule kind location.
    765   ///
    766   void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
    767   /// \brief Set location of ','.
    768   ///
    769   /// \param Loc Location of ','.
    770   ///
    771   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
    772   /// \brief Set chunk size.
    773   ///
    774   /// \param E Chunk size.
    775   ///
    776   void setChunkSize(Expr *E) { ChunkSize = E; }
    777 
    778 public:
    779   /// \brief Build 'schedule' clause with schedule kind \a Kind and chunk size
    780   /// expression \a ChunkSize.
    781   ///
    782   /// \param StartLoc Starting location of the clause.
    783   /// \param LParenLoc Location of '('.
    784   /// \param KLoc Starting location of the argument.
    785   /// \param CommaLoc Location of ','.
    786   /// \param EndLoc Ending location of the clause.
    787   /// \param Kind Schedule kind.
    788   /// \param ChunkSize Chunk size.
    789   /// \param HelperChunkSize Helper chunk size for combined directives.
    790   /// \param M1 The first modifier applied to 'schedule' clause.
    791   /// \param M1Loc Location of the first modifier
    792   /// \param M2 The second modifier applied to 'schedule' clause.
    793   /// \param M2Loc Location of the second modifier
    794   ///
    795   OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
    796                     SourceLocation KLoc, SourceLocation CommaLoc,
    797                     SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
    798                     Expr *ChunkSize, Stmt *HelperChunkSize,
    799                     OpenMPScheduleClauseModifier M1, SourceLocation M1Loc,
    800                     OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
    801       : OMPClause(OMPC_schedule, StartLoc, EndLoc), OMPClauseWithPreInit(this),
    802         LParenLoc(LParenLoc), Kind(Kind), KindLoc(KLoc), CommaLoc(CommaLoc),
    803         ChunkSize(ChunkSize) {
    804     setPreInitStmt(HelperChunkSize);
    805     Modifiers[FIRST] = M1;
    806     Modifiers[SECOND] = M2;
    807     ModifiersLoc[FIRST] = M1Loc;
    808     ModifiersLoc[SECOND] = M2Loc;
    809   }
    810 
    811   /// \brief Build an empty clause.
    812   ///
    813   explicit OMPScheduleClause()
    814       : OMPClause(OMPC_schedule, SourceLocation(), SourceLocation()),
    815         OMPClauseWithPreInit(this), Kind(OMPC_SCHEDULE_unknown),
    816         ChunkSize(nullptr) {
    817     Modifiers[FIRST] = OMPC_SCHEDULE_MODIFIER_unknown;
    818     Modifiers[SECOND] = OMPC_SCHEDULE_MODIFIER_unknown;
    819   }
    820 
    821   /// \brief Get kind of the clause.
    822   ///
    823   OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
    824   /// \brief Get the first modifier of the clause.
    825   ///
    826   OpenMPScheduleClauseModifier getFirstScheduleModifier() const {
    827     return Modifiers[FIRST];
    828   }
    829   /// \brief Get the second modifier of the clause.
    830   ///
    831   OpenMPScheduleClauseModifier getSecondScheduleModifier() const {
    832     return Modifiers[SECOND];
    833   }
    834   /// \brief Get location of '('.
    835   ///
    836   SourceLocation getLParenLoc() { return LParenLoc; }
    837   /// \brief Get kind location.
    838   ///
    839   SourceLocation getScheduleKindLoc() { return KindLoc; }
    840   /// \brief Get the first modifier location.
    841   ///
    842   SourceLocation getFirstScheduleModifierLoc() const {
    843     return ModifiersLoc[FIRST];
    844   }
    845   /// \brief Get the second modifier location.
    846   ///
    847   SourceLocation getSecondScheduleModifierLoc() const {
    848     return ModifiersLoc[SECOND];
    849   }
    850   /// \brief Get location of ','.
    851   ///
    852   SourceLocation getCommaLoc() { return CommaLoc; }
    853   /// \brief Get chunk size.
    854   ///
    855   Expr *getChunkSize() { return ChunkSize; }
    856   /// \brief Get chunk size.
    857   ///
    858   const Expr *getChunkSize() const { return ChunkSize; }
    859 
    860   static bool classof(const OMPClause *T) {
    861     return T->getClauseKind() == OMPC_schedule;
    862   }
    863 
    864   child_range children() {
    865     return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
    866                        reinterpret_cast<Stmt **>(&ChunkSize) + 1);
    867   }
    868 };
    869 
    870 /// \brief This represents 'ordered' clause in the '#pragma omp ...' directive.
    871 ///
    872 /// \code
    873 /// #pragma omp for ordered (2)
    874 /// \endcode
    875 /// In this example directive '#pragma omp for' has 'ordered' clause with
    876 /// parameter 2.
    877 ///
    878 class OMPOrderedClause : public OMPClause {
    879   friend class OMPClauseReader;
    880   /// \brief Location of '('.
    881   SourceLocation LParenLoc;
    882   /// \brief Number of for-loops.
    883   Stmt *NumForLoops;
    884 
    885   /// \brief Set the number of associated for-loops.
    886   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
    887 
    888 public:
    889   /// \brief Build 'ordered' clause.
    890   ///
    891   /// \param Num Expression, possibly associated with this clause.
    892   /// \param StartLoc Starting location of the clause.
    893   /// \param LParenLoc Location of '('.
    894   /// \param EndLoc Ending location of the clause.
    895   ///
    896   OMPOrderedClause(Expr *Num, SourceLocation StartLoc,
    897                     SourceLocation LParenLoc, SourceLocation EndLoc)
    898       : OMPClause(OMPC_ordered, StartLoc, EndLoc), LParenLoc(LParenLoc),
    899         NumForLoops(Num) {}
    900 
    901   /// \brief Build an empty clause.
    902   ///
    903   explicit OMPOrderedClause()
    904       : OMPClause(OMPC_ordered, SourceLocation(), SourceLocation()),
    905         LParenLoc(SourceLocation()), NumForLoops(nullptr) {}
    906 
    907   /// \brief Sets the location of '('.
    908   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
    909   /// \brief Returns the location of '('.
    910   SourceLocation getLParenLoc() const { return LParenLoc; }
    911 
    912   /// \brief Return the number of associated for-loops.
    913   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
    914 
    915   static bool classof(const OMPClause *T) {
    916     return T->getClauseKind() == OMPC_ordered;
    917   }
    918 
    919   child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
    920 };
    921 
    922 /// \brief This represents 'nowait' clause in the '#pragma omp ...' directive.
    923 ///
    924 /// \code
    925 /// #pragma omp for nowait
    926 /// \endcode
    927 /// In this example directive '#pragma omp for' has 'nowait' clause.
    928 ///
    929 class OMPNowaitClause : public OMPClause {
    930 public:
    931   /// \brief Build 'nowait' clause.
    932   ///
    933   /// \param StartLoc Starting location of the clause.
    934   /// \param EndLoc Ending location of the clause.
    935   ///
    936   OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
    937       : OMPClause(OMPC_nowait, StartLoc, EndLoc) {}
    938 
    939   /// \brief Build an empty clause.
    940   ///
    941   OMPNowaitClause()
    942       : OMPClause(OMPC_nowait, SourceLocation(), SourceLocation()) {}
    943 
    944   static bool classof(const OMPClause *T) {
    945     return T->getClauseKind() == OMPC_nowait;
    946   }
    947 
    948   child_range children() {
    949     return child_range(child_iterator(), child_iterator());
    950   }
    951 };
    952 
    953 /// \brief This represents 'untied' clause in the '#pragma omp ...' directive.
    954 ///
    955 /// \code
    956 /// #pragma omp task untied
    957 /// \endcode
    958 /// In this example directive '#pragma omp task' has 'untied' clause.
    959 ///
    960 class OMPUntiedClause : public OMPClause {
    961 public:
    962   /// \brief Build 'untied' clause.
    963   ///
    964   /// \param StartLoc Starting location of the clause.
    965   /// \param EndLoc Ending location of the clause.
    966   ///
    967   OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
    968       : OMPClause(OMPC_untied, StartLoc, EndLoc) {}
    969 
    970   /// \brief Build an empty clause.
    971   ///
    972   OMPUntiedClause()
    973       : OMPClause(OMPC_untied, SourceLocation(), SourceLocation()) {}
    974 
    975   static bool classof(const OMPClause *T) {
    976     return T->getClauseKind() == OMPC_untied;
    977   }
    978 
    979   child_range children() {
    980     return child_range(child_iterator(), child_iterator());
    981   }
    982 };
    983 
    984 /// \brief This represents 'mergeable' clause in the '#pragma omp ...'
    985 /// directive.
    986 ///
    987 /// \code
    988 /// #pragma omp task mergeable
    989 /// \endcode
    990 /// In this example directive '#pragma omp task' has 'mergeable' clause.
    991 ///
    992 class OMPMergeableClause : public OMPClause {
    993 public:
    994   /// \brief Build 'mergeable' clause.
    995   ///
    996   /// \param StartLoc Starting location of the clause.
    997   /// \param EndLoc Ending location of the clause.
    998   ///
    999   OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1000       : OMPClause(OMPC_mergeable, StartLoc, EndLoc) {}
   1001 
   1002   /// \brief Build an empty clause.
   1003   ///
   1004   OMPMergeableClause()
   1005       : OMPClause(OMPC_mergeable, SourceLocation(), SourceLocation()) {}
   1006 
   1007   static bool classof(const OMPClause *T) {
   1008     return T->getClauseKind() == OMPC_mergeable;
   1009   }
   1010 
   1011   child_range children() {
   1012     return child_range(child_iterator(), child_iterator());
   1013   }
   1014 };
   1015 
   1016 /// \brief This represents 'read' clause in the '#pragma omp atomic' directive.
   1017 ///
   1018 /// \code
   1019 /// #pragma omp atomic read
   1020 /// \endcode
   1021 /// In this example directive '#pragma omp atomic' has 'read' clause.
   1022 ///
   1023 class OMPReadClause : public OMPClause {
   1024 public:
   1025   /// \brief Build 'read' clause.
   1026   ///
   1027   /// \param StartLoc Starting location of the clause.
   1028   /// \param EndLoc Ending location of the clause.
   1029   ///
   1030   OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1031       : OMPClause(OMPC_read, StartLoc, EndLoc) {}
   1032 
   1033   /// \brief Build an empty clause.
   1034   ///
   1035   OMPReadClause() : OMPClause(OMPC_read, SourceLocation(), SourceLocation()) {}
   1036 
   1037   static bool classof(const OMPClause *T) {
   1038     return T->getClauseKind() == OMPC_read;
   1039   }
   1040 
   1041   child_range children() {
   1042     return child_range(child_iterator(), child_iterator());
   1043   }
   1044 };
   1045 
   1046 /// \brief This represents 'write' clause in the '#pragma omp atomic' directive.
   1047 ///
   1048 /// \code
   1049 /// #pragma omp atomic write
   1050 /// \endcode
   1051 /// In this example directive '#pragma omp atomic' has 'write' clause.
   1052 ///
   1053 class OMPWriteClause : public OMPClause {
   1054 public:
   1055   /// \brief Build 'write' clause.
   1056   ///
   1057   /// \param StartLoc Starting location of the clause.
   1058   /// \param EndLoc Ending location of the clause.
   1059   ///
   1060   OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1061       : OMPClause(OMPC_write, StartLoc, EndLoc) {}
   1062 
   1063   /// \brief Build an empty clause.
   1064   ///
   1065   OMPWriteClause()
   1066       : OMPClause(OMPC_write, SourceLocation(), SourceLocation()) {}
   1067 
   1068   static bool classof(const OMPClause *T) {
   1069     return T->getClauseKind() == OMPC_write;
   1070   }
   1071 
   1072   child_range children() {
   1073     return child_range(child_iterator(), child_iterator());
   1074   }
   1075 };
   1076 
   1077 /// \brief This represents 'update' clause in the '#pragma omp atomic'
   1078 /// directive.
   1079 ///
   1080 /// \code
   1081 /// #pragma omp atomic update
   1082 /// \endcode
   1083 /// In this example directive '#pragma omp atomic' has 'update' clause.
   1084 ///
   1085 class OMPUpdateClause : public OMPClause {
   1086 public:
   1087   /// \brief Build 'update' clause.
   1088   ///
   1089   /// \param StartLoc Starting location of the clause.
   1090   /// \param EndLoc Ending location of the clause.
   1091   ///
   1092   OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1093       : OMPClause(OMPC_update, StartLoc, EndLoc) {}
   1094 
   1095   /// \brief Build an empty clause.
   1096   ///
   1097   OMPUpdateClause()
   1098       : OMPClause(OMPC_update, SourceLocation(), SourceLocation()) {}
   1099 
   1100   static bool classof(const OMPClause *T) {
   1101     return T->getClauseKind() == OMPC_update;
   1102   }
   1103 
   1104   child_range children() {
   1105     return child_range(child_iterator(), child_iterator());
   1106   }
   1107 };
   1108 
   1109 /// \brief This represents 'capture' clause in the '#pragma omp atomic'
   1110 /// directive.
   1111 ///
   1112 /// \code
   1113 /// #pragma omp atomic capture
   1114 /// \endcode
   1115 /// In this example directive '#pragma omp atomic' has 'capture' clause.
   1116 ///
   1117 class OMPCaptureClause : public OMPClause {
   1118 public:
   1119   /// \brief Build 'capture' clause.
   1120   ///
   1121   /// \param StartLoc Starting location of the clause.
   1122   /// \param EndLoc Ending location of the clause.
   1123   ///
   1124   OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1125       : OMPClause(OMPC_capture, StartLoc, EndLoc) {}
   1126 
   1127   /// \brief Build an empty clause.
   1128   ///
   1129   OMPCaptureClause()
   1130       : OMPClause(OMPC_capture, SourceLocation(), SourceLocation()) {}
   1131 
   1132   static bool classof(const OMPClause *T) {
   1133     return T->getClauseKind() == OMPC_capture;
   1134   }
   1135 
   1136   child_range children() {
   1137     return child_range(child_iterator(), child_iterator());
   1138   }
   1139 };
   1140 
   1141 /// \brief This represents 'seq_cst' clause in the '#pragma omp atomic'
   1142 /// directive.
   1143 ///
   1144 /// \code
   1145 /// #pragma omp atomic seq_cst
   1146 /// \endcode
   1147 /// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
   1148 ///
   1149 class OMPSeqCstClause : public OMPClause {
   1150 public:
   1151   /// \brief Build 'seq_cst' clause.
   1152   ///
   1153   /// \param StartLoc Starting location of the clause.
   1154   /// \param EndLoc Ending location of the clause.
   1155   ///
   1156   OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
   1157       : OMPClause(OMPC_seq_cst, StartLoc, EndLoc) {}
   1158 
   1159   /// \brief Build an empty clause.
   1160   ///
   1161   OMPSeqCstClause()
   1162       : OMPClause(OMPC_seq_cst, SourceLocation(), SourceLocation()) {}
   1163 
   1164   static bool classof(const OMPClause *T) {
   1165     return T->getClauseKind() == OMPC_seq_cst;
   1166   }
   1167 
   1168   child_range children() {
   1169     return child_range(child_iterator(), child_iterator());
   1170   }
   1171 };
   1172 
   1173 /// \brief This represents clause 'private' in the '#pragma omp ...' directives.
   1174 ///
   1175 /// \code
   1176 /// #pragma omp parallel private(a,b)
   1177 /// \endcode
   1178 /// In this example directive '#pragma omp parallel' has clause 'private'
   1179 /// with the variables 'a' and 'b'.
   1180 ///
   1181 class OMPPrivateClause final
   1182     : public OMPVarListClause<OMPPrivateClause>,
   1183       private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
   1184   friend TrailingObjects;
   1185   friend OMPVarListClause;
   1186   friend class OMPClauseReader;
   1187   /// \brief Build clause with number of variables \a N.
   1188   ///
   1189   /// \param StartLoc Starting location of the clause.
   1190   /// \param LParenLoc Location of '('.
   1191   /// \param EndLoc Ending location of the clause.
   1192   /// \param N Number of the variables in the clause.
   1193   ///
   1194   OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1195                    SourceLocation EndLoc, unsigned N)
   1196       : OMPVarListClause<OMPPrivateClause>(OMPC_private, StartLoc, LParenLoc,
   1197                                            EndLoc, N) {}
   1198 
   1199   /// \brief Build an empty clause.
   1200   ///
   1201   /// \param N Number of variables.
   1202   ///
   1203   explicit OMPPrivateClause(unsigned N)
   1204       : OMPVarListClause<OMPPrivateClause>(OMPC_private, SourceLocation(),
   1205                                            SourceLocation(), SourceLocation(),
   1206                                            N) {}
   1207 
   1208   /// \brief Sets the list of references to private copies with initializers for
   1209   /// new private variables.
   1210   /// \param VL List of references.
   1211   void setPrivateCopies(ArrayRef<Expr *> VL);
   1212 
   1213   /// \brief Gets the list of references to private copies with initializers for
   1214   /// new private variables.
   1215   MutableArrayRef<Expr *> getPrivateCopies() {
   1216     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   1217   }
   1218   ArrayRef<const Expr *> getPrivateCopies() const {
   1219     return llvm::makeArrayRef(varlist_end(), varlist_size());
   1220   }
   1221 
   1222 public:
   1223   /// \brief Creates clause with a list of variables \a VL.
   1224   ///
   1225   /// \param C AST context.
   1226   /// \param StartLoc Starting location of the clause.
   1227   /// \param LParenLoc Location of '('.
   1228   /// \param EndLoc Ending location of the clause.
   1229   /// \param VL List of references to the variables.
   1230   /// \param PrivateVL List of references to private copies with initializers.
   1231   ///
   1232   static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
   1233                                   SourceLocation LParenLoc,
   1234                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
   1235                                   ArrayRef<Expr *> PrivateVL);
   1236   /// \brief Creates an empty clause with the place for \a N variables.
   1237   ///
   1238   /// \param C AST context.
   1239   /// \param N The number of variables.
   1240   ///
   1241   static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
   1242 
   1243   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
   1244   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
   1245   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
   1246   typedef llvm::iterator_range<private_copies_const_iterator>
   1247       private_copies_const_range;
   1248 
   1249   private_copies_range private_copies() {
   1250     return private_copies_range(getPrivateCopies().begin(),
   1251                                 getPrivateCopies().end());
   1252   }
   1253   private_copies_const_range private_copies() const {
   1254     return private_copies_const_range(getPrivateCopies().begin(),
   1255                                       getPrivateCopies().end());
   1256   }
   1257 
   1258   child_range children() {
   1259     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   1260                        reinterpret_cast<Stmt **>(varlist_end()));
   1261   }
   1262 
   1263   static bool classof(const OMPClause *T) {
   1264     return T->getClauseKind() == OMPC_private;
   1265   }
   1266 };
   1267 
   1268 /// \brief This represents clause 'firstprivate' in the '#pragma omp ...'
   1269 /// directives.
   1270 ///
   1271 /// \code
   1272 /// #pragma omp parallel firstprivate(a,b)
   1273 /// \endcode
   1274 /// In this example directive '#pragma omp parallel' has clause 'firstprivate'
   1275 /// with the variables 'a' and 'b'.
   1276 ///
   1277 class OMPFirstprivateClause final
   1278     : public OMPVarListClause<OMPFirstprivateClause>,
   1279       public OMPClauseWithPreInit,
   1280       private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
   1281   friend TrailingObjects;
   1282   friend OMPVarListClause;
   1283   friend class OMPClauseReader;
   1284 
   1285   /// \brief Build clause with number of variables \a N.
   1286   ///
   1287   /// \param StartLoc Starting location of the clause.
   1288   /// \param LParenLoc Location of '('.
   1289   /// \param EndLoc Ending location of the clause.
   1290   /// \param N Number of the variables in the clause.
   1291   ///
   1292   OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1293                         SourceLocation EndLoc, unsigned N)
   1294       : OMPVarListClause<OMPFirstprivateClause>(OMPC_firstprivate, StartLoc,
   1295                                                 LParenLoc, EndLoc, N),
   1296         OMPClauseWithPreInit(this) {}
   1297 
   1298   /// \brief Build an empty clause.
   1299   ///
   1300   /// \param N Number of variables.
   1301   ///
   1302   explicit OMPFirstprivateClause(unsigned N)
   1303       : OMPVarListClause<OMPFirstprivateClause>(
   1304             OMPC_firstprivate, SourceLocation(), SourceLocation(),
   1305             SourceLocation(), N),
   1306         OMPClauseWithPreInit(this) {}
   1307   /// \brief Sets the list of references to private copies with initializers for
   1308   /// new private variables.
   1309   /// \param VL List of references.
   1310   void setPrivateCopies(ArrayRef<Expr *> VL);
   1311 
   1312   /// \brief Gets the list of references to private copies with initializers for
   1313   /// new private variables.
   1314   MutableArrayRef<Expr *> getPrivateCopies() {
   1315     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   1316   }
   1317   ArrayRef<const Expr *> getPrivateCopies() const {
   1318     return llvm::makeArrayRef(varlist_end(), varlist_size());
   1319   }
   1320 
   1321   /// \brief Sets the list of references to initializer variables for new
   1322   /// private variables.
   1323   /// \param VL List of references.
   1324   void setInits(ArrayRef<Expr *> VL);
   1325 
   1326   /// \brief Gets the list of references to initializer variables for new
   1327   /// private variables.
   1328   MutableArrayRef<Expr *> getInits() {
   1329     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
   1330   }
   1331   ArrayRef<const Expr *> getInits() const {
   1332     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
   1333   }
   1334 
   1335 public:
   1336   /// \brief Creates clause with a list of variables \a VL.
   1337   ///
   1338   /// \param C AST context.
   1339   /// \param StartLoc Starting location of the clause.
   1340   /// \param LParenLoc Location of '('.
   1341   /// \param EndLoc Ending location of the clause.
   1342   /// \param VL List of references to the original variables.
   1343   /// \param PrivateVL List of references to private copies with initializers.
   1344   /// \param InitVL List of references to auto generated variables used for
   1345   /// initialization of a single array element. Used if firstprivate variable is
   1346   /// of array type.
   1347   /// \param PreInit Statement that must be executed before entering the OpenMP
   1348   /// region with this clause.
   1349   ///
   1350   static OMPFirstprivateClause *
   1351   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   1352          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
   1353          ArrayRef<Expr *> InitVL, Stmt *PreInit);
   1354   /// \brief Creates an empty clause with the place for \a N variables.
   1355   ///
   1356   /// \param C AST context.
   1357   /// \param N The number of variables.
   1358   ///
   1359   static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
   1360 
   1361   typedef MutableArrayRef<Expr *>::iterator private_copies_iterator;
   1362   typedef ArrayRef<const Expr *>::iterator private_copies_const_iterator;
   1363   typedef llvm::iterator_range<private_copies_iterator> private_copies_range;
   1364   typedef llvm::iterator_range<private_copies_const_iterator>
   1365       private_copies_const_range;
   1366 
   1367   private_copies_range private_copies() {
   1368     return private_copies_range(getPrivateCopies().begin(),
   1369                                 getPrivateCopies().end());
   1370   }
   1371   private_copies_const_range private_copies() const {
   1372     return private_copies_const_range(getPrivateCopies().begin(),
   1373                                       getPrivateCopies().end());
   1374   }
   1375 
   1376   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
   1377   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
   1378   typedef llvm::iterator_range<inits_iterator> inits_range;
   1379   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
   1380 
   1381   inits_range inits() {
   1382     return inits_range(getInits().begin(), getInits().end());
   1383   }
   1384   inits_const_range inits() const {
   1385     return inits_const_range(getInits().begin(), getInits().end());
   1386   }
   1387 
   1388   child_range children() {
   1389     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   1390                        reinterpret_cast<Stmt **>(varlist_end()));
   1391   }
   1392 
   1393   static bool classof(const OMPClause *T) {
   1394     return T->getClauseKind() == OMPC_firstprivate;
   1395   }
   1396 };
   1397 
   1398 /// \brief This represents clause 'lastprivate' in the '#pragma omp ...'
   1399 /// directives.
   1400 ///
   1401 /// \code
   1402 /// #pragma omp simd lastprivate(a,b)
   1403 /// \endcode
   1404 /// In this example directive '#pragma omp simd' has clause 'lastprivate'
   1405 /// with the variables 'a' and 'b'.
   1406 class OMPLastprivateClause final
   1407     : public OMPVarListClause<OMPLastprivateClause>,
   1408       public OMPClauseWithPostUpdate,
   1409       private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
   1410   // There are 4 additional tail-allocated arrays at the end of the class:
   1411   // 1. Contains list of pseudo variables with the default initialization for
   1412   // each non-firstprivate variables. Used in codegen for initialization of
   1413   // lastprivate copies.
   1414   // 2. List of helper expressions for proper generation of assignment operation
   1415   // required for lastprivate clause. This list represents private variables
   1416   // (for arrays, single array element).
   1417   // 3. List of helper expressions for proper generation of assignment operation
   1418   // required for lastprivate clause. This list represents original variables
   1419   // (for arrays, single array element).
   1420   // 4. List of helper expressions that represents assignment operation:
   1421   // \code
   1422   // DstExprs = SrcExprs;
   1423   // \endcode
   1424   // Required for proper codegen of final assignment performed by the
   1425   // lastprivate clause.
   1426   //
   1427   friend TrailingObjects;
   1428   friend OMPVarListClause;
   1429   friend class OMPClauseReader;
   1430 
   1431   /// \brief Build clause with number of variables \a N.
   1432   ///
   1433   /// \param StartLoc Starting location of the clause.
   1434   /// \param LParenLoc Location of '('.
   1435   /// \param EndLoc Ending location of the clause.
   1436   /// \param N Number of the variables in the clause.
   1437   ///
   1438   OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1439                        SourceLocation EndLoc, unsigned N)
   1440       : OMPVarListClause<OMPLastprivateClause>(OMPC_lastprivate, StartLoc,
   1441                                                LParenLoc, EndLoc, N),
   1442         OMPClauseWithPostUpdate(this) {}
   1443 
   1444   /// \brief Build an empty clause.
   1445   ///
   1446   /// \param N Number of variables.
   1447   ///
   1448   explicit OMPLastprivateClause(unsigned N)
   1449       : OMPVarListClause<OMPLastprivateClause>(
   1450             OMPC_lastprivate, SourceLocation(), SourceLocation(),
   1451             SourceLocation(), N),
   1452         OMPClauseWithPostUpdate(this) {}
   1453 
   1454   /// \brief Get the list of helper expressions for initialization of private
   1455   /// copies for lastprivate variables.
   1456   MutableArrayRef<Expr *> getPrivateCopies() {
   1457     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   1458   }
   1459   ArrayRef<const Expr *> getPrivateCopies() const {
   1460     return llvm::makeArrayRef(varlist_end(), varlist_size());
   1461   }
   1462 
   1463   /// \brief Set list of helper expressions, required for proper codegen of the
   1464   /// clause. These expressions represent private variables (for arrays, single
   1465   /// array element) in the final assignment statement performed by the
   1466   /// lastprivate clause.
   1467   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
   1468 
   1469   /// \brief Get the list of helper source expressions.
   1470   MutableArrayRef<Expr *> getSourceExprs() {
   1471     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
   1472   }
   1473   ArrayRef<const Expr *> getSourceExprs() const {
   1474     return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
   1475   }
   1476 
   1477   /// \brief Set list of helper expressions, required for proper codegen of the
   1478   /// clause. These expressions represent original variables (for arrays, single
   1479   /// array element) in the final assignment statement performed by the
   1480   /// lastprivate clause.
   1481   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
   1482 
   1483   /// \brief Get the list of helper destination expressions.
   1484   MutableArrayRef<Expr *> getDestinationExprs() {
   1485     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
   1486   }
   1487   ArrayRef<const Expr *> getDestinationExprs() const {
   1488     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
   1489   }
   1490 
   1491   /// \brief Set list of helper assignment expressions, required for proper
   1492   /// codegen of the clause. These expressions are assignment expressions that
   1493   /// assign private copy of the variable to original variable.
   1494   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
   1495 
   1496   /// \brief Get the list of helper assignment expressions.
   1497   MutableArrayRef<Expr *> getAssignmentOps() {
   1498     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
   1499   }
   1500   ArrayRef<const Expr *> getAssignmentOps() const {
   1501     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
   1502   }
   1503 
   1504 public:
   1505   /// \brief Creates clause with a list of variables \a VL.
   1506   ///
   1507   /// \param C AST context.
   1508   /// \param StartLoc Starting location of the clause.
   1509   /// \param LParenLoc Location of '('.
   1510   /// \param EndLoc Ending location of the clause.
   1511   /// \param VL List of references to the variables.
   1512   /// \param SrcExprs List of helper expressions for proper generation of
   1513   /// assignment operation required for lastprivate clause. This list represents
   1514   /// private variables (for arrays, single array element).
   1515   /// \param DstExprs List of helper expressions for proper generation of
   1516   /// assignment operation required for lastprivate clause. This list represents
   1517   /// original variables (for arrays, single array element).
   1518   /// \param AssignmentOps List of helper expressions that represents assignment
   1519   /// operation:
   1520   /// \code
   1521   /// DstExprs = SrcExprs;
   1522   /// \endcode
   1523   /// Required for proper codegen of final assignment performed by the
   1524   /// lastprivate clause.
   1525   /// \param PreInit Statement that must be executed before entering the OpenMP
   1526   /// region with this clause.
   1527   /// \param PostUpdate Expression that must be executed after exit from the
   1528   /// OpenMP region with this clause.
   1529   ///
   1530   static OMPLastprivateClause *
   1531   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   1532          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
   1533          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
   1534          Stmt *PreInit, Expr *PostUpdate);
   1535   /// \brief Creates an empty clause with the place for \a N variables.
   1536   ///
   1537   /// \param C AST context.
   1538   /// \param N The number of variables.
   1539   ///
   1540   static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
   1541 
   1542   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
   1543   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
   1544   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
   1545   typedef llvm::iterator_range<helper_expr_const_iterator>
   1546       helper_expr_const_range;
   1547 
   1548   /// \brief Set list of helper expressions, required for generation of private
   1549   /// copies of original lastprivate variables.
   1550   void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
   1551 
   1552   helper_expr_const_range private_copies() const {
   1553     return helper_expr_const_range(getPrivateCopies().begin(),
   1554                                    getPrivateCopies().end());
   1555   }
   1556   helper_expr_range private_copies() {
   1557     return helper_expr_range(getPrivateCopies().begin(),
   1558                              getPrivateCopies().end());
   1559   }
   1560   helper_expr_const_range source_exprs() const {
   1561     return helper_expr_const_range(getSourceExprs().begin(),
   1562                                    getSourceExprs().end());
   1563   }
   1564   helper_expr_range source_exprs() {
   1565     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
   1566   }
   1567   helper_expr_const_range destination_exprs() const {
   1568     return helper_expr_const_range(getDestinationExprs().begin(),
   1569                                    getDestinationExprs().end());
   1570   }
   1571   helper_expr_range destination_exprs() {
   1572     return helper_expr_range(getDestinationExprs().begin(),
   1573                              getDestinationExprs().end());
   1574   }
   1575   helper_expr_const_range assignment_ops() const {
   1576     return helper_expr_const_range(getAssignmentOps().begin(),
   1577                                    getAssignmentOps().end());
   1578   }
   1579   helper_expr_range assignment_ops() {
   1580     return helper_expr_range(getAssignmentOps().begin(),
   1581                              getAssignmentOps().end());
   1582   }
   1583 
   1584   child_range children() {
   1585     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   1586                        reinterpret_cast<Stmt **>(varlist_end()));
   1587   }
   1588 
   1589   static bool classof(const OMPClause *T) {
   1590     return T->getClauseKind() == OMPC_lastprivate;
   1591   }
   1592 };
   1593 
   1594 /// \brief This represents clause 'shared' in the '#pragma omp ...' directives.
   1595 ///
   1596 /// \code
   1597 /// #pragma omp parallel shared(a,b)
   1598 /// \endcode
   1599 /// In this example directive '#pragma omp parallel' has clause 'shared'
   1600 /// with the variables 'a' and 'b'.
   1601 ///
   1602 class OMPSharedClause final
   1603     : public OMPVarListClause<OMPSharedClause>,
   1604       private llvm::TrailingObjects<OMPSharedClause, Expr *> {
   1605   friend TrailingObjects;
   1606   friend OMPVarListClause;
   1607   /// \brief Build clause with number of variables \a N.
   1608   ///
   1609   /// \param StartLoc Starting location of the clause.
   1610   /// \param LParenLoc Location of '('.
   1611   /// \param EndLoc Ending location of the clause.
   1612   /// \param N Number of the variables in the clause.
   1613   ///
   1614   OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1615                   SourceLocation EndLoc, unsigned N)
   1616       : OMPVarListClause<OMPSharedClause>(OMPC_shared, StartLoc, LParenLoc,
   1617                                           EndLoc, N) {}
   1618 
   1619   /// \brief Build an empty clause.
   1620   ///
   1621   /// \param N Number of variables.
   1622   ///
   1623   explicit OMPSharedClause(unsigned N)
   1624       : OMPVarListClause<OMPSharedClause>(OMPC_shared, SourceLocation(),
   1625                                           SourceLocation(), SourceLocation(),
   1626                                           N) {}
   1627 
   1628 public:
   1629   /// \brief Creates clause with a list of variables \a VL.
   1630   ///
   1631   /// \param C AST context.
   1632   /// \param StartLoc Starting location of the clause.
   1633   /// \param LParenLoc Location of '('.
   1634   /// \param EndLoc Ending location of the clause.
   1635   /// \param VL List of references to the variables.
   1636   ///
   1637   static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
   1638                                  SourceLocation LParenLoc,
   1639                                  SourceLocation EndLoc, ArrayRef<Expr *> VL);
   1640   /// \brief Creates an empty clause with \a N variables.
   1641   ///
   1642   /// \param C AST context.
   1643   /// \param N The number of variables.
   1644   ///
   1645   static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
   1646 
   1647   child_range children() {
   1648     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   1649                        reinterpret_cast<Stmt **>(varlist_end()));
   1650   }
   1651 
   1652   static bool classof(const OMPClause *T) {
   1653     return T->getClauseKind() == OMPC_shared;
   1654   }
   1655 };
   1656 
   1657 /// \brief This represents clause 'reduction' in the '#pragma omp ...'
   1658 /// directives.
   1659 ///
   1660 /// \code
   1661 /// #pragma omp parallel reduction(+:a,b)
   1662 /// \endcode
   1663 /// In this example directive '#pragma omp parallel' has clause 'reduction'
   1664 /// with operator '+' and the variables 'a' and 'b'.
   1665 ///
   1666 class OMPReductionClause final
   1667     : public OMPVarListClause<OMPReductionClause>,
   1668       public OMPClauseWithPostUpdate,
   1669       private llvm::TrailingObjects<OMPReductionClause, Expr *> {
   1670   friend TrailingObjects;
   1671   friend OMPVarListClause;
   1672   friend class OMPClauseReader;
   1673   /// \brief Location of ':'.
   1674   SourceLocation ColonLoc;
   1675   /// \brief Nested name specifier for C++.
   1676   NestedNameSpecifierLoc QualifierLoc;
   1677   /// \brief Name of custom operator.
   1678   DeclarationNameInfo NameInfo;
   1679 
   1680   /// \brief Build clause with number of variables \a N.
   1681   ///
   1682   /// \param StartLoc Starting location of the clause.
   1683   /// \param LParenLoc Location of '('.
   1684   /// \param EndLoc Ending location of the clause.
   1685   /// \param ColonLoc Location of ':'.
   1686   /// \param N Number of the variables in the clause.
   1687   /// \param QualifierLoc The nested-name qualifier with location information
   1688   /// \param NameInfo The full name info for reduction identifier.
   1689   ///
   1690   OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1691                      SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N,
   1692                      NestedNameSpecifierLoc QualifierLoc,
   1693                      const DeclarationNameInfo &NameInfo)
   1694       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, StartLoc,
   1695                                              LParenLoc, EndLoc, N),
   1696         OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
   1697         QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
   1698 
   1699   /// \brief Build an empty clause.
   1700   ///
   1701   /// \param N Number of variables.
   1702   ///
   1703   explicit OMPReductionClause(unsigned N)
   1704       : OMPVarListClause<OMPReductionClause>(OMPC_reduction, SourceLocation(),
   1705                                              SourceLocation(), SourceLocation(),
   1706                                              N),
   1707         OMPClauseWithPostUpdate(this), ColonLoc(), QualifierLoc(), NameInfo() {}
   1708 
   1709   /// \brief Sets location of ':' symbol in clause.
   1710   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
   1711   /// \brief Sets the name info for specified reduction identifier.
   1712   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
   1713   /// \brief Sets the nested name specifier.
   1714   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
   1715 
   1716   /// \brief Set list of helper expressions, required for proper codegen of the
   1717   /// clause. These expressions represent private copy of the reduction
   1718   /// variable.
   1719   void setPrivates(ArrayRef<Expr *> Privates);
   1720 
   1721   /// \brief Get the list of helper privates.
   1722   MutableArrayRef<Expr *> getPrivates() {
   1723     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   1724   }
   1725   ArrayRef<const Expr *> getPrivates() const {
   1726     return llvm::makeArrayRef(varlist_end(), varlist_size());
   1727   }
   1728 
   1729   /// \brief Set list of helper expressions, required for proper codegen of the
   1730   /// clause. These expressions represent LHS expression in the final
   1731   /// reduction expression performed by the reduction clause.
   1732   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
   1733 
   1734   /// \brief Get the list of helper LHS expressions.
   1735   MutableArrayRef<Expr *> getLHSExprs() {
   1736     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
   1737   }
   1738   ArrayRef<const Expr *> getLHSExprs() const {
   1739     return llvm::makeArrayRef(getPrivates().end(), varlist_size());
   1740   }
   1741 
   1742   /// \brief Set list of helper expressions, required for proper codegen of the
   1743   /// clause. These expressions represent RHS expression in the final
   1744   /// reduction expression performed by the reduction clause.
   1745   /// Also, variables in these expressions are used for proper initialization of
   1746   /// reduction copies.
   1747   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
   1748 
   1749   /// \brief Get the list of helper destination expressions.
   1750   MutableArrayRef<Expr *> getRHSExprs() {
   1751     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
   1752   }
   1753   ArrayRef<const Expr *> getRHSExprs() const {
   1754     return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
   1755   }
   1756 
   1757   /// \brief Set list of helper reduction expressions, required for proper
   1758   /// codegen of the clause. These expressions are binary expressions or
   1759   /// operator/custom reduction call that calculates new value from source
   1760   /// helper expressions to destination helper expressions.
   1761   void setReductionOps(ArrayRef<Expr *> ReductionOps);
   1762 
   1763   /// \brief Get the list of helper reduction expressions.
   1764   MutableArrayRef<Expr *> getReductionOps() {
   1765     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
   1766   }
   1767   ArrayRef<const Expr *> getReductionOps() const {
   1768     return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
   1769   }
   1770 
   1771 public:
   1772   /// \brief Creates clause with a list of variables \a VL.
   1773   ///
   1774   /// \param StartLoc Starting location of the clause.
   1775   /// \param LParenLoc Location of '('.
   1776   /// \param ColonLoc Location of ':'.
   1777   /// \param EndLoc Ending location of the clause.
   1778   /// \param VL The variables in the clause.
   1779   /// \param QualifierLoc The nested-name qualifier with location information
   1780   /// \param NameInfo The full name info for reduction identifier.
   1781   /// \param Privates List of helper expressions for proper generation of
   1782   /// private copies.
   1783   /// \param LHSExprs List of helper expressions for proper generation of
   1784   /// assignment operation required for copyprivate clause. This list represents
   1785   /// LHSs of the reduction expressions.
   1786   /// \param RHSExprs List of helper expressions for proper generation of
   1787   /// assignment operation required for copyprivate clause. This list represents
   1788   /// RHSs of the reduction expressions.
   1789   /// Also, variables in these expressions are used for proper initialization of
   1790   /// reduction copies.
   1791   /// \param ReductionOps List of helper expressions that represents reduction
   1792   /// expressions:
   1793   /// \code
   1794   /// LHSExprs binop RHSExprs;
   1795   /// operator binop(LHSExpr, RHSExpr);
   1796   /// <CutomReduction>(LHSExpr, RHSExpr);
   1797   /// \endcode
   1798   /// Required for proper codegen of final reduction operation performed by the
   1799   /// reduction clause.
   1800   /// \param PreInit Statement that must be executed before entering the OpenMP
   1801   /// region with this clause.
   1802   /// \param PostUpdate Expression that must be executed after exit from the
   1803   /// OpenMP region with this clause.
   1804   ///
   1805   static OMPReductionClause *
   1806   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   1807          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
   1808          NestedNameSpecifierLoc QualifierLoc,
   1809          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
   1810          ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
   1811          ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
   1812   /// \brief Creates an empty clause with the place for \a N variables.
   1813   ///
   1814   /// \param C AST context.
   1815   /// \param N The number of variables.
   1816   ///
   1817   static OMPReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
   1818 
   1819   /// \brief Gets location of ':' symbol in clause.
   1820   SourceLocation getColonLoc() const { return ColonLoc; }
   1821   /// \brief Gets the name info for specified reduction identifier.
   1822   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
   1823   /// \brief Gets the nested name specifier.
   1824   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
   1825 
   1826   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
   1827   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
   1828   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
   1829   typedef llvm::iterator_range<helper_expr_const_iterator>
   1830       helper_expr_const_range;
   1831 
   1832   helper_expr_const_range privates() const {
   1833     return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
   1834   }
   1835   helper_expr_range privates() {
   1836     return helper_expr_range(getPrivates().begin(), getPrivates().end());
   1837   }
   1838   helper_expr_const_range lhs_exprs() const {
   1839     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
   1840   }
   1841   helper_expr_range lhs_exprs() {
   1842     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
   1843   }
   1844   helper_expr_const_range rhs_exprs() const {
   1845     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
   1846   }
   1847   helper_expr_range rhs_exprs() {
   1848     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
   1849   }
   1850   helper_expr_const_range reduction_ops() const {
   1851     return helper_expr_const_range(getReductionOps().begin(),
   1852                                    getReductionOps().end());
   1853   }
   1854   helper_expr_range reduction_ops() {
   1855     return helper_expr_range(getReductionOps().begin(),
   1856                              getReductionOps().end());
   1857   }
   1858 
   1859   child_range children() {
   1860     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   1861                        reinterpret_cast<Stmt **>(varlist_end()));
   1862   }
   1863 
   1864   static bool classof(const OMPClause *T) {
   1865     return T->getClauseKind() == OMPC_reduction;
   1866   }
   1867 };
   1868 
   1869 /// \brief This represents clause 'linear' in the '#pragma omp ...'
   1870 /// directives.
   1871 ///
   1872 /// \code
   1873 /// #pragma omp simd linear(a,b : 2)
   1874 /// \endcode
   1875 /// In this example directive '#pragma omp simd' has clause 'linear'
   1876 /// with variables 'a', 'b' and linear step '2'.
   1877 ///
   1878 class OMPLinearClause final
   1879     : public OMPVarListClause<OMPLinearClause>,
   1880       public OMPClauseWithPostUpdate,
   1881       private llvm::TrailingObjects<OMPLinearClause, Expr *> {
   1882   friend TrailingObjects;
   1883   friend OMPVarListClause;
   1884   friend class OMPClauseReader;
   1885   /// \brief Modifier of 'linear' clause.
   1886   OpenMPLinearClauseKind Modifier;
   1887   /// \brief Location of linear modifier if any.
   1888   SourceLocation ModifierLoc;
   1889   /// \brief Location of ':'.
   1890   SourceLocation ColonLoc;
   1891 
   1892   /// \brief Sets the linear step for clause.
   1893   void setStep(Expr *Step) { *(getFinals().end()) = Step; }
   1894 
   1895   /// \brief Sets the expression to calculate linear step for clause.
   1896   void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
   1897 
   1898   /// \brief Build 'linear' clause with given number of variables \a NumVars.
   1899   ///
   1900   /// \param StartLoc Starting location of the clause.
   1901   /// \param LParenLoc Location of '('.
   1902   /// \param ColonLoc Location of ':'.
   1903   /// \param EndLoc Ending location of the clause.
   1904   /// \param NumVars Number of variables.
   1905   ///
   1906   OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   1907                   OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
   1908                   SourceLocation ColonLoc, SourceLocation EndLoc,
   1909                   unsigned NumVars)
   1910       : OMPVarListClause<OMPLinearClause>(OMPC_linear, StartLoc, LParenLoc,
   1911                                           EndLoc, NumVars),
   1912         OMPClauseWithPostUpdate(this), Modifier(Modifier),
   1913         ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
   1914 
   1915   /// \brief Build an empty clause.
   1916   ///
   1917   /// \param NumVars Number of variables.
   1918   ///
   1919   explicit OMPLinearClause(unsigned NumVars)
   1920       : OMPVarListClause<OMPLinearClause>(OMPC_linear, SourceLocation(),
   1921                                           SourceLocation(), SourceLocation(),
   1922                                           NumVars),
   1923         OMPClauseWithPostUpdate(this), Modifier(OMPC_LINEAR_val), ModifierLoc(),
   1924         ColonLoc() {}
   1925 
   1926   /// \brief Gets the list of initial values for linear variables.
   1927   ///
   1928   /// There are NumVars expressions with initial values allocated after the
   1929   /// varlist, they are followed by NumVars update expressions (used to update
   1930   /// the linear variable's value on current iteration) and they are followed by
   1931   /// NumVars final expressions (used to calculate the linear variable's
   1932   /// value after the loop body). After these lists, there are 2 helper
   1933   /// expressions - linear step and a helper to calculate it before the
   1934   /// loop body (used when the linear step is not constant):
   1935   ///
   1936   /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
   1937   /// Finals[]; Step; CalcStep; }
   1938   ///
   1939   MutableArrayRef<Expr *> getPrivates() {
   1940     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   1941   }
   1942   ArrayRef<const Expr *> getPrivates() const {
   1943     return llvm::makeArrayRef(varlist_end(), varlist_size());
   1944   }
   1945 
   1946   MutableArrayRef<Expr *> getInits() {
   1947     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
   1948   }
   1949   ArrayRef<const Expr *> getInits() const {
   1950     return llvm::makeArrayRef(getPrivates().end(), varlist_size());
   1951   }
   1952 
   1953   /// \brief Sets the list of update expressions for linear variables.
   1954   MutableArrayRef<Expr *> getUpdates() {
   1955     return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
   1956   }
   1957   ArrayRef<const Expr *> getUpdates() const {
   1958     return llvm::makeArrayRef(getInits().end(), varlist_size());
   1959   }
   1960 
   1961   /// \brief Sets the list of final update expressions for linear variables.
   1962   MutableArrayRef<Expr *> getFinals() {
   1963     return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
   1964   }
   1965   ArrayRef<const Expr *> getFinals() const {
   1966     return llvm::makeArrayRef(getUpdates().end(), varlist_size());
   1967   }
   1968 
   1969   /// \brief Sets the list of the copies of original linear variables.
   1970   /// \param PL List of expressions.
   1971   void setPrivates(ArrayRef<Expr *> PL);
   1972 
   1973   /// \brief Sets the list of the initial values for linear variables.
   1974   /// \param IL List of expressions.
   1975   void setInits(ArrayRef<Expr *> IL);
   1976 
   1977 public:
   1978   /// \brief Creates clause with a list of variables \a VL and a linear step
   1979   /// \a Step.
   1980   ///
   1981   /// \param C AST Context.
   1982   /// \param StartLoc Starting location of the clause.
   1983   /// \param LParenLoc Location of '('.
   1984   /// \param Modifier Modifier of 'linear' clause.
   1985   /// \param ModifierLoc Modifier location.
   1986   /// \param ColonLoc Location of ':'.
   1987   /// \param EndLoc Ending location of the clause.
   1988   /// \param VL List of references to the variables.
   1989   /// \param PL List of private copies of original variables.
   1990   /// \param IL List of initial values for the variables.
   1991   /// \param Step Linear step.
   1992   /// \param CalcStep Calculation of the linear step.
   1993   /// \param PreInit Statement that must be executed before entering the OpenMP
   1994   /// region with this clause.
   1995   /// \param PostUpdate Expression that must be executed after exit from the
   1996   /// OpenMP region with this clause.
   1997   static OMPLinearClause *
   1998   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   1999          OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
   2000          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
   2001          ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
   2002          Stmt *PreInit, Expr *PostUpdate);
   2003 
   2004   /// \brief Creates an empty clause with the place for \a NumVars variables.
   2005   ///
   2006   /// \param C AST context.
   2007   /// \param NumVars Number of variables.
   2008   ///
   2009   static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
   2010 
   2011   /// \brief Set modifier.
   2012   void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
   2013   /// \brief Return modifier.
   2014   OpenMPLinearClauseKind getModifier() const { return Modifier; }
   2015 
   2016   /// \brief Set modifier location.
   2017   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
   2018   /// \brief Return modifier location.
   2019   SourceLocation getModifierLoc() const { return ModifierLoc; }
   2020 
   2021   /// \brief Sets the location of ':'.
   2022   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
   2023   /// \brief Returns the location of ':'.
   2024   SourceLocation getColonLoc() const { return ColonLoc; }
   2025 
   2026   /// \brief Returns linear step.
   2027   Expr *getStep() { return *(getFinals().end()); }
   2028   /// \brief Returns linear step.
   2029   const Expr *getStep() const { return *(getFinals().end()); }
   2030   /// \brief Returns expression to calculate linear step.
   2031   Expr *getCalcStep() { return *(getFinals().end() + 1); }
   2032   /// \brief Returns expression to calculate linear step.
   2033   const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
   2034 
   2035   /// \brief Sets the list of update expressions for linear variables.
   2036   /// \param UL List of expressions.
   2037   void setUpdates(ArrayRef<Expr *> UL);
   2038 
   2039   /// \brief Sets the list of final update expressions for linear variables.
   2040   /// \param FL List of expressions.
   2041   void setFinals(ArrayRef<Expr *> FL);
   2042 
   2043   typedef MutableArrayRef<Expr *>::iterator privates_iterator;
   2044   typedef ArrayRef<const Expr *>::iterator privates_const_iterator;
   2045   typedef llvm::iterator_range<privates_iterator> privates_range;
   2046   typedef llvm::iterator_range<privates_const_iterator> privates_const_range;
   2047 
   2048   privates_range privates() {
   2049     return privates_range(getPrivates().begin(), getPrivates().end());
   2050   }
   2051   privates_const_range privates() const {
   2052     return privates_const_range(getPrivates().begin(), getPrivates().end());
   2053   }
   2054 
   2055   typedef MutableArrayRef<Expr *>::iterator inits_iterator;
   2056   typedef ArrayRef<const Expr *>::iterator inits_const_iterator;
   2057   typedef llvm::iterator_range<inits_iterator> inits_range;
   2058   typedef llvm::iterator_range<inits_const_iterator> inits_const_range;
   2059 
   2060   inits_range inits() {
   2061     return inits_range(getInits().begin(), getInits().end());
   2062   }
   2063   inits_const_range inits() const {
   2064     return inits_const_range(getInits().begin(), getInits().end());
   2065   }
   2066 
   2067   typedef MutableArrayRef<Expr *>::iterator updates_iterator;
   2068   typedef ArrayRef<const Expr *>::iterator updates_const_iterator;
   2069   typedef llvm::iterator_range<updates_iterator> updates_range;
   2070   typedef llvm::iterator_range<updates_const_iterator> updates_const_range;
   2071 
   2072   updates_range updates() {
   2073     return updates_range(getUpdates().begin(), getUpdates().end());
   2074   }
   2075   updates_const_range updates() const {
   2076     return updates_const_range(getUpdates().begin(), getUpdates().end());
   2077   }
   2078 
   2079   typedef MutableArrayRef<Expr *>::iterator finals_iterator;
   2080   typedef ArrayRef<const Expr *>::iterator finals_const_iterator;
   2081   typedef llvm::iterator_range<finals_iterator> finals_range;
   2082   typedef llvm::iterator_range<finals_const_iterator> finals_const_range;
   2083 
   2084   finals_range finals() {
   2085     return finals_range(getFinals().begin(), getFinals().end());
   2086   }
   2087   finals_const_range finals() const {
   2088     return finals_const_range(getFinals().begin(), getFinals().end());
   2089   }
   2090 
   2091   child_range children() {
   2092     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2093                        reinterpret_cast<Stmt **>(varlist_end()));
   2094   }
   2095 
   2096   static bool classof(const OMPClause *T) {
   2097     return T->getClauseKind() == OMPC_linear;
   2098   }
   2099 };
   2100 
   2101 /// \brief This represents clause 'aligned' in the '#pragma omp ...'
   2102 /// directives.
   2103 ///
   2104 /// \code
   2105 /// #pragma omp simd aligned(a,b : 8)
   2106 /// \endcode
   2107 /// In this example directive '#pragma omp simd' has clause 'aligned'
   2108 /// with variables 'a', 'b' and alignment '8'.
   2109 ///
   2110 class OMPAlignedClause final
   2111     : public OMPVarListClause<OMPAlignedClause>,
   2112       private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
   2113   friend TrailingObjects;
   2114   friend OMPVarListClause;
   2115   friend class OMPClauseReader;
   2116   /// \brief Location of ':'.
   2117   SourceLocation ColonLoc;
   2118 
   2119   /// \brief Sets the alignment for clause.
   2120   void setAlignment(Expr *A) { *varlist_end() = A; }
   2121 
   2122   /// \brief Build 'aligned' clause with given number of variables \a NumVars.
   2123   ///
   2124   /// \param StartLoc Starting location of the clause.
   2125   /// \param LParenLoc Location of '('.
   2126   /// \param ColonLoc Location of ':'.
   2127   /// \param EndLoc Ending location of the clause.
   2128   /// \param NumVars Number of variables.
   2129   ///
   2130   OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   2131                    SourceLocation ColonLoc, SourceLocation EndLoc,
   2132                    unsigned NumVars)
   2133       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, StartLoc, LParenLoc,
   2134                                            EndLoc, NumVars),
   2135         ColonLoc(ColonLoc) {}
   2136 
   2137   /// \brief Build an empty clause.
   2138   ///
   2139   /// \param NumVars Number of variables.
   2140   ///
   2141   explicit OMPAlignedClause(unsigned NumVars)
   2142       : OMPVarListClause<OMPAlignedClause>(OMPC_aligned, SourceLocation(),
   2143                                            SourceLocation(), SourceLocation(),
   2144                                            NumVars),
   2145         ColonLoc(SourceLocation()) {}
   2146 
   2147 public:
   2148   /// \brief Creates clause with a list of variables \a VL and alignment \a A.
   2149   ///
   2150   /// \param C AST Context.
   2151   /// \param StartLoc Starting location of the clause.
   2152   /// \param LParenLoc Location of '('.
   2153   /// \param ColonLoc Location of ':'.
   2154   /// \param EndLoc Ending location of the clause.
   2155   /// \param VL List of references to the variables.
   2156   /// \param A Alignment.
   2157   static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
   2158                                   SourceLocation LParenLoc,
   2159                                   SourceLocation ColonLoc,
   2160                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
   2161                                   Expr *A);
   2162 
   2163   /// \brief Creates an empty clause with the place for \a NumVars variables.
   2164   ///
   2165   /// \param C AST context.
   2166   /// \param NumVars Number of variables.
   2167   ///
   2168   static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
   2169 
   2170   /// \brief Sets the location of ':'.
   2171   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
   2172   /// \brief Returns the location of ':'.
   2173   SourceLocation getColonLoc() const { return ColonLoc; }
   2174 
   2175   /// \brief Returns alignment.
   2176   Expr *getAlignment() { return *varlist_end(); }
   2177   /// \brief Returns alignment.
   2178   const Expr *getAlignment() const { return *varlist_end(); }
   2179 
   2180   child_range children() {
   2181     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2182                        reinterpret_cast<Stmt **>(varlist_end()));
   2183   }
   2184 
   2185   static bool classof(const OMPClause *T) {
   2186     return T->getClauseKind() == OMPC_aligned;
   2187   }
   2188 };
   2189 
   2190 /// \brief This represents clause 'copyin' in the '#pragma omp ...' directives.
   2191 ///
   2192 /// \code
   2193 /// #pragma omp parallel copyin(a,b)
   2194 /// \endcode
   2195 /// In this example directive '#pragma omp parallel' has clause 'copyin'
   2196 /// with the variables 'a' and 'b'.
   2197 ///
   2198 class OMPCopyinClause final
   2199     : public OMPVarListClause<OMPCopyinClause>,
   2200       private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
   2201   // Class has 3 additional tail allocated arrays:
   2202   // 1. List of helper expressions for proper generation of assignment operation
   2203   // required for copyin clause. This list represents sources.
   2204   // 2. List of helper expressions for proper generation of assignment operation
   2205   // required for copyin clause. This list represents destinations.
   2206   // 3. List of helper expressions that represents assignment operation:
   2207   // \code
   2208   // DstExprs = SrcExprs;
   2209   // \endcode
   2210   // Required for proper codegen of propagation of master's thread values of
   2211   // threadprivate variables to local instances of that variables in other
   2212   // implicit threads.
   2213 
   2214   friend TrailingObjects;
   2215   friend OMPVarListClause;
   2216   friend class OMPClauseReader;
   2217   /// \brief Build clause with number of variables \a N.
   2218   ///
   2219   /// \param StartLoc Starting location of the clause.
   2220   /// \param LParenLoc Location of '('.
   2221   /// \param EndLoc Ending location of the clause.
   2222   /// \param N Number of the variables in the clause.
   2223   ///
   2224   OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   2225                   SourceLocation EndLoc, unsigned N)
   2226       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, StartLoc, LParenLoc,
   2227                                           EndLoc, N) {}
   2228 
   2229   /// \brief Build an empty clause.
   2230   ///
   2231   /// \param N Number of variables.
   2232   ///
   2233   explicit OMPCopyinClause(unsigned N)
   2234       : OMPVarListClause<OMPCopyinClause>(OMPC_copyin, SourceLocation(),
   2235                                           SourceLocation(), SourceLocation(),
   2236                                           N) {}
   2237 
   2238   /// \brief Set list of helper expressions, required for proper codegen of the
   2239   /// clause. These expressions represent source expression in the final
   2240   /// assignment statement performed by the copyin clause.
   2241   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
   2242 
   2243   /// \brief Get the list of helper source expressions.
   2244   MutableArrayRef<Expr *> getSourceExprs() {
   2245     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   2246   }
   2247   ArrayRef<const Expr *> getSourceExprs() const {
   2248     return llvm::makeArrayRef(varlist_end(), varlist_size());
   2249   }
   2250 
   2251   /// \brief Set list of helper expressions, required for proper codegen of the
   2252   /// clause. These expressions represent destination expression in the final
   2253   /// assignment statement performed by the copyin clause.
   2254   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
   2255 
   2256   /// \brief Get the list of helper destination expressions.
   2257   MutableArrayRef<Expr *> getDestinationExprs() {
   2258     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
   2259   }
   2260   ArrayRef<const Expr *> getDestinationExprs() const {
   2261     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
   2262   }
   2263 
   2264   /// \brief Set list of helper assignment expressions, required for proper
   2265   /// codegen of the clause. These expressions are assignment expressions that
   2266   /// assign source helper expressions to destination helper expressions
   2267   /// correspondingly.
   2268   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
   2269 
   2270   /// \brief Get the list of helper assignment expressions.
   2271   MutableArrayRef<Expr *> getAssignmentOps() {
   2272     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
   2273   }
   2274   ArrayRef<const Expr *> getAssignmentOps() const {
   2275     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
   2276   }
   2277 
   2278 public:
   2279   /// \brief Creates clause with a list of variables \a VL.
   2280   ///
   2281   /// \param C AST context.
   2282   /// \param StartLoc Starting location of the clause.
   2283   /// \param LParenLoc Location of '('.
   2284   /// \param EndLoc Ending location of the clause.
   2285   /// \param VL List of references to the variables.
   2286   /// \param SrcExprs List of helper expressions for proper generation of
   2287   /// assignment operation required for copyin clause. This list represents
   2288   /// sources.
   2289   /// \param DstExprs List of helper expressions for proper generation of
   2290   /// assignment operation required for copyin clause. This list represents
   2291   /// destinations.
   2292   /// \param AssignmentOps List of helper expressions that represents assignment
   2293   /// operation:
   2294   /// \code
   2295   /// DstExprs = SrcExprs;
   2296   /// \endcode
   2297   /// Required for proper codegen of propagation of master's thread values of
   2298   /// threadprivate variables to local instances of that variables in other
   2299   /// implicit threads.
   2300   ///
   2301   static OMPCopyinClause *
   2302   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   2303          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
   2304          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
   2305   /// \brief Creates an empty clause with \a N variables.
   2306   ///
   2307   /// \param C AST context.
   2308   /// \param N The number of variables.
   2309   ///
   2310   static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
   2311 
   2312   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
   2313   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
   2314   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
   2315   typedef llvm::iterator_range<helper_expr_const_iterator>
   2316       helper_expr_const_range;
   2317 
   2318   helper_expr_const_range source_exprs() const {
   2319     return helper_expr_const_range(getSourceExprs().begin(),
   2320                                    getSourceExprs().end());
   2321   }
   2322   helper_expr_range source_exprs() {
   2323     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
   2324   }
   2325   helper_expr_const_range destination_exprs() const {
   2326     return helper_expr_const_range(getDestinationExprs().begin(),
   2327                                    getDestinationExprs().end());
   2328   }
   2329   helper_expr_range destination_exprs() {
   2330     return helper_expr_range(getDestinationExprs().begin(),
   2331                              getDestinationExprs().end());
   2332   }
   2333   helper_expr_const_range assignment_ops() const {
   2334     return helper_expr_const_range(getAssignmentOps().begin(),
   2335                                    getAssignmentOps().end());
   2336   }
   2337   helper_expr_range assignment_ops() {
   2338     return helper_expr_range(getAssignmentOps().begin(),
   2339                              getAssignmentOps().end());
   2340   }
   2341 
   2342   child_range children() {
   2343     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2344                        reinterpret_cast<Stmt **>(varlist_end()));
   2345   }
   2346 
   2347   static bool classof(const OMPClause *T) {
   2348     return T->getClauseKind() == OMPC_copyin;
   2349   }
   2350 };
   2351 
   2352 /// \brief This represents clause 'copyprivate' in the '#pragma omp ...'
   2353 /// directives.
   2354 ///
   2355 /// \code
   2356 /// #pragma omp single copyprivate(a,b)
   2357 /// \endcode
   2358 /// In this example directive '#pragma omp single' has clause 'copyprivate'
   2359 /// with the variables 'a' and 'b'.
   2360 ///
   2361 class OMPCopyprivateClause final
   2362     : public OMPVarListClause<OMPCopyprivateClause>,
   2363       private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
   2364   friend TrailingObjects;
   2365   friend OMPVarListClause;
   2366   friend class OMPClauseReader;
   2367   /// \brief Build clause with number of variables \a N.
   2368   ///
   2369   /// \param StartLoc Starting location of the clause.
   2370   /// \param LParenLoc Location of '('.
   2371   /// \param EndLoc Ending location of the clause.
   2372   /// \param N Number of the variables in the clause.
   2373   ///
   2374   OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   2375                        SourceLocation EndLoc, unsigned N)
   2376       : OMPVarListClause<OMPCopyprivateClause>(OMPC_copyprivate, StartLoc,
   2377                                                LParenLoc, EndLoc, N) {}
   2378 
   2379   /// \brief Build an empty clause.
   2380   ///
   2381   /// \param N Number of variables.
   2382   ///
   2383   explicit OMPCopyprivateClause(unsigned N)
   2384       : OMPVarListClause<OMPCopyprivateClause>(
   2385             OMPC_copyprivate, SourceLocation(), SourceLocation(),
   2386             SourceLocation(), N) {}
   2387 
   2388   /// \brief Set list of helper expressions, required for proper codegen of the
   2389   /// clause. These expressions represent source expression in the final
   2390   /// assignment statement performed by the copyprivate clause.
   2391   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
   2392 
   2393   /// \brief Get the list of helper source expressions.
   2394   MutableArrayRef<Expr *> getSourceExprs() {
   2395     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
   2396   }
   2397   ArrayRef<const Expr *> getSourceExprs() const {
   2398     return llvm::makeArrayRef(varlist_end(), varlist_size());
   2399   }
   2400 
   2401   /// \brief Set list of helper expressions, required for proper codegen of the
   2402   /// clause. These expressions represent destination expression in the final
   2403   /// assignment statement performed by the copyprivate clause.
   2404   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
   2405 
   2406   /// \brief Get the list of helper destination expressions.
   2407   MutableArrayRef<Expr *> getDestinationExprs() {
   2408     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
   2409   }
   2410   ArrayRef<const Expr *> getDestinationExprs() const {
   2411     return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
   2412   }
   2413 
   2414   /// \brief Set list of helper assignment expressions, required for proper
   2415   /// codegen of the clause. These expressions are assignment expressions that
   2416   /// assign source helper expressions to destination helper expressions
   2417   /// correspondingly.
   2418   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
   2419 
   2420   /// \brief Get the list of helper assignment expressions.
   2421   MutableArrayRef<Expr *> getAssignmentOps() {
   2422     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
   2423   }
   2424   ArrayRef<const Expr *> getAssignmentOps() const {
   2425     return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
   2426   }
   2427 
   2428 public:
   2429   /// \brief Creates clause with a list of variables \a VL.
   2430   ///
   2431   /// \param C AST context.
   2432   /// \param StartLoc Starting location of the clause.
   2433   /// \param LParenLoc Location of '('.
   2434   /// \param EndLoc Ending location of the clause.
   2435   /// \param VL List of references to the variables.
   2436   /// \param SrcExprs List of helper expressions for proper generation of
   2437   /// assignment operation required for copyprivate clause. This list represents
   2438   /// sources.
   2439   /// \param DstExprs List of helper expressions for proper generation of
   2440   /// assignment operation required for copyprivate clause. This list represents
   2441   /// destinations.
   2442   /// \param AssignmentOps List of helper expressions that represents assignment
   2443   /// operation:
   2444   /// \code
   2445   /// DstExprs = SrcExprs;
   2446   /// \endcode
   2447   /// Required for proper codegen of final assignment performed by the
   2448   /// copyprivate clause.
   2449   ///
   2450   static OMPCopyprivateClause *
   2451   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   2452          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
   2453          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
   2454   /// \brief Creates an empty clause with \a N variables.
   2455   ///
   2456   /// \param C AST context.
   2457   /// \param N The number of variables.
   2458   ///
   2459   static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
   2460 
   2461   typedef MutableArrayRef<Expr *>::iterator helper_expr_iterator;
   2462   typedef ArrayRef<const Expr *>::iterator helper_expr_const_iterator;
   2463   typedef llvm::iterator_range<helper_expr_iterator> helper_expr_range;
   2464   typedef llvm::iterator_range<helper_expr_const_iterator>
   2465       helper_expr_const_range;
   2466 
   2467   helper_expr_const_range source_exprs() const {
   2468     return helper_expr_const_range(getSourceExprs().begin(),
   2469                                    getSourceExprs().end());
   2470   }
   2471   helper_expr_range source_exprs() {
   2472     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
   2473   }
   2474   helper_expr_const_range destination_exprs() const {
   2475     return helper_expr_const_range(getDestinationExprs().begin(),
   2476                                    getDestinationExprs().end());
   2477   }
   2478   helper_expr_range destination_exprs() {
   2479     return helper_expr_range(getDestinationExprs().begin(),
   2480                              getDestinationExprs().end());
   2481   }
   2482   helper_expr_const_range assignment_ops() const {
   2483     return helper_expr_const_range(getAssignmentOps().begin(),
   2484                                    getAssignmentOps().end());
   2485   }
   2486   helper_expr_range assignment_ops() {
   2487     return helper_expr_range(getAssignmentOps().begin(),
   2488                              getAssignmentOps().end());
   2489   }
   2490 
   2491   child_range children() {
   2492     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2493                        reinterpret_cast<Stmt **>(varlist_end()));
   2494   }
   2495 
   2496   static bool classof(const OMPClause *T) {
   2497     return T->getClauseKind() == OMPC_copyprivate;
   2498   }
   2499 };
   2500 
   2501 /// \brief This represents implicit clause 'flush' for the '#pragma omp flush'
   2502 /// directive.
   2503 /// This clause does not exist by itself, it can be only as a part of 'omp
   2504 /// flush' directive. This clause is introduced to keep the original structure
   2505 /// of \a OMPExecutableDirective class and its derivatives and to use the
   2506 /// existing infrastructure of clauses with the list of variables.
   2507 ///
   2508 /// \code
   2509 /// #pragma omp flush(a,b)
   2510 /// \endcode
   2511 /// In this example directive '#pragma omp flush' has implicit clause 'flush'
   2512 /// with the variables 'a' and 'b'.
   2513 ///
   2514 class OMPFlushClause final
   2515     : public OMPVarListClause<OMPFlushClause>,
   2516       private llvm::TrailingObjects<OMPFlushClause, Expr *> {
   2517   friend TrailingObjects;
   2518   friend OMPVarListClause;
   2519   /// \brief Build clause with number of variables \a N.
   2520   ///
   2521   /// \param StartLoc Starting location of the clause.
   2522   /// \param LParenLoc Location of '('.
   2523   /// \param EndLoc Ending location of the clause.
   2524   /// \param N Number of the variables in the clause.
   2525   ///
   2526   OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   2527                  SourceLocation EndLoc, unsigned N)
   2528       : OMPVarListClause<OMPFlushClause>(OMPC_flush, StartLoc, LParenLoc,
   2529                                          EndLoc, N) {}
   2530 
   2531   /// \brief Build an empty clause.
   2532   ///
   2533   /// \param N Number of variables.
   2534   ///
   2535   explicit OMPFlushClause(unsigned N)
   2536       : OMPVarListClause<OMPFlushClause>(OMPC_flush, SourceLocation(),
   2537                                          SourceLocation(), SourceLocation(),
   2538                                          N) {}
   2539 
   2540 public:
   2541   /// \brief Creates clause with a list of variables \a VL.
   2542   ///
   2543   /// \param C AST context.
   2544   /// \param StartLoc Starting location of the clause.
   2545   /// \param LParenLoc Location of '('.
   2546   /// \param EndLoc Ending location of the clause.
   2547   /// \param VL List of references to the variables.
   2548   ///
   2549   static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
   2550                                 SourceLocation LParenLoc, SourceLocation EndLoc,
   2551                                 ArrayRef<Expr *> VL);
   2552   /// \brief Creates an empty clause with \a N variables.
   2553   ///
   2554   /// \param C AST context.
   2555   /// \param N The number of variables.
   2556   ///
   2557   static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
   2558 
   2559   child_range children() {
   2560     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2561                        reinterpret_cast<Stmt **>(varlist_end()));
   2562   }
   2563 
   2564   static bool classof(const OMPClause *T) {
   2565     return T->getClauseKind() == OMPC_flush;
   2566   }
   2567 };
   2568 
   2569 /// \brief This represents implicit clause 'depend' for the '#pragma omp task'
   2570 /// directive.
   2571 ///
   2572 /// \code
   2573 /// #pragma omp task depend(in:a,b)
   2574 /// \endcode
   2575 /// In this example directive '#pragma omp task' with clause 'depend' with the
   2576 /// variables 'a' and 'b' with dependency 'in'.
   2577 ///
   2578 class OMPDependClause final
   2579     : public OMPVarListClause<OMPDependClause>,
   2580       private llvm::TrailingObjects<OMPDependClause, Expr *> {
   2581   friend TrailingObjects;
   2582   friend OMPVarListClause;
   2583   friend class OMPClauseReader;
   2584   /// \brief Dependency type (one of in, out, inout).
   2585   OpenMPDependClauseKind DepKind;
   2586   /// \brief Dependency type location.
   2587   SourceLocation DepLoc;
   2588   /// \brief Colon location.
   2589   SourceLocation ColonLoc;
   2590   /// \brief Build clause with number of variables \a N.
   2591   ///
   2592   /// \param StartLoc Starting location of the clause.
   2593   /// \param LParenLoc Location of '('.
   2594   /// \param EndLoc Ending location of the clause.
   2595   /// \param N Number of the variables in the clause.
   2596   ///
   2597   OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   2598                   SourceLocation EndLoc, unsigned N)
   2599       : OMPVarListClause<OMPDependClause>(OMPC_depend, StartLoc, LParenLoc,
   2600                                           EndLoc, N),
   2601         DepKind(OMPC_DEPEND_unknown) {}
   2602 
   2603   /// \brief Build an empty clause.
   2604   ///
   2605   /// \param N Number of variables.
   2606   ///
   2607   explicit OMPDependClause(unsigned N)
   2608       : OMPVarListClause<OMPDependClause>(OMPC_depend, SourceLocation(),
   2609                                           SourceLocation(), SourceLocation(),
   2610                                           N),
   2611         DepKind(OMPC_DEPEND_unknown) {}
   2612   /// \brief Set dependency kind.
   2613   void setDependencyKind(OpenMPDependClauseKind K) { DepKind = K; }
   2614 
   2615   /// \brief Set dependency kind and its location.
   2616   void setDependencyLoc(SourceLocation Loc) { DepLoc = Loc; }
   2617 
   2618   /// \brief Set colon location.
   2619   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
   2620 
   2621 public:
   2622   /// \brief Creates clause with a list of variables \a VL.
   2623   ///
   2624   /// \param C AST context.
   2625   /// \param StartLoc Starting location of the clause.
   2626   /// \param LParenLoc Location of '('.
   2627   /// \param EndLoc Ending location of the clause.
   2628   /// \param DepKind Dependency type.
   2629   /// \param DepLoc Location of the dependency type.
   2630   /// \param ColonLoc Colon location.
   2631   /// \param VL List of references to the variables.
   2632   static OMPDependClause *
   2633   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   2634          SourceLocation EndLoc, OpenMPDependClauseKind DepKind,
   2635          SourceLocation DepLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VL);
   2636   /// \brief Creates an empty clause with \a N variables.
   2637   ///
   2638   /// \param C AST context.
   2639   /// \param N The number of variables.
   2640   ///
   2641   static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N);
   2642 
   2643   /// \brief Get dependency type.
   2644   OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
   2645   /// \brief Get dependency type location.
   2646   SourceLocation getDependencyLoc() const { return DepLoc; }
   2647   /// \brief Get colon location.
   2648   SourceLocation getColonLoc() const { return ColonLoc; }
   2649 
   2650   /// Set the loop counter value for the depend clauses with 'sink|source' kind
   2651   /// of dependency. Required for codegen.
   2652   void setCounterValue(Expr *V);
   2653   /// Get the loop counter value.
   2654   Expr *getCounterValue();
   2655   /// Get the loop counter value.
   2656   const Expr *getCounterValue() const;
   2657 
   2658   child_range children() {
   2659     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   2660                        reinterpret_cast<Stmt **>(varlist_end()));
   2661   }
   2662 
   2663   static bool classof(const OMPClause *T) {
   2664     return T->getClauseKind() == OMPC_depend;
   2665   }
   2666 };
   2667 
   2668 /// \brief This represents 'device' clause in the '#pragma omp ...'
   2669 /// directive.
   2670 ///
   2671 /// \code
   2672 /// #pragma omp target device(a)
   2673 /// \endcode
   2674 /// In this example directive '#pragma omp target' has clause 'device'
   2675 /// with single expression 'a'.
   2676 ///
   2677 class OMPDeviceClause : public OMPClause {
   2678   friend class OMPClauseReader;
   2679   /// \brief Location of '('.
   2680   SourceLocation LParenLoc;
   2681   /// \brief Device number.
   2682   Stmt *Device;
   2683   /// \brief Set the device number.
   2684   ///
   2685   /// \param E Device number.
   2686   ///
   2687   void setDevice(Expr *E) { Device = E; }
   2688 
   2689 public:
   2690   /// \brief Build 'device' clause.
   2691   ///
   2692   /// \param E Expression associated with this clause.
   2693   /// \param StartLoc Starting location of the clause.
   2694   /// \param LParenLoc Location of '('.
   2695   /// \param EndLoc Ending location of the clause.
   2696   ///
   2697   OMPDeviceClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
   2698                   SourceLocation EndLoc)
   2699       : OMPClause(OMPC_device, StartLoc, EndLoc), LParenLoc(LParenLoc),
   2700         Device(E) {}
   2701 
   2702   /// \brief Build an empty clause.
   2703   ///
   2704   OMPDeviceClause()
   2705       : OMPClause(OMPC_device, SourceLocation(), SourceLocation()),
   2706         LParenLoc(SourceLocation()), Device(nullptr) {}
   2707   /// \brief Sets the location of '('.
   2708   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   2709   /// \brief Returns the location of '('.
   2710   SourceLocation getLParenLoc() const { return LParenLoc; }
   2711   /// \brief Return device number.
   2712   Expr *getDevice() { return cast<Expr>(Device); }
   2713   /// \brief Return device number.
   2714   Expr *getDevice() const { return cast<Expr>(Device); }
   2715 
   2716   static bool classof(const OMPClause *T) {
   2717     return T->getClauseKind() == OMPC_device;
   2718   }
   2719 
   2720   child_range children() { return child_range(&Device, &Device + 1); }
   2721 };
   2722 
   2723 /// \brief This represents 'threads' clause in the '#pragma omp ...' directive.
   2724 ///
   2725 /// \code
   2726 /// #pragma omp ordered threads
   2727 /// \endcode
   2728 /// In this example directive '#pragma omp ordered' has simple 'threads' clause.
   2729 ///
   2730 class OMPThreadsClause : public OMPClause {
   2731 public:
   2732   /// \brief Build 'threads' clause.
   2733   ///
   2734   /// \param StartLoc Starting location of the clause.
   2735   /// \param EndLoc Ending location of the clause.
   2736   ///
   2737   OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
   2738       : OMPClause(OMPC_threads, StartLoc, EndLoc) {}
   2739 
   2740   /// \brief Build an empty clause.
   2741   ///
   2742   OMPThreadsClause()
   2743       : OMPClause(OMPC_threads, SourceLocation(), SourceLocation()) {}
   2744 
   2745   static bool classof(const OMPClause *T) {
   2746     return T->getClauseKind() == OMPC_threads;
   2747   }
   2748 
   2749   child_range children() {
   2750     return child_range(child_iterator(), child_iterator());
   2751   }
   2752 };
   2753 
   2754 /// \brief This represents 'simd' clause in the '#pragma omp ...' directive.
   2755 ///
   2756 /// \code
   2757 /// #pragma omp ordered simd
   2758 /// \endcode
   2759 /// In this example directive '#pragma omp ordered' has simple 'simd' clause.
   2760 ///
   2761 class OMPSIMDClause : public OMPClause {
   2762 public:
   2763   /// \brief Build 'simd' clause.
   2764   ///
   2765   /// \param StartLoc Starting location of the clause.
   2766   /// \param EndLoc Ending location of the clause.
   2767   ///
   2768   OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
   2769       : OMPClause(OMPC_simd, StartLoc, EndLoc) {}
   2770 
   2771   /// \brief Build an empty clause.
   2772   ///
   2773   OMPSIMDClause() : OMPClause(OMPC_simd, SourceLocation(), SourceLocation()) {}
   2774 
   2775   static bool classof(const OMPClause *T) {
   2776     return T->getClauseKind() == OMPC_simd;
   2777   }
   2778 
   2779   child_range children() {
   2780     return child_range(child_iterator(), child_iterator());
   2781   }
   2782 };
   2783 
   2784 /// \brief Struct that defines common infrastructure to handle mappable
   2785 /// expressions used in OpenMP clauses.
   2786 class OMPClauseMappableExprCommon {
   2787 public:
   2788   // \brief Class that represents a component of a mappable expression. E.g.
   2789   // for an expression S.a, the first component is a declaration reference
   2790   // expression associated with 'S' and the second is a member expression
   2791   // associated with the field declaration 'a'. If the expression is an array
   2792   // subscript it may not have any associated declaration. In that case the
   2793   // associated declaration is set to nullptr.
   2794   class MappableComponent {
   2795     // \brief Expression associated with the component.
   2796     Expr *AssociatedExpression = nullptr;
   2797     // \brief Declaration associated with the declaration. If the component does
   2798     // not have a declaration (e.g. array subscripts or section), this is set to
   2799     // nullptr.
   2800     ValueDecl *AssociatedDeclaration = nullptr;
   2801 
   2802   public:
   2803     explicit MappableComponent() {}
   2804     explicit MappableComponent(Expr *AssociatedExpression,
   2805                                ValueDecl *AssociatedDeclaration)
   2806         : AssociatedExpression(AssociatedExpression),
   2807           AssociatedDeclaration(
   2808               AssociatedDeclaration
   2809                   ? cast<ValueDecl>(AssociatedDeclaration->getCanonicalDecl())
   2810                   : nullptr) {}
   2811 
   2812     Expr *getAssociatedExpression() const { return AssociatedExpression; }
   2813     ValueDecl *getAssociatedDeclaration() const {
   2814       return AssociatedDeclaration;
   2815     }
   2816   };
   2817 
   2818   // \brief List of components of an expression. This first one is the whole
   2819   // expression and the last one is the base expression.
   2820   typedef SmallVector<MappableComponent, 8> MappableExprComponentList;
   2821   typedef ArrayRef<MappableComponent> MappableExprComponentListRef;
   2822 
   2823   // \brief List of all component lists associated to the same base declaration.
   2824   // E.g. if both 'S.a' and 'S.b' are a mappable expressions, each will have
   2825   // their component list but the same base declaration 'S'.
   2826   typedef SmallVector<MappableExprComponentList, 8> MappableExprComponentLists;
   2827   typedef ArrayRef<MappableExprComponentList> MappableExprComponentListsRef;
   2828 
   2829 protected:
   2830   // \brief Return the total number of elements in a list of component lists.
   2831   static unsigned
   2832   getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists);
   2833 
   2834   // \brief Return the total number of elements in a list of declarations. All
   2835   // declarations are expected to be canonical.
   2836   static unsigned
   2837   getUniqueDeclarationsTotalNumber(ArrayRef<ValueDecl *> Declarations);
   2838 };
   2839 
   2840 /// \brief This represents clauses with a list of expressions that are mappable.
   2841 /// Examples of these clauses are 'map' in
   2842 /// '#pragma omp target [enter|exit] [data]...' directives, and  'to' and 'from
   2843 /// in '#pragma omp target update...' directives.
   2844 template <class T>
   2845 class OMPMappableExprListClause : public OMPVarListClause<T>,
   2846                                   public OMPClauseMappableExprCommon {
   2847   friend class OMPClauseReader;
   2848 
   2849   /// \brief Number of unique declarations in this clause.
   2850   unsigned NumUniqueDeclarations;
   2851 
   2852   /// \brief Number of component lists in this clause.
   2853   unsigned NumComponentLists;
   2854 
   2855   /// \brief Total number of components in this clause.
   2856   unsigned NumComponents;
   2857 
   2858 protected:
   2859   /// \brief Get the unique declarations that are in the trailing objects of the
   2860   /// class.
   2861   MutableArrayRef<ValueDecl *> getUniqueDeclsRef() {
   2862     return MutableArrayRef<ValueDecl *>(
   2863         static_cast<T *>(this)->template getTrailingObjects<ValueDecl *>(),
   2864         NumUniqueDeclarations);
   2865   }
   2866 
   2867   /// \brief Get the unique declarations that are in the trailing objects of the
   2868   /// class.
   2869   ArrayRef<ValueDecl *> getUniqueDeclsRef() const {
   2870     return ArrayRef<ValueDecl *>(
   2871         static_cast<const T *>(this)
   2872             ->template getTrailingObjects<ValueDecl *>(),
   2873         NumUniqueDeclarations);
   2874   }
   2875 
   2876   /// \brief Set the unique declarations that are in the trailing objects of the
   2877   /// class.
   2878   void setUniqueDecls(ArrayRef<ValueDecl *> UDs) {
   2879     assert(UDs.size() == NumUniqueDeclarations &&
   2880            "Unexpected amount of unique declarations.");
   2881     std::copy(UDs.begin(), UDs.end(), getUniqueDeclsRef().begin());
   2882   }
   2883 
   2884   /// \brief Get the number of lists per declaration that are in the trailing
   2885   /// objects of the class.
   2886   MutableArrayRef<unsigned> getDeclNumListsRef() {
   2887     return MutableArrayRef<unsigned>(
   2888         static_cast<T *>(this)->template getTrailingObjects<unsigned>(),
   2889         NumUniqueDeclarations);
   2890   }
   2891 
   2892   /// \brief Get the number of lists per declaration that are in the trailing
   2893   /// objects of the class.
   2894   ArrayRef<unsigned> getDeclNumListsRef() const {
   2895     return ArrayRef<unsigned>(
   2896         static_cast<const T *>(this)->template getTrailingObjects<unsigned>(),
   2897         NumUniqueDeclarations);
   2898   }
   2899 
   2900   /// \brief Set the number of lists per declaration that are in the trailing
   2901   /// objects of the class.
   2902   void setDeclNumLists(ArrayRef<unsigned> DNLs) {
   2903     assert(DNLs.size() == NumUniqueDeclarations &&
   2904            "Unexpected amount of list numbers.");
   2905     std::copy(DNLs.begin(), DNLs.end(), getDeclNumListsRef().begin());
   2906   }
   2907 
   2908   /// \brief Get the cumulative component lists sizes that are in the trailing
   2909   /// objects of the class. They are appended after the number of lists.
   2910   MutableArrayRef<unsigned> getComponentListSizesRef() {
   2911     return MutableArrayRef<unsigned>(
   2912         static_cast<T *>(this)->template getTrailingObjects<unsigned>() +
   2913             NumUniqueDeclarations,
   2914         NumComponentLists);
   2915   }
   2916 
   2917   /// \brief Get the cumulative component lists sizes that are in the trailing
   2918   /// objects of the class. They are appended after the number of lists.
   2919   ArrayRef<unsigned> getComponentListSizesRef() const {
   2920     return ArrayRef<unsigned>(
   2921         static_cast<const T *>(this)->template getTrailingObjects<unsigned>() +
   2922             NumUniqueDeclarations,
   2923         NumComponentLists);
   2924   }
   2925 
   2926   /// \brief Set the cumulative component lists sizes that are in the trailing
   2927   /// objects of the class.
   2928   void setComponentListSizes(ArrayRef<unsigned> CLSs) {
   2929     assert(CLSs.size() == NumComponentLists &&
   2930            "Unexpected amount of component lists.");
   2931     std::copy(CLSs.begin(), CLSs.end(), getComponentListSizesRef().begin());
   2932   }
   2933 
   2934   /// \brief Get the components that are in the trailing objects of the class.
   2935   MutableArrayRef<MappableComponent> getComponentsRef() {
   2936     return MutableArrayRef<MappableComponent>(
   2937         static_cast<T *>(this)
   2938             ->template getTrailingObjects<MappableComponent>(),
   2939         NumComponents);
   2940   }
   2941 
   2942   /// \brief Get the components that are in the trailing objects of the class.
   2943   ArrayRef<MappableComponent> getComponentsRef() const {
   2944     return ArrayRef<MappableComponent>(
   2945         static_cast<const T *>(this)
   2946             ->template getTrailingObjects<MappableComponent>(),
   2947         NumComponents);
   2948   }
   2949 
   2950   /// \brief Set the components that are in the trailing objects of the class.
   2951   /// This requires the list sizes so that it can also fill the original
   2952   /// expressions, which are the first component of each list.
   2953   void setComponents(ArrayRef<MappableComponent> Components,
   2954                      ArrayRef<unsigned> CLSs) {
   2955     assert(Components.size() == NumComponents &&
   2956            "Unexpected amount of component lists.");
   2957     assert(CLSs.size() == NumComponentLists &&
   2958            "Unexpected amount of list sizes.");
   2959     std::copy(Components.begin(), Components.end(), getComponentsRef().begin());
   2960   }
   2961 
   2962   /// \brief Fill the clause information from the list of declarations and
   2963   /// associated component lists.
   2964   void setClauseInfo(ArrayRef<ValueDecl *> Declarations,
   2965                      MappableExprComponentListsRef ComponentLists) {
   2966     // Perform some checks to make sure the data sizes are consistent with the
   2967     // information available when the clause was created.
   2968     assert(getUniqueDeclarationsTotalNumber(Declarations) ==
   2969                NumUniqueDeclarations &&
   2970            "Unexpected number of mappable expression info entries!");
   2971     assert(getComponentsTotalNumber(ComponentLists) == NumComponents &&
   2972            "Unexpected total number of components!");
   2973     assert(Declarations.size() == ComponentLists.size() &&
   2974            "Declaration and component lists size is not consistent!");
   2975     assert(Declarations.size() == NumComponentLists &&
   2976            "Unexpected declaration and component lists size!");
   2977 
   2978     // Organize the components by declaration and retrieve the original
   2979     // expression. Original expressions are always the first component of the
   2980     // mappable component list.
   2981     llvm::DenseMap<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
   2982         ComponentListMap;
   2983     {
   2984       auto CI = ComponentLists.begin();
   2985       for (auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
   2986            ++DI, ++CI) {
   2987         assert(!CI->empty() && "Invalid component list!");
   2988         ComponentListMap[*DI].push_back(*CI);
   2989       }
   2990     }
   2991 
   2992     // Iterators of the target storage.
   2993     auto UniqueDeclarations = getUniqueDeclsRef();
   2994     auto UDI = UniqueDeclarations.begin();
   2995 
   2996     auto DeclNumLists = getDeclNumListsRef();
   2997     auto DNLI = DeclNumLists.begin();
   2998 
   2999     auto ComponentListSizes = getComponentListSizesRef();
   3000     auto CLSI = ComponentListSizes.begin();
   3001 
   3002     auto Components = getComponentsRef();
   3003     auto CI = Components.begin();
   3004 
   3005     // Variable to compute the accumulation of the number of components.
   3006     unsigned PrevSize = 0u;
   3007 
   3008     // Scan all the declarations and associated component lists.
   3009     for (auto &M : ComponentListMap) {
   3010       // The declaration.
   3011       auto *D = M.first;
   3012       // The component lists.
   3013       auto CL = M.second;
   3014 
   3015       // Initialize the entry.
   3016       *UDI = D;
   3017       ++UDI;
   3018 
   3019       *DNLI = CL.size();
   3020       ++DNLI;
   3021 
   3022       // Obtain the cumulative sizes and concatenate all the components in the
   3023       // reserved storage.
   3024       for (auto C : CL) {
   3025         // Accumulate with the previous size.
   3026         PrevSize += C.size();
   3027 
   3028         // Save the size.
   3029         *CLSI = PrevSize;
   3030         ++CLSI;
   3031 
   3032         // Append components after the current components iterator.
   3033         CI = std::copy(C.begin(), C.end(), CI);
   3034       }
   3035     }
   3036   }
   3037 
   3038   /// \brief Build a clause for \a NumUniqueDeclarations declarations, \a
   3039   /// NumComponentLists total component lists, and \a NumComponents total
   3040   /// components.
   3041   ///
   3042   /// \param K Kind of the clause.
   3043   /// \param StartLoc Starting location of the clause (the clause keyword).
   3044   /// \param LParenLoc Location of '('.
   3045   /// \param EndLoc Ending location of the clause.
   3046   /// \param NumVars Number of expressions listed in the clause.
   3047   /// \param NumUniqueDeclarations Number of unique base declarations in this
   3048   /// clause.
   3049   /// \param NumComponentLists Number of component lists in this clause - one
   3050   /// list for each expression in the clause.
   3051   /// \param NumComponents Total number of expression components in the clause.
   3052   ///
   3053   OMPMappableExprListClause(OpenMPClauseKind K, SourceLocation StartLoc,
   3054                             SourceLocation LParenLoc, SourceLocation EndLoc,
   3055                             unsigned NumVars, unsigned NumUniqueDeclarations,
   3056                             unsigned NumComponentLists, unsigned NumComponents)
   3057       : OMPVarListClause<T>(K, StartLoc, LParenLoc, EndLoc, NumVars),
   3058         NumUniqueDeclarations(NumUniqueDeclarations),
   3059         NumComponentLists(NumComponentLists), NumComponents(NumComponents) {}
   3060 
   3061 public:
   3062   /// \brief Return the number of unique base declarations in this clause.
   3063   unsigned getUniqueDeclarationsNum() const { return NumUniqueDeclarations; }
   3064   /// \brief Return the number of lists derived from the clause expressions.
   3065   unsigned getTotalComponentListNum() const { return NumComponentLists; }
   3066   /// \brief Return the total number of components in all lists derived from the
   3067   /// clause.
   3068   unsigned getTotalComponentsNum() const { return NumComponents; }
   3069 
   3070   /// \brief Iterator that browse the components by lists. It also allows
   3071   /// browsing components of a single declaration.
   3072   class const_component_lists_iterator
   3073       : public llvm::iterator_adaptor_base<
   3074             const_component_lists_iterator,
   3075             MappableExprComponentListRef::const_iterator,
   3076             std::forward_iterator_tag, MappableComponent, ptrdiff_t,
   3077             MappableComponent, MappableComponent> {
   3078     // The declaration the iterator currently refers to.
   3079     ArrayRef<ValueDecl *>::iterator DeclCur;
   3080 
   3081     // The list number associated with the current declaration.
   3082     ArrayRef<unsigned>::iterator NumListsCur;
   3083 
   3084     // Remaining lists for the current declaration.
   3085     unsigned RemainingLists;
   3086 
   3087     // The cumulative size of the previous list, or zero if there is no previous
   3088     // list.
   3089     unsigned PrevListSize;
   3090 
   3091     // The cumulative sizes of the current list - it will delimit the remaining
   3092     // range of interest.
   3093     ArrayRef<unsigned>::const_iterator ListSizeCur;
   3094     ArrayRef<unsigned>::const_iterator ListSizeEnd;
   3095 
   3096     // Iterator to the end of the components storage.
   3097     MappableExprComponentListRef::const_iterator End;
   3098 
   3099   public:
   3100     /// \brief Construct an iterator that scans all lists.
   3101     explicit const_component_lists_iterator(
   3102         ArrayRef<ValueDecl *> UniqueDecls, ArrayRef<unsigned> DeclsListNum,
   3103         ArrayRef<unsigned> CumulativeListSizes,
   3104         MappableExprComponentListRef Components)
   3105         : const_component_lists_iterator::iterator_adaptor_base(
   3106               Components.begin()),
   3107           DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
   3108           RemainingLists(0u), PrevListSize(0u),
   3109           ListSizeCur(CumulativeListSizes.begin()),
   3110           ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
   3111       assert(UniqueDecls.size() == DeclsListNum.size() &&
   3112              "Inconsistent number of declarations and list sizes!");
   3113       if (!DeclsListNum.empty())
   3114         RemainingLists = *NumListsCur;
   3115     }
   3116 
   3117     /// \brief Construct an iterator that scan lists for a given declaration \a
   3118     /// Declaration.
   3119     explicit const_component_lists_iterator(
   3120         const ValueDecl *Declaration, ArrayRef<ValueDecl *> UniqueDecls,
   3121         ArrayRef<unsigned> DeclsListNum, ArrayRef<unsigned> CumulativeListSizes,
   3122         MappableExprComponentListRef Components)
   3123         : const_component_lists_iterator(UniqueDecls, DeclsListNum,
   3124                                          CumulativeListSizes, Components) {
   3125 
   3126       // Look for the desired declaration. While we are looking for it, we
   3127       // update the state so that we know the component where a given list
   3128       // starts.
   3129       for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
   3130         if (*DeclCur == Declaration)
   3131           break;
   3132 
   3133         assert(*NumListsCur > 0 && "No lists associated with declaration??");
   3134 
   3135         // Skip the lists associated with the current declaration, but save the
   3136         // last list size that was skipped.
   3137         std::advance(ListSizeCur, *NumListsCur - 1);
   3138         PrevListSize = *ListSizeCur;
   3139         ++ListSizeCur;
   3140       }
   3141 
   3142       // If we didn't find any declaration, advance the iterator to after the
   3143       // last component and set remaining lists to zero.
   3144       if (ListSizeCur == CumulativeListSizes.end()) {
   3145         this->I = End;
   3146         RemainingLists = 0u;
   3147         return;
   3148       }
   3149 
   3150       // Set the remaining lists with the total number of lists of the current
   3151       // declaration.
   3152       RemainingLists = *NumListsCur;
   3153 
   3154       // Adjust the list size end iterator to the end of the relevant range.
   3155       ListSizeEnd = ListSizeCur;
   3156       std::advance(ListSizeEnd, RemainingLists);
   3157 
   3158       // Given that the list sizes are cumulative, the index of the component
   3159       // that start the list is the size of the previous list.
   3160       std::advance(this->I, PrevListSize);
   3161     }
   3162 
   3163     // Return the array with the current list. The sizes are cumulative, so the
   3164     // array size is the difference between the current size and previous one.
   3165     std::pair<const ValueDecl *, MappableExprComponentListRef>
   3166     operator*() const {
   3167       assert(ListSizeCur != ListSizeEnd && "Invalid iterator!");
   3168       return std::make_pair(
   3169           *DeclCur,
   3170           MappableExprComponentListRef(&*this->I, *ListSizeCur - PrevListSize));
   3171     }
   3172     std::pair<const ValueDecl *, MappableExprComponentListRef>
   3173     operator->() const {
   3174       return **this;
   3175     }
   3176 
   3177     // Skip the components of the current list.
   3178     const_component_lists_iterator &operator++() {
   3179       assert(ListSizeCur != ListSizeEnd && RemainingLists &&
   3180              "Invalid iterator!");
   3181 
   3182       // If we don't have more lists just skip all the components. Otherwise,
   3183       // advance the iterator by the number of components in the current list.
   3184       if (std::next(ListSizeCur) == ListSizeEnd) {
   3185         this->I = End;
   3186         RemainingLists = 0;
   3187       } else {
   3188         std::advance(this->I, *ListSizeCur - PrevListSize);
   3189         PrevListSize = *ListSizeCur;
   3190 
   3191         // We are done with a declaration, move to the next one.
   3192         if (!(--RemainingLists)) {
   3193           ++DeclCur;
   3194           ++NumListsCur;
   3195           RemainingLists = *NumListsCur;
   3196           assert(RemainingLists && "No lists in the following declaration??");
   3197         }
   3198       }
   3199 
   3200       ++ListSizeCur;
   3201       return *this;
   3202     }
   3203   };
   3204 
   3205   typedef llvm::iterator_range<const_component_lists_iterator>
   3206       const_component_lists_range;
   3207 
   3208   /// \brief Iterators for all component lists.
   3209   const_component_lists_iterator component_lists_begin() const {
   3210     return const_component_lists_iterator(
   3211         getUniqueDeclsRef(), getDeclNumListsRef(), getComponentListSizesRef(),
   3212         getComponentsRef());
   3213   }
   3214   const_component_lists_iterator component_lists_end() const {
   3215     return const_component_lists_iterator(
   3216         ArrayRef<ValueDecl *>(), ArrayRef<unsigned>(), ArrayRef<unsigned>(),
   3217         MappableExprComponentListRef(getComponentsRef().end(),
   3218                                      getComponentsRef().end()));
   3219   }
   3220   const_component_lists_range component_lists() const {
   3221     return {component_lists_begin(), component_lists_end()};
   3222   }
   3223 
   3224   /// \brief Iterators for component lists associated with the provided
   3225   /// declaration.
   3226   const_component_lists_iterator
   3227   decl_component_lists_begin(const ValueDecl *VD) const {
   3228     return const_component_lists_iterator(
   3229         VD, getUniqueDeclsRef(), getDeclNumListsRef(),
   3230         getComponentListSizesRef(), getComponentsRef());
   3231   }
   3232   const_component_lists_iterator decl_component_lists_end() const {
   3233     return component_lists_end();
   3234   }
   3235   const_component_lists_range decl_component_lists(const ValueDecl *VD) const {
   3236     return {decl_component_lists_begin(VD), decl_component_lists_end()};
   3237   }
   3238 
   3239   /// Iterators to access all the declarations, number of lists, list sizes, and
   3240   /// components.
   3241   typedef ArrayRef<ValueDecl *>::iterator const_all_decls_iterator;
   3242   typedef llvm::iterator_range<const_all_decls_iterator> const_all_decls_range;
   3243   const_all_decls_range all_decls() const {
   3244     auto A = getUniqueDeclsRef();
   3245     return const_all_decls_range(A.begin(), A.end());
   3246   }
   3247 
   3248   typedef ArrayRef<unsigned>::iterator const_all_num_lists_iterator;
   3249   typedef llvm::iterator_range<const_all_num_lists_iterator>
   3250       const_all_num_lists_range;
   3251   const_all_num_lists_range all_num_lists() const {
   3252     auto A = getDeclNumListsRef();
   3253     return const_all_num_lists_range(A.begin(), A.end());
   3254   }
   3255 
   3256   typedef ArrayRef<unsigned>::iterator const_all_lists_sizes_iterator;
   3257   typedef llvm::iterator_range<const_all_lists_sizes_iterator>
   3258       const_all_lists_sizes_range;
   3259   const_all_lists_sizes_range all_lists_sizes() const {
   3260     auto A = getComponentListSizesRef();
   3261     return const_all_lists_sizes_range(A.begin(), A.end());
   3262   }
   3263 
   3264   typedef ArrayRef<MappableComponent>::iterator const_all_components_iterator;
   3265   typedef llvm::iterator_range<const_all_components_iterator>
   3266       const_all_components_range;
   3267   const_all_components_range all_components() const {
   3268     auto A = getComponentsRef();
   3269     return const_all_components_range(A.begin(), A.end());
   3270   }
   3271 };
   3272 
   3273 /// \brief This represents clause 'map' in the '#pragma omp ...'
   3274 /// directives.
   3275 ///
   3276 /// \code
   3277 /// #pragma omp target map(a,b)
   3278 /// \endcode
   3279 /// In this example directive '#pragma omp target' has clause 'map'
   3280 /// with the variables 'a' and 'b'.
   3281 ///
   3282 class OMPMapClause final : public OMPMappableExprListClause<OMPMapClause>,
   3283                            private llvm::TrailingObjects<
   3284                                OMPMapClause, Expr *, ValueDecl *, unsigned,
   3285                                OMPClauseMappableExprCommon::MappableComponent> {
   3286   friend TrailingObjects;
   3287   friend OMPVarListClause;
   3288   friend OMPMappableExprListClause;
   3289   friend class OMPClauseReader;
   3290 
   3291   /// Define the sizes of each trailing object array except the last one. This
   3292   /// is required for TrailingObjects to work properly.
   3293   size_t numTrailingObjects(OverloadToken<Expr *>) const {
   3294     return varlist_size();
   3295   }
   3296   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
   3297     return getUniqueDeclarationsNum();
   3298   }
   3299   size_t numTrailingObjects(OverloadToken<unsigned>) const {
   3300     return getUniqueDeclarationsNum() + getTotalComponentListNum();
   3301   }
   3302 
   3303   /// \brief Map type modifier for the 'map' clause.
   3304   OpenMPMapClauseKind MapTypeModifier;
   3305   /// \brief Map type for the 'map' clause.
   3306   OpenMPMapClauseKind MapType;
   3307   /// \brief Is this an implicit map type or not.
   3308   bool MapTypeIsImplicit;
   3309   /// \brief Location of the map type.
   3310   SourceLocation MapLoc;
   3311   /// \brief Colon location.
   3312   SourceLocation ColonLoc;
   3313 
   3314   /// \brief Set type modifier for the clause.
   3315   ///
   3316   /// \param T Type Modifier for the clause.
   3317   ///
   3318   void setMapTypeModifier(OpenMPMapClauseKind T) { MapTypeModifier = T; }
   3319 
   3320   /// \brief Set type for the clause.
   3321   ///
   3322   /// \param T Type for the clause.
   3323   ///
   3324   void setMapType(OpenMPMapClauseKind T) { MapType = T; }
   3325 
   3326   /// \brief Set type location.
   3327   ///
   3328   /// \param TLoc Type location.
   3329   ///
   3330   void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
   3331 
   3332   /// \brief Set colon location.
   3333   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
   3334 
   3335   /// \brief Build a clause for \a NumVars listed expressions, \a
   3336   /// NumUniqueDeclarations declarations, \a NumComponentLists total component
   3337   /// lists, and \a NumComponents total expression components.
   3338   ///
   3339   /// \param MapTypeModifier Map type modifier.
   3340   /// \param MapType Map type.
   3341   /// \param MapTypeIsImplicit Map type is inferred implicitly.
   3342   /// \param MapLoc Location of the map type.
   3343   /// \param StartLoc Starting location of the clause.
   3344   /// \param EndLoc Ending location of the clause.
   3345   /// \param NumVars Number of expressions listed in this clause.
   3346   /// \param NumUniqueDeclarations Number of unique base declarations in this
   3347   /// clause.
   3348   /// \param NumComponentLists Number of component lists in this clause.
   3349   /// \param NumComponents Total number of expression components in the clause.
   3350   ///
   3351   explicit OMPMapClause(OpenMPMapClauseKind MapTypeModifier,
   3352                         OpenMPMapClauseKind MapType, bool MapTypeIsImplicit,
   3353                         SourceLocation MapLoc, SourceLocation StartLoc,
   3354                         SourceLocation LParenLoc, SourceLocation EndLoc,
   3355                         unsigned NumVars, unsigned NumUniqueDeclarations,
   3356                         unsigned NumComponentLists, unsigned NumComponents)
   3357       : OMPMappableExprListClause(OMPC_map, StartLoc, LParenLoc, EndLoc,
   3358                                   NumVars, NumUniqueDeclarations,
   3359                                   NumComponentLists, NumComponents),
   3360         MapTypeModifier(MapTypeModifier), MapType(MapType),
   3361         MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {}
   3362 
   3363   /// \brief Build an empty clause.
   3364   ///
   3365   /// \param NumVars Number of expressions listed in this clause.
   3366   /// \param NumUniqueDeclarations Number of unique base declarations in this
   3367   /// clause.
   3368   /// \param NumComponentLists Number of component lists in this clause.
   3369   /// \param NumComponents Total number of expression components in the clause.
   3370   ///
   3371   explicit OMPMapClause(unsigned NumVars, unsigned NumUniqueDeclarations,
   3372                         unsigned NumComponentLists, unsigned NumComponents)
   3373       : OMPMappableExprListClause(
   3374             OMPC_map, SourceLocation(), SourceLocation(), SourceLocation(),
   3375             NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents),
   3376         MapTypeModifier(OMPC_MAP_unknown), MapType(OMPC_MAP_unknown),
   3377         MapTypeIsImplicit(false), MapLoc() {}
   3378 
   3379 public:
   3380   /// \brief Creates clause with a list of variables \a VL.
   3381   ///
   3382   /// \param C AST context.
   3383   /// \param StartLoc Starting location of the clause.
   3384   /// \param EndLoc Ending location of the clause.
   3385   /// \param Vars The original expression used in the clause.
   3386   /// \param Declarations Declarations used in the clause.
   3387   /// \param ComponentLists Component lists used in the clause.
   3388   /// \param TypeModifier Map type modifier.
   3389   /// \param Type Map type.
   3390   /// \param TypeIsImplicit Map type is inferred implicitly.
   3391   /// \param TypeLoc Location of the map type.
   3392   ///
   3393   static OMPMapClause *Create(const ASTContext &C, SourceLocation StartLoc,
   3394                               SourceLocation LParenLoc, SourceLocation EndLoc,
   3395                               ArrayRef<Expr *> Vars,
   3396                               ArrayRef<ValueDecl *> Declarations,
   3397                               MappableExprComponentListsRef ComponentLists,
   3398                               OpenMPMapClauseKind TypeModifier,
   3399                               OpenMPMapClauseKind Type, bool TypeIsImplicit,
   3400                               SourceLocation TypeLoc);
   3401   /// \brief Creates an empty clause with the place for for \a NumVars original
   3402   /// expressions, \a NumUniqueDeclarations declarations, \NumComponentLists
   3403   /// lists, and \a NumComponents expression components.
   3404   ///
   3405   /// \param C AST context.
   3406   /// \param NumVars Number of expressions listed in the clause.
   3407   /// \param NumUniqueDeclarations Number of unique base declarations in this
   3408   /// clause.
   3409   /// \param NumComponentLists Number of unique base declarations in this
   3410   /// clause.
   3411   /// \param NumComponents Total number of expression components in the clause.
   3412   ///
   3413   static OMPMapClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
   3414                                    unsigned NumUniqueDeclarations,
   3415                                    unsigned NumComponentLists,
   3416                                    unsigned NumComponents);
   3417 
   3418   /// \brief Fetches mapping kind for the clause.
   3419   OpenMPMapClauseKind getMapType() const LLVM_READONLY { return MapType; }
   3420 
   3421   /// \brief Is this an implicit map type?
   3422   /// We have to capture 'IsMapTypeImplicit' from the parser for more
   3423   /// informative error messages.  It helps distinguish map(r) from
   3424   /// map(tofrom: r), which is important to print more helpful error
   3425   /// messages for some target directives.
   3426   bool isImplicitMapType() const LLVM_READONLY { return MapTypeIsImplicit; }
   3427 
   3428   /// \brief Fetches the map type modifier for the clause.
   3429   OpenMPMapClauseKind getMapTypeModifier() const LLVM_READONLY {
   3430     return MapTypeModifier;
   3431   }
   3432 
   3433   /// \brief Fetches location of clause mapping kind.
   3434   SourceLocation getMapLoc() const LLVM_READONLY { return MapLoc; }
   3435 
   3436   /// \brief Get colon location.
   3437   SourceLocation getColonLoc() const { return ColonLoc; }
   3438 
   3439   static bool classof(const OMPClause *T) {
   3440     return T->getClauseKind() == OMPC_map;
   3441   }
   3442 
   3443   child_range children() {
   3444     return child_range(
   3445         reinterpret_cast<Stmt **>(varlist_begin()),
   3446         reinterpret_cast<Stmt **>(varlist_end()));
   3447   }
   3448 };
   3449 
   3450 /// \brief This represents 'num_teams' clause in the '#pragma omp ...'
   3451 /// directive.
   3452 ///
   3453 /// \code
   3454 /// #pragma omp teams num_teams(n)
   3455 /// \endcode
   3456 /// In this example directive '#pragma omp teams' has clause 'num_teams'
   3457 /// with single expression 'n'.
   3458 ///
   3459 class OMPNumTeamsClause : public OMPClause {
   3460   friend class OMPClauseReader;
   3461   /// \brief Location of '('.
   3462   SourceLocation LParenLoc;
   3463   /// \brief NumTeams number.
   3464   Stmt *NumTeams;
   3465   /// \brief Set the NumTeams number.
   3466   ///
   3467   /// \param E NumTeams number.
   3468   ///
   3469   void setNumTeams(Expr *E) { NumTeams = E; }
   3470 
   3471 public:
   3472   /// \brief Build 'num_teams' clause.
   3473   ///
   3474   /// \param E Expression associated with this clause.
   3475   /// \param StartLoc Starting location of the clause.
   3476   /// \param LParenLoc Location of '('.
   3477   /// \param EndLoc Ending location of the clause.
   3478   ///
   3479   OMPNumTeamsClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
   3480                     SourceLocation EndLoc)
   3481       : OMPClause(OMPC_num_teams, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3482         NumTeams(E) {}
   3483 
   3484   /// \brief Build an empty clause.
   3485   ///
   3486   OMPNumTeamsClause()
   3487       : OMPClause(OMPC_num_teams, SourceLocation(), SourceLocation()),
   3488         LParenLoc(SourceLocation()), NumTeams(nullptr) {}
   3489   /// \brief Sets the location of '('.
   3490   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3491   /// \brief Returns the location of '('.
   3492   SourceLocation getLParenLoc() const { return LParenLoc; }
   3493   /// \brief Return NumTeams number.
   3494   Expr *getNumTeams() { return cast<Expr>(NumTeams); }
   3495   /// \brief Return NumTeams number.
   3496   Expr *getNumTeams() const { return cast<Expr>(NumTeams); }
   3497 
   3498   static bool classof(const OMPClause *T) {
   3499     return T->getClauseKind() == OMPC_num_teams;
   3500   }
   3501 
   3502   child_range children() { return child_range(&NumTeams, &NumTeams + 1); }
   3503 };
   3504 
   3505 /// \brief This represents 'thread_limit' clause in the '#pragma omp ...'
   3506 /// directive.
   3507 ///
   3508 /// \code
   3509 /// #pragma omp teams thread_limit(n)
   3510 /// \endcode
   3511 /// In this example directive '#pragma omp teams' has clause 'thread_limit'
   3512 /// with single expression 'n'.
   3513 ///
   3514 class OMPThreadLimitClause : public OMPClause {
   3515   friend class OMPClauseReader;
   3516   /// \brief Location of '('.
   3517   SourceLocation LParenLoc;
   3518   /// \brief ThreadLimit number.
   3519   Stmt *ThreadLimit;
   3520   /// \brief Set the ThreadLimit number.
   3521   ///
   3522   /// \param E ThreadLimit number.
   3523   ///
   3524   void setThreadLimit(Expr *E) { ThreadLimit = E; }
   3525 
   3526 public:
   3527   /// \brief Build 'thread_limit' clause.
   3528   ///
   3529   /// \param E Expression associated with this clause.
   3530   /// \param StartLoc Starting location of the clause.
   3531   /// \param LParenLoc Location of '('.
   3532   /// \param EndLoc Ending location of the clause.
   3533   ///
   3534   OMPThreadLimitClause(Expr *E, SourceLocation StartLoc,
   3535                        SourceLocation LParenLoc, SourceLocation EndLoc)
   3536       : OMPClause(OMPC_thread_limit, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3537         ThreadLimit(E) {}
   3538 
   3539   /// \brief Build an empty clause.
   3540   ///
   3541   OMPThreadLimitClause()
   3542       : OMPClause(OMPC_thread_limit, SourceLocation(), SourceLocation()),
   3543         LParenLoc(SourceLocation()), ThreadLimit(nullptr) {}
   3544   /// \brief Sets the location of '('.
   3545   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3546   /// \brief Returns the location of '('.
   3547   SourceLocation getLParenLoc() const { return LParenLoc; }
   3548   /// \brief Return ThreadLimit number.
   3549   Expr *getThreadLimit() { return cast<Expr>(ThreadLimit); }
   3550   /// \brief Return ThreadLimit number.
   3551   Expr *getThreadLimit() const { return cast<Expr>(ThreadLimit); }
   3552 
   3553   static bool classof(const OMPClause *T) {
   3554     return T->getClauseKind() == OMPC_thread_limit;
   3555   }
   3556 
   3557   child_range children() { return child_range(&ThreadLimit, &ThreadLimit + 1); }
   3558 };
   3559 
   3560 /// \brief This represents 'priority' clause in the '#pragma omp ...'
   3561 /// directive.
   3562 ///
   3563 /// \code
   3564 /// #pragma omp task priority(n)
   3565 /// \endcode
   3566 /// In this example directive '#pragma omp teams' has clause 'priority' with
   3567 /// single expression 'n'.
   3568 ///
   3569 class OMPPriorityClause : public OMPClause {
   3570   friend class OMPClauseReader;
   3571   /// \brief Location of '('.
   3572   SourceLocation LParenLoc;
   3573   /// \brief Priority number.
   3574   Stmt *Priority;
   3575   /// \brief Set the Priority number.
   3576   ///
   3577   /// \param E Priority number.
   3578   ///
   3579   void setPriority(Expr *E) { Priority = E; }
   3580 
   3581 public:
   3582   /// \brief Build 'priority' clause.
   3583   ///
   3584   /// \param E Expression associated with this clause.
   3585   /// \param StartLoc Starting location of the clause.
   3586   /// \param LParenLoc Location of '('.
   3587   /// \param EndLoc Ending location of the clause.
   3588   ///
   3589   OMPPriorityClause(Expr *E, SourceLocation StartLoc, SourceLocation LParenLoc,
   3590                     SourceLocation EndLoc)
   3591       : OMPClause(OMPC_priority, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3592         Priority(E) {}
   3593 
   3594   /// \brief Build an empty clause.
   3595   ///
   3596   OMPPriorityClause()
   3597       : OMPClause(OMPC_priority, SourceLocation(), SourceLocation()),
   3598         LParenLoc(SourceLocation()), Priority(nullptr) {}
   3599   /// \brief Sets the location of '('.
   3600   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3601   /// \brief Returns the location of '('.
   3602   SourceLocation getLParenLoc() const { return LParenLoc; }
   3603   /// \brief Return Priority number.
   3604   Expr *getPriority() { return cast<Expr>(Priority); }
   3605   /// \brief Return Priority number.
   3606   Expr *getPriority() const { return cast<Expr>(Priority); }
   3607 
   3608   static bool classof(const OMPClause *T) {
   3609     return T->getClauseKind() == OMPC_priority;
   3610   }
   3611 
   3612   child_range children() { return child_range(&Priority, &Priority + 1); }
   3613 };
   3614 
   3615 /// \brief This represents 'grainsize' clause in the '#pragma omp ...'
   3616 /// directive.
   3617 ///
   3618 /// \code
   3619 /// #pragma omp taskloop grainsize(4)
   3620 /// \endcode
   3621 /// In this example directive '#pragma omp taskloop' has clause 'grainsize'
   3622 /// with single expression '4'.
   3623 ///
   3624 class OMPGrainsizeClause : public OMPClause {
   3625   friend class OMPClauseReader;
   3626   /// \brief Location of '('.
   3627   SourceLocation LParenLoc;
   3628   /// \brief Safe iteration space distance.
   3629   Stmt *Grainsize;
   3630 
   3631   /// \brief Set safelen.
   3632   void setGrainsize(Expr *Size) { Grainsize = Size; }
   3633 
   3634 public:
   3635   /// \brief Build 'grainsize' clause.
   3636   ///
   3637   /// \param Size Expression associated with this clause.
   3638   /// \param StartLoc Starting location of the clause.
   3639   /// \param EndLoc Ending location of the clause.
   3640   ///
   3641   OMPGrainsizeClause(Expr *Size, SourceLocation StartLoc,
   3642                      SourceLocation LParenLoc, SourceLocation EndLoc)
   3643       : OMPClause(OMPC_grainsize, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3644         Grainsize(Size) {}
   3645 
   3646   /// \brief Build an empty clause.
   3647   ///
   3648   explicit OMPGrainsizeClause()
   3649       : OMPClause(OMPC_grainsize, SourceLocation(), SourceLocation()),
   3650         LParenLoc(SourceLocation()), Grainsize(nullptr) {}
   3651 
   3652   /// \brief Sets the location of '('.
   3653   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3654   /// \brief Returns the location of '('.
   3655   SourceLocation getLParenLoc() const { return LParenLoc; }
   3656 
   3657   /// \brief Return safe iteration space distance.
   3658   Expr *getGrainsize() const { return cast_or_null<Expr>(Grainsize); }
   3659 
   3660   static bool classof(const OMPClause *T) {
   3661     return T->getClauseKind() == OMPC_grainsize;
   3662   }
   3663 
   3664   child_range children() { return child_range(&Grainsize, &Grainsize + 1); }
   3665 };
   3666 
   3667 /// \brief This represents 'nogroup' clause in the '#pragma omp ...' directive.
   3668 ///
   3669 /// \code
   3670 /// #pragma omp taskloop nogroup
   3671 /// \endcode
   3672 /// In this example directive '#pragma omp taskloop' has 'nogroup' clause.
   3673 ///
   3674 class OMPNogroupClause : public OMPClause {
   3675 public:
   3676   /// \brief Build 'nogroup' clause.
   3677   ///
   3678   /// \param StartLoc Starting location of the clause.
   3679   /// \param EndLoc Ending location of the clause.
   3680   ///
   3681   OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
   3682       : OMPClause(OMPC_nogroup, StartLoc, EndLoc) {}
   3683 
   3684   /// \brief Build an empty clause.
   3685   ///
   3686   OMPNogroupClause()
   3687       : OMPClause(OMPC_nogroup, SourceLocation(), SourceLocation()) {}
   3688 
   3689   static bool classof(const OMPClause *T) {
   3690     return T->getClauseKind() == OMPC_nogroup;
   3691   }
   3692 
   3693   child_range children() {
   3694     return child_range(child_iterator(), child_iterator());
   3695   }
   3696 };
   3697 
   3698 /// \brief This represents 'num_tasks' clause in the '#pragma omp ...'
   3699 /// directive.
   3700 ///
   3701 /// \code
   3702 /// #pragma omp taskloop num_tasks(4)
   3703 /// \endcode
   3704 /// In this example directive '#pragma omp taskloop' has clause 'num_tasks'
   3705 /// with single expression '4'.
   3706 ///
   3707 class OMPNumTasksClause : public OMPClause {
   3708   friend class OMPClauseReader;
   3709   /// \brief Location of '('.
   3710   SourceLocation LParenLoc;
   3711   /// \brief Safe iteration space distance.
   3712   Stmt *NumTasks;
   3713 
   3714   /// \brief Set safelen.
   3715   void setNumTasks(Expr *Size) { NumTasks = Size; }
   3716 
   3717 public:
   3718   /// \brief Build 'num_tasks' clause.
   3719   ///
   3720   /// \param Size Expression associated with this clause.
   3721   /// \param StartLoc Starting location of the clause.
   3722   /// \param EndLoc Ending location of the clause.
   3723   ///
   3724   OMPNumTasksClause(Expr *Size, SourceLocation StartLoc,
   3725                     SourceLocation LParenLoc, SourceLocation EndLoc)
   3726       : OMPClause(OMPC_num_tasks, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3727         NumTasks(Size) {}
   3728 
   3729   /// \brief Build an empty clause.
   3730   ///
   3731   explicit OMPNumTasksClause()
   3732       : OMPClause(OMPC_num_tasks, SourceLocation(), SourceLocation()),
   3733         LParenLoc(SourceLocation()), NumTasks(nullptr) {}
   3734 
   3735   /// \brief Sets the location of '('.
   3736   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3737   /// \brief Returns the location of '('.
   3738   SourceLocation getLParenLoc() const { return LParenLoc; }
   3739 
   3740   /// \brief Return safe iteration space distance.
   3741   Expr *getNumTasks() const { return cast_or_null<Expr>(NumTasks); }
   3742 
   3743   static bool classof(const OMPClause *T) {
   3744     return T->getClauseKind() == OMPC_num_tasks;
   3745   }
   3746 
   3747   child_range children() { return child_range(&NumTasks, &NumTasks + 1); }
   3748 };
   3749 
   3750 /// \brief This represents 'hint' clause in the '#pragma omp ...' directive.
   3751 ///
   3752 /// \code
   3753 /// #pragma omp critical (name) hint(6)
   3754 /// \endcode
   3755 /// In this example directive '#pragma omp critical' has name 'name' and clause
   3756 /// 'hint' with argument '6'.
   3757 ///
   3758 class OMPHintClause : public OMPClause {
   3759   friend class OMPClauseReader;
   3760   /// \brief Location of '('.
   3761   SourceLocation LParenLoc;
   3762   /// \brief Hint expression of the 'hint' clause.
   3763   Stmt *Hint;
   3764 
   3765   /// \brief Set hint expression.
   3766   ///
   3767   void setHint(Expr *H) { Hint = H; }
   3768 
   3769 public:
   3770   /// \brief Build 'hint' clause with expression \a Hint.
   3771   ///
   3772   /// \param Hint Hint expression.
   3773   /// \param StartLoc Starting location of the clause.
   3774   /// \param LParenLoc Location of '('.
   3775   /// \param EndLoc Ending location of the clause.
   3776   ///
   3777   OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc,
   3778                 SourceLocation EndLoc)
   3779       : OMPClause(OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3780         Hint(Hint) {}
   3781 
   3782   /// \brief Build an empty clause.
   3783   ///
   3784   OMPHintClause()
   3785       : OMPClause(OMPC_hint, SourceLocation(), SourceLocation()),
   3786         LParenLoc(SourceLocation()), Hint(nullptr) {}
   3787 
   3788   /// \brief Sets the location of '('.
   3789   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3790   /// \brief Returns the location of '('.
   3791   SourceLocation getLParenLoc() const { return LParenLoc; }
   3792 
   3793   /// \brief Returns number of threads.
   3794   Expr *getHint() const { return cast_or_null<Expr>(Hint); }
   3795 
   3796   static bool classof(const OMPClause *T) {
   3797     return T->getClauseKind() == OMPC_hint;
   3798   }
   3799 
   3800   child_range children() { return child_range(&Hint, &Hint + 1); }
   3801 };
   3802 
   3803 /// \brief This represents 'dist_schedule' clause in the '#pragma omp ...'
   3804 /// directive.
   3805 ///
   3806 /// \code
   3807 /// #pragma omp distribute dist_schedule(static, 3)
   3808 /// \endcode
   3809 /// In this example directive '#pragma omp distribute' has 'dist_schedule'
   3810 /// clause with arguments 'static' and '3'.
   3811 ///
   3812 class OMPDistScheduleClause : public OMPClause, public OMPClauseWithPreInit {
   3813   friend class OMPClauseReader;
   3814   /// \brief Location of '('.
   3815   SourceLocation LParenLoc;
   3816   /// \brief A kind of the 'schedule' clause.
   3817   OpenMPDistScheduleClauseKind Kind;
   3818   /// \brief Start location of the schedule kind in source code.
   3819   SourceLocation KindLoc;
   3820   /// \brief Location of ',' (if any).
   3821   SourceLocation CommaLoc;
   3822   /// \brief Chunk size.
   3823   Expr *ChunkSize;
   3824 
   3825   /// \brief Set schedule kind.
   3826   ///
   3827   /// \param K Schedule kind.
   3828   ///
   3829   void setDistScheduleKind(OpenMPDistScheduleClauseKind K) { Kind = K; }
   3830   /// \brief Sets the location of '('.
   3831   ///
   3832   /// \param Loc Location of '('.
   3833   ///
   3834   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3835   /// \brief Set schedule kind start location.
   3836   ///
   3837   /// \param KLoc Schedule kind location.
   3838   ///
   3839   void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
   3840   /// \brief Set location of ','.
   3841   ///
   3842   /// \param Loc Location of ','.
   3843   ///
   3844   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
   3845   /// \brief Set chunk size.
   3846   ///
   3847   /// \param E Chunk size.
   3848   ///
   3849   void setChunkSize(Expr *E) { ChunkSize = E; }
   3850 
   3851 public:
   3852   /// \brief Build 'dist_schedule' clause with schedule kind \a Kind and chunk
   3853   /// size expression \a ChunkSize.
   3854   ///
   3855   /// \param StartLoc Starting location of the clause.
   3856   /// \param LParenLoc Location of '('.
   3857   /// \param KLoc Starting location of the argument.
   3858   /// \param CommaLoc Location of ','.
   3859   /// \param EndLoc Ending location of the clause.
   3860   /// \param Kind DistSchedule kind.
   3861   /// \param ChunkSize Chunk size.
   3862   /// \param HelperChunkSize Helper chunk size for combined directives.
   3863   ///
   3864   OMPDistScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   3865                         SourceLocation KLoc, SourceLocation CommaLoc,
   3866                         SourceLocation EndLoc,
   3867                         OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize,
   3868                         Stmt *HelperChunkSize)
   3869       : OMPClause(OMPC_dist_schedule, StartLoc, EndLoc),
   3870         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
   3871         KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
   3872     setPreInitStmt(HelperChunkSize);
   3873   }
   3874 
   3875   /// \brief Build an empty clause.
   3876   ///
   3877   explicit OMPDistScheduleClause()
   3878       : OMPClause(OMPC_dist_schedule, SourceLocation(), SourceLocation()),
   3879         OMPClauseWithPreInit(this), Kind(OMPC_DIST_SCHEDULE_unknown),
   3880         ChunkSize(nullptr) {}
   3881 
   3882   /// \brief Get kind of the clause.
   3883   ///
   3884   OpenMPDistScheduleClauseKind getDistScheduleKind() const { return Kind; }
   3885   /// \brief Get location of '('.
   3886   ///
   3887   SourceLocation getLParenLoc() { return LParenLoc; }
   3888   /// \brief Get kind location.
   3889   ///
   3890   SourceLocation getDistScheduleKindLoc() { return KindLoc; }
   3891   /// \brief Get location of ','.
   3892   ///
   3893   SourceLocation getCommaLoc() { return CommaLoc; }
   3894   /// \brief Get chunk size.
   3895   ///
   3896   Expr *getChunkSize() { return ChunkSize; }
   3897   /// \brief Get chunk size.
   3898   ///
   3899   const Expr *getChunkSize() const { return ChunkSize; }
   3900 
   3901   static bool classof(const OMPClause *T) {
   3902     return T->getClauseKind() == OMPC_dist_schedule;
   3903   }
   3904 
   3905   child_range children() {
   3906     return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
   3907                        reinterpret_cast<Stmt **>(&ChunkSize) + 1);
   3908   }
   3909 };
   3910 
   3911 /// \brief This represents 'defaultmap' clause in the '#pragma omp ...' directive.
   3912 ///
   3913 /// \code
   3914 /// #pragma omp target defaultmap(tofrom: scalar)
   3915 /// \endcode
   3916 /// In this example directive '#pragma omp target' has 'defaultmap' clause of kind
   3917 /// 'scalar' with modifier 'tofrom'.
   3918 ///
   3919 class OMPDefaultmapClause : public OMPClause {
   3920   friend class OMPClauseReader;
   3921   /// \brief Location of '('.
   3922   SourceLocation LParenLoc;
   3923   /// \brief Modifiers for 'defaultmap' clause.
   3924   OpenMPDefaultmapClauseModifier Modifier;
   3925   /// \brief Locations of modifiers.
   3926   SourceLocation ModifierLoc;
   3927   /// \brief A kind of the 'defaultmap' clause.
   3928   OpenMPDefaultmapClauseKind Kind;
   3929   /// \brief Start location of the defaultmap kind in source code.
   3930   SourceLocation KindLoc;
   3931 
   3932   /// \brief Set defaultmap kind.
   3933   ///
   3934   /// \param K Defaultmap kind.
   3935   ///
   3936   void setDefaultmapKind(OpenMPDefaultmapClauseKind K) { Kind = K; }
   3937   /// \brief Set the defaultmap modifier.
   3938   ///
   3939   /// \param M Defaultmap modifier.
   3940   ///
   3941   void setDefaultmapModifier(OpenMPDefaultmapClauseModifier M) {
   3942     Modifier = M;
   3943   }
   3944   /// \brief Set location of the defaultmap modifier.
   3945   ///
   3946   void setDefaultmapModifierLoc(SourceLocation Loc) {
   3947     ModifierLoc = Loc;
   3948   }
   3949   /// \brief Sets the location of '('.
   3950   ///
   3951   /// \param Loc Location of '('.
   3952   ///
   3953   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
   3954   /// \brief Set defaultmap kind start location.
   3955   ///
   3956   /// \param KLoc Defaultmap kind location.
   3957   ///
   3958   void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
   3959 
   3960 public:
   3961   /// \brief Build 'defaultmap' clause with defaultmap kind \a Kind
   3962   ///
   3963   /// \param StartLoc Starting location of the clause.
   3964   /// \param LParenLoc Location of '('.
   3965   /// \param KLoc Starting location of the argument.
   3966   /// \param EndLoc Ending location of the clause.
   3967   /// \param Kind Defaultmap kind.
   3968   /// \param M The modifier applied to 'defaultmap' clause.
   3969   /// \param MLoc Location of the modifier
   3970   ///
   3971   OMPDefaultmapClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   3972                       SourceLocation MLoc, SourceLocation KLoc,
   3973                       SourceLocation EndLoc, OpenMPDefaultmapClauseKind Kind,
   3974                       OpenMPDefaultmapClauseModifier M)
   3975       : OMPClause(OMPC_defaultmap, StartLoc, EndLoc), LParenLoc(LParenLoc),
   3976         Modifier(M), ModifierLoc(MLoc), Kind(Kind), KindLoc(KLoc) {}
   3977 
   3978   /// \brief Build an empty clause.
   3979   ///
   3980   explicit OMPDefaultmapClause()
   3981       : OMPClause(OMPC_defaultmap, SourceLocation(), SourceLocation()),
   3982         Modifier(OMPC_DEFAULTMAP_MODIFIER_unknown),
   3983         Kind(OMPC_DEFAULTMAP_unknown) {}
   3984 
   3985   /// \brief Get kind of the clause.
   3986   ///
   3987   OpenMPDefaultmapClauseKind getDefaultmapKind() const { return Kind; }
   3988   /// \brief Get the modifier of the clause.
   3989   ///
   3990   OpenMPDefaultmapClauseModifier getDefaultmapModifier() const {
   3991     return Modifier;
   3992   }
   3993   /// \brief Get location of '('.
   3994   ///
   3995   SourceLocation getLParenLoc() { return LParenLoc; }
   3996   /// \brief Get kind location.
   3997   ///
   3998   SourceLocation getDefaultmapKindLoc() { return KindLoc; }
   3999   /// \brief Get the modifier location.
   4000   ///
   4001   SourceLocation getDefaultmapModifierLoc() const {
   4002     return ModifierLoc;
   4003   }
   4004 
   4005   static bool classof(const OMPClause *T) {
   4006     return T->getClauseKind() == OMPC_defaultmap;
   4007   }
   4008 
   4009   child_range children() {
   4010     return child_range(child_iterator(), child_iterator());
   4011   }
   4012 };
   4013 
   4014 /// \brief This represents clause 'to' in the '#pragma omp ...'
   4015 /// directives.
   4016 ///
   4017 /// \code
   4018 /// #pragma omp target update to(a,b)
   4019 /// \endcode
   4020 /// In this example directive '#pragma omp target update' has clause 'to'
   4021 /// with the variables 'a' and 'b'.
   4022 ///
   4023 class OMPToClause final : public OMPMappableExprListClause<OMPToClause>,
   4024                           private llvm::TrailingObjects<
   4025                               OMPToClause, Expr *, ValueDecl *, unsigned,
   4026                               OMPClauseMappableExprCommon::MappableComponent> {
   4027   friend TrailingObjects;
   4028   friend OMPVarListClause;
   4029   friend OMPMappableExprListClause;
   4030   friend class OMPClauseReader;
   4031 
   4032   /// Define the sizes of each trailing object array except the last one. This
   4033   /// is required for TrailingObjects to work properly.
   4034   size_t numTrailingObjects(OverloadToken<Expr *>) const {
   4035     return varlist_size();
   4036   }
   4037   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
   4038     return getUniqueDeclarationsNum();
   4039   }
   4040   size_t numTrailingObjects(OverloadToken<unsigned>) const {
   4041     return getUniqueDeclarationsNum() + getTotalComponentListNum();
   4042   }
   4043 
   4044   /// \brief Build clause with number of variables \a NumVars.
   4045   ///
   4046   /// \param StartLoc Starting location of the clause.
   4047   /// \param EndLoc Ending location of the clause.
   4048   /// \param NumVars Number of expressions listed in this clause.
   4049   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4050   /// clause.
   4051   /// \param NumComponentLists Number of component lists in this clause.
   4052   /// \param NumComponents Total number of expression components in the clause.
   4053   ///
   4054   explicit OMPToClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   4055                        SourceLocation EndLoc, unsigned NumVars,
   4056                        unsigned NumUniqueDeclarations,
   4057                        unsigned NumComponentLists, unsigned NumComponents)
   4058       : OMPMappableExprListClause(OMPC_to, StartLoc, LParenLoc, EndLoc, NumVars,
   4059                                   NumUniqueDeclarations, NumComponentLists,
   4060                                   NumComponents) {}
   4061 
   4062   /// \brief Build an empty clause.
   4063   ///
   4064   /// \param NumVars Number of expressions listed in this clause.
   4065   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4066   /// clause.
   4067   /// \param NumComponentLists Number of component lists in this clause.
   4068   /// \param NumComponents Total number of expression components in the clause.
   4069   ///
   4070   explicit OMPToClause(unsigned NumVars, unsigned NumUniqueDeclarations,
   4071                        unsigned NumComponentLists, unsigned NumComponents)
   4072       : OMPMappableExprListClause(
   4073             OMPC_to, SourceLocation(), SourceLocation(), SourceLocation(),
   4074             NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents) {}
   4075 
   4076 public:
   4077   /// \brief Creates clause with a list of variables \a Vars.
   4078   ///
   4079   /// \param C AST context.
   4080   /// \param StartLoc Starting location of the clause.
   4081   /// \param EndLoc Ending location of the clause.
   4082   /// \param Vars The original expression used in the clause.
   4083   /// \param Declarations Declarations used in the clause.
   4084   /// \param ComponentLists Component lists used in the clause.
   4085   ///
   4086   static OMPToClause *Create(const ASTContext &C, SourceLocation StartLoc,
   4087                              SourceLocation LParenLoc, SourceLocation EndLoc,
   4088                              ArrayRef<Expr *> Vars,
   4089                              ArrayRef<ValueDecl *> Declarations,
   4090                              MappableExprComponentListsRef ComponentLists);
   4091 
   4092   /// \brief Creates an empty clause with the place for \a NumVars variables.
   4093   ///
   4094   /// \param C AST context.
   4095   /// \param NumVars Number of expressions listed in the clause.
   4096   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4097   /// clause.
   4098   /// \param NumComponentLists Number of unique base declarations in this
   4099   /// clause.
   4100   /// \param NumComponents Total number of expression components in the clause.
   4101   ///
   4102   static OMPToClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
   4103                                   unsigned NumUniqueDeclarations,
   4104                                   unsigned NumComponentLists,
   4105                                   unsigned NumComponents);
   4106 
   4107   static bool classof(const OMPClause *T) {
   4108     return T->getClauseKind() == OMPC_to;
   4109   }
   4110 
   4111   child_range children() {
   4112     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   4113                        reinterpret_cast<Stmt **>(varlist_end()));
   4114   }
   4115 };
   4116 
   4117 /// \brief This represents clause 'from' in the '#pragma omp ...'
   4118 /// directives.
   4119 ///
   4120 /// \code
   4121 /// #pragma omp target update from(a,b)
   4122 /// \endcode
   4123 /// In this example directive '#pragma omp target update' has clause 'from'
   4124 /// with the variables 'a' and 'b'.
   4125 ///
   4126 class OMPFromClause final
   4127     : public OMPMappableExprListClause<OMPFromClause>,
   4128       private llvm::TrailingObjects<
   4129           OMPFromClause, Expr *, ValueDecl *, unsigned,
   4130           OMPClauseMappableExprCommon::MappableComponent> {
   4131   friend TrailingObjects;
   4132   friend OMPVarListClause;
   4133   friend OMPMappableExprListClause;
   4134   friend class OMPClauseReader;
   4135 
   4136   /// Define the sizes of each trailing object array except the last one. This
   4137   /// is required for TrailingObjects to work properly.
   4138   size_t numTrailingObjects(OverloadToken<Expr *>) const {
   4139     return varlist_size();
   4140   }
   4141   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
   4142     return getUniqueDeclarationsNum();
   4143   }
   4144   size_t numTrailingObjects(OverloadToken<unsigned>) const {
   4145     return getUniqueDeclarationsNum() + getTotalComponentListNum();
   4146   }
   4147 
   4148   /// \brief Build clause with number of variables \a NumVars.
   4149   ///
   4150   /// \param StartLoc Starting location of the clause.
   4151   /// \param EndLoc Ending location of the clause.
   4152   /// \param NumVars Number of expressions listed in this clause.
   4153   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4154   /// clause.
   4155   /// \param NumComponentLists Number of component lists in this clause.
   4156   /// \param NumComponents Total number of expression components in the clause.
   4157   ///
   4158   explicit OMPFromClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   4159                          SourceLocation EndLoc, unsigned NumVars,
   4160                          unsigned NumUniqueDeclarations,
   4161                          unsigned NumComponentLists, unsigned NumComponents)
   4162       : OMPMappableExprListClause(OMPC_from, StartLoc, LParenLoc, EndLoc,
   4163                                   NumVars, NumUniqueDeclarations,
   4164                                   NumComponentLists, NumComponents) {}
   4165 
   4166   /// \brief Build an empty clause.
   4167   ///
   4168   /// \param NumVars Number of expressions listed in this clause.
   4169   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4170   /// clause.
   4171   /// \param NumComponentLists Number of component lists in this clause.
   4172   /// \param NumComponents Total number of expression components in the clause.
   4173   ///
   4174   explicit OMPFromClause(unsigned NumVars, unsigned NumUniqueDeclarations,
   4175                          unsigned NumComponentLists, unsigned NumComponents)
   4176       : OMPMappableExprListClause(
   4177             OMPC_from, SourceLocation(), SourceLocation(), SourceLocation(),
   4178             NumVars, NumUniqueDeclarations, NumComponentLists, NumComponents) {}
   4179 
   4180 public:
   4181   /// \brief Creates clause with a list of variables \a Vars.
   4182   ///
   4183   /// \param C AST context.
   4184   /// \param StartLoc Starting location of the clause.
   4185   /// \param EndLoc Ending location of the clause.
   4186   /// \param Vars The original expression used in the clause.
   4187   /// \param Declarations Declarations used in the clause.
   4188   /// \param ComponentLists Component lists used in the clause.
   4189   ///
   4190   static OMPFromClause *Create(const ASTContext &C, SourceLocation StartLoc,
   4191                                SourceLocation LParenLoc, SourceLocation EndLoc,
   4192                                ArrayRef<Expr *> Vars,
   4193                                ArrayRef<ValueDecl *> Declarations,
   4194                                MappableExprComponentListsRef ComponentLists);
   4195 
   4196   /// \brief Creates an empty clause with the place for \a NumVars variables.
   4197   ///
   4198   /// \param C AST context.
   4199   /// \param NumVars Number of expressions listed in the clause.
   4200   /// \param NumUniqueDeclarations Number of unique base declarations in this
   4201   /// clause.
   4202   /// \param NumComponentLists Number of unique base declarations in this
   4203   /// clause.
   4204   /// \param NumComponents Total number of expression components in the clause.
   4205   ///
   4206   static OMPFromClause *CreateEmpty(const ASTContext &C, unsigned NumVars,
   4207                                     unsigned NumUniqueDeclarations,
   4208                                     unsigned NumComponentLists,
   4209                                     unsigned NumComponents);
   4210 
   4211   static bool classof(const OMPClause *T) {
   4212     return T->getClauseKind() == OMPC_from;
   4213   }
   4214 
   4215   child_range children() {
   4216     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   4217                        reinterpret_cast<Stmt **>(varlist_end()));
   4218   }
   4219 };
   4220 
   4221 /// This represents clause 'use_device_ptr' in the '#pragma omp ...'
   4222 /// directives.
   4223 ///
   4224 /// \code
   4225 /// #pragma omp target data use_device_ptr(a,b)
   4226 /// \endcode
   4227 /// In this example directive '#pragma omp target data' has clause
   4228 /// 'use_device_ptr' with the variables 'a' and 'b'.
   4229 ///
   4230 class OMPUseDevicePtrClause final
   4231     : public OMPVarListClause<OMPUseDevicePtrClause>,
   4232       private llvm::TrailingObjects<OMPUseDevicePtrClause, Expr *> {
   4233   friend TrailingObjects;
   4234   friend OMPVarListClause;
   4235   friend class OMPClauseReader;
   4236   /// Build clause with number of variables \a N.
   4237   ///
   4238   /// \param StartLoc Starting location of the clause.
   4239   /// \param LParenLoc Location of '('.
   4240   /// \param EndLoc Ending location of the clause.
   4241   /// \param N Number of the variables in the clause.
   4242   ///
   4243   OMPUseDevicePtrClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   4244                         SourceLocation EndLoc, unsigned N)
   4245       : OMPVarListClause<OMPUseDevicePtrClause>(OMPC_use_device_ptr, StartLoc,
   4246                                                 LParenLoc, EndLoc, N) {}
   4247 
   4248   /// \brief Build an empty clause.
   4249   ///
   4250   /// \param N Number of variables.
   4251   ///
   4252   explicit OMPUseDevicePtrClause(unsigned N)
   4253       : OMPVarListClause<OMPUseDevicePtrClause>(
   4254             OMPC_use_device_ptr, SourceLocation(), SourceLocation(),
   4255             SourceLocation(), N) {}
   4256 
   4257 public:
   4258   /// Creates clause with a list of variables \a VL.
   4259   ///
   4260   /// \param C AST context.
   4261   /// \param StartLoc Starting location of the clause.
   4262   /// \param LParenLoc Location of '('.
   4263   /// \param EndLoc Ending location of the clause.
   4264   /// \param VL List of references to the variables.
   4265   ///
   4266   static OMPUseDevicePtrClause *
   4267   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   4268          SourceLocation EndLoc, ArrayRef<Expr *> VL);
   4269   /// Creates an empty clause with the place for \a N variables.
   4270   ///
   4271   /// \param C AST context.
   4272   /// \param N The number of variables.
   4273   ///
   4274   static OMPUseDevicePtrClause *CreateEmpty(const ASTContext &C, unsigned N);
   4275 
   4276   child_range children() {
   4277     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   4278                        reinterpret_cast<Stmt **>(varlist_end()));
   4279   }
   4280 
   4281   static bool classof(const OMPClause *T) {
   4282     return T->getClauseKind() == OMPC_use_device_ptr;
   4283   }
   4284 };
   4285 
   4286 /// This represents clause 'is_device_ptr' in the '#pragma omp ...'
   4287 /// directives.
   4288 ///
   4289 /// \code
   4290 /// #pragma omp target is_device_ptr(a,b)
   4291 /// \endcode
   4292 /// In this example directive '#pragma omp target' has clause
   4293 /// 'is_device_ptr' with the variables 'a' and 'b'.
   4294 ///
   4295 class OMPIsDevicePtrClause final
   4296     : public OMPVarListClause<OMPIsDevicePtrClause>,
   4297       private llvm::TrailingObjects<OMPIsDevicePtrClause, Expr *> {
   4298   friend TrailingObjects;
   4299   friend OMPVarListClause;
   4300   friend class OMPClauseReader;
   4301   /// Build clause with number of variables \a N.
   4302   ///
   4303   /// \param StartLoc Starting location of the clause.
   4304   /// \param LParenLoc Location of '('.
   4305   /// \param EndLoc Ending location of the clause.
   4306   /// \param N Number of the variables in the clause.
   4307   ///
   4308   OMPIsDevicePtrClause(SourceLocation StartLoc, SourceLocation LParenLoc,
   4309                        SourceLocation EndLoc, unsigned N)
   4310       : OMPVarListClause<OMPIsDevicePtrClause>(OMPC_is_device_ptr, StartLoc,
   4311                                                LParenLoc, EndLoc, N) {}
   4312 
   4313   /// Build an empty clause.
   4314   ///
   4315   /// \param N Number of variables.
   4316   ///
   4317   explicit OMPIsDevicePtrClause(unsigned N)
   4318       : OMPVarListClause<OMPIsDevicePtrClause>(
   4319             OMPC_is_device_ptr, SourceLocation(), SourceLocation(),
   4320             SourceLocation(), N) {}
   4321 
   4322 public:
   4323   /// Creates clause with a list of variables \a VL.
   4324   ///
   4325   /// \param C AST context.
   4326   /// \param StartLoc Starting location of the clause.
   4327   /// \param LParenLoc Location of '('.
   4328   /// \param EndLoc Ending location of the clause.
   4329   /// \param VL List of references to the variables.
   4330   ///
   4331   static OMPIsDevicePtrClause *
   4332   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
   4333          SourceLocation EndLoc, ArrayRef<Expr *> VL);
   4334   /// Creates an empty clause with the place for \a N variables.
   4335   ///
   4336   /// \param C AST context.
   4337   /// \param N The number of variables.
   4338   ///
   4339   static OMPIsDevicePtrClause *CreateEmpty(const ASTContext &C, unsigned N);
   4340 
   4341   child_range children() {
   4342     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
   4343                        reinterpret_cast<Stmt **>(varlist_end()));
   4344   }
   4345 
   4346   static bool classof(const OMPClause *T) {
   4347     return T->getClauseKind() == OMPC_is_device_ptr;
   4348   }
   4349 };
   4350 } // end namespace clang
   4351 
   4352 #endif // LLVM_CLANG_AST_OPENMPCLAUSE_H
   4353