Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- OpenMPClause.h - Classes for OpenMP clauses --------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. /// \file
  10. /// 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/ASTFwd.h"
  20. #include "clang/AST/Decl.h"
  21. #include "clang/AST/DeclarationName.h"
  22. #include "clang/AST/Expr.h"
  23. #include "clang/AST/NestedNameSpecifier.h"
  24. #include "clang/AST/Stmt.h"
  25. #include "clang/AST/StmtIterator.h"
  26. #include "clang/Basic/LLVM.h"
  27. #include "clang/Basic/OpenMPKinds.h"
  28. #include "clang/Basic/SourceLocation.h"
  29. #include "llvm/ADT/ArrayRef.h"
  30. #include "llvm/ADT/MapVector.h"
  31. #include "llvm/ADT/PointerIntPair.h"
  32. #include "llvm/ADT/SmallVector.h"
  33. #include "llvm/ADT/iterator.h"
  34. #include "llvm/ADT/iterator_range.h"
  35. #include "llvm/Frontend/OpenMP/OMPAssume.h"
  36. #include "llvm/Frontend/OpenMP/OMPConstants.h"
  37. #include "llvm/Frontend/OpenMP/OMPContext.h"
  38. #include "llvm/Support/Casting.h"
  39. #include "llvm/Support/Compiler.h"
  40. #include "llvm/Support/TrailingObjects.h"
  41. #include <cassert>
  42. #include <cstddef>
  43. #include <iterator>
  44. #include <utility>
  45.  
  46. namespace clang {
  47.  
  48. class ASTContext;
  49.  
  50. //===----------------------------------------------------------------------===//
  51. // AST classes for clauses.
  52. //===----------------------------------------------------------------------===//
  53.  
  54. /// This is a basic class for representing single OpenMP clause.
  55. class OMPClause {
  56.   /// Starting location of the clause (the clause keyword).
  57.   SourceLocation StartLoc;
  58.  
  59.   /// Ending location of the clause.
  60.   SourceLocation EndLoc;
  61.  
  62.   /// Kind of the clause.
  63.   OpenMPClauseKind Kind;
  64.  
  65. protected:
  66.   OMPClause(OpenMPClauseKind K, SourceLocation StartLoc, SourceLocation EndLoc)
  67.       : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
  68.  
  69. public:
  70.   /// Returns the starting location of the clause.
  71.   SourceLocation getBeginLoc() const { return StartLoc; }
  72.  
  73.   /// Returns the ending location of the clause.
  74.   SourceLocation getEndLoc() const { return EndLoc; }
  75.  
  76.   /// Sets the starting location of the clause.
  77.   void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
  78.  
  79.   /// Sets the ending location of the clause.
  80.   void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
  81.  
  82.   /// Returns kind of OpenMP clause (private, shared, reduction, etc.).
  83.   OpenMPClauseKind getClauseKind() const { return Kind; }
  84.  
  85.   bool isImplicit() const { return StartLoc.isInvalid(); }
  86.  
  87.   using child_iterator = StmtIterator;
  88.   using const_child_iterator = ConstStmtIterator;
  89.   using child_range = llvm::iterator_range<child_iterator>;
  90.   using const_child_range = llvm::iterator_range<const_child_iterator>;
  91.  
  92.   child_range children();
  93.   const_child_range children() const {
  94.     auto Children = const_cast<OMPClause *>(this)->children();
  95.     return const_child_range(Children.begin(), Children.end());
  96.   }
  97.  
  98.   /// Get the iterator range for the expressions used in the clauses. Used
  99.   /// expressions include only the children that must be evaluated at the
  100.   /// runtime before entering the construct.
  101.   child_range used_children();
  102.   const_child_range used_children() const {
  103.     auto Children = const_cast<OMPClause *>(this)->children();
  104.     return const_child_range(Children.begin(), Children.end());
  105.   }
  106.  
  107.   static bool classof(const OMPClause *) { return true; }
  108. };
  109.  
  110. template <OpenMPClauseKind ClauseKind>
  111. struct OMPNoChildClause : public OMPClause {
  112.   /// Build '\p ClauseKind' clause.
  113.   ///
  114.   /// \param StartLoc Starting location of the clause.
  115.   /// \param EndLoc Ending location of the clause.
  116.   OMPNoChildClause(SourceLocation StartLoc, SourceLocation EndLoc)
  117.       : OMPClause(ClauseKind, StartLoc, EndLoc) {}
  118.  
  119.   /// Build an empty clause.
  120.   OMPNoChildClause()
  121.       : OMPClause(ClauseKind, SourceLocation(), SourceLocation()) {}
  122.  
  123.   child_range children() {
  124.     return child_range(child_iterator(), child_iterator());
  125.   }
  126.  
  127.   const_child_range children() const {
  128.     return const_child_range(const_child_iterator(), const_child_iterator());
  129.   }
  130.  
  131.   child_range used_children() {
  132.     return child_range(child_iterator(), child_iterator());
  133.   }
  134.   const_child_range used_children() const {
  135.     return const_child_range(const_child_iterator(), const_child_iterator());
  136.   }
  137.  
  138.   static bool classof(const OMPClause *T) {
  139.     return T->getClauseKind() == ClauseKind;
  140.   }
  141. };
  142.  
  143. template <OpenMPClauseKind ClauseKind, class Base>
  144. class OMPOneStmtClause : public Base {
  145.  
  146.   /// Location of '('.
  147.   SourceLocation LParenLoc;
  148.  
  149.   /// Sub-expression.
  150.   Stmt *S = nullptr;
  151.  
  152. protected:
  153.   void setStmt(Stmt *S) { this->S = S; }
  154.  
  155. public:
  156.   OMPOneStmtClause(Stmt *S, SourceLocation StartLoc, SourceLocation LParenLoc,
  157.                    SourceLocation EndLoc)
  158.       : Base(ClauseKind, StartLoc, EndLoc), LParenLoc(LParenLoc), S(S) {}
  159.  
  160.   OMPOneStmtClause() : Base(ClauseKind, SourceLocation(), SourceLocation()) {}
  161.  
  162.   /// Return the associated statement, potentially casted to \p T.
  163.   template <typename T> T *getStmtAs() const { return cast_or_null<T>(S); }
  164.  
  165.   /// Sets the location of '('.
  166.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  167.  
  168.   /// Returns the location of '('.
  169.   SourceLocation getLParenLoc() const { return LParenLoc; }
  170.  
  171.   using child_iterator = StmtIterator;
  172.   using const_child_iterator = ConstStmtIterator;
  173.   using child_range = llvm::iterator_range<child_iterator>;
  174.   using const_child_range = llvm::iterator_range<const_child_iterator>;
  175.  
  176.   child_range children() { return child_range(&S, &S + 1); }
  177.  
  178.   const_child_range children() const { return const_child_range(&S, &S + 1); }
  179.  
  180.   // TODO: Consider making the getAddrOfExprAsWritten version the default.
  181.   child_range used_children() {
  182.     return child_range(child_iterator(), child_iterator());
  183.   }
  184.   const_child_range used_children() const {
  185.     return const_child_range(const_child_iterator(), const_child_iterator());
  186.   }
  187.  
  188.   static bool classof(const OMPClause *T) {
  189.     return T->getClauseKind() == ClauseKind;
  190.   }
  191. };
  192.  
  193. /// Class that handles pre-initialization statement for some clauses, like
  194. /// 'shedule', 'firstprivate' etc.
  195. class OMPClauseWithPreInit {
  196.   friend class OMPClauseReader;
  197.  
  198.   /// Pre-initialization statement for the clause.
  199.   Stmt *PreInit = nullptr;
  200.  
  201.   /// Region that captures the associated stmt.
  202.   OpenMPDirectiveKind CaptureRegion = llvm::omp::OMPD_unknown;
  203.  
  204. protected:
  205.   OMPClauseWithPreInit(const OMPClause *This) {
  206.     assert(get(This) && "get is not tuned for pre-init.");
  207.   }
  208.  
  209.   /// Set pre-initialization statement for the clause.
  210.   void
  211.   setPreInitStmt(Stmt *S,
  212.                  OpenMPDirectiveKind ThisRegion = llvm::omp::OMPD_unknown) {
  213.     PreInit = S;
  214.     CaptureRegion = ThisRegion;
  215.   }
  216.  
  217. public:
  218.   /// Get pre-initialization statement for the clause.
  219.   const Stmt *getPreInitStmt() const { return PreInit; }
  220.  
  221.   /// Get pre-initialization statement for the clause.
  222.   Stmt *getPreInitStmt() { return PreInit; }
  223.  
  224.   /// Get capture region for the stmt in the clause.
  225.   OpenMPDirectiveKind getCaptureRegion() const { return CaptureRegion; }
  226.  
  227.   static OMPClauseWithPreInit *get(OMPClause *C);
  228.   static const OMPClauseWithPreInit *get(const OMPClause *C);
  229. };
  230.  
  231. /// Class that handles post-update expression for some clauses, like
  232. /// 'lastprivate', 'reduction' etc.
  233. class OMPClauseWithPostUpdate : public OMPClauseWithPreInit {
  234.   friend class OMPClauseReader;
  235.  
  236.   /// Post-update expression for the clause.
  237.   Expr *PostUpdate = nullptr;
  238.  
  239. protected:
  240.   OMPClauseWithPostUpdate(const OMPClause *This) : OMPClauseWithPreInit(This) {
  241.     assert(get(This) && "get is not tuned for post-update.");
  242.   }
  243.  
  244.   /// Set pre-initialization statement for the clause.
  245.   void setPostUpdateExpr(Expr *S) { PostUpdate = S; }
  246.  
  247. public:
  248.   /// Get post-update expression for the clause.
  249.   const Expr *getPostUpdateExpr() const { return PostUpdate; }
  250.  
  251.   /// Get post-update expression for the clause.
  252.   Expr *getPostUpdateExpr() { return PostUpdate; }
  253.  
  254.   static OMPClauseWithPostUpdate *get(OMPClause *C);
  255.   static const OMPClauseWithPostUpdate *get(const OMPClause *C);
  256. };
  257.  
  258. /// This structure contains most locations needed for by an OMPVarListClause.
  259. struct OMPVarListLocTy {
  260.   /// Starting location of the clause (the clause keyword).
  261.   SourceLocation StartLoc;
  262.   /// Location of '('.
  263.   SourceLocation LParenLoc;
  264.   /// Ending location of the clause.
  265.   SourceLocation EndLoc;
  266.   OMPVarListLocTy() = default;
  267.   OMPVarListLocTy(SourceLocation StartLoc, SourceLocation LParenLoc,
  268.                   SourceLocation EndLoc)
  269.       : StartLoc(StartLoc), LParenLoc(LParenLoc), EndLoc(EndLoc) {}
  270. };
  271.  
  272. /// This represents clauses with the list of variables like 'private',
  273. /// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
  274. /// '#pragma omp ...' directives.
  275. template <class T> class OMPVarListClause : public OMPClause {
  276.   friend class OMPClauseReader;
  277.  
  278.   /// Location of '('.
  279.   SourceLocation LParenLoc;
  280.  
  281.   /// Number of variables in the list.
  282.   unsigned NumVars;
  283.  
  284. protected:
  285.   /// Build a clause with \a N variables
  286.   ///
  287.   /// \param K Kind of the clause.
  288.   /// \param StartLoc Starting location of the clause (the clause keyword).
  289.   /// \param LParenLoc Location of '('.
  290.   /// \param EndLoc Ending location of the clause.
  291.   /// \param N Number of the variables in the clause.
  292.   OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
  293.                    SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
  294.       : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
  295.  
  296.   /// Fetches list of variables associated with this clause.
  297.   MutableArrayRef<Expr *> getVarRefs() {
  298.     return MutableArrayRef<Expr *>(
  299.         static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
  300.   }
  301.  
  302.   /// Sets the list of variables for this clause.
  303.   void setVarRefs(ArrayRef<Expr *> VL) {
  304.     assert(VL.size() == NumVars &&
  305.            "Number of variables is not the same as the preallocated buffer");
  306.     std::copy(VL.begin(), VL.end(),
  307.               static_cast<T *>(this)->template getTrailingObjects<Expr *>());
  308.   }
  309.  
  310. public:
  311.   using varlist_iterator = MutableArrayRef<Expr *>::iterator;
  312.   using varlist_const_iterator = ArrayRef<const Expr *>::iterator;
  313.   using varlist_range = llvm::iterator_range<varlist_iterator>;
  314.   using varlist_const_range = llvm::iterator_range<varlist_const_iterator>;
  315.  
  316.   unsigned varlist_size() const { return NumVars; }
  317.   bool varlist_empty() const { return NumVars == 0; }
  318.  
  319.   varlist_range varlists() {
  320.     return varlist_range(varlist_begin(), varlist_end());
  321.   }
  322.   varlist_const_range varlists() const {
  323.     return varlist_const_range(varlist_begin(), varlist_end());
  324.   }
  325.  
  326.   varlist_iterator varlist_begin() { return getVarRefs().begin(); }
  327.   varlist_iterator varlist_end() { return getVarRefs().end(); }
  328.   varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
  329.   varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
  330.  
  331.   /// Sets the location of '('.
  332.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  333.  
  334.   /// Returns the location of '('.
  335.   SourceLocation getLParenLoc() const { return LParenLoc; }
  336.  
  337.   /// Fetches list of all variables in the clause.
  338.   ArrayRef<const Expr *> getVarRefs() const {
  339.     return llvm::ArrayRef(
  340.         static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
  341.         NumVars);
  342.   }
  343. };
  344.  
  345. /// This represents 'allocator' clause in the '#pragma omp ...'
  346. /// directive.
  347. ///
  348. /// \code
  349. /// #pragma omp allocate(a) allocator(omp_default_mem_alloc)
  350. /// \endcode
  351. /// In this example directive '#pragma omp allocate' has simple 'allocator'
  352. /// clause with the allocator 'omp_default_mem_alloc'.
  353. class OMPAllocatorClause final
  354.     : public OMPOneStmtClause<llvm::omp::OMPC_allocator, OMPClause> {
  355.   friend class OMPClauseReader;
  356.  
  357.   /// Set allocator.
  358.   void setAllocator(Expr *A) { setStmt(A); }
  359.  
  360. public:
  361.   /// Build 'allocator' clause with the given allocator.
  362.   ///
  363.   /// \param A Allocator.
  364.   /// \param StartLoc Starting location of the clause.
  365.   /// \param LParenLoc Location of '('.
  366.   /// \param EndLoc Ending location of the clause.
  367.   OMPAllocatorClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc,
  368.                      SourceLocation EndLoc)
  369.       : OMPOneStmtClause(A, StartLoc, LParenLoc, EndLoc) {}
  370.  
  371.   /// Build an empty clause.
  372.   OMPAllocatorClause() : OMPOneStmtClause() {}
  373.  
  374.   /// Returns allocator.
  375.   Expr *getAllocator() const { return getStmtAs<Expr>(); }
  376. };
  377.  
  378. /// This represents the 'align' clause in the '#pragma omp allocate'
  379. /// directive.
  380. ///
  381. /// \code
  382. /// #pragma omp allocate(a) allocator(omp_default_mem_alloc) align(8)
  383. /// \endcode
  384. /// In this example directive '#pragma omp allocate' has simple 'allocator'
  385. /// clause with the allocator 'omp_default_mem_alloc' and align clause with
  386. /// value of 8.
  387. class OMPAlignClause final
  388.     : public OMPOneStmtClause<llvm::omp::OMPC_align, OMPClause> {
  389.   friend class OMPClauseReader;
  390.  
  391.   /// Set alignment value.
  392.   void setAlignment(Expr *A) { setStmt(A); }
  393.  
  394.   /// Build 'align' clause with the given alignment
  395.   ///
  396.   /// \param A Alignment value.
  397.   /// \param StartLoc Starting location of the clause.
  398.   /// \param LParenLoc Location of '('.
  399.   /// \param EndLoc Ending location of the clause.
  400.   OMPAlignClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc,
  401.                  SourceLocation EndLoc)
  402.       : OMPOneStmtClause(A, StartLoc, LParenLoc, EndLoc) {}
  403.  
  404.   /// Build an empty clause.
  405.   OMPAlignClause() : OMPOneStmtClause() {}
  406.  
  407. public:
  408.   /// Build 'align' clause with the given alignment
  409.   ///
  410.   /// \param A Alignment value.
  411.   /// \param StartLoc Starting location of the clause.
  412.   /// \param LParenLoc Location of '('.
  413.   /// \param EndLoc Ending location of the clause.
  414.   static OMPAlignClause *Create(const ASTContext &C, Expr *A,
  415.                                 SourceLocation StartLoc,
  416.                                 SourceLocation LParenLoc,
  417.                                 SourceLocation EndLoc);
  418.  
  419.   /// Returns alignment
  420.   Expr *getAlignment() const { return getStmtAs<Expr>(); }
  421. };
  422.  
  423. /// This represents clause 'allocate' in the '#pragma omp ...' directives.
  424. ///
  425. /// \code
  426. /// #pragma omp parallel private(a) allocate(omp_default_mem_alloc :a)
  427. /// \endcode
  428. /// In this example directive '#pragma omp parallel' has clause 'private'
  429. /// and clause 'allocate' for the variable 'a'.
  430. class OMPAllocateClause final
  431.     : public OMPVarListClause<OMPAllocateClause>,
  432.       private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
  433.   friend class OMPClauseReader;
  434.   friend OMPVarListClause;
  435.   friend TrailingObjects;
  436.  
  437.   /// Allocator specified in the clause, or 'nullptr' if the default one is
  438.   /// used.
  439.   Expr *Allocator = nullptr;
  440.   /// Position of the ':' delimiter in the clause;
  441.   SourceLocation ColonLoc;
  442.  
  443.   /// Build clause with number of variables \a N.
  444.   ///
  445.   /// \param StartLoc Starting location of the clause.
  446.   /// \param LParenLoc Location of '('.
  447.   /// \param Allocator Allocator expression.
  448.   /// \param ColonLoc Location of ':' delimiter.
  449.   /// \param EndLoc Ending location of the clause.
  450.   /// \param N Number of the variables in the clause.
  451.   OMPAllocateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  452.                     Expr *Allocator, SourceLocation ColonLoc,
  453.                     SourceLocation EndLoc, unsigned N)
  454.       : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate, StartLoc,
  455.                                             LParenLoc, EndLoc, N),
  456.         Allocator(Allocator), ColonLoc(ColonLoc) {}
  457.  
  458.   /// Build an empty clause.
  459.   ///
  460.   /// \param N Number of variables.
  461.   explicit OMPAllocateClause(unsigned N)
  462.       : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate,
  463.                                             SourceLocation(), SourceLocation(),
  464.                                             SourceLocation(), N) {}
  465.  
  466.   /// Sets location of ':' symbol in clause.
  467.   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
  468.  
  469.   void setAllocator(Expr *A) { Allocator = A; }
  470.  
  471. public:
  472.   /// Creates clause with a list of variables \a VL.
  473.   ///
  474.   /// \param C AST context.
  475.   /// \param StartLoc Starting location of the clause.
  476.   /// \param LParenLoc Location of '('.
  477.   /// \param Allocator Allocator expression.
  478.   /// \param ColonLoc Location of ':' delimiter.
  479.   /// \param EndLoc Ending location of the clause.
  480.   /// \param VL List of references to the variables.
  481.   static OMPAllocateClause *Create(const ASTContext &C, SourceLocation StartLoc,
  482.                                    SourceLocation LParenLoc, Expr *Allocator,
  483.                                    SourceLocation ColonLoc,
  484.                                    SourceLocation EndLoc, ArrayRef<Expr *> VL);
  485.  
  486.   /// Returns the allocator expression or nullptr, if no allocator is specified.
  487.   Expr *getAllocator() const { return Allocator; }
  488.  
  489.   /// Returns the location of the ':' delimiter.
  490.   SourceLocation getColonLoc() const { return ColonLoc; }
  491.  
  492.   /// Creates an empty clause with the place for \a N variables.
  493.   ///
  494.   /// \param C AST context.
  495.   /// \param N The number of variables.
  496.   static OMPAllocateClause *CreateEmpty(const ASTContext &C, unsigned N);
  497.  
  498.   child_range children() {
  499.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  500.                        reinterpret_cast<Stmt **>(varlist_end()));
  501.   }
  502.  
  503.   const_child_range children() const {
  504.     auto Children = const_cast<OMPAllocateClause *>(this)->children();
  505.     return const_child_range(Children.begin(), Children.end());
  506.   }
  507.  
  508.   child_range used_children() {
  509.     return child_range(child_iterator(), child_iterator());
  510.   }
  511.   const_child_range used_children() const {
  512.     return const_child_range(const_child_iterator(), const_child_iterator());
  513.   }
  514.  
  515.   static bool classof(const OMPClause *T) {
  516.     return T->getClauseKind() == llvm::omp::OMPC_allocate;
  517.   }
  518. };
  519.  
  520. /// This represents 'if' clause in the '#pragma omp ...' directive.
  521. ///
  522. /// \code
  523. /// #pragma omp parallel if(parallel:a > 5)
  524. /// \endcode
  525. /// In this example directive '#pragma omp parallel' has simple 'if' clause with
  526. /// condition 'a > 5' and directive name modifier 'parallel'.
  527. class OMPIfClause : public OMPClause, public OMPClauseWithPreInit {
  528.   friend class OMPClauseReader;
  529.  
  530.   /// Location of '('.
  531.   SourceLocation LParenLoc;
  532.  
  533.   /// Condition of the 'if' clause.
  534.   Stmt *Condition = nullptr;
  535.  
  536.   /// Location of ':' (if any).
  537.   SourceLocation ColonLoc;
  538.  
  539.   /// Directive name modifier for the clause.
  540.   OpenMPDirectiveKind NameModifier = llvm::omp::OMPD_unknown;
  541.  
  542.   /// Name modifier location.
  543.   SourceLocation NameModifierLoc;
  544.  
  545.   /// Set condition.
  546.   void setCondition(Expr *Cond) { Condition = Cond; }
  547.  
  548.   /// Set directive name modifier for the clause.
  549.   void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
  550.  
  551.   /// Set location of directive name modifier for the clause.
  552.   void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
  553.  
  554.   /// Set location of ':'.
  555.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  556.  
  557. public:
  558.   /// Build 'if' clause with condition \a Cond.
  559.   ///
  560.   /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
  561.   /// \param Cond Condition of the clause.
  562.   /// \param HelperCond Helper condition for the clause.
  563.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  564.   /// clause must be captured.
  565.   /// \param StartLoc Starting location of the clause.
  566.   /// \param LParenLoc Location of '('.
  567.   /// \param NameModifierLoc Location of directive name modifier.
  568.   /// \param ColonLoc [OpenMP 4.1] Location of ':'.
  569.   /// \param EndLoc Ending location of the clause.
  570.   OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond, Stmt *HelperCond,
  571.               OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  572.               SourceLocation LParenLoc, SourceLocation NameModifierLoc,
  573.               SourceLocation ColonLoc, SourceLocation EndLoc)
  574.       : OMPClause(llvm::omp::OMPC_if, StartLoc, EndLoc),
  575.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond),
  576.         ColonLoc(ColonLoc), NameModifier(NameModifier),
  577.         NameModifierLoc(NameModifierLoc) {
  578.     setPreInitStmt(HelperCond, CaptureRegion);
  579.   }
  580.  
  581.   /// Build an empty clause.
  582.   OMPIfClause()
  583.       : OMPClause(llvm::omp::OMPC_if, SourceLocation(), SourceLocation()),
  584.         OMPClauseWithPreInit(this) {}
  585.  
  586.   /// Sets the location of '('.
  587.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  588.  
  589.   /// Returns the location of '('.
  590.   SourceLocation getLParenLoc() const { return LParenLoc; }
  591.  
  592.   /// Return the location of ':'.
  593.   SourceLocation getColonLoc() const { return ColonLoc; }
  594.  
  595.   /// Returns condition.
  596.   Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
  597.  
  598.   /// Return directive name modifier associated with the clause.
  599.   OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
  600.  
  601.   /// Return the location of directive name modifier.
  602.   SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
  603.  
  604.   child_range children() { return child_range(&Condition, &Condition + 1); }
  605.  
  606.   const_child_range children() const {
  607.     return const_child_range(&Condition, &Condition + 1);
  608.   }
  609.  
  610.   child_range used_children();
  611.   const_child_range used_children() const {
  612.     auto Children = const_cast<OMPIfClause *>(this)->used_children();
  613.     return const_child_range(Children.begin(), Children.end());
  614.   }
  615.  
  616.   static bool classof(const OMPClause *T) {
  617.     return T->getClauseKind() == llvm::omp::OMPC_if;
  618.   }
  619. };
  620.  
  621. /// This represents 'final' clause in the '#pragma omp ...' directive.
  622. ///
  623. /// \code
  624. /// #pragma omp task final(a > 5)
  625. /// \endcode
  626. /// In this example directive '#pragma omp task' has simple 'final'
  627. /// clause with condition 'a > 5'.
  628. class OMPFinalClause final
  629.     : public OMPOneStmtClause<llvm::omp::OMPC_final, OMPClause>,
  630.       public OMPClauseWithPreInit {
  631.   friend class OMPClauseReader;
  632.  
  633.   /// Set condition.
  634.   void setCondition(Expr *Cond) { setStmt(Cond); }
  635.  
  636. public:
  637.   /// Build 'final' clause with condition \a Cond.
  638.   ///
  639.   /// \param Cond Condition of the clause.
  640.   /// \param HelperCond Helper condition for the construct.
  641.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  642.   /// clause must be captured.
  643.   /// \param StartLoc Starting location of the clause.
  644.   /// \param LParenLoc Location of '('.
  645.   /// \param EndLoc Ending location of the clause.
  646.   OMPFinalClause(Expr *Cond, Stmt *HelperCond,
  647.                  OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  648.                  SourceLocation LParenLoc, SourceLocation EndLoc)
  649.       : OMPOneStmtClause(Cond, StartLoc, LParenLoc, EndLoc),
  650.         OMPClauseWithPreInit(this) {
  651.     setPreInitStmt(HelperCond, CaptureRegion);
  652.   }
  653.  
  654.   /// Build an empty clause.
  655.   OMPFinalClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  656.  
  657.   /// Returns condition.
  658.   Expr *getCondition() const { return getStmtAs<Expr>(); }
  659.  
  660.   child_range used_children();
  661.   const_child_range used_children() const {
  662.     auto Children = const_cast<OMPFinalClause *>(this)->used_children();
  663.     return const_child_range(Children.begin(), Children.end());
  664.   }
  665. };
  666. /// This represents 'num_threads' clause in the '#pragma omp ...'
  667. /// directive.
  668. ///
  669. /// \code
  670. /// #pragma omp parallel num_threads(6)
  671. /// \endcode
  672. /// In this example directive '#pragma omp parallel' has simple 'num_threads'
  673. /// clause with number of threads '6'.
  674. class OMPNumThreadsClause final
  675.     : public OMPOneStmtClause<llvm::omp::OMPC_num_threads, OMPClause>,
  676.       public OMPClauseWithPreInit {
  677.   friend class OMPClauseReader;
  678.  
  679.   /// Set condition.
  680.   void setNumThreads(Expr *NThreads) { setStmt(NThreads); }
  681.  
  682. public:
  683.   /// Build 'num_threads' clause with condition \a NumThreads.
  684.   ///
  685.   /// \param NumThreads Number of threads for the construct.
  686.   /// \param HelperNumThreads Helper Number of threads for the construct.
  687.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  688.   /// clause must be captured.
  689.   /// \param StartLoc Starting location of the clause.
  690.   /// \param LParenLoc Location of '('.
  691.   /// \param EndLoc Ending location of the clause.
  692.   OMPNumThreadsClause(Expr *NumThreads, Stmt *HelperNumThreads,
  693.                       OpenMPDirectiveKind CaptureRegion,
  694.                       SourceLocation StartLoc, SourceLocation LParenLoc,
  695.                       SourceLocation EndLoc)
  696.       : OMPOneStmtClause(NumThreads, StartLoc, LParenLoc, EndLoc),
  697.         OMPClauseWithPreInit(this) {
  698.     setPreInitStmt(HelperNumThreads, CaptureRegion);
  699.   }
  700.  
  701.   /// Build an empty clause.
  702.   OMPNumThreadsClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  703.  
  704.   /// Returns number of threads.
  705.   Expr *getNumThreads() const { return getStmtAs<Expr>(); }
  706. };
  707.  
  708. /// This represents 'safelen' clause in the '#pragma omp ...'
  709. /// directive.
  710. ///
  711. /// \code
  712. /// #pragma omp simd safelen(4)
  713. /// \endcode
  714. /// In this example directive '#pragma omp simd' has clause 'safelen'
  715. /// with single expression '4'.
  716. /// If the safelen clause is used then no two iterations executed
  717. /// concurrently with SIMD instructions can have a greater distance
  718. /// in the logical iteration space than its value. The parameter of
  719. /// the safelen clause must be a constant positive integer expression.
  720. class OMPSafelenClause final
  721.     : public OMPOneStmtClause<llvm::omp::OMPC_safelen, OMPClause> {
  722.   friend class OMPClauseReader;
  723.  
  724.   /// Set safelen.
  725.   void setSafelen(Expr *Len) { setStmt(Len); }
  726.  
  727. public:
  728.   /// Build 'safelen' clause.
  729.   ///
  730.   /// \param Len Expression associated with this clause.
  731.   /// \param StartLoc Starting location of the clause.
  732.   /// \param EndLoc Ending location of the clause.
  733.   OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
  734.                    SourceLocation EndLoc)
  735.       : OMPOneStmtClause(Len, StartLoc, LParenLoc, EndLoc) {}
  736.  
  737.   /// Build an empty clause.
  738.   explicit OMPSafelenClause() : OMPOneStmtClause() {}
  739.  
  740.   /// Return safe iteration space distance.
  741.   Expr *getSafelen() const { return getStmtAs<Expr>(); }
  742. };
  743.  
  744. /// This represents 'simdlen' clause in the '#pragma omp ...'
  745. /// directive.
  746. ///
  747. /// \code
  748. /// #pragma omp simd simdlen(4)
  749. /// \endcode
  750. /// In this example directive '#pragma omp simd' has clause 'simdlen'
  751. /// with single expression '4'.
  752. /// If the 'simdlen' clause is used then it specifies the preferred number of
  753. /// iterations to be executed concurrently. The parameter of the 'simdlen'
  754. /// clause must be a constant positive integer expression.
  755. class OMPSimdlenClause final
  756.     : public OMPOneStmtClause<llvm::omp::OMPC_simdlen, OMPClause> {
  757.   friend class OMPClauseReader;
  758.  
  759.   /// Set simdlen.
  760.   void setSimdlen(Expr *Len) { setStmt(Len); }
  761.  
  762. public:
  763.   /// Build 'simdlen' clause.
  764.   ///
  765.   /// \param Len Expression associated with this clause.
  766.   /// \param StartLoc Starting location of the clause.
  767.   /// \param EndLoc Ending location of the clause.
  768.   OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
  769.                    SourceLocation EndLoc)
  770.       : OMPOneStmtClause(Len, StartLoc, LParenLoc, EndLoc) {}
  771.  
  772.   /// Build an empty clause.
  773.   explicit OMPSimdlenClause() : OMPOneStmtClause() {}
  774.  
  775.   /// Return safe iteration space distance.
  776.   Expr *getSimdlen() const { return getStmtAs<Expr>(); }
  777. };
  778.  
  779. /// This represents the 'sizes' clause in the '#pragma omp tile' directive.
  780. ///
  781. /// \code
  782. /// #pragma omp tile sizes(5,5)
  783. /// for (int i = 0; i < 64; ++i)
  784. ///   for (int j = 0; j < 64; ++j)
  785. /// \endcode
  786. class OMPSizesClause final
  787.     : public OMPClause,
  788.       private llvm::TrailingObjects<OMPSizesClause, Expr *> {
  789.   friend class OMPClauseReader;
  790.   friend class llvm::TrailingObjects<OMPSizesClause, Expr *>;
  791.  
  792.   /// Location of '('.
  793.   SourceLocation LParenLoc;
  794.  
  795.   /// Number of tile sizes in the clause.
  796.   unsigned NumSizes;
  797.  
  798.   /// Build an empty clause.
  799.   explicit OMPSizesClause(int NumSizes)
  800.       : OMPClause(llvm::omp::OMPC_sizes, SourceLocation(), SourceLocation()),
  801.         NumSizes(NumSizes) {}
  802.  
  803. public:
  804.   /// Build a 'sizes' AST node.
  805.   ///
  806.   /// \param C         Context of the AST.
  807.   /// \param StartLoc  Location of the 'sizes' identifier.
  808.   /// \param LParenLoc Location of '('.
  809.   /// \param EndLoc    Location of ')'.
  810.   /// \param Sizes     Content of the clause.
  811.   static OMPSizesClause *Create(const ASTContext &C, SourceLocation StartLoc,
  812.                                 SourceLocation LParenLoc, SourceLocation EndLoc,
  813.                                 ArrayRef<Expr *> Sizes);
  814.  
  815.   /// Build an empty 'sizes' AST node for deserialization.
  816.   ///
  817.   /// \param C     Context of the AST.
  818.   /// \param NumSizes Number of items in the clause.
  819.   static OMPSizesClause *CreateEmpty(const ASTContext &C, unsigned NumSizes);
  820.  
  821.   /// Sets the location of '('.
  822.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  823.  
  824.   /// Returns the location of '('.
  825.   SourceLocation getLParenLoc() const { return LParenLoc; }
  826.  
  827.   /// Returns the number of list items.
  828.   unsigned getNumSizes() const { return NumSizes; }
  829.  
  830.   /// Returns the tile size expressions.
  831.   MutableArrayRef<Expr *> getSizesRefs() {
  832.     return MutableArrayRef<Expr *>(static_cast<OMPSizesClause *>(this)
  833.                                        ->template getTrailingObjects<Expr *>(),
  834.                                    NumSizes);
  835.   }
  836.   ArrayRef<Expr *> getSizesRefs() const {
  837.     return ArrayRef<Expr *>(static_cast<const OMPSizesClause *>(this)
  838.                                 ->template getTrailingObjects<Expr *>(),
  839.                             NumSizes);
  840.   }
  841.  
  842.   /// Sets the tile size expressions.
  843.   void setSizesRefs(ArrayRef<Expr *> VL) {
  844.     assert(VL.size() == NumSizes);
  845.     std::copy(VL.begin(), VL.end(),
  846.               static_cast<OMPSizesClause *>(this)
  847.                   ->template getTrailingObjects<Expr *>());
  848.   }
  849.  
  850.   child_range children() {
  851.     MutableArrayRef<Expr *> Sizes = getSizesRefs();
  852.     return child_range(reinterpret_cast<Stmt **>(Sizes.begin()),
  853.                        reinterpret_cast<Stmt **>(Sizes.end()));
  854.   }
  855.   const_child_range children() const {
  856.     ArrayRef<Expr *> Sizes = getSizesRefs();
  857.     return const_child_range(reinterpret_cast<Stmt *const *>(Sizes.begin()),
  858.                              reinterpret_cast<Stmt *const *>(Sizes.end()));
  859.   }
  860.  
  861.   child_range used_children() {
  862.     return child_range(child_iterator(), child_iterator());
  863.   }
  864.   const_child_range used_children() const {
  865.     return const_child_range(const_child_iterator(), const_child_iterator());
  866.   }
  867.  
  868.   static bool classof(const OMPClause *T) {
  869.     return T->getClauseKind() == llvm::omp::OMPC_sizes;
  870.   }
  871. };
  872.  
  873. /// Representation of the 'full' clause of the '#pragma omp unroll' directive.
  874. ///
  875. /// \code
  876. /// #pragma omp unroll full
  877. /// for (int i = 0; i < 64; ++i)
  878. /// \endcode
  879. class OMPFullClause final : public OMPNoChildClause<llvm::omp::OMPC_full> {
  880.   friend class OMPClauseReader;
  881.  
  882.   /// Build an empty clause.
  883.   explicit OMPFullClause() : OMPNoChildClause() {}
  884.  
  885. public:
  886.   /// Build an AST node for a 'full' clause.
  887.   ///
  888.   /// \param C        Context of the AST.
  889.   /// \param StartLoc Starting location of the clause.
  890.   /// \param EndLoc   Ending location of the clause.
  891.   static OMPFullClause *Create(const ASTContext &C, SourceLocation StartLoc,
  892.                                SourceLocation EndLoc);
  893.  
  894.   /// Build an empty 'full' AST node for deserialization.
  895.   ///
  896.   /// \param C Context of the AST.
  897.   static OMPFullClause *CreateEmpty(const ASTContext &C);
  898. };
  899.  
  900. /// Representation of the 'partial' clause of the '#pragma omp unroll'
  901. /// directive.
  902. ///
  903. /// \code
  904. /// #pragma omp unroll partial(4)
  905. /// for (int i = start; i < end; ++i)
  906. /// \endcode
  907. class OMPPartialClause final : public OMPClause {
  908.   friend class OMPClauseReader;
  909.  
  910.   /// Location of '('.
  911.   SourceLocation LParenLoc;
  912.  
  913.   /// Optional argument to the clause (unroll factor).
  914.   Stmt *Factor;
  915.  
  916.   /// Build an empty clause.
  917.   explicit OMPPartialClause() : OMPClause(llvm::omp::OMPC_partial, {}, {}) {}
  918.  
  919.   /// Set the unroll factor.
  920.   void setFactor(Expr *E) { Factor = E; }
  921.  
  922.   /// Sets the location of '('.
  923.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  924.  
  925. public:
  926.   /// Build an AST node for a 'partial' clause.
  927.   ///
  928.   /// \param C         Context of the AST.
  929.   /// \param StartLoc  Location of the 'partial' identifier.
  930.   /// \param LParenLoc Location of '('.
  931.   /// \param EndLoc    Location of ')'.
  932.   /// \param Factor    Clause argument.
  933.   static OMPPartialClause *Create(const ASTContext &C, SourceLocation StartLoc,
  934.                                   SourceLocation LParenLoc,
  935.                                   SourceLocation EndLoc, Expr *Factor);
  936.  
  937.   /// Build an empty 'partial' AST node for deserialization.
  938.   ///
  939.   /// \param C     Context of the AST.
  940.   static OMPPartialClause *CreateEmpty(const ASTContext &C);
  941.  
  942.   /// Returns the location of '('.
  943.   SourceLocation getLParenLoc() const { return LParenLoc; }
  944.  
  945.   /// Returns the argument of the clause or nullptr if not set.
  946.   Expr *getFactor() const { return cast_or_null<Expr>(Factor); }
  947.  
  948.   child_range children() { return child_range(&Factor, &Factor + 1); }
  949.   const_child_range children() const {
  950.     return const_child_range(&Factor, &Factor + 1);
  951.   }
  952.  
  953.   child_range used_children() {
  954.     return child_range(child_iterator(), child_iterator());
  955.   }
  956.   const_child_range used_children() const {
  957.     return const_child_range(const_child_iterator(), const_child_iterator());
  958.   }
  959.  
  960.   static bool classof(const OMPClause *T) {
  961.     return T->getClauseKind() == llvm::omp::OMPC_partial;
  962.   }
  963. };
  964.  
  965. /// This represents 'collapse' clause in the '#pragma omp ...'
  966. /// directive.
  967. ///
  968. /// \code
  969. /// #pragma omp simd collapse(3)
  970. /// \endcode
  971. /// In this example directive '#pragma omp simd' has clause 'collapse'
  972. /// with single expression '3'.
  973. /// The parameter must be a constant positive integer expression, it specifies
  974. /// the number of nested loops that should be collapsed into a single iteration
  975. /// space.
  976. class OMPCollapseClause final
  977.     : public OMPOneStmtClause<llvm::omp::OMPC_collapse, OMPClause> {
  978.   friend class OMPClauseReader;
  979.  
  980.   /// Set the number of associated for-loops.
  981.   void setNumForLoops(Expr *Num) { setStmt(Num); }
  982.  
  983. public:
  984.   /// Build 'collapse' clause.
  985.   ///
  986.   /// \param Num Expression associated with this clause.
  987.   /// \param StartLoc Starting location of the clause.
  988.   /// \param LParenLoc Location of '('.
  989.   /// \param EndLoc Ending location of the clause.
  990.   OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
  991.                     SourceLocation LParenLoc, SourceLocation EndLoc)
  992.       : OMPOneStmtClause(Num, StartLoc, LParenLoc, EndLoc) {}
  993.  
  994.   /// Build an empty clause.
  995.   explicit OMPCollapseClause() : OMPOneStmtClause() {}
  996.  
  997.   /// Return the number of associated for-loops.
  998.   Expr *getNumForLoops() const { return getStmtAs<Expr>(); }
  999. };
  1000.  
  1001. /// This represents 'default' clause in the '#pragma omp ...' directive.
  1002. ///
  1003. /// \code
  1004. /// #pragma omp parallel default(shared)
  1005. /// \endcode
  1006. /// In this example directive '#pragma omp parallel' has simple 'default'
  1007. /// clause with kind 'shared'.
  1008. class OMPDefaultClause : public OMPClause {
  1009.   friend class OMPClauseReader;
  1010.  
  1011.   /// Location of '('.
  1012.   SourceLocation LParenLoc;
  1013.  
  1014.   /// A kind of the 'default' clause.
  1015.   llvm::omp::DefaultKind Kind = llvm::omp::OMP_DEFAULT_unknown;
  1016.  
  1017.   /// Start location of the kind in source code.
  1018.   SourceLocation KindKwLoc;
  1019.  
  1020.   /// Set kind of the clauses.
  1021.   ///
  1022.   /// \param K Argument of clause.
  1023.   void setDefaultKind(llvm::omp::DefaultKind K) { Kind = K; }
  1024.  
  1025.   /// Set argument location.
  1026.   ///
  1027.   /// \param KLoc Argument location.
  1028.   void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
  1029.  
  1030. public:
  1031.   /// Build 'default' clause with argument \a A ('none' or 'shared').
  1032.   ///
  1033.   /// \param A Argument of the clause ('none' or 'shared').
  1034.   /// \param ALoc Starting location of the argument.
  1035.   /// \param StartLoc Starting location of the clause.
  1036.   /// \param LParenLoc Location of '('.
  1037.   /// \param EndLoc Ending location of the clause.
  1038.   OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc,
  1039.                    SourceLocation StartLoc, SourceLocation LParenLoc,
  1040.                    SourceLocation EndLoc)
  1041.       : OMPClause(llvm::omp::OMPC_default, StartLoc, EndLoc),
  1042.         LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
  1043.  
  1044.   /// Build an empty clause.
  1045.   OMPDefaultClause()
  1046.       : OMPClause(llvm::omp::OMPC_default, SourceLocation(), SourceLocation()) {
  1047.   }
  1048.  
  1049.   /// Sets the location of '('.
  1050.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1051.  
  1052.   /// Returns the location of '('.
  1053.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1054.  
  1055.   /// Returns kind of the clause.
  1056.   llvm::omp::DefaultKind getDefaultKind() const { return Kind; }
  1057.  
  1058.   /// Returns location of clause kind.
  1059.   SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
  1060.  
  1061.   child_range children() {
  1062.     return child_range(child_iterator(), child_iterator());
  1063.   }
  1064.  
  1065.   const_child_range children() const {
  1066.     return const_child_range(const_child_iterator(), const_child_iterator());
  1067.   }
  1068.  
  1069.   child_range used_children() {
  1070.     return child_range(child_iterator(), child_iterator());
  1071.   }
  1072.   const_child_range used_children() const {
  1073.     return const_child_range(const_child_iterator(), const_child_iterator());
  1074.   }
  1075.  
  1076.   static bool classof(const OMPClause *T) {
  1077.     return T->getClauseKind() == llvm::omp::OMPC_default;
  1078.   }
  1079. };
  1080.  
  1081. /// This represents 'proc_bind' clause in the '#pragma omp ...'
  1082. /// directive.
  1083. ///
  1084. /// \code
  1085. /// #pragma omp parallel proc_bind(master)
  1086. /// \endcode
  1087. /// In this example directive '#pragma omp parallel' has simple 'proc_bind'
  1088. /// clause with kind 'master'.
  1089. class OMPProcBindClause : public OMPClause {
  1090.   friend class OMPClauseReader;
  1091.  
  1092.   /// Location of '('.
  1093.   SourceLocation LParenLoc;
  1094.  
  1095.   /// A kind of the 'proc_bind' clause.
  1096.   llvm::omp::ProcBindKind Kind = llvm::omp::OMP_PROC_BIND_unknown;
  1097.  
  1098.   /// Start location of the kind in source code.
  1099.   SourceLocation KindKwLoc;
  1100.  
  1101.   /// Set kind of the clause.
  1102.   ///
  1103.   /// \param K Kind of clause.
  1104.   void setProcBindKind(llvm::omp::ProcBindKind K) { Kind = K; }
  1105.  
  1106.   /// Set clause kind location.
  1107.   ///
  1108.   /// \param KLoc Kind location.
  1109.   void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
  1110.  
  1111. public:
  1112.   /// Build 'proc_bind' clause with argument \a A ('master', 'close' or
  1113.   ///        'spread').
  1114.   ///
  1115.   /// \param A Argument of the clause ('master', 'close' or 'spread').
  1116.   /// \param ALoc Starting location of the argument.
  1117.   /// \param StartLoc Starting location of the clause.
  1118.   /// \param LParenLoc Location of '('.
  1119.   /// \param EndLoc Ending location of the clause.
  1120.   OMPProcBindClause(llvm::omp::ProcBindKind A, SourceLocation ALoc,
  1121.                     SourceLocation StartLoc, SourceLocation LParenLoc,
  1122.                     SourceLocation EndLoc)
  1123.       : OMPClause(llvm::omp::OMPC_proc_bind, StartLoc, EndLoc),
  1124.         LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
  1125.  
  1126.   /// Build an empty clause.
  1127.   OMPProcBindClause()
  1128.       : OMPClause(llvm::omp::OMPC_proc_bind, SourceLocation(),
  1129.                   SourceLocation()) {}
  1130.  
  1131.   /// Sets the location of '('.
  1132.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1133.  
  1134.   /// Returns the location of '('.
  1135.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1136.  
  1137.   /// Returns kind of the clause.
  1138.   llvm::omp::ProcBindKind getProcBindKind() const { return Kind; }
  1139.  
  1140.   /// Returns location of clause kind.
  1141.   SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
  1142.  
  1143.   child_range children() {
  1144.     return child_range(child_iterator(), child_iterator());
  1145.   }
  1146.  
  1147.   const_child_range children() const {
  1148.     return const_child_range(const_child_iterator(), const_child_iterator());
  1149.   }
  1150.  
  1151.   child_range used_children() {
  1152.     return child_range(child_iterator(), child_iterator());
  1153.   }
  1154.   const_child_range used_children() const {
  1155.     return const_child_range(const_child_iterator(), const_child_iterator());
  1156.   }
  1157.  
  1158.   static bool classof(const OMPClause *T) {
  1159.     return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
  1160.   }
  1161. };
  1162.  
  1163. /// This represents 'unified_address' clause in the '#pragma omp requires'
  1164. /// directive.
  1165. ///
  1166. /// \code
  1167. /// #pragma omp requires unified_address
  1168. /// \endcode
  1169. /// In this example directive '#pragma omp requires' has 'unified_address'
  1170. /// clause.
  1171. class OMPUnifiedAddressClause final
  1172.     : public OMPNoChildClause<llvm::omp::OMPC_unified_address> {
  1173. public:
  1174.   friend class OMPClauseReader;
  1175.   /// Build 'unified_address' clause.
  1176.   ///
  1177.   /// \param StartLoc Starting location of the clause.
  1178.   /// \param EndLoc Ending location of the clause.
  1179.   OMPUnifiedAddressClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1180.       : OMPNoChildClause(StartLoc, EndLoc) {}
  1181.  
  1182.   /// Build an empty clause.
  1183.   OMPUnifiedAddressClause() : OMPNoChildClause() {}
  1184. };
  1185.  
  1186. /// This represents 'unified_shared_memory' clause in the '#pragma omp requires'
  1187. /// directive.
  1188. ///
  1189. /// \code
  1190. /// #pragma omp requires unified_shared_memory
  1191. /// \endcode
  1192. /// In this example directive '#pragma omp requires' has 'unified_shared_memory'
  1193. /// clause.
  1194. class OMPUnifiedSharedMemoryClause final : public OMPClause {
  1195. public:
  1196.   friend class OMPClauseReader;
  1197.   /// Build 'unified_shared_memory' clause.
  1198.   ///
  1199.   /// \param StartLoc Starting location of the clause.
  1200.   /// \param EndLoc Ending location of the clause.
  1201.   OMPUnifiedSharedMemoryClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1202.       : OMPClause(llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
  1203.  
  1204.   /// Build an empty clause.
  1205.   OMPUnifiedSharedMemoryClause()
  1206.       : OMPClause(llvm::omp::OMPC_unified_shared_memory, SourceLocation(),
  1207.                   SourceLocation()) {}
  1208.  
  1209.   child_range children() {
  1210.     return child_range(child_iterator(), child_iterator());
  1211.   }
  1212.  
  1213.   const_child_range children() const {
  1214.     return const_child_range(const_child_iterator(), const_child_iterator());
  1215.   }
  1216.  
  1217.   child_range used_children() {
  1218.     return child_range(child_iterator(), child_iterator());
  1219.   }
  1220.   const_child_range used_children() const {
  1221.     return const_child_range(const_child_iterator(), const_child_iterator());
  1222.   }
  1223.  
  1224.   static bool classof(const OMPClause *T) {
  1225.     return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
  1226.   }
  1227. };
  1228.  
  1229. /// This represents 'reverse_offload' clause in the '#pragma omp requires'
  1230. /// directive.
  1231. ///
  1232. /// \code
  1233. /// #pragma omp requires reverse_offload
  1234. /// \endcode
  1235. /// In this example directive '#pragma omp requires' has 'reverse_offload'
  1236. /// clause.
  1237. class OMPReverseOffloadClause final : public OMPClause {
  1238. public:
  1239.   friend class OMPClauseReader;
  1240.   /// Build 'reverse_offload' clause.
  1241.   ///
  1242.   /// \param StartLoc Starting location of the clause.
  1243.   /// \param EndLoc Ending location of the clause.
  1244.   OMPReverseOffloadClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1245.       : OMPClause(llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
  1246.  
  1247.   /// Build an empty clause.
  1248.   OMPReverseOffloadClause()
  1249.       : OMPClause(llvm::omp::OMPC_reverse_offload, SourceLocation(),
  1250.                   SourceLocation()) {}
  1251.  
  1252.   child_range children() {
  1253.     return child_range(child_iterator(), child_iterator());
  1254.   }
  1255.  
  1256.   const_child_range children() const {
  1257.     return const_child_range(const_child_iterator(), const_child_iterator());
  1258.   }
  1259.  
  1260.   child_range used_children() {
  1261.     return child_range(child_iterator(), child_iterator());
  1262.   }
  1263.   const_child_range used_children() const {
  1264.     return const_child_range(const_child_iterator(), const_child_iterator());
  1265.   }
  1266.  
  1267.   static bool classof(const OMPClause *T) {
  1268.     return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
  1269.   }
  1270. };
  1271.  
  1272. /// This represents 'dynamic_allocators' clause in the '#pragma omp requires'
  1273. /// directive.
  1274. ///
  1275. /// \code
  1276. /// #pragma omp requires dynamic_allocators
  1277. /// \endcode
  1278. /// In this example directive '#pragma omp requires' has 'dynamic_allocators'
  1279. /// clause.
  1280. class OMPDynamicAllocatorsClause final : public OMPClause {
  1281. public:
  1282.   friend class OMPClauseReader;
  1283.   /// Build 'dynamic_allocators' clause.
  1284.   ///
  1285.   /// \param StartLoc Starting location of the clause.
  1286.   /// \param EndLoc Ending location of the clause.
  1287.   OMPDynamicAllocatorsClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1288.       : OMPClause(llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
  1289.  
  1290.   /// Build an empty clause.
  1291.   OMPDynamicAllocatorsClause()
  1292.       : OMPClause(llvm::omp::OMPC_dynamic_allocators, SourceLocation(),
  1293.                   SourceLocation()) {}
  1294.  
  1295.   child_range children() {
  1296.     return child_range(child_iterator(), child_iterator());
  1297.   }
  1298.  
  1299.   const_child_range children() const {
  1300.     return const_child_range(const_child_iterator(), const_child_iterator());
  1301.   }
  1302.  
  1303.   child_range used_children() {
  1304.     return child_range(child_iterator(), child_iterator());
  1305.   }
  1306.   const_child_range used_children() const {
  1307.     return const_child_range(const_child_iterator(), const_child_iterator());
  1308.   }
  1309.  
  1310.   static bool classof(const OMPClause *T) {
  1311.     return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
  1312.   }
  1313. };
  1314.  
  1315. /// This represents 'atomic_default_mem_order' clause in the '#pragma omp
  1316. /// requires'  directive.
  1317. ///
  1318. /// \code
  1319. /// #pragma omp requires atomic_default_mem_order(seq_cst)
  1320. /// \endcode
  1321. /// In this example directive '#pragma omp requires' has simple
  1322. /// atomic_default_mem_order' clause with kind 'seq_cst'.
  1323. class OMPAtomicDefaultMemOrderClause final : public OMPClause {
  1324.   friend class OMPClauseReader;
  1325.  
  1326.   /// Location of '('
  1327.   SourceLocation LParenLoc;
  1328.  
  1329.   /// A kind of the 'atomic_default_mem_order' clause.
  1330.   OpenMPAtomicDefaultMemOrderClauseKind Kind =
  1331.       OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown;
  1332.  
  1333.   /// Start location of the kind in source code.
  1334.   SourceLocation KindKwLoc;
  1335.  
  1336.   /// Set kind of the clause.
  1337.   ///
  1338.   /// \param K Kind of clause.
  1339.   void setAtomicDefaultMemOrderKind(OpenMPAtomicDefaultMemOrderClauseKind K) {
  1340.     Kind = K;
  1341.   }
  1342.  
  1343.   /// Set clause kind location.
  1344.   ///
  1345.   /// \param KLoc Kind location.
  1346.   void setAtomicDefaultMemOrderKindKwLoc(SourceLocation KLoc) {
  1347.     KindKwLoc = KLoc;
  1348.   }
  1349.  
  1350. public:
  1351.   /// Build 'atomic_default_mem_order' clause with argument \a A ('seq_cst',
  1352.   /// 'acq_rel' or 'relaxed').
  1353.   ///
  1354.   /// \param A Argument of the clause ('seq_cst', 'acq_rel' or 'relaxed').
  1355.   /// \param ALoc Starting location of the argument.
  1356.   /// \param StartLoc Starting location of the clause.
  1357.   /// \param LParenLoc Location of '('.
  1358.   /// \param EndLoc Ending location of the clause.
  1359.   OMPAtomicDefaultMemOrderClause(OpenMPAtomicDefaultMemOrderClauseKind A,
  1360.                                  SourceLocation ALoc, SourceLocation StartLoc,
  1361.                                  SourceLocation LParenLoc,
  1362.                                  SourceLocation EndLoc)
  1363.       : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
  1364.         LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
  1365.  
  1366.   /// Build an empty clause.
  1367.   OMPAtomicDefaultMemOrderClause()
  1368.       : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, SourceLocation(),
  1369.                   SourceLocation()) {}
  1370.  
  1371.   /// Sets the location of '('.
  1372.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1373.  
  1374.   /// Returns the locaiton of '('.
  1375.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1376.  
  1377.   /// Returns kind of the clause.
  1378.   OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const {
  1379.     return Kind;
  1380.   }
  1381.  
  1382.   /// Returns location of clause kind.
  1383.   SourceLocation getAtomicDefaultMemOrderKindKwLoc() const { return KindKwLoc; }
  1384.  
  1385.   child_range children() {
  1386.     return child_range(child_iterator(), child_iterator());
  1387.   }
  1388.  
  1389.   const_child_range children() const {
  1390.     return const_child_range(const_child_iterator(), const_child_iterator());
  1391.   }
  1392.  
  1393.   child_range used_children() {
  1394.     return child_range(child_iterator(), child_iterator());
  1395.   }
  1396.   const_child_range used_children() const {
  1397.     return const_child_range(const_child_iterator(), const_child_iterator());
  1398.   }
  1399.  
  1400.   static bool classof(const OMPClause *T) {
  1401.     return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
  1402.   }
  1403. };
  1404.  
  1405. /// This represents 'at' clause in the '#pragma omp error' directive
  1406. ///
  1407. /// \code
  1408. /// #pragma omp error at(compilation)
  1409. /// \endcode
  1410. /// In this example directive '#pragma omp error' has simple
  1411. /// 'at' clause with kind 'complilation'.
  1412. class OMPAtClause final : public OMPClause {
  1413.   friend class OMPClauseReader;
  1414.  
  1415.   /// Location of '('
  1416.   SourceLocation LParenLoc;
  1417.  
  1418.   /// A kind of the 'at' clause.
  1419.   OpenMPAtClauseKind Kind = OMPC_AT_unknown;
  1420.  
  1421.   /// Start location of the kind in source code.
  1422.   SourceLocation KindKwLoc;
  1423.  
  1424.   /// Set kind of the clause.
  1425.   ///
  1426.   /// \param K Kind of clause.
  1427.   void setAtKind(OpenMPAtClauseKind K) { Kind = K; }
  1428.  
  1429.   /// Set clause kind location.
  1430.   ///
  1431.   /// \param KLoc Kind location.
  1432.   void setAtKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
  1433.  
  1434.   /// Sets the location of '('.
  1435.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1436.  
  1437. public:
  1438.   /// Build 'at' clause with argument \a A ('compilation' or 'execution').
  1439.   ///
  1440.   /// \param A Argument of the clause ('compilation' or 'execution').
  1441.   /// \param ALoc Starting location of the argument.
  1442.   /// \param StartLoc Starting location of the clause.
  1443.   /// \param LParenLoc Location of '('.
  1444.   /// \param EndLoc Ending location of the clause.
  1445.   OMPAtClause(OpenMPAtClauseKind A, SourceLocation ALoc,
  1446.               SourceLocation StartLoc, SourceLocation LParenLoc,
  1447.               SourceLocation EndLoc)
  1448.       : OMPClause(llvm::omp::OMPC_at, StartLoc, EndLoc), LParenLoc(LParenLoc),
  1449.         Kind(A), KindKwLoc(ALoc) {}
  1450.  
  1451.   /// Build an empty clause.
  1452.   OMPAtClause()
  1453.       : OMPClause(llvm::omp::OMPC_at, SourceLocation(), SourceLocation()) {}
  1454.  
  1455.   /// Returns the locaiton of '('.
  1456.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1457.  
  1458.   /// Returns kind of the clause.
  1459.   OpenMPAtClauseKind getAtKind() const { return Kind; }
  1460.  
  1461.   /// Returns location of clause kind.
  1462.   SourceLocation getAtKindKwLoc() const { return KindKwLoc; }
  1463.  
  1464.   child_range children() {
  1465.     return child_range(child_iterator(), child_iterator());
  1466.   }
  1467.  
  1468.   const_child_range children() const {
  1469.     return const_child_range(const_child_iterator(), const_child_iterator());
  1470.   }
  1471.  
  1472.   child_range used_children() {
  1473.     return child_range(child_iterator(), child_iterator());
  1474.   }
  1475.   const_child_range used_children() const {
  1476.     return const_child_range(const_child_iterator(), const_child_iterator());
  1477.   }
  1478.  
  1479.   static bool classof(const OMPClause *T) {
  1480.     return T->getClauseKind() == llvm::omp::OMPC_at;
  1481.   }
  1482. };
  1483.  
  1484. /// This represents 'severity' clause in the '#pragma omp error' directive
  1485. ///
  1486. /// \code
  1487. /// #pragma omp error severity(fatal)
  1488. /// \endcode
  1489. /// In this example directive '#pragma omp error' has simple
  1490. /// 'severity' clause with kind 'fatal'.
  1491. class OMPSeverityClause final : public OMPClause {
  1492.   friend class OMPClauseReader;
  1493.  
  1494.   /// Location of '('
  1495.   SourceLocation LParenLoc;
  1496.  
  1497.   /// A kind of the 'severity' clause.
  1498.   OpenMPSeverityClauseKind Kind = OMPC_SEVERITY_unknown;
  1499.  
  1500.   /// Start location of the kind in source code.
  1501.   SourceLocation KindKwLoc;
  1502.  
  1503.   /// Set kind of the clause.
  1504.   ///
  1505.   /// \param K Kind of clause.
  1506.   void setSeverityKind(OpenMPSeverityClauseKind K) { Kind = K; }
  1507.  
  1508.   /// Set clause kind location.
  1509.   ///
  1510.   /// \param KLoc Kind location.
  1511.   void setSeverityKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
  1512.  
  1513.   /// Sets the location of '('.
  1514.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1515.  
  1516. public:
  1517.   /// Build 'severity' clause with argument \a A ('fatal' or 'warning').
  1518.   ///
  1519.   /// \param A Argument of the clause ('fatal' or 'warning').
  1520.   /// \param ALoc Starting location of the argument.
  1521.   /// \param StartLoc Starting location of the clause.
  1522.   /// \param LParenLoc Location of '('.
  1523.   /// \param EndLoc Ending location of the clause.
  1524.   OMPSeverityClause(OpenMPSeverityClauseKind A, SourceLocation ALoc,
  1525.                     SourceLocation StartLoc, SourceLocation LParenLoc,
  1526.                     SourceLocation EndLoc)
  1527.       : OMPClause(llvm::omp::OMPC_severity, StartLoc, EndLoc),
  1528.         LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
  1529.  
  1530.   /// Build an empty clause.
  1531.   OMPSeverityClause()
  1532.       : OMPClause(llvm::omp::OMPC_severity, SourceLocation(),
  1533.                   SourceLocation()) {}
  1534.  
  1535.   /// Returns the locaiton of '('.
  1536.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1537.  
  1538.   /// Returns kind of the clause.
  1539.   OpenMPSeverityClauseKind getSeverityKind() const { return Kind; }
  1540.  
  1541.   /// Returns location of clause kind.
  1542.   SourceLocation getSeverityKindKwLoc() const { return KindKwLoc; }
  1543.  
  1544.   child_range children() {
  1545.     return child_range(child_iterator(), child_iterator());
  1546.   }
  1547.  
  1548.   const_child_range children() const {
  1549.     return const_child_range(const_child_iterator(), const_child_iterator());
  1550.   }
  1551.  
  1552.   child_range used_children() {
  1553.     return child_range(child_iterator(), child_iterator());
  1554.   }
  1555.   const_child_range used_children() const {
  1556.     return const_child_range(const_child_iterator(), const_child_iterator());
  1557.   }
  1558.  
  1559.   static bool classof(const OMPClause *T) {
  1560.     return T->getClauseKind() == llvm::omp::OMPC_severity;
  1561.   }
  1562. };
  1563.  
  1564. /// This represents 'message' clause in the '#pragma omp error' directive
  1565. ///
  1566. /// \code
  1567. /// #pragma omp error message("GNU compiler required.")
  1568. /// \endcode
  1569. /// In this example directive '#pragma omp error' has simple
  1570. /// 'message' clause with user error message of "GNU compiler required.".
  1571. class OMPMessageClause final : public OMPClause {
  1572.   friend class OMPClauseReader;
  1573.  
  1574.   /// Location of '('
  1575.   SourceLocation LParenLoc;
  1576.  
  1577.   // Expression of the 'message' clause.
  1578.   Stmt *MessageString = nullptr;
  1579.  
  1580.   /// Set message string of the clause.
  1581.   void setMessageString(Expr *MS) { MessageString = MS; }
  1582.  
  1583.   /// Sets the location of '('.
  1584.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1585.  
  1586. public:
  1587.   /// Build 'message' clause with message string argument
  1588.   ///
  1589.   /// \param MS Argument of the clause (message string).
  1590.   /// \param StartLoc Starting location of the clause.
  1591.   /// \param LParenLoc Location of '('.
  1592.   /// \param EndLoc Ending location of the clause.
  1593.   OMPMessageClause(Expr *MS, SourceLocation StartLoc, SourceLocation LParenLoc,
  1594.                    SourceLocation EndLoc)
  1595.       : OMPClause(llvm::omp::OMPC_message, StartLoc, EndLoc),
  1596.         LParenLoc(LParenLoc), MessageString(MS) {}
  1597.  
  1598.   /// Build an empty clause.
  1599.   OMPMessageClause()
  1600.       : OMPClause(llvm::omp::OMPC_message, SourceLocation(), SourceLocation()) {
  1601.   }
  1602.  
  1603.   /// Returns the locaiton of '('.
  1604.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1605.  
  1606.   /// Returns message string of the clause.
  1607.   Expr *getMessageString() const { return cast_or_null<Expr>(MessageString); }
  1608.  
  1609.   child_range children() {
  1610.     return child_range(&MessageString, &MessageString + 1);
  1611.   }
  1612.  
  1613.   const_child_range children() const {
  1614.     return const_child_range(&MessageString, &MessageString + 1);
  1615.   }
  1616.  
  1617.   child_range used_children() {
  1618.     return child_range(child_iterator(), child_iterator());
  1619.   }
  1620.  
  1621.   const_child_range used_children() const {
  1622.     return const_child_range(const_child_iterator(), const_child_iterator());
  1623.   }
  1624.  
  1625.   static bool classof(const OMPClause *T) {
  1626.     return T->getClauseKind() == llvm::omp::OMPC_message;
  1627.   }
  1628. };
  1629.  
  1630. /// This represents 'schedule' clause in the '#pragma omp ...' directive.
  1631. ///
  1632. /// \code
  1633. /// #pragma omp for schedule(static, 3)
  1634. /// \endcode
  1635. /// In this example directive '#pragma omp for' has 'schedule' clause with
  1636. /// arguments 'static' and '3'.
  1637. class OMPScheduleClause : public OMPClause, public OMPClauseWithPreInit {
  1638.   friend class OMPClauseReader;
  1639.  
  1640.   /// Location of '('.
  1641.   SourceLocation LParenLoc;
  1642.  
  1643.   /// A kind of the 'schedule' clause.
  1644.   OpenMPScheduleClauseKind Kind = OMPC_SCHEDULE_unknown;
  1645.  
  1646.   /// Modifiers for 'schedule' clause.
  1647.   enum {FIRST, SECOND, NUM_MODIFIERS};
  1648.   OpenMPScheduleClauseModifier Modifiers[NUM_MODIFIERS];
  1649.  
  1650.   /// Locations of modifiers.
  1651.   SourceLocation ModifiersLoc[NUM_MODIFIERS];
  1652.  
  1653.   /// Start location of the schedule ind in source code.
  1654.   SourceLocation KindLoc;
  1655.  
  1656.   /// Location of ',' (if any).
  1657.   SourceLocation CommaLoc;
  1658.  
  1659.   /// Chunk size.
  1660.   Expr *ChunkSize = nullptr;
  1661.  
  1662.   /// Set schedule kind.
  1663.   ///
  1664.   /// \param K Schedule kind.
  1665.   void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
  1666.  
  1667.   /// Set the first schedule modifier.
  1668.   ///
  1669.   /// \param M Schedule modifier.
  1670.   void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
  1671.     Modifiers[FIRST] = M;
  1672.   }
  1673.  
  1674.   /// Set the second schedule modifier.
  1675.   ///
  1676.   /// \param M Schedule modifier.
  1677.   void setSecondScheduleModifier(OpenMPScheduleClauseModifier M) {
  1678.     Modifiers[SECOND] = M;
  1679.   }
  1680.  
  1681.   /// Set location of the first schedule modifier.
  1682.   void setFirstScheduleModifierLoc(SourceLocation Loc) {
  1683.     ModifiersLoc[FIRST] = Loc;
  1684.   }
  1685.  
  1686.   /// Set location of the second schedule modifier.
  1687.   void setSecondScheduleModifierLoc(SourceLocation Loc) {
  1688.     ModifiersLoc[SECOND] = Loc;
  1689.   }
  1690.  
  1691.   /// Set schedule modifier location.
  1692.   ///
  1693.   /// \param M Schedule modifier location.
  1694.   void setScheduleModifer(OpenMPScheduleClauseModifier M) {
  1695.     if (Modifiers[FIRST] == OMPC_SCHEDULE_MODIFIER_unknown)
  1696.       Modifiers[FIRST] = M;
  1697.     else {
  1698.       assert(Modifiers[SECOND] == OMPC_SCHEDULE_MODIFIER_unknown);
  1699.       Modifiers[SECOND] = M;
  1700.     }
  1701.   }
  1702.  
  1703.   /// Sets the location of '('.
  1704.   ///
  1705.   /// \param Loc Location of '('.
  1706.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1707.  
  1708.   /// Set schedule kind start location.
  1709.   ///
  1710.   /// \param KLoc Schedule kind location.
  1711.   void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
  1712.  
  1713.   /// Set location of ','.
  1714.   ///
  1715.   /// \param Loc Location of ','.
  1716.   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
  1717.  
  1718.   /// Set chunk size.
  1719.   ///
  1720.   /// \param E Chunk size.
  1721.   void setChunkSize(Expr *E) { ChunkSize = E; }
  1722.  
  1723. public:
  1724.   /// Build 'schedule' clause with schedule kind \a Kind and chunk size
  1725.   /// expression \a ChunkSize.
  1726.   ///
  1727.   /// \param StartLoc Starting location of the clause.
  1728.   /// \param LParenLoc Location of '('.
  1729.   /// \param KLoc Starting location of the argument.
  1730.   /// \param CommaLoc Location of ','.
  1731.   /// \param EndLoc Ending location of the clause.
  1732.   /// \param Kind Schedule kind.
  1733.   /// \param ChunkSize Chunk size.
  1734.   /// \param HelperChunkSize Helper chunk size for combined directives.
  1735.   /// \param M1 The first modifier applied to 'schedule' clause.
  1736.   /// \param M1Loc Location of the first modifier
  1737.   /// \param M2 The second modifier applied to 'schedule' clause.
  1738.   /// \param M2Loc Location of the second modifier
  1739.   OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  1740.                     SourceLocation KLoc, SourceLocation CommaLoc,
  1741.                     SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
  1742.                     Expr *ChunkSize, Stmt *HelperChunkSize,
  1743.                     OpenMPScheduleClauseModifier M1, SourceLocation M1Loc,
  1744.                     OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
  1745.       : OMPClause(llvm::omp::OMPC_schedule, StartLoc, EndLoc),
  1746.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
  1747.         KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
  1748.     setPreInitStmt(HelperChunkSize);
  1749.     Modifiers[FIRST] = M1;
  1750.     Modifiers[SECOND] = M2;
  1751.     ModifiersLoc[FIRST] = M1Loc;
  1752.     ModifiersLoc[SECOND] = M2Loc;
  1753.   }
  1754.  
  1755.   /// Build an empty clause.
  1756.   explicit OMPScheduleClause()
  1757.       : OMPClause(llvm::omp::OMPC_schedule, SourceLocation(), SourceLocation()),
  1758.         OMPClauseWithPreInit(this) {
  1759.     Modifiers[FIRST] = OMPC_SCHEDULE_MODIFIER_unknown;
  1760.     Modifiers[SECOND] = OMPC_SCHEDULE_MODIFIER_unknown;
  1761.   }
  1762.  
  1763.   /// Get kind of the clause.
  1764.   OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
  1765.  
  1766.   /// Get the first modifier of the clause.
  1767.   OpenMPScheduleClauseModifier getFirstScheduleModifier() const {
  1768.     return Modifiers[FIRST];
  1769.   }
  1770.  
  1771.   /// Get the second modifier of the clause.
  1772.   OpenMPScheduleClauseModifier getSecondScheduleModifier() const {
  1773.     return Modifiers[SECOND];
  1774.   }
  1775.  
  1776.   /// Get location of '('.
  1777.   SourceLocation getLParenLoc() { return LParenLoc; }
  1778.  
  1779.   /// Get kind location.
  1780.   SourceLocation getScheduleKindLoc() { return KindLoc; }
  1781.  
  1782.   /// Get the first modifier location.
  1783.   SourceLocation getFirstScheduleModifierLoc() const {
  1784.     return ModifiersLoc[FIRST];
  1785.   }
  1786.  
  1787.   /// Get the second modifier location.
  1788.   SourceLocation getSecondScheduleModifierLoc() const {
  1789.     return ModifiersLoc[SECOND];
  1790.   }
  1791.  
  1792.   /// Get location of ','.
  1793.   SourceLocation getCommaLoc() { return CommaLoc; }
  1794.  
  1795.   /// Get chunk size.
  1796.   Expr *getChunkSize() { return ChunkSize; }
  1797.  
  1798.   /// Get chunk size.
  1799.   const Expr *getChunkSize() const { return ChunkSize; }
  1800.  
  1801.   child_range children() {
  1802.     return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
  1803.                        reinterpret_cast<Stmt **>(&ChunkSize) + 1);
  1804.   }
  1805.  
  1806.   const_child_range children() const {
  1807.     auto Children = const_cast<OMPScheduleClause *>(this)->children();
  1808.     return const_child_range(Children.begin(), Children.end());
  1809.   }
  1810.  
  1811.   child_range used_children() {
  1812.     return child_range(child_iterator(), child_iterator());
  1813.   }
  1814.   const_child_range used_children() const {
  1815.     return const_child_range(const_child_iterator(), const_child_iterator());
  1816.   }
  1817.  
  1818.   static bool classof(const OMPClause *T) {
  1819.     return T->getClauseKind() == llvm::omp::OMPC_schedule;
  1820.   }
  1821. };
  1822.  
  1823. /// This represents 'ordered' clause in the '#pragma omp ...' directive.
  1824. ///
  1825. /// \code
  1826. /// #pragma omp for ordered (2)
  1827. /// \endcode
  1828. /// In this example directive '#pragma omp for' has 'ordered' clause with
  1829. /// parameter 2.
  1830. class OMPOrderedClause final
  1831.     : public OMPClause,
  1832.       private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
  1833.   friend class OMPClauseReader;
  1834.   friend TrailingObjects;
  1835.  
  1836.   /// Location of '('.
  1837.   SourceLocation LParenLoc;
  1838.  
  1839.   /// Number of for-loops.
  1840.   Stmt *NumForLoops = nullptr;
  1841.  
  1842.   /// Real number of loops.
  1843.   unsigned NumberOfLoops = 0;
  1844.  
  1845.   /// Build 'ordered' clause.
  1846.   ///
  1847.   /// \param Num Expression, possibly associated with this clause.
  1848.   /// \param NumLoops Number of loops, associated with this clause.
  1849.   /// \param StartLoc Starting location of the clause.
  1850.   /// \param LParenLoc Location of '('.
  1851.   /// \param EndLoc Ending location of the clause.
  1852.   OMPOrderedClause(Expr *Num, unsigned NumLoops, SourceLocation StartLoc,
  1853.                    SourceLocation LParenLoc, SourceLocation EndLoc)
  1854.       : OMPClause(llvm::omp::OMPC_ordered, StartLoc, EndLoc),
  1855.         LParenLoc(LParenLoc), NumForLoops(Num), NumberOfLoops(NumLoops) {}
  1856.  
  1857.   /// Build an empty clause.
  1858.   explicit OMPOrderedClause(unsigned NumLoops)
  1859.       : OMPClause(llvm::omp::OMPC_ordered, SourceLocation(), SourceLocation()),
  1860.         NumberOfLoops(NumLoops) {}
  1861.  
  1862.   /// Set the number of associated for-loops.
  1863.   void setNumForLoops(Expr *Num) { NumForLoops = Num; }
  1864.  
  1865. public:
  1866.   /// Build 'ordered' clause.
  1867.   ///
  1868.   /// \param Num Expression, possibly associated with this clause.
  1869.   /// \param NumLoops Number of loops, associated with this clause.
  1870.   /// \param StartLoc Starting location of the clause.
  1871.   /// \param LParenLoc Location of '('.
  1872.   /// \param EndLoc Ending location of the clause.
  1873.   static OMPOrderedClause *Create(const ASTContext &C, Expr *Num,
  1874.                                   unsigned NumLoops, SourceLocation StartLoc,
  1875.                                   SourceLocation LParenLoc,
  1876.                                   SourceLocation EndLoc);
  1877.  
  1878.   /// Build an empty clause.
  1879.   static OMPOrderedClause* CreateEmpty(const ASTContext &C, unsigned NumLoops);
  1880.  
  1881.   /// Sets the location of '('.
  1882.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  1883.  
  1884.   /// Returns the location of '('.
  1885.   SourceLocation getLParenLoc() const { return LParenLoc; }
  1886.  
  1887.   /// Return the number of associated for-loops.
  1888.   Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
  1889.  
  1890.   /// Set number of iterations for the specified loop.
  1891.   void setLoopNumIterations(unsigned NumLoop, Expr *NumIterations);
  1892.   /// Get number of iterations for all the loops.
  1893.   ArrayRef<Expr *> getLoopNumIterations() const;
  1894.  
  1895.   /// Set loop counter for the specified loop.
  1896.   void setLoopCounter(unsigned NumLoop, Expr *Counter);
  1897.   /// Get loops counter for the specified loop.
  1898.   Expr *getLoopCounter(unsigned NumLoop);
  1899.   const Expr *getLoopCounter(unsigned NumLoop) const;
  1900.  
  1901.   child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
  1902.  
  1903.   const_child_range children() const {
  1904.     return const_child_range(&NumForLoops, &NumForLoops + 1);
  1905.   }
  1906.  
  1907.   child_range used_children() {
  1908.     return child_range(child_iterator(), child_iterator());
  1909.   }
  1910.   const_child_range used_children() const {
  1911.     return const_child_range(const_child_iterator(), const_child_iterator());
  1912.   }
  1913.  
  1914.   static bool classof(const OMPClause *T) {
  1915.     return T->getClauseKind() == llvm::omp::OMPC_ordered;
  1916.   }
  1917. };
  1918.  
  1919. /// This represents 'nowait' clause in the '#pragma omp ...' directive.
  1920. ///
  1921. /// \code
  1922. /// #pragma omp for nowait
  1923. /// \endcode
  1924. /// In this example directive '#pragma omp for' has 'nowait' clause.
  1925. class OMPNowaitClause final : public OMPNoChildClause<llvm::omp::OMPC_nowait> {
  1926. public:
  1927.   /// Build 'nowait' clause.
  1928.   ///
  1929.   /// \param StartLoc Starting location of the clause.
  1930.   /// \param EndLoc Ending location of the clause.
  1931.   OMPNowaitClause(SourceLocation StartLoc = SourceLocation(),
  1932.                   SourceLocation EndLoc = SourceLocation())
  1933.       : OMPNoChildClause(StartLoc, EndLoc) {}
  1934. };
  1935.  
  1936. /// This represents 'untied' clause in the '#pragma omp ...' directive.
  1937. ///
  1938. /// \code
  1939. /// #pragma omp task untied
  1940. /// \endcode
  1941. /// In this example directive '#pragma omp task' has 'untied' clause.
  1942. class OMPUntiedClause : public OMPClause {
  1943. public:
  1944.   /// Build 'untied' clause.
  1945.   ///
  1946.   /// \param StartLoc Starting location of the clause.
  1947.   /// \param EndLoc Ending location of the clause.
  1948.   OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1949.       : OMPClause(llvm::omp::OMPC_untied, StartLoc, EndLoc) {}
  1950.  
  1951.   /// Build an empty clause.
  1952.   OMPUntiedClause()
  1953.       : OMPClause(llvm::omp::OMPC_untied, SourceLocation(), SourceLocation()) {}
  1954.  
  1955.   child_range children() {
  1956.     return child_range(child_iterator(), child_iterator());
  1957.   }
  1958.  
  1959.   const_child_range children() const {
  1960.     return const_child_range(const_child_iterator(), const_child_iterator());
  1961.   }
  1962.  
  1963.   child_range used_children() {
  1964.     return child_range(child_iterator(), child_iterator());
  1965.   }
  1966.   const_child_range used_children() const {
  1967.     return const_child_range(const_child_iterator(), const_child_iterator());
  1968.   }
  1969.  
  1970.   static bool classof(const OMPClause *T) {
  1971.     return T->getClauseKind() == llvm::omp::OMPC_untied;
  1972.   }
  1973. };
  1974.  
  1975. /// This represents 'mergeable' clause in the '#pragma omp ...'
  1976. /// directive.
  1977. ///
  1978. /// \code
  1979. /// #pragma omp task mergeable
  1980. /// \endcode
  1981. /// In this example directive '#pragma omp task' has 'mergeable' clause.
  1982. class OMPMergeableClause : public OMPClause {
  1983. public:
  1984.   /// Build 'mergeable' clause.
  1985.   ///
  1986.   /// \param StartLoc Starting location of the clause.
  1987.   /// \param EndLoc Ending location of the clause.
  1988.   OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
  1989.       : OMPClause(llvm::omp::OMPC_mergeable, StartLoc, EndLoc) {}
  1990.  
  1991.   /// Build an empty clause.
  1992.   OMPMergeableClause()
  1993.       : OMPClause(llvm::omp::OMPC_mergeable, SourceLocation(),
  1994.                   SourceLocation()) {}
  1995.  
  1996.   child_range children() {
  1997.     return child_range(child_iterator(), child_iterator());
  1998.   }
  1999.  
  2000.   const_child_range children() const {
  2001.     return const_child_range(const_child_iterator(), const_child_iterator());
  2002.   }
  2003.  
  2004.   child_range used_children() {
  2005.     return child_range(child_iterator(), child_iterator());
  2006.   }
  2007.   const_child_range used_children() const {
  2008.     return const_child_range(const_child_iterator(), const_child_iterator());
  2009.   }
  2010.  
  2011.   static bool classof(const OMPClause *T) {
  2012.     return T->getClauseKind() == llvm::omp::OMPC_mergeable;
  2013.   }
  2014. };
  2015.  
  2016. /// This represents 'read' clause in the '#pragma omp atomic' directive.
  2017. ///
  2018. /// \code
  2019. /// #pragma omp atomic read
  2020. /// \endcode
  2021. /// In this example directive '#pragma omp atomic' has 'read' clause.
  2022. class OMPReadClause : public OMPClause {
  2023. public:
  2024.   /// Build 'read' clause.
  2025.   ///
  2026.   /// \param StartLoc Starting location of the clause.
  2027.   /// \param EndLoc Ending location of the clause.
  2028.   OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2029.       : OMPClause(llvm::omp::OMPC_read, StartLoc, EndLoc) {}
  2030.  
  2031.   /// Build an empty clause.
  2032.   OMPReadClause()
  2033.       : OMPClause(llvm::omp::OMPC_read, SourceLocation(), SourceLocation()) {}
  2034.  
  2035.   child_range children() {
  2036.     return child_range(child_iterator(), child_iterator());
  2037.   }
  2038.  
  2039.   const_child_range children() const {
  2040.     return const_child_range(const_child_iterator(), const_child_iterator());
  2041.   }
  2042.  
  2043.   child_range used_children() {
  2044.     return child_range(child_iterator(), child_iterator());
  2045.   }
  2046.   const_child_range used_children() const {
  2047.     return const_child_range(const_child_iterator(), const_child_iterator());
  2048.   }
  2049.  
  2050.   static bool classof(const OMPClause *T) {
  2051.     return T->getClauseKind() == llvm::omp::OMPC_read;
  2052.   }
  2053. };
  2054.  
  2055. /// This represents 'write' clause in the '#pragma omp atomic' directive.
  2056. ///
  2057. /// \code
  2058. /// #pragma omp atomic write
  2059. /// \endcode
  2060. /// In this example directive '#pragma omp atomic' has 'write' clause.
  2061. class OMPWriteClause : public OMPClause {
  2062. public:
  2063.   /// Build 'write' clause.
  2064.   ///
  2065.   /// \param StartLoc Starting location of the clause.
  2066.   /// \param EndLoc Ending location of the clause.
  2067.   OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2068.       : OMPClause(llvm::omp::OMPC_write, StartLoc, EndLoc) {}
  2069.  
  2070.   /// Build an empty clause.
  2071.   OMPWriteClause()
  2072.       : OMPClause(llvm::omp::OMPC_write, SourceLocation(), SourceLocation()) {}
  2073.  
  2074.   child_range children() {
  2075.     return child_range(child_iterator(), child_iterator());
  2076.   }
  2077.  
  2078.   const_child_range children() const {
  2079.     return const_child_range(const_child_iterator(), const_child_iterator());
  2080.   }
  2081.  
  2082.   child_range used_children() {
  2083.     return child_range(child_iterator(), child_iterator());
  2084.   }
  2085.   const_child_range used_children() const {
  2086.     return const_child_range(const_child_iterator(), const_child_iterator());
  2087.   }
  2088.  
  2089.   static bool classof(const OMPClause *T) {
  2090.     return T->getClauseKind() == llvm::omp::OMPC_write;
  2091.   }
  2092. };
  2093.  
  2094. /// This represents 'update' clause in the '#pragma omp atomic'
  2095. /// directive.
  2096. ///
  2097. /// \code
  2098. /// #pragma omp atomic update
  2099. /// \endcode
  2100. /// In this example directive '#pragma omp atomic' has 'update' clause.
  2101. /// Also, this class represents 'update' clause in  '#pragma omp depobj'
  2102. /// directive.
  2103. ///
  2104. /// \code
  2105. /// #pragma omp depobj(a) update(in)
  2106. /// \endcode
  2107. /// In this example directive '#pragma omp depobj' has 'update' clause with 'in'
  2108. /// dependence kind.
  2109. class OMPUpdateClause final
  2110.     : public OMPClause,
  2111.       private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
  2112.                                     OpenMPDependClauseKind> {
  2113.   friend class OMPClauseReader;
  2114.   friend TrailingObjects;
  2115.  
  2116.   /// true if extended version of the clause for 'depobj' directive.
  2117.   bool IsExtended = false;
  2118.  
  2119.   /// Define the sizes of each trailing object array except the last one. This
  2120.   /// is required for TrailingObjects to work properly.
  2121.   size_t numTrailingObjects(OverloadToken<SourceLocation>) const {
  2122.     // 2 locations: for '(' and argument location.
  2123.     return IsExtended ? 2 : 0;
  2124.   }
  2125.  
  2126.   /// Sets the location of '(' in clause for 'depobj' directive.
  2127.   void setLParenLoc(SourceLocation Loc) {
  2128.     assert(IsExtended && "Expected extended clause.");
  2129.     *getTrailingObjects<SourceLocation>() = Loc;
  2130.   }
  2131.  
  2132.   /// Sets the location of '(' in clause for 'depobj' directive.
  2133.   void setArgumentLoc(SourceLocation Loc) {
  2134.     assert(IsExtended && "Expected extended clause.");
  2135.     *std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
  2136.   }
  2137.  
  2138.   /// Sets the dependence kind for the clause for 'depobj' directive.
  2139.   void setDependencyKind(OpenMPDependClauseKind DK) {
  2140.     assert(IsExtended && "Expected extended clause.");
  2141.     *getTrailingObjects<OpenMPDependClauseKind>() = DK;
  2142.   }
  2143.  
  2144.   /// Build 'update' clause.
  2145.   ///
  2146.   /// \param StartLoc Starting location of the clause.
  2147.   /// \param EndLoc Ending location of the clause.
  2148.   OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
  2149.                   bool IsExtended)
  2150.       : OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
  2151.         IsExtended(IsExtended) {}
  2152.  
  2153.   /// Build an empty clause.
  2154.   OMPUpdateClause(bool IsExtended)
  2155.       : OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
  2156.         IsExtended(IsExtended) {}
  2157.  
  2158. public:
  2159.   /// Creates clause for 'atomic' directive.
  2160.   ///
  2161.   /// \param C AST context.
  2162.   /// \param StartLoc Starting location of the clause.
  2163.   /// \param EndLoc Ending location of the clause.
  2164.   static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
  2165.                                  SourceLocation EndLoc);
  2166.  
  2167.   /// Creates clause for 'depobj' directive.
  2168.   ///
  2169.   /// \param C AST context.
  2170.   /// \param StartLoc Starting location of the clause.
  2171.   /// \param LParenLoc Location of '('.
  2172.   /// \param ArgumentLoc Location of the argument.
  2173.   /// \param DK Dependence kind.
  2174.   /// \param EndLoc Ending location of the clause.
  2175.   static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
  2176.                                  SourceLocation LParenLoc,
  2177.                                  SourceLocation ArgumentLoc,
  2178.                                  OpenMPDependClauseKind DK,
  2179.                                  SourceLocation EndLoc);
  2180.  
  2181.   /// Creates an empty clause with the place for \a N variables.
  2182.   ///
  2183.   /// \param C AST context.
  2184.   /// \param IsExtended true if extended clause for 'depobj' directive must be
  2185.   /// created.
  2186.   static OMPUpdateClause *CreateEmpty(const ASTContext &C, bool IsExtended);
  2187.  
  2188.   /// Checks if the clause is the extended clauses for 'depobj' directive.
  2189.   bool isExtended() const { return IsExtended; }
  2190.  
  2191.   child_range children() {
  2192.     return child_range(child_iterator(), child_iterator());
  2193.   }
  2194.  
  2195.   const_child_range children() const {
  2196.     return const_child_range(const_child_iterator(), const_child_iterator());
  2197.   }
  2198.  
  2199.   child_range used_children() {
  2200.     return child_range(child_iterator(), child_iterator());
  2201.   }
  2202.   const_child_range used_children() const {
  2203.     return const_child_range(const_child_iterator(), const_child_iterator());
  2204.   }
  2205.  
  2206.   /// Gets the location of '(' in clause for 'depobj' directive.
  2207.   SourceLocation getLParenLoc() const {
  2208.     assert(IsExtended && "Expected extended clause.");
  2209.     return *getTrailingObjects<SourceLocation>();
  2210.   }
  2211.  
  2212.   /// Gets the location of argument in clause for 'depobj' directive.
  2213.   SourceLocation getArgumentLoc() const {
  2214.     assert(IsExtended && "Expected extended clause.");
  2215.     return *std::next(getTrailingObjects<SourceLocation>(), 1);
  2216.   }
  2217.  
  2218.   /// Gets the dependence kind in clause for 'depobj' directive.
  2219.   OpenMPDependClauseKind getDependencyKind() const {
  2220.     assert(IsExtended && "Expected extended clause.");
  2221.     return *getTrailingObjects<OpenMPDependClauseKind>();
  2222.   }
  2223.  
  2224.   static bool classof(const OMPClause *T) {
  2225.     return T->getClauseKind() == llvm::omp::OMPC_update;
  2226.   }
  2227. };
  2228.  
  2229. /// This represents 'capture' clause in the '#pragma omp atomic'
  2230. /// directive.
  2231. ///
  2232. /// \code
  2233. /// #pragma omp atomic capture
  2234. /// \endcode
  2235. /// In this example directive '#pragma omp atomic' has 'capture' clause.
  2236. class OMPCaptureClause : public OMPClause {
  2237. public:
  2238.   /// Build 'capture' clause.
  2239.   ///
  2240.   /// \param StartLoc Starting location of the clause.
  2241.   /// \param EndLoc Ending location of the clause.
  2242.   OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2243.       : OMPClause(llvm::omp::OMPC_capture, StartLoc, EndLoc) {}
  2244.  
  2245.   /// Build an empty clause.
  2246.   OMPCaptureClause()
  2247.       : OMPClause(llvm::omp::OMPC_capture, SourceLocation(), SourceLocation()) {
  2248.   }
  2249.  
  2250.   child_range children() {
  2251.     return child_range(child_iterator(), child_iterator());
  2252.   }
  2253.  
  2254.   const_child_range children() const {
  2255.     return const_child_range(const_child_iterator(), const_child_iterator());
  2256.   }
  2257.  
  2258.   child_range used_children() {
  2259.     return child_range(child_iterator(), child_iterator());
  2260.   }
  2261.   const_child_range used_children() const {
  2262.     return const_child_range(const_child_iterator(), const_child_iterator());
  2263.   }
  2264.  
  2265.   static bool classof(const OMPClause *T) {
  2266.     return T->getClauseKind() == llvm::omp::OMPC_capture;
  2267.   }
  2268. };
  2269.  
  2270. /// This represents 'compare' clause in the '#pragma omp atomic'
  2271. /// directive.
  2272. ///
  2273. /// \code
  2274. /// #pragma omp atomic compare
  2275. /// \endcode
  2276. /// In this example directive '#pragma omp atomic' has 'compare' clause.
  2277. class OMPCompareClause final : public OMPClause {
  2278. public:
  2279.   /// Build 'compare' clause.
  2280.   ///
  2281.   /// \param StartLoc Starting location of the clause.
  2282.   /// \param EndLoc Ending location of the clause.
  2283.   OMPCompareClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2284.       : OMPClause(llvm::omp::OMPC_compare, StartLoc, EndLoc) {}
  2285.  
  2286.   /// Build an empty clause.
  2287.   OMPCompareClause()
  2288.       : OMPClause(llvm::omp::OMPC_compare, SourceLocation(), SourceLocation()) {
  2289.   }
  2290.  
  2291.   child_range children() {
  2292.     return child_range(child_iterator(), child_iterator());
  2293.   }
  2294.  
  2295.   const_child_range children() const {
  2296.     return const_child_range(const_child_iterator(), const_child_iterator());
  2297.   }
  2298.  
  2299.   child_range used_children() {
  2300.     return child_range(child_iterator(), child_iterator());
  2301.   }
  2302.   const_child_range used_children() const {
  2303.     return const_child_range(const_child_iterator(), const_child_iterator());
  2304.   }
  2305.  
  2306.   static bool classof(const OMPClause *T) {
  2307.     return T->getClauseKind() == llvm::omp::OMPC_compare;
  2308.   }
  2309. };
  2310.  
  2311. /// This represents 'seq_cst' clause in the '#pragma omp atomic'
  2312. /// directive.
  2313. ///
  2314. /// \code
  2315. /// #pragma omp atomic seq_cst
  2316. /// \endcode
  2317. /// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
  2318. class OMPSeqCstClause : public OMPClause {
  2319. public:
  2320.   /// Build 'seq_cst' clause.
  2321.   ///
  2322.   /// \param StartLoc Starting location of the clause.
  2323.   /// \param EndLoc Ending location of the clause.
  2324.   OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2325.       : OMPClause(llvm::omp::OMPC_seq_cst, StartLoc, EndLoc) {}
  2326.  
  2327.   /// Build an empty clause.
  2328.   OMPSeqCstClause()
  2329.       : OMPClause(llvm::omp::OMPC_seq_cst, SourceLocation(), SourceLocation()) {
  2330.   }
  2331.  
  2332.   child_range children() {
  2333.     return child_range(child_iterator(), child_iterator());
  2334.   }
  2335.  
  2336.   const_child_range children() const {
  2337.     return const_child_range(const_child_iterator(), const_child_iterator());
  2338.   }
  2339.  
  2340.   child_range used_children() {
  2341.     return child_range(child_iterator(), child_iterator());
  2342.   }
  2343.   const_child_range used_children() const {
  2344.     return const_child_range(const_child_iterator(), const_child_iterator());
  2345.   }
  2346.  
  2347.   static bool classof(const OMPClause *T) {
  2348.     return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
  2349.   }
  2350. };
  2351.  
  2352. /// This represents 'acq_rel' clause in the '#pragma omp atomic|flush'
  2353. /// directives.
  2354. ///
  2355. /// \code
  2356. /// #pragma omp flush acq_rel
  2357. /// \endcode
  2358. /// In this example directive '#pragma omp flush' has 'acq_rel' clause.
  2359. class OMPAcqRelClause final : public OMPClause {
  2360. public:
  2361.   /// Build 'ack_rel' clause.
  2362.   ///
  2363.   /// \param StartLoc Starting location of the clause.
  2364.   /// \param EndLoc Ending location of the clause.
  2365.   OMPAcqRelClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2366.       : OMPClause(llvm::omp::OMPC_acq_rel, StartLoc, EndLoc) {}
  2367.  
  2368.   /// Build an empty clause.
  2369.   OMPAcqRelClause()
  2370.       : OMPClause(llvm::omp::OMPC_acq_rel, SourceLocation(), SourceLocation()) {
  2371.   }
  2372.  
  2373.   child_range children() {
  2374.     return child_range(child_iterator(), child_iterator());
  2375.   }
  2376.  
  2377.   const_child_range children() const {
  2378.     return const_child_range(const_child_iterator(), const_child_iterator());
  2379.   }
  2380.  
  2381.   child_range used_children() {
  2382.     return child_range(child_iterator(), child_iterator());
  2383.   }
  2384.   const_child_range used_children() const {
  2385.     return const_child_range(const_child_iterator(), const_child_iterator());
  2386.   }
  2387.  
  2388.   static bool classof(const OMPClause *T) {
  2389.     return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
  2390.   }
  2391. };
  2392.  
  2393. /// This represents 'acquire' clause in the '#pragma omp atomic|flush'
  2394. /// directives.
  2395. ///
  2396. /// \code
  2397. /// #pragma omp flush acquire
  2398. /// \endcode
  2399. /// In this example directive '#pragma omp flush' has 'acquire' clause.
  2400. class OMPAcquireClause final : public OMPClause {
  2401. public:
  2402.   /// Build 'acquire' clause.
  2403.   ///
  2404.   /// \param StartLoc Starting location of the clause.
  2405.   /// \param EndLoc Ending location of the clause.
  2406.   OMPAcquireClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2407.       : OMPClause(llvm::omp::OMPC_acquire, StartLoc, EndLoc) {}
  2408.  
  2409.   /// Build an empty clause.
  2410.   OMPAcquireClause()
  2411.       : OMPClause(llvm::omp::OMPC_acquire, SourceLocation(), SourceLocation()) {
  2412.   }
  2413.  
  2414.   child_range children() {
  2415.     return child_range(child_iterator(), child_iterator());
  2416.   }
  2417.  
  2418.   const_child_range children() const {
  2419.     return const_child_range(const_child_iterator(), const_child_iterator());
  2420.   }
  2421.  
  2422.   child_range used_children() {
  2423.     return child_range(child_iterator(), child_iterator());
  2424.   }
  2425.   const_child_range used_children() const {
  2426.     return const_child_range(const_child_iterator(), const_child_iterator());
  2427.   }
  2428.  
  2429.   static bool classof(const OMPClause *T) {
  2430.     return T->getClauseKind() == llvm::omp::OMPC_acquire;
  2431.   }
  2432. };
  2433.  
  2434. /// This represents 'release' clause in the '#pragma omp atomic|flush'
  2435. /// directives.
  2436. ///
  2437. /// \code
  2438. /// #pragma omp flush release
  2439. /// \endcode
  2440. /// In this example directive '#pragma omp flush' has 'release' clause.
  2441. class OMPReleaseClause final : public OMPClause {
  2442. public:
  2443.   /// Build 'release' clause.
  2444.   ///
  2445.   /// \param StartLoc Starting location of the clause.
  2446.   /// \param EndLoc Ending location of the clause.
  2447.   OMPReleaseClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2448.       : OMPClause(llvm::omp::OMPC_release, StartLoc, EndLoc) {}
  2449.  
  2450.   /// Build an empty clause.
  2451.   OMPReleaseClause()
  2452.       : OMPClause(llvm::omp::OMPC_release, SourceLocation(), SourceLocation()) {
  2453.   }
  2454.  
  2455.   child_range children() {
  2456.     return child_range(child_iterator(), child_iterator());
  2457.   }
  2458.  
  2459.   const_child_range children() const {
  2460.     return const_child_range(const_child_iterator(), const_child_iterator());
  2461.   }
  2462.  
  2463.   child_range used_children() {
  2464.     return child_range(child_iterator(), child_iterator());
  2465.   }
  2466.   const_child_range used_children() const {
  2467.     return const_child_range(const_child_iterator(), const_child_iterator());
  2468.   }
  2469.  
  2470.   static bool classof(const OMPClause *T) {
  2471.     return T->getClauseKind() == llvm::omp::OMPC_release;
  2472.   }
  2473. };
  2474.  
  2475. /// This represents 'relaxed' clause in the '#pragma omp atomic'
  2476. /// directives.
  2477. ///
  2478. /// \code
  2479. /// #pragma omp atomic relaxed
  2480. /// \endcode
  2481. /// In this example directive '#pragma omp atomic' has 'relaxed' clause.
  2482. class OMPRelaxedClause final : public OMPClause {
  2483. public:
  2484.   /// Build 'relaxed' clause.
  2485.   ///
  2486.   /// \param StartLoc Starting location of the clause.
  2487.   /// \param EndLoc Ending location of the clause.
  2488.   OMPRelaxedClause(SourceLocation StartLoc, SourceLocation EndLoc)
  2489.       : OMPClause(llvm::omp::OMPC_relaxed, StartLoc, EndLoc) {}
  2490.  
  2491.   /// Build an empty clause.
  2492.   OMPRelaxedClause()
  2493.       : OMPClause(llvm::omp::OMPC_relaxed, SourceLocation(), SourceLocation()) {
  2494.   }
  2495.  
  2496.   child_range children() {
  2497.     return child_range(child_iterator(), child_iterator());
  2498.   }
  2499.  
  2500.   const_child_range children() const {
  2501.     return const_child_range(const_child_iterator(), const_child_iterator());
  2502.   }
  2503.  
  2504.   child_range used_children() {
  2505.     return child_range(child_iterator(), child_iterator());
  2506.   }
  2507.   const_child_range used_children() const {
  2508.     return const_child_range(const_child_iterator(), const_child_iterator());
  2509.   }
  2510.  
  2511.   static bool classof(const OMPClause *T) {
  2512.     return T->getClauseKind() == llvm::omp::OMPC_relaxed;
  2513.   }
  2514. };
  2515.  
  2516. /// This represents clause 'private' in the '#pragma omp ...' directives.
  2517. ///
  2518. /// \code
  2519. /// #pragma omp parallel private(a,b)
  2520. /// \endcode
  2521. /// In this example directive '#pragma omp parallel' has clause 'private'
  2522. /// with the variables 'a' and 'b'.
  2523. class OMPPrivateClause final
  2524.     : public OMPVarListClause<OMPPrivateClause>,
  2525.       private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
  2526.   friend class OMPClauseReader;
  2527.   friend OMPVarListClause;
  2528.   friend TrailingObjects;
  2529.  
  2530.   /// Build clause with number of variables \a N.
  2531.   ///
  2532.   /// \param StartLoc Starting location of the clause.
  2533.   /// \param LParenLoc Location of '('.
  2534.   /// \param EndLoc Ending location of the clause.
  2535.   /// \param N Number of the variables in the clause.
  2536.   OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  2537.                    SourceLocation EndLoc, unsigned N)
  2538.       : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private, StartLoc,
  2539.                                            LParenLoc, EndLoc, N) {}
  2540.  
  2541.   /// Build an empty clause.
  2542.   ///
  2543.   /// \param N Number of variables.
  2544.   explicit OMPPrivateClause(unsigned N)
  2545.       : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private,
  2546.                                            SourceLocation(), SourceLocation(),
  2547.                                            SourceLocation(), N) {}
  2548.  
  2549.   /// Sets the list of references to private copies with initializers for
  2550.   /// new private variables.
  2551.   /// \param VL List of references.
  2552.   void setPrivateCopies(ArrayRef<Expr *> VL);
  2553.  
  2554.   /// Gets the list of references to private copies with initializers for
  2555.   /// new private variables.
  2556.   MutableArrayRef<Expr *> getPrivateCopies() {
  2557.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  2558.   }
  2559.   ArrayRef<const Expr *> getPrivateCopies() const {
  2560.     return llvm::ArrayRef(varlist_end(), varlist_size());
  2561.   }
  2562.  
  2563. public:
  2564.   /// Creates clause with a list of variables \a VL.
  2565.   ///
  2566.   /// \param C AST context.
  2567.   /// \param StartLoc Starting location of the clause.
  2568.   /// \param LParenLoc Location of '('.
  2569.   /// \param EndLoc Ending location of the clause.
  2570.   /// \param VL List of references to the variables.
  2571.   /// \param PrivateVL List of references to private copies with initializers.
  2572.   static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
  2573.                                   SourceLocation LParenLoc,
  2574.                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
  2575.                                   ArrayRef<Expr *> PrivateVL);
  2576.  
  2577.   /// Creates an empty clause with the place for \a N variables.
  2578.   ///
  2579.   /// \param C AST context.
  2580.   /// \param N The number of variables.
  2581.   static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
  2582.  
  2583.   using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
  2584.   using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
  2585.   using private_copies_range = llvm::iterator_range<private_copies_iterator>;
  2586.   using private_copies_const_range =
  2587.       llvm::iterator_range<private_copies_const_iterator>;
  2588.  
  2589.   private_copies_range private_copies() {
  2590.     return private_copies_range(getPrivateCopies().begin(),
  2591.                                 getPrivateCopies().end());
  2592.   }
  2593.  
  2594.   private_copies_const_range private_copies() const {
  2595.     return private_copies_const_range(getPrivateCopies().begin(),
  2596.                                       getPrivateCopies().end());
  2597.   }
  2598.  
  2599.   child_range children() {
  2600.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  2601.                        reinterpret_cast<Stmt **>(varlist_end()));
  2602.   }
  2603.  
  2604.   const_child_range children() const {
  2605.     auto Children = const_cast<OMPPrivateClause *>(this)->children();
  2606.     return const_child_range(Children.begin(), Children.end());
  2607.   }
  2608.  
  2609.   child_range used_children() {
  2610.     return child_range(child_iterator(), child_iterator());
  2611.   }
  2612.   const_child_range used_children() const {
  2613.     return const_child_range(const_child_iterator(), const_child_iterator());
  2614.   }
  2615.  
  2616.   static bool classof(const OMPClause *T) {
  2617.     return T->getClauseKind() == llvm::omp::OMPC_private;
  2618.   }
  2619. };
  2620.  
  2621. /// This represents clause 'firstprivate' in the '#pragma omp ...'
  2622. /// directives.
  2623. ///
  2624. /// \code
  2625. /// #pragma omp parallel firstprivate(a,b)
  2626. /// \endcode
  2627. /// In this example directive '#pragma omp parallel' has clause 'firstprivate'
  2628. /// with the variables 'a' and 'b'.
  2629. class OMPFirstprivateClause final
  2630.     : public OMPVarListClause<OMPFirstprivateClause>,
  2631.       public OMPClauseWithPreInit,
  2632.       private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
  2633.   friend class OMPClauseReader;
  2634.   friend OMPVarListClause;
  2635.   friend TrailingObjects;
  2636.  
  2637.   /// Build clause with number of variables \a N.
  2638.   ///
  2639.   /// \param StartLoc Starting location of the clause.
  2640.   /// \param LParenLoc Location of '('.
  2641.   /// \param EndLoc Ending location of the clause.
  2642.   /// \param N Number of the variables in the clause.
  2643.   OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  2644.                         SourceLocation EndLoc, unsigned N)
  2645.       : OMPVarListClause<OMPFirstprivateClause>(llvm::omp::OMPC_firstprivate,
  2646.                                                 StartLoc, LParenLoc, EndLoc, N),
  2647.         OMPClauseWithPreInit(this) {}
  2648.  
  2649.   /// Build an empty clause.
  2650.   ///
  2651.   /// \param N Number of variables.
  2652.   explicit OMPFirstprivateClause(unsigned N)
  2653.       : OMPVarListClause<OMPFirstprivateClause>(
  2654.             llvm::omp::OMPC_firstprivate, SourceLocation(), SourceLocation(),
  2655.             SourceLocation(), N),
  2656.         OMPClauseWithPreInit(this) {}
  2657.  
  2658.   /// Sets the list of references to private copies with initializers for
  2659.   /// new private variables.
  2660.   /// \param VL List of references.
  2661.   void setPrivateCopies(ArrayRef<Expr *> VL);
  2662.  
  2663.   /// Gets the list of references to private copies with initializers for
  2664.   /// new private variables.
  2665.   MutableArrayRef<Expr *> getPrivateCopies() {
  2666.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  2667.   }
  2668.   ArrayRef<const Expr *> getPrivateCopies() const {
  2669.     return llvm::ArrayRef(varlist_end(), varlist_size());
  2670.   }
  2671.  
  2672.   /// Sets the list of references to initializer variables for new
  2673.   /// private variables.
  2674.   /// \param VL List of references.
  2675.   void setInits(ArrayRef<Expr *> VL);
  2676.  
  2677.   /// Gets the list of references to initializer variables for new
  2678.   /// private variables.
  2679.   MutableArrayRef<Expr *> getInits() {
  2680.     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
  2681.   }
  2682.   ArrayRef<const Expr *> getInits() const {
  2683.     return llvm::ArrayRef(getPrivateCopies().end(), varlist_size());
  2684.   }
  2685.  
  2686. public:
  2687.   /// Creates clause with a list of variables \a VL.
  2688.   ///
  2689.   /// \param C AST context.
  2690.   /// \param StartLoc Starting location of the clause.
  2691.   /// \param LParenLoc Location of '('.
  2692.   /// \param EndLoc Ending location of the clause.
  2693.   /// \param VL List of references to the original variables.
  2694.   /// \param PrivateVL List of references to private copies with initializers.
  2695.   /// \param InitVL List of references to auto generated variables used for
  2696.   /// initialization of a single array element. Used if firstprivate variable is
  2697.   /// of array type.
  2698.   /// \param PreInit Statement that must be executed before entering the OpenMP
  2699.   /// region with this clause.
  2700.   static OMPFirstprivateClause *
  2701.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  2702.          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
  2703.          ArrayRef<Expr *> InitVL, Stmt *PreInit);
  2704.  
  2705.   /// Creates an empty clause with the place for \a N variables.
  2706.   ///
  2707.   /// \param C AST context.
  2708.   /// \param N The number of variables.
  2709.   static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
  2710.  
  2711.   using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
  2712.   using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
  2713.   using private_copies_range = llvm::iterator_range<private_copies_iterator>;
  2714.   using private_copies_const_range =
  2715.       llvm::iterator_range<private_copies_const_iterator>;
  2716.  
  2717.   private_copies_range private_copies() {
  2718.     return private_copies_range(getPrivateCopies().begin(),
  2719.                                 getPrivateCopies().end());
  2720.   }
  2721.   private_copies_const_range private_copies() const {
  2722.     return private_copies_const_range(getPrivateCopies().begin(),
  2723.                                       getPrivateCopies().end());
  2724.   }
  2725.  
  2726.   using inits_iterator = MutableArrayRef<Expr *>::iterator;
  2727.   using inits_const_iterator = ArrayRef<const Expr *>::iterator;
  2728.   using inits_range = llvm::iterator_range<inits_iterator>;
  2729.   using inits_const_range = llvm::iterator_range<inits_const_iterator>;
  2730.  
  2731.   inits_range inits() {
  2732.     return inits_range(getInits().begin(), getInits().end());
  2733.   }
  2734.   inits_const_range inits() const {
  2735.     return inits_const_range(getInits().begin(), getInits().end());
  2736.   }
  2737.  
  2738.   child_range children() {
  2739.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  2740.                        reinterpret_cast<Stmt **>(varlist_end()));
  2741.   }
  2742.  
  2743.   const_child_range children() const {
  2744.     auto Children = const_cast<OMPFirstprivateClause *>(this)->children();
  2745.     return const_child_range(Children.begin(), Children.end());
  2746.   }
  2747.  
  2748.   child_range used_children() {
  2749.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  2750.                        reinterpret_cast<Stmt **>(varlist_end()));
  2751.   }
  2752.   const_child_range used_children() const {
  2753.     auto Children = const_cast<OMPFirstprivateClause *>(this)->used_children();
  2754.     return const_child_range(Children.begin(), Children.end());
  2755.   }
  2756.  
  2757.   static bool classof(const OMPClause *T) {
  2758.     return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
  2759.   }
  2760. };
  2761.  
  2762. /// This represents clause 'lastprivate' in the '#pragma omp ...'
  2763. /// directives.
  2764. ///
  2765. /// \code
  2766. /// #pragma omp simd lastprivate(a,b)
  2767. /// \endcode
  2768. /// In this example directive '#pragma omp simd' has clause 'lastprivate'
  2769. /// with the variables 'a' and 'b'.
  2770. class OMPLastprivateClause final
  2771.     : public OMPVarListClause<OMPLastprivateClause>,
  2772.       public OMPClauseWithPostUpdate,
  2773.       private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
  2774.   // There are 4 additional tail-allocated arrays at the end of the class:
  2775.   // 1. Contains list of pseudo variables with the default initialization for
  2776.   // each non-firstprivate variables. Used in codegen for initialization of
  2777.   // lastprivate copies.
  2778.   // 2. List of helper expressions for proper generation of assignment operation
  2779.   // required for lastprivate clause. This list represents private variables
  2780.   // (for arrays, single array element).
  2781.   // 3. List of helper expressions for proper generation of assignment operation
  2782.   // required for lastprivate clause. This list represents original variables
  2783.   // (for arrays, single array element).
  2784.   // 4. List of helper expressions that represents assignment operation:
  2785.   // \code
  2786.   // DstExprs = SrcExprs;
  2787.   // \endcode
  2788.   // Required for proper codegen of final assignment performed by the
  2789.   // lastprivate clause.
  2790.   friend class OMPClauseReader;
  2791.   friend OMPVarListClause;
  2792.   friend TrailingObjects;
  2793.  
  2794.   /// Optional lastprivate kind, e.g. 'conditional', if specified by user.
  2795.   OpenMPLastprivateModifier LPKind;
  2796.   /// Optional location of the lasptrivate kind, if specified by user.
  2797.   SourceLocation LPKindLoc;
  2798.   /// Optional colon location, if specified by user.
  2799.   SourceLocation ColonLoc;
  2800.  
  2801.   /// Build clause with number of variables \a N.
  2802.   ///
  2803.   /// \param StartLoc Starting location of the clause.
  2804.   /// \param LParenLoc Location of '('.
  2805.   /// \param EndLoc Ending location of the clause.
  2806.   /// \param N Number of the variables in the clause.
  2807.   OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  2808.                        SourceLocation EndLoc, OpenMPLastprivateModifier LPKind,
  2809.                        SourceLocation LPKindLoc, SourceLocation ColonLoc,
  2810.                        unsigned N)
  2811.       : OMPVarListClause<OMPLastprivateClause>(llvm::omp::OMPC_lastprivate,
  2812.                                                StartLoc, LParenLoc, EndLoc, N),
  2813.         OMPClauseWithPostUpdate(this), LPKind(LPKind), LPKindLoc(LPKindLoc),
  2814.         ColonLoc(ColonLoc) {}
  2815.  
  2816.   /// Build an empty clause.
  2817.   ///
  2818.   /// \param N Number of variables.
  2819.   explicit OMPLastprivateClause(unsigned N)
  2820.       : OMPVarListClause<OMPLastprivateClause>(
  2821.             llvm::omp::OMPC_lastprivate, SourceLocation(), SourceLocation(),
  2822.             SourceLocation(), N),
  2823.         OMPClauseWithPostUpdate(this) {}
  2824.  
  2825.   /// Get the list of helper expressions for initialization of private
  2826.   /// copies for lastprivate variables.
  2827.   MutableArrayRef<Expr *> getPrivateCopies() {
  2828.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  2829.   }
  2830.   ArrayRef<const Expr *> getPrivateCopies() const {
  2831.     return llvm::ArrayRef(varlist_end(), varlist_size());
  2832.   }
  2833.  
  2834.   /// Set list of helper expressions, required for proper codegen of the
  2835.   /// clause. These expressions represent private variables (for arrays, single
  2836.   /// array element) in the final assignment statement performed by the
  2837.   /// lastprivate clause.
  2838.   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
  2839.  
  2840.   /// Get the list of helper source expressions.
  2841.   MutableArrayRef<Expr *> getSourceExprs() {
  2842.     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
  2843.   }
  2844.   ArrayRef<const Expr *> getSourceExprs() const {
  2845.     return llvm::ArrayRef(getPrivateCopies().end(), varlist_size());
  2846.   }
  2847.  
  2848.   /// Set list of helper expressions, required for proper codegen of the
  2849.   /// clause. These expressions represent original variables (for arrays, single
  2850.   /// array element) in the final assignment statement performed by the
  2851.   /// lastprivate clause.
  2852.   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
  2853.  
  2854.   /// Get the list of helper destination expressions.
  2855.   MutableArrayRef<Expr *> getDestinationExprs() {
  2856.     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
  2857.   }
  2858.   ArrayRef<const Expr *> getDestinationExprs() const {
  2859.     return llvm::ArrayRef(getSourceExprs().end(), varlist_size());
  2860.   }
  2861.  
  2862.   /// Set list of helper assignment expressions, required for proper
  2863.   /// codegen of the clause. These expressions are assignment expressions that
  2864.   /// assign private copy of the variable to original variable.
  2865.   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
  2866.  
  2867.   /// Get the list of helper assignment expressions.
  2868.   MutableArrayRef<Expr *> getAssignmentOps() {
  2869.     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
  2870.   }
  2871.   ArrayRef<const Expr *> getAssignmentOps() const {
  2872.     return llvm::ArrayRef(getDestinationExprs().end(), varlist_size());
  2873.   }
  2874.  
  2875.   /// Sets lastprivate kind.
  2876.   void setKind(OpenMPLastprivateModifier Kind) { LPKind = Kind; }
  2877.   /// Sets location of the lastprivate kind.
  2878.   void setKindLoc(SourceLocation Loc) { LPKindLoc = Loc; }
  2879.   /// Sets colon symbol location.
  2880.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  2881.  
  2882. public:
  2883.   /// Creates clause with a list of variables \a VL.
  2884.   ///
  2885.   /// \param C AST context.
  2886.   /// \param StartLoc Starting location of the clause.
  2887.   /// \param LParenLoc Location of '('.
  2888.   /// \param EndLoc Ending location of the clause.
  2889.   /// \param VL List of references to the variables.
  2890.   /// \param SrcExprs List of helper expressions for proper generation of
  2891.   /// assignment operation required for lastprivate clause. This list represents
  2892.   /// private variables (for arrays, single array element).
  2893.   /// \param DstExprs List of helper expressions for proper generation of
  2894.   /// assignment operation required for lastprivate clause. This list represents
  2895.   /// original variables (for arrays, single array element).
  2896.   /// \param AssignmentOps List of helper expressions that represents assignment
  2897.   /// operation:
  2898.   /// \code
  2899.   /// DstExprs = SrcExprs;
  2900.   /// \endcode
  2901.   /// Required for proper codegen of final assignment performed by the
  2902.   /// lastprivate clause.
  2903.   /// \param LPKind Lastprivate kind, e.g. 'conditional'.
  2904.   /// \param LPKindLoc Location of the lastprivate kind.
  2905.   /// \param ColonLoc Location of the ':' symbol if lastprivate kind is used.
  2906.   /// \param PreInit Statement that must be executed before entering the OpenMP
  2907.   /// region with this clause.
  2908.   /// \param PostUpdate Expression that must be executed after exit from the
  2909.   /// OpenMP region with this clause.
  2910.   static OMPLastprivateClause *
  2911.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  2912.          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
  2913.          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
  2914.          OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc,
  2915.          SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
  2916.  
  2917.   /// Creates an empty clause with the place for \a N variables.
  2918.   ///
  2919.   /// \param C AST context.
  2920.   /// \param N The number of variables.
  2921.   static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
  2922.  
  2923.   /// Lastprivate kind.
  2924.   OpenMPLastprivateModifier getKind() const { return LPKind; }
  2925.   /// Returns the location of the lastprivate kind.
  2926.   SourceLocation getKindLoc() const { return LPKindLoc; }
  2927.   /// Returns the location of the ':' symbol, if any.
  2928.   SourceLocation getColonLoc() const { return ColonLoc; }
  2929.  
  2930.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  2931.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  2932.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  2933.   using helper_expr_const_range =
  2934.       llvm::iterator_range<helper_expr_const_iterator>;
  2935.  
  2936.   /// Set list of helper expressions, required for generation of private
  2937.   /// copies of original lastprivate variables.
  2938.   void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
  2939.  
  2940.   helper_expr_const_range private_copies() const {
  2941.     return helper_expr_const_range(getPrivateCopies().begin(),
  2942.                                    getPrivateCopies().end());
  2943.   }
  2944.  
  2945.   helper_expr_range private_copies() {
  2946.     return helper_expr_range(getPrivateCopies().begin(),
  2947.                              getPrivateCopies().end());
  2948.   }
  2949.  
  2950.   helper_expr_const_range source_exprs() const {
  2951.     return helper_expr_const_range(getSourceExprs().begin(),
  2952.                                    getSourceExprs().end());
  2953.   }
  2954.  
  2955.   helper_expr_range source_exprs() {
  2956.     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
  2957.   }
  2958.  
  2959.   helper_expr_const_range destination_exprs() const {
  2960.     return helper_expr_const_range(getDestinationExprs().begin(),
  2961.                                    getDestinationExprs().end());
  2962.   }
  2963.  
  2964.   helper_expr_range destination_exprs() {
  2965.     return helper_expr_range(getDestinationExprs().begin(),
  2966.                              getDestinationExprs().end());
  2967.   }
  2968.  
  2969.   helper_expr_const_range assignment_ops() const {
  2970.     return helper_expr_const_range(getAssignmentOps().begin(),
  2971.                                    getAssignmentOps().end());
  2972.   }
  2973.  
  2974.   helper_expr_range assignment_ops() {
  2975.     return helper_expr_range(getAssignmentOps().begin(),
  2976.                              getAssignmentOps().end());
  2977.   }
  2978.  
  2979.   child_range children() {
  2980.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  2981.                        reinterpret_cast<Stmt **>(varlist_end()));
  2982.   }
  2983.  
  2984.   const_child_range children() const {
  2985.     auto Children = const_cast<OMPLastprivateClause *>(this)->children();
  2986.     return const_child_range(Children.begin(), Children.end());
  2987.   }
  2988.  
  2989.   child_range used_children() {
  2990.     return child_range(child_iterator(), child_iterator());
  2991.   }
  2992.   const_child_range used_children() const {
  2993.     return const_child_range(const_child_iterator(), const_child_iterator());
  2994.   }
  2995.  
  2996.   static bool classof(const OMPClause *T) {
  2997.     return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
  2998.   }
  2999. };
  3000.  
  3001. /// This represents clause 'shared' in the '#pragma omp ...' directives.
  3002. ///
  3003. /// \code
  3004. /// #pragma omp parallel shared(a,b)
  3005. /// \endcode
  3006. /// In this example directive '#pragma omp parallel' has clause 'shared'
  3007. /// with the variables 'a' and 'b'.
  3008. class OMPSharedClause final
  3009.     : public OMPVarListClause<OMPSharedClause>,
  3010.       private llvm::TrailingObjects<OMPSharedClause, Expr *> {
  3011.   friend OMPVarListClause;
  3012.   friend TrailingObjects;
  3013.  
  3014.   /// Build clause with number of variables \a N.
  3015.   ///
  3016.   /// \param StartLoc Starting location of the clause.
  3017.   /// \param LParenLoc Location of '('.
  3018.   /// \param EndLoc Ending location of the clause.
  3019.   /// \param N Number of the variables in the clause.
  3020.   OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  3021.                   SourceLocation EndLoc, unsigned N)
  3022.       : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared, StartLoc,
  3023.                                           LParenLoc, EndLoc, N) {}
  3024.  
  3025.   /// Build an empty clause.
  3026.   ///
  3027.   /// \param N Number of variables.
  3028.   explicit OMPSharedClause(unsigned N)
  3029.       : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared,
  3030.                                           SourceLocation(), SourceLocation(),
  3031.                                           SourceLocation(), N) {}
  3032.  
  3033. public:
  3034.   /// Creates clause with a list of variables \a VL.
  3035.   ///
  3036.   /// \param C AST context.
  3037.   /// \param StartLoc Starting location of the clause.
  3038.   /// \param LParenLoc Location of '('.
  3039.   /// \param EndLoc Ending location of the clause.
  3040.   /// \param VL List of references to the variables.
  3041.   static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
  3042.                                  SourceLocation LParenLoc,
  3043.                                  SourceLocation EndLoc, ArrayRef<Expr *> VL);
  3044.  
  3045.   /// Creates an empty clause with \a N variables.
  3046.   ///
  3047.   /// \param C AST context.
  3048.   /// \param N The number of variables.
  3049.   static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
  3050.  
  3051.   child_range children() {
  3052.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  3053.                        reinterpret_cast<Stmt **>(varlist_end()));
  3054.   }
  3055.  
  3056.   const_child_range children() const {
  3057.     auto Children = const_cast<OMPSharedClause *>(this)->children();
  3058.     return const_child_range(Children.begin(), Children.end());
  3059.   }
  3060.  
  3061.   child_range used_children() {
  3062.     return child_range(child_iterator(), child_iterator());
  3063.   }
  3064.   const_child_range used_children() const {
  3065.     return const_child_range(const_child_iterator(), const_child_iterator());
  3066.   }
  3067.  
  3068.   static bool classof(const OMPClause *T) {
  3069.     return T->getClauseKind() == llvm::omp::OMPC_shared;
  3070.   }
  3071. };
  3072.  
  3073. /// This represents clause 'reduction' in the '#pragma omp ...'
  3074. /// directives.
  3075. ///
  3076. /// \code
  3077. /// #pragma omp parallel reduction(+:a,b)
  3078. /// \endcode
  3079. /// In this example directive '#pragma omp parallel' has clause 'reduction'
  3080. /// with operator '+' and the variables 'a' and 'b'.
  3081. class OMPReductionClause final
  3082.     : public OMPVarListClause<OMPReductionClause>,
  3083.       public OMPClauseWithPostUpdate,
  3084.       private llvm::TrailingObjects<OMPReductionClause, Expr *> {
  3085.   friend class OMPClauseReader;
  3086.   friend OMPVarListClause;
  3087.   friend TrailingObjects;
  3088.  
  3089.   /// Reduction modifier.
  3090.   OpenMPReductionClauseModifier Modifier = OMPC_REDUCTION_unknown;
  3091.  
  3092.   /// Reduction modifier location.
  3093.   SourceLocation ModifierLoc;
  3094.  
  3095.   /// Location of ':'.
  3096.   SourceLocation ColonLoc;
  3097.  
  3098.   /// Nested name specifier for C++.
  3099.   NestedNameSpecifierLoc QualifierLoc;
  3100.  
  3101.   /// Name of custom operator.
  3102.   DeclarationNameInfo NameInfo;
  3103.  
  3104.   /// Build clause with number of variables \a N.
  3105.   ///
  3106.   /// \param StartLoc Starting location of the clause.
  3107.   /// \param LParenLoc Location of '('.
  3108.   /// \param ModifierLoc Modifier location.
  3109.   /// \param ColonLoc Location of ':'.
  3110.   /// \param EndLoc Ending location of the clause.
  3111.   /// \param N Number of the variables in the clause.
  3112.   /// \param QualifierLoc The nested-name qualifier with location information
  3113.   /// \param NameInfo The full name info for reduction identifier.
  3114.   OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  3115.                      SourceLocation ModifierLoc, SourceLocation ColonLoc,
  3116.                      SourceLocation EndLoc,
  3117.                      OpenMPReductionClauseModifier Modifier, unsigned N,
  3118.                      NestedNameSpecifierLoc QualifierLoc,
  3119.                      const DeclarationNameInfo &NameInfo)
  3120.       : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
  3121.                                              StartLoc, LParenLoc, EndLoc, N),
  3122.         OMPClauseWithPostUpdate(this), Modifier(Modifier),
  3123.         ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
  3124.         QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
  3125.  
  3126.   /// Build an empty clause.
  3127.   ///
  3128.   /// \param N Number of variables.
  3129.   explicit OMPReductionClause(unsigned N)
  3130.       : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
  3131.                                              SourceLocation(), SourceLocation(),
  3132.                                              SourceLocation(), N),
  3133.         OMPClauseWithPostUpdate(this) {}
  3134.  
  3135.   /// Sets reduction modifier.
  3136.   void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
  3137.  
  3138.   /// Sets location of the modifier.
  3139.   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
  3140.  
  3141.   /// Sets location of ':' symbol in clause.
  3142.   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
  3143.  
  3144.   /// Sets the name info for specified reduction identifier.
  3145.   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
  3146.  
  3147.   /// Sets the nested name specifier.
  3148.   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
  3149.  
  3150.   /// Set list of helper expressions, required for proper codegen of the
  3151.   /// clause. These expressions represent private copy of the reduction
  3152.   /// variable.
  3153.   void setPrivates(ArrayRef<Expr *> Privates);
  3154.  
  3155.   /// Get the list of helper privates.
  3156.   MutableArrayRef<Expr *> getPrivates() {
  3157.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  3158.   }
  3159.   ArrayRef<const Expr *> getPrivates() const {
  3160.     return llvm::ArrayRef(varlist_end(), varlist_size());
  3161.   }
  3162.  
  3163.   /// Set list of helper expressions, required for proper codegen of the
  3164.   /// clause. These expressions represent LHS expression in the final
  3165.   /// reduction expression performed by the reduction clause.
  3166.   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
  3167.  
  3168.   /// Get the list of helper LHS expressions.
  3169.   MutableArrayRef<Expr *> getLHSExprs() {
  3170.     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
  3171.   }
  3172.   ArrayRef<const Expr *> getLHSExprs() const {
  3173.     return llvm::ArrayRef(getPrivates().end(), varlist_size());
  3174.   }
  3175.  
  3176.   /// Set list of helper expressions, required for proper codegen of the
  3177.   /// clause. These expressions represent RHS expression in the final
  3178.   /// reduction expression performed by the reduction clause.
  3179.   /// Also, variables in these expressions are used for proper initialization of
  3180.   /// reduction copies.
  3181.   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
  3182.  
  3183.   /// Get the list of helper destination expressions.
  3184.   MutableArrayRef<Expr *> getRHSExprs() {
  3185.     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
  3186.   }
  3187.   ArrayRef<const Expr *> getRHSExprs() const {
  3188.     return llvm::ArrayRef(getLHSExprs().end(), varlist_size());
  3189.   }
  3190.  
  3191.   /// Set list of helper reduction expressions, required for proper
  3192.   /// codegen of the clause. These expressions are binary expressions or
  3193.   /// operator/custom reduction call that calculates new value from source
  3194.   /// helper expressions to destination helper expressions.
  3195.   void setReductionOps(ArrayRef<Expr *> ReductionOps);
  3196.  
  3197.   /// Get the list of helper reduction expressions.
  3198.   MutableArrayRef<Expr *> getReductionOps() {
  3199.     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
  3200.   }
  3201.   ArrayRef<const Expr *> getReductionOps() const {
  3202.     return llvm::ArrayRef(getRHSExprs().end(), varlist_size());
  3203.   }
  3204.  
  3205.   /// Set list of helper copy operations for inscan reductions.
  3206.   /// The form is: Temps[i] = LHS[i];
  3207.   void setInscanCopyOps(ArrayRef<Expr *> Ops);
  3208.  
  3209.   /// Get the list of helper inscan copy operations.
  3210.   MutableArrayRef<Expr *> getInscanCopyOps() {
  3211.     return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
  3212.   }
  3213.   ArrayRef<const Expr *> getInscanCopyOps() const {
  3214.     return llvm::ArrayRef(getReductionOps().end(), varlist_size());
  3215.   }
  3216.  
  3217.   /// Set list of helper temp vars for inscan copy array operations.
  3218.   void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
  3219.  
  3220.   /// Get the list of helper inscan copy temps.
  3221.   MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
  3222.     return MutableArrayRef<Expr *>(getInscanCopyOps().end(), varlist_size());
  3223.   }
  3224.   ArrayRef<const Expr *> getInscanCopyArrayTemps() const {
  3225.     return llvm::ArrayRef(getInscanCopyOps().end(), varlist_size());
  3226.   }
  3227.  
  3228.   /// Set list of helper temp elements vars for inscan copy array operations.
  3229.   void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
  3230.  
  3231.   /// Get the list of helper inscan copy temps.
  3232.   MutableArrayRef<Expr *> getInscanCopyArrayElems() {
  3233.     return MutableArrayRef<Expr *>(getInscanCopyArrayTemps().end(),
  3234.                                    varlist_size());
  3235.   }
  3236.   ArrayRef<const Expr *> getInscanCopyArrayElems() const {
  3237.     return llvm::ArrayRef(getInscanCopyArrayTemps().end(), varlist_size());
  3238.   }
  3239.  
  3240. public:
  3241.   /// Creates clause with a list of variables \a VL.
  3242.   ///
  3243.   /// \param StartLoc Starting location of the clause.
  3244.   /// \param LParenLoc Location of '('.
  3245.   /// \param ModifierLoc Modifier location.
  3246.   /// \param ColonLoc Location of ':'.
  3247.   /// \param EndLoc Ending location of the clause.
  3248.   /// \param VL The variables in the clause.
  3249.   /// \param QualifierLoc The nested-name qualifier with location information
  3250.   /// \param NameInfo The full name info for reduction identifier.
  3251.   /// \param Privates List of helper expressions for proper generation of
  3252.   /// private copies.
  3253.   /// \param LHSExprs List of helper expressions for proper generation of
  3254.   /// assignment operation required for copyprivate clause. This list represents
  3255.   /// LHSs of the reduction expressions.
  3256.   /// \param RHSExprs List of helper expressions for proper generation of
  3257.   /// assignment operation required for copyprivate clause. This list represents
  3258.   /// RHSs of the reduction expressions.
  3259.   /// Also, variables in these expressions are used for proper initialization of
  3260.   /// reduction copies.
  3261.   /// \param ReductionOps List of helper expressions that represents reduction
  3262.   /// expressions:
  3263.   /// \code
  3264.   /// LHSExprs binop RHSExprs;
  3265.   /// operator binop(LHSExpr, RHSExpr);
  3266.   /// <CutomReduction>(LHSExpr, RHSExpr);
  3267.   /// \endcode
  3268.   /// Required for proper codegen of final reduction operation performed by the
  3269.   /// reduction clause.
  3270.   /// \param CopyOps List of copy operations for inscan reductions:
  3271.   /// \code
  3272.   /// TempExprs = LHSExprs;
  3273.   /// \endcode
  3274.   /// \param CopyArrayTemps Temp arrays for prefix sums.
  3275.   /// \param CopyArrayElems Temp arrays for prefix sums.
  3276.   /// \param PreInit Statement that must be executed before entering the OpenMP
  3277.   /// region with this clause.
  3278.   /// \param PostUpdate Expression that must be executed after exit from the
  3279.   /// OpenMP region with this clause.
  3280.   static OMPReductionClause *
  3281.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  3282.          SourceLocation ModifierLoc, SourceLocation ColonLoc,
  3283.          SourceLocation EndLoc, OpenMPReductionClauseModifier Modifier,
  3284.          ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
  3285.          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
  3286.          ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
  3287.          ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
  3288.          ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
  3289.          Stmt *PreInit, Expr *PostUpdate);
  3290.  
  3291.   /// Creates an empty clause with the place for \a N variables.
  3292.   ///
  3293.   /// \param C AST context.
  3294.   /// \param N The number of variables.
  3295.   /// \param Modifier Reduction modifier.
  3296.   static OMPReductionClause *
  3297.   CreateEmpty(const ASTContext &C, unsigned N,
  3298.               OpenMPReductionClauseModifier Modifier);
  3299.  
  3300.   /// Returns modifier.
  3301.   OpenMPReductionClauseModifier getModifier() const { return Modifier; }
  3302.  
  3303.   /// Returns modifier location.
  3304.   SourceLocation getModifierLoc() const { return ModifierLoc; }
  3305.  
  3306.   /// Gets location of ':' symbol in clause.
  3307.   SourceLocation getColonLoc() const { return ColonLoc; }
  3308.  
  3309.   /// Gets the name info for specified reduction identifier.
  3310.   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
  3311.  
  3312.   /// Gets the nested name specifier.
  3313.   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
  3314.  
  3315.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  3316.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  3317.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  3318.   using helper_expr_const_range =
  3319.       llvm::iterator_range<helper_expr_const_iterator>;
  3320.  
  3321.   helper_expr_const_range privates() const {
  3322.     return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
  3323.   }
  3324.  
  3325.   helper_expr_range privates() {
  3326.     return helper_expr_range(getPrivates().begin(), getPrivates().end());
  3327.   }
  3328.  
  3329.   helper_expr_const_range lhs_exprs() const {
  3330.     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
  3331.   }
  3332.  
  3333.   helper_expr_range lhs_exprs() {
  3334.     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
  3335.   }
  3336.  
  3337.   helper_expr_const_range rhs_exprs() const {
  3338.     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
  3339.   }
  3340.  
  3341.   helper_expr_range rhs_exprs() {
  3342.     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
  3343.   }
  3344.  
  3345.   helper_expr_const_range reduction_ops() const {
  3346.     return helper_expr_const_range(getReductionOps().begin(),
  3347.                                    getReductionOps().end());
  3348.   }
  3349.  
  3350.   helper_expr_range reduction_ops() {
  3351.     return helper_expr_range(getReductionOps().begin(),
  3352.                              getReductionOps().end());
  3353.   }
  3354.  
  3355.   helper_expr_const_range copy_ops() const {
  3356.     return helper_expr_const_range(getInscanCopyOps().begin(),
  3357.                                    getInscanCopyOps().end());
  3358.   }
  3359.  
  3360.   helper_expr_range copy_ops() {
  3361.     return helper_expr_range(getInscanCopyOps().begin(),
  3362.                              getInscanCopyOps().end());
  3363.   }
  3364.  
  3365.   helper_expr_const_range copy_array_temps() const {
  3366.     return helper_expr_const_range(getInscanCopyArrayTemps().begin(),
  3367.                                    getInscanCopyArrayTemps().end());
  3368.   }
  3369.  
  3370.   helper_expr_range copy_array_temps() {
  3371.     return helper_expr_range(getInscanCopyArrayTemps().begin(),
  3372.                              getInscanCopyArrayTemps().end());
  3373.   }
  3374.  
  3375.   helper_expr_const_range copy_array_elems() const {
  3376.     return helper_expr_const_range(getInscanCopyArrayElems().begin(),
  3377.                                    getInscanCopyArrayElems().end());
  3378.   }
  3379.  
  3380.   helper_expr_range copy_array_elems() {
  3381.     return helper_expr_range(getInscanCopyArrayElems().begin(),
  3382.                              getInscanCopyArrayElems().end());
  3383.   }
  3384.  
  3385.   child_range children() {
  3386.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  3387.                        reinterpret_cast<Stmt **>(varlist_end()));
  3388.   }
  3389.  
  3390.   const_child_range children() const {
  3391.     auto Children = const_cast<OMPReductionClause *>(this)->children();
  3392.     return const_child_range(Children.begin(), Children.end());
  3393.   }
  3394.  
  3395.   child_range used_children() {
  3396.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  3397.                        reinterpret_cast<Stmt **>(varlist_end()));
  3398.   }
  3399.   const_child_range used_children() const {
  3400.     auto Children = const_cast<OMPReductionClause *>(this)->used_children();
  3401.     return const_child_range(Children.begin(), Children.end());
  3402.   }
  3403.  
  3404.   static bool classof(const OMPClause *T) {
  3405.     return T->getClauseKind() == llvm::omp::OMPC_reduction;
  3406.   }
  3407. };
  3408.  
  3409. /// This represents clause 'task_reduction' in the '#pragma omp taskgroup'
  3410. /// directives.
  3411. ///
  3412. /// \code
  3413. /// #pragma omp taskgroup task_reduction(+:a,b)
  3414. /// \endcode
  3415. /// In this example directive '#pragma omp taskgroup' has clause
  3416. /// 'task_reduction' with operator '+' and the variables 'a' and 'b'.
  3417. class OMPTaskReductionClause final
  3418.     : public OMPVarListClause<OMPTaskReductionClause>,
  3419.       public OMPClauseWithPostUpdate,
  3420.       private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
  3421.   friend class OMPClauseReader;
  3422.   friend OMPVarListClause;
  3423.   friend TrailingObjects;
  3424.  
  3425.   /// Location of ':'.
  3426.   SourceLocation ColonLoc;
  3427.  
  3428.   /// Nested name specifier for C++.
  3429.   NestedNameSpecifierLoc QualifierLoc;
  3430.  
  3431.   /// Name of custom operator.
  3432.   DeclarationNameInfo NameInfo;
  3433.  
  3434.   /// Build clause with number of variables \a N.
  3435.   ///
  3436.   /// \param StartLoc Starting location of the clause.
  3437.   /// \param LParenLoc Location of '('.
  3438.   /// \param EndLoc Ending location of the clause.
  3439.   /// \param ColonLoc Location of ':'.
  3440.   /// \param N Number of the variables in the clause.
  3441.   /// \param QualifierLoc The nested-name qualifier with location information
  3442.   /// \param NameInfo The full name info for reduction identifier.
  3443.   OMPTaskReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  3444.                          SourceLocation ColonLoc, SourceLocation EndLoc,
  3445.                          unsigned N, NestedNameSpecifierLoc QualifierLoc,
  3446.                          const DeclarationNameInfo &NameInfo)
  3447.       : OMPVarListClause<OMPTaskReductionClause>(
  3448.             llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
  3449.         OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
  3450.         QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
  3451.  
  3452.   /// Build an empty clause.
  3453.   ///
  3454.   /// \param N Number of variables.
  3455.   explicit OMPTaskReductionClause(unsigned N)
  3456.       : OMPVarListClause<OMPTaskReductionClause>(
  3457.             llvm::omp::OMPC_task_reduction, SourceLocation(), SourceLocation(),
  3458.             SourceLocation(), N),
  3459.         OMPClauseWithPostUpdate(this) {}
  3460.  
  3461.   /// Sets location of ':' symbol in clause.
  3462.   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
  3463.  
  3464.   /// Sets the name info for specified reduction identifier.
  3465.   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
  3466.  
  3467.   /// Sets the nested name specifier.
  3468.   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
  3469.  
  3470.   /// Set list of helper expressions, required for proper codegen of the clause.
  3471.   /// These expressions represent private copy of the reduction variable.
  3472.   void setPrivates(ArrayRef<Expr *> Privates);
  3473.  
  3474.   /// Get the list of helper privates.
  3475.   MutableArrayRef<Expr *> getPrivates() {
  3476.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  3477.   }
  3478.   ArrayRef<const Expr *> getPrivates() const {
  3479.     return llvm::ArrayRef(varlist_end(), varlist_size());
  3480.   }
  3481.  
  3482.   /// Set list of helper expressions, required for proper codegen of the clause.
  3483.   /// These expressions represent LHS expression in the final reduction
  3484.   /// expression performed by the reduction clause.
  3485.   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
  3486.  
  3487.   /// Get the list of helper LHS expressions.
  3488.   MutableArrayRef<Expr *> getLHSExprs() {
  3489.     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
  3490.   }
  3491.   ArrayRef<const Expr *> getLHSExprs() const {
  3492.     return llvm::ArrayRef(getPrivates().end(), varlist_size());
  3493.   }
  3494.  
  3495.   /// Set list of helper expressions, required for proper codegen of the clause.
  3496.   /// These expressions represent RHS expression in the final reduction
  3497.   /// expression performed by the reduction clause. Also, variables in these
  3498.   /// expressions are used for proper initialization of reduction copies.
  3499.   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
  3500.  
  3501.   ///  Get the list of helper destination expressions.
  3502.   MutableArrayRef<Expr *> getRHSExprs() {
  3503.     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
  3504.   }
  3505.   ArrayRef<const Expr *> getRHSExprs() const {
  3506.     return llvm::ArrayRef(getLHSExprs().end(), varlist_size());
  3507.   }
  3508.  
  3509.   /// Set list of helper reduction expressions, required for proper
  3510.   /// codegen of the clause. These expressions are binary expressions or
  3511.   /// operator/custom reduction call that calculates new value from source
  3512.   /// helper expressions to destination helper expressions.
  3513.   void setReductionOps(ArrayRef<Expr *> ReductionOps);
  3514.  
  3515.   ///  Get the list of helper reduction expressions.
  3516.   MutableArrayRef<Expr *> getReductionOps() {
  3517.     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
  3518.   }
  3519.   ArrayRef<const Expr *> getReductionOps() const {
  3520.     return llvm::ArrayRef(getRHSExprs().end(), varlist_size());
  3521.   }
  3522.  
  3523. public:
  3524.   /// Creates clause with a list of variables \a VL.
  3525.   ///
  3526.   /// \param StartLoc Starting location of the clause.
  3527.   /// \param LParenLoc Location of '('.
  3528.   /// \param ColonLoc Location of ':'.
  3529.   /// \param EndLoc Ending location of the clause.
  3530.   /// \param VL The variables in the clause.
  3531.   /// \param QualifierLoc The nested-name qualifier with location information
  3532.   /// \param NameInfo The full name info for reduction identifier.
  3533.   /// \param Privates List of helper expressions for proper generation of
  3534.   /// private copies.
  3535.   /// \param LHSExprs List of helper expressions for proper generation of
  3536.   /// assignment operation required for copyprivate clause. This list represents
  3537.   /// LHSs of the reduction expressions.
  3538.   /// \param RHSExprs List of helper expressions for proper generation of
  3539.   /// assignment operation required for copyprivate clause. This list represents
  3540.   /// RHSs of the reduction expressions.
  3541.   /// Also, variables in these expressions are used for proper initialization of
  3542.   /// reduction copies.
  3543.   /// \param ReductionOps List of helper expressions that represents reduction
  3544.   /// expressions:
  3545.   /// \code
  3546.   /// LHSExprs binop RHSExprs;
  3547.   /// operator binop(LHSExpr, RHSExpr);
  3548.   /// <CutomReduction>(LHSExpr, RHSExpr);
  3549.   /// \endcode
  3550.   /// Required for proper codegen of final reduction operation performed by the
  3551.   /// reduction clause.
  3552.   /// \param PreInit Statement that must be executed before entering the OpenMP
  3553.   /// region with this clause.
  3554.   /// \param PostUpdate Expression that must be executed after exit from the
  3555.   /// OpenMP region with this clause.
  3556.   static OMPTaskReductionClause *
  3557.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  3558.          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
  3559.          NestedNameSpecifierLoc QualifierLoc,
  3560.          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
  3561.          ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
  3562.          ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
  3563.  
  3564.   /// Creates an empty clause with the place for \a N variables.
  3565.   ///
  3566.   /// \param C AST context.
  3567.   /// \param N The number of variables.
  3568.   static OMPTaskReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
  3569.  
  3570.   /// Gets location of ':' symbol in clause.
  3571.   SourceLocation getColonLoc() const { return ColonLoc; }
  3572.  
  3573.   /// Gets the name info for specified reduction identifier.
  3574.   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
  3575.  
  3576.   /// Gets the nested name specifier.
  3577.   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
  3578.  
  3579.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  3580.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  3581.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  3582.   using helper_expr_const_range =
  3583.       llvm::iterator_range<helper_expr_const_iterator>;
  3584.  
  3585.   helper_expr_const_range privates() const {
  3586.     return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
  3587.   }
  3588.  
  3589.   helper_expr_range privates() {
  3590.     return helper_expr_range(getPrivates().begin(), getPrivates().end());
  3591.   }
  3592.  
  3593.   helper_expr_const_range lhs_exprs() const {
  3594.     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
  3595.   }
  3596.  
  3597.   helper_expr_range lhs_exprs() {
  3598.     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
  3599.   }
  3600.  
  3601.   helper_expr_const_range rhs_exprs() const {
  3602.     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
  3603.   }
  3604.  
  3605.   helper_expr_range rhs_exprs() {
  3606.     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
  3607.   }
  3608.  
  3609.   helper_expr_const_range reduction_ops() const {
  3610.     return helper_expr_const_range(getReductionOps().begin(),
  3611.                                    getReductionOps().end());
  3612.   }
  3613.  
  3614.   helper_expr_range reduction_ops() {
  3615.     return helper_expr_range(getReductionOps().begin(),
  3616.                              getReductionOps().end());
  3617.   }
  3618.  
  3619.   child_range children() {
  3620.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  3621.                        reinterpret_cast<Stmt **>(varlist_end()));
  3622.   }
  3623.  
  3624.   const_child_range children() const {
  3625.     auto Children = const_cast<OMPTaskReductionClause *>(this)->children();
  3626.     return const_child_range(Children.begin(), Children.end());
  3627.   }
  3628.  
  3629.   child_range used_children() {
  3630.     return child_range(child_iterator(), child_iterator());
  3631.   }
  3632.   const_child_range used_children() const {
  3633.     return const_child_range(const_child_iterator(), const_child_iterator());
  3634.   }
  3635.  
  3636.   static bool classof(const OMPClause *T) {
  3637.     return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
  3638.   }
  3639. };
  3640.  
  3641. /// This represents clause 'in_reduction' in the '#pragma omp task' directives.
  3642. ///
  3643. /// \code
  3644. /// #pragma omp task in_reduction(+:a,b)
  3645. /// \endcode
  3646. /// In this example directive '#pragma omp task' has clause 'in_reduction' with
  3647. /// operator '+' and the variables 'a' and 'b'.
  3648. class OMPInReductionClause final
  3649.     : public OMPVarListClause<OMPInReductionClause>,
  3650.       public OMPClauseWithPostUpdate,
  3651.       private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
  3652.   friend class OMPClauseReader;
  3653.   friend OMPVarListClause;
  3654.   friend TrailingObjects;
  3655.  
  3656.   /// Location of ':'.
  3657.   SourceLocation ColonLoc;
  3658.  
  3659.   /// Nested name specifier for C++.
  3660.   NestedNameSpecifierLoc QualifierLoc;
  3661.  
  3662.   /// Name of custom operator.
  3663.   DeclarationNameInfo NameInfo;
  3664.  
  3665.   /// Build clause with number of variables \a N.
  3666.   ///
  3667.   /// \param StartLoc Starting location of the clause.
  3668.   /// \param LParenLoc Location of '('.
  3669.   /// \param EndLoc Ending location of the clause.
  3670.   /// \param ColonLoc Location of ':'.
  3671.   /// \param N Number of the variables in the clause.
  3672.   /// \param QualifierLoc The nested-name qualifier with location information
  3673.   /// \param NameInfo The full name info for reduction identifier.
  3674.   OMPInReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  3675.                        SourceLocation ColonLoc, SourceLocation EndLoc,
  3676.                        unsigned N, NestedNameSpecifierLoc QualifierLoc,
  3677.                        const DeclarationNameInfo &NameInfo)
  3678.       : OMPVarListClause<OMPInReductionClause>(llvm::omp::OMPC_in_reduction,
  3679.                                                StartLoc, LParenLoc, EndLoc, N),
  3680.         OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
  3681.         QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
  3682.  
  3683.   /// Build an empty clause.
  3684.   ///
  3685.   /// \param N Number of variables.
  3686.   explicit OMPInReductionClause(unsigned N)
  3687.       : OMPVarListClause<OMPInReductionClause>(
  3688.             llvm::omp::OMPC_in_reduction, SourceLocation(), SourceLocation(),
  3689.             SourceLocation(), N),
  3690.         OMPClauseWithPostUpdate(this) {}
  3691.  
  3692.   /// Sets location of ':' symbol in clause.
  3693.   void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
  3694.  
  3695.   /// Sets the name info for specified reduction identifier.
  3696.   void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
  3697.  
  3698.   /// Sets the nested name specifier.
  3699.   void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
  3700.  
  3701.   /// Set list of helper expressions, required for proper codegen of the clause.
  3702.   /// These expressions represent private copy of the reduction variable.
  3703.   void setPrivates(ArrayRef<Expr *> Privates);
  3704.  
  3705.   /// Get the list of helper privates.
  3706.   MutableArrayRef<Expr *> getPrivates() {
  3707.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  3708.   }
  3709.   ArrayRef<const Expr *> getPrivates() const {
  3710.     return llvm::ArrayRef(varlist_end(), varlist_size());
  3711.   }
  3712.  
  3713.   /// Set list of helper expressions, required for proper codegen of the clause.
  3714.   /// These expressions represent LHS expression in the final reduction
  3715.   /// expression performed by the reduction clause.
  3716.   void setLHSExprs(ArrayRef<Expr *> LHSExprs);
  3717.  
  3718.   /// Get the list of helper LHS expressions.
  3719.   MutableArrayRef<Expr *> getLHSExprs() {
  3720.     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
  3721.   }
  3722.   ArrayRef<const Expr *> getLHSExprs() const {
  3723.     return llvm::ArrayRef(getPrivates().end(), varlist_size());
  3724.   }
  3725.  
  3726.   /// Set list of helper expressions, required for proper codegen of the clause.
  3727.   /// These expressions represent RHS expression in the final reduction
  3728.   /// expression performed by the reduction clause. Also, variables in these
  3729.   /// expressions are used for proper initialization of reduction copies.
  3730.   void setRHSExprs(ArrayRef<Expr *> RHSExprs);
  3731.  
  3732.   ///  Get the list of helper destination expressions.
  3733.   MutableArrayRef<Expr *> getRHSExprs() {
  3734.     return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
  3735.   }
  3736.   ArrayRef<const Expr *> getRHSExprs() const {
  3737.     return llvm::ArrayRef(getLHSExprs().end(), varlist_size());
  3738.   }
  3739.  
  3740.   /// Set list of helper reduction expressions, required for proper
  3741.   /// codegen of the clause. These expressions are binary expressions or
  3742.   /// operator/custom reduction call that calculates new value from source
  3743.   /// helper expressions to destination helper expressions.
  3744.   void setReductionOps(ArrayRef<Expr *> ReductionOps);
  3745.  
  3746.   ///  Get the list of helper reduction expressions.
  3747.   MutableArrayRef<Expr *> getReductionOps() {
  3748.     return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
  3749.   }
  3750.   ArrayRef<const Expr *> getReductionOps() const {
  3751.     return llvm::ArrayRef(getRHSExprs().end(), varlist_size());
  3752.   }
  3753.  
  3754.   /// Set list of helper reduction taskgroup descriptors.
  3755.   void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
  3756.  
  3757.   ///  Get the list of helper reduction taskgroup descriptors.
  3758.   MutableArrayRef<Expr *> getTaskgroupDescriptors() {
  3759.     return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
  3760.   }
  3761.   ArrayRef<const Expr *> getTaskgroupDescriptors() const {
  3762.     return llvm::ArrayRef(getReductionOps().end(), varlist_size());
  3763.   }
  3764.  
  3765. public:
  3766.   /// Creates clause with a list of variables \a VL.
  3767.   ///
  3768.   /// \param StartLoc Starting location of the clause.
  3769.   /// \param LParenLoc Location of '('.
  3770.   /// \param ColonLoc Location of ':'.
  3771.   /// \param EndLoc Ending location of the clause.
  3772.   /// \param VL The variables in the clause.
  3773.   /// \param QualifierLoc The nested-name qualifier with location information
  3774.   /// \param NameInfo The full name info for reduction identifier.
  3775.   /// \param Privates List of helper expressions for proper generation of
  3776.   /// private copies.
  3777.   /// \param LHSExprs List of helper expressions for proper generation of
  3778.   /// assignment operation required for copyprivate clause. This list represents
  3779.   /// LHSs of the reduction expressions.
  3780.   /// \param RHSExprs List of helper expressions for proper generation of
  3781.   /// assignment operation required for copyprivate clause. This list represents
  3782.   /// RHSs of the reduction expressions.
  3783.   /// Also, variables in these expressions are used for proper initialization of
  3784.   /// reduction copies.
  3785.   /// \param ReductionOps List of helper expressions that represents reduction
  3786.   /// expressions:
  3787.   /// \code
  3788.   /// LHSExprs binop RHSExprs;
  3789.   /// operator binop(LHSExpr, RHSExpr);
  3790.   /// <CutomReduction>(LHSExpr, RHSExpr);
  3791.   /// \endcode
  3792.   /// Required for proper codegen of final reduction operation performed by the
  3793.   /// reduction clause.
  3794.   /// \param TaskgroupDescriptors List of helper taskgroup descriptors for
  3795.   /// corresponding items in parent taskgroup task_reduction clause.
  3796.   /// \param PreInit Statement that must be executed before entering the OpenMP
  3797.   /// region with this clause.
  3798.   /// \param PostUpdate Expression that must be executed after exit from the
  3799.   /// OpenMP region with this clause.
  3800.   static OMPInReductionClause *
  3801.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  3802.          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
  3803.          NestedNameSpecifierLoc QualifierLoc,
  3804.          const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
  3805.          ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
  3806.          ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
  3807.          Stmt *PreInit, Expr *PostUpdate);
  3808.  
  3809.   /// Creates an empty clause with the place for \a N variables.
  3810.   ///
  3811.   /// \param C AST context.
  3812.   /// \param N The number of variables.
  3813.   static OMPInReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
  3814.  
  3815.   /// Gets location of ':' symbol in clause.
  3816.   SourceLocation getColonLoc() const { return ColonLoc; }
  3817.  
  3818.   /// Gets the name info for specified reduction identifier.
  3819.   const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
  3820.  
  3821.   /// Gets the nested name specifier.
  3822.   NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
  3823.  
  3824.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  3825.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  3826.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  3827.   using helper_expr_const_range =
  3828.       llvm::iterator_range<helper_expr_const_iterator>;
  3829.  
  3830.   helper_expr_const_range privates() const {
  3831.     return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
  3832.   }
  3833.  
  3834.   helper_expr_range privates() {
  3835.     return helper_expr_range(getPrivates().begin(), getPrivates().end());
  3836.   }
  3837.  
  3838.   helper_expr_const_range lhs_exprs() const {
  3839.     return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
  3840.   }
  3841.  
  3842.   helper_expr_range lhs_exprs() {
  3843.     return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
  3844.   }
  3845.  
  3846.   helper_expr_const_range rhs_exprs() const {
  3847.     return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
  3848.   }
  3849.  
  3850.   helper_expr_range rhs_exprs() {
  3851.     return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
  3852.   }
  3853.  
  3854.   helper_expr_const_range reduction_ops() const {
  3855.     return helper_expr_const_range(getReductionOps().begin(),
  3856.                                    getReductionOps().end());
  3857.   }
  3858.  
  3859.   helper_expr_range reduction_ops() {
  3860.     return helper_expr_range(getReductionOps().begin(),
  3861.                              getReductionOps().end());
  3862.   }
  3863.  
  3864.   helper_expr_const_range taskgroup_descriptors() const {
  3865.     return helper_expr_const_range(getTaskgroupDescriptors().begin(),
  3866.                                    getTaskgroupDescriptors().end());
  3867.   }
  3868.  
  3869.   helper_expr_range taskgroup_descriptors() {
  3870.     return helper_expr_range(getTaskgroupDescriptors().begin(),
  3871.                              getTaskgroupDescriptors().end());
  3872.   }
  3873.  
  3874.   child_range children() {
  3875.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  3876.                        reinterpret_cast<Stmt **>(varlist_end()));
  3877.   }
  3878.  
  3879.   const_child_range children() const {
  3880.     auto Children = const_cast<OMPInReductionClause *>(this)->children();
  3881.     return const_child_range(Children.begin(), Children.end());
  3882.   }
  3883.  
  3884.   child_range used_children() {
  3885.     return child_range(child_iterator(), child_iterator());
  3886.   }
  3887.   const_child_range used_children() const {
  3888.     return const_child_range(const_child_iterator(), const_child_iterator());
  3889.   }
  3890.  
  3891.   static bool classof(const OMPClause *T) {
  3892.     return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
  3893.   }
  3894. };
  3895.  
  3896. /// This represents clause 'linear' in the '#pragma omp ...'
  3897. /// directives.
  3898. ///
  3899. /// \code
  3900. /// #pragma omp simd linear(a,b : 2)
  3901. /// \endcode
  3902. /// In this example directive '#pragma omp simd' has clause 'linear'
  3903. /// with variables 'a', 'b' and linear step '2'.
  3904. class OMPLinearClause final
  3905.     : public OMPVarListClause<OMPLinearClause>,
  3906.       public OMPClauseWithPostUpdate,
  3907.       private llvm::TrailingObjects<OMPLinearClause, Expr *> {
  3908.   friend class OMPClauseReader;
  3909.   friend OMPVarListClause;
  3910.   friend TrailingObjects;
  3911.  
  3912.   /// Modifier of 'linear' clause.
  3913.   OpenMPLinearClauseKind Modifier = OMPC_LINEAR_val;
  3914.  
  3915.   /// Location of linear modifier if any.
  3916.   SourceLocation ModifierLoc;
  3917.  
  3918.   /// Location of ':'.
  3919.   SourceLocation ColonLoc;
  3920.  
  3921.   /// Sets the linear step for clause.
  3922.   void setStep(Expr *Step) { *(getFinals().end()) = Step; }
  3923.  
  3924.   /// Sets the expression to calculate linear step for clause.
  3925.   void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
  3926.  
  3927.   /// Build 'linear' clause with given number of variables \a NumVars.
  3928.   ///
  3929.   /// \param StartLoc Starting location of the clause.
  3930.   /// \param LParenLoc Location of '('.
  3931.   /// \param ColonLoc Location of ':'.
  3932.   /// \param EndLoc Ending location of the clause.
  3933.   /// \param NumVars Number of variables.
  3934.   OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  3935.                   OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
  3936.                   SourceLocation ColonLoc, SourceLocation EndLoc,
  3937.                   unsigned NumVars)
  3938.       : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear, StartLoc,
  3939.                                           LParenLoc, EndLoc, NumVars),
  3940.         OMPClauseWithPostUpdate(this), Modifier(Modifier),
  3941.         ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
  3942.  
  3943.   /// Build an empty clause.
  3944.   ///
  3945.   /// \param NumVars Number of variables.
  3946.   explicit OMPLinearClause(unsigned NumVars)
  3947.       : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear,
  3948.                                           SourceLocation(), SourceLocation(),
  3949.                                           SourceLocation(), NumVars),
  3950.         OMPClauseWithPostUpdate(this) {}
  3951.  
  3952.   /// Gets the list of initial values for linear variables.
  3953.   ///
  3954.   /// There are NumVars expressions with initial values allocated after the
  3955.   /// varlist, they are followed by NumVars update expressions (used to update
  3956.   /// the linear variable's value on current iteration) and they are followed by
  3957.   /// NumVars final expressions (used to calculate the linear variable's
  3958.   /// value after the loop body). After these lists, there are 2 helper
  3959.   /// expressions - linear step and a helper to calculate it before the
  3960.   /// loop body (used when the linear step is not constant):
  3961.   ///
  3962.   /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
  3963.   /// Finals[]; Step; CalcStep; }
  3964.   MutableArrayRef<Expr *> getPrivates() {
  3965.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  3966.   }
  3967.   ArrayRef<const Expr *> getPrivates() const {
  3968.     return llvm::ArrayRef(varlist_end(), varlist_size());
  3969.   }
  3970.  
  3971.   MutableArrayRef<Expr *> getInits() {
  3972.     return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
  3973.   }
  3974.   ArrayRef<const Expr *> getInits() const {
  3975.     return llvm::ArrayRef(getPrivates().end(), varlist_size());
  3976.   }
  3977.  
  3978.   /// Sets the list of update expressions for linear variables.
  3979.   MutableArrayRef<Expr *> getUpdates() {
  3980.     return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
  3981.   }
  3982.   ArrayRef<const Expr *> getUpdates() const {
  3983.     return llvm::ArrayRef(getInits().end(), varlist_size());
  3984.   }
  3985.  
  3986.   /// Sets the list of final update expressions for linear variables.
  3987.   MutableArrayRef<Expr *> getFinals() {
  3988.     return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
  3989.   }
  3990.   ArrayRef<const Expr *> getFinals() const {
  3991.     return llvm::ArrayRef(getUpdates().end(), varlist_size());
  3992.   }
  3993.  
  3994.   /// Gets the list of used expressions for linear variables.
  3995.   MutableArrayRef<Expr *> getUsedExprs() {
  3996.     return MutableArrayRef<Expr *>(getFinals().end() + 2, varlist_size() + 1);
  3997.   }
  3998.   ArrayRef<const Expr *> getUsedExprs() const {
  3999.     return llvm::ArrayRef(getFinals().end() + 2, varlist_size() + 1);
  4000.   }
  4001.  
  4002.   /// Sets the list of the copies of original linear variables.
  4003.   /// \param PL List of expressions.
  4004.   void setPrivates(ArrayRef<Expr *> PL);
  4005.  
  4006.   /// Sets the list of the initial values for linear variables.
  4007.   /// \param IL List of expressions.
  4008.   void setInits(ArrayRef<Expr *> IL);
  4009.  
  4010. public:
  4011.   /// Creates clause with a list of variables \a VL and a linear step
  4012.   /// \a Step.
  4013.   ///
  4014.   /// \param C AST Context.
  4015.   /// \param StartLoc Starting location of the clause.
  4016.   /// \param LParenLoc Location of '('.
  4017.   /// \param Modifier Modifier of 'linear' clause.
  4018.   /// \param ModifierLoc Modifier location.
  4019.   /// \param ColonLoc Location of ':'.
  4020.   /// \param EndLoc Ending location of the clause.
  4021.   /// \param VL List of references to the variables.
  4022.   /// \param PL List of private copies of original variables.
  4023.   /// \param IL List of initial values for the variables.
  4024.   /// \param Step Linear step.
  4025.   /// \param CalcStep Calculation of the linear step.
  4026.   /// \param PreInit Statement that must be executed before entering the OpenMP
  4027.   /// region with this clause.
  4028.   /// \param PostUpdate Expression that must be executed after exit from the
  4029.   /// OpenMP region with this clause.
  4030.   static OMPLinearClause *
  4031.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  4032.          OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
  4033.          SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
  4034.          ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
  4035.          Stmt *PreInit, Expr *PostUpdate);
  4036.  
  4037.   /// Creates an empty clause with the place for \a NumVars variables.
  4038.   ///
  4039.   /// \param C AST context.
  4040.   /// \param NumVars Number of variables.
  4041.   static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
  4042.  
  4043.   /// Set modifier.
  4044.   void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
  4045.  
  4046.   /// Return modifier.
  4047.   OpenMPLinearClauseKind getModifier() const { return Modifier; }
  4048.  
  4049.   /// Set modifier location.
  4050.   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
  4051.  
  4052.   /// Return modifier location.
  4053.   SourceLocation getModifierLoc() const { return ModifierLoc; }
  4054.  
  4055.   /// Sets the location of ':'.
  4056.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  4057.  
  4058.   /// Returns the location of ':'.
  4059.   SourceLocation getColonLoc() const { return ColonLoc; }
  4060.  
  4061.   /// Returns linear step.
  4062.   Expr *getStep() { return *(getFinals().end()); }
  4063.  
  4064.   /// Returns linear step.
  4065.   const Expr *getStep() const { return *(getFinals().end()); }
  4066.  
  4067.   /// Returns expression to calculate linear step.
  4068.   Expr *getCalcStep() { return *(getFinals().end() + 1); }
  4069.  
  4070.   /// Returns expression to calculate linear step.
  4071.   const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
  4072.  
  4073.   /// Sets the list of update expressions for linear variables.
  4074.   /// \param UL List of expressions.
  4075.   void setUpdates(ArrayRef<Expr *> UL);
  4076.  
  4077.   /// Sets the list of final update expressions for linear variables.
  4078.   /// \param FL List of expressions.
  4079.   void setFinals(ArrayRef<Expr *> FL);
  4080.  
  4081.   /// Sets the list of used expressions for the linear clause.
  4082.   void setUsedExprs(ArrayRef<Expr *> UE);
  4083.  
  4084.   using privates_iterator = MutableArrayRef<Expr *>::iterator;
  4085.   using privates_const_iterator = ArrayRef<const Expr *>::iterator;
  4086.   using privates_range = llvm::iterator_range<privates_iterator>;
  4087.   using privates_const_range = llvm::iterator_range<privates_const_iterator>;
  4088.  
  4089.   privates_range privates() {
  4090.     return privates_range(getPrivates().begin(), getPrivates().end());
  4091.   }
  4092.  
  4093.   privates_const_range privates() const {
  4094.     return privates_const_range(getPrivates().begin(), getPrivates().end());
  4095.   }
  4096.  
  4097.   using inits_iterator = MutableArrayRef<Expr *>::iterator;
  4098.   using inits_const_iterator = ArrayRef<const Expr *>::iterator;
  4099.   using inits_range = llvm::iterator_range<inits_iterator>;
  4100.   using inits_const_range = llvm::iterator_range<inits_const_iterator>;
  4101.  
  4102.   inits_range inits() {
  4103.     return inits_range(getInits().begin(), getInits().end());
  4104.   }
  4105.  
  4106.   inits_const_range inits() const {
  4107.     return inits_const_range(getInits().begin(), getInits().end());
  4108.   }
  4109.  
  4110.   using updates_iterator = MutableArrayRef<Expr *>::iterator;
  4111.   using updates_const_iterator = ArrayRef<const Expr *>::iterator;
  4112.   using updates_range = llvm::iterator_range<updates_iterator>;
  4113.   using updates_const_range = llvm::iterator_range<updates_const_iterator>;
  4114.  
  4115.   updates_range updates() {
  4116.     return updates_range(getUpdates().begin(), getUpdates().end());
  4117.   }
  4118.  
  4119.   updates_const_range updates() const {
  4120.     return updates_const_range(getUpdates().begin(), getUpdates().end());
  4121.   }
  4122.  
  4123.   using finals_iterator = MutableArrayRef<Expr *>::iterator;
  4124.   using finals_const_iterator = ArrayRef<const Expr *>::iterator;
  4125.   using finals_range = llvm::iterator_range<finals_iterator>;
  4126.   using finals_const_range = llvm::iterator_range<finals_const_iterator>;
  4127.  
  4128.   finals_range finals() {
  4129.     return finals_range(getFinals().begin(), getFinals().end());
  4130.   }
  4131.  
  4132.   finals_const_range finals() const {
  4133.     return finals_const_range(getFinals().begin(), getFinals().end());
  4134.   }
  4135.  
  4136.   using used_expressions_iterator = MutableArrayRef<Expr *>::iterator;
  4137.   using used_expressions_const_iterator = ArrayRef<const Expr *>::iterator;
  4138.   using used_expressions_range =
  4139.       llvm::iterator_range<used_expressions_iterator>;
  4140.   using used_expressions_const_range =
  4141.       llvm::iterator_range<used_expressions_const_iterator>;
  4142.  
  4143.   used_expressions_range used_expressions() {
  4144.     return finals_range(getUsedExprs().begin(), getUsedExprs().end());
  4145.   }
  4146.  
  4147.   used_expressions_const_range used_expressions() const {
  4148.     return finals_const_range(getUsedExprs().begin(), getUsedExprs().end());
  4149.   }
  4150.  
  4151.   child_range children() {
  4152.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4153.                        reinterpret_cast<Stmt **>(varlist_end()));
  4154.   }
  4155.  
  4156.   const_child_range children() const {
  4157.     auto Children = const_cast<OMPLinearClause *>(this)->children();
  4158.     return const_child_range(Children.begin(), Children.end());
  4159.   }
  4160.  
  4161.   child_range used_children();
  4162.  
  4163.   const_child_range used_children() const {
  4164.     auto Children = const_cast<OMPLinearClause *>(this)->used_children();
  4165.     return const_child_range(Children.begin(), Children.end());
  4166.   }
  4167.  
  4168.   static bool classof(const OMPClause *T) {
  4169.     return T->getClauseKind() == llvm::omp::OMPC_linear;
  4170.   }
  4171. };
  4172.  
  4173. /// This represents clause 'aligned' in the '#pragma omp ...'
  4174. /// directives.
  4175. ///
  4176. /// \code
  4177. /// #pragma omp simd aligned(a,b : 8)
  4178. /// \endcode
  4179. /// In this example directive '#pragma omp simd' has clause 'aligned'
  4180. /// with variables 'a', 'b' and alignment '8'.
  4181. class OMPAlignedClause final
  4182.     : public OMPVarListClause<OMPAlignedClause>,
  4183.       private llvm::TrailingObjects<OMPAlignedClause, Expr *> {
  4184.   friend class OMPClauseReader;
  4185.   friend OMPVarListClause;
  4186.   friend TrailingObjects;
  4187.  
  4188.   /// Location of ':'.
  4189.   SourceLocation ColonLoc;
  4190.  
  4191.   /// Sets the alignment for clause.
  4192.   void setAlignment(Expr *A) { *varlist_end() = A; }
  4193.  
  4194.   /// Build 'aligned' clause with given number of variables \a NumVars.
  4195.   ///
  4196.   /// \param StartLoc Starting location of the clause.
  4197.   /// \param LParenLoc Location of '('.
  4198.   /// \param ColonLoc Location of ':'.
  4199.   /// \param EndLoc Ending location of the clause.
  4200.   /// \param NumVars Number of variables.
  4201.   OMPAlignedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4202.                    SourceLocation ColonLoc, SourceLocation EndLoc,
  4203.                    unsigned NumVars)
  4204.       : OMPVarListClause<OMPAlignedClause>(llvm::omp::OMPC_aligned, StartLoc,
  4205.                                            LParenLoc, EndLoc, NumVars),
  4206.         ColonLoc(ColonLoc) {}
  4207.  
  4208.   /// Build an empty clause.
  4209.   ///
  4210.   /// \param NumVars Number of variables.
  4211.   explicit OMPAlignedClause(unsigned NumVars)
  4212.       : OMPVarListClause<OMPAlignedClause>(llvm::omp::OMPC_aligned,
  4213.                                            SourceLocation(), SourceLocation(),
  4214.                                            SourceLocation(), NumVars) {}
  4215.  
  4216. public:
  4217.   /// Creates clause with a list of variables \a VL and alignment \a A.
  4218.   ///
  4219.   /// \param C AST Context.
  4220.   /// \param StartLoc Starting location of the clause.
  4221.   /// \param LParenLoc Location of '('.
  4222.   /// \param ColonLoc Location of ':'.
  4223.   /// \param EndLoc Ending location of the clause.
  4224.   /// \param VL List of references to the variables.
  4225.   /// \param A Alignment.
  4226.   static OMPAlignedClause *Create(const ASTContext &C, SourceLocation StartLoc,
  4227.                                   SourceLocation LParenLoc,
  4228.                                   SourceLocation ColonLoc,
  4229.                                   SourceLocation EndLoc, ArrayRef<Expr *> VL,
  4230.                                   Expr *A);
  4231.  
  4232.   /// Creates an empty clause with the place for \a NumVars variables.
  4233.   ///
  4234.   /// \param C AST context.
  4235.   /// \param NumVars Number of variables.
  4236.   static OMPAlignedClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
  4237.  
  4238.   /// Sets the location of ':'.
  4239.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  4240.  
  4241.   /// Returns the location of ':'.
  4242.   SourceLocation getColonLoc() const { return ColonLoc; }
  4243.  
  4244.   /// Returns alignment.
  4245.   Expr *getAlignment() { return *varlist_end(); }
  4246.  
  4247.   /// Returns alignment.
  4248.   const Expr *getAlignment() const { return *varlist_end(); }
  4249.  
  4250.   child_range children() {
  4251.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4252.                        reinterpret_cast<Stmt **>(varlist_end()));
  4253.   }
  4254.  
  4255.   const_child_range children() const {
  4256.     auto Children = const_cast<OMPAlignedClause *>(this)->children();
  4257.     return const_child_range(Children.begin(), Children.end());
  4258.   }
  4259.  
  4260.   child_range used_children() {
  4261.     return child_range(child_iterator(), child_iterator());
  4262.   }
  4263.   const_child_range used_children() const {
  4264.     return const_child_range(const_child_iterator(), const_child_iterator());
  4265.   }
  4266.  
  4267.   static bool classof(const OMPClause *T) {
  4268.     return T->getClauseKind() == llvm::omp::OMPC_aligned;
  4269.   }
  4270. };
  4271.  
  4272. /// This represents clause 'copyin' in the '#pragma omp ...' directives.
  4273. ///
  4274. /// \code
  4275. /// #pragma omp parallel copyin(a,b)
  4276. /// \endcode
  4277. /// In this example directive '#pragma omp parallel' has clause 'copyin'
  4278. /// with the variables 'a' and 'b'.
  4279. class OMPCopyinClause final
  4280.     : public OMPVarListClause<OMPCopyinClause>,
  4281.       private llvm::TrailingObjects<OMPCopyinClause, Expr *> {
  4282.   // Class has 3 additional tail allocated arrays:
  4283.   // 1. List of helper expressions for proper generation of assignment operation
  4284.   // required for copyin clause. This list represents sources.
  4285.   // 2. List of helper expressions for proper generation of assignment operation
  4286.   // required for copyin clause. This list represents destinations.
  4287.   // 3. List of helper expressions that represents assignment operation:
  4288.   // \code
  4289.   // DstExprs = SrcExprs;
  4290.   // \endcode
  4291.   // Required for proper codegen of propagation of master's thread values of
  4292.   // threadprivate variables to local instances of that variables in other
  4293.   // implicit threads.
  4294.  
  4295.   friend class OMPClauseReader;
  4296.   friend OMPVarListClause;
  4297.   friend TrailingObjects;
  4298.  
  4299.   /// Build clause with number of variables \a N.
  4300.   ///
  4301.   /// \param StartLoc Starting location of the clause.
  4302.   /// \param LParenLoc Location of '('.
  4303.   /// \param EndLoc Ending location of the clause.
  4304.   /// \param N Number of the variables in the clause.
  4305.   OMPCopyinClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4306.                   SourceLocation EndLoc, unsigned N)
  4307.       : OMPVarListClause<OMPCopyinClause>(llvm::omp::OMPC_copyin, StartLoc,
  4308.                                           LParenLoc, EndLoc, N) {}
  4309.  
  4310.   /// Build an empty clause.
  4311.   ///
  4312.   /// \param N Number of variables.
  4313.   explicit OMPCopyinClause(unsigned N)
  4314.       : OMPVarListClause<OMPCopyinClause>(llvm::omp::OMPC_copyin,
  4315.                                           SourceLocation(), SourceLocation(),
  4316.                                           SourceLocation(), N) {}
  4317.  
  4318.   /// Set list of helper expressions, required for proper codegen of the
  4319.   /// clause. These expressions represent source expression in the final
  4320.   /// assignment statement performed by the copyin clause.
  4321.   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
  4322.  
  4323.   /// Get the list of helper source expressions.
  4324.   MutableArrayRef<Expr *> getSourceExprs() {
  4325.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  4326.   }
  4327.   ArrayRef<const Expr *> getSourceExprs() const {
  4328.     return llvm::ArrayRef(varlist_end(), varlist_size());
  4329.   }
  4330.  
  4331.   /// Set list of helper expressions, required for proper codegen of the
  4332.   /// clause. These expressions represent destination expression in the final
  4333.   /// assignment statement performed by the copyin clause.
  4334.   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
  4335.  
  4336.   /// Get the list of helper destination expressions.
  4337.   MutableArrayRef<Expr *> getDestinationExprs() {
  4338.     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
  4339.   }
  4340.   ArrayRef<const Expr *> getDestinationExprs() const {
  4341.     return llvm::ArrayRef(getSourceExprs().end(), varlist_size());
  4342.   }
  4343.  
  4344.   /// Set list of helper assignment expressions, required for proper
  4345.   /// codegen of the clause. These expressions are assignment expressions that
  4346.   /// assign source helper expressions to destination helper expressions
  4347.   /// correspondingly.
  4348.   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
  4349.  
  4350.   /// Get the list of helper assignment expressions.
  4351.   MutableArrayRef<Expr *> getAssignmentOps() {
  4352.     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
  4353.   }
  4354.   ArrayRef<const Expr *> getAssignmentOps() const {
  4355.     return llvm::ArrayRef(getDestinationExprs().end(), varlist_size());
  4356.   }
  4357.  
  4358. public:
  4359.   /// Creates clause with a list of variables \a VL.
  4360.   ///
  4361.   /// \param C AST context.
  4362.   /// \param StartLoc Starting location of the clause.
  4363.   /// \param LParenLoc Location of '('.
  4364.   /// \param EndLoc Ending location of the clause.
  4365.   /// \param VL List of references to the variables.
  4366.   /// \param SrcExprs List of helper expressions for proper generation of
  4367.   /// assignment operation required for copyin clause. This list represents
  4368.   /// sources.
  4369.   /// \param DstExprs List of helper expressions for proper generation of
  4370.   /// assignment operation required for copyin clause. This list represents
  4371.   /// destinations.
  4372.   /// \param AssignmentOps List of helper expressions that represents assignment
  4373.   /// operation:
  4374.   /// \code
  4375.   /// DstExprs = SrcExprs;
  4376.   /// \endcode
  4377.   /// Required for proper codegen of propagation of master's thread values of
  4378.   /// threadprivate variables to local instances of that variables in other
  4379.   /// implicit threads.
  4380.   static OMPCopyinClause *
  4381.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  4382.          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
  4383.          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
  4384.  
  4385.   /// Creates an empty clause with \a N variables.
  4386.   ///
  4387.   /// \param C AST context.
  4388.   /// \param N The number of variables.
  4389.   static OMPCopyinClause *CreateEmpty(const ASTContext &C, unsigned N);
  4390.  
  4391.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  4392.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  4393.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  4394.   using helper_expr_const_range =
  4395.       llvm::iterator_range<helper_expr_const_iterator>;
  4396.  
  4397.   helper_expr_const_range source_exprs() const {
  4398.     return helper_expr_const_range(getSourceExprs().begin(),
  4399.                                    getSourceExprs().end());
  4400.   }
  4401.  
  4402.   helper_expr_range source_exprs() {
  4403.     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
  4404.   }
  4405.  
  4406.   helper_expr_const_range destination_exprs() const {
  4407.     return helper_expr_const_range(getDestinationExprs().begin(),
  4408.                                    getDestinationExprs().end());
  4409.   }
  4410.  
  4411.   helper_expr_range destination_exprs() {
  4412.     return helper_expr_range(getDestinationExprs().begin(),
  4413.                              getDestinationExprs().end());
  4414.   }
  4415.  
  4416.   helper_expr_const_range assignment_ops() const {
  4417.     return helper_expr_const_range(getAssignmentOps().begin(),
  4418.                                    getAssignmentOps().end());
  4419.   }
  4420.  
  4421.   helper_expr_range assignment_ops() {
  4422.     return helper_expr_range(getAssignmentOps().begin(),
  4423.                              getAssignmentOps().end());
  4424.   }
  4425.  
  4426.   child_range children() {
  4427.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4428.                        reinterpret_cast<Stmt **>(varlist_end()));
  4429.   }
  4430.  
  4431.   const_child_range children() const {
  4432.     auto Children = const_cast<OMPCopyinClause *>(this)->children();
  4433.     return const_child_range(Children.begin(), Children.end());
  4434.   }
  4435.  
  4436.   child_range used_children() {
  4437.     return child_range(child_iterator(), child_iterator());
  4438.   }
  4439.   const_child_range used_children() const {
  4440.     return const_child_range(const_child_iterator(), const_child_iterator());
  4441.   }
  4442.  
  4443.   static bool classof(const OMPClause *T) {
  4444.     return T->getClauseKind() == llvm::omp::OMPC_copyin;
  4445.   }
  4446. };
  4447.  
  4448. /// This represents clause 'copyprivate' in the '#pragma omp ...'
  4449. /// directives.
  4450. ///
  4451. /// \code
  4452. /// #pragma omp single copyprivate(a,b)
  4453. /// \endcode
  4454. /// In this example directive '#pragma omp single' has clause 'copyprivate'
  4455. /// with the variables 'a' and 'b'.
  4456. class OMPCopyprivateClause final
  4457.     : public OMPVarListClause<OMPCopyprivateClause>,
  4458.       private llvm::TrailingObjects<OMPCopyprivateClause, Expr *> {
  4459.   friend class OMPClauseReader;
  4460.   friend OMPVarListClause;
  4461.   friend TrailingObjects;
  4462.  
  4463.   /// Build clause with number of variables \a N.
  4464.   ///
  4465.   /// \param StartLoc Starting location of the clause.
  4466.   /// \param LParenLoc Location of '('.
  4467.   /// \param EndLoc Ending location of the clause.
  4468.   /// \param N Number of the variables in the clause.
  4469.   OMPCopyprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4470.                        SourceLocation EndLoc, unsigned N)
  4471.       : OMPVarListClause<OMPCopyprivateClause>(llvm::omp::OMPC_copyprivate,
  4472.                                                StartLoc, LParenLoc, EndLoc, N) {
  4473.   }
  4474.  
  4475.   /// Build an empty clause.
  4476.   ///
  4477.   /// \param N Number of variables.
  4478.   explicit OMPCopyprivateClause(unsigned N)
  4479.       : OMPVarListClause<OMPCopyprivateClause>(
  4480.             llvm::omp::OMPC_copyprivate, SourceLocation(), SourceLocation(),
  4481.             SourceLocation(), N) {}
  4482.  
  4483.   /// Set list of helper expressions, required for proper codegen of the
  4484.   /// clause. These expressions represent source expression in the final
  4485.   /// assignment statement performed by the copyprivate clause.
  4486.   void setSourceExprs(ArrayRef<Expr *> SrcExprs);
  4487.  
  4488.   /// Get the list of helper source expressions.
  4489.   MutableArrayRef<Expr *> getSourceExprs() {
  4490.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  4491.   }
  4492.   ArrayRef<const Expr *> getSourceExprs() const {
  4493.     return llvm::ArrayRef(varlist_end(), varlist_size());
  4494.   }
  4495.  
  4496.   /// Set list of helper expressions, required for proper codegen of the
  4497.   /// clause. These expressions represent destination expression in the final
  4498.   /// assignment statement performed by the copyprivate clause.
  4499.   void setDestinationExprs(ArrayRef<Expr *> DstExprs);
  4500.  
  4501.   /// Get the list of helper destination expressions.
  4502.   MutableArrayRef<Expr *> getDestinationExprs() {
  4503.     return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
  4504.   }
  4505.   ArrayRef<const Expr *> getDestinationExprs() const {
  4506.     return llvm::ArrayRef(getSourceExprs().end(), varlist_size());
  4507.   }
  4508.  
  4509.   /// Set list of helper assignment expressions, required for proper
  4510.   /// codegen of the clause. These expressions are assignment expressions that
  4511.   /// assign source helper expressions to destination helper expressions
  4512.   /// correspondingly.
  4513.   void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
  4514.  
  4515.   /// Get the list of helper assignment expressions.
  4516.   MutableArrayRef<Expr *> getAssignmentOps() {
  4517.     return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
  4518.   }
  4519.   ArrayRef<const Expr *> getAssignmentOps() const {
  4520.     return llvm::ArrayRef(getDestinationExprs().end(), varlist_size());
  4521.   }
  4522.  
  4523. public:
  4524.   /// Creates clause with a list of variables \a VL.
  4525.   ///
  4526.   /// \param C AST context.
  4527.   /// \param StartLoc Starting location of the clause.
  4528.   /// \param LParenLoc Location of '('.
  4529.   /// \param EndLoc Ending location of the clause.
  4530.   /// \param VL List of references to the variables.
  4531.   /// \param SrcExprs List of helper expressions for proper generation of
  4532.   /// assignment operation required for copyprivate clause. This list represents
  4533.   /// sources.
  4534.   /// \param DstExprs List of helper expressions for proper generation of
  4535.   /// assignment operation required for copyprivate clause. This list represents
  4536.   /// destinations.
  4537.   /// \param AssignmentOps List of helper expressions that represents assignment
  4538.   /// operation:
  4539.   /// \code
  4540.   /// DstExprs = SrcExprs;
  4541.   /// \endcode
  4542.   /// Required for proper codegen of final assignment performed by the
  4543.   /// copyprivate clause.
  4544.   static OMPCopyprivateClause *
  4545.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  4546.          SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
  4547.          ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps);
  4548.  
  4549.   /// Creates an empty clause with \a N variables.
  4550.   ///
  4551.   /// \param C AST context.
  4552.   /// \param N The number of variables.
  4553.   static OMPCopyprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
  4554.  
  4555.   using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
  4556.   using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
  4557.   using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
  4558.   using helper_expr_const_range =
  4559.       llvm::iterator_range<helper_expr_const_iterator>;
  4560.  
  4561.   helper_expr_const_range source_exprs() const {
  4562.     return helper_expr_const_range(getSourceExprs().begin(),
  4563.                                    getSourceExprs().end());
  4564.   }
  4565.  
  4566.   helper_expr_range source_exprs() {
  4567.     return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
  4568.   }
  4569.  
  4570.   helper_expr_const_range destination_exprs() const {
  4571.     return helper_expr_const_range(getDestinationExprs().begin(),
  4572.                                    getDestinationExprs().end());
  4573.   }
  4574.  
  4575.   helper_expr_range destination_exprs() {
  4576.     return helper_expr_range(getDestinationExprs().begin(),
  4577.                              getDestinationExprs().end());
  4578.   }
  4579.  
  4580.   helper_expr_const_range assignment_ops() const {
  4581.     return helper_expr_const_range(getAssignmentOps().begin(),
  4582.                                    getAssignmentOps().end());
  4583.   }
  4584.  
  4585.   helper_expr_range assignment_ops() {
  4586.     return helper_expr_range(getAssignmentOps().begin(),
  4587.                              getAssignmentOps().end());
  4588.   }
  4589.  
  4590.   child_range children() {
  4591.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4592.                        reinterpret_cast<Stmt **>(varlist_end()));
  4593.   }
  4594.  
  4595.   const_child_range children() const {
  4596.     auto Children = const_cast<OMPCopyprivateClause *>(this)->children();
  4597.     return const_child_range(Children.begin(), Children.end());
  4598.   }
  4599.  
  4600.   child_range used_children() {
  4601.     return child_range(child_iterator(), child_iterator());
  4602.   }
  4603.   const_child_range used_children() const {
  4604.     return const_child_range(const_child_iterator(), const_child_iterator());
  4605.   }
  4606.  
  4607.   static bool classof(const OMPClause *T) {
  4608.     return T->getClauseKind() == llvm::omp::OMPC_copyprivate;
  4609.   }
  4610. };
  4611.  
  4612. /// This represents implicit clause 'flush' for the '#pragma omp flush'
  4613. /// directive.
  4614. /// This clause does not exist by itself, it can be only as a part of 'omp
  4615. /// flush' directive. This clause is introduced to keep the original structure
  4616. /// of \a OMPExecutableDirective class and its derivatives and to use the
  4617. /// existing infrastructure of clauses with the list of variables.
  4618. ///
  4619. /// \code
  4620. /// #pragma omp flush(a,b)
  4621. /// \endcode
  4622. /// In this example directive '#pragma omp flush' has implicit clause 'flush'
  4623. /// with the variables 'a' and 'b'.
  4624. class OMPFlushClause final
  4625.     : public OMPVarListClause<OMPFlushClause>,
  4626.       private llvm::TrailingObjects<OMPFlushClause, Expr *> {
  4627.   friend OMPVarListClause;
  4628.   friend TrailingObjects;
  4629.  
  4630.   /// Build clause with number of variables \a N.
  4631.   ///
  4632.   /// \param StartLoc Starting location of the clause.
  4633.   /// \param LParenLoc Location of '('.
  4634.   /// \param EndLoc Ending location of the clause.
  4635.   /// \param N Number of the variables in the clause.
  4636.   OMPFlushClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4637.                  SourceLocation EndLoc, unsigned N)
  4638.       : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush, StartLoc,
  4639.                                          LParenLoc, EndLoc, N) {}
  4640.  
  4641.   /// Build an empty clause.
  4642.   ///
  4643.   /// \param N Number of variables.
  4644.   explicit OMPFlushClause(unsigned N)
  4645.       : OMPVarListClause<OMPFlushClause>(llvm::omp::OMPC_flush,
  4646.                                          SourceLocation(), SourceLocation(),
  4647.                                          SourceLocation(), N) {}
  4648.  
  4649. public:
  4650.   /// Creates clause with a list of variables \a VL.
  4651.   ///
  4652.   /// \param C AST context.
  4653.   /// \param StartLoc Starting location of the clause.
  4654.   /// \param LParenLoc Location of '('.
  4655.   /// \param EndLoc Ending location of the clause.
  4656.   /// \param VL List of references to the variables.
  4657.   static OMPFlushClause *Create(const ASTContext &C, SourceLocation StartLoc,
  4658.                                 SourceLocation LParenLoc, SourceLocation EndLoc,
  4659.                                 ArrayRef<Expr *> VL);
  4660.  
  4661.   /// Creates an empty clause with \a N variables.
  4662.   ///
  4663.   /// \param C AST context.
  4664.   /// \param N The number of variables.
  4665.   static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N);
  4666.  
  4667.   child_range children() {
  4668.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4669.                        reinterpret_cast<Stmt **>(varlist_end()));
  4670.   }
  4671.  
  4672.   const_child_range children() const {
  4673.     auto Children = const_cast<OMPFlushClause *>(this)->children();
  4674.     return const_child_range(Children.begin(), Children.end());
  4675.   }
  4676.  
  4677.   child_range used_children() {
  4678.     return child_range(child_iterator(), child_iterator());
  4679.   }
  4680.   const_child_range used_children() const {
  4681.     return const_child_range(const_child_iterator(), const_child_iterator());
  4682.   }
  4683.  
  4684.   static bool classof(const OMPClause *T) {
  4685.     return T->getClauseKind() == llvm::omp::OMPC_flush;
  4686.   }
  4687. };
  4688.  
  4689. /// This represents implicit clause 'depobj' for the '#pragma omp depobj'
  4690. /// directive.
  4691. /// This clause does not exist by itself, it can be only as a part of 'omp
  4692. /// depobj' directive. This clause is introduced to keep the original structure
  4693. /// of \a OMPExecutableDirective class and its derivatives and to use the
  4694. /// existing infrastructure of clauses with the list of variables.
  4695. ///
  4696. /// \code
  4697. /// #pragma omp depobj(a) destroy
  4698. /// \endcode
  4699. /// In this example directive '#pragma omp depobj' has implicit clause 'depobj'
  4700. /// with the depobj 'a'.
  4701. class OMPDepobjClause final : public OMPClause {
  4702.   friend class OMPClauseReader;
  4703.  
  4704.   /// Location of '('.
  4705.   SourceLocation LParenLoc;
  4706.  
  4707.   /// Chunk size.
  4708.   Expr *Depobj = nullptr;
  4709.  
  4710.   /// Build clause with number of variables \a N.
  4711.   ///
  4712.   /// \param StartLoc Starting location of the clause.
  4713.   /// \param LParenLoc Location of '('.
  4714.   /// \param EndLoc Ending location of the clause.
  4715.   OMPDepobjClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4716.                   SourceLocation EndLoc)
  4717.       : OMPClause(llvm::omp::OMPC_depobj, StartLoc, EndLoc),
  4718.         LParenLoc(LParenLoc) {}
  4719.  
  4720.   /// Build an empty clause.
  4721.   ///
  4722.   explicit OMPDepobjClause()
  4723.       : OMPClause(llvm::omp::OMPC_depobj, SourceLocation(), SourceLocation()) {}
  4724.  
  4725.   void setDepobj(Expr *E) { Depobj = E; }
  4726.  
  4727.   /// Sets the location of '('.
  4728.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  4729.  
  4730. public:
  4731.   /// Creates clause.
  4732.   ///
  4733.   /// \param C AST context.
  4734.   /// \param StartLoc Starting location of the clause.
  4735.   /// \param LParenLoc Location of '('.
  4736.   /// \param EndLoc Ending location of the clause.
  4737.   /// \param Depobj depobj expression associated with the 'depobj' directive.
  4738.   static OMPDepobjClause *Create(const ASTContext &C, SourceLocation StartLoc,
  4739.                                  SourceLocation LParenLoc,
  4740.                                  SourceLocation EndLoc, Expr *Depobj);
  4741.  
  4742.   /// Creates an empty clause.
  4743.   ///
  4744.   /// \param C AST context.
  4745.   static OMPDepobjClause *CreateEmpty(const ASTContext &C);
  4746.  
  4747.   /// Returns depobj expression associated with the clause.
  4748.   Expr *getDepobj() { return Depobj; }
  4749.   const Expr *getDepobj() const { return Depobj; }
  4750.  
  4751.   /// Returns the location of '('.
  4752.   SourceLocation getLParenLoc() const { return LParenLoc; }
  4753.  
  4754.   child_range children() {
  4755.     return child_range(reinterpret_cast<Stmt **>(&Depobj),
  4756.                        reinterpret_cast<Stmt **>(&Depobj) + 1);
  4757.   }
  4758.  
  4759.   const_child_range children() const {
  4760.     auto Children = const_cast<OMPDepobjClause *>(this)->children();
  4761.     return const_child_range(Children.begin(), Children.end());
  4762.   }
  4763.  
  4764.   child_range used_children() {
  4765.     return child_range(child_iterator(), child_iterator());
  4766.   }
  4767.   const_child_range used_children() const {
  4768.     return const_child_range(const_child_iterator(), const_child_iterator());
  4769.   }
  4770.  
  4771.   static bool classof(const OMPClause *T) {
  4772.     return T->getClauseKind() == llvm::omp::OMPC_depobj;
  4773.   }
  4774. };
  4775.  
  4776. /// This represents implicit clause 'depend' for the '#pragma omp task'
  4777. /// directive.
  4778. ///
  4779. /// \code
  4780. /// #pragma omp task depend(in:a,b)
  4781. /// \endcode
  4782. /// In this example directive '#pragma omp task' with clause 'depend' with the
  4783. /// variables 'a' and 'b' with dependency 'in'.
  4784. class OMPDependClause final
  4785.     : public OMPVarListClause<OMPDependClause>,
  4786.       private llvm::TrailingObjects<OMPDependClause, Expr *> {
  4787.   friend class OMPClauseReader;
  4788.   friend OMPVarListClause;
  4789.   friend TrailingObjects;
  4790.  
  4791. public:
  4792.   struct DependDataTy final {
  4793.     /// Dependency type (one of in, out, inout).
  4794.     OpenMPDependClauseKind DepKind = OMPC_DEPEND_unknown;
  4795.  
  4796.     /// Dependency type location.
  4797.     SourceLocation DepLoc;
  4798.  
  4799.     /// Colon location.
  4800.     SourceLocation ColonLoc;
  4801.  
  4802.     /// Location of 'omp_all_memory'.
  4803.     SourceLocation OmpAllMemoryLoc;
  4804.   };
  4805.  
  4806. private:
  4807.   /// Dependency type and source locations.
  4808.   DependDataTy Data;
  4809.  
  4810.   /// Number of loops, associated with the depend clause.
  4811.   unsigned NumLoops = 0;
  4812.  
  4813.   /// Build clause with number of variables \a N.
  4814.   ///
  4815.   /// \param StartLoc Starting location of the clause.
  4816.   /// \param LParenLoc Location of '('.
  4817.   /// \param EndLoc Ending location of the clause.
  4818.   /// \param N Number of the variables in the clause.
  4819.   /// \param NumLoops Number of loops that is associated with this depend
  4820.   /// clause.
  4821.   OMPDependClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  4822.                   SourceLocation EndLoc, unsigned N, unsigned NumLoops)
  4823.       : OMPVarListClause<OMPDependClause>(llvm::omp::OMPC_depend, StartLoc,
  4824.                                           LParenLoc, EndLoc, N),
  4825.         NumLoops(NumLoops) {}
  4826.  
  4827.   /// Build an empty clause.
  4828.   ///
  4829.   /// \param N Number of variables.
  4830.   /// \param NumLoops Number of loops that is associated with this depend
  4831.   /// clause.
  4832.   explicit OMPDependClause(unsigned N, unsigned NumLoops)
  4833.       : OMPVarListClause<OMPDependClause>(llvm::omp::OMPC_depend,
  4834.                                           SourceLocation(), SourceLocation(),
  4835.                                           SourceLocation(), N),
  4836.         NumLoops(NumLoops) {}
  4837.  
  4838.   /// Set dependency kind.
  4839.   void setDependencyKind(OpenMPDependClauseKind K) { Data.DepKind = K; }
  4840.  
  4841.   /// Set dependency kind and its location.
  4842.   void setDependencyLoc(SourceLocation Loc) { Data.DepLoc = Loc; }
  4843.  
  4844.   /// Set colon location.
  4845.   void setColonLoc(SourceLocation Loc) { Data.ColonLoc = Loc; }
  4846.  
  4847.   /// Set the 'omp_all_memory' location.
  4848.   void setOmpAllMemoryLoc(SourceLocation Loc) { Data.OmpAllMemoryLoc = Loc; }
  4849.  
  4850.   /// Sets optional dependency modifier.
  4851.   void setModifier(Expr *DepModifier);
  4852.  
  4853. public:
  4854.   /// Creates clause with a list of variables \a VL.
  4855.   ///
  4856.   /// \param C AST context.
  4857.   /// \param StartLoc Starting location of the clause.
  4858.   /// \param LParenLoc Location of '('.
  4859.   /// \param EndLoc Ending location of the clause.
  4860.   /// \param Data Dependency type and source locations.
  4861.   /// \param VL List of references to the variables.
  4862.   /// \param NumLoops Number of loops that is associated with this depend
  4863.   /// clause.
  4864.   static OMPDependClause *Create(const ASTContext &C, SourceLocation StartLoc,
  4865.                                  SourceLocation LParenLoc,
  4866.                                  SourceLocation EndLoc, DependDataTy Data,
  4867.                                  Expr *DepModifier, ArrayRef<Expr *> VL,
  4868.                                  unsigned NumLoops);
  4869.  
  4870.   /// Creates an empty clause with \a N variables.
  4871.   ///
  4872.   /// \param C AST context.
  4873.   /// \param N The number of variables.
  4874.   /// \param NumLoops Number of loops that is associated with this depend
  4875.   /// clause.
  4876.   static OMPDependClause *CreateEmpty(const ASTContext &C, unsigned N,
  4877.                                       unsigned NumLoops);
  4878.  
  4879.   /// Get dependency type.
  4880.   OpenMPDependClauseKind getDependencyKind() const { return Data.DepKind; }
  4881.  
  4882.   /// Get dependency type location.
  4883.   SourceLocation getDependencyLoc() const { return Data.DepLoc; }
  4884.  
  4885.   /// Get colon location.
  4886.   SourceLocation getColonLoc() const { return Data.ColonLoc; }
  4887.  
  4888.   /// Get 'omp_all_memory' location.
  4889.   SourceLocation getOmpAllMemoryLoc() const { return Data.OmpAllMemoryLoc; }
  4890.  
  4891.   /// Return optional depend modifier.
  4892.   Expr *getModifier();
  4893.   const Expr *getModifier() const {
  4894.     return const_cast<OMPDependClause *>(this)->getModifier();
  4895.   }
  4896.  
  4897.   /// Get number of loops associated with the clause.
  4898.   unsigned getNumLoops() const { return NumLoops; }
  4899.  
  4900.   /// Set the loop data for the depend clauses with 'sink|source' kind of
  4901.   /// dependency.
  4902.   void setLoopData(unsigned NumLoop, Expr *Cnt);
  4903.  
  4904.   /// Get the loop data.
  4905.   Expr *getLoopData(unsigned NumLoop);
  4906.   const Expr *getLoopData(unsigned NumLoop) const;
  4907.  
  4908.   child_range children() {
  4909.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  4910.                        reinterpret_cast<Stmt **>(varlist_end()));
  4911.   }
  4912.  
  4913.   const_child_range children() const {
  4914.     auto Children = const_cast<OMPDependClause *>(this)->children();
  4915.     return const_child_range(Children.begin(), Children.end());
  4916.   }
  4917.  
  4918.   child_range used_children() {
  4919.     return child_range(child_iterator(), child_iterator());
  4920.   }
  4921.   const_child_range used_children() const {
  4922.     return const_child_range(const_child_iterator(), const_child_iterator());
  4923.   }
  4924.  
  4925.   static bool classof(const OMPClause *T) {
  4926.     return T->getClauseKind() == llvm::omp::OMPC_depend;
  4927.   }
  4928. };
  4929.  
  4930. /// This represents 'device' clause in the '#pragma omp ...'
  4931. /// directive.
  4932. ///
  4933. /// \code
  4934. /// #pragma omp target device(a)
  4935. /// \endcode
  4936. /// In this example directive '#pragma omp target' has clause 'device'
  4937. /// with single expression 'a'.
  4938. class OMPDeviceClause : public OMPClause, public OMPClauseWithPreInit {
  4939.   friend class OMPClauseReader;
  4940.  
  4941.   /// Location of '('.
  4942.   SourceLocation LParenLoc;
  4943.  
  4944.   /// Device clause modifier.
  4945.   OpenMPDeviceClauseModifier Modifier = OMPC_DEVICE_unknown;
  4946.  
  4947.   /// Location of the modifier.
  4948.   SourceLocation ModifierLoc;
  4949.  
  4950.   /// Device number.
  4951.   Stmt *Device = nullptr;
  4952.  
  4953.   /// Set the device number.
  4954.   ///
  4955.   /// \param E Device number.
  4956.   void setDevice(Expr *E) { Device = E; }
  4957.  
  4958.   /// Sets modifier.
  4959.   void setModifier(OpenMPDeviceClauseModifier M) { Modifier = M; }
  4960.  
  4961.   /// Setst modifier location.
  4962.   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
  4963.  
  4964. public:
  4965.   /// Build 'device' clause.
  4966.   ///
  4967.   /// \param Modifier Clause modifier.
  4968.   /// \param E Expression associated with this clause.
  4969.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  4970.   /// clause must be captured.
  4971.   /// \param StartLoc Starting location of the clause.
  4972.   /// \param ModifierLoc Modifier location.
  4973.   /// \param LParenLoc Location of '('.
  4974.   /// \param EndLoc Ending location of the clause.
  4975.   OMPDeviceClause(OpenMPDeviceClauseModifier Modifier, Expr *E, Stmt *HelperE,
  4976.                   OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  4977.                   SourceLocation LParenLoc, SourceLocation ModifierLoc,
  4978.                   SourceLocation EndLoc)
  4979.       : OMPClause(llvm::omp::OMPC_device, StartLoc, EndLoc),
  4980.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier),
  4981.         ModifierLoc(ModifierLoc), Device(E) {
  4982.     setPreInitStmt(HelperE, CaptureRegion);
  4983.   }
  4984.  
  4985.   /// Build an empty clause.
  4986.   OMPDeviceClause()
  4987.       : OMPClause(llvm::omp::OMPC_device, SourceLocation(), SourceLocation()),
  4988.         OMPClauseWithPreInit(this) {}
  4989.  
  4990.   /// Sets the location of '('.
  4991.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  4992.  
  4993.   /// Returns the location of '('.
  4994.   SourceLocation getLParenLoc() const { return LParenLoc; }
  4995.  
  4996.   /// Return device number.
  4997.   Expr *getDevice() { return cast<Expr>(Device); }
  4998.  
  4999.   /// Return device number.
  5000.   Expr *getDevice() const { return cast<Expr>(Device); }
  5001.  
  5002.   /// Gets modifier.
  5003.   OpenMPDeviceClauseModifier getModifier() const { return Modifier; }
  5004.  
  5005.   /// Gets modifier location.
  5006.   SourceLocation getModifierLoc() const { return ModifierLoc; }
  5007.  
  5008.   child_range children() { return child_range(&Device, &Device + 1); }
  5009.  
  5010.   const_child_range children() const {
  5011.     return const_child_range(&Device, &Device + 1);
  5012.   }
  5013.  
  5014.   child_range used_children() {
  5015.     return child_range(child_iterator(), child_iterator());
  5016.   }
  5017.   const_child_range used_children() const {
  5018.     return const_child_range(const_child_iterator(), const_child_iterator());
  5019.   }
  5020.  
  5021.   static bool classof(const OMPClause *T) {
  5022.     return T->getClauseKind() == llvm::omp::OMPC_device;
  5023.   }
  5024. };
  5025.  
  5026. /// This represents 'threads' clause in the '#pragma omp ...' directive.
  5027. ///
  5028. /// \code
  5029. /// #pragma omp ordered threads
  5030. /// \endcode
  5031. /// In this example directive '#pragma omp ordered' has simple 'threads' clause.
  5032. class OMPThreadsClause final
  5033.     : public OMPNoChildClause<llvm::omp::OMPC_threads> {
  5034. public:
  5035.   /// Build 'threads' clause.
  5036.   ///
  5037.   /// \param StartLoc Starting location of the clause.
  5038.   /// \param EndLoc Ending location of the clause.
  5039.   OMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc)
  5040.       : OMPNoChildClause(StartLoc, EndLoc) {}
  5041.  
  5042.   /// Build an empty clause.
  5043.   OMPThreadsClause() : OMPNoChildClause() {}
  5044. };
  5045.  
  5046. /// This represents 'simd' clause in the '#pragma omp ...' directive.
  5047. ///
  5048. /// \code
  5049. /// #pragma omp ordered simd
  5050. /// \endcode
  5051. /// In this example directive '#pragma omp ordered' has simple 'simd' clause.
  5052. class OMPSIMDClause : public OMPClause {
  5053. public:
  5054.   /// Build 'simd' clause.
  5055.   ///
  5056.   /// \param StartLoc Starting location of the clause.
  5057.   /// \param EndLoc Ending location of the clause.
  5058.   OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc)
  5059.       : OMPClause(llvm::omp::OMPC_simd, StartLoc, EndLoc) {}
  5060.  
  5061.   /// Build an empty clause.
  5062.   OMPSIMDClause()
  5063.       : OMPClause(llvm::omp::OMPC_simd, SourceLocation(), SourceLocation()) {}
  5064.  
  5065.   child_range children() {
  5066.     return child_range(child_iterator(), child_iterator());
  5067.   }
  5068.  
  5069.   const_child_range children() const {
  5070.     return const_child_range(const_child_iterator(), const_child_iterator());
  5071.   }
  5072.  
  5073.   child_range used_children() {
  5074.     return child_range(child_iterator(), child_iterator());
  5075.   }
  5076.   const_child_range used_children() const {
  5077.     return const_child_range(const_child_iterator(), const_child_iterator());
  5078.   }
  5079.  
  5080.   static bool classof(const OMPClause *T) {
  5081.     return T->getClauseKind() == llvm::omp::OMPC_simd;
  5082.   }
  5083. };
  5084.  
  5085. /// Struct that defines common infrastructure to handle mappable
  5086. /// expressions used in OpenMP clauses.
  5087. class OMPClauseMappableExprCommon {
  5088. public:
  5089.   /// Class that represents a component of a mappable expression. E.g.
  5090.   /// for an expression S.a, the first component is a declaration reference
  5091.   /// expression associated with 'S' and the second is a member expression
  5092.   /// associated with the field declaration 'a'. If the expression is an array
  5093.   /// subscript it may not have any associated declaration. In that case the
  5094.   /// associated declaration is set to nullptr.
  5095.   class MappableComponent {
  5096.     /// Pair of Expression and Non-contiguous pair  associated with the
  5097.     /// component.
  5098.     llvm::PointerIntPair<Expr *, 1, bool> AssociatedExpressionNonContiguousPr;
  5099.  
  5100.     /// Declaration associated with the declaration. If the component does
  5101.     /// not have a declaration (e.g. array subscripts or section), this is set
  5102.     /// to nullptr.
  5103.     ValueDecl *AssociatedDeclaration = nullptr;
  5104.  
  5105.   public:
  5106.     explicit MappableComponent() = default;
  5107.     explicit MappableComponent(Expr *AssociatedExpression,
  5108.                                ValueDecl *AssociatedDeclaration,
  5109.                                bool IsNonContiguous)
  5110.         : AssociatedExpressionNonContiguousPr(AssociatedExpression,
  5111.                                               IsNonContiguous),
  5112.           AssociatedDeclaration(
  5113.               AssociatedDeclaration
  5114.                   ? cast<ValueDecl>(AssociatedDeclaration->getCanonicalDecl())
  5115.                   : nullptr) {}
  5116.  
  5117.     Expr *getAssociatedExpression() const {
  5118.       return AssociatedExpressionNonContiguousPr.getPointer();
  5119.     }
  5120.  
  5121.     bool isNonContiguous() const {
  5122.       return AssociatedExpressionNonContiguousPr.getInt();
  5123.     }
  5124.  
  5125.     ValueDecl *getAssociatedDeclaration() const {
  5126.       return AssociatedDeclaration;
  5127.     }
  5128.   };
  5129.  
  5130.   // List of components of an expression. This first one is the whole
  5131.   // expression and the last one is the base expression.
  5132.   using MappableExprComponentList = SmallVector<MappableComponent, 8>;
  5133.   using MappableExprComponentListRef = ArrayRef<MappableComponent>;
  5134.  
  5135.   // List of all component lists associated to the same base declaration.
  5136.   // E.g. if both 'S.a' and 'S.b' are a mappable expressions, each will have
  5137.   // their component list but the same base declaration 'S'.
  5138.   using MappableExprComponentLists = SmallVector<MappableExprComponentList, 8>;
  5139.   using MappableExprComponentListsRef = ArrayRef<MappableExprComponentList>;
  5140.  
  5141. protected:
  5142.   // Return the total number of elements in a list of component lists.
  5143.   static unsigned
  5144.   getComponentsTotalNumber(MappableExprComponentListsRef ComponentLists);
  5145.  
  5146.   // Return the total number of elements in a list of declarations. All
  5147.   // declarations are expected to be canonical.
  5148.   static unsigned
  5149.   getUniqueDeclarationsTotalNumber(ArrayRef<const ValueDecl *> Declarations);
  5150. };
  5151.  
  5152. /// This structure contains all sizes needed for by an
  5153. /// OMPMappableExprListClause.
  5154. struct OMPMappableExprListSizeTy {
  5155.   /// Number of expressions listed.
  5156.   unsigned NumVars;
  5157.   /// Number of unique base declarations.
  5158.   unsigned NumUniqueDeclarations;
  5159.   /// Number of component lists.
  5160.   unsigned NumComponentLists;
  5161.   /// Total number of expression components.
  5162.   unsigned NumComponents;
  5163.   OMPMappableExprListSizeTy() = default;
  5164.   OMPMappableExprListSizeTy(unsigned NumVars, unsigned NumUniqueDeclarations,
  5165.                             unsigned NumComponentLists, unsigned NumComponents)
  5166.       : NumVars(NumVars), NumUniqueDeclarations(NumUniqueDeclarations),
  5167.         NumComponentLists(NumComponentLists), NumComponents(NumComponents) {}
  5168. };
  5169.  
  5170. /// This represents clauses with a list of expressions that are mappable.
  5171. /// Examples of these clauses are 'map' in
  5172. /// '#pragma omp target [enter|exit] [data]...' directives, and  'to' and 'from
  5173. /// in '#pragma omp target update...' directives.
  5174. template <class T>
  5175. class OMPMappableExprListClause : public OMPVarListClause<T>,
  5176.                                   public OMPClauseMappableExprCommon {
  5177.   friend class OMPClauseReader;
  5178.  
  5179.   /// Number of unique declarations in this clause.
  5180.   unsigned NumUniqueDeclarations;
  5181.  
  5182.   /// Number of component lists in this clause.
  5183.   unsigned NumComponentLists;
  5184.  
  5185.   /// Total number of components in this clause.
  5186.   unsigned NumComponents;
  5187.  
  5188.   /// Whether this clause is possible to have user-defined mappers associated.
  5189.   /// It should be true for map, to, and from clauses, and false for
  5190.   /// use_device_ptr and is_device_ptr.
  5191.   const bool SupportsMapper;
  5192.  
  5193.   /// C++ nested name specifier for the associated user-defined mapper.
  5194.   NestedNameSpecifierLoc MapperQualifierLoc;
  5195.  
  5196.   /// The associated user-defined mapper identifier information.
  5197.   DeclarationNameInfo MapperIdInfo;
  5198.  
  5199. protected:
  5200.   /// Build a clause for \a NumUniqueDeclarations declarations, \a
  5201.   /// NumComponentLists total component lists, and \a NumComponents total
  5202.   /// components.
  5203.   ///
  5204.   /// \param K Kind of the clause.
  5205.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  5206.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  5207.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  5208.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  5209.   /// NumVars: number of expressions listed in this clause; 2)
  5210.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  5211.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  5212.   /// NumComponents: total number of expression components in the clause.
  5213.   /// \param SupportsMapper Indicates whether this clause is possible to have
  5214.   /// user-defined mappers associated.
  5215.   /// \param MapperQualifierLocPtr C++ nested name specifier for the associated
  5216.   /// user-defined mapper.
  5217.   /// \param MapperIdInfoPtr The identifier of associated user-defined mapper.
  5218.   OMPMappableExprListClause(
  5219.       OpenMPClauseKind K, const OMPVarListLocTy &Locs,
  5220.       const OMPMappableExprListSizeTy &Sizes, bool SupportsMapper = false,
  5221.       NestedNameSpecifierLoc *MapperQualifierLocPtr = nullptr,
  5222.       DeclarationNameInfo *MapperIdInfoPtr = nullptr)
  5223.       : OMPVarListClause<T>(K, Locs.StartLoc, Locs.LParenLoc, Locs.EndLoc,
  5224.                             Sizes.NumVars),
  5225.         NumUniqueDeclarations(Sizes.NumUniqueDeclarations),
  5226.         NumComponentLists(Sizes.NumComponentLists),
  5227.         NumComponents(Sizes.NumComponents), SupportsMapper(SupportsMapper) {
  5228.     if (MapperQualifierLocPtr)
  5229.       MapperQualifierLoc = *MapperQualifierLocPtr;
  5230.     if (MapperIdInfoPtr)
  5231.       MapperIdInfo = *MapperIdInfoPtr;
  5232.   }
  5233.  
  5234.   /// Get the unique declarations that are in the trailing objects of the
  5235.   /// class.
  5236.   MutableArrayRef<ValueDecl *> getUniqueDeclsRef() {
  5237.     return MutableArrayRef<ValueDecl *>(
  5238.         static_cast<T *>(this)->template getTrailingObjects<ValueDecl *>(),
  5239.         NumUniqueDeclarations);
  5240.   }
  5241.  
  5242.   /// Get the unique declarations that are in the trailing objects of the
  5243.   /// class.
  5244.   ArrayRef<ValueDecl *> getUniqueDeclsRef() const {
  5245.     return ArrayRef<ValueDecl *>(
  5246.         static_cast<const T *>(this)
  5247.             ->template getTrailingObjects<ValueDecl *>(),
  5248.         NumUniqueDeclarations);
  5249.   }
  5250.  
  5251.   /// Set the unique declarations that are in the trailing objects of the
  5252.   /// class.
  5253.   void setUniqueDecls(ArrayRef<ValueDecl *> UDs) {
  5254.     assert(UDs.size() == NumUniqueDeclarations &&
  5255.            "Unexpected amount of unique declarations.");
  5256.     std::copy(UDs.begin(), UDs.end(), getUniqueDeclsRef().begin());
  5257.   }
  5258.  
  5259.   /// Get the number of lists per declaration that are in the trailing
  5260.   /// objects of the class.
  5261.   MutableArrayRef<unsigned> getDeclNumListsRef() {
  5262.     return MutableArrayRef<unsigned>(
  5263.         static_cast<T *>(this)->template getTrailingObjects<unsigned>(),
  5264.         NumUniqueDeclarations);
  5265.   }
  5266.  
  5267.   /// Get the number of lists per declaration that are in the trailing
  5268.   /// objects of the class.
  5269.   ArrayRef<unsigned> getDeclNumListsRef() const {
  5270.     return ArrayRef<unsigned>(
  5271.         static_cast<const T *>(this)->template getTrailingObjects<unsigned>(),
  5272.         NumUniqueDeclarations);
  5273.   }
  5274.  
  5275.   /// Set the number of lists per declaration that are in the trailing
  5276.   /// objects of the class.
  5277.   void setDeclNumLists(ArrayRef<unsigned> DNLs) {
  5278.     assert(DNLs.size() == NumUniqueDeclarations &&
  5279.            "Unexpected amount of list numbers.");
  5280.     std::copy(DNLs.begin(), DNLs.end(), getDeclNumListsRef().begin());
  5281.   }
  5282.  
  5283.   /// Get the cumulative component lists sizes that are in the trailing
  5284.   /// objects of the class. They are appended after the number of lists.
  5285.   MutableArrayRef<unsigned> getComponentListSizesRef() {
  5286.     return MutableArrayRef<unsigned>(
  5287.         static_cast<T *>(this)->template getTrailingObjects<unsigned>() +
  5288.             NumUniqueDeclarations,
  5289.         NumComponentLists);
  5290.   }
  5291.  
  5292.   /// Get the cumulative component lists sizes that are in the trailing
  5293.   /// objects of the class. They are appended after the number of lists.
  5294.   ArrayRef<unsigned> getComponentListSizesRef() const {
  5295.     return ArrayRef<unsigned>(
  5296.         static_cast<const T *>(this)->template getTrailingObjects<unsigned>() +
  5297.             NumUniqueDeclarations,
  5298.         NumComponentLists);
  5299.   }
  5300.  
  5301.   /// Set the cumulative component lists sizes that are in the trailing
  5302.   /// objects of the class.
  5303.   void setComponentListSizes(ArrayRef<unsigned> CLSs) {
  5304.     assert(CLSs.size() == NumComponentLists &&
  5305.            "Unexpected amount of component lists.");
  5306.     std::copy(CLSs.begin(), CLSs.end(), getComponentListSizesRef().begin());
  5307.   }
  5308.  
  5309.   /// Get the components that are in the trailing objects of the class.
  5310.   MutableArrayRef<MappableComponent> getComponentsRef() {
  5311.     return MutableArrayRef<MappableComponent>(
  5312.         static_cast<T *>(this)
  5313.             ->template getTrailingObjects<MappableComponent>(),
  5314.         NumComponents);
  5315.   }
  5316.  
  5317.   /// Get the components that are in the trailing objects of the class.
  5318.   ArrayRef<MappableComponent> getComponentsRef() const {
  5319.     return ArrayRef<MappableComponent>(
  5320.         static_cast<const T *>(this)
  5321.             ->template getTrailingObjects<MappableComponent>(),
  5322.         NumComponents);
  5323.   }
  5324.  
  5325.   /// Set the components that are in the trailing objects of the class.
  5326.   /// This requires the list sizes so that it can also fill the original
  5327.   /// expressions, which are the first component of each list.
  5328.   void setComponents(ArrayRef<MappableComponent> Components,
  5329.                      ArrayRef<unsigned> CLSs) {
  5330.     assert(Components.size() == NumComponents &&
  5331.            "Unexpected amount of component lists.");
  5332.     assert(CLSs.size() == NumComponentLists &&
  5333.            "Unexpected amount of list sizes.");
  5334.     std::copy(Components.begin(), Components.end(), getComponentsRef().begin());
  5335.   }
  5336.  
  5337.   /// Fill the clause information from the list of declarations and
  5338.   /// associated component lists.
  5339.   void setClauseInfo(ArrayRef<ValueDecl *> Declarations,
  5340.                      MappableExprComponentListsRef ComponentLists) {
  5341.     // Perform some checks to make sure the data sizes are consistent with the
  5342.     // information available when the clause was created.
  5343.     assert(getUniqueDeclarationsTotalNumber(Declarations) ==
  5344.                NumUniqueDeclarations &&
  5345.            "Unexpected number of mappable expression info entries!");
  5346.     assert(getComponentsTotalNumber(ComponentLists) == NumComponents &&
  5347.            "Unexpected total number of components!");
  5348.     assert(Declarations.size() == ComponentLists.size() &&
  5349.            "Declaration and component lists size is not consistent!");
  5350.     assert(Declarations.size() == NumComponentLists &&
  5351.            "Unexpected declaration and component lists size!");
  5352.  
  5353.     // Organize the components by declaration and retrieve the original
  5354.     // expression. Original expressions are always the first component of the
  5355.     // mappable component list.
  5356.     llvm::MapVector<ValueDecl *, SmallVector<MappableExprComponentListRef, 8>>
  5357.         ComponentListMap;
  5358.     {
  5359.       auto CI = ComponentLists.begin();
  5360.       for (auto DI = Declarations.begin(), DE = Declarations.end(); DI != DE;
  5361.            ++DI, ++CI) {
  5362.         assert(!CI->empty() && "Invalid component list!");
  5363.         ComponentListMap[*DI].push_back(*CI);
  5364.       }
  5365.     }
  5366.  
  5367.     // Iterators of the target storage.
  5368.     auto UniqueDeclarations = getUniqueDeclsRef();
  5369.     auto UDI = UniqueDeclarations.begin();
  5370.  
  5371.     auto DeclNumLists = getDeclNumListsRef();
  5372.     auto DNLI = DeclNumLists.begin();
  5373.  
  5374.     auto ComponentListSizes = getComponentListSizesRef();
  5375.     auto CLSI = ComponentListSizes.begin();
  5376.  
  5377.     auto Components = getComponentsRef();
  5378.     auto CI = Components.begin();
  5379.  
  5380.     // Variable to compute the accumulation of the number of components.
  5381.     unsigned PrevSize = 0u;
  5382.  
  5383.     // Scan all the declarations and associated component lists.
  5384.     for (auto &M : ComponentListMap) {
  5385.       // The declaration.
  5386.       auto *D = M.first;
  5387.       // The component lists.
  5388.       auto CL = M.second;
  5389.  
  5390.       // Initialize the entry.
  5391.       *UDI = D;
  5392.       ++UDI;
  5393.  
  5394.       *DNLI = CL.size();
  5395.       ++DNLI;
  5396.  
  5397.       // Obtain the cumulative sizes and concatenate all the components in the
  5398.       // reserved storage.
  5399.       for (auto C : CL) {
  5400.         // Accumulate with the previous size.
  5401.         PrevSize += C.size();
  5402.  
  5403.         // Save the size.
  5404.         *CLSI = PrevSize;
  5405.         ++CLSI;
  5406.  
  5407.         // Append components after the current components iterator.
  5408.         CI = std::copy(C.begin(), C.end(), CI);
  5409.       }
  5410.     }
  5411.   }
  5412.  
  5413.   /// Set the nested name specifier of associated user-defined mapper.
  5414.   void setMapperQualifierLoc(NestedNameSpecifierLoc NNSL) {
  5415.     MapperQualifierLoc = NNSL;
  5416.   }
  5417.  
  5418.   /// Set the name of associated user-defined mapper.
  5419.   void setMapperIdInfo(DeclarationNameInfo MapperId) {
  5420.     MapperIdInfo = MapperId;
  5421.   }
  5422.  
  5423.   /// Get the user-defined mapper references that are in the trailing objects of
  5424.   /// the class.
  5425.   MutableArrayRef<Expr *> getUDMapperRefs() {
  5426.     assert(SupportsMapper &&
  5427.            "Must be a clause that is possible to have user-defined mappers");
  5428.     return llvm::MutableArrayRef<Expr *>(
  5429.         static_cast<T *>(this)->template getTrailingObjects<Expr *>() +
  5430.             OMPVarListClause<T>::varlist_size(),
  5431.         OMPVarListClause<T>::varlist_size());
  5432.   }
  5433.  
  5434.   /// Get the user-defined mappers references that are in the trailing objects
  5435.   /// of the class.
  5436.   ArrayRef<Expr *> getUDMapperRefs() const {
  5437.     assert(SupportsMapper &&
  5438.            "Must be a clause that is possible to have user-defined mappers");
  5439.     return llvm::ArrayRef<Expr *>(
  5440.         static_cast<const T *>(this)->template getTrailingObjects<Expr *>() +
  5441.             OMPVarListClause<T>::varlist_size(),
  5442.         OMPVarListClause<T>::varlist_size());
  5443.   }
  5444.  
  5445.   /// Set the user-defined mappers that are in the trailing objects of the
  5446.   /// class.
  5447.   void setUDMapperRefs(ArrayRef<Expr *> DMDs) {
  5448.     assert(DMDs.size() == OMPVarListClause<T>::varlist_size() &&
  5449.            "Unexpected number of user-defined mappers.");
  5450.     assert(SupportsMapper &&
  5451.            "Must be a clause that is possible to have user-defined mappers");
  5452.     std::copy(DMDs.begin(), DMDs.end(), getUDMapperRefs().begin());
  5453.   }
  5454.  
  5455. public:
  5456.   /// Return the number of unique base declarations in this clause.
  5457.   unsigned getUniqueDeclarationsNum() const { return NumUniqueDeclarations; }
  5458.  
  5459.   /// Return the number of lists derived from the clause expressions.
  5460.   unsigned getTotalComponentListNum() const { return NumComponentLists; }
  5461.  
  5462.   /// Return the total number of components in all lists derived from the
  5463.   /// clause.
  5464.   unsigned getTotalComponentsNum() const { return NumComponents; }
  5465.  
  5466.   /// Gets the nested name specifier for associated user-defined mapper.
  5467.   NestedNameSpecifierLoc getMapperQualifierLoc() const {
  5468.     return MapperQualifierLoc;
  5469.   }
  5470.  
  5471.   /// Gets the name info for associated user-defined mapper.
  5472.   const DeclarationNameInfo &getMapperIdInfo() const { return MapperIdInfo; }
  5473.  
  5474.   /// Iterator that browse the components by lists. It also allows
  5475.   /// browsing components of a single declaration.
  5476.   class const_component_lists_iterator
  5477.       : public llvm::iterator_adaptor_base<
  5478.             const_component_lists_iterator,
  5479.             MappableExprComponentListRef::const_iterator,
  5480.             std::forward_iterator_tag, MappableComponent, ptrdiff_t,
  5481.             MappableComponent, MappableComponent> {
  5482.     // The declaration the iterator currently refers to.
  5483.     ArrayRef<ValueDecl *>::iterator DeclCur;
  5484.  
  5485.     // The list number associated with the current declaration.
  5486.     ArrayRef<unsigned>::iterator NumListsCur;
  5487.  
  5488.     // Whether this clause is possible to have user-defined mappers associated.
  5489.     const bool SupportsMapper;
  5490.  
  5491.     // The user-defined mapper associated with the current declaration.
  5492.     ArrayRef<Expr *>::iterator MapperCur;
  5493.  
  5494.     // Remaining lists for the current declaration.
  5495.     unsigned RemainingLists = 0;
  5496.  
  5497.     // The cumulative size of the previous list, or zero if there is no previous
  5498.     // list.
  5499.     unsigned PrevListSize = 0;
  5500.  
  5501.     // The cumulative sizes of the current list - it will delimit the remaining
  5502.     // range of interest.
  5503.     ArrayRef<unsigned>::const_iterator ListSizeCur;
  5504.     ArrayRef<unsigned>::const_iterator ListSizeEnd;
  5505.  
  5506.     // Iterator to the end of the components storage.
  5507.     MappableExprComponentListRef::const_iterator End;
  5508.  
  5509.   public:
  5510.     /// Construct an iterator that scans all lists.
  5511.     explicit const_component_lists_iterator(
  5512.         ArrayRef<ValueDecl *> UniqueDecls, ArrayRef<unsigned> DeclsListNum,
  5513.         ArrayRef<unsigned> CumulativeListSizes,
  5514.         MappableExprComponentListRef Components, bool SupportsMapper,
  5515.         ArrayRef<Expr *> Mappers)
  5516.         : const_component_lists_iterator::iterator_adaptor_base(
  5517.               Components.begin()),
  5518.           DeclCur(UniqueDecls.begin()), NumListsCur(DeclsListNum.begin()),
  5519.           SupportsMapper(SupportsMapper),
  5520.           ListSizeCur(CumulativeListSizes.begin()),
  5521.           ListSizeEnd(CumulativeListSizes.end()), End(Components.end()) {
  5522.       assert(UniqueDecls.size() == DeclsListNum.size() &&
  5523.              "Inconsistent number of declarations and list sizes!");
  5524.       if (!DeclsListNum.empty())
  5525.         RemainingLists = *NumListsCur;
  5526.       if (SupportsMapper)
  5527.         MapperCur = Mappers.begin();
  5528.     }
  5529.  
  5530.     /// Construct an iterator that scan lists for a given declaration \a
  5531.     /// Declaration.
  5532.     explicit const_component_lists_iterator(
  5533.         const ValueDecl *Declaration, ArrayRef<ValueDecl *> UniqueDecls,
  5534.         ArrayRef<unsigned> DeclsListNum, ArrayRef<unsigned> CumulativeListSizes,
  5535.         MappableExprComponentListRef Components, bool SupportsMapper,
  5536.         ArrayRef<Expr *> Mappers)
  5537.         : const_component_lists_iterator(UniqueDecls, DeclsListNum,
  5538.                                          CumulativeListSizes, Components,
  5539.                                          SupportsMapper, Mappers) {
  5540.       // Look for the desired declaration. While we are looking for it, we
  5541.       // update the state so that we know the component where a given list
  5542.       // starts.
  5543.       for (; DeclCur != UniqueDecls.end(); ++DeclCur, ++NumListsCur) {
  5544.         if (*DeclCur == Declaration)
  5545.           break;
  5546.  
  5547.         assert(*NumListsCur > 0 && "No lists associated with declaration??");
  5548.  
  5549.         // Skip the lists associated with the current declaration, but save the
  5550.         // last list size that was skipped.
  5551.         std::advance(ListSizeCur, *NumListsCur - 1);
  5552.         PrevListSize = *ListSizeCur;
  5553.         ++ListSizeCur;
  5554.  
  5555.         if (SupportsMapper)
  5556.           ++MapperCur;
  5557.       }
  5558.  
  5559.       // If we didn't find any declaration, advance the iterator to after the
  5560.       // last component and set remaining lists to zero.
  5561.       if (ListSizeCur == CumulativeListSizes.end()) {
  5562.         this->I = End;
  5563.         RemainingLists = 0u;
  5564.         return;
  5565.       }
  5566.  
  5567.       // Set the remaining lists with the total number of lists of the current
  5568.       // declaration.
  5569.       RemainingLists = *NumListsCur;
  5570.  
  5571.       // Adjust the list size end iterator to the end of the relevant range.
  5572.       ListSizeEnd = ListSizeCur;
  5573.       std::advance(ListSizeEnd, RemainingLists);
  5574.  
  5575.       // Given that the list sizes are cumulative, the index of the component
  5576.       // that start the list is the size of the previous list.
  5577.       std::advance(this->I, PrevListSize);
  5578.     }
  5579.  
  5580.     // Return the array with the current list. The sizes are cumulative, so the
  5581.     // array size is the difference between the current size and previous one.
  5582.     std::tuple<const ValueDecl *, MappableExprComponentListRef,
  5583.                const ValueDecl *>
  5584.     operator*() const {
  5585.       assert(ListSizeCur != ListSizeEnd && "Invalid iterator!");
  5586.       const ValueDecl *Mapper = nullptr;
  5587.       if (SupportsMapper && *MapperCur)
  5588.         Mapper = cast<ValueDecl>(cast<DeclRefExpr>(*MapperCur)->getDecl());
  5589.       return std::make_tuple(
  5590.           *DeclCur,
  5591.           MappableExprComponentListRef(&*this->I, *ListSizeCur - PrevListSize),
  5592.           Mapper);
  5593.     }
  5594.     std::tuple<const ValueDecl *, MappableExprComponentListRef,
  5595.                const ValueDecl *>
  5596.     operator->() const {
  5597.       return **this;
  5598.     }
  5599.  
  5600.     // Skip the components of the current list.
  5601.     const_component_lists_iterator &operator++() {
  5602.       assert(ListSizeCur != ListSizeEnd && RemainingLists &&
  5603.              "Invalid iterator!");
  5604.  
  5605.       // If we don't have more lists just skip all the components. Otherwise,
  5606.       // advance the iterator by the number of components in the current list.
  5607.       if (std::next(ListSizeCur) == ListSizeEnd) {
  5608.         this->I = End;
  5609.         RemainingLists = 0;
  5610.       } else {
  5611.         std::advance(this->I, *ListSizeCur - PrevListSize);
  5612.         PrevListSize = *ListSizeCur;
  5613.  
  5614.         // We are done with a declaration, move to the next one.
  5615.         if (!(--RemainingLists)) {
  5616.           ++DeclCur;
  5617.           ++NumListsCur;
  5618.           RemainingLists = *NumListsCur;
  5619.           assert(RemainingLists && "No lists in the following declaration??");
  5620.         }
  5621.       }
  5622.  
  5623.       ++ListSizeCur;
  5624.       if (SupportsMapper)
  5625.         ++MapperCur;
  5626.       return *this;
  5627.     }
  5628.   };
  5629.  
  5630.   using const_component_lists_range =
  5631.       llvm::iterator_range<const_component_lists_iterator>;
  5632.  
  5633.   /// Iterators for all component lists.
  5634.   const_component_lists_iterator component_lists_begin() const {
  5635.     return const_component_lists_iterator(
  5636.         getUniqueDeclsRef(), getDeclNumListsRef(), getComponentListSizesRef(),
  5637.         getComponentsRef(), SupportsMapper,
  5638.         SupportsMapper ? getUDMapperRefs() : std::nullopt);
  5639.   }
  5640.   const_component_lists_iterator component_lists_end() const {
  5641.     return const_component_lists_iterator(
  5642.         ArrayRef<ValueDecl *>(), ArrayRef<unsigned>(), ArrayRef<unsigned>(),
  5643.         MappableExprComponentListRef(getComponentsRef().end(),
  5644.                                      getComponentsRef().end()),
  5645.         SupportsMapper, std::nullopt);
  5646.   }
  5647.   const_component_lists_range component_lists() const {
  5648.     return {component_lists_begin(), component_lists_end()};
  5649.   }
  5650.  
  5651.   /// Iterators for component lists associated with the provided
  5652.   /// declaration.
  5653.   const_component_lists_iterator
  5654.   decl_component_lists_begin(const ValueDecl *VD) const {
  5655.     return const_component_lists_iterator(
  5656.         VD, getUniqueDeclsRef(), getDeclNumListsRef(),
  5657.         getComponentListSizesRef(), getComponentsRef(), SupportsMapper,
  5658.         SupportsMapper ? getUDMapperRefs() : std::nullopt);
  5659.   }
  5660.   const_component_lists_iterator decl_component_lists_end() const {
  5661.     return component_lists_end();
  5662.   }
  5663.   const_component_lists_range decl_component_lists(const ValueDecl *VD) const {
  5664.     return {decl_component_lists_begin(VD), decl_component_lists_end()};
  5665.   }
  5666.  
  5667.   /// Iterators to access all the declarations, number of lists, list sizes, and
  5668.   /// components.
  5669.   using const_all_decls_iterator = ArrayRef<ValueDecl *>::iterator;
  5670.   using const_all_decls_range = llvm::iterator_range<const_all_decls_iterator>;
  5671.  
  5672.   const_all_decls_range all_decls() const {
  5673.     auto A = getUniqueDeclsRef();
  5674.     return const_all_decls_range(A.begin(), A.end());
  5675.   }
  5676.  
  5677.   using const_all_num_lists_iterator = ArrayRef<unsigned>::iterator;
  5678.   using const_all_num_lists_range =
  5679.       llvm::iterator_range<const_all_num_lists_iterator>;
  5680.  
  5681.   const_all_num_lists_range all_num_lists() const {
  5682.     auto A = getDeclNumListsRef();
  5683.     return const_all_num_lists_range(A.begin(), A.end());
  5684.   }
  5685.  
  5686.   using const_all_lists_sizes_iterator = ArrayRef<unsigned>::iterator;
  5687.   using const_all_lists_sizes_range =
  5688.       llvm::iterator_range<const_all_lists_sizes_iterator>;
  5689.  
  5690.   const_all_lists_sizes_range all_lists_sizes() const {
  5691.     auto A = getComponentListSizesRef();
  5692.     return const_all_lists_sizes_range(A.begin(), A.end());
  5693.   }
  5694.  
  5695.   using const_all_components_iterator = ArrayRef<MappableComponent>::iterator;
  5696.   using const_all_components_range =
  5697.       llvm::iterator_range<const_all_components_iterator>;
  5698.  
  5699.   const_all_components_range all_components() const {
  5700.     auto A = getComponentsRef();
  5701.     return const_all_components_range(A.begin(), A.end());
  5702.   }
  5703.  
  5704.   using mapperlist_iterator = MutableArrayRef<Expr *>::iterator;
  5705.   using mapperlist_const_iterator = ArrayRef<const Expr *>::iterator;
  5706.   using mapperlist_range = llvm::iterator_range<mapperlist_iterator>;
  5707.   using mapperlist_const_range =
  5708.       llvm::iterator_range<mapperlist_const_iterator>;
  5709.  
  5710.   mapperlist_iterator mapperlist_begin() { return getUDMapperRefs().begin(); }
  5711.   mapperlist_iterator mapperlist_end() { return getUDMapperRefs().end(); }
  5712.   mapperlist_const_iterator mapperlist_begin() const {
  5713.     return getUDMapperRefs().begin();
  5714.   }
  5715.   mapperlist_const_iterator mapperlist_end() const {
  5716.     return getUDMapperRefs().end();
  5717.   }
  5718.   mapperlist_range mapperlists() {
  5719.     return mapperlist_range(mapperlist_begin(), mapperlist_end());
  5720.   }
  5721.   mapperlist_const_range mapperlists() const {
  5722.     return mapperlist_const_range(mapperlist_begin(), mapperlist_end());
  5723.   }
  5724. };
  5725.  
  5726. /// This represents clause 'map' in the '#pragma omp ...'
  5727. /// directives.
  5728. ///
  5729. /// \code
  5730. /// #pragma omp target map(a,b)
  5731. /// \endcode
  5732. /// In this example directive '#pragma omp target' has clause 'map'
  5733. /// with the variables 'a' and 'b'.
  5734. class OMPMapClause final : public OMPMappableExprListClause<OMPMapClause>,
  5735.                            private llvm::TrailingObjects<
  5736.                                OMPMapClause, Expr *, ValueDecl *, unsigned,
  5737.                                OMPClauseMappableExprCommon::MappableComponent> {
  5738.   friend class OMPClauseReader;
  5739.   friend OMPMappableExprListClause;
  5740.   friend OMPVarListClause;
  5741.   friend TrailingObjects;
  5742.  
  5743.   /// Define the sizes of each trailing object array except the last one. This
  5744.   /// is required for TrailingObjects to work properly.
  5745.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  5746.     // There are varlist_size() of expressions, and varlist_size() of
  5747.     // user-defined mappers.
  5748.     return 2 * varlist_size() + 1;
  5749.   }
  5750.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  5751.     return getUniqueDeclarationsNum();
  5752.   }
  5753.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  5754.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  5755.   }
  5756.  
  5757. private:
  5758.   /// Map-type-modifiers for the 'map' clause.
  5759.   OpenMPMapModifierKind MapTypeModifiers[NumberOfOMPMapClauseModifiers] = {
  5760.       OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown,
  5761.       OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown,
  5762.       OMPC_MAP_MODIFIER_unknown, OMPC_MAP_MODIFIER_unknown};
  5763.  
  5764.   /// Location of map-type-modifiers for the 'map' clause.
  5765.   SourceLocation MapTypeModifiersLoc[NumberOfOMPMapClauseModifiers];
  5766.  
  5767.   /// Map type for the 'map' clause.
  5768.   OpenMPMapClauseKind MapType = OMPC_MAP_unknown;
  5769.  
  5770.   /// Is this an implicit map type or not.
  5771.   bool MapTypeIsImplicit = false;
  5772.  
  5773.   /// Location of the map type.
  5774.   SourceLocation MapLoc;
  5775.  
  5776.   /// Colon location.
  5777.   SourceLocation ColonLoc;
  5778.  
  5779.   /// Build a clause for \a NumVars listed expressions, \a
  5780.   /// NumUniqueDeclarations declarations, \a NumComponentLists total component
  5781.   /// lists, and \a NumComponents total expression components.
  5782.   ///
  5783.   /// \param MapModifiers Map-type-modifiers.
  5784.   /// \param MapModifiersLoc Locations of map-type-modifiers.
  5785.   /// \param MapperQualifierLoc C++ nested name specifier for the associated
  5786.   /// user-defined mapper.
  5787.   /// \param MapperIdInfo The identifier of associated user-defined mapper.
  5788.   /// \param MapType Map type.
  5789.   /// \param MapTypeIsImplicit Map type is inferred implicitly.
  5790.   /// \param MapLoc Location of the map type.
  5791.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  5792.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  5793.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  5794.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  5795.   /// NumVars: number of expressions listed in this clause; 2)
  5796.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  5797.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  5798.   /// NumComponents: total number of expression components in the clause.
  5799.   explicit OMPMapClause(ArrayRef<OpenMPMapModifierKind> MapModifiers,
  5800.                         ArrayRef<SourceLocation> MapModifiersLoc,
  5801.                         NestedNameSpecifierLoc MapperQualifierLoc,
  5802.                         DeclarationNameInfo MapperIdInfo,
  5803.                         OpenMPMapClauseKind MapType, bool MapTypeIsImplicit,
  5804.                         SourceLocation MapLoc, const OMPVarListLocTy &Locs,
  5805.                         const OMPMappableExprListSizeTy &Sizes)
  5806.       : OMPMappableExprListClause(llvm::omp::OMPC_map, Locs, Sizes,
  5807.                                   /*SupportsMapper=*/true, &MapperQualifierLoc,
  5808.                                   &MapperIdInfo),
  5809.         MapType(MapType), MapTypeIsImplicit(MapTypeIsImplicit), MapLoc(MapLoc) {
  5810.     assert(std::size(MapTypeModifiers) == MapModifiers.size() &&
  5811.            "Unexpected number of map type modifiers.");
  5812.     llvm::copy(MapModifiers, std::begin(MapTypeModifiers));
  5813.  
  5814.     assert(std::size(MapTypeModifiersLoc) == MapModifiersLoc.size() &&
  5815.            "Unexpected number of map type modifier locations.");
  5816.     llvm::copy(MapModifiersLoc, std::begin(MapTypeModifiersLoc));
  5817.   }
  5818.  
  5819.   /// Build an empty clause.
  5820.   ///
  5821.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  5822.   /// NumVars: number of expressions listed in this clause; 2)
  5823.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  5824.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  5825.   /// NumComponents: total number of expression components in the clause.
  5826.   explicit OMPMapClause(const OMPMappableExprListSizeTy &Sizes)
  5827.       : OMPMappableExprListClause(llvm::omp::OMPC_map, OMPVarListLocTy(), Sizes,
  5828.                                   /*SupportsMapper=*/true) {}
  5829.  
  5830.   /// Set map-type-modifier for the clause.
  5831.   ///
  5832.   /// \param I index for map-type-modifier.
  5833.   /// \param T map-type-modifier for the clause.
  5834.   void setMapTypeModifier(unsigned I, OpenMPMapModifierKind T) {
  5835.     assert(I < NumberOfOMPMapClauseModifiers &&
  5836.            "Unexpected index to store map type modifier, exceeds array size.");
  5837.     MapTypeModifiers[I] = T;
  5838.   }
  5839.  
  5840.   /// Set location for the map-type-modifier.
  5841.   ///
  5842.   /// \param I index for map-type-modifier location.
  5843.   /// \param TLoc map-type-modifier location.
  5844.   void setMapTypeModifierLoc(unsigned I, SourceLocation TLoc) {
  5845.     assert(I < NumberOfOMPMapClauseModifiers &&
  5846.            "Index to store map type modifier location exceeds array size.");
  5847.     MapTypeModifiersLoc[I] = TLoc;
  5848.   }
  5849.  
  5850.   /// Set type for the clause.
  5851.   ///
  5852.   /// \param T Type for the clause.
  5853.   void setMapType(OpenMPMapClauseKind T) { MapType = T; }
  5854.  
  5855.   /// Set type location.
  5856.   ///
  5857.   /// \param TLoc Type location.
  5858.   void setMapLoc(SourceLocation TLoc) { MapLoc = TLoc; }
  5859.  
  5860.   /// Set colon location.
  5861.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  5862.  
  5863.   /// Set iterator modifier.
  5864.   void setIteratorModifier(Expr *IteratorModifier) {
  5865.     getTrailingObjects<Expr *>()[2 * varlist_size()] = IteratorModifier;
  5866.   }
  5867.  
  5868. public:
  5869.   /// Creates clause with a list of variables \a VL.
  5870.   ///
  5871.   /// \param C AST context.
  5872.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  5873.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  5874.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  5875.   /// \param Vars The original expression used in the clause.
  5876.   /// \param Declarations Declarations used in the clause.
  5877.   /// \param ComponentLists Component lists used in the clause.
  5878.   /// \param UDMapperRefs References to user-defined mappers associated with
  5879.   /// expressions used in the clause.
  5880.   /// \param IteratorModifier Iterator modifier.
  5881.   /// \param MapModifiers Map-type-modifiers.
  5882.   /// \param MapModifiersLoc Location of map-type-modifiers.
  5883.   /// \param UDMQualifierLoc C++ nested name specifier for the associated
  5884.   /// user-defined mapper.
  5885.   /// \param MapperId The identifier of associated user-defined mapper.
  5886.   /// \param Type Map type.
  5887.   /// \param TypeIsImplicit Map type is inferred implicitly.
  5888.   /// \param TypeLoc Location of the map type.
  5889.   static OMPMapClause *
  5890.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  5891.          ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
  5892.          MappableExprComponentListsRef ComponentLists,
  5893.          ArrayRef<Expr *> UDMapperRefs, Expr *IteratorModifier,
  5894.          ArrayRef<OpenMPMapModifierKind> MapModifiers,
  5895.          ArrayRef<SourceLocation> MapModifiersLoc,
  5896.          NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId,
  5897.          OpenMPMapClauseKind Type, bool TypeIsImplicit, SourceLocation TypeLoc);
  5898.  
  5899.   /// Creates an empty clause with the place for \a NumVars original
  5900.   /// expressions, \a NumUniqueDeclarations declarations, \NumComponentLists
  5901.   /// lists, and \a NumComponents expression components.
  5902.   ///
  5903.   /// \param C AST context.
  5904.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  5905.   /// NumVars: number of expressions listed in this clause; 2)
  5906.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  5907.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  5908.   /// NumComponents: total number of expression components in the clause.
  5909.   static OMPMapClause *CreateEmpty(const ASTContext &C,
  5910.                                    const OMPMappableExprListSizeTy &Sizes);
  5911.  
  5912.   /// Fetches Expr * of iterator modifier.
  5913.   Expr *getIteratorModifier() {
  5914.     return getTrailingObjects<Expr *>()[2 * varlist_size()];
  5915.   }
  5916.  
  5917.   /// Fetches mapping kind for the clause.
  5918.   OpenMPMapClauseKind getMapType() const LLVM_READONLY { return MapType; }
  5919.  
  5920.   /// Is this an implicit map type?
  5921.   /// We have to capture 'IsMapTypeImplicit' from the parser for more
  5922.   /// informative error messages.  It helps distinguish map(r) from
  5923.   /// map(tofrom: r), which is important to print more helpful error
  5924.   /// messages for some target directives.
  5925.   bool isImplicitMapType() const LLVM_READONLY { return MapTypeIsImplicit; }
  5926.  
  5927.   /// Fetches the map-type-modifier at 'Cnt' index of array of modifiers.
  5928.   ///
  5929.   /// \param Cnt index for map-type-modifier.
  5930.   OpenMPMapModifierKind getMapTypeModifier(unsigned Cnt) const LLVM_READONLY {
  5931.     assert(Cnt < NumberOfOMPMapClauseModifiers &&
  5932.            "Requested modifier exceeds the total number of modifiers.");
  5933.     return MapTypeModifiers[Cnt];
  5934.   }
  5935.  
  5936.   /// Fetches the map-type-modifier location at 'Cnt' index of array of
  5937.   /// modifiers' locations.
  5938.   ///
  5939.   /// \param Cnt index for map-type-modifier location.
  5940.   SourceLocation getMapTypeModifierLoc(unsigned Cnt) const LLVM_READONLY {
  5941.     assert(Cnt < NumberOfOMPMapClauseModifiers &&
  5942.            "Requested modifier location exceeds total number of modifiers.");
  5943.     return MapTypeModifiersLoc[Cnt];
  5944.   }
  5945.  
  5946.   /// Fetches ArrayRef of map-type-modifiers.
  5947.   ArrayRef<OpenMPMapModifierKind> getMapTypeModifiers() const LLVM_READONLY {
  5948.     return llvm::ArrayRef(MapTypeModifiers);
  5949.   }
  5950.  
  5951.   /// Fetches ArrayRef of location of map-type-modifiers.
  5952.   ArrayRef<SourceLocation> getMapTypeModifiersLoc() const LLVM_READONLY {
  5953.     return llvm::ArrayRef(MapTypeModifiersLoc);
  5954.   }
  5955.  
  5956.   /// Fetches location of clause mapping kind.
  5957.   SourceLocation getMapLoc() const LLVM_READONLY { return MapLoc; }
  5958.  
  5959.   /// Get colon location.
  5960.   SourceLocation getColonLoc() const { return ColonLoc; }
  5961.  
  5962.   child_range children() {
  5963.     return child_range(
  5964.         reinterpret_cast<Stmt **>(varlist_begin()),
  5965.         reinterpret_cast<Stmt **>(varlist_end()));
  5966.   }
  5967.  
  5968.   const_child_range children() const {
  5969.     auto Children = const_cast<OMPMapClause *>(this)->children();
  5970.     return const_child_range(Children.begin(), Children.end());
  5971.   }
  5972.  
  5973.   child_range used_children() {
  5974.     if (MapType == OMPC_MAP_to || MapType == OMPC_MAP_tofrom)
  5975.       return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  5976.                          reinterpret_cast<Stmt **>(varlist_end()));
  5977.     return child_range(child_iterator(), child_iterator());
  5978.   }
  5979.   const_child_range used_children() const {
  5980.     auto Children = const_cast<OMPMapClause *>(this)->used_children();
  5981.     return const_child_range(Children.begin(), Children.end());
  5982.   }
  5983.  
  5984.  
  5985.   static bool classof(const OMPClause *T) {
  5986.     return T->getClauseKind() == llvm::omp::OMPC_map;
  5987.   }
  5988. };
  5989.  
  5990. /// This represents 'num_teams' clause in the '#pragma omp ...'
  5991. /// directive.
  5992. ///
  5993. /// \code
  5994. /// #pragma omp teams num_teams(n)
  5995. /// \endcode
  5996. /// In this example directive '#pragma omp teams' has clause 'num_teams'
  5997. /// with single expression 'n'.
  5998. class OMPNumTeamsClause : public OMPClause, public OMPClauseWithPreInit {
  5999.   friend class OMPClauseReader;
  6000.  
  6001.   /// Location of '('.
  6002.   SourceLocation LParenLoc;
  6003.  
  6004.   /// NumTeams number.
  6005.   Stmt *NumTeams = nullptr;
  6006.  
  6007.   /// Set the NumTeams number.
  6008.   ///
  6009.   /// \param E NumTeams number.
  6010.   void setNumTeams(Expr *E) { NumTeams = E; }
  6011.  
  6012. public:
  6013.   /// Build 'num_teams' clause.
  6014.   ///
  6015.   /// \param E Expression associated with this clause.
  6016.   /// \param HelperE Helper Expression associated with this clause.
  6017.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  6018.   /// clause must be captured.
  6019.   /// \param StartLoc Starting location of the clause.
  6020.   /// \param LParenLoc Location of '('.
  6021.   /// \param EndLoc Ending location of the clause.
  6022.   OMPNumTeamsClause(Expr *E, Stmt *HelperE, OpenMPDirectiveKind CaptureRegion,
  6023.                     SourceLocation StartLoc, SourceLocation LParenLoc,
  6024.                     SourceLocation EndLoc)
  6025.       : OMPClause(llvm::omp::OMPC_num_teams, StartLoc, EndLoc),
  6026.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), NumTeams(E) {
  6027.     setPreInitStmt(HelperE, CaptureRegion);
  6028.   }
  6029.  
  6030.   /// Build an empty clause.
  6031.   OMPNumTeamsClause()
  6032.       : OMPClause(llvm::omp::OMPC_num_teams, SourceLocation(),
  6033.                   SourceLocation()),
  6034.         OMPClauseWithPreInit(this) {}
  6035.  
  6036.   /// Sets the location of '('.
  6037.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6038.  
  6039.   /// Returns the location of '('.
  6040.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6041.  
  6042.   /// Return NumTeams number.
  6043.   Expr *getNumTeams() { return cast<Expr>(NumTeams); }
  6044.  
  6045.   /// Return NumTeams number.
  6046.   Expr *getNumTeams() const { return cast<Expr>(NumTeams); }
  6047.  
  6048.   child_range children() { return child_range(&NumTeams, &NumTeams + 1); }
  6049.  
  6050.   const_child_range children() const {
  6051.     return const_child_range(&NumTeams, &NumTeams + 1);
  6052.   }
  6053.  
  6054.   child_range used_children() {
  6055.     return child_range(child_iterator(), child_iterator());
  6056.   }
  6057.   const_child_range used_children() const {
  6058.     return const_child_range(const_child_iterator(), const_child_iterator());
  6059.   }
  6060.  
  6061.   static bool classof(const OMPClause *T) {
  6062.     return T->getClauseKind() == llvm::omp::OMPC_num_teams;
  6063.   }
  6064. };
  6065.  
  6066. /// This represents 'thread_limit' clause in the '#pragma omp ...'
  6067. /// directive.
  6068. ///
  6069. /// \code
  6070. /// #pragma omp teams thread_limit(n)
  6071. /// \endcode
  6072. /// In this example directive '#pragma omp teams' has clause 'thread_limit'
  6073. /// with single expression 'n'.
  6074. class OMPThreadLimitClause : public OMPClause, public OMPClauseWithPreInit {
  6075.   friend class OMPClauseReader;
  6076.  
  6077.   /// Location of '('.
  6078.   SourceLocation LParenLoc;
  6079.  
  6080.   /// ThreadLimit number.
  6081.   Stmt *ThreadLimit = nullptr;
  6082.  
  6083.   /// Set the ThreadLimit number.
  6084.   ///
  6085.   /// \param E ThreadLimit number.
  6086.   void setThreadLimit(Expr *E) { ThreadLimit = E; }
  6087.  
  6088. public:
  6089.   /// Build 'thread_limit' clause.
  6090.   ///
  6091.   /// \param E Expression associated with this clause.
  6092.   /// \param HelperE Helper Expression associated with this clause.
  6093.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  6094.   /// clause must be captured.
  6095.   /// \param StartLoc Starting location of the clause.
  6096.   /// \param LParenLoc Location of '('.
  6097.   /// \param EndLoc Ending location of the clause.
  6098.   OMPThreadLimitClause(Expr *E, Stmt *HelperE,
  6099.                        OpenMPDirectiveKind CaptureRegion,
  6100.                        SourceLocation StartLoc, SourceLocation LParenLoc,
  6101.                        SourceLocation EndLoc)
  6102.       : OMPClause(llvm::omp::OMPC_thread_limit, StartLoc, EndLoc),
  6103.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), ThreadLimit(E) {
  6104.     setPreInitStmt(HelperE, CaptureRegion);
  6105.   }
  6106.  
  6107.   /// Build an empty clause.
  6108.   OMPThreadLimitClause()
  6109.       : OMPClause(llvm::omp::OMPC_thread_limit, SourceLocation(),
  6110.                   SourceLocation()),
  6111.         OMPClauseWithPreInit(this) {}
  6112.  
  6113.   /// Sets the location of '('.
  6114.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6115.  
  6116.   /// Returns the location of '('.
  6117.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6118.  
  6119.   /// Return ThreadLimit number.
  6120.   Expr *getThreadLimit() { return cast<Expr>(ThreadLimit); }
  6121.  
  6122.   /// Return ThreadLimit number.
  6123.   Expr *getThreadLimit() const { return cast<Expr>(ThreadLimit); }
  6124.  
  6125.   child_range children() { return child_range(&ThreadLimit, &ThreadLimit + 1); }
  6126.  
  6127.   const_child_range children() const {
  6128.     return const_child_range(&ThreadLimit, &ThreadLimit + 1);
  6129.   }
  6130.  
  6131.   child_range used_children() {
  6132.     return child_range(child_iterator(), child_iterator());
  6133.   }
  6134.   const_child_range used_children() const {
  6135.     return const_child_range(const_child_iterator(), const_child_iterator());
  6136.   }
  6137.  
  6138.   static bool classof(const OMPClause *T) {
  6139.     return T->getClauseKind() == llvm::omp::OMPC_thread_limit;
  6140.   }
  6141. };
  6142.  
  6143. /// This represents 'priority' clause in the '#pragma omp ...'
  6144. /// directive.
  6145. ///
  6146. /// \code
  6147. /// #pragma omp task priority(n)
  6148. /// \endcode
  6149. /// In this example directive '#pragma omp teams' has clause 'priority' with
  6150. /// single expression 'n'.
  6151. class OMPPriorityClause : public OMPClause, public OMPClauseWithPreInit {
  6152.   friend class OMPClauseReader;
  6153.  
  6154.   /// Location of '('.
  6155.   SourceLocation LParenLoc;
  6156.  
  6157.   /// Priority number.
  6158.   Stmt *Priority = nullptr;
  6159.  
  6160.   /// Set the Priority number.
  6161.   ///
  6162.   /// \param E Priority number.
  6163.   void setPriority(Expr *E) { Priority = E; }
  6164.  
  6165. public:
  6166.   /// Build 'priority' clause.
  6167.   ///
  6168.   /// \param Priority Expression associated with this clause.
  6169.   /// \param HelperPriority Helper priority for the construct.
  6170.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  6171.   /// clause must be captured.
  6172.   /// \param StartLoc Starting location of the clause.
  6173.   /// \param LParenLoc Location of '('.
  6174.   /// \param EndLoc Ending location of the clause.
  6175.   OMPPriorityClause(Expr *Priority, Stmt *HelperPriority,
  6176.                     OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  6177.                     SourceLocation LParenLoc, SourceLocation EndLoc)
  6178.       : OMPClause(llvm::omp::OMPC_priority, StartLoc, EndLoc),
  6179.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Priority(Priority) {
  6180.     setPreInitStmt(HelperPriority, CaptureRegion);
  6181.   }
  6182.  
  6183.   /// Build an empty clause.
  6184.   OMPPriorityClause()
  6185.       : OMPClause(llvm::omp::OMPC_priority, SourceLocation(), SourceLocation()),
  6186.         OMPClauseWithPreInit(this) {}
  6187.  
  6188.   /// Sets the location of '('.
  6189.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6190.  
  6191.   /// Returns the location of '('.
  6192.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6193.  
  6194.   /// Return Priority number.
  6195.   Expr *getPriority() { return cast<Expr>(Priority); }
  6196.  
  6197.   /// Return Priority number.
  6198.   Expr *getPriority() const { return cast<Expr>(Priority); }
  6199.  
  6200.   child_range children() { return child_range(&Priority, &Priority + 1); }
  6201.  
  6202.   const_child_range children() const {
  6203.     return const_child_range(&Priority, &Priority + 1);
  6204.   }
  6205.  
  6206.   child_range used_children();
  6207.   const_child_range used_children() const {
  6208.     auto Children = const_cast<OMPPriorityClause *>(this)->used_children();
  6209.     return const_child_range(Children.begin(), Children.end());
  6210.   }
  6211.  
  6212.   static bool classof(const OMPClause *T) {
  6213.     return T->getClauseKind() == llvm::omp::OMPC_priority;
  6214.   }
  6215. };
  6216.  
  6217. /// This represents 'grainsize' clause in the '#pragma omp ...'
  6218. /// directive.
  6219. ///
  6220. /// \code
  6221. /// #pragma omp taskloop grainsize(4)
  6222. /// \endcode
  6223. /// In this example directive '#pragma omp taskloop' has clause 'grainsize'
  6224. /// with single expression '4'.
  6225. class OMPGrainsizeClause : public OMPClause, public OMPClauseWithPreInit {
  6226.   friend class OMPClauseReader;
  6227.  
  6228.   /// Location of '('.
  6229.   SourceLocation LParenLoc;
  6230.  
  6231.   /// Modifiers for 'grainsize' clause.
  6232.   OpenMPGrainsizeClauseModifier Modifier = OMPC_GRAINSIZE_unknown;
  6233.  
  6234.   /// Location of the modifier.
  6235.   SourceLocation ModifierLoc;
  6236.  
  6237.   /// Safe iteration space distance.
  6238.   Stmt *Grainsize = nullptr;
  6239.  
  6240.   /// Set safelen.
  6241.   void setGrainsize(Expr *Size) { Grainsize = Size; }
  6242.  
  6243.   /// Sets modifier.
  6244.   void setModifier(OpenMPGrainsizeClauseModifier M) { Modifier = M; }
  6245.  
  6246.   /// Sets modifier location.
  6247.   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
  6248.  
  6249. public:
  6250.   /// Build 'grainsize' clause.
  6251.   ///
  6252.   /// \param Modifier Clause modifier.
  6253.   /// \param Size Expression associated with this clause.
  6254.   /// \param HelperSize Helper grainsize for the construct.
  6255.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  6256.   /// clause must be captured.
  6257.   /// \param StartLoc Starting location of the clause.
  6258.   /// \param ModifierLoc Modifier location.
  6259.   /// \param LParenLoc Location of '('.
  6260.   /// \param EndLoc Ending location of the clause.
  6261.   OMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, Expr *Size,
  6262.                      Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion,
  6263.                      SourceLocation StartLoc, SourceLocation LParenLoc,
  6264.                      SourceLocation ModifierLoc, SourceLocation EndLoc)
  6265.       : OMPClause(llvm::omp::OMPC_grainsize, StartLoc, EndLoc),
  6266.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier),
  6267.         ModifierLoc(ModifierLoc), Grainsize(Size) {
  6268.     setPreInitStmt(HelperSize, CaptureRegion);
  6269.   }
  6270.  
  6271.   /// Build an empty clause.
  6272.   explicit OMPGrainsizeClause()
  6273.       : OMPClause(llvm::omp::OMPC_grainsize, SourceLocation(),
  6274.                   SourceLocation()),
  6275.         OMPClauseWithPreInit(this) {}
  6276.  
  6277.   /// Sets the location of '('.
  6278.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6279.  
  6280.   /// Returns the location of '('.
  6281.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6282.  
  6283.   /// Return safe iteration space distance.
  6284.   Expr *getGrainsize() const { return cast_or_null<Expr>(Grainsize); }
  6285.  
  6286.   /// Gets modifier.
  6287.   OpenMPGrainsizeClauseModifier getModifier() const { return Modifier; }
  6288.  
  6289.   /// Gets modifier location.
  6290.   SourceLocation getModifierLoc() const { return ModifierLoc; }
  6291.  
  6292.   child_range children() { return child_range(&Grainsize, &Grainsize + 1); }
  6293.  
  6294.   const_child_range children() const {
  6295.     return const_child_range(&Grainsize, &Grainsize + 1);
  6296.   }
  6297.  
  6298.   child_range used_children();
  6299.   const_child_range used_children() const {
  6300.     auto Children = const_cast<OMPGrainsizeClause *>(this)->used_children();
  6301.     return const_child_range(Children.begin(), Children.end());
  6302.   }
  6303.  
  6304.   static bool classof(const OMPClause *T) {
  6305.     return T->getClauseKind() == llvm::omp::OMPC_grainsize;
  6306.   }
  6307. };
  6308.  
  6309. /// This represents 'nogroup' clause in the '#pragma omp ...' directive.
  6310. ///
  6311. /// \code
  6312. /// #pragma omp taskloop nogroup
  6313. /// \endcode
  6314. /// In this example directive '#pragma omp taskloop' has 'nogroup' clause.
  6315. class OMPNogroupClause : public OMPClause {
  6316. public:
  6317.   /// Build 'nogroup' clause.
  6318.   ///
  6319.   /// \param StartLoc Starting location of the clause.
  6320.   /// \param EndLoc Ending location of the clause.
  6321.   OMPNogroupClause(SourceLocation StartLoc, SourceLocation EndLoc)
  6322.       : OMPClause(llvm::omp::OMPC_nogroup, StartLoc, EndLoc) {}
  6323.  
  6324.   /// Build an empty clause.
  6325.   OMPNogroupClause()
  6326.       : OMPClause(llvm::omp::OMPC_nogroup, SourceLocation(), SourceLocation()) {
  6327.   }
  6328.  
  6329.   child_range children() {
  6330.     return child_range(child_iterator(), child_iterator());
  6331.   }
  6332.  
  6333.   const_child_range children() const {
  6334.     return const_child_range(const_child_iterator(), const_child_iterator());
  6335.   }
  6336.  
  6337.   child_range used_children() {
  6338.     return child_range(child_iterator(), child_iterator());
  6339.   }
  6340.   const_child_range used_children() const {
  6341.     return const_child_range(const_child_iterator(), const_child_iterator());
  6342.   }
  6343.  
  6344.   static bool classof(const OMPClause *T) {
  6345.     return T->getClauseKind() == llvm::omp::OMPC_nogroup;
  6346.   }
  6347. };
  6348.  
  6349. /// This represents 'num_tasks' clause in the '#pragma omp ...'
  6350. /// directive.
  6351. ///
  6352. /// \code
  6353. /// #pragma omp taskloop num_tasks(4)
  6354. /// \endcode
  6355. /// In this example directive '#pragma omp taskloop' has clause 'num_tasks'
  6356. /// with single expression '4'.
  6357. class OMPNumTasksClause : public OMPClause, public OMPClauseWithPreInit {
  6358.   friend class OMPClauseReader;
  6359.  
  6360.   /// Location of '('.
  6361.   SourceLocation LParenLoc;
  6362.  
  6363.   /// Modifiers for 'num_tasks' clause.
  6364.   OpenMPNumTasksClauseModifier Modifier = OMPC_NUMTASKS_unknown;
  6365.  
  6366.   /// Location of the modifier.
  6367.   SourceLocation ModifierLoc;
  6368.  
  6369.   /// Safe iteration space distance.
  6370.   Stmt *NumTasks = nullptr;
  6371.  
  6372.   /// Set safelen.
  6373.   void setNumTasks(Expr *Size) { NumTasks = Size; }
  6374.  
  6375.   /// Sets modifier.
  6376.   void setModifier(OpenMPNumTasksClauseModifier M) { Modifier = M; }
  6377.  
  6378.   /// Sets modifier location.
  6379.   void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
  6380.  
  6381. public:
  6382.   /// Build 'num_tasks' clause.
  6383.   ///
  6384.   /// \param Modifier Clause modifier.
  6385.   /// \param Size Expression associated with this clause.
  6386.   /// \param HelperSize Helper grainsize for the construct.
  6387.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  6388.   /// clause must be captured.
  6389.   /// \param StartLoc Starting location of the clause.
  6390.   /// \param EndLoc Ending location of the clause.
  6391.   /// \param ModifierLoc Modifier location.
  6392.   /// \param LParenLoc Location of '('.
  6393.   OMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, Expr *Size,
  6394.                     Stmt *HelperSize, OpenMPDirectiveKind CaptureRegion,
  6395.                     SourceLocation StartLoc, SourceLocation LParenLoc,
  6396.                     SourceLocation ModifierLoc, SourceLocation EndLoc)
  6397.       : OMPClause(llvm::omp::OMPC_num_tasks, StartLoc, EndLoc),
  6398.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Modifier(Modifier),
  6399.         ModifierLoc(ModifierLoc), NumTasks(Size) {
  6400.     setPreInitStmt(HelperSize, CaptureRegion);
  6401.   }
  6402.  
  6403.   /// Build an empty clause.
  6404.   explicit OMPNumTasksClause()
  6405.       : OMPClause(llvm::omp::OMPC_num_tasks, SourceLocation(),
  6406.                   SourceLocation()),
  6407.         OMPClauseWithPreInit(this) {}
  6408.  
  6409.   /// Sets the location of '('.
  6410.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6411.  
  6412.   /// Returns the location of '('.
  6413.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6414.  
  6415.   /// Return safe iteration space distance.
  6416.   Expr *getNumTasks() const { return cast_or_null<Expr>(NumTasks); }
  6417.  
  6418.   /// Gets modifier.
  6419.   OpenMPNumTasksClauseModifier getModifier() const { return Modifier; }
  6420.  
  6421.   /// Gets modifier location.
  6422.   SourceLocation getModifierLoc() const { return ModifierLoc; }
  6423.  
  6424.   child_range children() { return child_range(&NumTasks, &NumTasks + 1); }
  6425.  
  6426.   const_child_range children() const {
  6427.     return const_child_range(&NumTasks, &NumTasks + 1);
  6428.   }
  6429.  
  6430.   child_range used_children();
  6431.   const_child_range used_children() const {
  6432.     auto Children = const_cast<OMPNumTasksClause *>(this)->used_children();
  6433.     return const_child_range(Children.begin(), Children.end());
  6434.   }
  6435.  
  6436.   static bool classof(const OMPClause *T) {
  6437.     return T->getClauseKind() == llvm::omp::OMPC_num_tasks;
  6438.   }
  6439. };
  6440.  
  6441. /// This represents 'hint' clause in the '#pragma omp ...' directive.
  6442. ///
  6443. /// \code
  6444. /// #pragma omp critical (name) hint(6)
  6445. /// \endcode
  6446. /// In this example directive '#pragma omp critical' has name 'name' and clause
  6447. /// 'hint' with argument '6'.
  6448. class OMPHintClause : public OMPClause {
  6449.   friend class OMPClauseReader;
  6450.  
  6451.   /// Location of '('.
  6452.   SourceLocation LParenLoc;
  6453.  
  6454.   /// Hint expression of the 'hint' clause.
  6455.   Stmt *Hint = nullptr;
  6456.  
  6457.   /// Set hint expression.
  6458.   void setHint(Expr *H) { Hint = H; }
  6459.  
  6460. public:
  6461.   /// Build 'hint' clause with expression \a Hint.
  6462.   ///
  6463.   /// \param Hint Hint expression.
  6464.   /// \param StartLoc Starting location of the clause.
  6465.   /// \param LParenLoc Location of '('.
  6466.   /// \param EndLoc Ending location of the clause.
  6467.   OMPHintClause(Expr *Hint, SourceLocation StartLoc, SourceLocation LParenLoc,
  6468.                 SourceLocation EndLoc)
  6469.       : OMPClause(llvm::omp::OMPC_hint, StartLoc, EndLoc), LParenLoc(LParenLoc),
  6470.         Hint(Hint) {}
  6471.  
  6472.   /// Build an empty clause.
  6473.   OMPHintClause()
  6474.       : OMPClause(llvm::omp::OMPC_hint, SourceLocation(), SourceLocation()) {}
  6475.  
  6476.   /// Sets the location of '('.
  6477.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6478.  
  6479.   /// Returns the location of '('.
  6480.   SourceLocation getLParenLoc() const { return LParenLoc; }
  6481.  
  6482.   /// Returns number of threads.
  6483.   Expr *getHint() const { return cast_or_null<Expr>(Hint); }
  6484.  
  6485.   child_range children() { return child_range(&Hint, &Hint + 1); }
  6486.  
  6487.   const_child_range children() const {
  6488.     return const_child_range(&Hint, &Hint + 1);
  6489.   }
  6490.  
  6491.   child_range used_children() {
  6492.     return child_range(child_iterator(), child_iterator());
  6493.   }
  6494.   const_child_range used_children() const {
  6495.     return const_child_range(const_child_iterator(), const_child_iterator());
  6496.   }
  6497.  
  6498.   static bool classof(const OMPClause *T) {
  6499.     return T->getClauseKind() == llvm::omp::OMPC_hint;
  6500.   }
  6501. };
  6502.  
  6503. /// This represents 'dist_schedule' clause in the '#pragma omp ...'
  6504. /// directive.
  6505. ///
  6506. /// \code
  6507. /// #pragma omp distribute dist_schedule(static, 3)
  6508. /// \endcode
  6509. /// In this example directive '#pragma omp distribute' has 'dist_schedule'
  6510. /// clause with arguments 'static' and '3'.
  6511. class OMPDistScheduleClause : public OMPClause, public OMPClauseWithPreInit {
  6512.   friend class OMPClauseReader;
  6513.  
  6514.   /// Location of '('.
  6515.   SourceLocation LParenLoc;
  6516.  
  6517.   /// A kind of the 'schedule' clause.
  6518.   OpenMPDistScheduleClauseKind Kind = OMPC_DIST_SCHEDULE_unknown;
  6519.  
  6520.   /// Start location of the schedule kind in source code.
  6521.   SourceLocation KindLoc;
  6522.  
  6523.   /// Location of ',' (if any).
  6524.   SourceLocation CommaLoc;
  6525.  
  6526.   /// Chunk size.
  6527.   Expr *ChunkSize = nullptr;
  6528.  
  6529.   /// Set schedule kind.
  6530.   ///
  6531.   /// \param K Schedule kind.
  6532.   void setDistScheduleKind(OpenMPDistScheduleClauseKind K) { Kind = K; }
  6533.  
  6534.   /// Sets the location of '('.
  6535.   ///
  6536.   /// \param Loc Location of '('.
  6537.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6538.  
  6539.   /// Set schedule kind start location.
  6540.   ///
  6541.   /// \param KLoc Schedule kind location.
  6542.   void setDistScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
  6543.  
  6544.   /// Set location of ','.
  6545.   ///
  6546.   /// \param Loc Location of ','.
  6547.   void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
  6548.  
  6549.   /// Set chunk size.
  6550.   ///
  6551.   /// \param E Chunk size.
  6552.   void setChunkSize(Expr *E) { ChunkSize = E; }
  6553.  
  6554. public:
  6555.   /// Build 'dist_schedule' clause with schedule kind \a Kind and chunk
  6556.   /// size expression \a ChunkSize.
  6557.   ///
  6558.   /// \param StartLoc Starting location of the clause.
  6559.   /// \param LParenLoc Location of '('.
  6560.   /// \param KLoc Starting location of the argument.
  6561.   /// \param CommaLoc Location of ','.
  6562.   /// \param EndLoc Ending location of the clause.
  6563.   /// \param Kind DistSchedule kind.
  6564.   /// \param ChunkSize Chunk size.
  6565.   /// \param HelperChunkSize Helper chunk size for combined directives.
  6566.   OMPDistScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  6567.                         SourceLocation KLoc, SourceLocation CommaLoc,
  6568.                         SourceLocation EndLoc,
  6569.                         OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize,
  6570.                         Stmt *HelperChunkSize)
  6571.       : OMPClause(llvm::omp::OMPC_dist_schedule, StartLoc, EndLoc),
  6572.         OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
  6573.         KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
  6574.     setPreInitStmt(HelperChunkSize);
  6575.   }
  6576.  
  6577.   /// Build an empty clause.
  6578.   explicit OMPDistScheduleClause()
  6579.       : OMPClause(llvm::omp::OMPC_dist_schedule, SourceLocation(),
  6580.                   SourceLocation()),
  6581.         OMPClauseWithPreInit(this) {}
  6582.  
  6583.   /// Get kind of the clause.
  6584.   OpenMPDistScheduleClauseKind getDistScheduleKind() const { return Kind; }
  6585.  
  6586.   /// Get location of '('.
  6587.   SourceLocation getLParenLoc() { return LParenLoc; }
  6588.  
  6589.   /// Get kind location.
  6590.   SourceLocation getDistScheduleKindLoc() { return KindLoc; }
  6591.  
  6592.   /// Get location of ','.
  6593.   SourceLocation getCommaLoc() { return CommaLoc; }
  6594.  
  6595.   /// Get chunk size.
  6596.   Expr *getChunkSize() { return ChunkSize; }
  6597.  
  6598.   /// Get chunk size.
  6599.   const Expr *getChunkSize() const { return ChunkSize; }
  6600.  
  6601.   child_range children() {
  6602.     return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
  6603.                        reinterpret_cast<Stmt **>(&ChunkSize) + 1);
  6604.   }
  6605.  
  6606.   const_child_range children() const {
  6607.     auto Children = const_cast<OMPDistScheduleClause *>(this)->children();
  6608.     return const_child_range(Children.begin(), Children.end());
  6609.   }
  6610.  
  6611.   child_range used_children() {
  6612.     return child_range(child_iterator(), child_iterator());
  6613.   }
  6614.   const_child_range used_children() const {
  6615.     return const_child_range(const_child_iterator(), const_child_iterator());
  6616.   }
  6617.  
  6618.   static bool classof(const OMPClause *T) {
  6619.     return T->getClauseKind() == llvm::omp::OMPC_dist_schedule;
  6620.   }
  6621. };
  6622.  
  6623. /// This represents 'defaultmap' clause in the '#pragma omp ...' directive.
  6624. ///
  6625. /// \code
  6626. /// #pragma omp target defaultmap(tofrom: scalar)
  6627. /// \endcode
  6628. /// In this example directive '#pragma omp target' has 'defaultmap' clause of kind
  6629. /// 'scalar' with modifier 'tofrom'.
  6630. class OMPDefaultmapClause : public OMPClause {
  6631.   friend class OMPClauseReader;
  6632.  
  6633.   /// Location of '('.
  6634.   SourceLocation LParenLoc;
  6635.  
  6636.   /// Modifiers for 'defaultmap' clause.
  6637.   OpenMPDefaultmapClauseModifier Modifier = OMPC_DEFAULTMAP_MODIFIER_unknown;
  6638.  
  6639.   /// Locations of modifiers.
  6640.   SourceLocation ModifierLoc;
  6641.  
  6642.   /// A kind of the 'defaultmap' clause.
  6643.   OpenMPDefaultmapClauseKind Kind = OMPC_DEFAULTMAP_unknown;
  6644.  
  6645.   /// Start location of the defaultmap kind in source code.
  6646.   SourceLocation KindLoc;
  6647.  
  6648.   /// Set defaultmap kind.
  6649.   ///
  6650.   /// \param K Defaultmap kind.
  6651.   void setDefaultmapKind(OpenMPDefaultmapClauseKind K) { Kind = K; }
  6652.  
  6653.   /// Set the defaultmap modifier.
  6654.   ///
  6655.   /// \param M Defaultmap modifier.
  6656.   void setDefaultmapModifier(OpenMPDefaultmapClauseModifier M) {
  6657.     Modifier = M;
  6658.   }
  6659.  
  6660.   /// Set location of the defaultmap modifier.
  6661.   void setDefaultmapModifierLoc(SourceLocation Loc) {
  6662.     ModifierLoc = Loc;
  6663.   }
  6664.  
  6665.   /// Sets the location of '('.
  6666.   ///
  6667.   /// \param Loc Location of '('.
  6668.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  6669.  
  6670.   /// Set defaultmap kind start location.
  6671.   ///
  6672.   /// \param KLoc Defaultmap kind location.
  6673.   void setDefaultmapKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
  6674.  
  6675. public:
  6676.   /// Build 'defaultmap' clause with defaultmap kind \a Kind
  6677.   ///
  6678.   /// \param StartLoc Starting location of the clause.
  6679.   /// \param LParenLoc Location of '('.
  6680.   /// \param KLoc Starting location of the argument.
  6681.   /// \param EndLoc Ending location of the clause.
  6682.   /// \param Kind Defaultmap kind.
  6683.   /// \param M The modifier applied to 'defaultmap' clause.
  6684.   /// \param MLoc Location of the modifier
  6685.   OMPDefaultmapClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  6686.                       SourceLocation MLoc, SourceLocation KLoc,
  6687.                       SourceLocation EndLoc, OpenMPDefaultmapClauseKind Kind,
  6688.                       OpenMPDefaultmapClauseModifier M)
  6689.       : OMPClause(llvm::omp::OMPC_defaultmap, StartLoc, EndLoc),
  6690.         LParenLoc(LParenLoc), Modifier(M), ModifierLoc(MLoc), Kind(Kind),
  6691.         KindLoc(KLoc) {}
  6692.  
  6693.   /// Build an empty clause.
  6694.   explicit OMPDefaultmapClause()
  6695.       : OMPClause(llvm::omp::OMPC_defaultmap, SourceLocation(),
  6696.                   SourceLocation()) {}
  6697.  
  6698.   /// Get kind of the clause.
  6699.   OpenMPDefaultmapClauseKind getDefaultmapKind() const { return Kind; }
  6700.  
  6701.   /// Get the modifier of the clause.
  6702.   OpenMPDefaultmapClauseModifier getDefaultmapModifier() const {
  6703.     return Modifier;
  6704.   }
  6705.  
  6706.   /// Get location of '('.
  6707.   SourceLocation getLParenLoc() { return LParenLoc; }
  6708.  
  6709.   /// Get kind location.
  6710.   SourceLocation getDefaultmapKindLoc() { return KindLoc; }
  6711.  
  6712.   /// Get the modifier location.
  6713.   SourceLocation getDefaultmapModifierLoc() const {
  6714.     return ModifierLoc;
  6715.   }
  6716.  
  6717.   child_range children() {
  6718.     return child_range(child_iterator(), child_iterator());
  6719.   }
  6720.  
  6721.   const_child_range children() const {
  6722.     return const_child_range(const_child_iterator(), const_child_iterator());
  6723.   }
  6724.  
  6725.   child_range used_children() {
  6726.     return child_range(child_iterator(), child_iterator());
  6727.   }
  6728.   const_child_range used_children() const {
  6729.     return const_child_range(const_child_iterator(), const_child_iterator());
  6730.   }
  6731.  
  6732.   static bool classof(const OMPClause *T) {
  6733.     return T->getClauseKind() == llvm::omp::OMPC_defaultmap;
  6734.   }
  6735. };
  6736.  
  6737. /// This represents clause 'to' in the '#pragma omp ...'
  6738. /// directives.
  6739. ///
  6740. /// \code
  6741. /// #pragma omp target update to(a,b)
  6742. /// \endcode
  6743. /// In this example directive '#pragma omp target update' has clause 'to'
  6744. /// with the variables 'a' and 'b'.
  6745. class OMPToClause final : public OMPMappableExprListClause<OMPToClause>,
  6746.                           private llvm::TrailingObjects<
  6747.                               OMPToClause, Expr *, ValueDecl *, unsigned,
  6748.                               OMPClauseMappableExprCommon::MappableComponent> {
  6749.   friend class OMPClauseReader;
  6750.   friend OMPMappableExprListClause;
  6751.   friend OMPVarListClause;
  6752.   friend TrailingObjects;
  6753.  
  6754.   /// Motion-modifiers for the 'to' clause.
  6755.   OpenMPMotionModifierKind MotionModifiers[NumberOfOMPMotionModifiers] = {
  6756.       OMPC_MOTION_MODIFIER_unknown, OMPC_MOTION_MODIFIER_unknown};
  6757.  
  6758.   /// Location of motion-modifiers for the 'to' clause.
  6759.   SourceLocation MotionModifiersLoc[NumberOfOMPMotionModifiers];
  6760.  
  6761.   /// Colon location.
  6762.   SourceLocation ColonLoc;
  6763.  
  6764.   /// Build clause with number of variables \a NumVars.
  6765.   ///
  6766.   /// \param TheMotionModifiers Motion-modifiers.
  6767.   /// \param TheMotionModifiersLoc Locations of motion-modifiers.
  6768.   /// \param MapperQualifierLoc C++ nested name specifier for the associated
  6769.   /// user-defined mapper.
  6770.   /// \param MapperIdInfo The identifier of associated user-defined mapper.
  6771.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  6772.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  6773.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  6774.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  6775.   /// NumVars: number of expressions listed in this clause; 2)
  6776.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  6777.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  6778.   /// NumComponents: total number of expression components in the clause.
  6779.   explicit OMPToClause(ArrayRef<OpenMPMotionModifierKind> TheMotionModifiers,
  6780.                        ArrayRef<SourceLocation> TheMotionModifiersLoc,
  6781.                        NestedNameSpecifierLoc MapperQualifierLoc,
  6782.                        DeclarationNameInfo MapperIdInfo,
  6783.                        const OMPVarListLocTy &Locs,
  6784.                        const OMPMappableExprListSizeTy &Sizes)
  6785.       : OMPMappableExprListClause(llvm::omp::OMPC_to, Locs, Sizes,
  6786.                                   /*SupportsMapper=*/true, &MapperQualifierLoc,
  6787.                                   &MapperIdInfo) {
  6788.     assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
  6789.            "Unexpected number of motion modifiers.");
  6790.     llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
  6791.  
  6792.     assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
  6793.            "Unexpected number of motion modifier locations.");
  6794.     llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
  6795.   }
  6796.  
  6797.   /// Build an empty clause.
  6798.   ///
  6799.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  6800.   /// NumVars: number of expressions listed in this clause; 2)
  6801.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  6802.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  6803.   /// NumComponents: total number of expression components in the clause.
  6804.   explicit OMPToClause(const OMPMappableExprListSizeTy &Sizes)
  6805.       : OMPMappableExprListClause(llvm::omp::OMPC_to, OMPVarListLocTy(), Sizes,
  6806.                                   /*SupportsMapper=*/true) {}
  6807.  
  6808.   /// Set motion-modifier for the clause.
  6809.   ///
  6810.   /// \param I index for motion-modifier.
  6811.   /// \param T motion-modifier for the clause.
  6812.   void setMotionModifier(unsigned I, OpenMPMotionModifierKind T) {
  6813.     assert(I < NumberOfOMPMotionModifiers &&
  6814.            "Unexpected index to store motion modifier, exceeds array size.");
  6815.     MotionModifiers[I] = T;
  6816.   }
  6817.  
  6818.   /// Set location for the motion-modifier.
  6819.   ///
  6820.   /// \param I index for motion-modifier location.
  6821.   /// \param TLoc motion-modifier location.
  6822.   void setMotionModifierLoc(unsigned I, SourceLocation TLoc) {
  6823.     assert(I < NumberOfOMPMotionModifiers &&
  6824.            "Index to store motion modifier location exceeds array size.");
  6825.     MotionModifiersLoc[I] = TLoc;
  6826.   }
  6827.  
  6828.   /// Set colon location.
  6829.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  6830.  
  6831.   /// Define the sizes of each trailing object array except the last one. This
  6832.   /// is required for TrailingObjects to work properly.
  6833.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  6834.     // There are varlist_size() of expressions, and varlist_size() of
  6835.     // user-defined mappers.
  6836.     return 2 * varlist_size();
  6837.   }
  6838.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  6839.     return getUniqueDeclarationsNum();
  6840.   }
  6841.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  6842.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  6843.   }
  6844.  
  6845. public:
  6846.   /// Creates clause with a list of variables \a Vars.
  6847.   ///
  6848.   /// \param C AST context.
  6849.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  6850.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  6851.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  6852.   /// \param Vars The original expression used in the clause.
  6853.   /// \param Declarations Declarations used in the clause.
  6854.   /// \param ComponentLists Component lists used in the clause.
  6855.   /// \param MotionModifiers Motion-modifiers.
  6856.   /// \param MotionModifiersLoc Location of motion-modifiers.
  6857.   /// \param UDMapperRefs References to user-defined mappers associated with
  6858.   /// expressions used in the clause.
  6859.   /// \param UDMQualifierLoc C++ nested name specifier for the associated
  6860.   /// user-defined mapper.
  6861.   /// \param MapperId The identifier of associated user-defined mapper.
  6862.   static OMPToClause *Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  6863.                              ArrayRef<Expr *> Vars,
  6864.                              ArrayRef<ValueDecl *> Declarations,
  6865.                              MappableExprComponentListsRef ComponentLists,
  6866.                              ArrayRef<Expr *> UDMapperRefs,
  6867.                              ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
  6868.                              ArrayRef<SourceLocation> MotionModifiersLoc,
  6869.                              NestedNameSpecifierLoc UDMQualifierLoc,
  6870.                              DeclarationNameInfo MapperId);
  6871.  
  6872.   /// Creates an empty clause with the place for \a NumVars variables.
  6873.   ///
  6874.   /// \param C AST context.
  6875.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  6876.   /// NumVars: number of expressions listed in this clause; 2)
  6877.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  6878.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  6879.   /// NumComponents: total number of expression components in the clause.
  6880.   static OMPToClause *CreateEmpty(const ASTContext &C,
  6881.                                   const OMPMappableExprListSizeTy &Sizes);
  6882.  
  6883.   /// Fetches the motion-modifier at 'Cnt' index of array of modifiers.
  6884.   ///
  6885.   /// \param Cnt index for motion-modifier.
  6886.   OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY {
  6887.     assert(Cnt < NumberOfOMPMotionModifiers &&
  6888.            "Requested modifier exceeds the total number of modifiers.");
  6889.     return MotionModifiers[Cnt];
  6890.   }
  6891.  
  6892.   /// Fetches the motion-modifier location at 'Cnt' index of array of modifiers'
  6893.   /// locations.
  6894.   ///
  6895.   /// \param Cnt index for motion-modifier location.
  6896.   SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY {
  6897.     assert(Cnt < NumberOfOMPMotionModifiers &&
  6898.            "Requested modifier location exceeds total number of modifiers.");
  6899.     return MotionModifiersLoc[Cnt];
  6900.   }
  6901.  
  6902.   /// Fetches ArrayRef of motion-modifiers.
  6903.   ArrayRef<OpenMPMotionModifierKind> getMotionModifiers() const LLVM_READONLY {
  6904.     return llvm::ArrayRef(MotionModifiers);
  6905.   }
  6906.  
  6907.   /// Fetches ArrayRef of location of motion-modifiers.
  6908.   ArrayRef<SourceLocation> getMotionModifiersLoc() const LLVM_READONLY {
  6909.     return llvm::ArrayRef(MotionModifiersLoc);
  6910.   }
  6911.  
  6912.   /// Get colon location.
  6913.   SourceLocation getColonLoc() const { return ColonLoc; }
  6914.  
  6915.   child_range children() {
  6916.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  6917.                        reinterpret_cast<Stmt **>(varlist_end()));
  6918.   }
  6919.  
  6920.   const_child_range children() const {
  6921.     auto Children = const_cast<OMPToClause *>(this)->children();
  6922.     return const_child_range(Children.begin(), Children.end());
  6923.   }
  6924.  
  6925.   child_range used_children() {
  6926.     return child_range(child_iterator(), child_iterator());
  6927.   }
  6928.   const_child_range used_children() const {
  6929.     return const_child_range(const_child_iterator(), const_child_iterator());
  6930.   }
  6931.  
  6932.   static bool classof(const OMPClause *T) {
  6933.     return T->getClauseKind() == llvm::omp::OMPC_to;
  6934.   }
  6935. };
  6936.  
  6937. /// This represents clause 'from' in the '#pragma omp ...'
  6938. /// directives.
  6939. ///
  6940. /// \code
  6941. /// #pragma omp target update from(a,b)
  6942. /// \endcode
  6943. /// In this example directive '#pragma omp target update' has clause 'from'
  6944. /// with the variables 'a' and 'b'.
  6945. class OMPFromClause final
  6946.     : public OMPMappableExprListClause<OMPFromClause>,
  6947.       private llvm::TrailingObjects<
  6948.           OMPFromClause, Expr *, ValueDecl *, unsigned,
  6949.           OMPClauseMappableExprCommon::MappableComponent> {
  6950.   friend class OMPClauseReader;
  6951.   friend OMPMappableExprListClause;
  6952.   friend OMPVarListClause;
  6953.   friend TrailingObjects;
  6954.  
  6955.   /// Motion-modifiers for the 'from' clause.
  6956.   OpenMPMotionModifierKind MotionModifiers[NumberOfOMPMotionModifiers] = {
  6957.       OMPC_MOTION_MODIFIER_unknown, OMPC_MOTION_MODIFIER_unknown};
  6958.  
  6959.   /// Location of motion-modifiers for the 'from' clause.
  6960.   SourceLocation MotionModifiersLoc[NumberOfOMPMotionModifiers];
  6961.  
  6962.   /// Colon location.
  6963.   SourceLocation ColonLoc;
  6964.  
  6965.   /// Build clause with number of variables \a NumVars.
  6966.   ///
  6967.   /// \param TheMotionModifiers Motion-modifiers.
  6968.   /// \param TheMotionModifiersLoc Locations of motion-modifiers.
  6969.   /// \param MapperQualifierLoc C++ nested name specifier for the associated
  6970.   /// user-defined mapper.
  6971.   /// \param MapperIdInfo The identifier of associated user-defined mapper.
  6972.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  6973.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  6974.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  6975.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  6976.   /// NumVars: number of expressions listed in this clause; 2)
  6977.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  6978.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  6979.   /// NumComponents: total number of expression components in the clause.
  6980.   explicit OMPFromClause(ArrayRef<OpenMPMotionModifierKind> TheMotionModifiers,
  6981.                          ArrayRef<SourceLocation> TheMotionModifiersLoc,
  6982.                          NestedNameSpecifierLoc MapperQualifierLoc,
  6983.                          DeclarationNameInfo MapperIdInfo,
  6984.                          const OMPVarListLocTy &Locs,
  6985.                          const OMPMappableExprListSizeTy &Sizes)
  6986.       : OMPMappableExprListClause(llvm::omp::OMPC_from, Locs, Sizes,
  6987.                                   /*SupportsMapper=*/true, &MapperQualifierLoc,
  6988.                                   &MapperIdInfo) {
  6989.     assert(std::size(MotionModifiers) == TheMotionModifiers.size() &&
  6990.            "Unexpected number of motion modifiers.");
  6991.     llvm::copy(TheMotionModifiers, std::begin(MotionModifiers));
  6992.  
  6993.     assert(std::size(MotionModifiersLoc) == TheMotionModifiersLoc.size() &&
  6994.            "Unexpected number of motion modifier locations.");
  6995.     llvm::copy(TheMotionModifiersLoc, std::begin(MotionModifiersLoc));
  6996.   }
  6997.  
  6998.   /// Build an empty clause.
  6999.   ///
  7000.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7001.   /// NumVars: number of expressions listed in this clause; 2)
  7002.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7003.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7004.   /// NumComponents: total number of expression components in the clause.
  7005.   explicit OMPFromClause(const OMPMappableExprListSizeTy &Sizes)
  7006.       : OMPMappableExprListClause(llvm::omp::OMPC_from, OMPVarListLocTy(),
  7007.                                   Sizes, /*SupportsMapper=*/true) {}
  7008.  
  7009.   /// Set motion-modifier for the clause.
  7010.   ///
  7011.   /// \param I index for motion-modifier.
  7012.   /// \param T motion-modifier for the clause.
  7013.   void setMotionModifier(unsigned I, OpenMPMotionModifierKind T) {
  7014.     assert(I < NumberOfOMPMotionModifiers &&
  7015.            "Unexpected index to store motion modifier, exceeds array size.");
  7016.     MotionModifiers[I] = T;
  7017.   }
  7018.  
  7019.   /// Set location for the motion-modifier.
  7020.   ///
  7021.   /// \param I index for motion-modifier location.
  7022.   /// \param TLoc motion-modifier location.
  7023.   void setMotionModifierLoc(unsigned I, SourceLocation TLoc) {
  7024.     assert(I < NumberOfOMPMotionModifiers &&
  7025.            "Index to store motion modifier location exceeds array size.");
  7026.     MotionModifiersLoc[I] = TLoc;
  7027.   }
  7028.  
  7029.   /// Set colon location.
  7030.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  7031.  
  7032.   /// Define the sizes of each trailing object array except the last one. This
  7033.   /// is required for TrailingObjects to work properly.
  7034.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  7035.     // There are varlist_size() of expressions, and varlist_size() of
  7036.     // user-defined mappers.
  7037.     return 2 * varlist_size();
  7038.   }
  7039.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  7040.     return getUniqueDeclarationsNum();
  7041.   }
  7042.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  7043.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  7044.   }
  7045.  
  7046. public:
  7047.   /// Creates clause with a list of variables \a Vars.
  7048.   ///
  7049.   /// \param C AST context.
  7050.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7051.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7052.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7053.   /// \param Vars The original expression used in the clause.
  7054.   /// \param Declarations Declarations used in the clause.
  7055.   /// \param ComponentLists Component lists used in the clause.
  7056.   /// \param MotionModifiers Motion-modifiers.
  7057.   /// \param MotionModifiersLoc Location of motion-modifiers.
  7058.   /// \param UDMapperRefs References to user-defined mappers associated with
  7059.   /// expressions used in the clause.
  7060.   /// \param UDMQualifierLoc C++ nested name specifier for the associated
  7061.   /// user-defined mapper.
  7062.   /// \param MapperId The identifier of associated user-defined mapper.
  7063.   static OMPFromClause *
  7064.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  7065.          ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
  7066.          MappableExprComponentListsRef ComponentLists,
  7067.          ArrayRef<Expr *> UDMapperRefs,
  7068.          ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
  7069.          ArrayRef<SourceLocation> MotionModifiersLoc,
  7070.          NestedNameSpecifierLoc UDMQualifierLoc, DeclarationNameInfo MapperId);
  7071.  
  7072.   /// Creates an empty clause with the place for \a NumVars variables.
  7073.   ///
  7074.   /// \param C AST context.
  7075.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7076.   /// NumVars: number of expressions listed in this clause; 2)
  7077.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7078.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7079.   /// NumComponents: total number of expression components in the clause.
  7080.   static OMPFromClause *CreateEmpty(const ASTContext &C,
  7081.                                     const OMPMappableExprListSizeTy &Sizes);
  7082.  
  7083.   /// Fetches the motion-modifier at 'Cnt' index of array of modifiers.
  7084.   ///
  7085.   /// \param Cnt index for motion-modifier.
  7086.   OpenMPMotionModifierKind getMotionModifier(unsigned Cnt) const LLVM_READONLY {
  7087.     assert(Cnt < NumberOfOMPMotionModifiers &&
  7088.            "Requested modifier exceeds the total number of modifiers.");
  7089.     return MotionModifiers[Cnt];
  7090.   }
  7091.  
  7092.   /// Fetches the motion-modifier location at 'Cnt' index of array of modifiers'
  7093.   /// locations.
  7094.   ///
  7095.   /// \param Cnt index for motion-modifier location.
  7096.   SourceLocation getMotionModifierLoc(unsigned Cnt) const LLVM_READONLY {
  7097.     assert(Cnt < NumberOfOMPMotionModifiers &&
  7098.            "Requested modifier location exceeds total number of modifiers.");
  7099.     return MotionModifiersLoc[Cnt];
  7100.   }
  7101.  
  7102.   /// Fetches ArrayRef of motion-modifiers.
  7103.   ArrayRef<OpenMPMotionModifierKind> getMotionModifiers() const LLVM_READONLY {
  7104.     return llvm::ArrayRef(MotionModifiers);
  7105.   }
  7106.  
  7107.   /// Fetches ArrayRef of location of motion-modifiers.
  7108.   ArrayRef<SourceLocation> getMotionModifiersLoc() const LLVM_READONLY {
  7109.     return llvm::ArrayRef(MotionModifiersLoc);
  7110.   }
  7111.  
  7112.   /// Get colon location.
  7113.   SourceLocation getColonLoc() const { return ColonLoc; }
  7114.  
  7115.   child_range children() {
  7116.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7117.                        reinterpret_cast<Stmt **>(varlist_end()));
  7118.   }
  7119.  
  7120.   const_child_range children() const {
  7121.     auto Children = const_cast<OMPFromClause *>(this)->children();
  7122.     return const_child_range(Children.begin(), Children.end());
  7123.   }
  7124.  
  7125.   child_range used_children() {
  7126.     return child_range(child_iterator(), child_iterator());
  7127.   }
  7128.   const_child_range used_children() const {
  7129.     return const_child_range(const_child_iterator(), const_child_iterator());
  7130.   }
  7131.  
  7132.   static bool classof(const OMPClause *T) {
  7133.     return T->getClauseKind() == llvm::omp::OMPC_from;
  7134.   }
  7135. };
  7136.  
  7137. /// This represents clause 'use_device_ptr' in the '#pragma omp ...'
  7138. /// directives.
  7139. ///
  7140. /// \code
  7141. /// #pragma omp target data use_device_ptr(a,b)
  7142. /// \endcode
  7143. /// In this example directive '#pragma omp target data' has clause
  7144. /// 'use_device_ptr' with the variables 'a' and 'b'.
  7145. class OMPUseDevicePtrClause final
  7146.     : public OMPMappableExprListClause<OMPUseDevicePtrClause>,
  7147.       private llvm::TrailingObjects<
  7148.           OMPUseDevicePtrClause, Expr *, ValueDecl *, unsigned,
  7149.           OMPClauseMappableExprCommon::MappableComponent> {
  7150.   friend class OMPClauseReader;
  7151.   friend OMPMappableExprListClause;
  7152.   friend OMPVarListClause;
  7153.   friend TrailingObjects;
  7154.  
  7155.   /// Build clause with number of variables \a NumVars.
  7156.   ///
  7157.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7158.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7159.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7160.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7161.   /// NumVars: number of expressions listed in this clause; 2)
  7162.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7163.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7164.   /// NumComponents: total number of expression components in the clause.
  7165.   explicit OMPUseDevicePtrClause(const OMPVarListLocTy &Locs,
  7166.                                  const OMPMappableExprListSizeTy &Sizes)
  7167.       : OMPMappableExprListClause(llvm::omp::OMPC_use_device_ptr, Locs, Sizes) {
  7168.   }
  7169.  
  7170.   /// Build an empty clause.
  7171.   ///
  7172.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7173.   /// NumVars: number of expressions listed in this clause; 2)
  7174.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7175.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7176.   /// NumComponents: total number of expression components in the clause.
  7177.   explicit OMPUseDevicePtrClause(const OMPMappableExprListSizeTy &Sizes)
  7178.       : OMPMappableExprListClause(llvm::omp::OMPC_use_device_ptr,
  7179.                                   OMPVarListLocTy(), Sizes) {}
  7180.  
  7181.   /// Define the sizes of each trailing object array except the last one. This
  7182.   /// is required for TrailingObjects to work properly.
  7183.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  7184.     return 3 * varlist_size();
  7185.   }
  7186.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  7187.     return getUniqueDeclarationsNum();
  7188.   }
  7189.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  7190.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  7191.   }
  7192.  
  7193.   /// Sets the list of references to private copies with initializers for new
  7194.   /// private variables.
  7195.   /// \param VL List of references.
  7196.   void setPrivateCopies(ArrayRef<Expr *> VL);
  7197.  
  7198.   /// Gets the list of references to private copies with initializers for new
  7199.   /// private variables.
  7200.   MutableArrayRef<Expr *> getPrivateCopies() {
  7201.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  7202.   }
  7203.   ArrayRef<const Expr *> getPrivateCopies() const {
  7204.     return llvm::ArrayRef(varlist_end(), varlist_size());
  7205.   }
  7206.  
  7207.   /// Sets the list of references to initializer variables for new private
  7208.   /// variables.
  7209.   /// \param VL List of references.
  7210.   void setInits(ArrayRef<Expr *> VL);
  7211.  
  7212.   /// Gets the list of references to initializer variables for new private
  7213.   /// variables.
  7214.   MutableArrayRef<Expr *> getInits() {
  7215.     return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
  7216.   }
  7217.   ArrayRef<const Expr *> getInits() const {
  7218.     return llvm::ArrayRef(getPrivateCopies().end(), varlist_size());
  7219.   }
  7220.  
  7221. public:
  7222.   /// Creates clause with a list of variables \a Vars.
  7223.   ///
  7224.   /// \param C AST context.
  7225.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7226.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7227.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7228.   /// \param Vars The original expression used in the clause.
  7229.   /// \param PrivateVars Expressions referring to private copies.
  7230.   /// \param Inits Expressions referring to private copy initializers.
  7231.   /// \param Declarations Declarations used in the clause.
  7232.   /// \param ComponentLists Component lists used in the clause.
  7233.   static OMPUseDevicePtrClause *
  7234.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  7235.          ArrayRef<Expr *> Vars, ArrayRef<Expr *> PrivateVars,
  7236.          ArrayRef<Expr *> Inits, ArrayRef<ValueDecl *> Declarations,
  7237.          MappableExprComponentListsRef ComponentLists);
  7238.  
  7239.   /// Creates an empty clause with the place for \a NumVars variables.
  7240.   ///
  7241.   /// \param C AST context.
  7242.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7243.   /// NumVars: number of expressions listed in this clause; 2)
  7244.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7245.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7246.   /// NumComponents: total number of expression components in the clause.
  7247.   static OMPUseDevicePtrClause *
  7248.   CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
  7249.  
  7250.   using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
  7251.   using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
  7252.   using private_copies_range = llvm::iterator_range<private_copies_iterator>;
  7253.   using private_copies_const_range =
  7254.       llvm::iterator_range<private_copies_const_iterator>;
  7255.  
  7256.   private_copies_range private_copies() {
  7257.     return private_copies_range(getPrivateCopies().begin(),
  7258.                                 getPrivateCopies().end());
  7259.   }
  7260.  
  7261.   private_copies_const_range private_copies() const {
  7262.     return private_copies_const_range(getPrivateCopies().begin(),
  7263.                                       getPrivateCopies().end());
  7264.   }
  7265.  
  7266.   using inits_iterator = MutableArrayRef<Expr *>::iterator;
  7267.   using inits_const_iterator = ArrayRef<const Expr *>::iterator;
  7268.   using inits_range = llvm::iterator_range<inits_iterator>;
  7269.   using inits_const_range = llvm::iterator_range<inits_const_iterator>;
  7270.  
  7271.   inits_range inits() {
  7272.     return inits_range(getInits().begin(), getInits().end());
  7273.   }
  7274.  
  7275.   inits_const_range inits() const {
  7276.     return inits_const_range(getInits().begin(), getInits().end());
  7277.   }
  7278.  
  7279.   child_range children() {
  7280.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7281.                        reinterpret_cast<Stmt **>(varlist_end()));
  7282.   }
  7283.  
  7284.   const_child_range children() const {
  7285.     auto Children = const_cast<OMPUseDevicePtrClause *>(this)->children();
  7286.     return const_child_range(Children.begin(), Children.end());
  7287.   }
  7288.  
  7289.   child_range used_children() {
  7290.     return child_range(child_iterator(), child_iterator());
  7291.   }
  7292.   const_child_range used_children() const {
  7293.     return const_child_range(const_child_iterator(), const_child_iterator());
  7294.   }
  7295.  
  7296.   static bool classof(const OMPClause *T) {
  7297.     return T->getClauseKind() == llvm::omp::OMPC_use_device_ptr;
  7298.   }
  7299. };
  7300.  
  7301. /// This represents clause 'use_device_addr' in the '#pragma omp ...'
  7302. /// directives.
  7303. ///
  7304. /// \code
  7305. /// #pragma omp target data use_device_addr(a,b)
  7306. /// \endcode
  7307. /// In this example directive '#pragma omp target data' has clause
  7308. /// 'use_device_addr' with the variables 'a' and 'b'.
  7309. class OMPUseDeviceAddrClause final
  7310.     : public OMPMappableExprListClause<OMPUseDeviceAddrClause>,
  7311.       private llvm::TrailingObjects<
  7312.           OMPUseDeviceAddrClause, Expr *, ValueDecl *, unsigned,
  7313.           OMPClauseMappableExprCommon::MappableComponent> {
  7314.   friend class OMPClauseReader;
  7315.   friend OMPMappableExprListClause;
  7316.   friend OMPVarListClause;
  7317.   friend TrailingObjects;
  7318.  
  7319.   /// Build clause with number of variables \a NumVars.
  7320.   ///
  7321.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7322.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7323.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7324.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7325.   /// NumVars: number of expressions listed in this clause; 2)
  7326.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7327.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7328.   /// NumComponents: total number of expression components in the clause.
  7329.   explicit OMPUseDeviceAddrClause(const OMPVarListLocTy &Locs,
  7330.                                   const OMPMappableExprListSizeTy &Sizes)
  7331.       : OMPMappableExprListClause(llvm::omp::OMPC_use_device_addr, Locs,
  7332.                                   Sizes) {}
  7333.  
  7334.   /// Build an empty clause.
  7335.   ///
  7336.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7337.   /// NumVars: number of expressions listed in this clause; 2)
  7338.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7339.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7340.   /// NumComponents: total number of expression components in the clause.
  7341.   explicit OMPUseDeviceAddrClause(const OMPMappableExprListSizeTy &Sizes)
  7342.       : OMPMappableExprListClause(llvm::omp::OMPC_use_device_addr,
  7343.                                   OMPVarListLocTy(), Sizes) {}
  7344.  
  7345.   /// Define the sizes of each trailing object array except the last one. This
  7346.   /// is required for TrailingObjects to work properly.
  7347.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  7348.     return varlist_size();
  7349.   }
  7350.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  7351.     return getUniqueDeclarationsNum();
  7352.   }
  7353.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  7354.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  7355.   }
  7356.  
  7357. public:
  7358.   /// Creates clause with a list of variables \a Vars.
  7359.   ///
  7360.   /// \param C AST context.
  7361.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7362.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7363.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7364.   /// \param Vars The original expression used in the clause.
  7365.   /// \param Declarations Declarations used in the clause.
  7366.   /// \param ComponentLists Component lists used in the clause.
  7367.   static OMPUseDeviceAddrClause *
  7368.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  7369.          ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
  7370.          MappableExprComponentListsRef ComponentLists);
  7371.  
  7372.   /// Creates an empty clause with the place for \a NumVars variables.
  7373.   ///
  7374.   /// \param C AST context.
  7375.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7376.   /// NumVars: number of expressions listed in this clause; 2)
  7377.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7378.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7379.   /// NumComponents: total number of expression components in the clause.
  7380.   static OMPUseDeviceAddrClause *
  7381.   CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
  7382.  
  7383.   child_range children() {
  7384.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7385.                        reinterpret_cast<Stmt **>(varlist_end()));
  7386.   }
  7387.  
  7388.   const_child_range children() const {
  7389.     auto Children = const_cast<OMPUseDeviceAddrClause *>(this)->children();
  7390.     return const_child_range(Children.begin(), Children.end());
  7391.   }
  7392.  
  7393.   child_range used_children() {
  7394.     return child_range(child_iterator(), child_iterator());
  7395.   }
  7396.   const_child_range used_children() const {
  7397.     return const_child_range(const_child_iterator(), const_child_iterator());
  7398.   }
  7399.  
  7400.   static bool classof(const OMPClause *T) {
  7401.     return T->getClauseKind() == llvm::omp::OMPC_use_device_addr;
  7402.   }
  7403. };
  7404.  
  7405. /// This represents clause 'is_device_ptr' in the '#pragma omp ...'
  7406. /// directives.
  7407. ///
  7408. /// \code
  7409. /// #pragma omp target is_device_ptr(a,b)
  7410. /// \endcode
  7411. /// In this example directive '#pragma omp target' has clause
  7412. /// 'is_device_ptr' with the variables 'a' and 'b'.
  7413. class OMPIsDevicePtrClause final
  7414.     : public OMPMappableExprListClause<OMPIsDevicePtrClause>,
  7415.       private llvm::TrailingObjects<
  7416.           OMPIsDevicePtrClause, Expr *, ValueDecl *, unsigned,
  7417.           OMPClauseMappableExprCommon::MappableComponent> {
  7418.   friend class OMPClauseReader;
  7419.   friend OMPMappableExprListClause;
  7420.   friend OMPVarListClause;
  7421.   friend TrailingObjects;
  7422.  
  7423.   /// Build clause with number of variables \a NumVars.
  7424.   ///
  7425.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7426.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7427.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7428.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7429.   /// NumVars: number of expressions listed in this clause; 2)
  7430.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7431.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7432.   /// NumComponents: total number of expression components in the clause.
  7433.   explicit OMPIsDevicePtrClause(const OMPVarListLocTy &Locs,
  7434.                                 const OMPMappableExprListSizeTy &Sizes)
  7435.       : OMPMappableExprListClause(llvm::omp::OMPC_is_device_ptr, Locs, Sizes) {}
  7436.  
  7437.   /// Build an empty clause.
  7438.   ///
  7439.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7440.   /// NumVars: number of expressions listed in this clause; 2)
  7441.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7442.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7443.   /// NumComponents: total number of expression components in the clause.
  7444.   explicit OMPIsDevicePtrClause(const OMPMappableExprListSizeTy &Sizes)
  7445.       : OMPMappableExprListClause(llvm::omp::OMPC_is_device_ptr,
  7446.                                   OMPVarListLocTy(), Sizes) {}
  7447.  
  7448.   /// Define the sizes of each trailing object array except the last one. This
  7449.   /// is required for TrailingObjects to work properly.
  7450.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  7451.     return varlist_size();
  7452.   }
  7453.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  7454.     return getUniqueDeclarationsNum();
  7455.   }
  7456.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  7457.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  7458.   }
  7459.  
  7460. public:
  7461.   /// Creates clause with a list of variables \a Vars.
  7462.   ///
  7463.   /// \param C AST context.
  7464.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7465.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7466.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7467.   /// \param Vars The original expression used in the clause.
  7468.   /// \param Declarations Declarations used in the clause.
  7469.   /// \param ComponentLists Component lists used in the clause.
  7470.   static OMPIsDevicePtrClause *
  7471.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  7472.          ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
  7473.          MappableExprComponentListsRef ComponentLists);
  7474.  
  7475.   /// Creates an empty clause with the place for \a NumVars variables.
  7476.   ///
  7477.   /// \param C AST context.
  7478.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7479.   /// NumVars: number of expressions listed in this clause; 2)
  7480.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7481.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7482.   /// NumComponents: total number of expression components in the clause.
  7483.   static OMPIsDevicePtrClause *
  7484.   CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
  7485.  
  7486.   child_range children() {
  7487.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7488.                        reinterpret_cast<Stmt **>(varlist_end()));
  7489.   }
  7490.  
  7491.   const_child_range children() const {
  7492.     auto Children = const_cast<OMPIsDevicePtrClause *>(this)->children();
  7493.     return const_child_range(Children.begin(), Children.end());
  7494.   }
  7495.  
  7496.   child_range used_children() {
  7497.     return child_range(child_iterator(), child_iterator());
  7498.   }
  7499.   const_child_range used_children() const {
  7500.     return const_child_range(const_child_iterator(), const_child_iterator());
  7501.   }
  7502.  
  7503.   static bool classof(const OMPClause *T) {
  7504.     return T->getClauseKind() == llvm::omp::OMPC_is_device_ptr;
  7505.   }
  7506. };
  7507.  
  7508. /// This represents clause 'has_device_ptr' in the '#pragma omp ...'
  7509. /// directives.
  7510. ///
  7511. /// \code
  7512. /// #pragma omp target has_device_addr(a,b)
  7513. /// \endcode
  7514. /// In this example directive '#pragma omp target' has clause
  7515. /// 'has_device_ptr' with the variables 'a' and 'b'.
  7516. class OMPHasDeviceAddrClause final
  7517.     : public OMPMappableExprListClause<OMPHasDeviceAddrClause>,
  7518.       private llvm::TrailingObjects<
  7519.           OMPHasDeviceAddrClause, Expr *, ValueDecl *, unsigned,
  7520.           OMPClauseMappableExprCommon::MappableComponent> {
  7521.   friend class OMPClauseReader;
  7522.   friend OMPMappableExprListClause;
  7523.   friend OMPVarListClause;
  7524.   friend TrailingObjects;
  7525.  
  7526.   /// Build clause with number of variables \a NumVars.
  7527.   ///
  7528.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7529.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7530.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7531.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7532.   /// NumVars: number of expressions listed in this clause; 2)
  7533.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7534.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7535.   /// NumComponents: total number of expression components in the clause.
  7536.   explicit OMPHasDeviceAddrClause(const OMPVarListLocTy &Locs,
  7537.                                   const OMPMappableExprListSizeTy &Sizes)
  7538.       : OMPMappableExprListClause(llvm::omp::OMPC_has_device_addr, Locs,
  7539.                                   Sizes) {}
  7540.  
  7541.   /// Build an empty clause.
  7542.   ///
  7543.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7544.   /// NumVars: number of expressions listed in this clause; 2)
  7545.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7546.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7547.   /// NumComponents: total number of expression components in the clause.
  7548.   explicit OMPHasDeviceAddrClause(const OMPMappableExprListSizeTy &Sizes)
  7549.       : OMPMappableExprListClause(llvm::omp::OMPC_has_device_addr,
  7550.                                   OMPVarListLocTy(), Sizes) {}
  7551.  
  7552.   /// Define the sizes of each trailing object array except the last one. This
  7553.   /// is required for TrailingObjects to work properly.
  7554.   size_t numTrailingObjects(OverloadToken<Expr *>) const {
  7555.     return varlist_size();
  7556.   }
  7557.   size_t numTrailingObjects(OverloadToken<ValueDecl *>) const {
  7558.     return getUniqueDeclarationsNum();
  7559.   }
  7560.   size_t numTrailingObjects(OverloadToken<unsigned>) const {
  7561.     return getUniqueDeclarationsNum() + getTotalComponentListNum();
  7562.   }
  7563.  
  7564. public:
  7565.   /// Creates clause with a list of variables \a Vars.
  7566.   ///
  7567.   /// \param C AST context.
  7568.   /// \param Locs Locations needed to build a mappable clause. It includes 1)
  7569.   /// StartLoc: starting location of the clause (the clause keyword); 2)
  7570.   /// LParenLoc: location of '('; 3) EndLoc: ending location of the clause.
  7571.   /// \param Vars The original expression used in the clause.
  7572.   /// \param Declarations Declarations used in the clause.
  7573.   /// \param ComponentLists Component lists used in the clause.
  7574.   static OMPHasDeviceAddrClause *
  7575.   Create(const ASTContext &C, const OMPVarListLocTy &Locs,
  7576.          ArrayRef<Expr *> Vars, ArrayRef<ValueDecl *> Declarations,
  7577.          MappableExprComponentListsRef ComponentLists);
  7578.  
  7579.   /// Creates an empty clause with the place for \a NumVars variables.
  7580.   ///
  7581.   /// \param C AST context.
  7582.   /// \param Sizes All required sizes to build a mappable clause. It includes 1)
  7583.   /// NumVars: number of expressions listed in this clause; 2)
  7584.   /// NumUniqueDeclarations: number of unique base declarations in this clause;
  7585.   /// 3) NumComponentLists: number of component lists in this clause; and 4)
  7586.   /// NumComponents: total number of expression components in the clause.
  7587.   static OMPHasDeviceAddrClause *
  7588.   CreateEmpty(const ASTContext &C, const OMPMappableExprListSizeTy &Sizes);
  7589.  
  7590.   child_range children() {
  7591.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7592.                        reinterpret_cast<Stmt **>(varlist_end()));
  7593.   }
  7594.  
  7595.   const_child_range children() const {
  7596.     auto Children = const_cast<OMPHasDeviceAddrClause *>(this)->children();
  7597.     return const_child_range(Children.begin(), Children.end());
  7598.   }
  7599.  
  7600.   child_range used_children() {
  7601.     return child_range(child_iterator(), child_iterator());
  7602.   }
  7603.   const_child_range used_children() const {
  7604.     return const_child_range(const_child_iterator(), const_child_iterator());
  7605.   }
  7606.  
  7607.   static bool classof(const OMPClause *T) {
  7608.     return T->getClauseKind() == llvm::omp::OMPC_has_device_addr;
  7609.   }
  7610. };
  7611.  
  7612. /// This represents clause 'nontemporal' in the '#pragma omp ...' directives.
  7613. ///
  7614. /// \code
  7615. /// #pragma omp simd nontemporal(a)
  7616. /// \endcode
  7617. /// In this example directive '#pragma omp simd' has clause 'nontemporal' for
  7618. /// the variable 'a'.
  7619. class OMPNontemporalClause final
  7620.     : public OMPVarListClause<OMPNontemporalClause>,
  7621.       private llvm::TrailingObjects<OMPNontemporalClause, Expr *> {
  7622.   friend class OMPClauseReader;
  7623.   friend OMPVarListClause;
  7624.   friend TrailingObjects;
  7625.  
  7626.   /// Build clause with number of variables \a N.
  7627.   ///
  7628.   /// \param StartLoc Starting location of the clause.
  7629.   /// \param LParenLoc Location of '('.
  7630.   /// \param EndLoc Ending location of the clause.
  7631.   /// \param N Number of the variables in the clause.
  7632.   OMPNontemporalClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  7633.                        SourceLocation EndLoc, unsigned N)
  7634.       : OMPVarListClause<OMPNontemporalClause>(llvm::omp::OMPC_nontemporal,
  7635.                                                StartLoc, LParenLoc, EndLoc, N) {
  7636.   }
  7637.  
  7638.   /// Build an empty clause.
  7639.   ///
  7640.   /// \param N Number of variables.
  7641.   explicit OMPNontemporalClause(unsigned N)
  7642.       : OMPVarListClause<OMPNontemporalClause>(
  7643.             llvm::omp::OMPC_nontemporal, SourceLocation(), SourceLocation(),
  7644.             SourceLocation(), N) {}
  7645.  
  7646.   /// Get the list of privatied copies if the member expression was captured by
  7647.   /// one of the privatization clauses.
  7648.   MutableArrayRef<Expr *> getPrivateRefs() {
  7649.     return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
  7650.   }
  7651.   ArrayRef<const Expr *> getPrivateRefs() const {
  7652.     return llvm::ArrayRef(varlist_end(), varlist_size());
  7653.   }
  7654.  
  7655. public:
  7656.   /// Creates clause with a list of variables \a VL.
  7657.   ///
  7658.   /// \param C AST context.
  7659.   /// \param StartLoc Starting location of the clause.
  7660.   /// \param LParenLoc Location of '('.
  7661.   /// \param EndLoc Ending location of the clause.
  7662.   /// \param VL List of references to the variables.
  7663.   static OMPNontemporalClause *
  7664.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  7665.          SourceLocation EndLoc, ArrayRef<Expr *> VL);
  7666.  
  7667.   /// Creates an empty clause with the place for \a N variables.
  7668.   ///
  7669.   /// \param C AST context.
  7670.   /// \param N The number of variables.
  7671.   static OMPNontemporalClause *CreateEmpty(const ASTContext &C, unsigned N);
  7672.  
  7673.   /// Sets the list of references to private copies created in private clauses.
  7674.   /// \param VL List of references.
  7675.   void setPrivateRefs(ArrayRef<Expr *> VL);
  7676.  
  7677.   child_range children() {
  7678.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7679.                        reinterpret_cast<Stmt **>(varlist_end()));
  7680.   }
  7681.  
  7682.   const_child_range children() const {
  7683.     auto Children = const_cast<OMPNontemporalClause *>(this)->children();
  7684.     return const_child_range(Children.begin(), Children.end());
  7685.   }
  7686.  
  7687.   child_range private_refs() {
  7688.     return child_range(reinterpret_cast<Stmt **>(getPrivateRefs().begin()),
  7689.                        reinterpret_cast<Stmt **>(getPrivateRefs().end()));
  7690.   }
  7691.  
  7692.   const_child_range private_refs() const {
  7693.     auto Children = const_cast<OMPNontemporalClause *>(this)->private_refs();
  7694.     return const_child_range(Children.begin(), Children.end());
  7695.   }
  7696.  
  7697.   child_range used_children() {
  7698.     return child_range(child_iterator(), child_iterator());
  7699.   }
  7700.   const_child_range used_children() const {
  7701.     return const_child_range(const_child_iterator(), const_child_iterator());
  7702.   }
  7703.  
  7704.   static bool classof(const OMPClause *T) {
  7705.     return T->getClauseKind() == llvm::omp::OMPC_nontemporal;
  7706.   }
  7707. };
  7708.  
  7709. /// This represents 'order' clause in the '#pragma omp ...' directive.
  7710. ///
  7711. /// \code
  7712. /// #pragma omp simd order(concurrent)
  7713. /// \endcode
  7714. /// In this example directive '#pragma omp parallel' has simple 'order'
  7715. /// clause with kind 'concurrent'.
  7716. class OMPOrderClause final : public OMPClause {
  7717.   friend class OMPClauseReader;
  7718.  
  7719.   /// Location of '('.
  7720.   SourceLocation LParenLoc;
  7721.  
  7722.   /// A kind of the 'order' clause.
  7723.   OpenMPOrderClauseKind Kind = OMPC_ORDER_unknown;
  7724.  
  7725.   /// Start location of the kind in source code.
  7726.   SourceLocation KindKwLoc;
  7727.  
  7728.   /// A modifier for order clause
  7729.   OpenMPOrderClauseModifier Modifier = OMPC_ORDER_MODIFIER_unknown;
  7730.  
  7731.   /// Start location of the modifier in source code.
  7732.   SourceLocation ModifierKwLoc;
  7733.  
  7734.   /// Set kind of the clause.
  7735.   ///
  7736.   /// \param K Argument of clause.
  7737.   void setKind(OpenMPOrderClauseKind K) { Kind = K; }
  7738.  
  7739.   /// Set argument location.
  7740.   ///
  7741.   /// \param KLoc Argument location.
  7742.   void setKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
  7743.  
  7744.   /// Set modifier of the clause.
  7745.   ///
  7746.   /// \param M Argument of clause.
  7747.   void setModifier(OpenMPOrderClauseModifier M) { Modifier = M; }
  7748.  
  7749.   /// Set modifier location.
  7750.   ///
  7751.   /// \param MLoc Modifier keyword location.
  7752.   void setModifierKwLoc(SourceLocation MLoc) { ModifierKwLoc = MLoc; }
  7753.  
  7754. public:
  7755.   /// Build 'order' clause with argument \p A ('concurrent').
  7756.   ///
  7757.   /// \param A Argument of the clause ('concurrent').
  7758.   /// \param ALoc Starting location of the argument.
  7759.   /// \param StartLoc Starting location of the clause.
  7760.   /// \param LParenLoc Location of '('.
  7761.   /// \param EndLoc Ending location of the clause.
  7762.   /// \param Modifier The modifier applied to 'order' clause.
  7763.   /// \param MLoc Location of the modifier
  7764.   OMPOrderClause(OpenMPOrderClauseKind A, SourceLocation ALoc,
  7765.                  SourceLocation StartLoc, SourceLocation LParenLoc,
  7766.                  SourceLocation EndLoc, OpenMPOrderClauseModifier M,
  7767.                  SourceLocation MLoc)
  7768.       : OMPClause(llvm::omp::OMPC_order, StartLoc, EndLoc),
  7769.         LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), Modifier(M),
  7770.         ModifierKwLoc(MLoc) {}
  7771.  
  7772.   /// Build an empty clause.
  7773.   OMPOrderClause()
  7774.       : OMPClause(llvm::omp::OMPC_order, SourceLocation(), SourceLocation()) {}
  7775.  
  7776.   /// Sets the location of '('.
  7777.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  7778.  
  7779.   /// Returns the location of '('.
  7780.   SourceLocation getLParenLoc() const { return LParenLoc; }
  7781.  
  7782.   /// Returns kind of the clause.
  7783.   OpenMPOrderClauseKind getKind() const { return Kind; }
  7784.  
  7785.   /// Returns location of clause kind.
  7786.   SourceLocation getKindKwLoc() const { return KindKwLoc; }
  7787.  
  7788.   /// Returns Modifier of the clause.
  7789.   OpenMPOrderClauseModifier getModifier() const { return Modifier; }
  7790.  
  7791.   /// Returns location of clause modifier.
  7792.   SourceLocation getModifierKwLoc() const { return ModifierKwLoc; }
  7793.  
  7794.   child_range children() {
  7795.     return child_range(child_iterator(), child_iterator());
  7796.   }
  7797.  
  7798.   const_child_range children() const {
  7799.     return const_child_range(const_child_iterator(), const_child_iterator());
  7800.   }
  7801.  
  7802.   child_range used_children() {
  7803.     return child_range(child_iterator(), child_iterator());
  7804.   }
  7805.   const_child_range used_children() const {
  7806.     return const_child_range(const_child_iterator(), const_child_iterator());
  7807.   }
  7808.  
  7809.   static bool classof(const OMPClause *T) {
  7810.     return T->getClauseKind() == llvm::omp::OMPC_order;
  7811.   }
  7812. };
  7813.  
  7814. /// This represents the 'init' clause in '#pragma omp ...' directives.
  7815. ///
  7816. /// \code
  7817. /// #pragma omp interop init(target:obj)
  7818. /// \endcode
  7819. class OMPInitClause final
  7820.     : public OMPVarListClause<OMPInitClause>,
  7821.       private llvm::TrailingObjects<OMPInitClause, Expr *> {
  7822.   friend class OMPClauseReader;
  7823.   friend OMPVarListClause;
  7824.   friend TrailingObjects;
  7825.  
  7826.   /// Location of interop variable.
  7827.   SourceLocation VarLoc;
  7828.  
  7829.   bool IsTarget = false;
  7830.   bool IsTargetSync = false;
  7831.  
  7832.   void setInteropVar(Expr *E) { varlist_begin()[0] = E; }
  7833.  
  7834.   void setIsTarget(bool V) { IsTarget = V; }
  7835.  
  7836.   void setIsTargetSync(bool V) { IsTargetSync = V; }
  7837.  
  7838.   /// Sets the location of the interop variable.
  7839.   void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
  7840.  
  7841.   /// Build 'init' clause.
  7842.   ///
  7843.   /// \param IsTarget Uses the 'target' interop-type.
  7844.   /// \param IsTargetSync Uses the 'targetsync' interop-type.
  7845.   /// \param StartLoc Starting location of the clause.
  7846.   /// \param LParenLoc Location of '('.
  7847.   /// \param VarLoc Location of the interop variable.
  7848.   /// \param EndLoc Ending location of the clause.
  7849.   /// \param N Number of expressions.
  7850.   OMPInitClause(bool IsTarget, bool IsTargetSync, SourceLocation StartLoc,
  7851.                 SourceLocation LParenLoc, SourceLocation VarLoc,
  7852.                 SourceLocation EndLoc, unsigned N)
  7853.       : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, StartLoc,
  7854.                                         LParenLoc, EndLoc, N),
  7855.         VarLoc(VarLoc), IsTarget(IsTarget), IsTargetSync(IsTargetSync) {}
  7856.  
  7857.   /// Build an empty clause.
  7858.   OMPInitClause(unsigned N)
  7859.       : OMPVarListClause<OMPInitClause>(llvm::omp::OMPC_init, SourceLocation(),
  7860.                                         SourceLocation(), SourceLocation(), N) {
  7861.   }
  7862.  
  7863. public:
  7864.   /// Creates a fully specified clause.
  7865.   ///
  7866.   /// \param C AST context.
  7867.   /// \param InteropVar The interop variable.
  7868.   /// \param InteropInfo The interop-type and prefer_type list.
  7869.   /// \param StartLoc Starting location of the clause.
  7870.   /// \param LParenLoc Location of '('.
  7871.   /// \param VarLoc Location of the interop variable.
  7872.   /// \param EndLoc Ending location of the clause.
  7873.   static OMPInitClause *Create(const ASTContext &C, Expr *InteropVar,
  7874.                                OMPInteropInfo &InteropInfo,
  7875.                                SourceLocation StartLoc,
  7876.                                SourceLocation LParenLoc, SourceLocation VarLoc,
  7877.                                SourceLocation EndLoc);
  7878.  
  7879.   /// Creates an empty clause with \a N expressions.
  7880.   ///
  7881.   /// \param C AST context.
  7882.   /// \param N Number of expression items.
  7883.   static OMPInitClause *CreateEmpty(const ASTContext &C, unsigned N);
  7884.  
  7885.   /// Returns the location of the interop variable.
  7886.   SourceLocation getVarLoc() const { return VarLoc; }
  7887.  
  7888.   /// Returns the interop variable.
  7889.   Expr *getInteropVar() { return varlist_begin()[0]; }
  7890.   const Expr *getInteropVar() const { return varlist_begin()[0]; }
  7891.  
  7892.   /// Returns true is interop-type 'target' is used.
  7893.   bool getIsTarget() const { return IsTarget; }
  7894.  
  7895.   /// Returns true is interop-type 'targetsync' is used.
  7896.   bool getIsTargetSync() const { return IsTargetSync; }
  7897.  
  7898.   child_range children() {
  7899.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  7900.                        reinterpret_cast<Stmt **>(varlist_end()));
  7901.   }
  7902.  
  7903.   const_child_range children() const {
  7904.     auto Children = const_cast<OMPInitClause *>(this)->children();
  7905.     return const_child_range(Children.begin(), Children.end());
  7906.   }
  7907.  
  7908.   child_range used_children() {
  7909.     return child_range(child_iterator(), child_iterator());
  7910.   }
  7911.   const_child_range used_children() const {
  7912.     return const_child_range(const_child_iterator(), const_child_iterator());
  7913.   }
  7914.  
  7915.   using prefs_iterator = MutableArrayRef<Expr *>::iterator;
  7916.   using const_prefs_iterator = ArrayRef<const Expr *>::iterator;
  7917.   using prefs_range = llvm::iterator_range<prefs_iterator>;
  7918.   using const_prefs_range = llvm::iterator_range<const_prefs_iterator>;
  7919.  
  7920.   prefs_range prefs() {
  7921.     return prefs_range(reinterpret_cast<Expr **>(std::next(varlist_begin())),
  7922.                        reinterpret_cast<Expr **>(varlist_end()));
  7923.   }
  7924.  
  7925.   const_prefs_range prefs() const {
  7926.     auto Prefs = const_cast<OMPInitClause *>(this)->prefs();
  7927.     return const_prefs_range(Prefs.begin(), Prefs.end());
  7928.   }
  7929.  
  7930.   static bool classof(const OMPClause *T) {
  7931.     return T->getClauseKind() == llvm::omp::OMPC_init;
  7932.   }
  7933. };
  7934.  
  7935. /// This represents the 'use' clause in '#pragma omp ...' directives.
  7936. ///
  7937. /// \code
  7938. /// #pragma omp interop use(obj)
  7939. /// \endcode
  7940. class OMPUseClause final : public OMPClause {
  7941.   friend class OMPClauseReader;
  7942.  
  7943.   /// Location of '('.
  7944.   SourceLocation LParenLoc;
  7945.  
  7946.   /// Location of interop variable.
  7947.   SourceLocation VarLoc;
  7948.  
  7949.   /// The interop variable.
  7950.   Stmt *InteropVar = nullptr;
  7951.  
  7952.   /// Set the interop variable.
  7953.   void setInteropVar(Expr *E) { InteropVar = E; }
  7954.  
  7955.   /// Sets the location of '('.
  7956.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  7957.  
  7958.   /// Sets the location of the interop variable.
  7959.   void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
  7960.  
  7961. public:
  7962.   /// Build 'use' clause with and interop variable expression \a InteropVar.
  7963.   ///
  7964.   /// \param InteropVar The interop variable.
  7965.   /// \param StartLoc Starting location of the clause.
  7966.   /// \param LParenLoc Location of '('.
  7967.   /// \param VarLoc Location of the interop variable.
  7968.   /// \param EndLoc Ending location of the clause.
  7969.   OMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
  7970.                SourceLocation LParenLoc, SourceLocation VarLoc,
  7971.                SourceLocation EndLoc)
  7972.       : OMPClause(llvm::omp::OMPC_use, StartLoc, EndLoc), LParenLoc(LParenLoc),
  7973.         VarLoc(VarLoc), InteropVar(InteropVar) {}
  7974.  
  7975.   /// Build an empty clause.
  7976.   OMPUseClause()
  7977.       : OMPClause(llvm::omp::OMPC_use, SourceLocation(), SourceLocation()) {}
  7978.  
  7979.   /// Returns the location of '('.
  7980.   SourceLocation getLParenLoc() const { return LParenLoc; }
  7981.  
  7982.   /// Returns the location of the interop variable.
  7983.   SourceLocation getVarLoc() const { return VarLoc; }
  7984.  
  7985.   /// Returns the interop variable.
  7986.   Expr *getInteropVar() const { return cast<Expr>(InteropVar); }
  7987.  
  7988.   child_range children() { return child_range(&InteropVar, &InteropVar + 1); }
  7989.  
  7990.   const_child_range children() const {
  7991.     return const_child_range(&InteropVar, &InteropVar + 1);
  7992.   }
  7993.  
  7994.   child_range used_children() {
  7995.     return child_range(child_iterator(), child_iterator());
  7996.   }
  7997.   const_child_range used_children() const {
  7998.     return const_child_range(const_child_iterator(), const_child_iterator());
  7999.   }
  8000.  
  8001.   static bool classof(const OMPClause *T) {
  8002.     return T->getClauseKind() == llvm::omp::OMPC_use;
  8003.   }
  8004. };
  8005.  
  8006. /// This represents 'destroy' clause in the '#pragma omp depobj'
  8007. /// directive or the '#pragma omp interop' directive..
  8008. ///
  8009. /// \code
  8010. /// #pragma omp depobj(a) destroy
  8011. /// #pragma omp interop destroy(obj)
  8012. /// \endcode
  8013. /// In these examples directive '#pragma omp depobj' and '#pragma omp interop'
  8014. /// have a 'destroy' clause. The 'interop' directive includes an object.
  8015. class OMPDestroyClause final : public OMPClause {
  8016.   friend class OMPClauseReader;
  8017.  
  8018.   /// Location of '('.
  8019.   SourceLocation LParenLoc;
  8020.  
  8021.   /// Location of interop variable.
  8022.   SourceLocation VarLoc;
  8023.  
  8024.   /// The interop variable.
  8025.   Stmt *InteropVar = nullptr;
  8026.  
  8027.   /// Set the interop variable.
  8028.   void setInteropVar(Expr *E) { InteropVar = E; }
  8029.  
  8030.   /// Sets the location of '('.
  8031.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  8032.  
  8033.   /// Sets the location of the interop variable.
  8034.   void setVarLoc(SourceLocation Loc) { VarLoc = Loc; }
  8035.  
  8036. public:
  8037.   /// Build 'destroy' clause with an interop variable expression \a InteropVar.
  8038.   ///
  8039.   /// \param InteropVar The interop variable.
  8040.   /// \param StartLoc Starting location of the clause.
  8041.   /// \param LParenLoc Location of '('.
  8042.   /// \param VarLoc Location of the interop variable.
  8043.   /// \param EndLoc Ending location of the clause.
  8044.   OMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
  8045.                    SourceLocation LParenLoc, SourceLocation VarLoc,
  8046.                    SourceLocation EndLoc)
  8047.       : OMPClause(llvm::omp::OMPC_destroy, StartLoc, EndLoc),
  8048.         LParenLoc(LParenLoc), VarLoc(VarLoc), InteropVar(InteropVar) {}
  8049.  
  8050.   /// Build 'destroy' clause.
  8051.   ///
  8052.   /// \param StartLoc Starting location of the clause.
  8053.   /// \param EndLoc Ending location of the clause.
  8054.   OMPDestroyClause(SourceLocation StartLoc, SourceLocation EndLoc)
  8055.       : OMPClause(llvm::omp::OMPC_destroy, StartLoc, EndLoc) {}
  8056.  
  8057.   /// Build an empty clause.
  8058.   OMPDestroyClause()
  8059.       : OMPClause(llvm::omp::OMPC_destroy, SourceLocation(), SourceLocation()) {
  8060.   }
  8061.  
  8062.   /// Returns the location of '('.
  8063.   SourceLocation getLParenLoc() const { return LParenLoc; }
  8064.  
  8065.   /// Returns the location of the interop variable.
  8066.   SourceLocation getVarLoc() const { return VarLoc; }
  8067.  
  8068.   /// Returns the interop variable.
  8069.   Expr *getInteropVar() const { return cast_or_null<Expr>(InteropVar); }
  8070.  
  8071.   child_range children() {
  8072.     if (InteropVar)
  8073.       return child_range(&InteropVar, &InteropVar + 1);
  8074.     return child_range(child_iterator(), child_iterator());
  8075.   }
  8076.  
  8077.   const_child_range children() const {
  8078.     if (InteropVar)
  8079.       return const_child_range(&InteropVar, &InteropVar + 1);
  8080.     return const_child_range(const_child_iterator(), const_child_iterator());
  8081.   }
  8082.  
  8083.   child_range used_children() {
  8084.     return child_range(child_iterator(), child_iterator());
  8085.   }
  8086.   const_child_range used_children() const {
  8087.     return const_child_range(const_child_iterator(), const_child_iterator());
  8088.   }
  8089.  
  8090.   static bool classof(const OMPClause *T) {
  8091.     return T->getClauseKind() == llvm::omp::OMPC_destroy;
  8092.   }
  8093. };
  8094.  
  8095. /// This represents 'novariants' clause in the '#pragma omp ...' directive.
  8096. ///
  8097. /// \code
  8098. /// #pragma omp dispatch novariants(a > 5)
  8099. /// \endcode
  8100. /// In this example directive '#pragma omp dispatch' has simple 'novariants'
  8101. /// clause with condition 'a > 5'.
  8102. class OMPNovariantsClause final
  8103.     : public OMPOneStmtClause<llvm::omp::OMPC_novariants, OMPClause>,
  8104.       public OMPClauseWithPreInit {
  8105.   friend class OMPClauseReader;
  8106.  
  8107.   /// Set condition.
  8108.   void setCondition(Expr *Cond) { setStmt(Cond); }
  8109.  
  8110. public:
  8111.   /// Build 'novariants' clause with condition \a Cond.
  8112.   ///
  8113.   /// \param Cond Condition of the clause.
  8114.   /// \param HelperCond Helper condition for the construct.
  8115.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  8116.   /// clause must be captured.
  8117.   /// \param StartLoc Starting location of the clause.
  8118.   /// \param LParenLoc Location of '('.
  8119.   /// \param EndLoc Ending location of the clause.
  8120.   OMPNovariantsClause(Expr *Cond, Stmt *HelperCond,
  8121.                       OpenMPDirectiveKind CaptureRegion,
  8122.                       SourceLocation StartLoc, SourceLocation LParenLoc,
  8123.                       SourceLocation EndLoc)
  8124.       : OMPOneStmtClause(Cond, StartLoc, LParenLoc, EndLoc),
  8125.         OMPClauseWithPreInit(this) {
  8126.     setPreInitStmt(HelperCond, CaptureRegion);
  8127.   }
  8128.  
  8129.   /// Build an empty clause.
  8130.   OMPNovariantsClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  8131.  
  8132.   /// Returns condition.
  8133.   Expr *getCondition() const { return getStmtAs<Expr>(); }
  8134.  
  8135.   child_range used_children();
  8136.   const_child_range used_children() const {
  8137.     auto Children = const_cast<OMPNovariantsClause *>(this)->used_children();
  8138.     return const_child_range(Children.begin(), Children.end());
  8139.   }
  8140. };
  8141.  
  8142. /// This represents 'nocontext' clause in the '#pragma omp ...' directive.
  8143. ///
  8144. /// \code
  8145. /// #pragma omp dispatch nocontext(a > 5)
  8146. /// \endcode
  8147. /// In this example directive '#pragma omp dispatch' has simple 'nocontext'
  8148. /// clause with condition 'a > 5'.
  8149. class OMPNocontextClause final
  8150.     : public OMPOneStmtClause<llvm::omp::OMPC_nocontext, OMPClause>,
  8151.       public OMPClauseWithPreInit {
  8152.   friend class OMPClauseReader;
  8153.  
  8154.   /// Set condition.
  8155.   void setCondition(Expr *Cond) { setStmt(Cond); }
  8156.  
  8157. public:
  8158.   /// Build 'nocontext' clause with condition \a Cond.
  8159.   ///
  8160.   /// \param Cond Condition of the clause.
  8161.   /// \param HelperCond Helper condition for the construct.
  8162.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  8163.   /// clause must be captured.
  8164.   /// \param StartLoc Starting location of the clause.
  8165.   /// \param LParenLoc Location of '('.
  8166.   /// \param EndLoc Ending location of the clause.
  8167.   OMPNocontextClause(Expr *Cond, Stmt *HelperCond,
  8168.                      OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  8169.                      SourceLocation LParenLoc, SourceLocation EndLoc)
  8170.       : OMPOneStmtClause(Cond, StartLoc, LParenLoc, EndLoc),
  8171.         OMPClauseWithPreInit(this) {
  8172.     setPreInitStmt(HelperCond, CaptureRegion);
  8173.   }
  8174.  
  8175.   /// Build an empty clause.
  8176.   OMPNocontextClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  8177.  
  8178.   /// Returns condition.
  8179.   Expr *getCondition() const { return getStmtAs<Expr>(); }
  8180.  
  8181.   child_range used_children();
  8182.   const_child_range used_children() const {
  8183.     auto Children = const_cast<OMPNocontextClause *>(this)->used_children();
  8184.     return const_child_range(Children.begin(), Children.end());
  8185.   }
  8186. };
  8187.  
  8188. /// This represents 'detach' clause in the '#pragma omp task' directive.
  8189. ///
  8190. /// \code
  8191. /// #pragma omp task detach(evt)
  8192. /// \endcode
  8193. /// In this example directive '#pragma omp detach' has simple 'detach' clause
  8194. /// with the variable 'evt'.
  8195. class OMPDetachClause final
  8196.     : public OMPOneStmtClause<llvm::omp::OMPC_detach, OMPClause> {
  8197.   friend class OMPClauseReader;
  8198.  
  8199.   /// Set condition.
  8200.   void setEventHandler(Expr *E) { setStmt(E); }
  8201.  
  8202. public:
  8203.   /// Build 'detach' clause with event-handler \a Evt.
  8204.   ///
  8205.   /// \param Evt Event handler expression.
  8206.   /// \param StartLoc Starting location of the clause.
  8207.   /// \param LParenLoc Location of '('.
  8208.   /// \param EndLoc Ending location of the clause.
  8209.   OMPDetachClause(Expr *Evt, SourceLocation StartLoc, SourceLocation LParenLoc,
  8210.                   SourceLocation EndLoc)
  8211.       : OMPOneStmtClause(Evt, StartLoc, LParenLoc, EndLoc) {}
  8212.  
  8213.   /// Build an empty clause.
  8214.   OMPDetachClause() : OMPOneStmtClause() {}
  8215.  
  8216.   /// Returns event-handler expression.
  8217.   Expr *getEventHandler() const { return getStmtAs<Expr>(); }
  8218. };
  8219.  
  8220. /// This represents clause 'inclusive' in the '#pragma omp scan' directive.
  8221. ///
  8222. /// \code
  8223. /// #pragma omp scan inclusive(a,b)
  8224. /// \endcode
  8225. /// In this example directive '#pragma omp scan' has clause 'inclusive'
  8226. /// with the variables 'a' and 'b'.
  8227. class OMPInclusiveClause final
  8228.     : public OMPVarListClause<OMPInclusiveClause>,
  8229.       private llvm::TrailingObjects<OMPInclusiveClause, Expr *> {
  8230.   friend class OMPClauseReader;
  8231.   friend OMPVarListClause;
  8232.   friend TrailingObjects;
  8233.  
  8234.   /// Build clause with number of variables \a N.
  8235.   ///
  8236.   /// \param StartLoc Starting location of the clause.
  8237.   /// \param LParenLoc Location of '('.
  8238.   /// \param EndLoc Ending location of the clause.
  8239.   /// \param N Number of the variables in the clause.
  8240.   OMPInclusiveClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  8241.                      SourceLocation EndLoc, unsigned N)
  8242.       : OMPVarListClause<OMPInclusiveClause>(llvm::omp::OMPC_inclusive,
  8243.                                              StartLoc, LParenLoc, EndLoc, N) {}
  8244.  
  8245.   /// Build an empty clause.
  8246.   ///
  8247.   /// \param N Number of variables.
  8248.   explicit OMPInclusiveClause(unsigned N)
  8249.       : OMPVarListClause<OMPInclusiveClause>(llvm::omp::OMPC_inclusive,
  8250.                                              SourceLocation(), SourceLocation(),
  8251.                                              SourceLocation(), N) {}
  8252.  
  8253. public:
  8254.   /// Creates clause with a list of variables \a VL.
  8255.   ///
  8256.   /// \param C AST context.
  8257.   /// \param StartLoc Starting location of the clause.
  8258.   /// \param LParenLoc Location of '('.
  8259.   /// \param EndLoc Ending location of the clause.
  8260.   /// \param VL List of references to the original variables.
  8261.   static OMPInclusiveClause *Create(const ASTContext &C,
  8262.                                     SourceLocation StartLoc,
  8263.                                     SourceLocation LParenLoc,
  8264.                                     SourceLocation EndLoc, ArrayRef<Expr *> VL);
  8265.  
  8266.   /// Creates an empty clause with the place for \a N variables.
  8267.   ///
  8268.   /// \param C AST context.
  8269.   /// \param N The number of variables.
  8270.   static OMPInclusiveClause *CreateEmpty(const ASTContext &C, unsigned N);
  8271.  
  8272.   child_range children() {
  8273.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  8274.                        reinterpret_cast<Stmt **>(varlist_end()));
  8275.   }
  8276.  
  8277.   const_child_range children() const {
  8278.     auto Children = const_cast<OMPInclusiveClause *>(this)->children();
  8279.     return const_child_range(Children.begin(), Children.end());
  8280.   }
  8281.  
  8282.   child_range used_children() {
  8283.     return child_range(child_iterator(), child_iterator());
  8284.   }
  8285.   const_child_range used_children() const {
  8286.     return const_child_range(const_child_iterator(), const_child_iterator());
  8287.   }
  8288.  
  8289.   static bool classof(const OMPClause *T) {
  8290.     return T->getClauseKind() == llvm::omp::OMPC_inclusive;
  8291.   }
  8292. };
  8293.  
  8294. /// This represents clause 'exclusive' in the '#pragma omp scan' directive.
  8295. ///
  8296. /// \code
  8297. /// #pragma omp scan exclusive(a,b)
  8298. /// \endcode
  8299. /// In this example directive '#pragma omp scan' has clause 'exclusive'
  8300. /// with the variables 'a' and 'b'.
  8301. class OMPExclusiveClause final
  8302.     : public OMPVarListClause<OMPExclusiveClause>,
  8303.       private llvm::TrailingObjects<OMPExclusiveClause, Expr *> {
  8304.   friend class OMPClauseReader;
  8305.   friend OMPVarListClause;
  8306.   friend TrailingObjects;
  8307.  
  8308.   /// Build clause with number of variables \a N.
  8309.   ///
  8310.   /// \param StartLoc Starting location of the clause.
  8311.   /// \param LParenLoc Location of '('.
  8312.   /// \param EndLoc Ending location of the clause.
  8313.   /// \param N Number of the variables in the clause.
  8314.   OMPExclusiveClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  8315.                      SourceLocation EndLoc, unsigned N)
  8316.       : OMPVarListClause<OMPExclusiveClause>(llvm::omp::OMPC_exclusive,
  8317.                                              StartLoc, LParenLoc, EndLoc, N) {}
  8318.  
  8319.   /// Build an empty clause.
  8320.   ///
  8321.   /// \param N Number of variables.
  8322.   explicit OMPExclusiveClause(unsigned N)
  8323.       : OMPVarListClause<OMPExclusiveClause>(llvm::omp::OMPC_exclusive,
  8324.                                              SourceLocation(), SourceLocation(),
  8325.                                              SourceLocation(), N) {}
  8326.  
  8327. public:
  8328.   /// Creates clause with a list of variables \a VL.
  8329.   ///
  8330.   /// \param C AST context.
  8331.   /// \param StartLoc Starting location of the clause.
  8332.   /// \param LParenLoc Location of '('.
  8333.   /// \param EndLoc Ending location of the clause.
  8334.   /// \param VL List of references to the original variables.
  8335.   static OMPExclusiveClause *Create(const ASTContext &C,
  8336.                                     SourceLocation StartLoc,
  8337.                                     SourceLocation LParenLoc,
  8338.                                     SourceLocation EndLoc, ArrayRef<Expr *> VL);
  8339.  
  8340.   /// Creates an empty clause with the place for \a N variables.
  8341.   ///
  8342.   /// \param C AST context.
  8343.   /// \param N The number of variables.
  8344.   static OMPExclusiveClause *CreateEmpty(const ASTContext &C, unsigned N);
  8345.  
  8346.   child_range children() {
  8347.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  8348.                        reinterpret_cast<Stmt **>(varlist_end()));
  8349.   }
  8350.  
  8351.   const_child_range children() const {
  8352.     auto Children = const_cast<OMPExclusiveClause *>(this)->children();
  8353.     return const_child_range(Children.begin(), Children.end());
  8354.   }
  8355.  
  8356.   child_range used_children() {
  8357.     return child_range(child_iterator(), child_iterator());
  8358.   }
  8359.   const_child_range used_children() const {
  8360.     return const_child_range(const_child_iterator(), const_child_iterator());
  8361.   }
  8362.  
  8363.   static bool classof(const OMPClause *T) {
  8364.     return T->getClauseKind() == llvm::omp::OMPC_exclusive;
  8365.   }
  8366. };
  8367.  
  8368. /// This represents clause 'uses_allocators' in the '#pragma omp target'-based
  8369. /// directives.
  8370. ///
  8371. /// \code
  8372. /// #pragma omp target uses_allocators(default_allocator, my_allocator(traits))
  8373. /// \endcode
  8374. /// In this example directive '#pragma omp target' has clause 'uses_allocators'
  8375. /// with the allocators 'default_allocator' and user-defined 'my_allocator'.
  8376. class OMPUsesAllocatorsClause final
  8377.     : public OMPClause,
  8378.       private llvm::TrailingObjects<OMPUsesAllocatorsClause, Expr *,
  8379.                                     SourceLocation> {
  8380. public:
  8381.   /// Data for list of allocators.
  8382.   struct Data {
  8383.     /// Allocator.
  8384.     Expr *Allocator = nullptr;
  8385.     /// Allocator traits.
  8386.     Expr *AllocatorTraits = nullptr;
  8387.     /// Locations of '(' and ')' symbols.
  8388.     SourceLocation LParenLoc, RParenLoc;
  8389.   };
  8390.  
  8391. private:
  8392.   friend class OMPClauseReader;
  8393.   friend TrailingObjects;
  8394.  
  8395.   enum class ExprOffsets {
  8396.     Allocator,
  8397.     AllocatorTraits,
  8398.     Total,
  8399.   };
  8400.  
  8401.   enum class ParenLocsOffsets {
  8402.     LParen,
  8403.     RParen,
  8404.     Total,
  8405.   };
  8406.  
  8407.   /// Location of '('.
  8408.   SourceLocation LParenLoc;
  8409.   /// Total number of allocators in the clause.
  8410.   unsigned NumOfAllocators = 0;
  8411.  
  8412.   /// Build clause.
  8413.   ///
  8414.   /// \param StartLoc Starting location of the clause.
  8415.   /// \param LParenLoc Location of '('.
  8416.   /// \param EndLoc Ending location of the clause.
  8417.   /// \param N Number of allocators associated with the clause.
  8418.   OMPUsesAllocatorsClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  8419.                           SourceLocation EndLoc, unsigned N)
  8420.       : OMPClause(llvm::omp::OMPC_uses_allocators, StartLoc, EndLoc),
  8421.         LParenLoc(LParenLoc), NumOfAllocators(N) {}
  8422.  
  8423.   /// Build an empty clause.
  8424.   /// \param N Number of allocators associated with the clause.
  8425.   ///
  8426.   explicit OMPUsesAllocatorsClause(unsigned N)
  8427.       : OMPClause(llvm::omp::OMPC_uses_allocators, SourceLocation(),
  8428.                   SourceLocation()),
  8429.         NumOfAllocators(N) {}
  8430.  
  8431.   unsigned numTrailingObjects(OverloadToken<Expr *>) const {
  8432.     return NumOfAllocators * static_cast<int>(ExprOffsets::Total);
  8433.   }
  8434.  
  8435.   /// Sets the location of '('.
  8436.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  8437.  
  8438.   /// Sets the allocators data for the clause.
  8439.   void setAllocatorsData(ArrayRef<OMPUsesAllocatorsClause::Data> Data);
  8440.  
  8441. public:
  8442.   /// Creates clause with a list of allocators \p Data.
  8443.   ///
  8444.   /// \param C AST context.
  8445.   /// \param StartLoc Starting location of the clause.
  8446.   /// \param LParenLoc Location of '('.
  8447.   /// \param EndLoc Ending location of the clause.
  8448.   /// \param Data List of allocators.
  8449.   static OMPUsesAllocatorsClause *
  8450.   Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
  8451.          SourceLocation EndLoc, ArrayRef<OMPUsesAllocatorsClause::Data> Data);
  8452.  
  8453.   /// Creates an empty clause with the place for \p N allocators.
  8454.   ///
  8455.   /// \param C AST context.
  8456.   /// \param N The number of allocators.
  8457.   static OMPUsesAllocatorsClause *CreateEmpty(const ASTContext &C, unsigned N);
  8458.  
  8459.   /// Returns the location of '('.
  8460.   SourceLocation getLParenLoc() const { return LParenLoc; }
  8461.  
  8462.   /// Returns number of allocators associated with the clause.
  8463.   unsigned getNumberOfAllocators() const { return NumOfAllocators; }
  8464.  
  8465.   /// Returns data for the specified allocator.
  8466.   OMPUsesAllocatorsClause::Data getAllocatorData(unsigned I) const;
  8467.  
  8468.   // Iterators
  8469.   child_range children() {
  8470.     Stmt **Begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
  8471.     return child_range(Begin, Begin + NumOfAllocators *
  8472.                                           static_cast<int>(ExprOffsets::Total));
  8473.   }
  8474.   const_child_range children() const {
  8475.     Stmt *const *Begin =
  8476.         reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
  8477.     return const_child_range(
  8478.         Begin, Begin + NumOfAllocators * static_cast<int>(ExprOffsets::Total));
  8479.   }
  8480.  
  8481.   child_range used_children() {
  8482.     return child_range(child_iterator(), child_iterator());
  8483.   }
  8484.   const_child_range used_children() const {
  8485.     return const_child_range(const_child_iterator(), const_child_iterator());
  8486.   }
  8487.  
  8488.   static bool classof(const OMPClause *T) {
  8489.     return T->getClauseKind() == llvm::omp::OMPC_uses_allocators;
  8490.   }
  8491. };
  8492.  
  8493. /// This represents clause 'affinity' in the '#pragma omp task'-based
  8494. /// directives.
  8495. ///
  8496. /// \code
  8497. /// #pragma omp task affinity(iterator(i = 0:n) : ([3][n])a, b[:n], c[i])
  8498. /// \endcode
  8499. /// In this example directive '#pragma omp task' has clause 'affinity' with the
  8500. /// affinity modifer 'iterator(i = 0:n)' and locator items '([3][n])a', 'b[:n]'
  8501. /// and 'c[i]'.
  8502. class OMPAffinityClause final
  8503.     : public OMPVarListClause<OMPAffinityClause>,
  8504.       private llvm::TrailingObjects<OMPAffinityClause, Expr *> {
  8505.   friend class OMPClauseReader;
  8506.   friend OMPVarListClause;
  8507.   friend TrailingObjects;
  8508.  
  8509.   /// Location of ':' symbol.
  8510.   SourceLocation ColonLoc;
  8511.  
  8512.   /// Build clause.
  8513.   ///
  8514.   /// \param StartLoc Starting location of the clause.
  8515.   /// \param LParenLoc Location of '('.
  8516.   /// \param ColonLoc Location of ':'.
  8517.   /// \param EndLoc Ending location of the clause.
  8518.   /// \param N Number of locators associated with the clause.
  8519.   OMPAffinityClause(SourceLocation StartLoc, SourceLocation LParenLoc,
  8520.                     SourceLocation ColonLoc, SourceLocation EndLoc, unsigned N)
  8521.       : OMPVarListClause<OMPAffinityClause>(llvm::omp::OMPC_affinity, StartLoc,
  8522.                                             LParenLoc, EndLoc, N) {}
  8523.  
  8524.   /// Build an empty clause.
  8525.   /// \param N Number of locators associated with the clause.
  8526.   ///
  8527.   explicit OMPAffinityClause(unsigned N)
  8528.       : OMPVarListClause<OMPAffinityClause>(llvm::omp::OMPC_affinity,
  8529.                                             SourceLocation(), SourceLocation(),
  8530.                                             SourceLocation(), N) {}
  8531.  
  8532.   /// Sets the affinity modifier for the clause, if any.
  8533.   void setModifier(Expr *E) {
  8534.     getTrailingObjects<Expr *>()[varlist_size()] = E;
  8535.   }
  8536.  
  8537.   /// Sets the location of ':' symbol.
  8538.   void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
  8539.  
  8540. public:
  8541.   /// Creates clause with a modifier a list of locator items.
  8542.   ///
  8543.   /// \param C AST context.
  8544.   /// \param StartLoc Starting location of the clause.
  8545.   /// \param LParenLoc Location of '('.
  8546.   /// \param ColonLoc Location of ':'.
  8547.   /// \param EndLoc Ending location of the clause.
  8548.   /// \param Locators List of locator items.
  8549.   static OMPAffinityClause *Create(const ASTContext &C, SourceLocation StartLoc,
  8550.                                    SourceLocation LParenLoc,
  8551.                                    SourceLocation ColonLoc,
  8552.                                    SourceLocation EndLoc, Expr *Modifier,
  8553.                                    ArrayRef<Expr *> Locators);
  8554.  
  8555.   /// Creates an empty clause with the place for \p N locator items.
  8556.   ///
  8557.   /// \param C AST context.
  8558.   /// \param N The number of locator items.
  8559.   static OMPAffinityClause *CreateEmpty(const ASTContext &C, unsigned N);
  8560.  
  8561.   /// Gets affinity modifier.
  8562.   Expr *getModifier() { return getTrailingObjects<Expr *>()[varlist_size()]; }
  8563.   Expr *getModifier() const {
  8564.     return getTrailingObjects<Expr *>()[varlist_size()];
  8565.   }
  8566.  
  8567.   /// Gets the location of ':' symbol.
  8568.   SourceLocation getColonLoc() const { return ColonLoc; }
  8569.  
  8570.   // Iterators
  8571.   child_range children() {
  8572.     int Offset = getModifier() ? 1 : 0;
  8573.     return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
  8574.                        reinterpret_cast<Stmt **>(varlist_end() + Offset));
  8575.   }
  8576.  
  8577.   const_child_range children() const {
  8578.     auto Children = const_cast<OMPAffinityClause *>(this)->children();
  8579.     return const_child_range(Children.begin(), Children.end());
  8580.   }
  8581.  
  8582.   child_range used_children() {
  8583.     return child_range(child_iterator(), child_iterator());
  8584.   }
  8585.   const_child_range used_children() const {
  8586.     return const_child_range(const_child_iterator(), const_child_iterator());
  8587.   }
  8588.  
  8589.   static bool classof(const OMPClause *T) {
  8590.     return T->getClauseKind() == llvm::omp::OMPC_affinity;
  8591.   }
  8592. };
  8593.  
  8594. /// This represents 'filter' clause in the '#pragma omp ...' directive.
  8595. ///
  8596. /// \code
  8597. /// #pragma omp masked filter(tid)
  8598. /// \endcode
  8599. /// In this example directive '#pragma omp masked' has 'filter' clause with
  8600. /// thread id.
  8601. class OMPFilterClause final
  8602.     : public OMPOneStmtClause<llvm::omp::OMPC_filter, OMPClause>,
  8603.       public OMPClauseWithPreInit {
  8604.   friend class OMPClauseReader;
  8605.  
  8606.   /// Sets the thread identifier.
  8607.   void setThreadID(Expr *TID) { setStmt(TID); }
  8608.  
  8609. public:
  8610.   /// Build 'filter' clause with thread-id \a ThreadID.
  8611.   ///
  8612.   /// \param ThreadID Thread identifier.
  8613.   /// \param HelperE Helper expression associated with this clause.
  8614.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  8615.   /// clause must be captured.
  8616.   /// \param StartLoc Starting location of the clause.
  8617.   /// \param LParenLoc Location of '('.
  8618.   /// \param EndLoc Ending location of the clause.
  8619.   OMPFilterClause(Expr *ThreadID, Stmt *HelperE,
  8620.                   OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
  8621.                   SourceLocation LParenLoc, SourceLocation EndLoc)
  8622.       : OMPOneStmtClause(ThreadID, StartLoc, LParenLoc, EndLoc),
  8623.         OMPClauseWithPreInit(this) {
  8624.     setPreInitStmt(HelperE, CaptureRegion);
  8625.   }
  8626.  
  8627.   /// Build an empty clause.
  8628.   OMPFilterClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  8629.  
  8630.   /// Return thread identifier.
  8631.   Expr *getThreadID() const { return getStmtAs<Expr>(); }
  8632.  
  8633.   /// Return thread identifier.
  8634.   Expr *getThreadID() { return getStmtAs<Expr>(); }
  8635. };
  8636.  
  8637. /// This represents 'bind' clause in the '#pragma omp ...' directives.
  8638. ///
  8639. /// \code
  8640. /// #pragma omp loop bind(parallel)
  8641. /// \endcode
  8642. class OMPBindClause final : public OMPNoChildClause<llvm::omp::OMPC_bind> {
  8643.   friend class OMPClauseReader;
  8644.  
  8645.   /// Location of '('.
  8646.   SourceLocation LParenLoc;
  8647.  
  8648.   /// The binding kind of 'bind' clause.
  8649.   OpenMPBindClauseKind Kind = OMPC_BIND_unknown;
  8650.  
  8651.   /// Start location of the kind in source code.
  8652.   SourceLocation KindLoc;
  8653.  
  8654.   /// Sets the location of '('.
  8655.   void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
  8656.  
  8657.   /// Set the binding kind.
  8658.   void setBindKind(OpenMPBindClauseKind K) { Kind = K; }
  8659.  
  8660.   /// Set the binding kind location.
  8661.   void setBindKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
  8662.  
  8663.   /// Build 'bind' clause with kind \a K ('teams', 'parallel', or 'thread').
  8664.   ///
  8665.   /// \param K Binding kind of the clause ('teams', 'parallel' or 'thread').
  8666.   /// \param KLoc Starting location of the binding kind.
  8667.   /// \param StartLoc Starting location of the clause.
  8668.   /// \param LParenLoc Location of '('.
  8669.   /// \param EndLoc Ending location of the clause.
  8670.   OMPBindClause(OpenMPBindClauseKind K, SourceLocation KLoc,
  8671.                 SourceLocation StartLoc, SourceLocation LParenLoc,
  8672.                 SourceLocation EndLoc)
  8673.       : OMPNoChildClause(StartLoc, EndLoc), LParenLoc(LParenLoc), Kind(K),
  8674.         KindLoc(KLoc) {}
  8675.  
  8676.   /// Build an empty clause.
  8677.   OMPBindClause() : OMPNoChildClause() {}
  8678.  
  8679. public:
  8680.   /// Build 'bind' clause with kind \a K ('teams', 'parallel', or 'thread').
  8681.   ///
  8682.   /// \param C AST context
  8683.   /// \param K Binding kind of the clause ('teams', 'parallel' or 'thread').
  8684.   /// \param KLoc Starting location of the binding kind.
  8685.   /// \param StartLoc Starting location of the clause.
  8686.   /// \param LParenLoc Location of '('.
  8687.   /// \param EndLoc Ending location of the clause.
  8688.   static OMPBindClause *Create(const ASTContext &C, OpenMPBindClauseKind K,
  8689.                                SourceLocation KLoc, SourceLocation StartLoc,
  8690.                                SourceLocation LParenLoc, SourceLocation EndLoc);
  8691.  
  8692.   /// Build an empty 'bind' clause.
  8693.   ///
  8694.   /// \param C AST context
  8695.   static OMPBindClause *CreateEmpty(const ASTContext &C);
  8696.  
  8697.   /// Returns the location of '('.
  8698.   SourceLocation getLParenLoc() const { return LParenLoc; }
  8699.  
  8700.   /// Returns kind of the clause.
  8701.   OpenMPBindClauseKind getBindKind() const { return Kind; }
  8702.  
  8703.   /// Returns location of clause kind.
  8704.   SourceLocation getBindKindLoc() const { return KindLoc; }
  8705. };
  8706.  
  8707. /// This class implements a simple visitor for OMPClause
  8708. /// subclasses.
  8709. template<class ImplClass, template <typename> class Ptr, typename RetTy>
  8710. class OMPClauseVisitorBase {
  8711. public:
  8712. #define PTR(CLASS) Ptr<CLASS>
  8713. #define DISPATCH(CLASS) \
  8714.   return static_cast<ImplClass*>(this)->Visit##CLASS(static_cast<PTR(CLASS)>(S))
  8715.  
  8716. #define GEN_CLANG_CLAUSE_CLASS
  8717. #define CLAUSE_CLASS(Enum, Str, Class)                                         \
  8718.   RetTy Visit##Class(PTR(Class) S) { DISPATCH(Class); }
  8719. #include "llvm/Frontend/OpenMP/OMP.inc"
  8720.  
  8721.   RetTy Visit(PTR(OMPClause) S) {
  8722.     // Top switch clause: visit each OMPClause.
  8723.     switch (S->getClauseKind()) {
  8724. #define GEN_CLANG_CLAUSE_CLASS
  8725. #define CLAUSE_CLASS(Enum, Str, Class)                                         \
  8726.   case llvm::omp::Clause::Enum:                                                \
  8727.     return Visit##Class(static_cast<PTR(Class)>(S));
  8728. #define CLAUSE_NO_CLASS(Enum, Str)                                             \
  8729.   case llvm::omp::Clause::Enum:                                                \
  8730.     break;
  8731. #include "llvm/Frontend/OpenMP/OMP.inc"
  8732.     }
  8733.   }
  8734.   // Base case, ignore it. :)
  8735.   RetTy VisitOMPClause(PTR(OMPClause) Node) { return RetTy(); }
  8736. #undef PTR
  8737. #undef DISPATCH
  8738. };
  8739.  
  8740. template <typename T> using const_ptr = std::add_pointer_t<std::add_const_t<T>>;
  8741.  
  8742. template <class ImplClass, typename RetTy = void>
  8743. class OMPClauseVisitor
  8744.     : public OMPClauseVisitorBase<ImplClass, std::add_pointer_t, RetTy> {};
  8745. template<class ImplClass, typename RetTy = void>
  8746. class ConstOMPClauseVisitor :
  8747.       public OMPClauseVisitorBase <ImplClass, const_ptr, RetTy> {};
  8748.  
  8749. class OMPClausePrinter final : public OMPClauseVisitor<OMPClausePrinter> {
  8750.   raw_ostream &OS;
  8751.   const PrintingPolicy &Policy;
  8752.  
  8753.   /// Process clauses with list of variables.
  8754.   template <typename T> void VisitOMPClauseList(T *Node, char StartSym);
  8755.   /// Process motion clauses.
  8756.   template <typename T> void VisitOMPMotionClause(T *Node);
  8757.  
  8758. public:
  8759.   OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy)
  8760.       : OS(OS), Policy(Policy) {}
  8761.  
  8762. #define GEN_CLANG_CLAUSE_CLASS
  8763. #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *S);
  8764. #include "llvm/Frontend/OpenMP/OMP.inc"
  8765. };
  8766.  
  8767. struct OMPTraitProperty {
  8768.   llvm::omp::TraitProperty Kind = llvm::omp::TraitProperty::invalid;
  8769.  
  8770.   /// The raw string as we parsed it. This is needed for the `isa` trait set
  8771.   /// (which accepts anything) and (later) extensions.
  8772.   StringRef RawString;
  8773. };
  8774. struct OMPTraitSelector {
  8775.   Expr *ScoreOrCondition = nullptr;
  8776.   llvm::omp::TraitSelector Kind = llvm::omp::TraitSelector::invalid;
  8777.   llvm::SmallVector<OMPTraitProperty, 1> Properties;
  8778. };
  8779. struct OMPTraitSet {
  8780.   llvm::omp::TraitSet Kind = llvm::omp::TraitSet::invalid;
  8781.   llvm::SmallVector<OMPTraitSelector, 2> Selectors;
  8782. };
  8783.  
  8784. /// Helper data structure representing the traits in a match clause of an
  8785. /// `declare variant` or `metadirective`. The outer level is an ordered
  8786. /// collection of selector sets, each with an associated kind and an ordered
  8787. /// collection of selectors. A selector has a kind, an optional score/condition,
  8788. /// and an ordered collection of properties.
  8789. class OMPTraitInfo {
  8790.   /// Private constructor accesible only by ASTContext.
  8791.   OMPTraitInfo() {}
  8792.   friend class ASTContext;
  8793.  
  8794. public:
  8795.   /// Reconstruct a (partial) OMPTraitInfo object from a mangled name.
  8796.   OMPTraitInfo(StringRef MangledName);
  8797.  
  8798.   /// The outermost level of selector sets.
  8799.   llvm::SmallVector<OMPTraitSet, 2> Sets;
  8800.  
  8801.   bool anyScoreOrCondition(
  8802.       llvm::function_ref<bool(Expr *&, bool /* IsScore */)> Cond) {
  8803.     return llvm::any_of(Sets, [&](OMPTraitSet &Set) {
  8804.       return llvm::any_of(
  8805.           Set.Selectors, [&](OMPTraitSelector &Selector) {
  8806.             return Cond(Selector.ScoreOrCondition,
  8807.                         /* IsScore */ Selector.Kind !=
  8808.                             llvm::omp::TraitSelector::user_condition);
  8809.           });
  8810.     });
  8811.   }
  8812.  
  8813.   /// Create a variant match info object from this trait info object. While the
  8814.   /// former is a flat representation the actual main difference is that the
  8815.   /// latter uses clang::Expr to store the score/condition while the former is
  8816.   /// independent of clang. Thus, expressions and conditions are evaluated in
  8817.   /// this method.
  8818.   void getAsVariantMatchInfo(ASTContext &ASTCtx,
  8819.                              llvm::omp::VariantMatchInfo &VMI) const;
  8820.  
  8821.   /// Return a string representation identifying this context selector.
  8822.   std::string getMangledName() const;
  8823.  
  8824.   /// Check the extension trait \p TP is active.
  8825.   bool isExtensionActive(llvm::omp::TraitProperty TP) {
  8826.     for (const OMPTraitSet &Set : Sets) {
  8827.       if (Set.Kind != llvm::omp::TraitSet::implementation)
  8828.         continue;
  8829.       for (const OMPTraitSelector &Selector : Set.Selectors) {
  8830.         if (Selector.Kind != llvm::omp::TraitSelector::implementation_extension)
  8831.           continue;
  8832.         for (const OMPTraitProperty &Property : Selector.Properties) {
  8833.           if (Property.Kind == TP)
  8834.             return true;
  8835.         }
  8836.       }
  8837.     }
  8838.     return false;
  8839.   }
  8840.  
  8841.   /// Print a human readable representation into \p OS.
  8842.   void print(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const;
  8843. };
  8844. llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo &TI);
  8845. llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const OMPTraitInfo *TI);
  8846.  
  8847. /// Clang specific specialization of the OMPContext to lookup target features.
  8848. struct TargetOMPContext final : public llvm::omp::OMPContext {
  8849.   TargetOMPContext(ASTContext &ASTCtx,
  8850.                    std::function<void(StringRef)> &&DiagUnknownTrait,
  8851.                    const FunctionDecl *CurrentFunctionDecl,
  8852.                    ArrayRef<llvm::omp::TraitProperty> ConstructTraits);
  8853.  
  8854.   virtual ~TargetOMPContext() = default;
  8855.  
  8856.   /// See llvm::omp::OMPContext::matchesISATrait
  8857.   bool matchesISATrait(StringRef RawString) const override;
  8858.  
  8859. private:
  8860.   std::function<bool(StringRef)> FeatureValidityCheck;
  8861.   std::function<void(StringRef)> DiagUnknownTrait;
  8862.   llvm::StringMap<bool> FeatureMap;
  8863. };
  8864.  
  8865. /// Contains data for OpenMP directives: clauses, children
  8866. /// expressions/statements (helpers for codegen) and associated statement, if
  8867. /// any.
  8868. class OMPChildren final
  8869.     : private llvm::TrailingObjects<OMPChildren, OMPClause *, Stmt *> {
  8870.   friend TrailingObjects;
  8871.   friend class OMPClauseReader;
  8872.   friend class OMPExecutableDirective;
  8873.   template <typename T> friend class OMPDeclarativeDirective;
  8874.  
  8875.   /// Numbers of clauses.
  8876.   unsigned NumClauses = 0;
  8877.   /// Number of child expressions/stmts.
  8878.   unsigned NumChildren = 0;
  8879.   /// true if the directive has associated statement.
  8880.   bool HasAssociatedStmt = false;
  8881.  
  8882.   /// Define the sizes of each trailing object array except the last one. This
  8883.   /// is required for TrailingObjects to work properly.
  8884.   size_t numTrailingObjects(OverloadToken<OMPClause *>) const {
  8885.     return NumClauses;
  8886.   }
  8887.  
  8888.   OMPChildren() = delete;
  8889.  
  8890.   OMPChildren(unsigned NumClauses, unsigned NumChildren, bool HasAssociatedStmt)
  8891.       : NumClauses(NumClauses), NumChildren(NumChildren),
  8892.         HasAssociatedStmt(HasAssociatedStmt) {}
  8893.  
  8894.   static size_t size(unsigned NumClauses, bool HasAssociatedStmt,
  8895.                      unsigned NumChildren);
  8896.  
  8897.   static OMPChildren *Create(void *Mem, ArrayRef<OMPClause *> Clauses);
  8898.   static OMPChildren *Create(void *Mem, ArrayRef<OMPClause *> Clauses, Stmt *S,
  8899.                              unsigned NumChildren = 0);
  8900.   static OMPChildren *CreateEmpty(void *Mem, unsigned NumClauses,
  8901.                                   bool HasAssociatedStmt = false,
  8902.                                   unsigned NumChildren = 0);
  8903.  
  8904. public:
  8905.   unsigned getNumClauses() const { return NumClauses; }
  8906.   unsigned getNumChildren() const { return NumChildren; }
  8907.   bool hasAssociatedStmt() const { return HasAssociatedStmt; }
  8908.  
  8909.   /// Set associated statement.
  8910.   void setAssociatedStmt(Stmt *S) {
  8911.     getTrailingObjects<Stmt *>()[NumChildren] = S;
  8912.   }
  8913.  
  8914.   void setChildren(ArrayRef<Stmt *> Children);
  8915.  
  8916.   /// Sets the list of variables for this clause.
  8917.   ///
  8918.   /// \param Clauses The list of clauses for the directive.
  8919.   ///
  8920.   void setClauses(ArrayRef<OMPClause *> Clauses);
  8921.  
  8922.   /// Returns statement associated with the directive.
  8923.   const Stmt *getAssociatedStmt() const {
  8924.     return const_cast<OMPChildren *>(this)->getAssociatedStmt();
  8925.   }
  8926.   Stmt *getAssociatedStmt() {
  8927.     assert(HasAssociatedStmt &&
  8928.            "Expected directive with the associated statement.");
  8929.     return getTrailingObjects<Stmt *>()[NumChildren];
  8930.   }
  8931.  
  8932.   /// Get the clauses storage.
  8933.   MutableArrayRef<OMPClause *> getClauses() {
  8934.     return llvm::MutableArrayRef(getTrailingObjects<OMPClause *>(),
  8935.                                      NumClauses);
  8936.   }
  8937.   ArrayRef<OMPClause *> getClauses() const {
  8938.     return const_cast<OMPChildren *>(this)->getClauses();
  8939.   }
  8940.  
  8941.   /// Returns the captured statement associated with the
  8942.   /// component region within the (combined) directive.
  8943.   ///
  8944.   /// \param RegionKind Component region kind.
  8945.   const CapturedStmt *
  8946.   getCapturedStmt(OpenMPDirectiveKind RegionKind,
  8947.                   ArrayRef<OpenMPDirectiveKind> CaptureRegions) const {
  8948.     assert(llvm::is_contained(CaptureRegions, RegionKind) &&
  8949.            "RegionKind not found in OpenMP CaptureRegions.");
  8950.     auto *CS = cast<CapturedStmt>(getAssociatedStmt());
  8951.     for (auto ThisCaptureRegion : CaptureRegions) {
  8952.       if (ThisCaptureRegion == RegionKind)
  8953.         return CS;
  8954.       CS = cast<CapturedStmt>(CS->getCapturedStmt());
  8955.     }
  8956.     llvm_unreachable("Incorrect RegionKind specified for directive.");
  8957.   }
  8958.  
  8959.   /// Get innermost captured statement for the construct.
  8960.   CapturedStmt *
  8961.   getInnermostCapturedStmt(ArrayRef<OpenMPDirectiveKind> CaptureRegions) {
  8962.     assert(hasAssociatedStmt() && "Must have associated captured statement.");
  8963.     assert(!CaptureRegions.empty() &&
  8964.            "At least one captured statement must be provided.");
  8965.     auto *CS = cast<CapturedStmt>(getAssociatedStmt());
  8966.     for (unsigned Level = CaptureRegions.size(); Level > 1; --Level)
  8967.       CS = cast<CapturedStmt>(CS->getCapturedStmt());
  8968.     return CS;
  8969.   }
  8970.  
  8971.   const CapturedStmt *
  8972.   getInnermostCapturedStmt(ArrayRef<OpenMPDirectiveKind> CaptureRegions) const {
  8973.     return const_cast<OMPChildren *>(this)->getInnermostCapturedStmt(
  8974.         CaptureRegions);
  8975.   }
  8976.  
  8977.   MutableArrayRef<Stmt *> getChildren();
  8978.   ArrayRef<Stmt *> getChildren() const {
  8979.     return const_cast<OMPChildren *>(this)->getChildren();
  8980.   }
  8981.  
  8982.   Stmt *getRawStmt() {
  8983.     assert(HasAssociatedStmt &&
  8984.            "Expected directive with the associated statement.");
  8985.     if (auto *CS = dyn_cast<CapturedStmt>(getAssociatedStmt())) {
  8986.       Stmt *S = nullptr;
  8987.       do {
  8988.         S = CS->getCapturedStmt();
  8989.         CS = dyn_cast<CapturedStmt>(S);
  8990.       } while (CS);
  8991.       return S;
  8992.     }
  8993.     return getAssociatedStmt();
  8994.   }
  8995.   const Stmt *getRawStmt() const {
  8996.     return const_cast<OMPChildren *>(this)->getRawStmt();
  8997.   }
  8998.  
  8999.   Stmt::child_range getAssociatedStmtAsRange() {
  9000.     if (!HasAssociatedStmt)
  9001.       return Stmt::child_range(Stmt::child_iterator(), Stmt::child_iterator());
  9002.     return Stmt::child_range(&getTrailingObjects<Stmt *>()[NumChildren],
  9003.                              &getTrailingObjects<Stmt *>()[NumChildren + 1]);
  9004.   }
  9005. };
  9006.  
  9007. /// This represents 'ompx_dyn_cgroup_mem' clause in the '#pragma omp target ...'
  9008. /// directive.
  9009. ///
  9010. /// \code
  9011. /// #pragma omp target [...] ompx_dyn_cgroup_mem(N)
  9012. /// \endcode
  9013. class OMPXDynCGroupMemClause
  9014.     : public OMPOneStmtClause<llvm::omp::OMPC_ompx_dyn_cgroup_mem, OMPClause>,
  9015.       public OMPClauseWithPreInit {
  9016.   friend class OMPClauseReader;
  9017.  
  9018.   /// Set size.
  9019.   void setSize(Expr *E) { setStmt(E); }
  9020.  
  9021. public:
  9022.   /// Build 'ompx_dyn_cgroup_mem' clause.
  9023.   ///
  9024.   /// \param Size Size expression.
  9025.   /// \param HelperSize Helper Size expression
  9026.   /// \param CaptureRegion Innermost OpenMP region where expressions in this
  9027.   /// \param StartLoc Starting location of the clause.
  9028.   /// \param LParenLoc Location of '('.
  9029.   /// \param EndLoc Ending location of the clause.
  9030.   OMPXDynCGroupMemClause(Expr *Size, Stmt *HelperSize,
  9031.                          OpenMPDirectiveKind CaptureRegion,
  9032.                          SourceLocation StartLoc, SourceLocation LParenLoc,
  9033.                          SourceLocation EndLoc)
  9034.       : OMPOneStmtClause(Size, StartLoc, LParenLoc, EndLoc),
  9035.         OMPClauseWithPreInit(this) {
  9036.     setPreInitStmt(HelperSize, CaptureRegion);
  9037.   }
  9038.  
  9039.   /// Build an empty clause.
  9040.   OMPXDynCGroupMemClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {}
  9041.  
  9042.   /// Return the size expression.
  9043.   Expr *getSize() { return getStmtAs<Expr>(); }
  9044.  
  9045.   /// Return the size expression.
  9046.   Expr *getSize() const { return getStmtAs<Expr>(); }
  9047. };
  9048.  
  9049. } // namespace clang
  9050.  
  9051. #endif // LLVM_CLANG_AST_OPENMPCLAUSE_H
  9052.