Coverage Report

Created: 2022-05-21 09:15

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/AST/OpenMPClause.h
Line
Count
Source (jump to first uncovered line)
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
252k
      : StartLoc(StartLoc), EndLoc(EndLoc), Kind(K) {}
68
69
public:
70
  /// Returns the starting location of the clause.
71
103k
  SourceLocation getBeginLoc() const { return StartLoc; }
72
73
  /// Returns the ending location of the clause.
74
90.0k
  SourceLocation getEndLoc() const { return EndLoc; }
75
76
  /// Sets the starting location of the clause.
77
27.3k
  void setLocStart(SourceLocation Loc) { StartLoc = Loc; }
78
79
  /// Sets the ending location of the clause.
80
27.3k
  void setLocEnd(SourceLocation Loc) { EndLoc = Loc; }
81
82
  /// Returns kind of OpenMP clause (private, shared, reduction, etc.).
83
5.80M
  OpenMPClauseKind getClauseKind() const { return Kind; }
84
85
56.5k
  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
386
  const_child_range children() const {
94
386
    auto Children = const_cast<OMPClause *>(this)->children();
95
386
    return const_child_range(Children.begin(), Children.end());
96
386
  }
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
0
  const_child_range used_children() const {
103
0
    auto Children = const_cast<OMPClause *>(this)->children();
104
0
    return const_child_range(Children.begin(), Children.end());
105
0
  }
106
107
0
  static bool classof(const OMPClause *) { return true; }
