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