108
};
109
110
/// Class that handles pre-initialization statement for some clauses, like
111
/// 'shedule', 'firstprivate' etc.
112
class OMPClauseWithPreInit {
113
  friend class OMPClauseReader;
114
115
  /// Pre-initialization statement for the clause.
116
  Stmt *PreInit = nullptr;
117
118
  /// Region that captures the associated stmt.
119
  OpenMPDirectiveKind CaptureRegion = llvm::omp::OMPD_unknown;
120
121
protected:
122
126k
  OMPClauseWithPreInit(const OMPClause *This) {
123
126k
    assert(get(This) && "get is not tuned for pre-init.");
124
126k
  }
125
126
  /// Set pre-initialization statement for the clause.
127
  void
128
  setPreInitStmt(Stmt *S,
129
126k
                 OpenMPDirectiveKind ThisRegion = llvm::omp::OMPD_unknown) {
130
126k
    PreInit = S;
131
126k
    CaptureRegion = ThisRegion;
132
126k
  }
133
134
public:
135
  /// Get pre-initialization statement for the clause.
136
70.5k
  const Stmt *getPreInitStmt() const { return PreInit; }
137
138
  /// Get pre-initialization statement for the clause.
139
24.8k
  Stmt *getPreInitStmt() { return PreInit; }
140
141
  /// Get capture region for the stmt in the clause.
142
64.2k
  OpenMPDirectiveKind getCaptureRegion() const { return CaptureRegion; }
143
144
  static OMPClauseWithPreInit *get(OMPClause *C);
145
  static const OMPClauseWithPreInit *get(const OMPClause *C);
146
};
147
148
/// Class that handles post-update expression for some clauses, like
149
/// 'lastprivate', 'reduction' etc.
150
class OMPClauseWithPostUpdate : public OMPClauseWithPreInit {
151
  friend class OMPClauseReader;
152
153
  /// Post-update expression for the clause.
154
  Expr *PostUpdate = nullptr;
155
156
protected:
157
39.0k
  OMPClauseWithPostUpdate(const OMPClause *This) : OMPClauseWithPreInit(This) {
158
39.0k
    assert(get(This) && "get is not tuned for post-update.");
159
39.0k
  }
160
161
  /// Set pre-initialization statement for the clause.
162
39.0k
  void setPostUpdateExpr(Expr *S) { PostUpdate = S; }
163
164
public:
165
  /// Get post-update expression for the clause.
166
2.86k
  const Expr *getPostUpdateExpr() const { return PostUpdate; }
167
168
  /// Get post-update expression for the clause.
169
1.97k
  Expr *getPostUpdateExpr() { return PostUpdate; }
170
171
  static OMPClauseWithPostUpdate *get(OMPClause *C);
172
  static const OMPClauseWithPostUpdate *get(const OMPClause *C);
173
};
174
175
/// This structure contains most locations needed for by an OMPVarListClause.
176
struct OMPVarListLocTy {
177
  /// Starting location of the clause (the clause keyword).
178
  SourceLocation StartLoc;
179
  /// Location of '('.
180
  SourceLocation LParenLoc;
181
  /// Ending location of the clause.
182
  SourceLocation EndLoc;
183
15.9k
  OMPVarListLocTy() = default;
184
  OMPVarListLocTy(SourceLocation StartLoc, SourceLocation LParenLoc,
185
                  SourceLocation EndLoc)
186
108k
      : StartLoc(StartLoc), LParenLoc(LParenLoc), EndLoc(EndLoc) {}
187
};
188
189
/// This represents clauses with the list of variables like 'private',
190
/// 'firstprivate', 'copyin', 'shared', or 'reduction' clauses in the
191
/// '#pragma omp ...' directives.
192
template <class T> class OMPVarListClause : public OMPClause {
193
  friend class OMPClauseReader;
194
195
  /// Location of '('.
196
  SourceLocation LParenLoc;
197
198
  /// Number of variables in the list.
199
  unsigned NumVars;
200
201
protected:
202
  /// Build a clause with \a N variables
203
  ///
204
  /// \param K Kind of the clause.
205
  /// \param StartLoc Starting location of the clause (the clause keyword).
206
  /// \param LParenLoc Location of '('.
207
  /// \param EndLoc Ending location of the clause.
208
  /// \param N Number of the variables in the clause.
209
  OMPVarListClause(OpenMPClauseKind K, SourceLocation StartLoc,
210
                   SourceLocation LParenLoc, SourceLocation EndLoc, unsigned N)
211
180k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPPrivateClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
14.4k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPFirstprivateClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
55.0k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPLastprivateClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
6.31k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPSharedClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
4.37k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPLinearClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
2.98k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPAlignedClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
1.94k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPCopyinClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
502
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPCopyprivateClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
181
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPReductionClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
25.7k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPTaskReductionClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
2.35k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPInReductionClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
1.63k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPAllocateClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
2.03k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPFlushClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
96
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPDependClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
4.52k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPMapClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
48.3k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPToClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
3.05k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPFromClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
1.52k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
502
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
130
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
3.44k
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
338
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPNontemporalClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
528
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPInclusiveClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
116
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPExclusiveClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
82
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPAffinityClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
72
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
clang::OMPVarListClause<clang::OMPInitClause>::OMPVarListClause(llvm::omp::Clause, clang::SourceLocation, clang::SourceLocation, clang::SourceLocation, unsigned int)
Line
Count
Source
211
113
      : OMPClause(K, StartLoc, EndLoc), LParenLoc(LParenLoc), NumVars(N) {}
212
213
  /// Fetches list of variables associated with this clause.
214
1.23M
  MutableArrayRef<Expr *> getVarRefs() {
215
1.23M
    return MutableArrayRef<Expr *>(
216
1.23M
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
1.23M
  }
clang::OMPVarListClause<clang::OMPAffinityClause>::getVarRefs()
Line
Count
Source
214
208
  MutableArrayRef<Expr *> getVarRefs() {
215
208
    return MutableArrayRef<Expr *>(
216
208
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
208
  }
clang::OMPVarListClause<clang::OMPAlignedClause>::getVarRefs()
Line
Count
Source
214
8.11k
  MutableArrayRef<Expr *> getVarRefs() {
215
8.11k
    return MutableArrayRef<Expr *>(
216
8.11k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
8.11k
  }
clang::OMPVarListClause<clang::OMPAllocateClause>::getVarRefs()
Line
Count
Source
214
8.10k
  MutableArrayRef<Expr *> getVarRefs() {
215
8.10k
    return MutableArrayRef<Expr *>(
216
8.10k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
8.10k
  }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::getVarRefs()
Line
Count
Source
214
1.41k
  MutableArrayRef<Expr *> getVarRefs() {
215
1.41k
    return MutableArrayRef<Expr *>(
216
1.41k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
1.41k
  }
clang::OMPVarListClause<clang::OMPCopyinClause>::getVarRefs()
Line
Count
Source
214
3.68k
  MutableArrayRef<Expr *> getVarRefs() {
215
3.68k
    return MutableArrayRef<Expr *>(
216
3.68k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
3.68k
  }
clang::OMPVarListClause<clang::OMPDependClause>::getVarRefs()
Line
Count
Source
214
16.6k
  MutableArrayRef<Expr *> getVarRefs() {
215
16.6k
    return MutableArrayRef<Expr *>(
216
16.6k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
16.6k
  }
clang::OMPVarListClause<clang::OMPExclusiveClause>::getVarRefs()
Line
Count
Source
214
132
  MutableArrayRef<Expr *> getVarRefs() {
215
132
    return MutableArrayRef<Expr *>(
216
132
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
132
  }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::getVarRefs()
Line
Count
Source
214
402k
  MutableArrayRef<Expr *> getVarRefs() {
215
402k
    return MutableArrayRef<Expr *>(
216
402k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
402k
  }
clang::OMPVarListClause<clang::OMPFlushClause>::getVarRefs()
Line
Count
Source
214
128
  MutableArrayRef<Expr *> getVarRefs() {
215
128
    return MutableArrayRef<Expr *>(
216
128
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
128
  }
clang::OMPVarListClause<clang::OMPFromClause>::getVarRefs()
Line
Count
Source
214
2.49k
  MutableArrayRef<Expr *> getVarRefs() {
215
2.49k
    return MutableArrayRef<Expr *>(
216
2.49k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
2.49k
  }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::getVarRefs()
Line
Count
Source
214
769
  MutableArrayRef<Expr *> getVarRefs() {
215
769
    return MutableArrayRef<Expr *>(
216
769
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
769
  }
clang::OMPVarListClause<clang::OMPInReductionClause>::getVarRefs()
Line
Count
Source
214
25.8k
  MutableArrayRef<Expr *> getVarRefs() {
215
25.8k
    return MutableArrayRef<Expr *>(
216
25.8k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
25.8k
  }
clang::OMPVarListClause<clang::OMPInclusiveClause>::getVarRefs()
Line
Count
Source
214
172
  MutableArrayRef<Expr *> getVarRefs() {
215
172
    return MutableArrayRef<Expr *>(
216
172
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
172
  }
clang::OMPVarListClause<clang::OMPInitClause>::getVarRefs()
Line
Count
Source
214
293
  MutableArrayRef<Expr *> getVarRefs() {
215
293
    return MutableArrayRef<Expr *>(
216
293
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
293
  }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::getVarRefs()
Line
Count
Source
214
6.65k
  MutableArrayRef<Expr *> getVarRefs() {
215
6.65k
    return MutableArrayRef<Expr *>(
216
6.65k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
6.65k
  }
clang::OMPVarListClause<clang::OMPLastprivateClause>::getVarRefs()
Line
Count
Source
214
80.8k
  MutableArrayRef<Expr *> getVarRefs() {
215
80.8k
    return MutableArrayRef<Expr *>(
216
80.8k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
80.8k
  }
clang::OMPVarListClause<clang::OMPLinearClause>::getVarRefs()
Line
Count
Source
214
78.5k
  MutableArrayRef<Expr *> getVarRefs() {
215
78.5k
    return MutableArrayRef<Expr *>(
216
78.5k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
78.5k
  }
clang::OMPVarListClause<clang::OMPMapClause>::getVarRefs()
Line
Count
Source
214
131k
  MutableArrayRef<Expr *> getVarRefs() {
215
131k
    return MutableArrayRef<Expr *>(
216
131k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
131k
  }
clang::OMPVarListClause<clang::OMPNontemporalClause>::getVarRefs()
Line
Count
Source
214
2.75k
  MutableArrayRef<Expr *> getVarRefs() {
215
2.75k
    return MutableArrayRef<Expr *>(
216
2.75k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
2.75k
  }
clang::OMPVarListClause<clang::OMPPrivateClause>::getVarRefs()
Line
Count
Source
214
96.8k
  MutableArrayRef<Expr *> getVarRefs() {
215
96.8k
    return MutableArrayRef<Expr *>(
216
96.8k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
96.8k
  }
clang::OMPVarListClause<clang::OMPReductionClause>::getVarRefs()
Line
Count
Source
214
322k
  MutableArrayRef<Expr *> getVarRefs() {
215
322k
    return MutableArrayRef<Expr *>(
216
322k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
322k
  }
clang::OMPVarListClause<clang::OMPSharedClause>::getVarRefs()
Line
Count
Source
214
7.58k
  MutableArrayRef<Expr *> getVarRefs() {
215
7.58k
    return MutableArrayRef<Expr *>(
216
7.58k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
7.58k
  }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::getVarRefs()
Line
Count
Source
214
26.2k
  MutableArrayRef<Expr *> getVarRefs() {
215
26.2k
    return MutableArrayRef<Expr *>(
216
26.2k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
26.2k
  }
clang::OMPVarListClause<clang::OMPToClause>::getVarRefs()
Line
Count
Source
214
3.59k
  MutableArrayRef<Expr *> getVarRefs() {
215
3.59k
    return MutableArrayRef<Expr *>(
216
3.59k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
3.59k
  }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::getVarRefs()
Line
Count
Source
214
140
  MutableArrayRef<Expr *> getVarRefs() {
215
140
    return MutableArrayRef<Expr *>(
216
140
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
140
  }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::getVarRefs()
Line
Count
Source
214
2.05k
  MutableArrayRef<Expr *> getVarRefs() {
215
2.05k
    return MutableArrayRef<Expr *>(
216
2.05k
        static_cast<T *>(this)->template getTrailingObjects<Expr *>(), NumVars);
217
2.05k
  }
218
219
  /// Sets the list of variables for this clause.
220
180k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
180k
    assert(VL.size() == NumVars &&
222
180k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
180k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
180k
  }
clang::OMPVarListClause<clang::OMPInitClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
26
  void setVarRefs(ArrayRef<Expr *> VL) {
221
26
    assert(VL.size() == NumVars &&
222
26
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
26
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
26
  }
clang::OMPVarListClause<clang::OMPPrivateClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
14.4k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
14.4k
    assert(VL.size() == NumVars &&
222
14.4k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
14.4k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
14.4k
  }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
55.0k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
55.0k
    assert(VL.size() == NumVars &&
222
55.0k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
55.0k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
55.0k
  }
clang::OMPVarListClause<clang::OMPLastprivateClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
6.31k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
6.31k
    assert(VL.size() == NumVars &&
222
6.31k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
6.31k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
6.31k
  }
clang::OMPVarListClause<clang::OMPSharedClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
4.37k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
4.37k
    assert(VL.size() == NumVars &&
222
4.37k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
4.37k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
4.37k
  }
clang::OMPVarListClause<clang::OMPReductionClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
25.7k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
25.7k
    assert(VL.size() == NumVars &&
222
25.7k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
25.7k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
25.7k
  }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
2.35k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
2.35k
    assert(VL.size() == NumVars &&
222
2.35k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
2.35k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
2.35k
  }
clang::OMPVarListClause<clang::OMPInReductionClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
1.63k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
1.63k
    assert(VL.size() == NumVars &&
222
1.63k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
1.63k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
1.63k
  }
clang::OMPVarListClause<clang::OMPLinearClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
2.98k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
2.98k
    assert(VL.size() == NumVars &&
222
2.98k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
2.98k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
2.98k
  }
clang::OMPVarListClause<clang::OMPAlignedClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
1.94k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
1.94k
    assert(VL.size() == NumVars &&
222
1.94k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
1.94k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
1.94k
  }
clang::OMPVarListClause<clang::OMPCopyinClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
502
  void setVarRefs(ArrayRef<Expr *> VL) {
221
502
    assert(VL.size() == NumVars &&
222
502
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
502
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
502
  }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
181
  void setVarRefs(ArrayRef<Expr *> VL) {
221
181
    assert(VL.size() == NumVars &&
222
181
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
181
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
181
  }
clang::OMPVarListClause<clang::OMPFlushClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
96
  void setVarRefs(ArrayRef<Expr *> VL) {
221
96
    assert(VL.size() == NumVars &&
222
96
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
96
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
96
  }
clang::OMPVarListClause<clang::OMPDependClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
4.52k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
4.52k
    assert(VL.size() == NumVars &&
222
4.52k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
4.52k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
4.52k
  }
clang::OMPVarListClause<clang::OMPMapClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
48.3k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
48.3k
    assert(VL.size() == NumVars &&
222
48.3k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
48.3k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
48.3k
  }
clang::OMPVarListClause<clang::OMPAllocateClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
2.03k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
2.03k
    assert(VL.size() == NumVars &&
222
2.03k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
2.03k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
2.03k
  }
clang::OMPVarListClause<clang::OMPToClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
3.05k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
3.05k
    assert(VL.size() == NumVars &&
222
3.05k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
3.05k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
3.05k
  }
clang::OMPVarListClause<clang::OMPFromClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
1.52k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
1.52k
    assert(VL.size() == NumVars &&
222
1.52k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
1.52k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
1.52k
  }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
502
  void setVarRefs(ArrayRef<Expr *> VL) {
221
502
    assert(VL.size() == NumVars &&
222
502
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
502
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
502
  }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
130
  void setVarRefs(ArrayRef<Expr *> VL) {
221
130
    assert(VL.size() == NumVars &&
222
130
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
130
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
130
  }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
3.44k
  void setVarRefs(ArrayRef<Expr *> VL) {
221
3.44k
    assert(VL.size() == NumVars &&
222
3.44k
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
3.44k
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
3.44k
  }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
338
  void setVarRefs(ArrayRef<Expr *> VL) {
221
338
    assert(VL.size() == NumVars &&
222
338
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
338
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
338
  }
clang::OMPVarListClause<clang::OMPNontemporalClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
528
  void setVarRefs(ArrayRef<Expr *> VL) {
221
528
    assert(VL.size() == NumVars &&
222
528
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
528
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
528
  }
clang::OMPVarListClause<clang::OMPInclusiveClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
116
  void setVarRefs(ArrayRef<Expr *> VL) {
221
116
    assert(VL.size() == NumVars &&
222
116
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
116
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
116
  }
clang::OMPVarListClause<clang::OMPExclusiveClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
82
  void setVarRefs(ArrayRef<Expr *> VL) {
221
82
    assert(VL.size() == NumVars &&
222
82
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
82
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
82
  }
clang::OMPVarListClause<clang::OMPAffinityClause>::setVarRefs(llvm::ArrayRef<clang::Expr*>)
Line
Count
Source
220
72
  void setVarRefs(ArrayRef<Expr *> VL) {
221
72
    assert(VL.size() == NumVars &&
222
72
           "Number of variables is not the same as the preallocated buffer");
223
0
    std::copy(VL.begin(), VL.end(),
224
72
              static_cast<T *>(this)->template getTrailingObjects<Expr *>());
225
72
  }
226
227
public:
228
  using varlist_iterator = MutableArrayRef<Expr *>::iterator;
229
  using varlist_const_iterator = ArrayRef<const Expr *>::iterator;
230
  using varlist_range = llvm::iterator_range<varlist_iterator>;
231
  using varlist_const_range = llvm::iterator_range<varlist_const_iterator>;
232
233
2.10M
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_size() const
Line
Count
Source
233
206
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_size() const
Line
Count
Source
233
2.17k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_size() const
Line
Count
Source
233
5.10k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_size() const
Line
Count
Source
233
407k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_size() const
Line
Count
Source
233
57.2k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_size() const
Line
Count
Source
233
100k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_size() const
Line
Count
Source
233
216k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_size() const
Line
Count
Source
233
1.26k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_size() const
Line
Count
Source
233
44.7k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_size() const
Line
Count
Source
233
545k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_size() const
Line
Count
Source
233
42.0k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_size() const
Line
Count
Source
233
596k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPToClause>::varlist_size() const
Line
Count
Source
233
31.4k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_size() const
Line
Count
Source
233
17.1k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_size() const
Line
Count
Source
233
5.65k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_size() const
Line
Count
Source
233
650
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_size() const
Line
Count
Source
233
18.1k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_size() const
Line
Count
Source
233
1.72k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPInitClause>::varlist_size() const
Line
Count
Source
233
49
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_size() const
Line
Count
Source
233
2.24k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_size() const
Line
Count
Source
233
968
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_size() const
Line
Count
Source
233
50
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_size() const
Line
Count
Source
233
2.28k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_size() const
Line
Count
Source
233
1.38k
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_size() const
Line
Count
Source
233
34
  unsigned varlist_size() const { return NumVars; }
clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_size() const
Line
Count
Source
233
26
  unsigned varlist_size() const { return NumVars; }
234
16.1k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_empty() const
Line
Count
Source
234
860
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_empty() const
Line
Count
Source
234
2.80k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_empty() const
Line
Count
Source
234
1.20k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_empty() const
Line
Count
Source
234
530
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_empty() const
Line
Count
Source
234
846
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_empty() const
Line
Count
Source
234
1.73k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_empty() const
Line
Count
Source
234
216
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_empty() const
Line
Count
Source
234
128
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_empty() const
Line
Count
Source
234
418
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_empty() const
Line
Count
Source
234
408
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_empty() const
Line
Count
Source
234
180
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_empty() const
Line
Count
Source
234
32
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_empty() const
Line
Count
Source
234
16
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_empty() const
Line
Count
Source
234
837
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_empty() const
Line
Count
Source
234
3.71k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPToClause>::varlist_empty() const
Line
Count
Source
234
353
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_empty() const
Line
Count
Source
234
352
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_empty() const
Line
Count
Source
234
40
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_empty() const
Line
Count
Source
234
16
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_empty() const
Line
Count
Source
234
1.17k
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_empty() const
Line
Count
Source
234
157
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_empty() const
Line
Count
Source
234
68
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_empty() const
Line
Count
Source
234
12
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_empty() const
Line
Count
Source
234
4
  bool varlist_empty() const { return NumVars == 0; }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_empty() const
Line
Count
Source
234
20
  bool varlist_empty() const { return NumVars == 0; }
235
236
74.2k
  varlist_range varlists() {
237
74.2k
    return varlist_range(varlist_begin(), varlist_end());
238
74.2k
  }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlists()
Line
Count
Source
236
22
  varlist_range varlists() {
237
22
    return varlist_range(varlist_begin(), varlist_end());
238
22
  }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlists()
Line
Count
Source
236
1.31k
  varlist_range varlists() {
237
1.31k
    return varlist_range(varlist_begin(), varlist_end());
238
1.31k
  }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlists()
Line
Count
Source
236
2.28k
  varlist_range varlists() {
237
2.28k
    return varlist_range(varlist_begin(), varlist_end());
238
2.28k
  }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlists()
Line
Count
Source
236
85
  varlist_range varlists() {
237
85
    return varlist_range(varlist_begin(), varlist_end());
238
85
  }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlists()
Line
Count
Source
236
210
  varlist_range varlists() {
237
210
    return varlist_range(varlist_begin(), varlist_end());
238
210
  }
clang::OMPVarListClause<clang::OMPDependClause>::varlists()
Line
Count
Source
236
1.57k
  varlist_range varlists() {
237
1.57k
    return varlist_range(varlist_begin(), varlist_end());
238
1.57k
  }
clang::OMPVarListClause<clang::OMPExclusiveClause>::varlists()
Line
Count
Source
236
14
  varlist_range varlists() {
237
14
    return varlist_range(varlist_begin(), varlist_end());
238
14
  }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlists()
Line
Count
Source
236
6.34k
  varlist_range varlists() {
237
6.34k
    return varlist_range(varlist_begin(), varlist_end());
238
6.34k
  }
clang::OMPVarListClause<clang::OMPFlushClause>::varlists()
Line
Count
Source
236
40
  varlist_range varlists() {
237
40
    return varlist_range(varlist_begin(), varlist_end());
238
40
  }
clang::OMPVarListClause<clang::OMPFromClause>::varlists()
Line
Count
Source
236
682
  varlist_range varlists() {
237
682
    return varlist_range(varlist_begin(), varlist_end());
238
682
  }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlists()
Line
Count
Source
236
149
  varlist_range varlists() {
237
149
    return varlist_range(varlist_begin(), varlist_end());
238
149
  }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlists()
Line
Count
Source
236
1.20k
  varlist_range varlists() {
237
1.20k
    return varlist_range(varlist_begin(), varlist_end());
238
1.20k
  }
clang::OMPVarListClause<clang::OMPInclusiveClause>::varlists()
Line
Count
Source
236
22
  varlist_range varlists() {
237
22
    return varlist_range(varlist_begin(), varlist_end());
238
22
  }
clang::OMPVarListClause<clang::OMPInitClause>::varlists()
Line
Count
Source
236
23
  varlist_range varlists() {
237
23
    return varlist_range(varlist_begin(), varlist_end());
238
23
  }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlists()
Line
Count
Source
236
1.54k
  varlist_range varlists() {
237
1.54k
    return varlist_range(varlist_begin(), varlist_end());
238
1.54k
  }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlists()
Line
Count
Source
236
7.77k
  varlist_range varlists() {
237
7.77k
    return varlist_range(varlist_begin(), varlist_end());
238
7.77k
  }
clang::OMPVarListClause<clang::OMPLinearClause>::varlists()
Line
Count
Source
236
2.90k
  varlist_range varlists() {
237
2.90k
    return varlist_range(varlist_begin(), varlist_end());
238
2.90k
  }
clang::OMPVarListClause<clang::OMPMapClause>::varlists()
Line
Count
Source
236
16.5k
  varlist_range varlists() {
237
16.5k
    return varlist_range(varlist_begin(), varlist_end());
238
16.5k
  }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlists()
Line
Count
Source
236
540
  varlist_range varlists() {
237
540
    return varlist_range(varlist_begin(), varlist_end());
238
540
  }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlists()
Line
Count
Source
236
5.97k
  varlist_range varlists() {
237
5.97k
    return varlist_range(varlist_begin(), varlist_end());
238
5.97k
  }
clang::OMPVarListClause<clang::OMPReductionClause>::varlists()
Line
Count
Source
236
20.4k
  varlist_range varlists() {
237
20.4k
    return varlist_range(varlist_begin(), varlist_end());
238
20.4k
  }
clang::OMPVarListClause<clang::OMPSharedClause>::varlists()
Line
Count
Source
236
1.82k
  varlist_range varlists() {
237
1.82k
    return varlist_range(varlist_begin(), varlist_end());
238
1.82k
  }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlists()
Line
Count
Source
236
1.33k
  varlist_range varlists() {
237
1.33k
    return varlist_range(varlist_begin(), varlist_end());
238
1.33k
  }
clang::OMPVarListClause<clang::OMPToClause>::varlists()
Line
Count
Source
236
1.11k
  varlist_range varlists() {
237
1.11k
    return varlist_range(varlist_begin(), varlist_end());
238
1.11k
  }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlists()
Line
Count
Source
236
36
  varlist_range varlists() {
237
36
    return varlist_range(varlist_begin(), varlist_end());
238
36
  }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlists()
Line
Count
Source
236
286
  varlist_range varlists() {
237
286
    return varlist_range(varlist_begin(), varlist_end());
238
286
  }
239
32.7k
  varlist_const_range varlists() const {
240
32.7k
    return varlist_const_range(varlist_begin(), varlist_end());
241
32.7k
  }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlists() const
Line
Count
Source
239
14
  varlist_const_range varlists() const {
240
14
    return varlist_const_range(varlist_begin(), varlist_end());
241
14
  }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlists() const
Line
Count
Source
239
452
  varlist_const_range varlists() const {
240
452
    return varlist_const_range(varlist_begin(), varlist_end());
241
452
  }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlists() const
Line
Count
Source
239
163
  varlist_const_range varlists() const {
240
163
    return varlist_const_range(varlist_begin(), varlist_end());
241
163
  }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlists() const
Line
Count
Source
239
59
  varlist_const_range varlists() const {
240
59
    return varlist_const_range(varlist_begin(), varlist_end());
241
59
  }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlists() const
Line
Count
Source
239
42
  varlist_const_range varlists() const {
240
42
    return varlist_const_range(varlist_begin(), varlist_end());
241
42
  }
clang::OMPVarListClause<clang::OMPDependClause>::varlists() const
Line
Count
Source
239
666
  varlist_const_range varlists() const {
240
666
    return varlist_const_range(varlist_begin(), varlist_end());
241
666
  }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPExclusiveClause>::varlists() const
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlists() const
Line
Count
Source
239
18.7k
  varlist_const_range varlists() const {
240
18.7k
    return varlist_const_range(varlist_begin(), varlist_end());
241
18.7k
  }
clang::OMPVarListClause<clang::OMPFlushClause>::varlists() const
Line
Count
Source
239
10
  varlist_const_range varlists() const {
240
10
    return varlist_const_range(varlist_begin(), varlist_end());
241
10
  }
clang::OMPVarListClause<clang::OMPFromClause>::varlists() const
Line
Count
Source
239
196
  varlist_const_range varlists() const {
240
196
    return varlist_const_range(varlist_begin(), varlist_end());
241
196
  }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlists() const
Line
Count
Source
239
46
  varlist_const_range varlists() const {
240
46
    return varlist_const_range(varlist_begin(), varlist_end());
241
46
  }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlists() const
Line
Count
Source
239
48
  varlist_const_range varlists() const {
240
48
    return varlist_const_range(varlist_begin(), varlist_end());
241
48
  }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPInclusiveClause>::varlists() const
clang::OMPVarListClause<clang::OMPInitClause>::varlists() const
Line
Count
Source
239
13
  varlist_const_range varlists() const {
240
13
    return varlist_const_range(varlist_begin(), varlist_end());
241
13
  }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlists() const
Line
Count
Source
239
441
  varlist_const_range varlists() const {
240
441
    return varlist_const_range(varlist_begin(), varlist_end());
241
441
  }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlists() const
Line
Count
Source
239
1.26k
  varlist_const_range varlists() const {
240
1.26k
    return varlist_const_range(varlist_begin(), varlist_end());
241
1.26k
  }
clang::OMPVarListClause<clang::OMPLinearClause>::varlists() const
Line
Count
Source
239
1.38k
  varlist_const_range varlists() const {
240
1.38k
    return varlist_const_range(varlist_begin(), varlist_end());
241
1.38k
  }
clang::OMPVarListClause<clang::OMPMapClause>::varlists() const
Line
Count
Source
239
4.08k
  varlist_const_range varlists() const {
240
4.08k
    return varlist_const_range(varlist_begin(), varlist_end());
241
4.08k
  }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlists() const
Line
Count
Source
239
46
  varlist_const_range varlists() const {
240
46
    return varlist_const_range(varlist_begin(), varlist_end());
241
46
  }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlists() const
Line
Count
Source
239
2.18k
  varlist_const_range varlists() const {
240
2.18k
    return varlist_const_range(varlist_begin(), varlist_end());
241
2.18k
  }
clang::OMPVarListClause<clang::OMPReductionClause>::varlists() const
Line
Count
Source
239
2.15k
  varlist_const_range varlists() const {
240
2.15k
    return varlist_const_range(varlist_begin(), varlist_end());
241
2.15k
  }
clang::OMPVarListClause<clang::OMPSharedClause>::varlists() const
Line
Count
Source
239
241
  varlist_const_range varlists() const {
240
241
    return varlist_const_range(varlist_begin(), varlist_end());
241
241
  }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlists() const
Line
Count
Source
239
74
  varlist_const_range varlists() const {
240
74
    return varlist_const_range(varlist_begin(), varlist_end());
241
74
  }
clang::OMPVarListClause<clang::OMPToClause>::varlists() const
Line
Count
Source
239
216
  varlist_const_range varlists() const {
240
216
    return varlist_const_range(varlist_begin(), varlist_end());
241
216
  }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlists() const
Line
Count
Source
239
24
  varlist_const_range varlists() const {
240
24
    return varlist_const_range(varlist_begin(), varlist_end());
241
24
  }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlists() const
Line
Count
Source
239
168
  varlist_const_range varlists() const {
240
168
    return varlist_const_range(varlist_begin(), varlist_end());
241
168
  }
242
243
335k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_begin()
Line
Count
Source
243
136
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_begin()
Line
Count
Source
243
2.57k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_begin()
Line
Count
Source
243
4.48k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_begin()
Line
Count
Source
243
385
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_begin()
Line
Count
Source
243
959
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_begin()
Line
Count
Source
243
4.96k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_begin()
Line
Count
Source
243
70
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_begin()
Line
Count
Source
243
90.2k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_begin()
Line
Count
Source
243
72
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_begin()
Line
Count
Source
243
1.44k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_begin()
Line
Count
Source
243
463
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_begin()
Line
Count
Source
243
4.74k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_begin()
Line
Count
Source
243
92
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPInitClause>::varlist_begin()
Line
Count
Source
243
210
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_begin()
Line
Count
Source
243
3.91k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_begin()
Line
Count
Source
243
22.0k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_begin()
Line
Count
Source
243
8.51k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_begin()
Line
Count
Source
243
67.7k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_begin()
Line
Count
Source
243
938
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_begin()
Line
Count
Source
243
33.3k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_begin()
Line
Count
Source
243
75.5k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_begin()
Line
Count
Source
243
4.22k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_begin()
Line
Count
Source
243
5.49k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPToClause>::varlist_begin()
Line
Count
Source
243
1.98k
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_begin()
Line
Count
Source
243
88
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_begin()
Line
Count
Source
243
366
  varlist_iterator varlist_begin() { return getVarRefs().begin(); }
244
886k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_end()
Line
Count
Source
244
72
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_end()
Line
Count
Source
244
5.53k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_end()
Line
Count
Source
244
3.62k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_end()
Line
Count
Source
244
1.02k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_end()
Line
Count
Source
244
2.72k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_end()
Line
Count
Source
244
2.74k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_end()
Line
Count
Source
244
62
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_end()
Line
Count
Source
244
312k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_end()
Line
Count
Source
244
56
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_end()
Line
Count
Source
244
1.04k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_end()
Line
Count
Source
244
306
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_end()
Line
Count
Source
244
21.1k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_end()
Line
Count
Source
244
80
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPInitClause>::varlist_end()
Line
Count
Source
244
83
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_end()
Line
Count
Source
244
2.73k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_end()
Line
Count
Source
244
58.8k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_end()
Line
Count
Source
244
70.0k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_end()
Line
Count
Source
244
63.5k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_end()
Line
Count
Source
244
1.81k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_end()
Line
Count
Source
244
63.4k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_end()
Line
Count
Source
244
247k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_end()
Line
Count
Source
244
3.35k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_end()
Line
Count
Source
244
20.7k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPToClause>::varlist_end()
Line
Count
Source
244
1.60k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_end()
Line
Count
Source
244
52
  varlist_iterator varlist_end() { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_end()
Line
Count
Source
244
1.69k
  varlist_iterator varlist_end() { return getVarRefs().end(); }
245
43.8k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_begin() const
Line
Count
Source
245
14
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_begin() const
Line
Count
Source
245
452
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_begin() const
Line
Count
Source
245
163
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_begin() const
Line
Count
Source
245
59
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_begin() const
Line
Count
Source
245
68
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_begin() const
Line
Count
Source
245
1.11k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_begin() const
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_begin() const
Line
Count
Source
245
25.7k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_begin() const
Line
Count
Source
245
18
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_begin() const
Line
Count
Source
245
196
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_begin() const
Line
Count
Source
245
46
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_begin() const
Line
Count
Source
245
48
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_begin() const
clang::OMPVarListClause<clang::OMPInitClause>::varlist_begin() const
Line
Count
Source
245
103
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_begin() const
Line
Count
Source
245
441
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_begin() const
Line
Count
Source
245
2.34k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_begin() const
Line
Count
Source
245
1.87k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_begin() const
Line
Count
Source
245
4.08k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_begin() const
Line
Count
Source
245
46
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_begin() const
Line
Count
Source
245
3.21k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_begin() const
Line
Count
Source
245
2.99k
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_begin() const
Line
Count
Source
245
241
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_begin() const
Line
Count
Source
245
126
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPToClause>::varlist_begin() const
Line
Count
Source
245
216
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_begin() const
Line
Count
Source
245
24
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_begin() const
Line
Count
Source
245
240
  varlist_const_iterator varlist_begin() const { return getVarRefs().begin(); }
246
127k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAffinityClause>::varlist_end() const
Line
Count
Source
246
14
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAlignedClause>::varlist_end() const
Line
Count
Source
246
1.00k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPAllocateClause>::varlist_end() const
Line
Count
Source
246
163
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::varlist_end() const
Line
Count
Source
246
413
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPCopyinClause>::varlist_end() const
Line
Count
Source
246
450
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPDependClause>::varlist_end() const
Line
Count
Source
246
1.11k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPExclusiveClause>::varlist_end() const
clang::OMPVarListClause<clang::OMPFirstprivateClause>::varlist_end() const
Line
Count
Source
246
61.9k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPFlushClause>::varlist_end() const
Line
Count
Source
246
18
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPFromClause>::varlist_end() const
Line
Count
Source
246
196
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::varlist_end() const
Line
Count
Source
246
46
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPInReductionClause>::varlist_end() const
Line
Count
Source
246
352
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPInclusiveClause>::varlist_end() const
clang::OMPVarListClause<clang::OMPInitClause>::varlist_end() const
Line
Count
Source
246
13
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::varlist_end() const
Line
Count
Source
246
441
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPLastprivateClause>::varlist_end() const
Line
Count
Source
246
7.81k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPLinearClause>::varlist_end() const
Line
Count
Source
246
8.76k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPMapClause>::varlist_end() const
Line
Count
Source
246
4.08k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPNontemporalClause>::varlist_end() const
Line
Count
Source
246
46
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPPrivateClause>::varlist_end() const
Line
Count
Source
246
5.91k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPReductionClause>::varlist_end() const
Line
Count
Source
246
32.5k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPSharedClause>::varlist_end() const
Line
Count
Source
246
241
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::varlist_end() const
Line
Count
Source
246
1.13k
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPToClause>::varlist_end() const
Line
Count
Source
246
216
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::varlist_end() const
Line
Count
Source
246
24
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::varlist_end() const
Line
Count
Source
246
456
  varlist_const_iterator varlist_end() const { return getVarRefs().end(); }
247
248
  /// Sets the location of '('.
249
14.6k
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPInitClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
26
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPPrivateClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
1.41k
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
4.27k
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPLastprivateClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
406
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPSharedClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
415
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPReductionClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
931
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
86
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPInReductionClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
78
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPLinearClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
374
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPAlignedClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
250
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPCopyinClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
78
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
23
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPFlushClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
10
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPDependClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
715
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPMapClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
4.23k
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPAllocateClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
250
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPToClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
216
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPFromClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
196
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
90
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
14
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
446
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
46
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPNontemporalClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
90
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPInclusiveClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
12
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPExclusiveClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
12
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
clang::OMPVarListClause<clang::OMPAffinityClause>::setLParenLoc(clang::SourceLocation)
Line
Count
Source
249
10
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
250
251
  /// Returns the location of '('.
252
61.2k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPAffinityClause>::getLParenLoc() const
Line
Count
Source
252
22
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPAlignedClause>::getLParenLoc() const
Line
Count
Source
252
718
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPAllocateClause>::getLParenLoc() const
Line
Count
Source
252
1.13k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::getLParenLoc() const
Line
Count
Source
252
85
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPCopyinClause>::getLParenLoc() const
Line
Count
Source
252
210
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPDependClause>::getLParenLoc() const
Line
Count
Source
252
1.46k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPExclusiveClause>::getLParenLoc() const
Line
Count
Source
252
14
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPFirstprivateClause>::getLParenLoc() const
Line
Count
Source
252
5.55k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPFlushClause>::getLParenLoc() const
Line
Count
Source
252
42
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPFromClause>::getLParenLoc() const
Line
Count
Source
252
682
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::getLParenLoc() const
Line
Count
Source
252
143
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPInReductionClause>::getLParenLoc() const
Line
Count
Source
252
1.20k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPInclusiveClause>::getLParenLoc() const
Line
Count
Source
252
22
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPInitClause>::getLParenLoc() const
Line
Count
Source
252
23
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::getLParenLoc() const
Line
Count
Source
252
1.54k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPLastprivateClause>::getLParenLoc() const
Line
Count
Source
252
1.81k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPLinearClause>::getLParenLoc() const
Line
Count
Source
252
908
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPMapClause>::getLParenLoc() const
Line
Count
Source
252
16.5k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPNontemporalClause>::getLParenLoc() const
Line
Count
Source
252
102
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPPrivateClause>::getLParenLoc() const
Line
Count
Source
252
5.97k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPReductionClause>::getLParenLoc() const
Line
Count
Source
252
18.4k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPSharedClause>::getLParenLoc() const
Line
Count
Source
252
1.82k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::getLParenLoc() const
Line
Count
Source
252
1.33k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPToClause>::getLParenLoc() const
Line
Count
Source
252
1.11k
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::getLParenLoc() const
Line
Count
Source
252
36
  SourceLocation getLParenLoc() const { return LParenLoc; }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::getLParenLoc() const
Line
Count
Source
252
286
  SourceLocation getLParenLoc() const { return LParenLoc; }
253
254
  /// Fetches list of all variables in the clause.
255
183k
  ArrayRef<const Expr *> getVarRefs() const {
256
183k
    return llvm::makeArrayRef(
257
183k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
183k
        NumVars);
259
183k
  }
clang::OMPVarListClause<clang::OMPAffinityClause>::getVarRefs() const
Line
Count
Source
255
28
  ArrayRef<const Expr *> getVarRefs() const {
256
28
    return llvm::makeArrayRef(
257
28
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
28
        NumVars);
259
28
  }
clang::OMPVarListClause<clang::OMPAlignedClause>::getVarRefs() const
Line
Count
Source
255
1.45k
  ArrayRef<const Expr *> getVarRefs() const {
256
1.45k
    return llvm::makeArrayRef(
257
1.45k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
1.45k
        NumVars);
259
1.45k
  }
clang::OMPVarListClause<clang::OMPAllocateClause>::getVarRefs() const
Line
Count
Source
255
326
  ArrayRef<const Expr *> getVarRefs() const {
256
326
    return llvm::makeArrayRef(
257
326
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
326
        NumVars);
259
326
  }
clang::OMPVarListClause<clang::OMPCopyprivateClause>::getVarRefs() const
Line
Count
Source
255
472
  ArrayRef<const Expr *> getVarRefs() const {
256
472
    return llvm::makeArrayRef(
257
472
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
472
        NumVars);
259
472
  }
clang::OMPVarListClause<clang::OMPCopyinClause>::getVarRefs() const
Line
Count
Source
255
518
  ArrayRef<const Expr *> getVarRefs() const {
256
518
    return llvm::makeArrayRef(
257
518
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
518
        NumVars);
259
518
  }
clang::OMPVarListClause<clang::OMPDependClause>::getVarRefs() const
Line
Count
Source
255
2.27k
  ArrayRef<const Expr *> getVarRefs() const {
256
2.27k
    return llvm::makeArrayRef(
257
2.27k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
2.27k
        NumVars);
259
2.27k
  }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPExclusiveClause>::getVarRefs() const
clang::OMPVarListClause<clang::OMPFirstprivateClause>::getVarRefs() const
Line
Count
Source
255
87.6k
  ArrayRef<const Expr *> getVarRefs() const {
256
87.6k
    return llvm::makeArrayRef(
257
87.6k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
87.6k
        NumVars);
259
87.6k
  }
clang::OMPVarListClause<clang::OMPFlushClause>::getVarRefs() const
Line
Count
Source
255
36
  ArrayRef<const Expr *> getVarRefs() const {
256
36
    return llvm::makeArrayRef(
257
36
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
36
        NumVars);
259
36
  }
clang::OMPVarListClause<clang::OMPFromClause>::getVarRefs() const
Line
Count
Source
255
498
  ArrayRef<const Expr *> getVarRefs() const {
256
498
    return llvm::makeArrayRef(
257
498
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
498
        NumVars);
259
498
  }
clang::OMPVarListClause<clang::OMPHasDeviceAddrClause>::getVarRefs() const
Line
Count
Source
255
92
  ArrayRef<const Expr *> getVarRefs() const {
256
92
    return llvm::makeArrayRef(
257
92
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
92
        NumVars);
259
92
  }
clang::OMPVarListClause<clang::OMPInReductionClause>::getVarRefs() const
Line
Count
Source
255
400
  ArrayRef<const Expr *> getVarRefs() const {
256
400
    return llvm::makeArrayRef(
257
400
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
400
        NumVars);
259
400
  }
Unexecuted instantiation: clang::OMPVarListClause<clang::OMPInclusiveClause>::getVarRefs() const
clang::OMPVarListClause<clang::OMPInitClause>::getVarRefs() const
Line
Count
Source
255
116
  ArrayRef<const Expr *> getVarRefs() const {
256
116
    return llvm::makeArrayRef(
257
116
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
116
        NumVars);
259
116
  }
clang::OMPVarListClause<clang::OMPIsDevicePtrClause>::getVarRefs() const
Line
Count
Source
255
882
  ArrayRef<const Expr *> getVarRefs() const {
256
882
    return llvm::makeArrayRef(
257
882
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
882
        NumVars);
259
882
  }
clang::OMPVarListClause<clang::OMPLastprivateClause>::getVarRefs() const
Line
Count
Source
255
10.1k
  ArrayRef<const Expr *> getVarRefs() const {
256
10.1k
    return llvm::makeArrayRef(
257
10.1k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
10.1k
        NumVars);
259
10.1k
  }
clang::OMPVarListClause<clang::OMPLinearClause>::getVarRefs() const
Line
Count
Source
255
10.6k
  ArrayRef<const Expr *> getVarRefs() const {
256
10.6k
    return llvm::makeArrayRef(
257
10.6k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
10.6k
        NumVars);
259
10.6k
  }
clang::OMPVarListClause<clang::OMPMapClause>::getVarRefs() const
Line
Count
Source
255
19.9k
  ArrayRef<const Expr *> getVarRefs() const {
256
19.9k
    return llvm::makeArrayRef(
257
19.9k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
19.9k
        NumVars);
259
19.9k
  }
clang::OMPVarListClause<clang::OMPNontemporalClause>::getVarRefs() const
Line
Count
Source
255
92
  ArrayRef<const Expr *> getVarRefs() const {
256
92
    return llvm::makeArrayRef(
257
92
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
92
        NumVars);
259
92
  }
clang::OMPVarListClause<clang::OMPPrivateClause>::getVarRefs() const
Line
Count
Source
255
9.12k
  ArrayRef<const Expr *> getVarRefs() const {
256
9.12k
    return llvm::makeArrayRef(
257
9.12k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
9.12k
        NumVars);
259
9.12k
  }
clang::OMPVarListClause<clang::OMPReductionClause>::getVarRefs() const
Line
Count
Source
255
35.5k
  ArrayRef<const Expr *> getVarRefs() const {
256
35.5k
    return llvm::makeArrayRef(
257
35.5k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
35.5k
        NumVars);
259
35.5k
  }
clang::OMPVarListClause<clang::OMPSharedClause>::getVarRefs() const
Line
Count
Source
255
482
  ArrayRef<const Expr *> getVarRefs() const {
256
482
    return llvm::makeArrayRef(
257
482
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
482
        NumVars);
259
482
  }
clang::OMPVarListClause<clang::OMPTaskReductionClause>::getVarRefs() const
Line
Count
Source
255
1.26k
  ArrayRef<const Expr *> getVarRefs() const {
256
1.26k
    return llvm::makeArrayRef(
257
1.26k
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
1.26k
        NumVars);
259
1.26k
  }
clang::OMPVarListClause<clang::OMPToClause>::getVarRefs() const
Line
Count
Source
255
548
  ArrayRef<const Expr *> getVarRefs() const {
256
548
    return llvm::makeArrayRef(
257
548
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
548
        NumVars);
259
548
  }
clang::OMPVarListClause<clang::OMPUseDeviceAddrClause>::getVarRefs() const
Line
Count
Source
255
48
  ArrayRef<const Expr *> getVarRefs() const {
256
48
    return llvm::makeArrayRef(
257
48
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
48
        NumVars);
259
48
  }
clang::OMPVarListClause<clang::OMPUseDevicePtrClause>::getVarRefs() const
Line
Count
Source
255
696
  ArrayRef<const Expr *> getVarRefs() const {
256
696
    return llvm::makeArrayRef(
257
696
        static_cast<const T *>(this)->template getTrailingObjects<Expr *>(),
258
696
        NumVars);
259
696
  }
260
};
261
262
/// This represents 'allocator' clause in the '#pragma omp ...'
263
/// directive.
264
///
265
/// \code
266
/// #pragma omp allocate(a) allocator(omp_default_mem_alloc)
267
/// \endcode
268
/// In this example directive '#pragma omp allocate' has simple 'allocator'
269
/// clause with the allocator 'omp_default_mem_alloc'.
270
class OMPAllocatorClause : public OMPClause {
271
  friend class OMPClauseReader;
272
273
  /// Location of '('.
274
  SourceLocation LParenLoc;
275
276
  /// Expression with the allocator.
277
  Stmt *Allocator = nullptr;
278
279
  /// Set allocator.
280
120
  void setAllocator(Expr *A) { Allocator = A; }
281
282
public:
283
  /// Build 'allocator' clause with the given allocator.
284
  ///
285
  /// \param A Allocator.
286
  /// \param StartLoc Starting location of the clause.
287
  /// \param LParenLoc Location of '('.
288
  /// \param EndLoc Ending location of the clause.
289
  OMPAllocatorClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc,
290
                     SourceLocation EndLoc)
291
      : OMPClause(llvm::omp::OMPC_allocator, StartLoc, EndLoc),
292
439
        LParenLoc(LParenLoc), Allocator(A) {}
293
294
  /// Build an empty clause.
295
  OMPAllocatorClause()
296
      : OMPClause(llvm::omp::OMPC_allocator, SourceLocation(),
297
120
                  SourceLocation()) {}
298
299
  /// Sets the location of '('.
300
120
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
301
302
  /// Returns the location of '('.
303
187
  SourceLocation getLParenLoc() const { return LParenLoc; }
304
305
  /// Returns allocator.
306
716
  Expr *getAllocator() const { return cast_or_null<Expr>(Allocator); }
307
308
4
  child_range children() { return child_range(&Allocator, &Allocator + 1); }
309
310
0
  const_child_range children() const {
311
0
    return const_child_range(&Allocator, &Allocator + 1);
312
0
  }
313
314
0
  child_range used_children() {
315
0
    return child_range(child_iterator(), child_iterator());
316
0
  }
317
0
  const_child_range used_children() const {
318
0
    return const_child_range(const_child_iterator(), const_child_iterator());
319
0
  }
320
321
568
  static bool classof(const OMPClause *T) {
322
568
    return T->getClauseKind() == llvm::omp::OMPC_allocator;
323
568
  }
324
};
325
326
/// This represents the 'align' clause in the '#pragma omp allocate'
327
/// directive.
328
///
329
/// \code
330
/// #pragma omp allocate(a) allocator(omp_default_mem_alloc) align(8)
331
/// \endcode
332
/// In this example directive '#pragma omp allocate' has simple 'allocator'
333
/// clause with the allocator 'omp_default_mem_alloc' and align clause with
334
/// value of 8.
335
class OMPAlignClause final : public OMPClause {
336
  friend class OMPClauseReader;
337
338
  /// Location of '('.
339
  SourceLocation LParenLoc;
340
341
  /// Alignment specified with align clause.
342
  Stmt *Alignment = nullptr;
343
344
  /// Set alignment value.
345
20
  void setAlignment(Expr *A) { Alignment = A; }
346
347
  /// Sets the location of '('.
348
20
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
349
350
  /// Build 'align' clause with the given alignment
351
  ///
352
  /// \param A Alignment value.
353
  /// \param StartLoc Starting location of the clause.
354
  /// \param LParenLoc Location of '('.
355
  /// \param EndLoc Ending location of the clause.
356
  OMPAlignClause(Expr *A, SourceLocation StartLoc, SourceLocation LParenLoc,
357
                 SourceLocation EndLoc)
358
      : OMPClause(llvm::omp::OMPC_align, StartLoc, EndLoc),
359
61
        LParenLoc(LParenLoc), Alignment(A) {}
360
361
  /// Build an empty clause.
362
  OMPAlignClause()
363
20
      : OMPClause(llvm::omp::OMPC_align, SourceLocation(), SourceLocation()) {}
364
365
public:
366
  /// Build 'align' clause with the given alignment
367
  ///
368
  /// \param A Alignment value.
369
  /// \param StartLoc Starting location of the clause.
370
  /// \param LParenLoc Location of '('.
371
  /// \param EndLoc Ending location of the clause.
372
  static OMPAlignClause *Create(const ASTContext &C, Expr *A,
373
                                SourceLocation StartLoc,
374
                                SourceLocation LParenLoc,
375
                                SourceLocation EndLoc);
376
377
  /// Returns the location of '('.
378
25
  SourceLocation getLParenLoc() const { return LParenLoc; }
379
380
  /// Returns alignment
381
93
  Expr *getAlignment() const { return cast_or_null<Expr>(Alignment); }
382
383
8
  child_range children() { return child_range(&Alignment, &Alignment + 1); }
384
385
0
  const_child_range children() const {
386
0
    return const_child_range(&Alignment, &Alignment + 1);
387
0
  }
388
389
0
  child_range used_children() {
390
0
    return child_range(child_iterator(), child_iterator());
391
0
  }
392
0
  const_child_range used_children() const {
393
0
    return const_child_range(const_child_iterator(), const_child_iterator());
394
0
  }
395
396
68
  static bool classof(const OMPClause *T) {
397
68
    return T->getClauseKind() == llvm::omp::OMPC_align;
398
68
  }
399
};
400
401
/// This represents clause 'allocate' in the '#pragma omp ...' directives.
402
///
403
/// \code
404
/// #pragma omp parallel private(a) allocate(omp_default_mem_alloc :a)
405
/// \endcode
406
/// In this example directive '#pragma omp parallel' has clause 'private'
407
/// and clause 'allocate' for the variable 'a'.
408
class OMPAllocateClause final
409
    : public OMPVarListClause<OMPAllocateClause>,
410
      private llvm::TrailingObjects<OMPAllocateClause, Expr *> {
411
  friend class OMPClauseReader;
412
  friend OMPVarListClause;
413
  friend TrailingObjects;
414
415
  /// Allocator specified in the clause, or 'nullptr' if the default one is
416
  /// used.
417
  Expr *Allocator = nullptr;
418
  /// Position of the ':' delimiter in the clause;
419
  SourceLocation ColonLoc;
420
421
  /// Build clause with number of variables \a N.
422
  ///
423
  /// \param StartLoc Starting location of the clause.
424
  /// \param LParenLoc Location of '('.
425
  /// \param Allocator Allocator expression.
426
  /// \param ColonLoc Location of ':' delimiter.
427
  /// \param EndLoc Ending location of the clause.
428
  /// \param N Number of the variables in the clause.
429
  OMPAllocateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
430
                    Expr *Allocator, SourceLocation ColonLoc,
431
                    SourceLocation EndLoc, unsigned N)
432
      : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate, StartLoc,
433
                                            LParenLoc, EndLoc, N),
434
1.78k
        Allocator(Allocator), ColonLoc(ColonLoc) {}
435
436
  /// Build an empty clause.
437
  ///
438
  /// \param N Number of variables.
439
  explicit OMPAllocateClause(unsigned N)
440
      : OMPVarListClause<OMPAllocateClause>(llvm::omp::OMPC_allocate,
441
                                            SourceLocation(), SourceLocation(),
442
250
                                            SourceLocation(), N) {}
443
444
  /// Sets location of ':' symbol in clause.
445
250
  void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
446
447
250
  void setAllocator(Expr *A) { Allocator = A; }
448
449
public:
450
  /// Creates clause with a list of variables \a VL.
451
  ///
452
  /// \param C AST context.
453
  /// \param StartLoc Starting location of the clause.
454
  /// \param LParenLoc Location of '('.
455
  /// \param Allocator Allocator expression.
456
  /// \param ColonLoc Location of ':' delimiter.
457
  /// \param EndLoc Ending location of the clause.
458
  /// \param VL List of references to the variables.
459
  static OMPAllocateClause *Create(const ASTContext &C, SourceLocation StartLoc,
460
                                   SourceLocation LParenLoc, Expr *Allocator,
461
                                   SourceLocation ColonLoc,
462
                                   SourceLocation EndLoc, ArrayRef<Expr *> VL);
463
464
  /// Returns the allocator expression or nullptr, if no allocator is specified.
465
6.57k
  Expr *getAllocator() const { return Allocator; }
466
467
  /// Returns the location of the ':' delimiter.
468
1.13k
  SourceLocation getColonLoc() const { return ColonLoc; }
469
470
  /// Creates an empty clause with the place for \a N variables.
471
  ///
472
  /// \param C AST context.
473
  /// \param N The number of variables.
474
  static OMPAllocateClause *CreateEmpty(const ASTContext &C, unsigned N);
475
476
481
  child_range children() {
477
481
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
478
481
                       reinterpret_cast<Stmt **>(varlist_end()));
479
481
  }
480
481
0
  const_child_range children() const {
482
0
    auto Children = const_cast<OMPAllocateClause *>(this)->children();
483
0
    return const_child_range(Children.begin(), Children.end());
484
0
  }
485
486
1.19k
  child_range used_children() {
487
1.19k
    return child_range(child_iterator(), child_iterator());
488
1.19k
  }
489
0
  const_child_range used_children() const {
490
0
    return const_child_range(const_child_iterator(), const_child_iterator());
491
0
  }
492
493
167k
  static bool classof(const OMPClause *T) {
494
167k
    return T->getClauseKind() == llvm::omp::OMPC_allocate;
495
167k
  }
496
};
497
498
/// This represents 'if' clause in the '#pragma omp ...' directive.
499
///
500
/// \code
501
/// #pragma omp parallel if(parallel:a > 5)
502
/// \endcode
503
/// In this example directive '#pragma omp parallel' has simple 'if' clause with
504
/// condition 'a > 5' and directive name modifier 'parallel'.
505
class OMPIfClause : public OMPClause, public OMPClauseWithPreInit {
506
  friend class OMPClauseReader;
507
508
  /// Location of '('.
509
  SourceLocation LParenLoc;
510
511
  /// Condition of the 'if' clause.
512
  Stmt *Condition = nullptr;
513
514
  /// Location of ':' (if any).
515
  SourceLocation ColonLoc;
516
517
  /// Directive name modifier for the clause.
518
  OpenMPDirectiveKind NameModifier = llvm::omp::OMPD_unknown;
519
520
  /// Name modifier location.
521
  SourceLocation NameModifierLoc;
522
523
  /// Set condition.
524
2.49k
  void setCondition(Expr *Cond) { Condition = Cond; }
525
526
  /// Set directive name modifier for the clause.
527
2.49k
  void setNameModifier(OpenMPDirectiveKind NM) { NameModifier = NM; }
528
529
  /// Set location of directive name modifier for the clause.
530
2.49k
  void setNameModifierLoc(SourceLocation Loc) { NameModifierLoc = Loc; }
531
532
  /// Set location of ':'.
533
2.49k
  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
534
535
public:
536
  /// Build 'if' clause with condition \a Cond.
537
  ///
538
  /// \param NameModifier [OpenMP 4.1] Directive name modifier of clause.
539
  /// \param Cond Condition of the clause.
540
  /// \param HelperCond Helper condition for the clause.
541
  /// \param CaptureRegion Innermost OpenMP region where expressions in this
542
  /// clause must be captured.
543
  /// \param StartLoc Starting location of the clause.
544
  /// \param LParenLoc Location of '('.
545
  /// \param NameModifierLoc Location of directive name modifier.
546
  /// \param ColonLoc [OpenMP 4.1] Location of ':'.
547
  /// \param EndLoc Ending location of the clause.
548
  OMPIfClause(OpenMPDirectiveKind NameModifier, Expr *Cond, Stmt *HelperCond,
549
              OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
550
              SourceLocation LParenLoc, SourceLocation NameModifierLoc,
551
              SourceLocation ColonLoc, SourceLocation EndLoc)
552
      : OMPClause(llvm::omp::OMPC_if, StartLoc, EndLoc),
553
        OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond),
554
        ColonLoc(ColonLoc), NameModifier(NameModifier),
555
12.1k
        NameModifierLoc(NameModifierLoc) {
556
12.1k
    setPreInitStmt(HelperCond, CaptureRegion);
557
12.1k
  }
558
559
  /// Build an empty clause.
560
  OMPIfClause()
561
      : OMPClause(llvm::omp::OMPC_if, SourceLocation(), SourceLocation()),
562
2.49k
        OMPClauseWithPreInit(this) {}
563
564
  /// Sets the location of '('.
565
2.49k
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
566
567
  /// Returns the location of '('.
568
5.10k
  SourceLocation getLParenLoc() const { return LParenLoc; }
569
570
  /// Return the location of ':'.
571
5.10k
  SourceLocation getColonLoc() const { return ColonLoc; }
572
573
  /// Returns condition.
574
13.9k
  Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
575
576
  /// Return directive name modifier associated with the clause.
577
26.7k
  OpenMPDirectiveKind getNameModifier() const { return NameModifier; }
578
579
  /// Return the location of directive name modifier.
580
11.4k
  SourceLocation getNameModifierLoc() const { return NameModifierLoc; }
581
582
1.35k
  child_range children() { return child_range(&Condition, &Condition + 1); }
583
584
0
  const_child_range children() const {
585
0
    return const_child_range(&Condition, &Condition + 1);
586
0
  }
587
588
  child_range used_children();
589
0
  const_child_range used_children() const {
590
0
    auto Children = const_cast<OMPIfClause *>(this)->used_children();
591
0
    return const_child_range(Children.begin(), Children.end());
592
0
  }
593
594
172k
  static bool classof(const OMPClause *T) {
595
172k
    return T->getClauseKind() == llvm::omp::OMPC_if;
596
172k
  }
597
};
598
599
/// This represents 'final' clause in the '#pragma omp ...' directive.
600
///
601
/// \code
602
/// #pragma omp task final(a > 5)
603
/// \endcode
604
/// In this example directive '#pragma omp task' has simple 'final'
605
/// clause with condition 'a > 5'.
606
class OMPFinalClause : public OMPClause, public OMPClauseWithPreInit {
607
  friend class OMPClauseReader;
608
609
  /// Location of '('.
610
  SourceLocation LParenLoc;
611
612
  /// Condition of the 'if' clause.
613
  Stmt *Condition = nullptr;
614
615
  /// Set condition.
616
72
  void setCondition(Expr *Cond) { Condition = Cond; }
617
618
public:
619
  /// Build 'final' clause with condition \a Cond.
620
  ///
621
  /// \param Cond Condition of the clause.
622
  /// \param HelperCond Helper condition for the construct.
623
  /// \param CaptureRegion Innermost OpenMP region where expressions in this
624
  /// clause must be captured.
625
  /// \param StartLoc Starting location of the clause.
626
  /// \param LParenLoc Location of '('.
627
  /// \param EndLoc Ending location of the clause.
628
  OMPFinalClause(Expr *Cond, Stmt *HelperCond,
629
                 OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
630
                 SourceLocation LParenLoc, SourceLocation EndLoc)
631
      : OMPClause(llvm::omp::OMPC_final, StartLoc, EndLoc),
632
542
        OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Condition(Cond) {
633
542
    setPreInitStmt(HelperCond, CaptureRegion);
634
542
  }
635
636
  /// Build an empty clause.
637
  OMPFinalClause()
638
      : OMPClause(llvm::omp::OMPC_final, SourceLocation(), SourceLocation()),
639
72
        OMPClauseWithPreInit(this) {}
640
641
  /// Sets the location of '('.
642
72
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
643
644
  /// Returns the location of '('.
645
250
  SourceLocation getLParenLoc() const { return LParenLoc; }
646
647
  /// Returns condition.
648
514
  Expr *getCondition() const { return cast_or_null<Expr>(Condition); }
649
650
152
  child_range children() { return child_range(&Condition, &Condition + 1); }
651
652
0
  const_child_range children() const {
653
0
    return const_child_range(&Condition, &Condition + 1);
654
0
  }
655
656
  child_range used_children();
657
0
  const_child_range used_children() const {
658
0
    auto Children = const_cast<OMPFinalClause *>(this)->used_children();
659
0
    return const_child_range(Children.begin(), Children.end());
660
0
  }
661
662
700
  static bool classof(const OMPClause *T) {
663
700
    return T->getClauseKind() == llvm::omp::OMPC_final;
664
700
  }
665
};
666
667
/// This represents 'num_threads' clause in the '#pragma omp ...'
668
/// directive.
669
///
670
/// \code
671
/// #pragma omp parallel num_threads(6)
672
/// \endcode
673
/// In this example directive '#pragma omp parallel' has simple 'num_threads'
674
/// clause with number of threads '6'.
675
class OMPNumThreadsClause : public OMPClause, public OMPClauseWithPreInit {
676
  friend class OMPClauseReader;
677
678
  /// Location of '('.
679
  SourceLocation LParenLoc;
680
681
  /// Condition of the 'num_threads' clause.
682
  Stmt *NumThreads = nullptr;
683
684
  /// Set condition.
685
317
  void setNumThreads(Expr *NThreads) { NumThreads = NThreads; }
686
687
public:
688
  /// Build 'num_threads' clause with condition \a NumThreads.
689
  ///
690
  /// \param NumThreads Number of threads for the construct.
691
  /// \param HelperNumThreads Helper Number of threads for the construct.
692
  /// \param CaptureRegion Innermost OpenMP region where expressions in this
693
  /// clause must be captured.
694
  /// \param StartLoc Starting location of the clause.
695
  /// \param LParenLoc Location of '('.
696
  /// \param EndLoc Ending location of the clause.
697
  OMPNumThreadsClause(Expr *NumThreads, Stmt *HelperNumThreads,
698
                      OpenMPDirectiveKind CaptureRegion,
699
                      SourceLocation StartLoc, SourceLocation LParenLoc,
700
                      SourceLocation EndLoc)
701
      : OMPClause(llvm::omp::OMPC_num_threads, StartLoc, EndLoc),
702
        OMPClauseWithPreInit(this), LParenLoc(LParenLoc),
703
2.00k
        NumThreads(NumThreads) {
704
2.00k
    setPreInitStmt(HelperNumThreads, CaptureRegion);
705
2.00k
  }
706
707
  /// Build an empty clause.
708
  OMPNumThreadsClause()
709
      : OMPClause(llvm::omp::OMPC_num_threads, SourceLocation(),
710
                  SourceLocation()),
711
317
        OMPClauseWithPreInit(this) {}
712
713
  /// Sets the location of '('.
714
317
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
715
716
  /// Returns the location of '('.
717
1.17k
  SourceLocation getLParenLoc() const { return LParenLoc; }
718
719
  /// Returns number of threads.
720
2.73k
  Expr *getNumThreads() const { return cast_or_null<Expr>(NumThreads); }
721
722
502
  child_range children() { return child_range(&NumThreads, &NumThreads + 1); }
723
724
0
  const_child_range children() const {
725
0
    return const_child_range(&NumThreads, &NumThreads + 1);
726
0
  }
727
728
1.79k
  child_range used_children() {
729
1.79k
    return child_range(child_iterator(), child_iterator());
730
1.79k
  }
731
0
  const_child_range used_children() const {
732
0
    return const_child_range(const_child_iterator(), const_child_iterator());
733
0
  }
734
735
17.2k
  static bool classof(const OMPClause *T) {
736
17.2k
    return T->getClauseKind() == llvm::omp::OMPC_num_threads;
737
17.2k
  }
738
};
739
740
/// This represents 'safelen' clause in the '#pragma omp ...'
741
/// directive.
742
///
743
/// \code
744
/// #pragma omp simd safelen(4)
745
/// \endcode
746
/// In this example directive '#pragma omp simd' has clause 'safelen'
747
/// with single expression '4'.
748
/// If the safelen clause is used then no two iterations executed
749
/// concurrently with SIMD instructions can have a greater distance
750
/// in the logical iteration space than its value. The parameter of
751
/// the safelen clause must be a constant positive integer expression.
752
class OMPSafelenClause : public OMPClause {
753
  friend class OMPClauseReader;
754
755
  /// Location of '('.
756
  SourceLocation LParenLoc;
757
758
  /// Safe iteration space distance.
759
  Stmt *Safelen = nullptr;
760
761
  /// Set safelen.
762
228
  void setSafelen(Expr *Len) { Safelen = Len; }
763
764
public:
765
  /// Build 'safelen' clause.
766
  ///
767
  /// \param Len Expression associated with this clause.
768
  /// \param StartLoc Starting location of the clause.
769
  /// \param EndLoc Ending location of the clause.
770
  OMPSafelenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
771
                   SourceLocation EndLoc)
772
      : OMPClause(llvm::omp::OMPC_safelen, StartLoc, EndLoc),
773
3.34k
        LParenLoc(LParenLoc), Safelen(Len) {}
774
775
  /// Build an empty clause.
776
  explicit OMPSafelenClause()
777
228
      : OMPClause(llvm::omp::OMPC_safelen, SourceLocation(), SourceLocation()) {
778
228
  }
779
780
  /// Sets the location of '('.
781
228
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
782
783
  /// Returns the location of '('.
784
2.19k
  SourceLocation getLParenLoc() const { return LParenLoc; }
785
786
  /// Return safe iteration space distance.
787
3.44k
  Expr *getSafelen() const { return cast_or_null<Expr>(Safelen); }
788
789
708
  child_range children() { return child_range(&Safelen, &Safelen + 1); }
790
791
0
  const_child_range children() const {
792
0
    return const_child_range(&Safelen, &Safelen + 1);
793
0
  }
794
795
648
  child_range used_children() {
796
648
    return child_range(child_iterator(), child_iterator());
797
648
  }
798
0
  const_child_range used_children() const {
799
0
    return const_child_range(const_child_iterator(), const_child_iterator());
800
0
  }
801
802
12.7k
  static bool classof(const OMPClause *T) {
803
12.7k
    return T->getClauseKind() == llvm::omp::OMPC_safelen;
804
12.7k
  }
805
};
806
807
/// This represents 'simdlen' clause in the '#pragma omp ...'
808
/// directive.
809
///
810
/// \code
811
/// #pragma omp simd simdlen(4)
812
/// \endcode
813
/// In this example directive '#pragma omp simd' has clause 'simdlen'
814
/// with single expression '4'.
815
/// If the 'simdlen' clause is used then it specifies the preferred number of
816
/// iterations to be executed concurrently. The parameter of the 'simdlen'
817
/// clause must be a constant positive integer expression.
818
class OMPSimdlenClause : public OMPClause {
819
  friend class OMPClauseReader;
820
821
  /// Location of '('.
822
  SourceLocation LParenLoc;
823
824
  /// Safe iteration space distance.
825
  Stmt *Simdlen = nullptr;
826
827
  /// Set simdlen.
828
232
  void setSimdlen(Expr *Len) { Simdlen = Len; }
829
830
public:
831
  /// Build 'simdlen' clause.
832
  ///
833
  /// \param Len Expression associated with this clause.
834
  /// \param StartLoc Starting location of the clause.
835
  /// \param EndLoc Ending location of the clause.
836
  OMPSimdlenClause(Expr *Len, SourceLocation StartLoc, SourceLocation LParenLoc,
837
                   SourceLocation EndLoc)
838
      : OMPClause(llvm::omp::OMPC_simdlen, StartLoc, EndLoc),
839
2.08k
        LParenLoc(LParenLoc), Simdlen(Len) {}
840
841
  /// Build an empty clause.
842
  explicit OMPSimdlenClause()
843
232
      : OMPClause(llvm::omp::OMPC_simdlen, SourceLocation(), SourceLocation()) {
844
232
  }
845
846
  /// Sets the location of '('.
847
232
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
848
849
  /// Returns the location of '('.
850
1.22k
  SourceLocation getLParenLoc() const { return LParenLoc; }
851
852
  /// Return safe iteration space distance.
853
2.57k
  Expr *getSimdlen() const { return cast_or_null<Expr>(Simdlen); }
854
855
290
  child_range children() { return child_range(&Simdlen, &Simdlen + 1); }
856
857
0
  const_child_range children() const {
858
0
    return const_child_range(&Simdlen, &Simdlen + 1);
859
0
  }
860
861
672
  child_range used_children() {
862
672
    return child_range(child_iterator(), child_iterator());
863
672
  }
864
0
  const_child_range used_children() const {
865
0
    return const_child_range(const_child_iterator(), const_child_iterator());
866
0
  }
867
868
12.7k
  static bool classof(const OMPClause *T) {
869
12.7k
    return T->getClauseKind() == llvm::omp::OMPC_simdlen;
870
12.7k
  }
871
};
872
873
/// This represents the 'sizes' clause in the '#pragma omp tile' directive.
874
///
875
/// \code
876
/// #pragma omp tile sizes(5,5)
877
/// for (int i = 0; i < 64; ++i)
878
///   for (int j = 0; j < 64; ++j)
879
/// \endcode
880
class OMPSizesClause final
881
    : public OMPClause,
882
      private llvm::TrailingObjects<OMPSizesClause, Expr *> {
883
  friend class OMPClauseReader;
884
  friend class llvm::TrailingObjects<OMPSizesClause, Expr *>;
885
886
  /// Location of '('.
887
  SourceLocation LParenLoc;
888
889
  /// Number of tile sizes in the clause.
890
  unsigned NumSizes;
891
892
  /// Build an empty clause.
893
  explicit OMPSizesClause(int NumSizes)
894
      : OMPClause(llvm::omp::OMPC_sizes, SourceLocation(), SourceLocation()),
895
106
        NumSizes(NumSizes) {}
896
897
public:
898
  /// Build a 'sizes' AST node.
899
  ///
900
  /// \param C         Context of the AST.
901
  /// \param StartLoc  Location of the 'sizes' identifier.
902
  /// \param LParenLoc Location of '('.
903
  /// \param EndLoc    Location of ')'.
904
  /// \param Sizes     Content of the clause.
905
  static OMPSizesClause *Create(const ASTContext &C, SourceLocation StartLoc,
906
                                SourceLocation LParenLoc, SourceLocation EndLoc,
907
                                ArrayRef<Expr *> Sizes);
908
909
  /// Build an empty 'sizes' AST node for deserialization.
910
  ///
911
  /// \param C     Context of the AST.
912
  /// \param NumSizes Number of items in the clause.
913
  static OMPSizesClause *CreateEmpty(const ASTContext &C, unsigned NumSizes);
914
915
  /// Sets the location of '('.
916
106
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
917
918
  /// Returns the location of '('.
919
31
  SourceLocation getLParenLoc() const { return LParenLoc; }
920
921
  /// Returns the number of list items.
922
110
  unsigned getNumSizes() const { return NumSizes; }
923
924
  /// Returns the tile size expressions.
925
93
  MutableArrayRef<Expr *> getSizesRefs() {
926
93
    return MutableArrayRef<Expr *>(static_cast<OMPSizesClause *>(this)
927
93
                                       ->template getTrailingObjects<Expr *>(),
928
93
                                   NumSizes);
929
93
  }
930
175
  ArrayRef<Expr *> getSizesRefs() const {
931
175
    return ArrayRef<Expr *>(static_cast<const OMPSizesClause *>(this)
932
175
                                ->template getTrailingObjects<Expr *>(),
933
175
                            NumSizes);
934
175
  }
935
936
  /// Sets the tile size expressions.
937
80
  void setSizesRefs(ArrayRef<Expr *> VL) {
938
80
    assert(VL.size() == NumSizes);
939
0
    std::copy(VL.begin(), VL.end(),
940
80
              static_cast<OMPSizesClause *>(this)
941
80
                  ->template getTrailingObjects<Expr *>());
942
80
  }
943
944
18
  child_range children() {
945
18
    MutableArrayRef<Expr *> Sizes = getSizesRefs();
946
18
    return child_range(reinterpret_cast<Stmt **>(Sizes.begin()),
947
18
                       reinterpret_cast<Stmt **>(Sizes.end()));
948
18
  }
949
0
  const_child_range children() const {
950
0
    ArrayRef<Expr *> Sizes = getSizesRefs();
951
0
    return const_child_range(reinterpret_cast<Stmt *const *>(Sizes.begin()),
952
0
                             reinterpret_cast<Stmt *const *>(Sizes.end()));
953
0
  }
954
955
0
  child_range used_children() {
956
0
    return child_range(child_iterator(), child_iterator());
957
0
  }
958
0
  const_child_range used_children() const {
959
0
    return const_child_range(const_child_iterator(), const_child_iterator());
960
0
  }
961
962
79
  static bool classof(const OMPClause *T) {
963
79
    return T->getClauseKind() == llvm::omp::OMPC_sizes;
964
79
  }
965
};
966
967
/// Representation of the 'full' clause of the '#pragma omp unroll' directive.
968
///
969
/// \code
970
/// #pragma omp unroll full
971
/// for (int i = 0; i < 64; ++i)
972
/// \endcode
973
class OMPFullClause final : public OMPClause {
974
  friend class OMPClauseReader;
975
976
  /// Build an empty clause.
977
18
  explicit OMPFullClause() : OMPClause(llvm::omp::OMPC_full, {}, {}) {}
978
979
public:
980
  /// Build an AST node for a 'full' clause.
981
  ///
982
  /// \param C        Context of the AST.
983
  /// \param StartLoc Starting location of the clause.
984
  /// \param EndLoc   Ending location of the clause.
985
  static OMPFullClause *Create(const ASTContext &C, SourceLocation StartLoc,
986
                               SourceLocation EndLoc);
987
988
  /// Build an empty 'full' AST node for deserialization.
989
  ///
990
  /// \param C Context of the AST.
991
  static OMPFullClause *CreateEmpty(const ASTContext &C);
992
993
2
  child_range children() { return {child_iterator(), child_iterator()}; }
994
0
  const_child_range children() const {
995
0
    return {const_child_iterator(), const_child_iterator()};
996
0
  }
997
998
0
  child_range used_children() {
999
0
    return child_range(child_iterator(), child_iterator());
1000
0
  }
1001
0
  const_child_range used_children() const {
1002
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1003
0
  }
1004
1005
93
  static bool classof(const OMPClause *T) {
1006
93
    return T->getClauseKind() == llvm::omp::OMPC_full;
1007
93
  }
1008
};
1009
1010
/// Representation of the 'partial' clause of the '#pragma omp unroll'
1011
/// directive.
1012
///
1013
/// \code
1014
/// #pragma omp unroll partial(4)
1015
/// for (int i = start; i < end; ++i)
1016
/// \endcode
1017
class OMPPartialClause final : public OMPClause {
1018
  friend class OMPClauseReader;
1019
1020
  /// Location of '('.
1021
  SourceLocation LParenLoc;
1022
1023
  /// Optional argument to the clause (unroll factor).
1024
  Stmt *Factor;
1025
1026
  /// Build an empty clause.
1027
89
  explicit OMPPartialClause() : OMPClause(llvm::omp::OMPC_partial, {}, {}) {}
1028
1029
  /// Set the unroll factor.
1030
89
  void setFactor(Expr *E) { Factor = E; }
1031
1032
  /// Sets the location of '('.
1033
89
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1034
1035
public:
1036
  /// Build an AST node for a 'partial' clause.
1037
  ///
1038
  /// \param C         Context of the AST.
1039
  /// \param StartLoc  Location of the 'partial' identifier.
1040
  /// \param LParenLoc Location of '('.
1041
  /// \param EndLoc    Location of ')'.
1042
  /// \param Factor    Clause argument.
1043
  static OMPPartialClause *Create(const ASTContext &C, SourceLocation StartLoc,
1044
                                  SourceLocation LParenLoc,
1045
                                  SourceLocation EndLoc, Expr *Factor);
1046
1047
  /// Build an empty 'partial' AST node for deserialization.
1048
  ///
1049
  /// \param C     Context of the AST.
1050
  static OMPPartialClause *CreateEmpty(const ASTContext &C);
1051
1052
  /// Returns the location of '('.
1053
26
  SourceLocation getLParenLoc() const { return LParenLoc; }
1054
1055
  /// Returns the argument of the clause or nullptr if not set.
1056
125
  Expr *getFactor() const { return cast_or_null<Expr>(Factor); }
1057
1058
14
  child_range children() { return child_range(&Factor, &Factor + 1); }
1059
0
  const_child_range children() const {
1060
0
    return const_child_range(&Factor, &Factor + 1);
1061
0
  }
1062
1063
0
  child_range used_children() {
1064
0
    return child_range(child_iterator(), child_iterator());
1065
0
  }
1066
0
  const_child_range used_children() const {
1067
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1068
0
  }
1069
1070
90
  static bool classof(const OMPClause *T) {
1071
90
    return T->getClauseKind() == llvm::omp::OMPC_partial;
1072
90
  }
1073
};
1074
1075
/// This represents 'collapse' clause in the '#pragma omp ...'
1076
/// directive.
1077
///
1078
/// \code
1079
/// #pragma omp simd collapse(3)
1080
/// \endcode
1081
/// In this example directive '#pragma omp simd' has clause 'collapse'
1082
/// with single expression '3'.
1083
/// The parameter must be a constant positive integer expression, it specifies
1084
/// the number of nested loops that should be collapsed into a single iteration
1085
/// space.
1086
class OMPCollapseClause : public OMPClause {
1087
  friend class OMPClauseReader;
1088
1089
  /// Location of '('.
1090
  SourceLocation LParenLoc;
1091
1092
  /// Number of for-loops.
1093
  Stmt *NumForLoops = nullptr;
1094
1095
  /// Set the number of associated for-loops.
1096
413
  void setNumForLoops(Expr *Num) { NumForLoops = Num; }
1097
1098
public:
1099
  /// Build 'collapse' clause.
1100
  ///
1101
  /// \param Num Expression associated with this clause.
1102
  /// \param StartLoc Starting location of the clause.
1103
  /// \param LParenLoc Location of '('.
1104
  /// \param EndLoc Ending location of the clause.
1105
  OMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1106
                    SourceLocation LParenLoc, SourceLocation EndLoc)
1107
      : OMPClause(llvm::omp::OMPC_collapse, StartLoc, EndLoc),
1108
5.51k
        LParenLoc(LParenLoc), NumForLoops(Num) {}
1109
1110
  /// Build an empty clause.
1111
  explicit OMPCollapseClause()
1112
      : OMPClause(llvm::omp::OMPC_collapse, SourceLocation(),
1113
413
                  SourceLocation()) {}
1114
1115
  /// Sets the location of '('.
1116
413
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1117
1118
  /// Returns the location of '('.
1119
3.35k
  SourceLocation getLParenLoc() const { return LParenLoc; }
1120
1121
  /// Return the number of associated for-loops.
1122
9.53k
  Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
1123
1124
774
  child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
1125
1126
0
  const_child_range children() const {
1127
0
    return const_child_range(&NumForLoops, &NumForLoops + 1);
1128
0
  }
1129
1130
1.17k
  child_range used_children() {
1131
1.17k
    return child_range(child_iterator(), child_iterator());
1132
1.17k
  }
1133
0
  const_child_range used_children() const {
1134
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1135
0
  }
1136
1137
109k
  static bool classof(const OMPClause *T) {
1138
109k
    return T->getClauseKind() == llvm::omp::OMPC_collapse;
1139
109k
  }
1140
};
1141
1142
/// This represents 'default' clause in the '#pragma omp ...' directive.
1143
///
1144
/// \code
1145
/// #pragma omp parallel default(shared)
1146
/// \endcode
1147
/// In this example directive '#pragma omp parallel' has simple 'default'
1148
/// clause with kind 'shared'.
1149
class OMPDefaultClause : public OMPClause {
1150
  friend class OMPClauseReader;
1151
1152
  /// Location of '('.
1153
  SourceLocation LParenLoc;
1154
1155
  /// A kind of the 'default' clause.
1156
  llvm::omp::DefaultKind Kind = llvm::omp::OMP_DEFAULT_unknown;
1157
1158
  /// Start location of the kind in source code.
1159
  SourceLocation KindKwLoc;
1160
1161
  /// Set kind of the clauses.
1162
  ///
1163
  /// \param K Argument of clause.
1164
270
  void setDefaultKind(llvm::omp::DefaultKind K) { Kind = K; }
1165
1166
  /// Set argument location.
1167
  ///
1168
  /// \param KLoc Argument location.
1169
270
  void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
1170
1171
public:
1172
  /// Build 'default' clause with argument \a A ('none' or 'shared').
1173
  ///
1174
  /// \param A Argument of the clause ('none' or 'shared').
1175
  /// \param ALoc Starting location of the argument.
1176
  /// \param StartLoc Starting location of the clause.
1177
  /// \param LParenLoc Location of '('.
1178
  /// \param EndLoc Ending location of the clause.
1179
  OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc,
1180
                   SourceLocation StartLoc, SourceLocation LParenLoc,
1181
                   SourceLocation EndLoc)
1182
      : OMPClause(llvm::omp::OMPC_default, StartLoc, EndLoc),
1183
1.98k
        LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1184
1185
  /// Build an empty clause.
1186
  OMPDefaultClause()
1187
270
      : OMPClause(llvm::omp::OMPC_default, SourceLocation(), SourceLocation()) {
1188
270
  }
1189
1190
  /// Sets the location of '('.
1191
270
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1192
1193
  /// Returns the location of '('.
1194
724
  SourceLocation getLParenLoc() const { return LParenLoc; }
1195
1196
  /// Returns kind of the clause.
1197
1.71k
  llvm::omp::DefaultKind getDefaultKind() const { return Kind; }
1198
1199
  /// Returns location of clause kind.
1200
724
  SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
1201
1202
541
  child_range children() {
1203
541
    return child_range(child_iterator(), child_iterator());
1204
541
  }
1205
1206
0
  const_child_range children() const {
1207
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1208
0
  }
1209
1210
870
  child_range used_children() {
1211
870
    return child_range(child_iterator(), child_iterator());
1212
870
  }
1213
0
  const_child_range used_children() const {
1214
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1215
0
  }
1216
1217
0
  static bool classof(const OMPClause *T) {
1218
0
    return T->getClauseKind() == llvm::omp::OMPC_default;
1219
0
  }
1220
};
1221
1222
/// This represents 'proc_bind' clause in the '#pragma omp ...'
1223
/// directive.
1224
///
1225
/// \code
1226
/// #pragma omp parallel proc_bind(master)
1227
/// \endcode
1228
/// In this example directive '#pragma omp parallel' has simple 'proc_bind'
1229
/// clause with kind 'master'.
1230
class OMPProcBindClause : public OMPClause {
1231
  friend class OMPClauseReader;
1232
1233
  /// Location of '('.
1234
  SourceLocation LParenLoc;
1235
1236
  /// A kind of the 'proc_bind' clause.
1237
  llvm::omp::ProcBindKind Kind = llvm::omp::OMP_PROC_BIND_unknown;
1238
1239
  /// Start location of the kind in source code.
1240
  SourceLocation KindKwLoc;
1241
1242
  /// Set kind of the clause.
1243
  ///
1244
  /// \param K Kind of clause.
1245
108
  void setProcBindKind(llvm::omp::ProcBindKind K) { Kind = K; }
1246
1247
  /// Set clause kind location.
1248
  ///
1249
  /// \param KLoc Kind location.
1250
108
  void setProcBindKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
1251
1252
public:
1253
  /// Build 'proc_bind' clause with argument \a A ('master', 'close' or
1254
  ///        'spread').
1255
  ///
1256
  /// \param A Argument of the clause ('master', 'close' or 'spread').
1257
  /// \param ALoc Starting location of the argument.
1258
  /// \param StartLoc Starting location of the clause.
1259
  /// \param LParenLoc Location of '('.
1260
  /// \param EndLoc Ending location of the clause.
1261
  OMPProcBindClause(llvm::omp::ProcBindKind A, SourceLocation ALoc,
1262
                    SourceLocation StartLoc, SourceLocation LParenLoc,
1263
                    SourceLocation EndLoc)
1264
      : OMPClause(llvm::omp::OMPC_proc_bind, StartLoc, EndLoc),
1265
792
        LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1266
1267
  /// Build an empty clause.
1268
  OMPProcBindClause()
1269
      : OMPClause(llvm::omp::OMPC_proc_bind, SourceLocation(),
1270
108
                  SourceLocation()) {}
1271
1272
  /// Sets the location of '('.
1273
108
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1274
1275
  /// Returns the location of '('.
1276
367
  SourceLocation getLParenLoc() const { return LParenLoc; }
1277
1278
  /// Returns kind of the clause.
1279
698
  llvm::omp::ProcBindKind getProcBindKind() const { return Kind; }
1280
1281
  /// Returns location of clause kind.
1282
367
  SourceLocation getProcBindKindKwLoc() const { return KindKwLoc; }
1283
1284
150
  child_range children() {
1285
150
    return child_range(child_iterator(), child_iterator());
1286
150
  }
1287
1288
0
  const_child_range children() const {
1289
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1290
0
  }
1291
1292
760
  child_range used_children() {
1293
760
    return child_range(child_iterator(), child_iterator());
1294
760
  }
1295
0
  const_child_range used_children() const {
1296
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1297
0
  }
1298
1299
7.75k
  static bool classof(const OMPClause *T) {
1300
7.75k
    return T->getClauseKind() == llvm::omp::OMPC_proc_bind;
1301
7.75k
  }
1302
};
1303
1304
/// This represents 'unified_address' clause in the '#pragma omp requires'
1305
/// directive.
1306
///
1307
/// \code
1308
/// #pragma omp requires unified_address
1309
/// \endcode
1310
/// In this example directive '#pragma omp requires' has 'unified_address'
1311
/// clause.
1312
class OMPUnifiedAddressClause final : public OMPClause {
1313
public:
1314
  friend class OMPClauseReader;
1315
  /// Build 'unified_address' clause.
1316
  ///
1317
  /// \param StartLoc Starting location of the clause.
1318
  /// \param EndLoc Ending location of the clause.
1319
  OMPUnifiedAddressClause(SourceLocation StartLoc, SourceLocation EndLoc)
1320
27
      : OMPClause(llvm::omp::OMPC_unified_address, StartLoc, EndLoc) {}
1321
1322
  /// Build an empty clause.
1323
  OMPUnifiedAddressClause()
1324
      : OMPClause(llvm::omp::OMPC_unified_address, SourceLocation(),
1325
4
                  SourceLocation()) {}
1326
1327
0
  child_range children() {
1328
0
    return child_range(child_iterator(), child_iterator());
1329
0
  }
1330
1331
0
  const_child_range children() const {
1332
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1333
0
  }
1334
1335
0
  child_range used_children() {
1336
0
    return child_range(child_iterator(), child_iterator());
1337
0
  }
1338
0
  const_child_range used_children() const {
1339
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1340
0
  }
1341
1342
5.32k
  static bool classof(const OMPClause *T) {
1343
5.32k
    return T->getClauseKind() == llvm::omp::OMPC_unified_address;
1344
5.32k
  }
1345
};
1346
1347
/// This represents 'unified_shared_memory' clause in the '#pragma omp requires'
1348
/// directive.
1349
///
1350
/// \code
1351
/// #pragma omp requires unified_shared_memory
1352
/// \endcode
1353
/// In this example directive '#pragma omp requires' has 'unified_shared_memory'
1354
/// clause.
1355
class OMPUnifiedSharedMemoryClause final : public OMPClause {
1356
public:
1357
  friend class OMPClauseReader;
1358
  /// Build 'unified_shared_memory' clause.
1359
  ///
1360
  /// \param StartLoc Starting location of the clause.
1361
  /// \param EndLoc Ending location of the clause.
1362
  OMPUnifiedSharedMemoryClause(SourceLocation StartLoc, SourceLocation EndLoc)
1363
39
      : OMPClause(llvm::omp::OMPC_unified_shared_memory, StartLoc, EndLoc) {}
1364
1365
  /// Build an empty clause.
1366
  OMPUnifiedSharedMemoryClause()
1367
      : OMPClause(llvm::omp::OMPC_unified_shared_memory, SourceLocation(),
1368
4
                  SourceLocation()) {}
1369
1370
0
  child_range children() {
1371
0
    return child_range(child_iterator(), child_iterator());
1372
0
  }
1373
1374
0
  const_child_range children() const {
1375
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1376
0
  }
1377
1378
0
  child_range used_children() {
1379
0
    return child_range(child_iterator(), child_iterator());
1380
0
  }
1381
0
  const_child_range used_children() const {
1382
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1383
0
  }
1384
1385
5.34k
  static bool classof(const OMPClause *T) {
1386
5.34k
    return T->getClauseKind() == llvm::omp::OMPC_unified_shared_memory;
1387
5.34k
  }
1388
};
1389
1390
/// This represents 'reverse_offload' clause in the '#pragma omp requires'
1391
/// directive.
1392
///
1393
/// \code
1394
/// #pragma omp requires reverse_offload
1395
/// \endcode
1396
/// In this example directive '#pragma omp requires' has 'reverse_offload'
1397
/// clause.
1398
class OMPReverseOffloadClause final : public OMPClause {
1399
public:
1400
  friend class OMPClauseReader;
1401
  /// Build 'reverse_offload' clause.
1402
  ///
1403
  /// \param StartLoc Starting location of the clause.
1404
  /// \param EndLoc Ending location of the clause.
1405
  OMPReverseOffloadClause(SourceLocation StartLoc, SourceLocation EndLoc)
1406
17
      : OMPClause(llvm::omp::OMPC_reverse_offload, StartLoc, EndLoc) {}
1407
1408
  /// Build an empty clause.
1409
  OMPReverseOffloadClause()
1410
      : OMPClause(llvm::omp::OMPC_reverse_offload, SourceLocation(),
1411
6
                  SourceLocation()) {}
1412
1413
0
  child_range children() {
1414
0
    return child_range(child_iterator(), child_iterator());
1415
0
  }
1416
1417
0
  const_child_range children() const {
1418
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1419
0
  }
1420
1421
0
  child_range used_children() {
1422
0
    return child_range(child_iterator(), child_iterator());
1423
0
  }
1424
0
  const_child_range used_children() const {
1425
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1426
0
  }
1427
1428
5.33k
  static bool classof(const OMPClause *T) {
1429
5.33k
    return T->getClauseKind() == llvm::omp::OMPC_reverse_offload;
1430
5.33k
  }
1431
};
1432
1433
/// This represents 'dynamic_allocators' clause in the '#pragma omp requires'
1434
/// directive.
1435
///
1436
/// \code
1437
/// #pragma omp requires dynamic_allocators
1438
/// \endcode
1439
/// In this example directive '#pragma omp requires' has 'dynamic_allocators'
1440
/// clause.
1441
class OMPDynamicAllocatorsClause final : public OMPClause {
1442
public:
1443
  friend class OMPClauseReader;
1444
  /// Build 'dynamic_allocators' clause.
1445
  ///
1446
  /// \param StartLoc Starting location of the clause.
1447
  /// \param EndLoc Ending location of the clause.
1448
  OMPDynamicAllocatorsClause(SourceLocation StartLoc, SourceLocation EndLoc)
1449
99
      : OMPClause(llvm::omp::OMPC_dynamic_allocators, StartLoc, EndLoc) {}
1450
1451
  /// Build an empty clause.
1452
  OMPDynamicAllocatorsClause()
1453
      : OMPClause(llvm::omp::OMPC_dynamic_allocators, SourceLocation(),
1454
4
                  SourceLocation()) {}
1455
1456
0
  child_range children() {
1457
0
    return child_range(child_iterator(), child_iterator());
1458
0
  }
1459
1460
0
  const_child_range children() const {
1461
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1462
0
  }
1463
1464
0
  child_range used_children() {
1465
0
    return child_range(child_iterator(), child_iterator());
1466
0
  }
1467
0
  const_child_range used_children() const {
1468
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1469
0
  }
1470
1471
4.96k
  static bool classof(const OMPClause *T) {
1472
4.96k
    return T->getClauseKind() == llvm::omp::OMPC_dynamic_allocators;
1473
4.96k
  }
1474
};
1475
1476
/// This represents 'atomic_default_mem_order' clause in the '#pragma omp
1477
/// requires'  directive.
1478
///
1479
/// \code
1480
/// #pragma omp requires atomic_default_mem_order(seq_cst)
1481
/// \endcode
1482
/// In this example directive '#pragma omp requires' has simple
1483
/// atomic_default_mem_order' clause with kind 'seq_cst'.
1484
class OMPAtomicDefaultMemOrderClause final : public OMPClause {
1485
  friend class OMPClauseReader;
1486
1487
  /// Location of '('
1488
  SourceLocation LParenLoc;
1489
1490
  /// A kind of the 'atomic_default_mem_order' clause.
1491
  OpenMPAtomicDefaultMemOrderClauseKind Kind =
1492
      OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown;
1493
1494
  /// Start location of the kind in source code.
1495
  SourceLocation KindKwLoc;
1496
1497
  /// Set kind of the clause.
1498
  ///
1499
  /// \param K Kind of clause.
1500
14
  void setAtomicDefaultMemOrderKind(OpenMPAtomicDefaultMemOrderClauseKind K) {
1501
14
    Kind = K;
1502
14
  }
1503
1504
  /// Set clause kind location.
1505
  ///
1506
  /// \param KLoc Kind location.
1507
14
  void setAtomicDefaultMemOrderKindKwLoc(SourceLocation KLoc) {
1508
14
    KindKwLoc = KLoc;
1509
14
  }
1510
1511
public:
1512
  /// Build 'atomic_default_mem_order' clause with argument \a A ('seq_cst',
1513
  /// 'acq_rel' or 'relaxed').
1514
  ///
1515
  /// \param A Argument of the clause ('seq_cst', 'acq_rel' or 'relaxed').
1516
  /// \param ALoc Starting location of the argument.
1517
  /// \param StartLoc Starting location of the clause.
1518
  /// \param LParenLoc Location of '('.
1519
  /// \param EndLoc Ending location of the clause.
1520
  OMPAtomicDefaultMemOrderClause(OpenMPAtomicDefaultMemOrderClauseKind A,
1521
                                 SourceLocation ALoc, SourceLocation StartLoc,
1522
                                 SourceLocation LParenLoc,
1523
                                 SourceLocation EndLoc)
1524
      : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, StartLoc, EndLoc),
1525
46
        LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
1526
1527
  /// Build an empty clause.
1528
  OMPAtomicDefaultMemOrderClause()
1529
      : OMPClause(llvm::omp::OMPC_atomic_default_mem_order, SourceLocation(),
1530
14
                  SourceLocation()) {}
1531
1532
  /// Sets the location of '('.
1533
14
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1534
1535
  /// Returns the locaiton of '('.
1536
14
  SourceLocation getLParenLoc() const { return LParenLoc; }
1537
1538
  /// Returns kind of the clause.
1539
42
  OpenMPAtomicDefaultMemOrderClauseKind getAtomicDefaultMemOrderKind() const {
1540
42
    return Kind;
1541
42
  }
1542
1543
  /// Returns location of clause kind.
1544
14
  SourceLocation getAtomicDefaultMemOrderKindKwLoc() const { return KindKwLoc; }
1545
1546
0
  child_range children() {
1547
0
    return child_range(child_iterator(), child_iterator());
1548
0
  }
1549
1550
0
  const_child_range children() const {
1551
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1552
0
  }
1553
1554
0
  child_range used_children() {
1555
0
    return child_range(child_iterator(), child_iterator());
1556
0
  }
1557
0
  const_child_range used_children() const {
1558
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1559
0
  }
1560
1561
19
  static bool classof(const OMPClause *T) {
1562
19
    return T->getClauseKind() == llvm::omp::OMPC_atomic_default_mem_order;
1563
19
  }
1564
};
1565
1566
/// This represents 'schedule' clause in the '#pragma omp ...' directive.
1567
///
1568
/// \code
1569
/// #pragma omp for schedule(static, 3)
1570
/// \endcode
1571
/// In this example directive '#pragma omp for' has 'schedule' clause with
1572
/// arguments 'static' and '3'.
1573
class OMPScheduleClause : public OMPClause, public OMPClauseWithPreInit {
1574
  friend class OMPClauseReader;
1575
1576
  /// Location of '('.
1577
  SourceLocation LParenLoc;
1578
1579
  /// A kind of the 'schedule' clause.
1580
  OpenMPScheduleClauseKind Kind = OMPC_SCHEDULE_unknown;
1581
1582
  /// Modifiers for 'schedule' clause.
1583
  enum {FIRST, SECOND, NUM_MODIFIERS};
1584
  OpenMPScheduleClauseModifier Modifiers[NUM_MODIFIERS];
1585
1586
  /// Locations of modifiers.
1587
  SourceLocation ModifiersLoc[NUM_MODIFIERS];
1588
1589
  /// Start location of the schedule ind in source code.
1590
  SourceLocation KindLoc;
1591
1592
  /// Location of ',' (if any).
1593
  SourceLocation CommaLoc;
1594
1595
  /// Chunk size.
1596
  Expr *ChunkSize = nullptr;
1597
1598
  /// Set schedule kind.
1599
  ///
1600
  /// \param K Schedule kind.
1601
596
  void setScheduleKind(OpenMPScheduleClauseKind K) { Kind = K; }
1602
1603
  /// Set the first schedule modifier.
1604
  ///
1605
  /// \param M Schedule modifier.
1606
596
  void setFirstScheduleModifier(OpenMPScheduleClauseModifier M) {
1607
596
    Modifiers[FIRST] = M;
1608
596
  }
1609
1610
  /// Set the second schedule modifier.
1611
  ///
1612
  /// \param M Schedule modifier.
1613
596
  void setSecondScheduleModifier(OpenMPScheduleClauseModifier M) {
1614
596
    Modifiers[SECOND] = M;
1615
596
  }
1616
1617
  /// Set location of the first schedule modifier.
1618
596
  void setFirstScheduleModifierLoc(SourceLocation Loc) {
1619
596
    ModifiersLoc[FIRST] = Loc;
1620
596
  }
1621
1622
  /// Set location of the second schedule modifier.
1623
596
  void setSecondScheduleModifierLoc(SourceLocation Loc) {
1624
596
    ModifiersLoc[SECOND] = Loc;
1625
596
  }
1626
1627
  /// Set schedule modifier location.
1628
  ///
1629
  /// \param M Schedule modifier location.
1630
0
  void setScheduleModifer(OpenMPScheduleClauseModifier M) {
1631
0
    if (Modifiers[FIRST] == OMPC_SCHEDULE_MODIFIER_unknown)
1632
0
      Modifiers[FIRST] = M;
1633
0
    else {
1634
0
      assert(Modifiers[SECOND] == OMPC_SCHEDULE_MODIFIER_unknown);
1635
0
      Modifiers[SECOND] = M;
1636
0
    }
1637
0
  }
1638
1639
  /// Sets the location of '('.
1640
  ///
1641
  /// \param Loc Location of '('.
1642
596
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1643
1644
  /// Set schedule kind start location.
1645
  ///
1646
  /// \param KLoc Schedule kind location.
1647
596
  void setScheduleKindLoc(SourceLocation KLoc) { KindLoc = KLoc; }
1648
1649
  /// Set location of ','.
1650
  ///
1651
  /// \param Loc Location of ','.
1652
596
  void setCommaLoc(SourceLocation Loc) { CommaLoc = Loc; }
1653
1654
  /// Set chunk size.
1655
  ///
1656
  /// \param E Chunk size.
1657
596
  void setChunkSize(Expr *E) { ChunkSize = E; }
1658
1659
public:
1660
  /// Build 'schedule' clause with schedule kind \a Kind and chunk size
1661
  /// expression \a ChunkSize.
1662
  ///
1663
  /// \param StartLoc Starting location of the clause.
1664
  /// \param LParenLoc Location of '('.
1665
  /// \param KLoc Starting location of the argument.
1666
  /// \param CommaLoc Location of ','.
1667
  /// \param EndLoc Ending location of the clause.
1668
  /// \param Kind Schedule kind.
1669
  /// \param ChunkSize Chunk size.
1670
  /// \param HelperChunkSize Helper chunk size for combined directives.
1671
  /// \param M1 The first modifier applied to 'schedule' clause.
1672
  /// \param M1Loc Location of the first modifier
1673
  /// \param M2 The second modifier applied to 'schedule' clause.
1674
  /// \param M2Loc Location of the second modifier
1675
  OMPScheduleClause(SourceLocation StartLoc, SourceLocation LParenLoc,
1676
                    SourceLocation KLoc, SourceLocation CommaLoc,
1677
                    SourceLocation EndLoc, OpenMPScheduleClauseKind Kind,
1678
                    Expr *ChunkSize, Stmt *HelperChunkSize,
1679
                    OpenMPScheduleClauseModifier M1, SourceLocation M1Loc,
1680
                    OpenMPScheduleClauseModifier M2, SourceLocation M2Loc)
1681
      : OMPClause(llvm::omp::OMPC_schedule, StartLoc, EndLoc),
1682
        OMPClauseWithPreInit(this), LParenLoc(LParenLoc), Kind(Kind),
1683
3.68k
        KindLoc(KLoc), CommaLoc(CommaLoc), ChunkSize(ChunkSize) {
1684
3.68k
    setPreInitStmt(HelperChunkSize);
1685
3.68k
    Modifiers[FIRST] = M1;
1686
3.68k
    Modifiers[SECOND] = M2;
1687
3.68k
    ModifiersLoc[FIRST] = M1Loc;
1688
3.68k
    ModifiersLoc[SECOND] = M2Loc;
1689
3.68k
  }
1690
1691
  /// Build an empty clause.
1692
  explicit OMPScheduleClause()
1693
      : OMPClause(llvm::omp::OMPC_schedule, SourceLocation(), SourceLocation()),
1694
596
        OMPClauseWithPreInit(this) {
1695
596
    Modifiers[FIRST] = OMPC_SCHEDULE_MODIFIER_unknown;
1696
596
    Modifiers[SECOND] = OMPC_SCHEDULE_MODIFIER_unknown;
1697
596
  }
1698
1699
  /// Get kind of the clause.
1700
3.70k
  OpenMPScheduleClauseKind getScheduleKind() const { return Kind; }
1701
1702
  /// Get the first modifier of the clause.
1703
7.29k
  OpenMPScheduleClauseModifier getFirstScheduleModifier() const {
1704
7.29k
    return Modifiers[FIRST];
1705
7.29k
  }
1706
1707
  /// Get the second modifier of the clause.
1708
6.75k
  OpenMPScheduleClauseModifier getSecondScheduleModifier() const {
1709
6.75k
    return Modifiers[SECOND];
1710
6.75k
  }
1711
1712
  /// Get location of '('.
1713
1.86k
  SourceLocation getLParenLoc() { return LParenLoc; }
1714
1715
  /// Get kind location.
1716
1.86k
  SourceLocation getScheduleKindLoc() { return KindLoc; }
1717
1718
  /// Get the first modifier location.
1719
1.87k
  SourceLocation getFirstScheduleModifierLoc() const {
1720
1.87k
    return ModifiersLoc[FIRST];
1721
1.87k
  }
1722
1723
  /// Get the second modifier location.
1724
1.86k
  SourceLocation getSecondScheduleModifierLoc() const {
1725
1.86k
    return ModifiersLoc[SECOND];
1726
1.86k
  }
1727
1728
  /// Get location of ','.
1729
1.86k
  SourceLocation getCommaLoc() { return CommaLoc; }
1730
1731
  /// Get chunk size.
1732
2.28k
  Expr *getChunkSize() { return ChunkSize; }
1733
1734
  /// Get chunk size.
1735
1.56k
  const Expr *getChunkSize() const { return ChunkSize; }
1736
1737
1.24k
  child_range children() {
1738
1.24k
    return child_range(reinterpret_cast<Stmt **>(&ChunkSize),
1739
1.24k
                       reinterpret_cast<Stmt **>(&ChunkSize) + 1);
1740
1.24k
  }
1741
1742
0
  const_child_range children() const {
1743
0
    auto Children = const_cast<OMPScheduleClause *>(this)->children();
1744
0
    return const_child_range(Children.begin(), Children.end());
1745
0
  }
1746
1747
2.24k
  child_range used_children() {
1748
2.24k
    return child_range(child_iterator(), child_iterator());
1749
2.24k
  }
1750
0
  const_child_range used_children() const {
1751
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1752
0
  }
1753
1754
6.88k
  static bool classof(const OMPClause *T) {
1755
6.88k
    return T->getClauseKind() == llvm::omp::OMPC_schedule;
1756
6.88k
  }
1757
};
1758
1759
/// This represents 'ordered' clause in the '#pragma omp ...' directive.
1760
///
1761
/// \code
1762
/// #pragma omp for ordered (2)
1763
/// \endcode
1764
/// In this example directive '#pragma omp for' has 'ordered' clause with
1765
/// parameter 2.
1766
class OMPOrderedClause final
1767
    : public OMPClause,
1768
      private llvm::TrailingObjects<OMPOrderedClause, Expr *> {
1769
  friend class OMPClauseReader;
1770
  friend TrailingObjects;
1771
1772
  /// Location of '('.
1773
  SourceLocation LParenLoc;
1774
1775
  /// Number of for-loops.
1776
  Stmt *NumForLoops = nullptr;
1777
1778
  /// Real number of loops.
1779
  unsigned NumberOfLoops = 0;
1780
1781
  /// Build 'ordered' clause.
1782
  ///
1783
  /// \param Num Expression, possibly associated with this clause.
1784
  /// \param NumLoops Number of loops, associated with this clause.
1785
  /// \param StartLoc Starting location of the clause.
1786
  /// \param LParenLoc Location of '('.
1787
  /// \param EndLoc Ending location of the clause.
1788
  OMPOrderedClause(Expr *Num, unsigned NumLoops, SourceLocation StartLoc,
1789
                   SourceLocation LParenLoc, SourceLocation EndLoc)
1790
      : OMPClause(llvm::omp::OMPC_ordered, StartLoc, EndLoc),
1791
1.18k
        LParenLoc(LParenLoc), NumForLoops(Num), NumberOfLoops(NumLoops) {}
1792
1793
  /// Build an empty clause.
1794
  explicit OMPOrderedClause(unsigned NumLoops)
1795
      : OMPClause(llvm::omp::OMPC_ordered, SourceLocation(), SourceLocation()),
1796
89
        NumberOfLoops(NumLoops) {}
1797
1798
  /// Set the number of associated for-loops.
1799
89
  void setNumForLoops(Expr *Num) { NumForLoops = Num; }
1800
1801
public:
1802
  /// Build 'ordered' clause.
1803
  ///
1804
  /// \param Num Expression, possibly associated with this clause.
1805
  /// \param NumLoops Number of loops, associated with this clause.
1806
  /// \param StartLoc Starting location of the clause.
1807
  /// \param LParenLoc Location of '('.
1808
  /// \param EndLoc Ending location of the clause.
1809
  static OMPOrderedClause *Create(const ASTContext &C, Expr *Num,
1810
                                  unsigned NumLoops, SourceLocation StartLoc,
1811
                                  SourceLocation LParenLoc,
1812
                                  SourceLocation EndLoc);
1813
1814
  /// Build an empty clause.
1815
  static OMPOrderedClause* CreateEmpty(const ASTContext &C, unsigned NumLoops);
1816
1817
  /// Sets the location of '('.
1818
89
  void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
1819
1820
  /// Returns the location of '('.
1821
589
  SourceLocation getLParenLoc() const { return LParenLoc; }
1822
1823
  /// Return the number of associated for-loops.
1824
3.21k
  Expr *getNumForLoops() const { return cast_or_null<Expr>(NumForLoops); }
1825
1826
  /// Set number of iterations for the specified loop.
1827
  void setLoopNumIterations(unsigned NumLoop, Expr *NumIterations);
1828
  /// Get number of iterations for all the loops.
1829
  ArrayRef<Expr *> getLoopNumIterations() const;
1830
1831
  /// Set loop counter for the specified loop.
1832
  void setLoopCounter(unsigned NumLoop, Expr *Counter);
1833
  /// Get loops counter for the specified loop.
1834
  Expr *getLoopCounter(unsigned NumLoop);
1835
  const Expr *getLoopCounter(unsigned NumLoop) const;
1836
1837
60
  child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); }
1838
1839
0
  const_child_range children() const {
1840
0
    return const_child_range(&NumForLoops, &NumForLoops + 1);
1841
0
  }
1842
1843
204
  child_range used_children() {
1844
204
    return child_range(child_iterator(), child_iterator());
1845
204
  }
1846
0
  const_child_range used_children() const {
1847
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1848
0
  }
1849
1850
80.1k
  static bool classof(const OMPClause *T) {
1851
80.1k
    return T->getClauseKind() == llvm::omp::OMPC_ordered;
1852
80.1k
  }
1853
};
1854
1855
/// This represents 'nowait' clause in the '#pragma omp ...' directive.
1856
///
1857
/// \code
1858
/// #pragma omp for nowait
1859
/// \endcode
1860
/// In this example directive '#pragma omp for' has 'nowait' clause.
1861
class OMPNowaitClause : public OMPClause {
1862
public:
1863
  /// Build 'nowait' clause.
1864
  ///
1865
  /// \param StartLoc Starting location of the clause.
1866
  /// \param EndLoc Ending location of the clause.
1867
  OMPNowaitClause(SourceLocation StartLoc, SourceLocation EndLoc)
1868
1.54k
      : OMPClause(llvm::omp::OMPC_nowait, StartLoc, EndLoc) {}
1869
1870
  /// Build an empty clause.
1871
  OMPNowaitClause()
1872
599
      : OMPClause(llvm::omp::OMPC_nowait, SourceLocation(), SourceLocation()) {}
1873
1874
64
  child_range children() {
1875
64
    return child_range(child_iterator(), child_iterator());
1876
64
  }
1877
1878
0
  const_child_range children() const {
1879
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1880
0
  }
1881
1882
3.41k
  child_range used_children() {
1883
3.41k
    return child_range(child_iterator(), child_iterator());
1884
3.41k
  }
1885
0
  const_child_range used_children() const {
1886
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1887
0
  }
1888
1889
29.5k
  static bool classof(const OMPClause *T) {
1890
29.5k
    return T->getClauseKind() == llvm::omp::OMPC_nowait;
1891
29.5k
  }
1892
};
1893
1894
/// This represents 'untied' clause in the '#pragma omp ...' directive.
1895
///
1896
/// \code
1897
/// #pragma omp task untied
1898
/// \endcode
1899
/// In this example directive '#pragma omp task' has 'untied' clause.
1900
class OMPUntiedClause : public OMPClause {
1901
public:
1902
  /// Build 'untied' clause.
1903
  ///
1904
  /// \param StartLoc Starting location of the clause.
1905
  /// \param EndLoc Ending location of the clause.
1906
  OMPUntiedClause(SourceLocation StartLoc, SourceLocation EndLoc)
1907
122
      : OMPClause(llvm::omp::OMPC_untied, StartLoc, EndLoc) {}
1908
1909
  /// Build an empty clause.
1910
  OMPUntiedClause()
1911
46
      : OMPClause(llvm::omp::OMPC_untied, SourceLocation(), SourceLocation()) {}
1912
1913
72
  child_range children() {
1914
72
    return child_range(child_iterator(), child_iterator());
1915
72
  }
1916
1917
0
  const_child_range children() const {
1918
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1919
0
  }
1920
1921
312
  child_range used_children() {
1922
312
    return child_range(child_iterator(), child_iterator());
1923
312
  }
1924
0
  const_child_range used_children() const {
1925
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1926
0
  }
1927
1928
314
  static bool classof(const OMPClause *T) {
1929
314
    return T->getClauseKind() == llvm::omp::OMPC_untied;
1930
314
  }
1931
};
1932
1933
/// This represents 'mergeable' clause in the '#pragma omp ...'
1934
/// directive.
1935
///
1936
/// \code
1937
/// #pragma omp task mergeable
1938
/// \endcode
1939
/// In this example directive '#pragma omp task' has 'mergeable' clause.
1940
class OMPMergeableClause : public OMPClause {
1941
public:
1942
  /// Build 'mergeable' clause.
1943
  ///
1944
  /// \param StartLoc Starting location of the clause.
1945
  /// \param EndLoc Ending location of the clause.
1946
  OMPMergeableClause(SourceLocation StartLoc, SourceLocation EndLoc)
1947
128
      : OMPClause(llvm::omp::OMPC_mergeable, StartLoc, EndLoc) {}
1948
1949
  /// Build an empty clause.
1950
  OMPMergeableClause()
1951
      : OMPClause(llvm::omp::OMPC_mergeable, SourceLocation(),
1952
40
                  SourceLocation()) {}
1953
1954
122
  child_range children() {
1955
122
    return child_range(child_iterator(), child_iterator());
1956
122
  }
1957
1958
0
  const_child_range children() const {
1959
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1960
0
  }
1961
1962
328
  child_range used_children() {
1963
328
    return child_range(child_iterator(), child_iterator());
1964
328
  }
1965
0
  const_child_range used_children() const {
1966
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1967
0
  }
1968
1969
0
  static bool classof(const OMPClause *T) {
1970
0
    return T->getClauseKind() == llvm::omp::OMPC_mergeable;
1971
0
  }
1972
};
1973
1974
/// This represents 'read' clause in the '#pragma omp atomic' directive.
1975
///
1976
/// \code
1977
/// #pragma omp atomic read
1978
/// \endcode
1979
/// In this example directive '#pragma omp atomic' has 'read' clause.
1980
class OMPReadClause : public OMPClause {
1981
public:
1982
  /// Build 'read' clause.
1983
  ///
1984
  /// \param StartLoc Starting location of the clause.
1985
  /// \param EndLoc Ending location of the clause.
1986
  OMPReadClause(SourceLocation StartLoc, SourceLocation EndLoc)
1987
531
      : OMPClause(llvm::omp::OMPC_read, StartLoc, EndLoc) {}
1988
1989
  /// Build an empty clause.
1990
  OMPReadClause()
1991
156
      : OMPClause(llvm::omp::OMPC_read, SourceLocation(), SourceLocation()) {}
1992
1993
16
  child_range children() {
1994
16
    return child_range(child_iterator(), child_iterator());
1995
16
  }
1996
1997
0
  const_child_range children() const {
1998
0
    return const_child_range(const_child_iterator(), const_child_iterator());
1999
0
  }
2000
2001
164
  child_range used_children() {
2002
164
    return child_range(child_iterator(), child_iterator());
2003
164
  }
2004
0
  const_child_range used_children() const {
2005
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2006
0
  }
2007
2008
0
  static bool classof(const OMPClause *T) {
2009
0
    return T->getClauseKind() == llvm::omp::OMPC_read;
2010
0
  }
2011
};
2012
2013
/// This represents 'write' clause in the '#pragma omp atomic' directive.
2014
///
2015
/// \code
2016
/// #pragma omp atomic write
2017
/// \endcode
2018
/// In this example directive '#pragma omp atomic' has 'write' clause.
2019
class OMPWriteClause : public OMPClause {
2020
public:
2021
  /// Build 'write' clause.
2022
  ///
2023
  /// \param StartLoc Starting location of the clause.
2024
  /// \param EndLoc Ending location of the clause.
2025
  OMPWriteClause(SourceLocation StartLoc, SourceLocation EndLoc)
2026
522
      : OMPClause(llvm::omp::OMPC_write, StartLoc, EndLoc) {}
2027
2028
  /// Build an empty clause.
2029
  OMPWriteClause()
2030
158
      : OMPClause(llvm::omp::OMPC_write, SourceLocation(), SourceLocation()) {}
2031
2032
16
  child_range children() {
2033
16
    return child_range(child_iterator(), child_iterator());
2034
16
  }
2035
2036
0
  const_child_range children() const {
2037
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2038
0
  }
2039
2040
112
  child_range used_children() {
2041
112
    return child_range(child_iterator(), child_iterator());
2042
112
  }
2043
0
  const_child_range used_children() const {
2044
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2045
0
  }
2046
2047
0
  static bool classof(const OMPClause *T) {
2048
0
    return T->getClauseKind() == llvm::omp::OMPC_write;
2049
0
  }
2050
};
2051
2052
/// This represents 'update' clause in the '#pragma omp atomic'
2053
/// directive.
2054
///
2055
/// \code
2056
/// #pragma omp atomic update
2057
/// \endcode
2058
/// In this example directive '#pragma omp atomic' has 'update' clause.
2059
/// Also, this class represents 'update' clause in  '#pragma omp depobj'
2060
/// directive.
2061
///
2062
/// \code
2063
/// #pragma omp depobj(a) update(in)
2064
/// \endcode
2065
/// In this example directive '#pragma omp depobj' has 'update' clause with 'in'
2066
/// dependence kind.
2067
class OMPUpdateClause final
2068
    : public OMPClause,
2069
      private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
2070
                                    OpenMPDependClauseKind> {
2071
  friend class OMPClauseReader;
2072
  friend TrailingObjects;
2073
2074
  /// true if extended version of the clause for 'depobj' directive.
2075
  bool IsExtended = false;
2076
2077
  /// Define the sizes of each trailing object array except the last one. This
2078
  /// is required for TrailingObjects to work properly.
2079
72
  size_t numTrailingObjects(OverloadToken<SourceLocation>) const {
2080
    // 2 locations: for '(' and argument location.
2081
72
    return IsExtended ? 2 : 
00
;
2082
72
  }
2083
2084
  /// Sets the location of '(' in clause for 'depobj' directive.
2085
48
  void setLParenLoc(SourceLocation Loc) {
2086
48
    assert(IsExtended && "Expected extended clause.");
2087
0
    *getTrailingObjects<SourceLocation>() = Loc;
2088
48
  }
2089
2090
  /// Sets the location of '(' in clause for 'depobj' directive.
2091
48
  void setArgumentLoc(SourceLocation Loc) {
2092
48
    assert(IsExtended && "Expected extended clause.");
2093
0
    *std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
2094
48
  }
2095
2096
  /// Sets the dependence kind for the clause for 'depobj' directive.
2097
48
  void setDependencyKind(OpenMPDependClauseKind DK) {
2098
48
    assert(IsExtended && "Expected extended clause.");
2099
0
    *getTrailingObjects<OpenMPDependClauseKind>() = DK;
2100
48
  }
2101
2102
  /// Build 'update' clause.
2103
  ///
2104
  /// \param StartLoc Starting location of the clause.
2105
  /// \param EndLoc Ending location of the clause.
2106
  OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
2107
                  bool IsExtended)
2108
      : OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
2109
649
        IsExtended(IsExtended) {}
2110
2111
  /// Build an empty clause.
2112
  OMPUpdateClause(bool IsExtended)
2113
      : OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
2114
116
        IsExtended(IsExtended) {}
2115
2116
public:
2117
  /// Creates clause for 'atomic' directive.
2118
  ///
2119
  /// \param C AST context.
2120
  /// \param StartLoc Starting location of the clause.
2121
  /// \param EndLoc Ending location of the clause.
2122
  static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2123
                                 SourceLocation EndLoc);
2124
2125
  /// Creates clause for 'depobj' directive.
2126
  ///
2127
  /// \param C AST context.
2128
  /// \param StartLoc Starting location of the clause.
2129
  /// \param LParenLoc Location of '('.
2130
  /// \param ArgumentLoc Location of the argument.
2131
  /// \param DK Dependence kind.
2132
  /// \param EndLoc Ending location of the clause.
2133
  static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2134
                                 SourceLocation LParenLoc,
2135
                                 SourceLocation ArgumentLoc,
2136
                                 OpenMPDependClauseKind DK,
2137
                                 SourceLocation EndLoc);
2138
2139
  /// Creates an empty clause with the place for \a N variables.
2140
  ///
2141
  /// \param C AST context.
2142
  /// \param IsExtended true if extended clause for 'depobj' directive must be
2143
  /// created.
2144
  static OMPUpdateClause *CreateEmpty(const ASTContext &C, bool IsExtended);
2145
2146
  /// Checks if the clause is the extended clauses for 'depobj' directive.
2147
528
  bool isExtended() const { return IsExtended; }
2148
2149
8
  child_range children() {
2150
8
    return child_range(child_iterator(), child_iterator());
2151
8
  }
2152
2153
0
  const_child_range children() const {
2154
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2155
0
  }
2156
2157
128
  child_range used_children() {
2158
128
    return child_range(child_iterator(), child_iterator());
2159
128
  }
2160
0
  const_child_range used_children() const {
2161
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2162
0
  }
2163
2164
  /// Gets the location of '(' in clause for 'depobj' directive.
2165
8
  SourceLocation getLParenLoc() const {
2166
8
    assert(IsExtended && "Expected extended clause.");
2167
0
    return *getTrailingObjects<SourceLocation>();
2168
8
  }
2169
2170
  /// Gets the location of argument in clause for 'depobj' directive.
2171
8
  SourceLocation getArgumentLoc() const {
2172
8
    assert(IsExtended && "Expected extended clause.");
2173
0
    return *std::next(getTrailingObjects<SourceLocation>(), 1);
2174
8
  }
2175
2176
  /// Gets the dependence kind in clause for 'depobj' directive.
2177
24
  OpenMPDependClauseKind getDependencyKind() const {
2178
24
    assert(IsExtended && "Expected extended clause.");
2179
0
    return *getTrailingObjects<OpenMPDependClauseKind>();
2180
24
  }
2181
2182
8
  static bool classof(const OMPClause *T) {
2183
8
    return T->getClauseKind() == llvm::omp::OMPC_update;
2184
8
  }
2185
};
2186
2187
/// This represents 'capture' clause in the '#pragma omp atomic'
2188
/// directive.
2189
///
2190
/// \code
2191
/// #pragma omp atomic capture
2192
/// \endcode
2193
/// In this example directive '#pragma omp atomic' has 'capture' clause.
2194
class OMPCaptureClause : public OMPClause {
2195
public:
2196
  /// Build 'capture' clause.
2197
  ///
2198
  /// \param StartLoc Starting location of the clause.
2199
  /// \param EndLoc Ending location of the clause.
2200
  OMPCaptureClause(SourceLocation StartLoc, SourceLocation EndLoc)
2201
2.13k
      : OMPClause(llvm::omp::OMPC_capture, StartLoc, EndLoc) {}
2202
2203
  /// Build an empty clause.
2204
  OMPCaptureClause()
2205
394
      : OMPClause(llvm::omp::OMPC_capture, SourceLocation(), SourceLocation()) {
2206
394
  }
2207
2208
16
  child_range children() {
2209
16
    return child_range(child_iterator(), child_iterator());
2210
16
  }
2211
2212
0
  const_child_range children() const {
2213
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2214
0
  }
2215
2216
1.16k
  child_range used_children() {
2217
1.16k
    return child_range(child_iterator(), child_iterator());
2218
1.16k
  }
2219
0
  const_child_range used_children() const {
2220
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2221
0
  }
2222
2223
0
  static bool classof(const OMPClause *T) {
2224
0
    return T->getClauseKind() == llvm::omp::OMPC_capture;
2225
0
  }
2226
};
2227
2228
/// This represents 'compare' clause in the '#pragma omp atomic'
2229
/// directive.
2230
///
2231
/// \code
2232
/// #pragma omp atomic compare
2233
/// \endcode
2234
/// In this example directive '#pragma omp atomic' has 'compare' clause.
2235
class OMPCompareClause final : public OMPClause {
2236
public:
2237
  /// Build 'compare' clause.
2238
  ///
2239
  /// \param StartLoc Starting location of the clause.
2240
  /// \param EndLoc Ending location of the clause.
2241
  OMPCompareClause(SourceLocation StartLoc, SourceLocation EndLoc)
2242
3.32k
      : OMPClause(llvm::omp::OMPC_compare, StartLoc, EndLoc) {}
2243
2244
  /// Build an empty clause.
2245
  OMPCompareClause()
2246
1.60k
      : OMPClause(llvm::omp::OMPC_compare, SourceLocation(), SourceLocation()) {
2247
1.60k
  }
2248
2249
0
  child_range children() {
2250
0
    return child_range(child_iterator(), child_iterator());
2251
0
  }
2252
2253
0
  const_child_range children() const {
2254
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2255
0
  }
2256
2257
336
  child_range used_children() {
2258
336
    return child_range(child_iterator(), child_iterator());
2259
336
  }
2260
0
  const_child_range used_children() const {
2261
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2262
0
  }
2263
2264
0
  static bool classof(const OMPClause *T) {
2265
0
    return T->getClauseKind() == llvm::omp::OMPC_compare;
2266
0
  }
2267
};
2268
2269
/// This represents 'seq_cst' clause in the '#pragma omp atomic'
2270
/// directive.
2271
///
2272
/// \code
2273
/// #pragma omp atomic seq_cst
2274
/// \endcode
2275
/// In this example directive '#pragma omp atomic' has 'seq_cst' clause.
2276
class OMPSeqCstClause : public OMPClause {
2277
public:
2278
  /// Build 'seq_cst' clause.
2279
  ///
2280
  /// \param StartLoc Starting location of the clause.
2281
  /// \param EndLoc Ending location of the clause.
2282
  OMPSeqCstClause(SourceLocation StartLoc, SourceLocation EndLoc)
2283
800
      : OMPClause(llvm::omp::OMPC_seq_cst, StartLoc, EndLoc) {}
2284
2285
  /// Build an empty clause.
2286
  OMPSeqCstClause()
2287
352
      : OMPClause(llvm::omp::OMPC_seq_cst, SourceLocation(), SourceLocation()) {
2288
352
  }
2289
2290
0
  child_range children() {
2291
0
    return child_range(child_iterator(), child_iterator());
2292
0
  }
2293
2294
0
  const_child_range children() const {
2295
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2296
0
  }
2297
2298
208
  child_range used_children() {
2299
208
    return child_range(child_iterator(), child_iterator());
2300
208
  }
2301
0
  const_child_range used_children() const {
2302
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2303
0
  }
2304
2305
3.20k
  static bool classof(const OMPClause *T) {
2306
3.20k
    return T->getClauseKind() == llvm::omp::OMPC_seq_cst;
2307
3.20k
  }
2308
};
2309
2310
/// This represents 'acq_rel' clause in the '#pragma omp atomic|flush'
2311
/// directives.
2312
///
2313
/// \code
2314
/// #pragma omp flush acq_rel
2315
/// \endcode
2316
/// In this example directive '#pragma omp flush' has 'acq_rel' clause.
2317
class OMPAcqRelClause final : public OMPClause {
2318
public:
2319
  /// Build 'ack_rel' clause.
2320
  ///
2321
  /// \param StartLoc Starting location of the clause.
2322
  /// \param EndLoc Ending location of the clause.
2323
  OMPAcqRelClause(SourceLocation StartLoc, SourceLocation EndLoc)
2324
620
      : OMPClause(llvm::omp::OMPC_acq_rel, StartLoc, EndLoc) {}
2325
2326
  /// Build an empty clause.
2327
  OMPAcqRelClause()
2328
294
      : OMPClause(llvm::omp::OMPC_acq_rel, SourceLocation(), SourceLocation()) {
2329
294
  }
2330
2331
0
  child_range children() {
2332
0
    return child_range(child_iterator(), child_iterator());
2333
0
  }
2334
2335
0
  const_child_range children() const {
2336
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2337
0
  }
2338
2339
124
  child_range used_children() {
2340
124
    return child_range(child_iterator(), child_iterator());
2341
124
  }
2342
0
  const_child_range used_children() const {
2343
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2344
0
  }
2345
2346
2.64k
  static bool classof(const OMPClause *T) {
2347
2.64k
    return T->getClauseKind() == llvm::omp::OMPC_acq_rel;
2348
2.64k
  }
2349
};
2350
2351
/// This represents 'acquire' clause in the '#pragma omp atomic|flush'
2352
/// directives.
2353
///
2354
/// \code
2355
/// #pragma omp flush acquire
2356
/// \endcode
2357
/// In this example directive '#pragma omp flush' has 'acquire' clause.
2358
class OMPAcquireClause final : public OMPClause {
2359
public:
2360
  /// Build 'acquire' clause.
2361
  ///
2362
  /// \param StartLoc Starting location of the clause.
2363
  /// \param EndLoc Ending location of the clause.
2364
  OMPAcquireClause(SourceLocation StartLoc, SourceLocation EndLoc)
2365
638
      : OMPClause(llvm::omp::OMPC_acquire, StartLoc, EndLoc) {}
2366
2367
  /// Build an empty clause.
2368
  OMPAcquireClause()
2369
304
      : OMPClause(llvm::omp::OMPC_acquire, SourceLocation(), SourceLocation()) {
2370
304
  }
2371
2372
0
  child_range children() {
2373
0
    return child_range(child_iterator(), child_iterator());
2374
0
  }
2375
2376
0
  const_child_range children() const {
2377
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2378
0
  }
2379
2380
140
  child_range used_children() {
2381
140
    return child_range(child_iterator(), child_iterator());
2382
140
  }
2383
0
  const_child_range used_children() const {
2384
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2385
0
  }
2386
2387
2.16k
  static bool classof(const OMPClause *T) {
2388
2.16k
    return T->getClauseKind() == llvm::omp::OMPC_acquire;
2389
2.16k
  }
2390
};
2391
2392
/// This represents 'release' clause in the '#pragma omp atomic|flush'
2393
/// directives.
2394
///
2395
/// \code
2396
/// #pragma omp flush release
2397
/// \endcode
2398
/// In this example directive '#pragma omp flush' has 'release' clause.
2399
class OMPReleaseClause final : public OMPClause {
2400
public:
2401
  /// Build 'release' clause.
2402
  ///
2403
  /// \param StartLoc Starting location of the clause.
2404
  /// \param EndLoc Ending location of the clause.
2405
  OMPReleaseClause(SourceLocation StartLoc, SourceLocation EndLoc)
2406
672
      : OMPClause(llvm::omp::OMPC_release, StartLoc, EndLoc) {}
2407
2408
  /// Build an empty clause.
2409
  OMPReleaseClause()
2410
322
      : OMPClause(llvm::omp::OMPC_release, SourceLocation(), SourceLocation()) {
2411
322
  }
2412
2413
0
  child_range children() {
2414
0
    return child_range(child_iterator(), child_iterator());
2415
0
  }
2416
2417
0
  const_child_range children() const {
2418
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2419
0
  }
2420
2421
172
  child_range used_children() {
2422
172
    return child_range(child_iterator(), child_iterator());
2423
172
  }
2424
0
  const_child_range used_children() const {
2425
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2426
0
  }
2427
2428
1.66k
  static bool classof(const OMPClause *T) {
2429
1.66k
    return T->getClauseKind() == llvm::omp::OMPC_release;
2430
1.66k
  }
2431
};
2432
2433
/// This represents 'relaxed' clause in the '#pragma omp atomic'
2434
/// directives.
2435
///
2436
/// \code
2437
/// #pragma omp atomic relaxed
2438
/// \endcode
2439
/// In this example directive '#pragma omp atomic' has 'relaxed' clause.
2440
class OMPRelaxedClause final : public OMPClause {
2441
public:
2442
  /// Build 'relaxed' clause.
2443
  ///
2444
  /// \param StartLoc Starting location of the clause.
2445
  /// \param EndLoc Ending location of the clause.
2446
  OMPRelaxedClause(SourceLocation StartLoc, SourceLocation EndLoc)
2447
676
      : OMPClause(llvm::omp::OMPC_relaxed, StartLoc, EndLoc) {}
2448
2449
  /// Build an empty clause.
2450
  OMPRelaxedClause()
2451
326
      : OMPClause(llvm::omp::OMPC_relaxed, SourceLocation(), SourceLocation()) {
2452
326
  }
2453
2454
0
  child_range children() {
2455
0
    return child_range(child_iterator(), child_iterator());
2456
0
  }
2457
2458
0
  const_child_range children() const {
2459
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2460
0
  }
2461
2462
160
  child_range used_children() {
2463
160
    return child_range(child_iterator(), child_iterator());
2464
160
  }
2465
0
  const_child_range used_children() const {
2466
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2467
0
  }
2468
2469
1.17k
  static bool classof(const OMPClause *T) {
2470
1.17k
    return T->getClauseKind() == llvm::omp::OMPC_relaxed;
2471
1.17k
  }
2472
};
2473
2474
/// This represents clause 'private' in the '#pragma omp ...' directives.
2475
///
2476
/// \code
2477
/// #pragma omp parallel private(a,b)
2478
/// \endcode
2479
/// In this example directive '#pragma omp parallel' has clause 'private'
2480
/// with the variables 'a' and 'b'.
2481
class OMPPrivateClause final
2482
    : public OMPVarListClause<OMPPrivateClause>,
2483
      private llvm::TrailingObjects<OMPPrivateClause, Expr *> {
2484
  friend class OMPClauseReader;
2485
  friend OMPVarListClause;
2486
  friend TrailingObjects;
2487
2488
  /// Build clause with number of variables \a N.
2489
  ///
2490
  /// \param StartLoc Starting location of the clause.
2491
  /// \param LParenLoc Location of '('.
2492
  /// \param EndLoc Ending location of the clause.
2493
  /// \param N Number of the variables in the clause.
2494
  OMPPrivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2495
                   SourceLocation EndLoc, unsigned N)
2496
      : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private, StartLoc,
2497
13.0k
                                           LParenLoc, EndLoc, N) {}
2498
2499
  /// Build an empty clause.
2500
  ///
2501
  /// \param N Number of variables.
2502
  explicit OMPPrivateClause(unsigned N)
2503
      : OMPVarListClause<OMPPrivateClause>(llvm::omp::OMPC_private,
2504
                                           SourceLocation(), SourceLocation(),
2505
1.41k
                                           SourceLocation(), N) {}
2506
2507
  /// Sets the list of references to private copies with initializers for
2508
  /// new private variables.
2509
  /// \param VL List of references.
2510
  void setPrivateCopies(ArrayRef<Expr *> VL);
2511
2512
  /// Gets the list of references to private copies with initializers for
2513
  /// new private variables.
2514
19.1k
  MutableArrayRef<Expr *> getPrivateCopies() {
2515
19.1k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2516
19.1k
  }
2517
3.72k
  ArrayRef<const Expr *> getPrivateCopies() const {
2518
3.72k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
2519
3.72k
  }
2520
2521
public:
2522
  /// Creates clause with a list of variables \a VL.
2523
  ///
2524
  /// \param C AST context.
2525
  /// \param StartLoc Starting location of the clause.
2526
  /// \param LParenLoc Location of '('.
2527
  /// \param EndLoc Ending location of the clause.
2528
  /// \param VL List of references to the variables.
2529
  /// \param PrivateVL List of references to private copies with initializers.
2530
  static OMPPrivateClause *Create(const ASTContext &C, SourceLocation StartLoc,
2531
                                  SourceLocation LParenLoc,
2532
                                  SourceLocation EndLoc, ArrayRef<Expr *> VL,
2533
                                  ArrayRef<Expr *> PrivateVL);
2534
2535
  /// Creates an empty clause with the place for \a N variables.
2536
  ///
2537
  /// \param C AST context.
2538
  /// \param N The number of variables.
2539
  static OMPPrivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2540
2541
  using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
2542
  using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
2543
  using private_copies_range = llvm::iterator_range<private_copies_iterator>;
2544
  using private_copies_const_range =
2545
      llvm::iterator_range<private_copies_const_iterator>;
2546
2547
9.58k
  private_copies_range private_copies() {
2548
9.58k
    return private_copies_range(getPrivateCopies().begin(),
2549
9.58k
                                getPrivateCopies().end());
2550
9.58k
  }
2551
2552
1.86k
  private_copies_const_range private_copies() const {
2553
1.86k
    return private_copies_const_range(getPrivateCopies().begin(),
2554
1.86k
                                      getPrivateCopies().end());
2555
1.86k
  }
2556
2557
12.9k
  child_range children() {
2558
12.9k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2559
12.9k
                       reinterpret_cast<Stmt **>(varlist_end()));
2560
12.9k
  }
2561
2562
0
  const_child_range children() const {
2563
0
    auto Children = const_cast<OMPPrivateClause *>(this)->children();
2564
0
    return const_child_range(Children.begin(), Children.end());
2565
0
  }
2566
2567
2.30k
  child_range used_children() {
2568
2.30k
    return child_range(child_iterator(), child_iterator());
2569
2.30k
  }
2570
0
  const_child_range used_children() const {
2571
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2572
0
  }
2573
2574
123k
  static bool classof(const OMPClause *T) {
2575
123k
    return T->getClauseKind() == llvm::omp::OMPC_private;
2576
123k
  }
2577
};
2578
2579
/// This represents clause 'firstprivate' in the '#pragma omp ...'
2580
/// directives.
2581
///
2582
/// \code
2583
/// #pragma omp parallel firstprivate(a,b)
2584
/// \endcode
2585
/// In this example directive '#pragma omp parallel' has clause 'firstprivate'
2586
/// with the variables 'a' and 'b'.
2587
class OMPFirstprivateClause final
2588
    : public OMPVarListClause<OMPFirstprivateClause>,
2589
      public OMPClauseWithPreInit,
2590
      private llvm::TrailingObjects<OMPFirstprivateClause, Expr *> {
2591
  friend class OMPClauseReader;
2592
  friend OMPVarListClause;
2593
  friend TrailingObjects;
2594
2595
  /// Build clause with number of variables \a N.
2596
  ///
2597
  /// \param StartLoc Starting location of the clause.
2598
  /// \param LParenLoc Location of '('.
2599
  /// \param EndLoc Ending location of the clause.
2600
  /// \param N Number of the variables in the clause.
2601
  OMPFirstprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2602
                        SourceLocation EndLoc, unsigned N)
2603
      : OMPVarListClause<OMPFirstprivateClause>(llvm::omp::OMPC_firstprivate,
2604
                                                StartLoc, LParenLoc, EndLoc, N),
2605
50.8k
        OMPClauseWithPreInit(this) {}
2606
2607
  /// Build an empty clause.
2608
  ///
2609
  /// \param N Number of variables.
2610
  explicit OMPFirstprivateClause(unsigned N)
2611
      : OMPVarListClause<OMPFirstprivateClause>(
2612
            llvm::omp::OMPC_firstprivate, SourceLocation(), SourceLocation(),
2613
            SourceLocation(), N),
2614
4.27k
        OMPClauseWithPreInit(this) {}
2615
2616
  /// Sets the list of references to private copies with initializers for
2617
  /// new private variables.
2618
  /// \param VL List of references.
2619
  void setPrivateCopies(ArrayRef<Expr *> VL);
2620
2621
  /// Gets the list of references to private copies with initializers for
2622
  /// new private variables.
2623
169k
  MutableArrayRef<Expr *> getPrivateCopies() {
2624
169k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2625
169k
  }
2626
43.2k
  ArrayRef<const Expr *> getPrivateCopies() const {
2627
43.2k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
2628
43.2k
  }
2629
2630
  /// Sets the list of references to initializer variables for new
2631
  /// private variables.
2632
  /// \param VL List of references.
2633
  void setInits(ArrayRef<Expr *> VL);
2634
2635
  /// Gets the list of references to initializer variables for new
2636
  /// private variables.
2637
8.74k
  MutableArrayRef<Expr *> getInits() {
2638
8.74k
    return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
2639
8.74k
  }
2640
21.6k
  ArrayRef<const Expr *> getInits() const {
2641
21.6k
    return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
2642
21.6k
  }
2643
2644
public:
2645
  /// Creates clause with a list of variables \a VL.
2646
  ///
2647
  /// \param C AST context.
2648
  /// \param StartLoc Starting location of the clause.
2649
  /// \param LParenLoc Location of '('.
2650
  /// \param EndLoc Ending location of the clause.
2651
  /// \param VL List of references to the original variables.
2652
  /// \param PrivateVL List of references to private copies with initializers.
2653
  /// \param InitVL List of references to auto generated variables used for
2654
  /// initialization of a single array element. Used if firstprivate variable is
2655
  /// of array type.
2656
  /// \param PreInit Statement that must be executed before entering the OpenMP
2657
  /// region with this clause.
2658
  static OMPFirstprivateClause *
2659
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2660
         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> PrivateVL,
2661
         ArrayRef<Expr *> InitVL, Stmt *PreInit);
2662
2663
  /// Creates an empty clause with the place for \a N variables.
2664
  ///
2665
  /// \param C AST context.
2666
  /// \param N The number of variables.
2667
  static OMPFirstprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2668
2669
  using private_copies_iterator = MutableArrayRef<Expr *>::iterator;
2670
  using private_copies_const_iterator = ArrayRef<const Expr *>::iterator;
2671
  using private_copies_range = llvm::iterator_range<private_copies_iterator>;
2672
  using private_copies_const_range =
2673
      llvm::iterator_range<private_copies_const_iterator>;
2674
2675
52.6k
  private_copies_range private_copies() {
2676
52.6k
    return private_copies_range(getPrivateCopies().begin(),
2677
52.6k
                                getPrivateCopies().end());
2678
52.6k
  }
2679
10.8k
  private_copies_const_range private_copies() const {
2680
10.8k
    return private_copies_const_range(getPrivateCopies().begin(),
2681
10.8k
                                      getPrivateCopies().end());
2682
10.8k
  }
2683
2684
  using inits_iterator = MutableArrayRef<Expr *>::iterator;
2685
  using inits_const_iterator = ArrayRef<const Expr *>::iterator;
2686
  using inits_range = llvm::iterator_range<inits_iterator>;
2687
  using inits_const_range = llvm::iterator_range<inits_const_iterator>;
2688
2689
4.37k
  inits_range inits() {
2690
4.37k
    return inits_range(getInits().begin(), getInits().end());
2691
4.37k
  }
2692
10.8k
  inits_const_range inits() const {
2693
10.8k
    return inits_const_range(getInits().begin(), getInits().end());
2694
10.8k
  }
2695
2696
9.05k
  child_range children() {
2697
9.05k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2698
9.05k
                       reinterpret_cast<Stmt **>(varlist_end()));
2699
9.05k
  }
2700
2701
0
  const_child_range children() const {
2702
0
    auto Children = const_cast<OMPFirstprivateClause *>(this)->children();
2703
0
    return const_child_range(Children.begin(), Children.end());
2704
0
  }
2705
2706
23.6k
  child_range used_children() {
2707
23.6k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2708
23.6k
                       reinterpret_cast<Stmt **>(varlist_end()));
2709
23.6k
  }
2710
0
  const_child_range used_children() const {
2711
0
    auto Children = const_cast<OMPFirstprivateClause *>(this)->used_children();
2712
0
    return const_child_range(Children.begin(), Children.end());
2713
0
  }
2714
2715
111k
  static bool classof(const OMPClause *T) {
2716
111k
    return T->getClauseKind() == llvm::omp::OMPC_firstprivate;
2717
111k
  }
2718
};
2719
2720
/// This represents clause 'lastprivate' in the '#pragma omp ...'
2721
/// directives.
2722
///
2723
/// \code
2724
/// #pragma omp simd lastprivate(a,b)
2725
/// \endcode
2726
/// In this example directive '#pragma omp simd' has clause 'lastprivate'
2727
/// with the variables 'a' and 'b'.
2728
class OMPLastprivateClause final
2729
    : public OMPVarListClause<OMPLastprivateClause>,
2730
      public OMPClauseWithPostUpdate,
2731
      private llvm::TrailingObjects<OMPLastprivateClause, Expr *> {
2732
  // There are 4 additional tail-allocated arrays at the end of the class:
2733
  // 1. Contains list of pseudo variables with the default initialization for
2734
  // each non-firstprivate variables. Used in codegen for initialization of
2735
  // lastprivate copies.
2736
  // 2. List of helper expressions for proper generation of assignment operation
2737
  // required for lastprivate clause. This list represents private variables
2738
  // (for arrays, single array element).
2739
  // 3. List of helper expressions for proper generation of assignment operation
2740
  // required for lastprivate clause. This list represents original variables
2741
  // (for arrays, single array element).
2742
  // 4. List of helper expressions that represents assignment operation:
2743
  // \code
2744
  // DstExprs = SrcExprs;
2745
  // \endcode
2746
  // Required for proper codegen of final assignment performed by the
2747
  // lastprivate clause.
2748
  friend class OMPClauseReader;
2749
  friend OMPVarListClause;
2750
  friend TrailingObjects;
2751
2752
  /// Optional lastprivate kind, e.g. 'conditional', if specified by user.
2753
  OpenMPLastprivateModifier LPKind;
2754
  /// Optional location of the lasptrivate kind, if specified by user.
2755
  SourceLocation LPKindLoc;
2756
  /// Optional colon location, if specified by user.
2757
  SourceLocation ColonLoc;
2758
2759
  /// Build clause with number of variables \a N.
2760
  ///
2761
  /// \param StartLoc Starting location of the clause.
2762
  /// \param LParenLoc Location of '('.
2763
  /// \param EndLoc Ending location of the clause.
2764
  /// \param N Number of the variables in the clause.
2765
  OMPLastprivateClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2766
                       SourceLocation EndLoc, OpenMPLastprivateModifier LPKind,
2767
                       SourceLocation LPKindLoc, SourceLocation ColonLoc,
2768
                       unsigned N)
2769
      : OMPVarListClause<OMPLastprivateClause>(llvm::omp::OMPC_lastprivate,
2770
                                               StartLoc, LParenLoc, EndLoc, N),
2771
        OMPClauseWithPostUpdate(this), LPKind(LPKind), LPKindLoc(LPKindLoc),
2772
5.90k
        ColonLoc(ColonLoc) {}
2773
2774
  /// Build an empty clause.
2775
  ///
2776
  /// \param N Number of variables.
2777
  explicit OMPLastprivateClause(unsigned N)
2778
      : OMPVarListClause<OMPLastprivateClause>(
2779
            llvm::omp::OMPC_lastprivate, SourceLocation(), SourceLocation(),
2780
            SourceLocation(), N),
2781
406
        OMPClauseWithPostUpdate(this) {}
2782
2783
  /// Get the list of helper expressions for initialization of private
2784
  /// copies for lastprivate variables.
2785
31.3k
  MutableArrayRef<Expr *> getPrivateCopies() {
2786
31.3k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
2787
31.3k
  }
2788
6.55k
  ArrayRef<const Expr *> getPrivateCopies() const {
2789
6.55k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
2790
6.55k
  }
2791
2792
  /// Set list of helper expressions, required for proper codegen of the
2793
  /// clause. These expressions represent private variables (for arrays, single
2794
  /// array element) in the final assignment statement performed by the
2795
  /// lastprivate clause.
2796
  void setSourceExprs(ArrayRef<Expr *> SrcExprs);
2797
2798
  /// Get the list of helper source expressions.
2799
15.3k
  MutableArrayRef<Expr *> getSourceExprs() {
2800
15.3k
    return MutableArrayRef<Expr *>(getPrivateCopies().end(), varlist_size());
2801
15.3k
  }
2802
5.47k
  ArrayRef<const Expr *> getSourceExprs() const {
2803
5.47k
    return llvm::makeArrayRef(getPrivateCopies().end(), varlist_size());
2804
5.47k
  }
2805
2806
  /// Set list of helper expressions, required for proper codegen of the
2807
  /// clause. These expressions represent original variables (for arrays, single
2808
  /// array element) in the final assignment statement performed by the
2809
  /// lastprivate clause.
2810
  void setDestinationExprs(ArrayRef<Expr *> DstExprs);
2811
2812
  /// Get the list of helper destination expressions.
2813
8.11k
  MutableArrayRef<Expr *> getDestinationExprs() {
2814
8.11k
    return MutableArrayRef<Expr *>(getSourceExprs().end(), varlist_size());
2815
8.11k
  }
2816
4.00k
  ArrayRef<const Expr *> getDestinationExprs() const {
2817
4.00k
    return llvm::makeArrayRef(getSourceExprs().end(), varlist_size());
2818
4.00k
  }
2819
2820
  /// Set list of helper assignment expressions, required for proper
2821
  /// codegen of the clause. These expressions are assignment expressions that
2822
  /// assign private copy of the variable to original variable.
2823
  void setAssignmentOps(ArrayRef<Expr *> AssignmentOps);
2824
2825
  /// Get the list of helper assignment expressions.
2826
904
  MutableArrayRef<Expr *> getAssignmentOps() {
2827
904
    return MutableArrayRef<Expr *>(getDestinationExprs().end(), varlist_size());
2828
904
  }
2829
1.46k
  ArrayRef<const Expr *> getAssignmentOps() const {
2830
1.46k
    return llvm::makeArrayRef(getDestinationExprs().end(), varlist_size());
2831
1.46k
  }
2832
2833
  /// Sets lastprivate kind.
2834
406
  void setKind(OpenMPLastprivateModifier Kind) { LPKind = Kind; }
2835
  /// Sets location of the lastprivate kind.
2836
406
  void setKindLoc(SourceLocation Loc) { LPKindLoc = Loc; }
2837
  /// Sets colon symbol location.
2838
406
  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
2839
2840
public:
2841
  /// Creates clause with a list of variables \a VL.
2842
  ///
2843
  /// \param C AST context.
2844
  /// \param StartLoc Starting location of the clause.
2845
  /// \param LParenLoc Location of '('.
2846
  /// \param EndLoc Ending location of the clause.
2847
  /// \param VL List of references to the variables.
2848
  /// \param SrcExprs List of helper expressions for proper generation of
2849
  /// assignment operation required for lastprivate clause. This list represents
2850
  /// private variables (for arrays, single array element).
2851
  /// \param DstExprs List of helper expressions for proper generation of
2852
  /// assignment operation required for lastprivate clause. This list represents
2853
  /// original variables (for arrays, single array element).
2854
  /// \param AssignmentOps List of helper expressions that represents assignment
2855
  /// operation:
2856
  /// \code
2857
  /// DstExprs = SrcExprs;
2858
  /// \endcode
2859
  /// Required for proper codegen of final assignment performed by the
2860
  /// lastprivate clause.
2861
  /// \param LPKind Lastprivate kind, e.g. 'conditional'.
2862
  /// \param LPKindLoc Location of the lastprivate kind.
2863
  /// \param ColonLoc Location of the ':' symbol if lastprivate kind is used.
2864
  /// \param PreInit Statement that must be executed before entering the OpenMP
2865
  /// region with this clause.
2866
  /// \param PostUpdate Expression that must be executed after exit from the
2867
  /// OpenMP region with this clause.
2868
  static OMPLastprivateClause *
2869
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
2870
         SourceLocation EndLoc, ArrayRef<Expr *> VL, ArrayRef<Expr *> SrcExprs,
2871
         ArrayRef<Expr *> DstExprs, ArrayRef<Expr *> AssignmentOps,
2872
         OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc,
2873
         SourceLocation ColonLoc, Stmt *PreInit, Expr *PostUpdate);
2874
2875
  /// Creates an empty clause with the place for \a N variables.
2876
  ///
2877
  /// \param C AST context.
2878
  /// \param N The number of variables.
2879
  static OMPLastprivateClause *CreateEmpty(const ASTContext &C, unsigned N);
2880
2881
  /// Lastprivate kind.
2882
7.82k
  OpenMPLastprivateModifier getKind() const { return LPKind; }
2883
  /// Returns the location of the lastprivate kind.
2884
1.81k
  SourceLocation getKindLoc() const { return LPKindLoc; }
2885
  /// Returns the location of the ':' symbol, if any.
2886
1.81k
  SourceLocation getColonLoc() const { return ColonLoc; }
2887
2888
  using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
2889
  using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
2890
  using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
2891
  using helper_expr_const_range =
2892
      llvm::iterator_range<helper_expr_const_iterator>;
2893
2894
  /// Set list of helper expressions, required for generation of private
2895
  /// copies of original lastprivate variables.
2896
  void setPrivateCopies(ArrayRef<Expr *> PrivateCopies);
2897
2898
540
  helper_expr_const_range private_copies() const {
2899
540
    return helper_expr_const_range(getPrivateCopies().begin(),
2900
540
                                   getPrivateCopies().end());
2901
540
  }
2902
2903
4.87k
  helper_expr_range private_copies() {
2904
4.87k
    return helper_expr_range(getPrivateCopies().begin(),
2905
4.87k
                             getPrivateCopies().end());
2906
4.87k
  }
2907
2908
732
  helper_expr_const_range source_exprs() const {
2909
732
    return helper_expr_const_range(getSourceExprs().begin(),
2910
732
                                   getSourceExprs().end());
2911
732
  }
2912
2913
452
  helper_expr_range source_exprs() {
2914
452
    return helper_expr_range(getSourceExprs().begin(), getSourceExprs().end());
2915
452
  }
2916
2917
1.27k
  helper_expr_const_range destination_exprs() const {
2918
1.27k
    return helper_expr_const_range(getDestinationExprs().begin(),
2919
1.27k
                                   getDestinationExprs().end());
2920
1.27k
  }
2921
2922
452
  helper_expr_range destination_exprs() {
2923
452
    return helper_expr_range(getDestinationExprs().begin(),
2924
452
                             getDestinationExprs().end());
2925
452
  }
2926
2927
732
  helper_expr_const_range assignment_ops() const {
2928
732
    return helper_expr_const_range(getAssignmentOps().begin(),
2929
732
                                   getAssignmentOps().end());
2930
732
  }
2931
2932
452
  helper_expr_range assignment_ops() {
2933
452
    return helper_expr_range(getAssignmentOps().begin(),
2934
452
                             getAssignmentOps().end());
2935
452
  }
2936
2937
8.44k
  child_range children() {
2938
8.44k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
2939
8.44k
                       reinterpret_cast<Stmt **>(varlist_end()));
2940
8.44k
  }
2941
2942
0
  const_child_range children() const {
2943
0
    auto Children = const_cast<OMPLastprivateClause *>(this)->children();
2944
0
    return const_child_range(Children.begin(), Children.end());
2945
0
  }
2946
2947
1.31k
  child_range used_children() {
2948
1.31k
    return child_range(child_iterator(), child_iterator());
2949
1.31k
  }
2950
0
  const_child_range used_children() const {
2951
0
    return const_child_range(const_child_iterator(), const_child_iterator());
2952
0
  }
2953
2954
305k
  static bool classof(const OMPClause *T) {
2955
305k
    return T->getClauseKind() == llvm::omp::OMPC_lastprivate;
2956
305k
  }
2957
};
2958
2959
/// This represents clause 'shared' in the '#pragma omp ...' directives.
2960
///
2961
/// \code
2962
/// #pragma omp parallel shared(a,b)
2963
/// \endcode
2964
/// In this example directive '#pragma omp parallel' has clause 'shared'
2965
/// with the variables 'a' and 'b'.
2966
class OMPSharedClause final
2967
    : public OMPVarListClause<OMPSharedClause>,
2968
      private llvm::TrailingObjects<OMPSharedClause, Expr *> {
2969
  friend OMPVarListClause;
2970
  friend TrailingObjects;
2971
2972
  /// Build clause with number of variables \a N.
2973
  ///
2974
  /// \param StartLoc Starting location of the clause.
2975
  /// \param LParenLoc Location of '('.
2976
  /// \param EndLoc Ending location of the clause.
2977
  /// \param N Number of the variables in the clause.
2978
  OMPSharedClause(SourceLocation StartLoc, SourceLocation LParenLoc,
2979
                  SourceLocation EndLoc, unsigned N)
2980
      : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared, StartLoc,
2981
3.96k
                                          LParenLoc, EndLoc, N) {}
2982
2983
  /// Build an empty clause.
2984
  ///
2985
  /// \param N Number of variables.
2986
  explicit OMPSharedClause(unsigned N)
2987
      : OMPVarListClause<OMPSharedClause>(llvm::omp::OMPC_shared,
2988
                                          SourceLocation(), SourceLocation(),
2989
415
                                          SourceLocation(), N) {}
2990
2991
public:
2992
  /// Creates clause with a list of variables \a VL.
2993
  ///
2994
  /// \param C AST context.
2995
  /// \param StartLoc Starting location of the clause.
2996
  /// \param LParenLoc Location of '('.
2997
  /// \param EndLoc Ending location of the clause.
2998
  /// \param VL List of references to the variables.
2999
  static OMPSharedClause *Create(const ASTContext &C, SourceLocation StartLoc,
3000
                                 SourceLocation LParenLoc,
3001
                                 SourceLocation EndLoc, ArrayRef<Expr *> VL);
3002
3003
  /// Creates an empty clause with \a N variables.
3004
  ///
3005
  /// \param C AST context.
3006
  /// \param N The number of variables.
3007
  static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N);
3008
3009
678
  child_range children() {
3010
678
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3011
678
                       reinterpret_cast<Stmt **>(varlist_end()));
3012
678
  }
3013
3014
0
  const_child_range children() const {
3015
0
    auto Children = const_cast<OMPSharedClause *>(this)->children();
3016
0
    return const_child_range(Children.begin(), Children.end());
3017
0
  }
3018
3019
1.31k
  child_range used_children() {
3020
1.31k
    return child_range(child_iterator(), child_iterator());
3021
1.31k
  }
3022
0
  const_child_range used_children() const {
3023
0
    return const_child_range(const_child_iterator(), const_child_iterator());
3024
0
  }
3025
3026
0
  static bool classof(const OMPClause *T) {
3027
0
    return T->getClauseKind() == llvm::omp::OMPC_shared;
3028
0
  }
3029
};
3030
3031
/// This represents clause 'reduction' in the '#pragma omp ...'
3032
/// directives.
3033
///
3034
/// \code
3035
/// #pragma omp parallel reduction(+:a,b)
3036
/// \endcode
3037
/// In this example directive '#pragma omp parallel' has clause 'reduction'
3038
/// with operator '+' and the variables 'a' and 'b'.
3039
class OMPReductionClause final
3040
    : public OMPVarListClause<OMPReductionClause>,
3041
      public OMPClauseWithPostUpdate,
3042
      private llvm::TrailingObjects<OMPReductionClause, Expr *> {
3043
  friend class OMPClauseReader;
3044
  friend OMPVarListClause;
3045
  friend TrailingObjects;
3046
3047
  /// Reduction modifier.
3048
  OpenMPReductionClauseModifier Modifier = OMPC_REDUCTION_unknown;
3049
3050
  /// Reduction modifier location.
3051
  SourceLocation ModifierLoc;
3052
3053
  /// Location of ':'.
3054
  SourceLocation ColonLoc;
3055
3056
  /// Nested name specifier for C++.
3057
  NestedNameSpecifierLoc QualifierLoc;
3058
3059
  /// Name of custom operator.
3060
  DeclarationNameInfo NameInfo;
3061
3062
  /// Build clause with number of variables \a N.
3063
  ///
3064
  /// \param StartLoc Starting location of the clause.
3065
  /// \param LParenLoc Location of '('.
3066
  /// \param ModifierLoc Modifier location.
3067
  /// \param ColonLoc Location of ':'.
3068
  /// \param EndLoc Ending location of the clause.
3069
  /// \param N Number of the variables in the clause.
3070
  /// \param QualifierLoc The nested-name qualifier with location information
3071
  /// \param NameInfo The full name info for reduction identifier.
3072
  OMPReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3073
                     SourceLocation ModifierLoc, SourceLocation ColonLoc,
3074
                     SourceLocation EndLoc,
3075
                     OpenMPReductionClauseModifier Modifier, unsigned N,
3076
                     NestedNameSpecifierLoc QualifierLoc,
3077
                     const DeclarationNameInfo &NameInfo)
3078
      : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
3079
                                             StartLoc, LParenLoc, EndLoc, N),
3080
        OMPClauseWithPostUpdate(this), Modifier(Modifier),
3081
        ModifierLoc(ModifierLoc), ColonLoc(ColonLoc),
3082
24.8k
        QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3083
3084
  /// Build an empty clause.
3085
  ///
3086
  /// \param N Number of variables.
3087
  explicit OMPReductionClause(unsigned N)
3088
      : OMPVarListClause<OMPReductionClause>(llvm::omp::OMPC_reduction,
3089
                                             SourceLocation(), SourceLocation(),
3090
                                             SourceLocation(), N),
3091
931
        OMPClauseWithPostUpdate(this) {}
3092
3093
  /// Sets reduction modifier.
3094
931
  void setModifier(OpenMPReductionClauseModifier M) { Modifier = M; }
3095
3096
  /// Sets location of the modifier.
3097
931
  void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
3098
3099
  /// Sets location of ':' symbol in clause.
3100
931
  void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3101
3102
  /// Sets the name info for specified reduction identifier.
3103
931
  void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3104
3105
  /// Sets the nested name specifier.
3106
931
  void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3107
3108
  /// Set list of helper expressions, required for proper codegen of the
3109
  /// clause. These expressions represent private copy of the reduction
3110
  /// variable.
3111
  void setPrivates(ArrayRef<Expr *> Privates);
3112
3113
  /// Get the list of helper privates.
3114
148k
  MutableArrayRef<Expr *> getPrivates() {
3115
148k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3116
148k
  }
3117
29.5k
  ArrayRef<const Expr *> getPrivates() const {
3118
29.5k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
3119
29.5k
  }
3120
3121
  /// Set list of helper expressions, required for proper codegen of the
3122
  /// clause. These expressions represent LHS expression in the final
3123
  /// reduction expression performed by the reduction clause.
3124
  void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3125
3126
  /// Get the list of helper LHS expressions.
3127
93.2k
  MutableArrayRef<Expr *> getLHSExprs() {
3128
93.2k
    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3129
93.2k
  }
3130
22.3k
  ArrayRef<const Expr *> getLHSExprs() const {
3131
22.3k
    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3132
22.3k
  }
3133
3134
  /// Set list of helper expressions, required for proper codegen of the
3135
  /// clause. These expressions represent RHS expression in the final
3136
  /// reduction expression performed by the reduction clause.
3137
  /// Also, variables in these expressions are used for proper initialization of
3138
  /// reduction copies.
3139
  void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3140
3141
  /// Get the list of helper destination expressions.
3142
65.4k
  MutableArrayRef<Expr *> getRHSExprs() {
3143
65.4k
    return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3144
65.4k
  }
3145
15.2k
  ArrayRef<const Expr *> getRHSExprs() const {
3146
15.2k
    return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3147
15.2k
  }
3148
3149
  /// Set list of helper reduction expressions, required for proper
3150
  /// codegen of the clause. These expressions are binary expressions or
3151
  /// operator/custom reduction call that calculates new value from source
3152
  /// helper expressions to destination helper expressions.
3153
  void setReductionOps(ArrayRef<Expr *> ReductionOps);
3154
3155
  /// Get the list of helper reduction expressions.
3156
37.7k
  MutableArrayRef<Expr *> getReductionOps() {
3157
37.7k
    return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3158
37.7k
  }
3159
8.10k
  ArrayRef<const Expr *> getReductionOps() const {
3160
8.10k
    return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3161
8.10k
  }
3162
3163
  /// Set list of helper copy operations for inscan reductions.
3164
  /// The form is: Temps[i] = LHS[i];
3165
  void setInscanCopyOps(ArrayRef<Expr *> Ops);
3166
3167
  /// Get the list of helper inscan copy operations.
3168
560
  MutableArrayRef<Expr *> getInscanCopyOps() {
3169
560
    return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
3170
560
  }
3171
1.00k
  ArrayRef<const Expr *> getInscanCopyOps() const {
3172
1.00k
    return llvm::makeArrayRef(getReductionOps().end(), varlist_size());
3173
1.00k
  }
3174
3175
  /// Set list of helper temp vars for inscan copy array operations.
3176
  void setInscanCopyArrayTemps(ArrayRef<Expr *> CopyArrayTemps);
3177
3178
  /// Get the list of helper inscan copy temps.
3179
350
  MutableArrayRef<Expr *> getInscanCopyArrayTemps() {
3180
350
    return MutableArrayRef<Expr *>(getInscanCopyOps().end(), varlist_size());
3181
350
  }
3182
704
  ArrayRef<const Expr *> getInscanCopyArrayTemps() const {
3183
704
    return llvm::makeArrayRef(getInscanCopyOps().end(), varlist_size());
3184
704
  }
3185
3186
  /// Set list of helper temp elements vars for inscan copy array operations.
3187
  void setInscanCopyArrayElems(ArrayRef<Expr *> CopyArrayElems);
3188
3189
  /// Get the list of helper inscan copy temps.
3190
48
  MutableArrayRef<Expr *> getInscanCopyArrayElems() {
3191
48
    return MutableArrayRef<Expr *>(getInscanCopyArrayTemps().end(),
3192
48
                                   varlist_size());
3193
48
  }
3194
364
  ArrayRef<const Expr *> getInscanCopyArrayElems() const {
3195
364
    return llvm::makeArrayRef(getInscanCopyArrayTemps().end(), varlist_size());
3196
364
  }
3197
3198
public:
3199
  /// Creates clause with a list of variables \a VL.
3200
  ///
3201
  /// \param StartLoc Starting location of the clause.
3202
  /// \param LParenLoc Location of '('.
3203
  /// \param ModifierLoc Modifier location.
3204
  /// \param ColonLoc Location of ':'.
3205
  /// \param EndLoc Ending location of the clause.
3206
  /// \param VL The variables in the clause.
3207
  /// \param QualifierLoc The nested-name qualifier with location information
3208
  /// \param NameInfo The full name info for reduction identifier.
3209
  /// \param Privates List of helper expressions for proper generation of
3210
  /// private copies.
3211
  /// \param LHSExprs List of helper expressions for proper generation of
3212
  /// assignment operation required for copyprivate clause. This list represents
3213
  /// LHSs of the reduction expressions.
3214
  /// \param RHSExprs List of helper expressions for proper generation of
3215
  /// assignment operation required for copyprivate clause. This list represents
3216
  /// RHSs of the reduction expressions.
3217
  /// Also, variables in these expressions are used for proper initialization of
3218
  /// reduction copies.
3219
  /// \param ReductionOps List of helper expressions that represents reduction
3220
  /// expressions:
3221
  /// \code
3222
  /// LHSExprs binop RHSExprs;
3223
  /// operator binop(LHSExpr, RHSExpr);
3224
  /// <CutomReduction>(LHSExpr, RHSExpr);
3225
  /// \endcode
3226
  /// Required for proper codegen of final reduction operation performed by the
3227
  /// reduction clause.
3228
  /// \param CopyOps List of copy operations for inscan reductions:
3229
  /// \code
3230
  /// TempExprs = LHSExprs;
3231
  /// \endcode
3232
  /// \param CopyArrayTemps Temp arrays for prefix sums.
3233
  /// \param CopyArrayElems Temp arrays for prefix sums.
3234
  /// \param PreInit Statement that must be executed before entering the OpenMP
3235
  /// region with this clause.
3236
  /// \param PostUpdate Expression that must be executed after exit from the
3237
  /// OpenMP region with this clause.
3238
  static OMPReductionClause *
3239
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3240
         SourceLocation ModifierLoc, SourceLocation ColonLoc,
3241
         SourceLocation EndLoc, OpenMPReductionClauseModifier Modifier,
3242
         ArrayRef<Expr *> VL, NestedNameSpecifierLoc QualifierLoc,
3243
         const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3244
         ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3245
         ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> CopyOps,
3246
         ArrayRef<Expr *> CopyArrayTemps, ArrayRef<Expr *> CopyArrayElems,
3247
         Stmt *PreInit, Expr *PostUpdate);
3248
3249
  /// Creates an empty clause with the place for \a N variables.
3250
  ///
3251
  /// \param C AST context.
3252
  /// \param N The number of variables.
3253
  /// \param Modifier Reduction modifier.
3254
  static OMPReductionClause *
3255
  CreateEmpty(const ASTContext &C, unsigned N,
3256
              OpenMPReductionClauseModifier Modifier);
3257
3258
  /// Returns modifier.
3259
83.3k
  OpenMPReductionClauseModifier getModifier() const { return Modifier; }
3260
3261
  /// Returns modifier location.
3262
20.4k
  SourceLocation getModifierLoc() const { return ModifierLoc; }
3263
3264
  /// Gets location of ':' symbol in clause.
3265
18.4k
  SourceLocation getColonLoc() const { return ColonLoc; }
3266
3267
  /// Gets the name info for specified reduction identifier.
3268
21.1k
  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3269
3270
  /// Gets the nested name specifier.
3271
20.8k
  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3272
3273
  using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3274
  using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3275
  using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3276
  using helper_expr_const_range =
3277
      llvm::iterator_range<helper_expr_const_iterator>;
3278
3279
3.64k
  helper_expr_const_range privates() const {
3280
3.64k
    return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3281
3.64k
  }
3282
3283
14.5k
  helper_expr_range privates() {
3284
14.5k
    return helper_expr_range(getPrivates().begin(), getPrivates().end());
3285
14.5k
  }
3286
3287
3.55k
  helper_expr_const_range lhs_exprs() const {
3288
3.55k
    return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3289
3.55k
  }
3290
3291
979
  helper_expr_range lhs_exprs() {
3292
979
    return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3293
979
  }
3294
3295
3.55k
  helper_expr_const_range rhs_exprs() const {
3296
3.55k
    return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3297
3.55k
  }
3298
3299
979
  helper_expr_range rhs_exprs() {
3300
979
    return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3301
979
  }
3302
3303
3.55k
  helper_expr_const_range reduction_ops() const {
3304
3.55k
    return helper_expr_const_range(getReductionOps().begin(),
3305
3.55k
                                   getReductionOps().end());
3306
3.55k
  }
3307
3308
18.5k
  helper_expr_range reduction_ops() {
3309
18.5k
    return helper_expr_range(getReductionOps().begin(),
3310
18.5k
                             getReductionOps().end());
3311
18.5k
  }
3312
3313
150
  helper_expr_const_range copy_ops() const {
3314
150
    return helper_expr_const_range(getInscanCopyOps().begin(),
3315
150
                                   getInscanCopyOps().end());
3316
150
  }
3317
3318
24
  helper_expr_range copy_ops() {
3319
24
    return helper_expr_range(getInscanCopyOps().begin(),
3320
24
                             getInscanCopyOps().end());
3321
24
  }
3322
3323
170
  helper_expr_const_range copy_array_temps() const {
3324
170
    return helper_expr_const_range(getInscanCopyArrayTemps().begin(),
3325
170
                                   getInscanCopyArrayTemps().end());
3326
170
  }
3327
3328
70
  helper_expr_range copy_array_temps() {
3329
70
    return helper_expr_range(getInscanCopyArrayTemps().begin(),
3330
70
                             getInscanCopyArrayTemps().end());
3331
70
  }
3332
3333
182
  helper_expr_const_range copy_array_elems() const {
3334
182
    return helper_expr_const_range(getInscanCopyArrayElems().begin(),
3335
182
                                   getInscanCopyArrayElems().end());
3336
182
  }
3337
3338
24
  helper_expr_range copy_array_elems() {
3339
24
    return helper_expr_range(getInscanCopyArrayElems().begin(),
3340
24
                             getInscanCopyArrayElems().end());
3341
24
  }
3342
3343
29.6k
  child_range children() {
3344
29.6k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3345
29.6k
                       reinterpret_cast<Stmt **>(varlist_end()));
3346
29.6k
  }
3347
3348
0
  const_child_range children() const {
3349
0
    auto Children = const_cast<OMPReductionClause *>(this)->children();
3350
0
    return const_child_range(Children.begin(), Children.end());
3351
0
  }
3352
3353
7.80k
  child_range used_children() {
3354
7.80k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3355
7.80k
                       reinterpret_cast<Stmt **>(varlist_end()));
3356
7.80k
  }
3357
0
  const_child_range used_children() const {
3358
0
    auto Children = const_cast<OMPReductionClause *>(this)->used_children();
3359
0
    return const_child_range(Children.begin(), Children.end());
3360
0
  }
3361
3362
234k
  static bool classof(const OMPClause *T) {
3363
234k
    return T->getClauseKind() == llvm::omp::OMPC_reduction;
3364
234k
  }
3365
};
3366
3367
/// This represents clause 'task_reduction' in the '#pragma omp taskgroup'
3368
/// directives.
3369
///
3370
/// \code
3371
/// #pragma omp taskgroup task_reduction(+:a,b)
3372
/// \endcode
3373
/// In this example directive '#pragma omp taskgroup' has clause
3374
/// 'task_reduction' with operator '+' and the variables 'a' and 'b'.
3375
class OMPTaskReductionClause final
3376
    : public OMPVarListClause<OMPTaskReductionClause>,
3377
      public OMPClauseWithPostUpdate,
3378
      private llvm::TrailingObjects<OMPTaskReductionClause, Expr *> {
3379
  friend class OMPClauseReader;
3380
  friend OMPVarListClause;
3381
  friend TrailingObjects;
3382
3383
  /// Location of ':'.
3384
  SourceLocation ColonLoc;
3385
3386
  /// Nested name specifier for C++.
3387
  NestedNameSpecifierLoc QualifierLoc;
3388
3389
  /// Name of custom operator.
3390
  DeclarationNameInfo NameInfo;
3391
3392
  /// Build clause with number of variables \a N.
3393
  ///
3394
  /// \param StartLoc Starting location of the clause.
3395
  /// \param LParenLoc Location of '('.
3396
  /// \param EndLoc Ending location of the clause.
3397
  /// \param ColonLoc Location of ':'.
3398
  /// \param N Number of the variables in the clause.
3399
  /// \param QualifierLoc The nested-name qualifier with location information
3400
  /// \param NameInfo The full name info for reduction identifier.
3401
  OMPTaskReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3402
                         SourceLocation ColonLoc, SourceLocation EndLoc,
3403
                         unsigned N, NestedNameSpecifierLoc QualifierLoc,
3404
                         const DeclarationNameInfo &NameInfo)
3405
      : OMPVarListClause<OMPTaskReductionClause>(
3406
            llvm::omp::OMPC_task_reduction, StartLoc, LParenLoc, EndLoc, N),
3407
        OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
3408
2.26k
        QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3409
3410
  /// Build an empty clause.
3411
  ///
3412
  /// \param N Number of variables.
3413
  explicit OMPTaskReductionClause(unsigned N)
3414
      : OMPVarListClause<OMPTaskReductionClause>(
3415
            llvm::omp::OMPC_task_reduction, SourceLocation(), SourceLocation(),
3416
            SourceLocation(), N),
3417
86
        OMPClauseWithPostUpdate(this) {}
3418
3419
  /// Sets location of ':' symbol in clause.
3420
86
  void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3421
3422
  /// Sets the name info for specified reduction identifier.
3423
86
  void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3424
3425
  /// Sets the nested name specifier.
3426
86
  void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3427
3428
  /// Set list of helper expressions, required for proper codegen of the clause.
3429
  /// These expressions represent private copy of the reduction variable.
3430
  void setPrivates(ArrayRef<Expr *> Privates);
3431
3432
  /// Get the list of helper privates.
3433
13.1k
  MutableArrayRef<Expr *> getPrivates() {
3434
13.1k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3435
13.1k
  }
3436
1.00k
  ArrayRef<const Expr *> getPrivates() const {
3437
1.00k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
3438
1.00k
  }
3439
3440
  /// Set list of helper expressions, required for proper codegen of the clause.
3441
  /// These expressions represent LHS expression in the final reduction
3442
  /// expression performed by the reduction clause.
3443
  void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3444
3445
  /// Get the list of helper LHS expressions.
3446
7.70k
  MutableArrayRef<Expr *> getLHSExprs() {
3447
7.70k
    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3448
7.70k
  }
3449
756
  ArrayRef<const Expr *> getLHSExprs() const {
3450
756
    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3451
756
  }
3452
3453
  /// Set list of helper expressions, required for proper codegen of the clause.
3454
  /// These expressions represent RHS expression in the final reduction
3455
  /// expression performed by the reduction clause. Also, variables in these
3456
  /// expressions are used for proper initialization of reduction copies.
3457
  void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3458
3459
  ///  Get the list of helper destination expressions.
3460
5.18k
  MutableArrayRef<Expr *> getRHSExprs() {
3461
5.18k
    return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3462
5.18k
  }
3463
504
  ArrayRef<const Expr *> getRHSExprs() const {
3464
504
    return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3465
504
  }
3466
3467
  /// Set list of helper reduction expressions, required for proper
3468
  /// codegen of the clause. These expressions are binary expressions or
3469
  /// operator/custom reduction call that calculates new value from source
3470
  /// helper expressions to destination helper expressions.
3471
  void setReductionOps(ArrayRef<Expr *> ReductionOps);
3472
3473
  ///  Get the list of helper reduction expressions.
3474
2.66k
  MutableArrayRef<Expr *> getReductionOps() {
3475
2.66k
    return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3476
2.66k
  }
3477
252
  ArrayRef<const Expr *> getReductionOps() const {
3478
252
    return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3479
252
  }
3480
3481
public:
3482
  /// Creates clause with a list of variables \a VL.
3483
  ///
3484
  /// \param StartLoc Starting location of the clause.
3485
  /// \param LParenLoc Location of '('.
3486
  /// \param ColonLoc Location of ':'.
3487
  /// \param EndLoc Ending location of the clause.
3488
  /// \param VL The variables in the clause.
3489
  /// \param QualifierLoc The nested-name qualifier with location information
3490
  /// \param NameInfo The full name info for reduction identifier.
3491
  /// \param Privates List of helper expressions for proper generation of
3492
  /// private copies.
3493
  /// \param LHSExprs List of helper expressions for proper generation of
3494
  /// assignment operation required for copyprivate clause. This list represents
3495
  /// LHSs of the reduction expressions.
3496
  /// \param RHSExprs List of helper expressions for proper generation of
3497
  /// assignment operation required for copyprivate clause. This list represents
3498
  /// RHSs of the reduction expressions.
3499
  /// Also, variables in these expressions are used for proper initialization of
3500
  /// reduction copies.
3501
  /// \param ReductionOps List of helper expressions that represents reduction
3502
  /// expressions:
3503
  /// \code
3504
  /// LHSExprs binop RHSExprs;
3505
  /// operator binop(LHSExpr, RHSExpr);
3506
  /// <CutomReduction>(LHSExpr, RHSExpr);
3507
  /// \endcode
3508
  /// Required for proper codegen of final reduction operation performed by the
3509
  /// reduction clause.
3510
  /// \param PreInit Statement that must be executed before entering the OpenMP
3511
  /// region with this clause.
3512
  /// \param PostUpdate Expression that must be executed after exit from the
3513
  /// OpenMP region with this clause.
3514
  static OMPTaskReductionClause *
3515
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3516
         SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3517
         NestedNameSpecifierLoc QualifierLoc,
3518
         const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3519
         ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3520
         ArrayRef<Expr *> ReductionOps, Stmt *PreInit, Expr *PostUpdate);
3521
3522
  /// Creates an empty clause with the place for \a N variables.
3523
  ///
3524
  /// \param C AST context.
3525
  /// \param N The number of variables.
3526
  static OMPTaskReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
3527
3528
  /// Gets location of ':' symbol in clause.
3529
1.33k
  SourceLocation getColonLoc() const { return ColonLoc; }
3530
3531
  /// Gets the name info for specified reduction identifier.
3532
1.63k
  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3533
3534
  /// Gets the nested name specifier.
3535
1.62k
  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3536
3537
  using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3538
  using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3539
  using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3540
  using helper_expr_const_range =
3541
      llvm::iterator_range<helper_expr_const_iterator>;
3542
3543
126
  helper_expr_const_range privates() const {
3544
126
    return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3545
126
  }
3546
3547
1.54k
  helper_expr_range privates() {
3548
1.54k
    return helper_expr_range(getPrivates().begin(), getPrivates().end());
3549
1.54k
  }
3550
3551
126
  helper_expr_const_range lhs_exprs() const {
3552
126
    return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3553
126
  }
3554
3555
86
  helper_expr_range lhs_exprs() {
3556
86
    return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3557
86
  }
3558
3559
126
  helper_expr_const_range rhs_exprs() const {
3560
126
    return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3561
126
  }
3562
3563
86
  helper_expr_range rhs_exprs() {
3564
86
    return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3565
86
  }
3566
3567
126
  helper_expr_const_range reduction_ops() const {
3568
126
    return helper_expr_const_range(getReductionOps().begin(),
3569
126
                                   getReductionOps().end());
3570
126
  }
3571
3572
1.33k
  helper_expr_range reduction_ops() {
3573
1.33k
    return helper_expr_range(getReductionOps().begin(),
3574
1.33k
                             getReductionOps().end());
3575
1.33k
  }
3576
3577
2.26k
  child_range children() {
3578
2.26k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3579
2.26k
                       reinterpret_cast<Stmt **>(varlist_end()));
3580
2.26k
  }
3581
3582
0
  const_child_range children() const {
3583
0
    auto Children = const_cast<OMPTaskReductionClause *>(this)->children();
3584
0
    return const_child_range(Children.begin(), Children.end());
3585
0
  }
3586
3587
300
  child_range used_children() {
3588
300
    return child_range(child_iterator(), child_iterator());
3589
300
  }
3590
0
  const_child_range used_children() const {
3591
0
    return const_child_range(const_child_iterator(), const_child_iterator());
3592
0
  }
3593
3594
29
  static bool classof(const OMPClause *T) {
3595
29
    return T->getClauseKind() == llvm::omp::OMPC_task_reduction;
3596
29
  }
3597
};
3598
3599
/// This represents clause 'in_reduction' in the '#pragma omp task' directives.
3600
///
3601
/// \code
3602
/// #pragma omp task in_reduction(+:a,b)
3603
/// \endcode
3604
/// In this example directive '#pragma omp task' has clause 'in_reduction' with
3605
/// operator '+' and the variables 'a' and 'b'.
3606
class OMPInReductionClause final
3607
    : public OMPVarListClause<OMPInReductionClause>,
3608
      public OMPClauseWithPostUpdate,
3609
      private llvm::TrailingObjects<OMPInReductionClause, Expr *> {
3610
  friend class OMPClauseReader;
3611
  friend OMPVarListClause;
3612
  friend TrailingObjects;
3613
3614
  /// Location of ':'.
3615
  SourceLocation ColonLoc;
3616
3617
  /// Nested name specifier for C++.
3618
  NestedNameSpecifierLoc QualifierLoc;
3619
3620
  /// Name of custom operator.
3621
  DeclarationNameInfo NameInfo;
3622
3623
  /// Build clause with number of variables \a N.
3624
  ///
3625
  /// \param StartLoc Starting location of the clause.
3626
  /// \param LParenLoc Location of '('.
3627
  /// \param EndLoc Ending location of the clause.
3628
  /// \param ColonLoc Location of ':'.
3629
  /// \param N Number of the variables in the clause.
3630
  /// \param QualifierLoc The nested-name qualifier with location information
3631
  /// \param NameInfo The full name info for reduction identifier.
3632
  OMPInReductionClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3633
                       SourceLocation ColonLoc, SourceLocation EndLoc,
3634
                       unsigned N, NestedNameSpecifierLoc QualifierLoc,
3635
                       const DeclarationNameInfo &NameInfo)
3636
      : OMPVarListClause<OMPInReductionClause>(llvm::omp::OMPC_in_reduction,
3637
                                               StartLoc, LParenLoc, EndLoc, N),
3638
        OMPClauseWithPostUpdate(this), ColonLoc(ColonLoc),
3639
1.56k
        QualifierLoc(QualifierLoc), NameInfo(NameInfo) {}
3640
3641
  /// Build an empty clause.
3642
  ///
3643
  /// \param N Number of variables.
3644
  explicit OMPInReductionClause(unsigned N)
3645
      : OMPVarListClause<OMPInReductionClause>(
3646
            llvm::omp::OMPC_in_reduction, SourceLocation(), SourceLocation(),
3647
            SourceLocation(), N),
3648
78
        OMPClauseWithPostUpdate(this) {}
3649
3650
  /// Sets location of ':' symbol in clause.
3651
78
  void setColonLoc(SourceLocation CL) { ColonLoc = CL; }
3652
3653
  /// Sets the name info for specified reduction identifier.
3654
78
  void setNameInfo(DeclarationNameInfo DNI) { NameInfo = DNI; }
3655
3656
  /// Sets the nested name specifier.
3657
78
  void setQualifierLoc(NestedNameSpecifierLoc NSL) { QualifierLoc = NSL; }
3658
3659
  /// Set list of helper expressions, required for proper codegen of the clause.
3660
  /// These expressions represent private copy of the reduction variable.
3661
  void setPrivates(ArrayRef<Expr *> Privates);
3662
3663
  /// Get the list of helper privates.
3664
14.8k
  MutableArrayRef<Expr *> getPrivates() {
3665
14.8k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3666
14.8k
  }
3667
304
  ArrayRef<const Expr *> getPrivates() const {
3668
304
    return llvm::makeArrayRef(varlist_end(), varlist_size());
3669
304
  }
3670
3671
  /// Set list of helper expressions, required for proper codegen of the clause.
3672
  /// These expressions represent LHS expression in the final reduction
3673
  /// expression performed by the reduction clause.
3674
  void setLHSExprs(ArrayRef<Expr *> LHSExprs);
3675
3676
  /// Get the list of helper LHS expressions.
3677
11.2k
  MutableArrayRef<Expr *> getLHSExprs() {
3678
11.2k
    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3679
11.2k
  }
3680
208
  ArrayRef<const Expr *> getLHSExprs() const {
3681
208
    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3682
208
  }
3683
3684
  /// Set list of helper expressions, required for proper codegen of the clause.
3685
  /// These expressions represent RHS expression in the final reduction
3686
  /// expression performed by the reduction clause. Also, variables in these
3687
  /// expressions are used for proper initialization of reduction copies.
3688
  void setRHSExprs(ArrayRef<Expr *> RHSExprs);
3689
3690
  ///  Get the list of helper destination expressions.
3691
9.42k
  MutableArrayRef<Expr *> getRHSExprs() {
3692
9.42k
    return MutableArrayRef<Expr *>(getLHSExprs().end(), varlist_size());
3693
9.42k
  }
3694
200
  ArrayRef<const Expr *> getRHSExprs() const {
3695
200
    return llvm::makeArrayRef(getLHSExprs().end(), varlist_size());
3696
200
  }
3697
3698
  /// Set list of helper reduction expressions, required for proper
3699
  /// codegen of the clause. These expressions are binary expressions or
3700
  /// operator/custom reduction call that calculates new value from source
3701
  /// helper expressions to destination helper expressions.
3702
  void setReductionOps(ArrayRef<Expr *> ReductionOps);
3703
3704
  ///  Get the list of helper reduction expressions.
3705
7.63k
  MutableArrayRef<Expr *> getReductionOps() {
3706
7.63k
    return MutableArrayRef<Expr *>(getRHSExprs().end(), varlist_size());
3707
7.63k
  }
3708
192
  ArrayRef<const Expr *> getReductionOps() const {
3709
192
    return llvm::makeArrayRef(getRHSExprs().end(), varlist_size());
3710
192
  }
3711
3712
  /// Set list of helper reduction taskgroup descriptors.
3713
  void setTaskgroupDescriptors(ArrayRef<Expr *> ReductionOps);
3714
3715
  ///  Get the list of helper reduction taskgroup descriptors.
3716
3.58k
  MutableArrayRef<Expr *> getTaskgroupDescriptors() {
3717
3.58k
    return MutableArrayRef<Expr *>(getReductionOps().end(), varlist_size());
3718
3.58k
  }
3719
96
  ArrayRef<const Expr *> getTaskgroupDescriptors() const {
3720
96
    return llvm::makeArrayRef(getReductionOps().end(), varlist_size());
3721
96
  }
3722
3723
public:
3724
  /// Creates clause with a list of variables \a VL.
3725
  ///
3726
  /// \param StartLoc Starting location of the clause.
3727
  /// \param LParenLoc Location of '('.
3728
  /// \param ColonLoc Location of ':'.
3729
  /// \param EndLoc Ending location of the clause.
3730
  /// \param VL The variables in the clause.
3731
  /// \param QualifierLoc The nested-name qualifier with location information
3732
  /// \param NameInfo The full name info for reduction identifier.
3733
  /// \param Privates List of helper expressions for proper generation of
3734
  /// private copies.
3735
  /// \param LHSExprs List of helper expressions for proper generation of
3736
  /// assignment operation required for copyprivate clause. This list represents
3737
  /// LHSs of the reduction expressions.
3738
  /// \param RHSExprs List of helper expressions for proper generation of
3739
  /// assignment operation required for copyprivate clause. This list represents
3740
  /// RHSs of the reduction expressions.
3741
  /// Also, variables in these expressions are used for proper initialization of
3742
  /// reduction copies.
3743
  /// \param ReductionOps List of helper expressions that represents reduction
3744
  /// expressions:
3745
  /// \code
3746
  /// LHSExprs binop RHSExprs;
3747
  /// operator binop(LHSExpr, RHSExpr);
3748
  /// <CutomReduction>(LHSExpr, RHSExpr);
3749
  /// \endcode
3750
  /// Required for proper codegen of final reduction operation performed by the
3751
  /// reduction clause.
3752
  /// \param TaskgroupDescriptors List of helper taskgroup descriptors for
3753
  /// corresponding items in parent taskgroup task_reduction clause.
3754
  /// \param PreInit Statement that must be executed before entering the OpenMP
3755
  /// region with this clause.
3756
  /// \param PostUpdate Expression that must be executed after exit from the
3757
  /// OpenMP region with this clause.
3758
  static OMPInReductionClause *
3759
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3760
         SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3761
         NestedNameSpecifierLoc QualifierLoc,
3762
         const DeclarationNameInfo &NameInfo, ArrayRef<Expr *> Privates,
3763
         ArrayRef<Expr *> LHSExprs, ArrayRef<Expr *> RHSExprs,
3764
         ArrayRef<Expr *> ReductionOps, ArrayRef<Expr *> TaskgroupDescriptors,
3765
         Stmt *PreInit, Expr *PostUpdate);
3766
3767
  /// Creates an empty clause with the place for \a N variables.
3768
  ///
3769
  /// \param C AST context.
3770
  /// \param N The number of variables.
3771
  static OMPInReductionClause *CreateEmpty(const ASTContext &C, unsigned N);
3772
3773
  /// Gets location of ':' symbol in clause.
3774
1.20k
  SourceLocation getColonLoc() const { return ColonLoc; }
3775
3776
  /// Gets the name info for specified reduction identifier.
3777
1.34k
  const DeclarationNameInfo &getNameInfo() const { return NameInfo; }
3778
3779
  /// Gets the nested name specifier.
3780
1.33k
  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
3781
3782
  using helper_expr_iterator = MutableArrayRef<Expr *>::iterator;
3783
  using helper_expr_const_iterator = ArrayRef<const Expr *>::iterator;
3784
  using helper_expr_range = llvm::iterator_range<helper_expr_iterator>;
3785
  using helper_expr_const_range =
3786
      llvm::iterator_range<helper_expr_const_iterator>;
3787
3788
48
  helper_expr_const_range privates() const {
3789
48
    return helper_expr_const_range(getPrivates().begin(), getPrivates().end());
3790
48
  }
3791
3792
1.01k
  helper_expr_range privates() {
3793
1.01k
    return helper_expr_range(getPrivates().begin(), getPrivates().end());
3794
1.01k
  }
3795
3796
4
  helper_expr_const_range lhs_exprs() const {
3797
4
    return helper_expr_const_range(getLHSExprs().begin(), getLHSExprs().end());
3798
4
  }
3799
3800
78
  helper_expr_range lhs_exprs() {
3801
78
    return helper_expr_range(getLHSExprs().begin(), getLHSExprs().end());
3802
78
  }
3803
3804
4
  helper_expr_const_range rhs_exprs() const {
3805
4
    return helper_expr_const_range(getRHSExprs().begin(), getRHSExprs().end());
3806
4
  }
3807
3808
78
  helper_expr_range rhs_exprs() {
3809
78
    return helper_expr_range(getRHSExprs().begin(), getRHSExprs().end());
3810
78
  }
3811
3812
48
  helper_expr_const_range reduction_ops() const {
3813
48
    return helper_expr_const_range(getReductionOps().begin(),
3814
48
                                   getReductionOps().end());
3815
48
  }
3816
3817
1.20k
  helper_expr_range reduction_ops() {
3818
1.20k
    return helper_expr_range(getReductionOps().begin(),
3819
1.20k
                             getReductionOps().end());
3820
1.20k
  }
3821
3822
48
  helper_expr_const_range taskgroup_descriptors() const {
3823
48
    return helper_expr_const_range(getTaskgroupDescriptors().begin(),
3824
48
                                   getTaskgroupDescriptors().end());
3825
48
  }
3826
3827
1.79k
  helper_expr_range taskgroup_descriptors() {
3828
1.79k
    return helper_expr_range(getTaskgroupDescriptors().begin(),
3829
1.79k
                             getTaskgroupDescriptors().end());
3830
1.79k
  }
3831
3832
2.34k
  child_range children() {
3833
2.34k
    return child_range(reinterpret_cast<Stmt **>(varlist_begin()),
3834
2.34k
                       reinterpret_cast<Stmt **>(varlist_end()));
3835
2.34k
  }
3836
3837
0
  const_child_range children() const {
3838
0
    auto Children = const_cast<OMPInReductionClause *>(this)->children();
3839
0
    return const_child_range(Children.begin(), Children.end());
3840
0
  }
3841
3842
352
  child_range used_children() {
3843
352
    return child_range(child_iterator(), child_iterator());
3844
352
  }
3845
0
  const_child_range used_children() const {
3846
0
    return const_child_range(const_child_iterator(), const_child_iterator());
3847
0
  }
3848
3849
108k
  static bool classof(const OMPClause *T) {
3850
108k
    return T->getClauseKind() == llvm::omp::OMPC_in_reduction;
3851
108k
  }
3852
};
3853
3854
/// This represents clause 'linear' in the '#pragma omp ...'
3855
/// directives.
3856
///
3857
/// \code
3858
/// #pragma omp simd linear(a,b : 2)
3859
/// \endcode
3860
/// In this example directive '#pragma omp simd' has clause 'linear'
3861
/// with variables 'a', 'b' and linear step '2'.
3862
class OMPLinearClause final
3863
    : public OMPVarListClause<OMPLinearClause>,
3864
      public OMPClauseWithPostUpdate,
3865
      private llvm::TrailingObjects<OMPLinearClause, Expr *> {
3866
  friend class OMPClauseReader;
3867
  friend OMPVarListClause;
3868
  friend TrailingObjects;
3869
3870
  /// Modifier of 'linear' clause.
3871
  OpenMPLinearClauseKind Modifier = OMPC_LINEAR_val;
3872
3873
  /// Location of linear modifier if any.
3874
  SourceLocation ModifierLoc;
3875
3876
  /// Location of ':'.
3877
  SourceLocation ColonLoc;
3878
3879
  /// Sets the linear step for clause.
3880
2.98k
  void setStep(Expr *Step) { *(getFinals().end()) = Step; }
3881
3882
  /// Sets the expression to calculate linear step for clause.
3883
2.98k
  void setCalcStep(Expr *CalcStep) { *(getFinals().end() + 1) = CalcStep; }
3884
3885
  /// Build 'linear' clause with given number of variables \a NumVars.
3886
  ///
3887
  /// \param StartLoc Starting location of the clause.
3888
  /// \param LParenLoc Location of '('.
3889
  /// \param ColonLoc Location of ':'.
3890
  /// \param EndLoc Ending location of the clause.
3891
  /// \param NumVars Number of variables.
3892
  OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc,
3893
                  OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
3894
                  SourceLocation ColonLoc, SourceLocation EndLoc,
3895
                  unsigned NumVars)
3896
      : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear, StartLoc,
3897
                                          LParenLoc, EndLoc, NumVars),
3898
        OMPClauseWithPostUpdate(this), Modifier(Modifier),
3899
2.61k
        ModifierLoc(ModifierLoc), ColonLoc(ColonLoc) {}
3900
3901
  /// Build an empty clause.
3902
  ///
3903
  /// \param NumVars Number of variables.
3904
  explicit OMPLinearClause(unsigned NumVars)
3905
      : OMPVarListClause<OMPLinearClause>(llvm::omp::OMPC_linear,
3906
                                          SourceLocation(), SourceLocation(),
3907
                                          SourceLocation(), NumVars),
3908
374
        OMPClauseWithPostUpdate(this) {}
3909
3910
  /// Gets the list of initial values for linear variables.
3911
  ///
3912
  /// There are NumVars expressions with initial values allocated after the
3913
  /// varlist, they are followed by NumVars update expressions (used to update
3914
  /// the linear variable's value on current iteration) and they are followed by
3915
  /// NumVars final expressions (used to calculate the linear variable's
3916
  /// value after the loop body). After these lists, there are 2 helper
3917
  /// expressions - linear step and a helper to calculate it before the
3918
  /// loop body (used when the linear step is not constant):
3919
  ///
3920
  /// { Vars[] /* in OMPVarListClause */; Privates[]; Inits[]; Updates[];
3921
  /// Finals[]; Step; CalcStep; }
3922
59.0k
  MutableArrayRef<Expr *> getPrivates() {
3923
59.0k
    return MutableArrayRef<Expr *>(varlist_end(), varlist_size());
3924
59.0k
  }
3925
7.38k
  ArrayRef<const Expr *> getPrivates() const {
3926
7.38k
    return llvm::makeArrayRef(varlist_end(), varlist_size());
3927
7.38k
  }
3928
3929
47.7k
  MutableArrayRef<Expr *> getInits() {
3930
47.7k
    return MutableArrayRef<Expr *>(getPrivates().end(), varlist_size());
3931
47.7k
  }
3932
5.82k
  ArrayRef<const Expr *> getInits() const {
3933
5.82k
    return llvm::makeArrayRef(getPrivates().end(), varlist_size());
3934
5.82k
  }
3935
3936
  /// Sets the list of update expressions for linear variables.
3937
35.4k
  MutableArrayRef<Expr *> getUpdates() {
3938
35.4k
    return MutableArrayRef<Expr *>(getInits().end(), varlist_size());
3939
35.4k
  }
3940
4.26k
  ArrayRef<const Expr *> getUpdates() const {
3941
4.26k
    return llvm::makeArrayRef(getInits().end(), varlist_size());
3942
4.26k
  }
3943
3944
  /// Sets the list of final update expressions for linear variables.
3945
27.0k
  MutableArrayRef<Expr *> getFinals() {
3946
27.0k
    return MutableArrayRef<Expr *>(getUpdates().end(), varlist_size());
3947
27.0k
  }
3948
2.89k
  ArrayRef<const Expr *> getFinals() const {
3949
2.89k
    return llvm::makeArrayRef(getUpdates().end(), varlist_size());
3950
2.89k
  }
3951
3952
  /// Gets the list of used expressions for linear variables.
3953
10.1k
  MutableArrayRef<Expr *> getUsedExprs() {
3954
10.1k
    return MutableArrayRef<Expr *>(getFinals().end() + 2, varlist_size() + 1);
3955
10.1k
  }
3956
0
  ArrayRef<const Expr *> getUsedExprs() const {
3957
0
    return llvm::makeArrayRef(getFinals().end() + 2, varlist_size() + 1);
3958
0
  }
3959
3960
  /// Sets the list of the copies of original linear variables.
3961
  /// \param PL List of expressions.
3962
  void setPrivates(ArrayRef<Expr *> PL);
3963
3964
  /// Sets the list of the initial values for linear variables.
3965
  /// \param IL List of expressions.
3966
  void setInits(ArrayRef<Expr *> IL);
3967
3968
public:
3969
  /// Creates clause with a list of variables \a VL and a linear step
3970
  /// \a Step.
3971
  ///
3972
  /// \param C AST Context.
3973
  /// \param StartLoc Starting location of the clause.
3974
  /// \param LParenLoc Location of '('.
3975
  /// \param Modifier Modifier of 'linear' clause.
3976
  /// \param ModifierLoc Modifier location.
3977
  /// \param ColonLoc Location of ':'.
3978
  /// \param EndLoc Ending location of the clause.
3979
  /// \param VL List of references to the variables.
3980
  /// \param PL List of private copies of original variables.
3981
  /// \param IL List of initial values for the variables.
3982
  /// \param Step Linear step.
3983
  /// \param CalcStep Calculation of the linear step.
3984
  /// \param PreInit Statement that must be executed before entering the OpenMP
3985
  /// region with this clause.
3986
  /// \param PostUpdate Expression that must be executed after exit from the
3987
  /// OpenMP region with this clause.
3988
  static OMPLinearClause *
3989
  Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
3990
         OpenMPLinearClauseKind Modifier, SourceLocation ModifierLoc,
3991
         SourceLocation ColonLoc, SourceLocation EndLoc, ArrayRef<Expr *> VL,
3992
         ArrayRef<Expr *> PL, ArrayRef<Expr *> IL, Expr *Step, Expr *CalcStep,
3993
         Stmt *PreInit, Expr *PostUpdate);
3994
3995
  /// Creates an empty clause with the place for \a NumVars variables.
3996
  ///
3997
  /// \param C AST context.
3998
  /// \param NumVars Number of variables.
3999
  static OMPLinearClause *CreateEmpty(const ASTContext &C, unsigned NumVars);
4000
4001
  /// Set modifier.
4002
374
  void setModifier(OpenMPLinearClauseKind Kind) { Modifier = Kind; }
4003
4004
  /// Return modifier.
4005
2.93k
  OpenMPLinearClauseKind getModifier() const { return Modifier; }
4006
4007
  /// Set modifier location.
4008
374
  void setModifierLoc(SourceLocation Loc) { ModifierLoc = Loc; }
4009
4010
  /// Return modifier location.
4011
1.74k
  SourceLocation getModifierLoc() const { return ModifierLoc; }
4012
4013
  /// Sets the location of ':'.
4014
374
  void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
4015
4016
  /// Returns the location of ':'.
4017
908
  SourceLocation getColonLoc() const { return ColonLoc; }
4018
4019
  /// Returns linear step.
4020
5.47k
  Expr *getStep() { return *(getFinals().end()); }
4021
4022
  /// Returns linear step.
4023
486
  const Expr *getStep() const { return *(getFinals().end()); }
4024
4025
  /// Returns expression to calculate linear step.
4026
2.36k
  Expr *getCalcStep() { return *(getFinals().end() + 1); }
4027
4028
  /// Returns expression to calculate linear step.
4029
848
  const Expr *getCalcStep() const { return *(getFinals().end() + 1); }
4030
4031
  /// Sets the list of update expressions for linear variables.
4032
  /// \param UL List of expressions.