1 //===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ---------===//
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 implements semantic analysis for OpenMP directives and
11 /// clauses.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #include "TreeTransform.h"
16 #include "clang/AST/ASTContext.h"
17 #include "clang/AST/ASTMutationListener.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclCXX.h"
20 #include "clang/AST/DeclOpenMP.h"
21 #include "clang/AST/StmtCXX.h"
22 #include "clang/AST/StmtOpenMP.h"
23 #include "clang/AST/StmtVisitor.h"
24 #include "clang/Basic/OpenMPKinds.h"
25 #include "clang/Basic/TargetInfo.h"
26 #include "clang/Lex/Preprocessor.h"
27 #include "clang/Sema/Initialization.h"
28 #include "clang/Sema/Lookup.h"
29 #include "clang/Sema/Scope.h"
30 #include "clang/Sema/ScopeInfo.h"
31 #include "clang/Sema/SemaInternal.h"
32 using namespace clang;
33 
34 //===----------------------------------------------------------------------===//
35 // Stack of data-sharing attributes for variables
36 //===----------------------------------------------------------------------===//
37 
38 namespace {
39 /// \brief Default data sharing attributes, which can be applied to directive.
40 enum DefaultDataSharingAttributes {
41   DSA_unspecified = 0, /// \brief Data sharing attribute not specified.
42   DSA_none = 1 << 0,   /// \brief Default data sharing attribute 'none'.
43   DSA_shared = 1 << 1  /// \brief Default data sharing attribute 'shared'.
44 };
45 
46 template <class T> struct MatchesAny {
47   explicit MatchesAny(ArrayRef<T> Arr) : Arr(std::move(Arr)) {}
48   bool operator()(T Kind) {
49     for (auto KindEl : Arr)
50       if (KindEl == Kind)
51         return true;
52     return false;
53   }
54 
55 private:
56   ArrayRef<T> Arr;
57 };
58 struct MatchesAlways {
59   MatchesAlways() {}
60   template <class T> bool operator()(T) { return true; }
61 };
62 
63 typedef MatchesAny<OpenMPClauseKind> MatchesAnyClause;
64 typedef MatchesAny<OpenMPDirectiveKind> MatchesAnyDirective;
65 
66 /// \brief Stack for tracking declarations used in OpenMP directives and
67 /// clauses and their data-sharing attributes.
68 class DSAStackTy {
69 public:
70   struct DSAVarData {
71     OpenMPDirectiveKind DKind;
72     OpenMPClauseKind CKind;
73     DeclRefExpr *RefExpr;
74     SourceLocation ImplicitDSALoc;
75     DSAVarData()
76         : DKind(OMPD_unknown), CKind(OMPC_unknown), RefExpr(nullptr),
77           ImplicitDSALoc() {}
78   };
79 
80 private:
81   struct DSAInfo {
82     OpenMPClauseKind Attributes;
83     DeclRefExpr *RefExpr;
84   };
85   typedef llvm::SmallDenseMap<VarDecl *, DSAInfo, 64> DeclSAMapTy;
86   typedef llvm::SmallDenseMap<VarDecl *, DeclRefExpr *, 64> AlignedMapTy;
87   typedef llvm::DenseSet<VarDecl *> LoopControlVariablesSetTy;
88 
89   struct SharingMapTy {
90     DeclSAMapTy SharingMap;
91     AlignedMapTy AlignedMap;
92     LoopControlVariablesSetTy LCVSet;
93     DefaultDataSharingAttributes DefaultAttr;
94     SourceLocation DefaultAttrLoc;
95     OpenMPDirectiveKind Directive;
96     DeclarationNameInfo DirectiveName;
97     Scope *CurScope;
98     SourceLocation ConstructLoc;
99     bool OrderedRegion;
100     bool NowaitRegion;
101     unsigned CollapseNumber;
102     SourceLocation InnerTeamsRegionLoc;
103     SharingMapTy(OpenMPDirectiveKind DKind, DeclarationNameInfo Name,
104                  Scope *CurScope, SourceLocation Loc)
105         : SharingMap(), AlignedMap(), LCVSet(), DefaultAttr(DSA_unspecified),
106           Directive(DKind), DirectiveName(std::move(Name)), CurScope(CurScope),
107           ConstructLoc(Loc), OrderedRegion(false), NowaitRegion(false),
108           CollapseNumber(1), InnerTeamsRegionLoc() {}
109     SharingMapTy()
110         : SharingMap(), AlignedMap(), LCVSet(), DefaultAttr(DSA_unspecified),
111           Directive(OMPD_unknown), DirectiveName(), CurScope(nullptr),
112           ConstructLoc(), OrderedRegion(false), NowaitRegion(false),
113           CollapseNumber(1), InnerTeamsRegionLoc() {}
114   };
115 
116   typedef SmallVector<SharingMapTy, 64> StackTy;
117 
118   /// \brief Stack of used declaration and their data-sharing attributes.
119   StackTy Stack;
120   /// \brief true, if check for DSA must be from parent directive, false, if
121   /// from current directive.
122   OpenMPClauseKind ClauseKindMode;
123   Sema &SemaRef;
124   bool ForceCapturing;
125 
126   typedef SmallVector<SharingMapTy, 8>::reverse_iterator reverse_iterator;
127 
128   DSAVarData getDSA(StackTy::reverse_iterator Iter, VarDecl *D);
129 
130   /// \brief Checks if the variable is a local for OpenMP region.
131   bool isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter);
132 
133 public:
134   explicit DSAStackTy(Sema &S)
135       : Stack(1), ClauseKindMode(OMPC_unknown), SemaRef(S),
136         ForceCapturing(false) {}
137 
138   bool isClauseParsingMode() const { return ClauseKindMode != OMPC_unknown; }
139   void setClauseParsingMode(OpenMPClauseKind K) { ClauseKindMode = K; }
140 
141   bool isForceVarCapturing() const { return ForceCapturing; }
142   void setForceVarCapturing(bool V) { ForceCapturing = V; }
143 
144   void push(OpenMPDirectiveKind DKind, const DeclarationNameInfo &DirName,
145             Scope *CurScope, SourceLocation Loc) {
146     Stack.push_back(SharingMapTy(DKind, DirName, CurScope, Loc));
147     Stack.back().DefaultAttrLoc = Loc;
148   }
149 
150   void pop() {
151     assert(Stack.size() > 1 && "Data-sharing attributes stack is empty!");
152     Stack.pop_back();
153   }
154 
155   /// \brief If 'aligned' declaration for given variable \a D was not seen yet,
156   /// add it and return NULL; otherwise return previous occurrence's expression
157   /// for diagnostics.
158   DeclRefExpr *addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE);
159 
160   /// \brief Register specified variable as loop control variable.
161   void addLoopControlVariable(VarDecl *D);
162   /// \brief Check if the specified variable is a loop control variable for
163   /// current region.
164   bool isLoopControlVariable(VarDecl *D);
165 
166   /// \brief Adds explicit data sharing attribute to the specified declaration.
167   void addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A);
168 
169   /// \brief Returns data sharing attributes from top of the stack for the
170   /// specified declaration.
171   DSAVarData getTopDSA(VarDecl *D, bool FromParent);
172   /// \brief Returns data-sharing attributes for the specified declaration.
173   DSAVarData getImplicitDSA(VarDecl *D, bool FromParent);
174   /// \brief Checks if the specified variables has data-sharing attributes which
175   /// match specified \a CPred predicate in any directive which matches \a DPred
176   /// predicate.
177   template <class ClausesPredicate, class DirectivesPredicate>
178   DSAVarData hasDSA(VarDecl *D, ClausesPredicate CPred,
179                     DirectivesPredicate DPred, bool FromParent);
180   /// \brief Checks if the specified variables has data-sharing attributes which
181   /// match specified \a CPred predicate in any innermost directive which
182   /// matches \a DPred predicate.
183   template <class ClausesPredicate, class DirectivesPredicate>
184   DSAVarData hasInnermostDSA(VarDecl *D, ClausesPredicate CPred,
185                              DirectivesPredicate DPred,
186                              bool FromParent);
187   /// \brief Checks if the specified variables has explicit data-sharing
188   /// attributes which match specified \a CPred predicate at the specified
189   /// OpenMP region.
190   bool hasExplicitDSA(VarDecl *D,
191                       const llvm::function_ref<bool(OpenMPClauseKind)> &CPred,
192                       unsigned Level);
193   /// \brief Finds a directive which matches specified \a DPred predicate.
194   template <class NamedDirectivesPredicate>
195   bool hasDirective(NamedDirectivesPredicate DPred, bool FromParent);
196 
197   /// \brief Returns currently analyzed directive.
198   OpenMPDirectiveKind getCurrentDirective() const {
199     return Stack.back().Directive;
200   }
201   /// \brief Returns parent directive.
202   OpenMPDirectiveKind getParentDirective() const {
203     if (Stack.size() > 2)
204       return Stack[Stack.size() - 2].Directive;
205     return OMPD_unknown;
206   }
207 
208   /// \brief Set default data sharing attribute to none.
209   void setDefaultDSANone(SourceLocation Loc) {
210     Stack.back().DefaultAttr = DSA_none;
211     Stack.back().DefaultAttrLoc = Loc;
212   }
213   /// \brief Set default data sharing attribute to shared.
214   void setDefaultDSAShared(SourceLocation Loc) {
215     Stack.back().DefaultAttr = DSA_shared;
216     Stack.back().DefaultAttrLoc = Loc;
217   }
218 
219   DefaultDataSharingAttributes getDefaultDSA() const {
220     return Stack.back().DefaultAttr;
221   }
222   SourceLocation getDefaultDSALocation() const {
223     return Stack.back().DefaultAttrLoc;
224   }
225 
226   /// \brief Checks if the specified variable is a threadprivate.
227   bool isThreadPrivate(VarDecl *D) {
228     DSAVarData DVar = getTopDSA(D, false);
229     return isOpenMPThreadPrivate(DVar.CKind);
230   }
231 
232   /// \brief Marks current region as ordered (it has an 'ordered' clause).
233   void setOrderedRegion(bool IsOrdered = true) {
234     Stack.back().OrderedRegion = IsOrdered;
235   }
236   /// \brief Returns true, if parent region is ordered (has associated
237   /// 'ordered' clause), false - otherwise.
238   bool isParentOrderedRegion() const {
239     if (Stack.size() > 2)
240       return Stack[Stack.size() - 2].OrderedRegion;
241     return false;
242   }
243   /// \brief Marks current region as nowait (it has a 'nowait' clause).
244   void setNowaitRegion(bool IsNowait = true) {
245     Stack.back().NowaitRegion = IsNowait;
246   }
247   /// \brief Returns true, if parent region is nowait (has associated
248   /// 'nowait' clause), false - otherwise.
249   bool isParentNowaitRegion() const {
250     if (Stack.size() > 2)
251       return Stack[Stack.size() - 2].NowaitRegion;
252     return false;
253   }
254 
255   /// \brief Set collapse value for the region.
256   void setCollapseNumber(unsigned Val) { Stack.back().CollapseNumber = Val; }
257   /// \brief Return collapse value for region.
258   unsigned getCollapseNumber() const {
259     return Stack.back().CollapseNumber;
260   }
261 
262   /// \brief Marks current target region as one with closely nested teams
263   /// region.
264   void setParentTeamsRegionLoc(SourceLocation TeamsRegionLoc) {
265     if (Stack.size() > 2)
266       Stack[Stack.size() - 2].InnerTeamsRegionLoc = TeamsRegionLoc;
267   }
268   /// \brief Returns true, if current region has closely nested teams region.
269   bool hasInnerTeamsRegion() const {
270     return getInnerTeamsRegionLoc().isValid();
271   }
272   /// \brief Returns location of the nested teams region (if any).
273   SourceLocation getInnerTeamsRegionLoc() const {
274     if (Stack.size() > 1)
275       return Stack.back().InnerTeamsRegionLoc;
276     return SourceLocation();
277   }
278 
279   Scope *getCurScope() const { return Stack.back().CurScope; }
280   Scope *getCurScope() { return Stack.back().CurScope; }
281   SourceLocation getConstructLoc() { return Stack.back().ConstructLoc; }
282 };
283 bool isParallelOrTaskRegion(OpenMPDirectiveKind DKind) {
284   return isOpenMPParallelDirective(DKind) || DKind == OMPD_task ||
285          isOpenMPTeamsDirective(DKind) || DKind == OMPD_unknown;
286 }
287 } // namespace
288 
289 DSAStackTy::DSAVarData DSAStackTy::getDSA(StackTy::reverse_iterator Iter,
290                                           VarDecl *D) {
291   D = D->getCanonicalDecl();
292   DSAVarData DVar;
293   if (Iter == std::prev(Stack.rend())) {
294     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
295     // in a region but not in construct]
296     //  File-scope or namespace-scope variables referenced in called routines
297     //  in the region are shared unless they appear in a threadprivate
298     //  directive.
299     if (!D->isFunctionOrMethodVarDecl() && !isa<ParmVarDecl>(D))
300       DVar.CKind = OMPC_shared;
301 
302     // OpenMP [2.9.1.2, Data-sharing Attribute Rules for Variables Referenced
303     // in a region but not in construct]
304     //  Variables with static storage duration that are declared in called
305     //  routines in the region are shared.
306     if (D->hasGlobalStorage())
307       DVar.CKind = OMPC_shared;
308 
309     return DVar;
310   }
311 
312   DVar.DKind = Iter->Directive;
313   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
314   // in a Construct, C/C++, predetermined, p.1]
315   // Variables with automatic storage duration that are declared in a scope
316   // inside the construct are private.
317   if (isOpenMPLocal(D, Iter) && D->isLocalVarDecl() &&
318       (D->getStorageClass() == SC_Auto || D->getStorageClass() == SC_None)) {
319     DVar.CKind = OMPC_private;
320     return DVar;
321   }
322 
323   // Explicitly specified attributes and local variables with predetermined
324   // attributes.
325   if (Iter->SharingMap.count(D)) {
326     DVar.RefExpr = Iter->SharingMap[D].RefExpr;
327     DVar.CKind = Iter->SharingMap[D].Attributes;
328     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
329     return DVar;
330   }
331 
332   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
333   // in a Construct, C/C++, implicitly determined, p.1]
334   //  In a parallel or task construct, the data-sharing attributes of these
335   //  variables are determined by the default clause, if present.
336   switch (Iter->DefaultAttr) {
337   case DSA_shared:
338     DVar.CKind = OMPC_shared;
339     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
340     return DVar;
341   case DSA_none:
342     return DVar;
343   case DSA_unspecified:
344     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
345     // in a Construct, implicitly determined, p.2]
346     //  In a parallel construct, if no default clause is present, these
347     //  variables are shared.
348     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
349     if (isOpenMPParallelDirective(DVar.DKind) ||
350         isOpenMPTeamsDirective(DVar.DKind)) {
351       DVar.CKind = OMPC_shared;
352       return DVar;
353     }
354 
355     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
356     // in a Construct, implicitly determined, p.4]
357     //  In a task construct, if no default clause is present, a variable that in
358     //  the enclosing context is determined to be shared by all implicit tasks
359     //  bound to the current team is shared.
360     if (DVar.DKind == OMPD_task) {
361       DSAVarData DVarTemp;
362       for (StackTy::reverse_iterator I = std::next(Iter), EE = Stack.rend();
363            I != EE; ++I) {
364         // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables
365         // Referenced
366         // in a Construct, implicitly determined, p.6]
367         //  In a task construct, if no default clause is present, a variable
368         //  whose data-sharing attribute is not determined by the rules above is
369         //  firstprivate.
370         DVarTemp = getDSA(I, D);
371         if (DVarTemp.CKind != OMPC_shared) {
372           DVar.RefExpr = nullptr;
373           DVar.DKind = OMPD_task;
374           DVar.CKind = OMPC_firstprivate;
375           return DVar;
376         }
377         if (isParallelOrTaskRegion(I->Directive))
378           break;
379       }
380       DVar.DKind = OMPD_task;
381       DVar.CKind =
382           (DVarTemp.CKind == OMPC_unknown) ? OMPC_firstprivate : OMPC_shared;
383       return DVar;
384     }
385   }
386   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
387   // in a Construct, implicitly determined, p.3]
388   //  For constructs other than task, if no default clause is present, these
389   //  variables inherit their data-sharing attributes from the enclosing
390   //  context.
391   return getDSA(std::next(Iter), D);
392 }
393 
394 DeclRefExpr *DSAStackTy::addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE) {
395   assert(Stack.size() > 1 && "Data sharing attributes stack is empty");
396   D = D->getCanonicalDecl();
397   auto It = Stack.back().AlignedMap.find(D);
398   if (It == Stack.back().AlignedMap.end()) {
399     assert(NewDE && "Unexpected nullptr expr to be added into aligned map");
400     Stack.back().AlignedMap[D] = NewDE;
401     return nullptr;
402   } else {
403     assert(It->second && "Unexpected nullptr expr in the aligned map");
404     return It->second;
405   }
406   return nullptr;
407 }
408 
409 void DSAStackTy::addLoopControlVariable(VarDecl *D) {
410   assert(Stack.size() > 1 && "Data-sharing attributes stack is empty");
411   D = D->getCanonicalDecl();
412   Stack.back().LCVSet.insert(D);
413 }
414 
415 bool DSAStackTy::isLoopControlVariable(VarDecl *D) {
416   assert(Stack.size() > 1 && "Data-sharing attributes stack is empty");
417   D = D->getCanonicalDecl();
418   return Stack.back().LCVSet.count(D) > 0;
419 }
420 
421 void DSAStackTy::addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A) {
422   D = D->getCanonicalDecl();
423   if (A == OMPC_threadprivate) {
424     Stack[0].SharingMap[D].Attributes = A;
425     Stack[0].SharingMap[D].RefExpr = E;
426   } else {
427     assert(Stack.size() > 1 && "Data-sharing attributes stack is empty");
428     Stack.back().SharingMap[D].Attributes = A;
429     Stack.back().SharingMap[D].RefExpr = E;
430   }
431 }
432 
433 bool DSAStackTy::isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter) {
434   D = D->getCanonicalDecl();
435   if (Stack.size() > 2) {
436     reverse_iterator I = Iter, E = std::prev(Stack.rend());
437     Scope *TopScope = nullptr;
438     while (I != E && !isParallelOrTaskRegion(I->Directive)) {
439       ++I;
440     }
441     if (I == E)
442       return false;
443     TopScope = I->CurScope ? I->CurScope->getParent() : nullptr;
444     Scope *CurScope = getCurScope();
445     while (CurScope != TopScope && !CurScope->isDeclScope(D)) {
446       CurScope = CurScope->getParent();
447     }
448     return CurScope != TopScope;
449   }
450   return false;
451 }
452 
453 /// \brief Build a variable declaration for OpenMP loop iteration variable.
454 static VarDecl *buildVarDecl(Sema &SemaRef, SourceLocation Loc, QualType Type,
455                              StringRef Name) {
456   DeclContext *DC = SemaRef.CurContext;
457   IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name);
458   TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
459   VarDecl *Decl =
460       VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type, TInfo, SC_None);
461   Decl->setImplicit();
462   return Decl;
463 }
464 
465 static DeclRefExpr *buildDeclRefExpr(Sema &S, VarDecl *D, QualType Ty,
466                                      SourceLocation Loc,
467                                      bool RefersToCapture = false) {
468   D->setReferenced();
469   D->markUsed(S.Context);
470   return DeclRefExpr::Create(S.getASTContext(), NestedNameSpecifierLoc(),
471                              SourceLocation(), D, RefersToCapture, Loc, Ty,
472                              VK_LValue);
473 }
474 
475 DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) {
476   D = D->getCanonicalDecl();
477   DSAVarData DVar;
478 
479   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
480   // in a Construct, C/C++, predetermined, p.1]
481   //  Variables appearing in threadprivate directives are threadprivate.
482   if ((D->getTLSKind() != VarDecl::TLS_None &&
483        !(D->hasAttr<OMPThreadPrivateDeclAttr>() &&
484          SemaRef.getLangOpts().OpenMPUseTLS &&
485          SemaRef.getASTContext().getTargetInfo().isTLSSupported())) ||
486       (D->getStorageClass() == SC_Register && D->hasAttr<AsmLabelAttr>() &&
487        !D->isLocalVarDecl())) {
488     addDSA(D, buildDeclRefExpr(SemaRef, D, D->getType().getNonReferenceType(),
489                                D->getLocation()),
490            OMPC_threadprivate);
491   }
492   if (Stack[0].SharingMap.count(D)) {
493     DVar.RefExpr = Stack[0].SharingMap[D].RefExpr;
494     DVar.CKind = OMPC_threadprivate;
495     return DVar;
496   }
497 
498   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
499   // in a Construct, C/C++, predetermined, p.1]
500   // Variables with automatic storage duration that are declared in a scope
501   // inside the construct are private.
502   OpenMPDirectiveKind Kind =
503       FromParent ? getParentDirective() : getCurrentDirective();
504   auto StartI = std::next(Stack.rbegin());
505   auto EndI = std::prev(Stack.rend());
506   if (FromParent && StartI != EndI) {
507     StartI = std::next(StartI);
508   }
509   if (!isParallelOrTaskRegion(Kind)) {
510     if (isOpenMPLocal(D, StartI) &&
511         ((D->isLocalVarDecl() && (D->getStorageClass() == SC_Auto ||
512                                   D->getStorageClass() == SC_None)) ||
513          isa<ParmVarDecl>(D))) {
514       DVar.CKind = OMPC_private;
515       return DVar;
516     }
517 
518     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
519     // in a Construct, C/C++, predetermined, p.4]
520     //  Static data members are shared.
521     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
522     // in a Construct, C/C++, predetermined, p.7]
523     //  Variables with static storage duration that are declared in a scope
524     //  inside the construct are shared.
525     if (D->isStaticDataMember() || D->isStaticLocal()) {
526       DSAVarData DVarTemp =
527           hasDSA(D, isOpenMPPrivate, MatchesAlways(), FromParent);
528       if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr)
529         return DVar;
530 
531       DVar.CKind = OMPC_shared;
532       return DVar;
533     }
534   }
535 
536   QualType Type = D->getType().getNonReferenceType().getCanonicalType();
537   bool IsConstant = Type.isConstant(SemaRef.getASTContext());
538   Type = SemaRef.getASTContext().getBaseElementType(Type);
539   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
540   // in a Construct, C/C++, predetermined, p.6]
541   //  Variables with const qualified type having no mutable member are
542   //  shared.
543   CXXRecordDecl *RD =
544       SemaRef.getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
545   if (IsConstant &&
546       !(SemaRef.getLangOpts().CPlusPlus && RD && RD->hasMutableFields())) {
547     // Variables with const-qualified type having no mutable member may be
548     // listed in a firstprivate clause, even if they are static data members.
549     DSAVarData DVarTemp = hasDSA(D, MatchesAnyClause(OMPC_firstprivate),
550                                  MatchesAlways(), FromParent);
551     if (DVarTemp.CKind == OMPC_firstprivate && DVarTemp.RefExpr)
552       return DVar;
553 
554     DVar.CKind = OMPC_shared;
555     return DVar;
556   }
557 
558   // Explicitly specified attributes and local variables with predetermined
559   // attributes.
560   auto I = std::prev(StartI);
561   if (I->SharingMap.count(D)) {
562     DVar.RefExpr = I->SharingMap[D].RefExpr;
563     DVar.CKind = I->SharingMap[D].Attributes;
564     DVar.ImplicitDSALoc = I->DefaultAttrLoc;
565   }
566 
567   return DVar;
568 }
569 
570 DSAStackTy::DSAVarData DSAStackTy::getImplicitDSA(VarDecl *D, bool FromParent) {
571   D = D->getCanonicalDecl();
572   auto StartI = Stack.rbegin();
573   auto EndI = std::prev(Stack.rend());
574   if (FromParent && StartI != EndI) {
575     StartI = std::next(StartI);
576   }
577   return getDSA(StartI, D);
578 }
579 
580 template <class ClausesPredicate, class DirectivesPredicate>
581 DSAStackTy::DSAVarData DSAStackTy::hasDSA(VarDecl *D, ClausesPredicate CPred,
582                                           DirectivesPredicate DPred,
583                                           bool FromParent) {
584   D = D->getCanonicalDecl();
585   auto StartI = std::next(Stack.rbegin());
586   auto EndI = std::prev(Stack.rend());
587   if (FromParent && StartI != EndI) {
588     StartI = std::next(StartI);
589   }
590   for (auto I = StartI, EE = EndI; I != EE; ++I) {
591     if (!DPred(I->Directive) && !isParallelOrTaskRegion(I->Directive))
592       continue;
593     DSAVarData DVar = getDSA(I, D);
594     if (CPred(DVar.CKind))
595       return DVar;
596   }
597   return DSAVarData();
598 }
599 
600 template <class ClausesPredicate, class DirectivesPredicate>
601 DSAStackTy::DSAVarData
602 DSAStackTy::hasInnermostDSA(VarDecl *D, ClausesPredicate CPred,
603                             DirectivesPredicate DPred, bool FromParent) {
604   D = D->getCanonicalDecl();
605   auto StartI = std::next(Stack.rbegin());
606   auto EndI = std::prev(Stack.rend());
607   if (FromParent && StartI != EndI) {
608     StartI = std::next(StartI);
609   }
610   for (auto I = StartI, EE = EndI; I != EE; ++I) {
611     if (!DPred(I->Directive))
612       break;
613     DSAVarData DVar = getDSA(I, D);
614     if (CPred(DVar.CKind))
615       return DVar;
616     return DSAVarData();
617   }
618   return DSAVarData();
619 }
620 
621 bool DSAStackTy::hasExplicitDSA(
622     VarDecl *D, const llvm::function_ref<bool(OpenMPClauseKind)> &CPred,
623     unsigned Level) {
624   if (CPred(ClauseKindMode))
625     return true;
626   if (isClauseParsingMode())
627     ++Level;
628   D = D->getCanonicalDecl();
629   auto StartI = Stack.rbegin();
630   auto EndI = std::prev(Stack.rend());
631   if (std::distance(StartI, EndI) <= (int)Level)
632     return false;
633   std::advance(StartI, Level);
634   return (StartI->SharingMap.count(D) > 0) && StartI->SharingMap[D].RefExpr &&
635          CPred(StartI->SharingMap[D].Attributes);
636 }
637 
638 template <class NamedDirectivesPredicate>
639 bool DSAStackTy::hasDirective(NamedDirectivesPredicate DPred, bool FromParent) {
640   auto StartI = std::next(Stack.rbegin());
641   auto EndI = std::prev(Stack.rend());
642   if (FromParent && StartI != EndI) {
643     StartI = std::next(StartI);
644   }
645   for (auto I = StartI, EE = EndI; I != EE; ++I) {
646     if (DPred(I->Directive, I->DirectiveName, I->ConstructLoc))
647       return true;
648   }
649   return false;
650 }
651 
652 void Sema::InitDataSharingAttributesStack() {
653   VarDataSharingAttributesStack = new DSAStackTy(*this);
654 }
655 
656 #define DSAStack static_cast<DSAStackTy *>(VarDataSharingAttributesStack)
657 
658 bool Sema::IsOpenMPCapturedVar(VarDecl *VD) {
659   assert(LangOpts.OpenMP && "OpenMP is not allowed");
660   VD = VD->getCanonicalDecl();
661   if (DSAStack->getCurrentDirective() != OMPD_unknown &&
662       (!DSAStack->isClauseParsingMode() ||
663        DSAStack->getParentDirective() != OMPD_unknown)) {
664     if (DSAStack->isLoopControlVariable(VD) ||
665         (VD->hasLocalStorage() &&
666          isParallelOrTaskRegion(DSAStack->getCurrentDirective())) ||
667         DSAStack->isForceVarCapturing())
668       return true;
669     auto DVarPrivate = DSAStack->getTopDSA(VD, DSAStack->isClauseParsingMode());
670     if (DVarPrivate.CKind != OMPC_unknown && isOpenMPPrivate(DVarPrivate.CKind))
671       return true;
672     DVarPrivate = DSAStack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(),
673                                    DSAStack->isClauseParsingMode());
674     return DVarPrivate.CKind != OMPC_unknown;
675   }
676   return false;
677 }
678 
679 bool Sema::isOpenMPPrivateVar(VarDecl *VD, unsigned Level) {
680   assert(LangOpts.OpenMP && "OpenMP is not allowed");
681   return DSAStack->hasExplicitDSA(
682       VD, [](OpenMPClauseKind K) -> bool { return K == OMPC_private; }, Level);
683 }
684 
685 void Sema::DestroyDataSharingAttributesStack() { delete DSAStack; }
686 
687 void Sema::StartOpenMPDSABlock(OpenMPDirectiveKind DKind,
688                                const DeclarationNameInfo &DirName,
689                                Scope *CurScope, SourceLocation Loc) {
690   DSAStack->push(DKind, DirName, CurScope, Loc);
691   PushExpressionEvaluationContext(PotentiallyEvaluated);
692 }
693 
694 void Sema::StartOpenMPClause(OpenMPClauseKind K) {
695   DSAStack->setClauseParsingMode(K);
696 }
697 
698 void Sema::EndOpenMPClause() {
699   DSAStack->setClauseParsingMode(/*K=*/OMPC_unknown);
700 }
701 
702 void Sema::EndOpenMPDSABlock(Stmt *CurDirective) {
703   // OpenMP [2.14.3.5, Restrictions, C/C++, p.1]
704   //  A variable of class type (or array thereof) that appears in a lastprivate
705   //  clause requires an accessible, unambiguous default constructor for the
706   //  class type, unless the list item is also specified in a firstprivate
707   //  clause.
708   if (auto D = dyn_cast_or_null<OMPExecutableDirective>(CurDirective)) {
709     for (auto *C : D->clauses()) {
710       if (auto *Clause = dyn_cast<OMPLastprivateClause>(C)) {
711         SmallVector<Expr *, 8> PrivateCopies;
712         for (auto *DE : Clause->varlists()) {
713           if (DE->isValueDependent() || DE->isTypeDependent()) {
714             PrivateCopies.push_back(nullptr);
715             continue;
716           }
717           auto *VD = cast<VarDecl>(cast<DeclRefExpr>(DE)->getDecl());
718           QualType Type = VD->getType().getNonReferenceType();
719           auto DVar = DSAStack->getTopDSA(VD, false);
720           if (DVar.CKind == OMPC_lastprivate) {
721             // Generate helper private variable and initialize it with the
722             // default value. The address of the original variable is replaced
723             // by the address of the new private variable in CodeGen. This new
724             // variable is not added to IdResolver, so the code in the OpenMP
725             // region uses original variable for proper diagnostics.
726             auto *VDPrivate =
727                 buildVarDecl(*this, DE->getExprLoc(), Type.getUnqualifiedType(),
728                              VD->getName());
729             ActOnUninitializedDecl(VDPrivate, /*TypeMayContainAuto=*/false);
730             if (VDPrivate->isInvalidDecl())
731               continue;
732             PrivateCopies.push_back(buildDeclRefExpr(
733                 *this, VDPrivate, DE->getType(), DE->getExprLoc()));
734           } else {
735             // The variable is also a firstprivate, so initialization sequence
736             // for private copy is generated already.
737             PrivateCopies.push_back(nullptr);
738           }
739         }
740         // Set initializers to private copies if no errors were found.
741         if (PrivateCopies.size() == Clause->varlist_size()) {
742           Clause->setPrivateCopies(PrivateCopies);
743         }
744       }
745     }
746   }
747 
748   DSAStack->pop();
749   DiscardCleanupsInEvaluationContext();
750   PopExpressionEvaluationContext();
751 }
752 
753 static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
754                                      Expr *NumIterations, Sema &SemaRef,
755                                      Scope *S);
756 
757 namespace {
758 
759 class VarDeclFilterCCC : public CorrectionCandidateCallback {
760 private:
761   Sema &SemaRef;
762 
763 public:
764   explicit VarDeclFilterCCC(Sema &S) : SemaRef(S) {}
765   bool ValidateCandidate(const TypoCorrection &Candidate) override {
766     NamedDecl *ND = Candidate.getCorrectionDecl();
767     if (VarDecl *VD = dyn_cast_or_null<VarDecl>(ND)) {
768       return VD->hasGlobalStorage() &&
769              SemaRef.isDeclInScope(ND, SemaRef.getCurLexicalContext(),
770                                    SemaRef.getCurScope());
771     }
772     return false;
773   }
774 };
775 } // namespace
776 
777 ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope,
778                                          CXXScopeSpec &ScopeSpec,
779                                          const DeclarationNameInfo &Id) {
780   LookupResult Lookup(*this, Id, LookupOrdinaryName);
781   LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
782 
783   if (Lookup.isAmbiguous())
784     return ExprError();
785 
786   VarDecl *VD;
787   if (!Lookup.isSingleResult()) {
788     if (TypoCorrection Corrected = CorrectTypo(
789             Id, LookupOrdinaryName, CurScope, nullptr,
790             llvm::make_unique<VarDeclFilterCCC>(*this), CTK_ErrorRecovery)) {
791       diagnoseTypo(Corrected,
792                    PDiag(Lookup.empty()
793                              ? diag::err_undeclared_var_use_suggest
794                              : diag::err_omp_expected_var_arg_suggest)
795                        << Id.getName());
796       VD = Corrected.getCorrectionDeclAs<VarDecl>();
797     } else {
798       Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use
799                                        : diag::err_omp_expected_var_arg)
800           << Id.getName();
801       return ExprError();
802     }
803   } else {
804     if (!(VD = Lookup.getAsSingle<VarDecl>())) {
805       Diag(Id.getLoc(), diag::err_omp_expected_var_arg) << Id.getName();
806       Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at);
807       return ExprError();
808     }
809   }
810   Lookup.suppressDiagnostics();
811 
812   // OpenMP [2.9.2, Syntax, C/C++]
813   //   Variables must be file-scope, namespace-scope, or static block-scope.
814   if (!VD->hasGlobalStorage()) {
815     Diag(Id.getLoc(), diag::err_omp_global_var_arg)
816         << getOpenMPDirectiveName(OMPD_threadprivate) << !VD->isStaticLocal();
817     bool IsDecl =
818         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
819     Diag(VD->getLocation(),
820          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
821         << VD;
822     return ExprError();
823   }
824 
825   VarDecl *CanonicalVD = VD->getCanonicalDecl();
826   NamedDecl *ND = cast<NamedDecl>(CanonicalVD);
827   // OpenMP [2.9.2, Restrictions, C/C++, p.2]
828   //   A threadprivate directive for file-scope variables must appear outside
829   //   any definition or declaration.
830   if (CanonicalVD->getDeclContext()->isTranslationUnit() &&
831       !getCurLexicalContext()->isTranslationUnit()) {
832     Diag(Id.getLoc(), diag::err_omp_var_scope)
833         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
834     bool IsDecl =
835         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
836     Diag(VD->getLocation(),
837          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
838         << VD;
839     return ExprError();
840   }
841   // OpenMP [2.9.2, Restrictions, C/C++, p.3]
842   //   A threadprivate directive for static class member variables must appear
843   //   in the class definition, in the same scope in which the member
844   //   variables are declared.
845   if (CanonicalVD->isStaticDataMember() &&
846       !CanonicalVD->getDeclContext()->Equals(getCurLexicalContext())) {
847     Diag(Id.getLoc(), diag::err_omp_var_scope)
848         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
849     bool IsDecl =
850         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
851     Diag(VD->getLocation(),
852          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
853         << VD;
854     return ExprError();
855   }
856   // OpenMP [2.9.2, Restrictions, C/C++, p.4]
857   //   A threadprivate directive for namespace-scope variables must appear
858   //   outside any definition or declaration other than the namespace
859   //   definition itself.
860   if (CanonicalVD->getDeclContext()->isNamespace() &&
861       (!getCurLexicalContext()->isFileContext() ||
862        !getCurLexicalContext()->Encloses(CanonicalVD->getDeclContext()))) {
863     Diag(Id.getLoc(), diag::err_omp_var_scope)
864         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
865     bool IsDecl =
866         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
867     Diag(VD->getLocation(),
868          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
869         << VD;
870     return ExprError();
871   }
872   // OpenMP [2.9.2, Restrictions, C/C++, p.6]
873   //   A threadprivate directive for static block-scope variables must appear
874   //   in the scope of the variable and not in a nested scope.
875   if (CanonicalVD->isStaticLocal() && CurScope &&
876       !isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
877     Diag(Id.getLoc(), diag::err_omp_var_scope)
878         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
879     bool IsDecl =
880         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
881     Diag(VD->getLocation(),
882          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
883         << VD;
884     return ExprError();
885   }
886 
887   // OpenMP [2.9.2, Restrictions, C/C++, p.2-6]
888   //   A threadprivate directive must lexically precede all references to any
889   //   of the variables in its list.
890   if (VD->isUsed() && !DSAStack->isThreadPrivate(VD)) {
891     Diag(Id.getLoc(), diag::err_omp_var_used)
892         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
893     return ExprError();
894   }
895 
896   QualType ExprType = VD->getType().getNonReferenceType();
897   ExprResult DE = buildDeclRefExpr(*this, VD, ExprType, Id.getLoc());
898   return DE;
899 }
900 
901 Sema::DeclGroupPtrTy
902 Sema::ActOnOpenMPThreadprivateDirective(SourceLocation Loc,
903                                         ArrayRef<Expr *> VarList) {
904   if (OMPThreadPrivateDecl *D = CheckOMPThreadPrivateDecl(Loc, VarList)) {
905     CurContext->addDecl(D);
906     return DeclGroupPtrTy::make(DeclGroupRef(D));
907   }
908   return DeclGroupPtrTy();
909 }
910 
911 namespace {
912 class LocalVarRefChecker : public ConstStmtVisitor<LocalVarRefChecker, bool> {
913   Sema &SemaRef;
914 
915 public:
916   bool VisitDeclRefExpr(const DeclRefExpr *E) {
917     if (auto VD = dyn_cast<VarDecl>(E->getDecl())) {
918       if (VD->hasLocalStorage()) {
919         SemaRef.Diag(E->getLocStart(),
920                      diag::err_omp_local_var_in_threadprivate_init)
921             << E->getSourceRange();
922         SemaRef.Diag(VD->getLocation(), diag::note_defined_here)
923             << VD << VD->getSourceRange();
924         return true;
925       }
926     }
927     return false;
928   }
929   bool VisitStmt(const Stmt *S) {
930     for (auto Child : S->children()) {
931       if (Child && Visit(Child))
932         return true;
933     }
934     return false;
935   }
936   explicit LocalVarRefChecker(Sema &SemaRef) : SemaRef(SemaRef) {}
937 };
938 } // namespace
939 
940 OMPThreadPrivateDecl *
941 Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {
942   SmallVector<Expr *, 8> Vars;
943   for (auto &RefExpr : VarList) {
944     DeclRefExpr *DE = cast<DeclRefExpr>(RefExpr);
945     VarDecl *VD = cast<VarDecl>(DE->getDecl());
946     SourceLocation ILoc = DE->getExprLoc();
947 
948     QualType QType = VD->getType();
949     if (QType->isDependentType() || QType->isInstantiationDependentType()) {
950       // It will be analyzed later.
951       Vars.push_back(DE);
952       continue;
953     }
954 
955     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
956     //   A threadprivate variable must not have an incomplete type.
957     if (RequireCompleteType(ILoc, VD->getType(),
958                             diag::err_omp_threadprivate_incomplete_type)) {
959       continue;
960     }
961 
962     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
963     //   A threadprivate variable must not have a reference type.
964     if (VD->getType()->isReferenceType()) {
965       Diag(ILoc, diag::err_omp_ref_type_arg)
966           << getOpenMPDirectiveName(OMPD_threadprivate) << VD->getType();
967       bool IsDecl =
968           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
969       Diag(VD->getLocation(),
970            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
971           << VD;
972       continue;
973     }
974 
975     // Check if this is a TLS variable. If TLS is not being supported, produce
976     // the corresponding diagnostic.
977     if ((VD->getTLSKind() != VarDecl::TLS_None &&
978          !(VD->hasAttr<OMPThreadPrivateDeclAttr>() &&
979            getLangOpts().OpenMPUseTLS &&
980            getASTContext().getTargetInfo().isTLSSupported())) ||
981         (VD->getStorageClass() == SC_Register && VD->hasAttr<AsmLabelAttr>() &&
982          !VD->isLocalVarDecl())) {
983       Diag(ILoc, diag::err_omp_var_thread_local)
984           << VD << ((VD->getTLSKind() != VarDecl::TLS_None) ? 0 : 1);
985       bool IsDecl =
986           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
987       Diag(VD->getLocation(),
988            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
989           << VD;
990       continue;
991     }
992 
993     // Check if initial value of threadprivate variable reference variable with
994     // local storage (it is not supported by runtime).
995     if (auto Init = VD->getAnyInitializer()) {
996       LocalVarRefChecker Checker(*this);
997       if (Checker.Visit(Init))
998         continue;
999     }
1000 
1001     Vars.push_back(RefExpr);
1002     DSAStack->addDSA(VD, DE, OMPC_threadprivate);
1003     VD->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(
1004         Context, SourceRange(Loc, Loc)));
1005     if (auto *ML = Context.getASTMutationListener())
1006       ML->DeclarationMarkedOpenMPThreadPrivate(VD);
1007   }
1008   OMPThreadPrivateDecl *D = nullptr;
1009   if (!Vars.empty()) {
1010     D = OMPThreadPrivateDecl::Create(Context, getCurLexicalContext(), Loc,
1011                                      Vars);
1012     D->setAccess(AS_public);
1013   }
1014   return D;
1015 }
1016 
1017 static void ReportOriginalDSA(Sema &SemaRef, DSAStackTy *Stack,
1018                               const VarDecl *VD, DSAStackTy::DSAVarData DVar,
1019                               bool IsLoopIterVar = false) {
1020   if (DVar.RefExpr) {
1021     SemaRef.Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_explicit_dsa)
1022         << getOpenMPClauseName(DVar.CKind);
1023     return;
1024   }
1025   enum {
1026     PDSA_StaticMemberShared,
1027     PDSA_StaticLocalVarShared,
1028     PDSA_LoopIterVarPrivate,
1029     PDSA_LoopIterVarLinear,
1030     PDSA_LoopIterVarLastprivate,
1031     PDSA_ConstVarShared,
1032     PDSA_GlobalVarShared,
1033     PDSA_TaskVarFirstprivate,
1034     PDSA_LocalVarPrivate,
1035     PDSA_Implicit
1036   } Reason = PDSA_Implicit;
1037   bool ReportHint = false;
1038   auto ReportLoc = VD->getLocation();
1039   if (IsLoopIterVar) {
1040     if (DVar.CKind == OMPC_private)
1041       Reason = PDSA_LoopIterVarPrivate;
1042     else if (DVar.CKind == OMPC_lastprivate)
1043       Reason = PDSA_LoopIterVarLastprivate;
1044     else
1045       Reason = PDSA_LoopIterVarLinear;
1046   } else if (DVar.DKind == OMPD_task && DVar.CKind == OMPC_firstprivate) {
1047     Reason = PDSA_TaskVarFirstprivate;
1048     ReportLoc = DVar.ImplicitDSALoc;
1049   } else if (VD->isStaticLocal())
1050     Reason = PDSA_StaticLocalVarShared;
1051   else if (VD->isStaticDataMember())
1052     Reason = PDSA_StaticMemberShared;
1053   else if (VD->isFileVarDecl())
1054     Reason = PDSA_GlobalVarShared;
1055   else if (VD->getType().isConstant(SemaRef.getASTContext()))
1056     Reason = PDSA_ConstVarShared;
1057   else if (VD->isLocalVarDecl() && DVar.CKind == OMPC_private) {
1058     ReportHint = true;
1059     Reason = PDSA_LocalVarPrivate;
1060   }
1061   if (Reason != PDSA_Implicit) {
1062     SemaRef.Diag(ReportLoc, diag::note_omp_predetermined_dsa)
1063         << Reason << ReportHint
1064         << getOpenMPDirectiveName(Stack->getCurrentDirective());
1065   } else if (DVar.ImplicitDSALoc.isValid()) {
1066     SemaRef.Diag(DVar.ImplicitDSALoc, diag::note_omp_implicit_dsa)
1067         << getOpenMPClauseName(DVar.CKind);
1068   }
1069 }
1070 
1071 namespace {
1072 class DSAAttrChecker : public StmtVisitor<DSAAttrChecker, void> {
1073   DSAStackTy *Stack;
1074   Sema &SemaRef;
1075   bool ErrorFound;
1076   CapturedStmt *CS;
1077   llvm::SmallVector<Expr *, 8> ImplicitFirstprivate;
1078   llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA;
1079 
1080 public:
1081   void VisitDeclRefExpr(DeclRefExpr *E) {
1082     if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
1083       // Skip internally declared variables.
1084       if (VD->isLocalVarDecl() && !CS->capturesVariable(VD))
1085         return;
1086 
1087       auto DVar = Stack->getTopDSA(VD, false);
1088       // Check if the variable has explicit DSA set and stop analysis if it so.
1089       if (DVar.RefExpr) return;
1090 
1091       auto ELoc = E->getExprLoc();
1092       auto DKind = Stack->getCurrentDirective();
1093       // The default(none) clause requires that each variable that is referenced
1094       // in the construct, and does not have a predetermined data-sharing
1095       // attribute, must have its data-sharing attribute explicitly determined
1096       // by being listed in a data-sharing attribute clause.
1097       if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none &&
1098           isParallelOrTaskRegion(DKind) &&
1099           VarsWithInheritedDSA.count(VD) == 0) {
1100         VarsWithInheritedDSA[VD] = E;
1101         return;
1102       }
1103 
1104       // OpenMP [2.9.3.6, Restrictions, p.2]
1105       //  A list item that appears in a reduction clause of the innermost
1106       //  enclosing worksharing or parallel construct may not be accessed in an
1107       //  explicit task.
1108       DVar = Stack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction),
1109                                     [](OpenMPDirectiveKind K) -> bool {
1110                                       return isOpenMPParallelDirective(K) ||
1111                                              isOpenMPWorksharingDirective(K) ||
1112                                              isOpenMPTeamsDirective(K);
1113                                     },
1114                                     false);
1115       if (DKind == OMPD_task && DVar.CKind == OMPC_reduction) {
1116         ErrorFound = true;
1117         SemaRef.Diag(ELoc, diag::err_omp_reduction_in_task);
1118         ReportOriginalDSA(SemaRef, Stack, VD, DVar);
1119         return;
1120       }
1121 
1122       // Define implicit data-sharing attributes for task.
1123       DVar = Stack->getImplicitDSA(VD, false);
1124       if (DKind == OMPD_task && DVar.CKind != OMPC_shared)
1125         ImplicitFirstprivate.push_back(E);
1126     }
1127   }
1128   void VisitOMPExecutableDirective(OMPExecutableDirective *S) {
1129     for (auto *C : S->clauses()) {
1130       // Skip analysis of arguments of implicitly defined firstprivate clause
1131       // for task directives.
1132       if (C && (!isa<OMPFirstprivateClause>(C) || C->getLocStart().isValid()))
1133         for (auto *CC : C->children()) {
1134           if (CC)
1135             Visit(CC);
1136         }
1137     }
1138   }
1139   void VisitStmt(Stmt *S) {
1140     for (auto *C : S->children()) {
1141       if (C && !isa<OMPExecutableDirective>(C))
1142         Visit(C);
1143     }
1144   }
1145 
1146   bool isErrorFound() { return ErrorFound; }
1147   ArrayRef<Expr *> getImplicitFirstprivate() { return ImplicitFirstprivate; }
1148   llvm::DenseMap<VarDecl *, Expr *> &getVarsWithInheritedDSA() {
1149     return VarsWithInheritedDSA;
1150   }
1151 
1152   DSAAttrChecker(DSAStackTy *S, Sema &SemaRef, CapturedStmt *CS)
1153       : Stack(S), SemaRef(SemaRef), ErrorFound(false), CS(CS) {}
1154 };
1155 } // namespace
1156 
1157 void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) {
1158   switch (DKind) {
1159   case OMPD_parallel: {
1160     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1161     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1162     Sema::CapturedParamNameType Params[] = {
1163         std::make_pair(".global_tid.", KmpInt32PtrTy),
1164         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1165         std::make_pair(StringRef(), QualType()) // __context with shared vars
1166     };
1167     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1168                              Params);
1169     break;
1170   }
1171   case OMPD_simd: {
1172     Sema::CapturedParamNameType Params[] = {
1173         std::make_pair(StringRef(), QualType()) // __context with shared vars
1174     };
1175     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1176                              Params);
1177     break;
1178   }
1179   case OMPD_for: {
1180     Sema::CapturedParamNameType Params[] = {
1181         std::make_pair(StringRef(), QualType()) // __context with shared vars
1182     };
1183     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1184                              Params);
1185     break;
1186   }
1187   case OMPD_for_simd: {
1188     Sema::CapturedParamNameType Params[] = {
1189         std::make_pair(StringRef(), QualType()) // __context with shared vars
1190     };
1191     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1192                              Params);
1193     break;
1194   }
1195   case OMPD_sections: {
1196     Sema::CapturedParamNameType Params[] = {
1197         std::make_pair(StringRef(), QualType()) // __context with shared vars
1198     };
1199     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1200                              Params);
1201     break;
1202   }
1203   case OMPD_section: {
1204     Sema::CapturedParamNameType Params[] = {
1205         std::make_pair(StringRef(), QualType()) // __context with shared vars
1206     };
1207     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1208                              Params);
1209     break;
1210   }
1211   case OMPD_single: {
1212     Sema::CapturedParamNameType Params[] = {
1213         std::make_pair(StringRef(), QualType()) // __context with shared vars
1214     };
1215     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1216                              Params);
1217     break;
1218   }
1219   case OMPD_master: {
1220     Sema::CapturedParamNameType Params[] = {
1221         std::make_pair(StringRef(), QualType()) // __context with shared vars
1222     };
1223     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1224                              Params);
1225     break;
1226   }
1227   case OMPD_critical: {
1228     Sema::CapturedParamNameType Params[] = {
1229         std::make_pair(StringRef(), QualType()) // __context with shared vars
1230     };
1231     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1232                              Params);
1233     break;
1234   }
1235   case OMPD_parallel_for: {
1236     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1237     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1238     Sema::CapturedParamNameType Params[] = {
1239         std::make_pair(".global_tid.", KmpInt32PtrTy),
1240         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1241         std::make_pair(StringRef(), QualType()) // __context with shared vars
1242     };
1243     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1244                              Params);
1245     break;
1246   }
1247   case OMPD_parallel_for_simd: {
1248     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1249     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1250     Sema::CapturedParamNameType Params[] = {
1251         std::make_pair(".global_tid.", KmpInt32PtrTy),
1252         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1253         std::make_pair(StringRef(), QualType()) // __context with shared vars
1254     };
1255     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1256                              Params);
1257     break;
1258   }
1259   case OMPD_parallel_sections: {
1260     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1261     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1262     Sema::CapturedParamNameType Params[] = {
1263         std::make_pair(".global_tid.", KmpInt32PtrTy),
1264         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1265         std::make_pair(StringRef(), QualType()) // __context with shared vars
1266     };
1267     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1268                              Params);
1269     break;
1270   }
1271   case OMPD_task: {
1272     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1273     QualType Args[] = {Context.VoidPtrTy.withConst().withRestrict()};
1274     FunctionProtoType::ExtProtoInfo EPI;
1275     EPI.Variadic = true;
1276     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
1277     Sema::CapturedParamNameType Params[] = {
1278         std::make_pair(".global_tid.", KmpInt32Ty),
1279         std::make_pair(".part_id.", KmpInt32Ty),
1280         std::make_pair(".privates.",
1281                        Context.VoidPtrTy.withConst().withRestrict()),
1282         std::make_pair(
1283             ".copy_fn.",
1284             Context.getPointerType(CopyFnType).withConst().withRestrict()),
1285         std::make_pair(StringRef(), QualType()) // __context with shared vars
1286     };
1287     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1288                              Params);
1289     // Mark this captured region as inlined, because we don't use outlined
1290     // function directly.
1291     getCurCapturedRegion()->TheCapturedDecl->addAttr(
1292         AlwaysInlineAttr::CreateImplicit(
1293             Context, AlwaysInlineAttr::Keyword_forceinline, SourceRange()));
1294     break;
1295   }
1296   case OMPD_ordered: {
1297     Sema::CapturedParamNameType Params[] = {
1298         std::make_pair(StringRef(), QualType()) // __context with shared vars
1299     };
1300     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1301                              Params);
1302     break;
1303   }
1304   case OMPD_atomic: {
1305     Sema::CapturedParamNameType Params[] = {
1306         std::make_pair(StringRef(), QualType()) // __context with shared vars
1307     };
1308     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1309                              Params);
1310     break;
1311   }
1312   case OMPD_target_data:
1313   case OMPD_target: {
1314     Sema::CapturedParamNameType Params[] = {
1315         std::make_pair(StringRef(), QualType()) // __context with shared vars
1316     };
1317     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1318                              Params);
1319     break;
1320   }
1321   case OMPD_teams: {
1322     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1323     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1324     Sema::CapturedParamNameType Params[] = {
1325         std::make_pair(".global_tid.", KmpInt32PtrTy),
1326         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1327         std::make_pair(StringRef(), QualType()) // __context with shared vars
1328     };
1329     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1330                              Params);
1331     break;
1332   }
1333   case OMPD_taskgroup: {
1334     Sema::CapturedParamNameType Params[] = {
1335         std::make_pair(StringRef(), QualType()) // __context with shared vars
1336     };
1337     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1338                              Params);
1339     break;
1340   }
1341   case OMPD_threadprivate:
1342   case OMPD_taskyield:
1343   case OMPD_barrier:
1344   case OMPD_taskwait:
1345   case OMPD_cancellation_point:
1346   case OMPD_cancel:
1347   case OMPD_flush:
1348     llvm_unreachable("OpenMP Directive is not allowed");
1349   case OMPD_unknown:
1350     llvm_unreachable("Unknown OpenMP directive");
1351   }
1352 }
1353 
1354 StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
1355                                       ArrayRef<OMPClause *> Clauses) {
1356   if (!S.isUsable()) {
1357     ActOnCapturedRegionError();
1358     return StmtError();
1359   }
1360   // This is required for proper codegen.
1361   for (auto *Clause : Clauses) {
1362     if (isOpenMPPrivate(Clause->getClauseKind()) ||
1363         Clause->getClauseKind() == OMPC_copyprivate ||
1364         (getLangOpts().OpenMPUseTLS &&
1365          getASTContext().getTargetInfo().isTLSSupported() &&
1366          Clause->getClauseKind() == OMPC_copyin)) {
1367       DSAStack->setForceVarCapturing(Clause->getClauseKind() == OMPC_copyin);
1368       // Mark all variables in private list clauses as used in inner region.
1369       for (auto *VarRef : Clause->children()) {
1370         if (auto *E = cast_or_null<Expr>(VarRef)) {
1371           MarkDeclarationsReferencedInExpr(E);
1372         }
1373       }
1374       DSAStack->setForceVarCapturing(/*V=*/false);
1375     } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) &&
1376                Clause->getClauseKind() == OMPC_schedule) {
1377       // Mark all variables in private list clauses as used in inner region.
1378       // Required for proper codegen of combined directives.
1379       // TODO: add processing for other clauses.
1380       if (auto *E = cast_or_null<Expr>(
1381               cast<OMPScheduleClause>(Clause)->getHelperChunkSize())) {
1382           MarkDeclarationsReferencedInExpr(E);
1383         }
1384     }
1385   }
1386   return ActOnCapturedRegionEnd(S.get());
1387 }
1388 
1389 static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
1390                                   OpenMPDirectiveKind CurrentRegion,
1391                                   const DeclarationNameInfo &CurrentName,
1392                                   OpenMPDirectiveKind CancelRegion,
1393                                   SourceLocation StartLoc) {
1394   // Allowed nesting of constructs
1395   // +------------------+-----------------+------------------------------------+
1396   // | Parent directive | Child directive | Closely (!), No-Closely(+), Both(*)|
1397   // +------------------+-----------------+------------------------------------+
1398   // | parallel         | parallel        | *                                  |
1399   // | parallel         | for             | *                                  |
1400   // | parallel         | for simd        | *                                  |
1401   // | parallel         | master          | *                                  |
1402   // | parallel         | critical        | *                                  |
1403   // | parallel         | simd            | *                                  |
1404   // | parallel         | sections        | *                                  |
1405   // | parallel         | section         | +                                  |
1406   // | parallel         | single          | *                                  |
1407   // | parallel         | parallel for    | *                                  |
1408   // | parallel         |parallel for simd| *                                  |
1409   // | parallel         |parallel sections| *                                  |
1410   // | parallel         | task            | *                                  |
1411   // | parallel         | taskyield       | *                                  |
1412   // | parallel         | barrier         | *                                  |
1413   // | parallel         | taskwait        | *                                  |
1414   // | parallel         | taskgroup       | *                                  |
1415   // | parallel         | flush           | *                                  |
1416   // | parallel         | ordered         | +                                  |
1417   // | parallel         | atomic          | *                                  |
1418   // | parallel         | target          | *                                  |
1419   // | parallel         | teams           | +                                  |
1420   // | parallel         | cancellation    |                                    |
1421   // |                  | point           | !                                  |
1422   // | parallel         | cancel          | !                                  |
1423   // +------------------+-----------------+------------------------------------+
1424   // | for              | parallel        | *                                  |
1425   // | for              | for             | +                                  |
1426   // | for              | for simd        | +                                  |
1427   // | for              | master          | +                                  |
1428   // | for              | critical        | *                                  |
1429   // | for              | simd            | *                                  |
1430   // | for              | sections        | +                                  |
1431   // | for              | section         | +                                  |
1432   // | for              | single          | +                                  |
1433   // | for              | parallel for    | *                                  |
1434   // | for              |parallel for simd| *                                  |
1435   // | for              |parallel sections| *                                  |
1436   // | for              | task            | *                                  |
1437   // | for              | taskyield       | *                                  |
1438   // | for              | barrier         | +                                  |
1439   // | for              | taskwait        | *                                  |
1440   // | for              | taskgroup       | *                                  |
1441   // | for              | flush           | *                                  |
1442   // | for              | ordered         | * (if construct is ordered)        |
1443   // | for              | atomic          | *                                  |
1444   // | for              | target          | *                                  |
1445   // | for              | teams           | +                                  |
1446   // | for              | cancellation    |                                    |
1447   // |                  | point           | !                                  |
1448   // | for              | cancel          | !                                  |
1449   // +------------------+-----------------+------------------------------------+
1450   // | master           | parallel        | *                                  |
1451   // | master           | for             | +                                  |
1452   // | master           | for simd        | +                                  |
1453   // | master           | master          | *                                  |
1454   // | master           | critical        | *                                  |
1455   // | master           | simd            | *                                  |
1456   // | master           | sections        | +                                  |
1457   // | master           | section         | +                                  |
1458   // | master           | single          | +                                  |
1459   // | master           | parallel for    | *                                  |
1460   // | master           |parallel for simd| *                                  |
1461   // | master           |parallel sections| *                                  |
1462   // | master           | task            | *                                  |
1463   // | master           | taskyield       | *                                  |
1464   // | master           | barrier         | +                                  |
1465   // | master           | taskwait        | *                                  |
1466   // | master           | taskgroup       | *                                  |
1467   // | master           | flush           | *                                  |
1468   // | master           | ordered         | +                                  |
1469   // | master           | atomic          | *                                  |
1470   // | master           | target          | *                                  |
1471   // | master           | teams           | +                                  |
1472   // | master           | cancellation    |                                    |
1473   // |                  | point           |                                    |
1474   // | master           | cancel          |                                    |
1475   // +------------------+-----------------+------------------------------------+
1476   // | critical         | parallel        | *                                  |
1477   // | critical         | for             | +                                  |
1478   // | critical         | for simd        | +                                  |
1479   // | critical         | master          | *                                  |
1480   // | critical         | critical        | * (should have different names)    |
1481   // | critical         | simd            | *                                  |
1482   // | critical         | sections        | +                                  |
1483   // | critical         | section         | +                                  |
1484   // | critical         | single          | +                                  |
1485   // | critical         | parallel for    | *                                  |
1486   // | critical         |parallel for simd| *                                  |
1487   // | critical         |parallel sections| *                                  |
1488   // | critical         | task            | *                                  |
1489   // | critical         | taskyield       | *                                  |
1490   // | critical         | barrier         | +                                  |
1491   // | critical         | taskwait        | *                                  |
1492   // | critical         | taskgroup       | *                                  |
1493   // | critical         | ordered         | +                                  |
1494   // | critical         | atomic          | *                                  |
1495   // | critical         | target          | *                                  |
1496   // | critical         | teams           | +                                  |
1497   // | critical         | cancellation    |                                    |
1498   // |                  | point           |                                    |
1499   // | critical         | cancel          |                                    |
1500   // +------------------+-----------------+------------------------------------+
1501   // | simd             | parallel        |                                    |
1502   // | simd             | for             |                                    |
1503   // | simd             | for simd        |                                    |
1504   // | simd             | master          |                                    |
1505   // | simd             | critical        |                                    |
1506   // | simd             | simd            |                                    |
1507   // | simd             | sections        |                                    |
1508   // | simd             | section         |                                    |
1509   // | simd             | single          |                                    |
1510   // | simd             | parallel for    |                                    |
1511   // | simd             |parallel for simd|                                    |
1512   // | simd             |parallel sections|                                    |
1513   // | simd             | task            |                                    |
1514   // | simd             | taskyield       |                                    |
1515   // | simd             | barrier         |                                    |
1516   // | simd             | taskwait        |                                    |
1517   // | simd             | taskgroup       |                                    |
1518   // | simd             | flush           |                                    |
1519   // | simd             | ordered         |                                    |
1520   // | simd             | atomic          |                                    |
1521   // | simd             | target          |                                    |
1522   // | simd             | teams           |                                    |
1523   // | simd             | cancellation    |                                    |
1524   // |                  | point           |                                    |
1525   // | simd             | cancel          |                                    |
1526   // +------------------+-----------------+------------------------------------+
1527   // | for simd         | parallel        |                                    |
1528   // | for simd         | for             |                                    |
1529   // | for simd         | for simd        |                                    |
1530   // | for simd         | master          |                                    |
1531   // | for simd         | critical        |                                    |
1532   // | for simd         | simd            |                                    |
1533   // | for simd         | sections        |                                    |
1534   // | for simd         | section         |                                    |
1535   // | for simd         | single          |                                    |
1536   // | for simd         | parallel for    |                                    |
1537   // | for simd         |parallel for simd|                                    |
1538   // | for simd         |parallel sections|                                    |
1539   // | for simd         | task            |                                    |
1540   // | for simd         | taskyield       |                                    |
1541   // | for simd         | barrier         |                                    |
1542   // | for simd         | taskwait        |                                    |
1543   // | for simd         | taskgroup       |                                    |
1544   // | for simd         | flush           |                                    |
1545   // | for simd         | ordered         |                                    |
1546   // | for simd         | atomic          |                                    |
1547   // | for simd         | target          |                                    |
1548   // | for simd         | teams           |                                    |
1549   // | for simd         | cancellation    |                                    |
1550   // |                  | point           |                                    |
1551   // | for simd         | cancel          |                                    |
1552   // +------------------+-----------------+------------------------------------+
1553   // | parallel for simd| parallel        |                                    |
1554   // | parallel for simd| for             |                                    |
1555   // | parallel for simd| for simd        |                                    |
1556   // | parallel for simd| master          |                                    |
1557   // | parallel for simd| critical        |                                    |
1558   // | parallel for simd| simd            |                                    |
1559   // | parallel for simd| sections        |                                    |
1560   // | parallel for simd| section         |                                    |
1561   // | parallel for simd| single          |                                    |
1562   // | parallel for simd| parallel for    |                                    |
1563   // | parallel for simd|parallel for simd|                                    |
1564   // | parallel for simd|parallel sections|                                    |
1565   // | parallel for simd| task            |                                    |
1566   // | parallel for simd| taskyield       |                                    |
1567   // | parallel for simd| barrier         |                                    |
1568   // | parallel for simd| taskwait        |                                    |
1569   // | parallel for simd| taskgroup       |                                    |
1570   // | parallel for simd| flush           |                                    |
1571   // | parallel for simd| ordered         |                                    |
1572   // | parallel for simd| atomic          |                                    |
1573   // | parallel for simd| target          |                                    |
1574   // | parallel for simd| teams           |                                    |
1575   // | parallel for simd| cancellation    |                                    |
1576   // |                  | point           |                                    |
1577   // | parallel for simd| cancel          |                                    |
1578   // +------------------+-----------------+------------------------------------+
1579   // | sections         | parallel        | *                                  |
1580   // | sections         | for             | +                                  |
1581   // | sections         | for simd        | +                                  |
1582   // | sections         | master          | +                                  |
1583   // | sections         | critical        | *                                  |
1584   // | sections         | simd            | *                                  |
1585   // | sections         | sections        | +                                  |
1586   // | sections         | section         | *                                  |
1587   // | sections         | single          | +                                  |
1588   // | sections         | parallel for    | *                                  |
1589   // | sections         |parallel for simd| *                                  |
1590   // | sections         |parallel sections| *                                  |
1591   // | sections         | task            | *                                  |
1592   // | sections         | taskyield       | *                                  |
1593   // | sections         | barrier         | +                                  |
1594   // | sections         | taskwait        | *                                  |
1595   // | sections         | taskgroup       | *                                  |
1596   // | sections         | flush           | *                                  |
1597   // | sections         | ordered         | +                                  |
1598   // | sections         | atomic          | *                                  |
1599   // | sections         | target          | *                                  |
1600   // | sections         | teams           | +                                  |
1601   // | sections         | cancellation    |                                    |
1602   // |                  | point           | !                                  |
1603   // | sections         | cancel          | !                                  |
1604   // +------------------+-----------------+------------------------------------+
1605   // | section          | parallel        | *                                  |
1606   // | section          | for             | +                                  |
1607   // | section          | for simd        | +                                  |
1608   // | section          | master          | +                                  |
1609   // | section          | critical        | *                                  |
1610   // | section          | simd            | *                                  |
1611   // | section          | sections        | +                                  |
1612   // | section          | section         | +                                  |
1613   // | section          | single          | +                                  |
1614   // | section          | parallel for    | *                                  |
1615   // | section          |parallel for simd| *                                  |
1616   // | section          |parallel sections| *                                  |
1617   // | section          | task            | *                                  |
1618   // | section          | taskyield       | *                                  |
1619   // | section          | barrier         | +                                  |
1620   // | section          | taskwait        | *                                  |
1621   // | section          | taskgroup       | *                                  |
1622   // | section          | flush           | *                                  |
1623   // | section          | ordered         | +                                  |
1624   // | section          | atomic          | *                                  |
1625   // | section          | target          | *                                  |
1626   // | section          | teams           | +                                  |
1627   // | section          | cancellation    |                                    |
1628   // |                  | point           | !                                  |
1629   // | section          | cancel          | !                                  |
1630   // +------------------+-----------------+------------------------------------+
1631   // | single           | parallel        | *                                  |
1632   // | single           | for             | +                                  |
1633   // | single           | for simd        | +                                  |
1634   // | single           | master          | +                                  |
1635   // | single           | critical        | *                                  |
1636   // | single           | simd            | *                                  |
1637   // | single           | sections        | +                                  |
1638   // | single           | section         | +                                  |
1639   // | single           | single          | +                                  |
1640   // | single           | parallel for    | *                                  |
1641   // | single           |parallel for simd| *                                  |
1642   // | single           |parallel sections| *                                  |
1643   // | single           | task            | *                                  |
1644   // | single           | taskyield       | *                                  |
1645   // | single           | barrier         | +                                  |
1646   // | single           | taskwait        | *                                  |
1647   // | single           | taskgroup       | *                                  |
1648   // | single           | flush           | *                                  |
1649   // | single           | ordered         | +                                  |
1650   // | single           | atomic          | *                                  |
1651   // | single           | target          | *                                  |
1652   // | single           | teams           | +                                  |
1653   // | single           | cancellation    |                                    |
1654   // |                  | point           |                                    |
1655   // | single           | cancel          |                                    |
1656   // +------------------+-----------------+------------------------------------+
1657   // | parallel for     | parallel        | *                                  |
1658   // | parallel for     | for             | +                                  |
1659   // | parallel for     | for simd        | +                                  |
1660   // | parallel for     | master          | +                                  |
1661   // | parallel for     | critical        | *                                  |
1662   // | parallel for     | simd            | *                                  |
1663   // | parallel for     | sections        | +                                  |
1664   // | parallel for     | section         | +                                  |
1665   // | parallel for     | single          | +                                  |
1666   // | parallel for     | parallel for    | *                                  |
1667   // | parallel for     |parallel for simd| *                                  |
1668   // | parallel for     |parallel sections| *                                  |
1669   // | parallel for     | task            | *                                  |
1670   // | parallel for     | taskyield       | *                                  |
1671   // | parallel for     | barrier         | +                                  |
1672   // | parallel for     | taskwait        | *                                  |
1673   // | parallel for     | taskgroup       | *                                  |
1674   // | parallel for     | flush           | *                                  |
1675   // | parallel for     | ordered         | * (if construct is ordered)        |
1676   // | parallel for     | atomic          | *                                  |
1677   // | parallel for     | target          | *                                  |
1678   // | parallel for     | teams           | +                                  |
1679   // | parallel for     | cancellation    |                                    |
1680   // |                  | point           | !                                  |
1681   // | parallel for     | cancel          | !                                  |
1682   // +------------------+-----------------+------------------------------------+
1683   // | parallel sections| parallel        | *                                  |
1684   // | parallel sections| for             | +                                  |
1685   // | parallel sections| for simd        | +                                  |
1686   // | parallel sections| master          | +                                  |
1687   // | parallel sections| critical        | +                                  |
1688   // | parallel sections| simd            | *                                  |
1689   // | parallel sections| sections        | +                                  |
1690   // | parallel sections| section         | *                                  |
1691   // | parallel sections| single          | +                                  |
1692   // | parallel sections| parallel for    | *                                  |
1693   // | parallel sections|parallel for simd| *                                  |
1694   // | parallel sections|parallel sections| *                                  |
1695   // | parallel sections| task            | *                                  |
1696   // | parallel sections| taskyield       | *                                  |
1697   // | parallel sections| barrier         | +                                  |
1698   // | parallel sections| taskwait        | *                                  |
1699   // | parallel sections| taskgroup       | *                                  |
1700   // | parallel sections| flush           | *                                  |
1701   // | parallel sections| ordered         | +                                  |
1702   // | parallel sections| atomic          | *                                  |
1703   // | parallel sections| target          | *                                  |
1704   // | parallel sections| teams           | +                                  |
1705   // | parallel sections| cancellation    |                                    |
1706   // |                  | point           | !                                  |
1707   // | parallel sections| cancel          | !                                  |
1708   // +------------------+-----------------+------------------------------------+
1709   // | task             | parallel        | *                                  |
1710   // | task             | for             | +                                  |
1711   // | task             | for simd        | +                                  |
1712   // | task             | master          | +                                  |
1713   // | task             | critical        | *                                  |
1714   // | task             | simd            | *                                  |
1715   // | task             | sections        | +                                  |
1716   // | task             | section         | +                                  |
1717   // | task             | single          | +                                  |
1718   // | task             | parallel for    | *                                  |
1719   // | task             |parallel for simd| *                                  |
1720   // | task             |parallel sections| *                                  |
1721   // | task             | task            | *                                  |
1722   // | task             | taskyield       | *                                  |
1723   // | task             | barrier         | +                                  |
1724   // | task             | taskwait        | *                                  |
1725   // | task             | taskgroup       | *                                  |
1726   // | task             | flush           | *                                  |
1727   // | task             | ordered         | +                                  |
1728   // | task             | atomic          | *                                  |
1729   // | task             | target          | *                                  |
1730   // | task             | teams           | +                                  |
1731   // | task             | cancellation    |                                    |
1732   // |                  | point           | !                                  |
1733   // | task             | cancel          | !                                  |
1734   // +------------------+-----------------+------------------------------------+
1735   // | ordered          | parallel        | *                                  |
1736   // | ordered          | for             | +                                  |
1737   // | ordered          | for simd        | +                                  |
1738   // | ordered          | master          | *                                  |
1739   // | ordered          | critical        | *                                  |
1740   // | ordered          | simd            | *                                  |
1741   // | ordered          | sections        | +                                  |
1742   // | ordered          | section         | +                                  |
1743   // | ordered          | single          | +                                  |
1744   // | ordered          | parallel for    | *                                  |
1745   // | ordered          |parallel for simd| *                                  |
1746   // | ordered          |parallel sections| *                                  |
1747   // | ordered          | task            | *                                  |
1748   // | ordered          | taskyield       | *                                  |
1749   // | ordered          | barrier         | +                                  |
1750   // | ordered          | taskwait        | *                                  |
1751   // | ordered          | taskgroup       | *                                  |
1752   // | ordered          | flush           | *                                  |
1753   // | ordered          | ordered         | +                                  |
1754   // | ordered          | atomic          | *                                  |
1755   // | ordered          | target          | *                                  |
1756   // | ordered          | teams           | +                                  |
1757   // | ordered          | cancellation    |                                    |
1758   // |                  | point           |                                    |
1759   // | ordered          | cancel          |                                    |
1760   // +------------------+-----------------+------------------------------------+
1761   // | atomic           | parallel        |                                    |
1762   // | atomic           | for             |                                    |
1763   // | atomic           | for simd        |                                    |
1764   // | atomic           | master          |                                    |
1765   // | atomic           | critical        |                                    |
1766   // | atomic           | simd            |                                    |
1767   // | atomic           | sections        |                                    |
1768   // | atomic           | section         |                                    |
1769   // | atomic           | single          |                                    |
1770   // | atomic           | parallel for    |                                    |
1771   // | atomic           |parallel for simd|                                    |
1772   // | atomic           |parallel sections|                                    |
1773   // | atomic           | task            |                                    |
1774   // | atomic           | taskyield       |                                    |
1775   // | atomic           | barrier         |                                    |
1776   // | atomic           | taskwait        |                                    |
1777   // | atomic           | taskgroup       |                                    |
1778   // | atomic           | flush           |                                    |
1779   // | atomic           | ordered         |                                    |
1780   // | atomic           | atomic          |                                    |
1781   // | atomic           | target          |                                    |
1782   // | atomic           | teams           |                                    |
1783   // | atomic           | cancellation    |                                    |
1784   // |                  | point           |                                    |
1785   // | atomic           | cancel          |                                    |
1786   // +------------------+-----------------+------------------------------------+
1787   // | target           | parallel        | *                                  |
1788   // | target           | for             | *                                  |
1789   // | target           | for simd        | *                                  |
1790   // | target           | master          | *                                  |
1791   // | target           | critical        | *                                  |
1792   // | target           | simd            | *                                  |
1793   // | target           | sections        | *                                  |
1794   // | target           | section         | *                                  |
1795   // | target           | single          | *                                  |
1796   // | target           | parallel for    | *                                  |
1797   // | target           |parallel for simd| *                                  |
1798   // | target           |parallel sections| *                                  |
1799   // | target           | task            | *                                  |
1800   // | target           | taskyield       | *                                  |
1801   // | target           | barrier         | *                                  |
1802   // | target           | taskwait        | *                                  |
1803   // | target           | taskgroup       | *                                  |
1804   // | target           | flush           | *                                  |
1805   // | target           | ordered         | *                                  |
1806   // | target           | atomic          | *                                  |
1807   // | target           | target          | *                                  |
1808   // | target           | teams           | *                                  |
1809   // | target           | cancellation    |                                    |
1810   // |                  | point           |                                    |
1811   // | target           | cancel          |                                    |
1812   // +------------------+-----------------+------------------------------------+
1813   // | teams            | parallel        | *                                  |
1814   // | teams            | for             | +                                  |
1815   // | teams            | for simd        | +                                  |
1816   // | teams            | master          | +                                  |
1817   // | teams            | critical        | +                                  |
1818   // | teams            | simd            | +                                  |
1819   // | teams            | sections        | +                                  |
1820   // | teams            | section         | +                                  |
1821   // | teams            | single          | +                                  |
1822   // | teams            | parallel for    | *                                  |
1823   // | teams            |parallel for simd| *                                  |
1824   // | teams            |parallel sections| *                                  |
1825   // | teams            | task            | +                                  |
1826   // | teams            | taskyield       | +                                  |
1827   // | teams            | barrier         | +                                  |
1828   // | teams            | taskwait        | +                                  |
1829   // | teams            | taskgroup       | +                                  |
1830   // | teams            | flush           | +                                  |
1831   // | teams            | ordered         | +                                  |
1832   // | teams            | atomic          | +                                  |
1833   // | teams            | target          | +                                  |
1834   // | teams            | teams           | +                                  |
1835   // | teams            | cancellation    |                                    |
1836   // |                  | point           |                                    |
1837   // | teams            | cancel          |                                    |
1838   // +------------------+-----------------+------------------------------------+
1839   if (Stack->getCurScope()) {
1840     auto ParentRegion = Stack->getParentDirective();
1841     bool NestingProhibited = false;
1842     bool CloseNesting = true;
1843     enum {
1844       NoRecommend,
1845       ShouldBeInParallelRegion,
1846       ShouldBeInOrderedRegion,
1847       ShouldBeInTargetRegion
1848     } Recommend = NoRecommend;
1849     if (isOpenMPSimdDirective(ParentRegion)) {
1850       // OpenMP [2.16, Nesting of Regions]
1851       // OpenMP constructs may not be nested inside a simd region.
1852       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_simd);
1853       return true;
1854     }
1855     if (ParentRegion == OMPD_atomic) {
1856       // OpenMP [2.16, Nesting of Regions]
1857       // OpenMP constructs may not be nested inside an atomic region.
1858       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_atomic);
1859       return true;
1860     }
1861     if (CurrentRegion == OMPD_section) {
1862       // OpenMP [2.7.2, sections Construct, Restrictions]
1863       // Orphaned section directives are prohibited. That is, the section
1864       // directives must appear within the sections construct and must not be
1865       // encountered elsewhere in the sections region.
1866       if (ParentRegion != OMPD_sections &&
1867           ParentRegion != OMPD_parallel_sections) {
1868         SemaRef.Diag(StartLoc, diag::err_omp_orphaned_section_directive)
1869             << (ParentRegion != OMPD_unknown)
1870             << getOpenMPDirectiveName(ParentRegion);
1871         return true;
1872       }
1873       return false;
1874     }
1875     // Allow some constructs to be orphaned (they could be used in functions,
1876     // called from OpenMP regions with the required preconditions).
1877     if (ParentRegion == OMPD_unknown)
1878       return false;
1879     if (CurrentRegion == OMPD_cancellation_point ||
1880         CurrentRegion == OMPD_cancel) {
1881       // OpenMP [2.16, Nesting of Regions]
1882       // A cancellation point construct for which construct-type-clause is
1883       // taskgroup must be nested inside a task construct. A cancellation
1884       // point construct for which construct-type-clause is not taskgroup must
1885       // be closely nested inside an OpenMP construct that matches the type
1886       // specified in construct-type-clause.
1887       // A cancel construct for which construct-type-clause is taskgroup must be
1888       // nested inside a task construct. A cancel construct for which
1889       // construct-type-clause is not taskgroup must be closely nested inside an
1890       // OpenMP construct that matches the type specified in
1891       // construct-type-clause.
1892       NestingProhibited =
1893           !((CancelRegion == OMPD_parallel && ParentRegion == OMPD_parallel) ||
1894             (CancelRegion == OMPD_for && ParentRegion == OMPD_for) ||
1895             (CancelRegion == OMPD_taskgroup && ParentRegion == OMPD_task) ||
1896             (CancelRegion == OMPD_sections &&
1897              (ParentRegion == OMPD_section || ParentRegion == OMPD_sections)));
1898     } else if (CurrentRegion == OMPD_master) {
1899       // OpenMP [2.16, Nesting of Regions]
1900       // A master region may not be closely nested inside a worksharing,
1901       // atomic, or explicit task region.
1902       NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) ||
1903                           ParentRegion == OMPD_task;
1904     } else if (CurrentRegion == OMPD_critical && CurrentName.getName()) {
1905       // OpenMP [2.16, Nesting of Regions]
1906       // A critical region may not be nested (closely or otherwise) inside a
1907       // critical region with the same name. Note that this restriction is not
1908       // sufficient to prevent deadlock.
1909       SourceLocation PreviousCriticalLoc;
1910       bool DeadLock =
1911           Stack->hasDirective([CurrentName, &PreviousCriticalLoc](
1912                                   OpenMPDirectiveKind K,
1913                                   const DeclarationNameInfo &DNI,
1914                                   SourceLocation Loc)
1915                                   ->bool {
1916                                 if (K == OMPD_critical &&
1917                                     DNI.getName() == CurrentName.getName()) {
1918                                   PreviousCriticalLoc = Loc;
1919                                   return true;
1920                                 } else
1921                                   return false;
1922                               },
1923                               false /* skip top directive */);
1924       if (DeadLock) {
1925         SemaRef.Diag(StartLoc,
1926                      diag::err_omp_prohibited_region_critical_same_name)
1927             << CurrentName.getName();
1928         if (PreviousCriticalLoc.isValid())
1929           SemaRef.Diag(PreviousCriticalLoc,
1930                        diag::note_omp_previous_critical_region);
1931         return true;
1932       }
1933     } else if (CurrentRegion == OMPD_barrier) {
1934       // OpenMP [2.16, Nesting of Regions]
1935       // A barrier region may not be closely nested inside a worksharing,
1936       // explicit task, critical, ordered, atomic, or master region.
1937       NestingProhibited =
1938           isOpenMPWorksharingDirective(ParentRegion) ||
1939           ParentRegion == OMPD_task || ParentRegion == OMPD_master ||
1940           ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered;
1941     } else if (isOpenMPWorksharingDirective(CurrentRegion) &&
1942                !isOpenMPParallelDirective(CurrentRegion)) {
1943       // OpenMP [2.16, Nesting of Regions]
1944       // A worksharing region may not be closely nested inside a worksharing,
1945       // explicit task, critical, ordered, atomic, or master region.
1946       NestingProhibited =
1947           isOpenMPWorksharingDirective(ParentRegion) ||
1948           ParentRegion == OMPD_task || ParentRegion == OMPD_master ||
1949           ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered;
1950       Recommend = ShouldBeInParallelRegion;
1951     } else if (CurrentRegion == OMPD_ordered) {
1952       // OpenMP [2.16, Nesting of Regions]
1953       // An ordered region may not be closely nested inside a critical,
1954       // atomic, or explicit task region.
1955       // An ordered region must be closely nested inside a loop region (or
1956       // parallel loop region) with an ordered clause.
1957       NestingProhibited = ParentRegion == OMPD_critical ||
1958                           ParentRegion == OMPD_task ||
1959                           !Stack->isParentOrderedRegion();
1960       Recommend = ShouldBeInOrderedRegion;
1961     } else if (isOpenMPTeamsDirective(CurrentRegion)) {
1962       // OpenMP [2.16, Nesting of Regions]
1963       // If specified, a teams construct must be contained within a target
1964       // construct.
1965       NestingProhibited = ParentRegion != OMPD_target;
1966       Recommend = ShouldBeInTargetRegion;
1967       Stack->setParentTeamsRegionLoc(Stack->getConstructLoc());
1968     }
1969     if (!NestingProhibited && isOpenMPTeamsDirective(ParentRegion)) {
1970       // OpenMP [2.16, Nesting of Regions]
1971       // distribute, parallel, parallel sections, parallel workshare, and the
1972       // parallel loop and parallel loop SIMD constructs are the only OpenMP
1973       // constructs that can be closely nested in the teams region.
1974       // TODO: add distribute directive.
1975       NestingProhibited = !isOpenMPParallelDirective(CurrentRegion);
1976       Recommend = ShouldBeInParallelRegion;
1977     }
1978     if (NestingProhibited) {
1979       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region)
1980           << CloseNesting << getOpenMPDirectiveName(ParentRegion) << Recommend
1981           << getOpenMPDirectiveName(CurrentRegion);
1982       return true;
1983     }
1984   }
1985   return false;
1986 }
1987 
1988 StmtResult Sema::ActOnOpenMPExecutableDirective(
1989     OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName,
1990     OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses,
1991     Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {
1992   StmtResult Res = StmtError();
1993   if (CheckNestingOfRegions(*this, DSAStack, Kind, DirName, CancelRegion,
1994                             StartLoc))
1995     return StmtError();
1996 
1997   llvm::SmallVector<OMPClause *, 8> ClausesWithImplicit;
1998   llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA;
1999   bool ErrorFound = false;
2000   ClausesWithImplicit.append(Clauses.begin(), Clauses.end());
2001   if (AStmt) {
2002     assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
2003 
2004     // Check default data sharing attributes for referenced variables.
2005     DSAAttrChecker DSAChecker(DSAStack, *this, cast<CapturedStmt>(AStmt));
2006     DSAChecker.Visit(cast<CapturedStmt>(AStmt)->getCapturedStmt());
2007     if (DSAChecker.isErrorFound())
2008       return StmtError();
2009     // Generate list of implicitly defined firstprivate variables.
2010     VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
2011 
2012     if (!DSAChecker.getImplicitFirstprivate().empty()) {
2013       if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
2014               DSAChecker.getImplicitFirstprivate(), SourceLocation(),
2015               SourceLocation(), SourceLocation())) {
2016         ClausesWithImplicit.push_back(Implicit);
2017         ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
2018                      DSAChecker.getImplicitFirstprivate().size();
2019       } else
2020         ErrorFound = true;
2021     }
2022   }
2023 
2024   switch (Kind) {
2025   case OMPD_parallel:
2026     Res = ActOnOpenMPParallelDirective(ClausesWithImplicit, AStmt, StartLoc,
2027                                        EndLoc);
2028     break;
2029   case OMPD_simd:
2030     Res = ActOnOpenMPSimdDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
2031                                    VarsWithInheritedDSA);
2032     break;
2033   case OMPD_for:
2034     Res = ActOnOpenMPForDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
2035                                   VarsWithInheritedDSA);
2036     break;
2037   case OMPD_for_simd:
2038     Res = ActOnOpenMPForSimdDirective(ClausesWithImplicit, AStmt, StartLoc,
2039                                       EndLoc, VarsWithInheritedDSA);
2040     break;
2041   case OMPD_sections:
2042     Res = ActOnOpenMPSectionsDirective(ClausesWithImplicit, AStmt, StartLoc,
2043                                        EndLoc);
2044     break;
2045   case OMPD_section:
2046     assert(ClausesWithImplicit.empty() &&
2047            "No clauses are allowed for 'omp section' directive");
2048     Res = ActOnOpenMPSectionDirective(AStmt, StartLoc, EndLoc);
2049     break;
2050   case OMPD_single:
2051     Res = ActOnOpenMPSingleDirective(ClausesWithImplicit, AStmt, StartLoc,
2052                                      EndLoc);
2053     break;
2054   case OMPD_master:
2055     assert(ClausesWithImplicit.empty() &&
2056            "No clauses are allowed for 'omp master' directive");
2057     Res = ActOnOpenMPMasterDirective(AStmt, StartLoc, EndLoc);
2058     break;
2059   case OMPD_critical:
2060     assert(ClausesWithImplicit.empty() &&
2061            "No clauses are allowed for 'omp critical' directive");
2062     Res = ActOnOpenMPCriticalDirective(DirName, AStmt, StartLoc, EndLoc);
2063     break;
2064   case OMPD_parallel_for:
2065     Res = ActOnOpenMPParallelForDirective(ClausesWithImplicit, AStmt, StartLoc,
2066                                           EndLoc, VarsWithInheritedDSA);
2067     break;
2068   case OMPD_parallel_for_simd:
2069     Res = ActOnOpenMPParallelForSimdDirective(
2070         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
2071     break;
2072   case OMPD_parallel_sections:
2073     Res = ActOnOpenMPParallelSectionsDirective(ClausesWithImplicit, AStmt,
2074                                                StartLoc, EndLoc);
2075     break;
2076   case OMPD_task:
2077     Res =
2078         ActOnOpenMPTaskDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc);
2079     break;
2080   case OMPD_taskyield:
2081     assert(ClausesWithImplicit.empty() &&
2082            "No clauses are allowed for 'omp taskyield' directive");
2083     assert(AStmt == nullptr &&
2084            "No associated statement allowed for 'omp taskyield' directive");
2085     Res = ActOnOpenMPTaskyieldDirective(StartLoc, EndLoc);
2086     break;
2087   case OMPD_barrier:
2088     assert(ClausesWithImplicit.empty() &&
2089            "No clauses are allowed for 'omp barrier' directive");
2090     assert(AStmt == nullptr &&
2091            "No associated statement allowed for 'omp barrier' directive");
2092     Res = ActOnOpenMPBarrierDirective(StartLoc, EndLoc);
2093     break;
2094   case OMPD_taskwait:
2095     assert(ClausesWithImplicit.empty() &&
2096            "No clauses are allowed for 'omp taskwait' directive");
2097     assert(AStmt == nullptr &&
2098            "No associated statement allowed for 'omp taskwait' directive");
2099     Res = ActOnOpenMPTaskwaitDirective(StartLoc, EndLoc);
2100     break;
2101   case OMPD_taskgroup:
2102     assert(ClausesWithImplicit.empty() &&
2103            "No clauses are allowed for 'omp taskgroup' directive");
2104     Res = ActOnOpenMPTaskgroupDirective(AStmt, StartLoc, EndLoc);
2105     break;
2106   case OMPD_flush:
2107     assert(AStmt == nullptr &&
2108            "No associated statement allowed for 'omp flush' directive");
2109     Res = ActOnOpenMPFlushDirective(ClausesWithImplicit, StartLoc, EndLoc);
2110     break;
2111   case OMPD_ordered:
2112     assert(ClausesWithImplicit.empty() &&
2113            "No clauses are allowed for 'omp ordered' directive");
2114     Res = ActOnOpenMPOrderedDirective(AStmt, StartLoc, EndLoc);
2115     break;
2116   case OMPD_atomic:
2117     Res = ActOnOpenMPAtomicDirective(ClausesWithImplicit, AStmt, StartLoc,
2118                                      EndLoc);
2119     break;
2120   case OMPD_teams:
2121     Res =
2122         ActOnOpenMPTeamsDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc);
2123     break;
2124   case OMPD_target:
2125     Res = ActOnOpenMPTargetDirective(ClausesWithImplicit, AStmt, StartLoc,
2126                                      EndLoc);
2127     break;
2128   case OMPD_cancellation_point:
2129     assert(ClausesWithImplicit.empty() &&
2130            "No clauses are allowed for 'omp cancellation point' directive");
2131     assert(AStmt == nullptr && "No associated statement allowed for 'omp "
2132                                "cancellation point' directive");
2133     Res = ActOnOpenMPCancellationPointDirective(StartLoc, EndLoc, CancelRegion);
2134     break;
2135   case OMPD_cancel:
2136     assert(ClausesWithImplicit.empty() &&
2137            "No clauses are allowed for 'omp cancel' directive");
2138     assert(AStmt == nullptr &&
2139            "No associated statement allowed for 'omp cancel' directive");
2140     Res = ActOnOpenMPCancelDirective(StartLoc, EndLoc, CancelRegion);
2141     break;
2142   case OMPD_target_data:
2143     Res = ActOnOpenMPTargetDataDirective(ClausesWithImplicit, AStmt, StartLoc,
2144                                          EndLoc);
2145     break;
2146   case OMPD_threadprivate:
2147     llvm_unreachable("OpenMP Directive is not allowed");
2148   case OMPD_unknown:
2149     llvm_unreachable("Unknown OpenMP directive");
2150   }
2151 
2152   for (auto P : VarsWithInheritedDSA) {
2153     Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
2154         << P.first << P.second->getSourceRange();
2155   }
2156   if (!VarsWithInheritedDSA.empty())
2157     return StmtError();
2158 
2159   if (ErrorFound)
2160     return StmtError();
2161   return Res;
2162 }
2163 
2164 StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
2165                                               Stmt *AStmt,
2166                                               SourceLocation StartLoc,
2167                                               SourceLocation EndLoc) {
2168   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2169   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2170   // 1.2.2 OpenMP Language Terminology
2171   // Structured block - An executable statement with a single entry at the
2172   // top and a single exit at the bottom.
2173   // The point of exit cannot be a branch out of the structured block.
2174   // longjmp() and throw() must not violate the entry/exit criteria.
2175   CS->getCapturedDecl()->setNothrow();
2176 
2177   getCurFunction()->setHasBranchProtectedScope();
2178 
2179   return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses,
2180                                       AStmt);
2181 }
2182 
2183 namespace {
2184 /// \brief Helper class for checking canonical form of the OpenMP loops and
2185 /// extracting iteration space of each loop in the loop nest, that will be used
2186 /// for IR generation.
2187 class OpenMPIterationSpaceChecker {
2188   /// \brief Reference to Sema.
2189   Sema &SemaRef;
2190   /// \brief A location for diagnostics (when there is no some better location).
2191   SourceLocation DefaultLoc;
2192   /// \brief A location for diagnostics (when increment is not compatible).
2193   SourceLocation ConditionLoc;
2194   /// \brief A source location for referring to loop init later.
2195   SourceRange InitSrcRange;
2196   /// \brief A source location for referring to condition later.
2197   SourceRange ConditionSrcRange;
2198   /// \brief A source location for referring to increment later.
2199   SourceRange IncrementSrcRange;
2200   /// \brief Loop variable.
2201   VarDecl *Var;
2202   /// \brief Reference to loop variable.
2203   DeclRefExpr *VarRef;
2204   /// \brief Lower bound (initializer for the var).
2205   Expr *LB;
2206   /// \brief Upper bound.
2207   Expr *UB;
2208   /// \brief Loop step (increment).
2209   Expr *Step;
2210   /// \brief This flag is true when condition is one of:
2211   ///   Var <  UB
2212   ///   Var <= UB
2213   ///   UB  >  Var
2214   ///   UB  >= Var
2215   bool TestIsLessOp;
2216   /// \brief This flag is true when condition is strict ( < or > ).
2217   bool TestIsStrictOp;
2218   /// \brief This flag is true when step is subtracted on each iteration.
2219   bool SubtractStep;
2220 
2221 public:
2222   OpenMPIterationSpaceChecker(Sema &SemaRef, SourceLocation DefaultLoc)
2223       : SemaRef(SemaRef), DefaultLoc(DefaultLoc), ConditionLoc(DefaultLoc),
2224         InitSrcRange(SourceRange()), ConditionSrcRange(SourceRange()),
2225         IncrementSrcRange(SourceRange()), Var(nullptr), VarRef(nullptr),
2226         LB(nullptr), UB(nullptr), Step(nullptr), TestIsLessOp(false),
2227         TestIsStrictOp(false), SubtractStep(false) {}
2228   /// \brief Check init-expr for canonical loop form and save loop counter
2229   /// variable - #Var and its initialization value - #LB.
2230   bool CheckInit(Stmt *S, bool EmitDiags = true);
2231   /// \brief Check test-expr for canonical form, save upper-bound (#UB), flags
2232   /// for less/greater and for strict/non-strict comparison.
2233   bool CheckCond(Expr *S);
2234   /// \brief Check incr-expr for canonical loop form and return true if it
2235   /// does not conform, otherwise save loop step (#Step).
2236   bool CheckInc(Expr *S);
2237   /// \brief Return the loop counter variable.
2238   VarDecl *GetLoopVar() const { return Var; }
2239   /// \brief Return the reference expression to loop counter variable.
2240   DeclRefExpr *GetLoopVarRefExpr() const { return VarRef; }
2241   /// \brief Source range of the loop init.
2242   SourceRange GetInitSrcRange() const { return InitSrcRange; }
2243   /// \brief Source range of the loop condition.
2244   SourceRange GetConditionSrcRange() const { return ConditionSrcRange; }
2245   /// \brief Source range of the loop increment.
2246   SourceRange GetIncrementSrcRange() const { return IncrementSrcRange; }
2247   /// \brief True if the step should be subtracted.
2248   bool ShouldSubtractStep() const { return SubtractStep; }
2249   /// \brief Build the expression to calculate the number of iterations.
2250   Expr *BuildNumIterations(Scope *S, const bool LimitedType) const;
2251   /// \brief Build the precondition expression for the loops.
2252   Expr *BuildPreCond(Scope *S, Expr *Cond) const;
2253   /// \brief Build reference expression to the counter be used for codegen.
2254   Expr *BuildCounterVar() const;
2255   /// \brief Build reference expression to the private counter be used for
2256   /// codegen.
2257   Expr *BuildPrivateCounterVar() const;
2258   /// \brief Build initization of the counter be used for codegen.
2259   Expr *BuildCounterInit() const;
2260   /// \brief Build step of the counter be used for codegen.
2261   Expr *BuildCounterStep() const;
2262   /// \brief Return true if any expression is dependent.
2263   bool Dependent() const;
2264 
2265 private:
2266   /// \brief Check the right-hand side of an assignment in the increment
2267   /// expression.
2268   bool CheckIncRHS(Expr *RHS);
2269   /// \brief Helper to set loop counter variable and its initializer.
2270   bool SetVarAndLB(VarDecl *NewVar, DeclRefExpr *NewVarRefExpr, Expr *NewLB);
2271   /// \brief Helper to set upper bound.
2272   bool SetUB(Expr *NewUB, bool LessOp, bool StrictOp, const SourceRange &SR,
2273              const SourceLocation &SL);
2274   /// \brief Helper to set loop increment.
2275   bool SetStep(Expr *NewStep, bool Subtract);
2276 };
2277 
2278 bool OpenMPIterationSpaceChecker::Dependent() const {
2279   if (!Var) {
2280     assert(!LB && !UB && !Step);
2281     return false;
2282   }
2283   return Var->getType()->isDependentType() || (LB && LB->isValueDependent()) ||
2284          (UB && UB->isValueDependent()) || (Step && Step->isValueDependent());
2285 }
2286 
2287 template <typename T>
2288 static T *getExprAsWritten(T *E) {
2289   if (auto *ExprTemp = dyn_cast<ExprWithCleanups>(E))
2290     E = ExprTemp->getSubExpr();
2291 
2292   if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E))
2293     E = MTE->GetTemporaryExpr();
2294 
2295   while (auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
2296     E = Binder->getSubExpr();
2297 
2298   if (auto *ICE = dyn_cast<ImplicitCastExpr>(E))
2299     E = ICE->getSubExprAsWritten();
2300   return E->IgnoreParens();
2301 }
2302 
2303 bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar,
2304                                               DeclRefExpr *NewVarRefExpr,
2305                                               Expr *NewLB) {
2306   // State consistency checking to ensure correct usage.
2307   assert(Var == nullptr && LB == nullptr && VarRef == nullptr &&
2308          UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp);
2309   if (!NewVar || !NewLB)
2310     return true;
2311   Var = NewVar;
2312   VarRef = NewVarRefExpr;
2313   if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(NewLB))
2314     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
2315       if ((Ctor->isCopyOrMoveConstructor() ||
2316            Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) &&
2317           CE->getNumArgs() > 0 && CE->getArg(0) != nullptr)
2318         NewLB = CE->getArg(0)->IgnoreParenImpCasts();
2319   LB = NewLB;
2320   return false;
2321 }
2322 
2323 bool OpenMPIterationSpaceChecker::SetUB(Expr *NewUB, bool LessOp, bool StrictOp,
2324                                         const SourceRange &SR,
2325                                         const SourceLocation &SL) {
2326   // State consistency checking to ensure correct usage.
2327   assert(Var != nullptr && LB != nullptr && UB == nullptr && Step == nullptr &&
2328          !TestIsLessOp && !TestIsStrictOp);
2329   if (!NewUB)
2330     return true;
2331   UB = NewUB;
2332   TestIsLessOp = LessOp;
2333   TestIsStrictOp = StrictOp;
2334   ConditionSrcRange = SR;
2335   ConditionLoc = SL;
2336   return false;
2337 }
2338 
2339 bool OpenMPIterationSpaceChecker::SetStep(Expr *NewStep, bool Subtract) {
2340   // State consistency checking to ensure correct usage.
2341   assert(Var != nullptr && LB != nullptr && Step == nullptr);
2342   if (!NewStep)
2343     return true;
2344   if (!NewStep->isValueDependent()) {
2345     // Check that the step is integer expression.
2346     SourceLocation StepLoc = NewStep->getLocStart();
2347     ExprResult Val =
2348         SemaRef.PerformOpenMPImplicitIntegerConversion(StepLoc, NewStep);
2349     if (Val.isInvalid())
2350       return true;
2351     NewStep = Val.get();
2352 
2353     // OpenMP [2.6, Canonical Loop Form, Restrictions]
2354     //  If test-expr is of form var relational-op b and relational-op is < or
2355     //  <= then incr-expr must cause var to increase on each iteration of the
2356     //  loop. If test-expr is of form var relational-op b and relational-op is
2357     //  > or >= then incr-expr must cause var to decrease on each iteration of
2358     //  the loop.
2359     //  If test-expr is of form b relational-op var and relational-op is < or
2360     //  <= then incr-expr must cause var to decrease on each iteration of the
2361     //  loop. If test-expr is of form b relational-op var and relational-op is
2362     //  > or >= then incr-expr must cause var to increase on each iteration of
2363     //  the loop.
2364     llvm::APSInt Result;
2365     bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context);
2366     bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation();
2367     bool IsConstNeg =
2368         IsConstant && Result.isSigned() && (Subtract != Result.isNegative());
2369     bool IsConstPos =
2370         IsConstant && Result.isSigned() && (Subtract == Result.isNegative());
2371     bool IsConstZero = IsConstant && !Result.getBoolValue();
2372     if (UB && (IsConstZero ||
2373                (TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract))
2374                              : (IsConstPos || (IsUnsigned && !Subtract))))) {
2375       SemaRef.Diag(NewStep->getExprLoc(),
2376                    diag::err_omp_loop_incr_not_compatible)
2377           << Var << TestIsLessOp << NewStep->getSourceRange();
2378       SemaRef.Diag(ConditionLoc,
2379                    diag::note_omp_loop_cond_requres_compatible_incr)
2380           << TestIsLessOp << ConditionSrcRange;
2381       return true;
2382     }
2383     if (TestIsLessOp == Subtract) {
2384       NewStep = SemaRef.CreateBuiltinUnaryOp(NewStep->getExprLoc(), UO_Minus,
2385                                              NewStep).get();
2386       Subtract = !Subtract;
2387     }
2388   }
2389 
2390   Step = NewStep;
2391   SubtractStep = Subtract;
2392   return false;
2393 }
2394 
2395 bool OpenMPIterationSpaceChecker::CheckInit(Stmt *S, bool EmitDiags) {
2396   // Check init-expr for canonical loop form and save loop counter
2397   // variable - #Var and its initialization value - #LB.
2398   // OpenMP [2.6] Canonical loop form. init-expr may be one of the following:
2399   //   var = lb
2400   //   integer-type var = lb
2401   //   random-access-iterator-type var = lb
2402   //   pointer-type var = lb
2403   //
2404   if (!S) {
2405     if (EmitDiags) {
2406       SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init);
2407     }
2408     return true;
2409   }
2410   InitSrcRange = S->getSourceRange();
2411   if (Expr *E = dyn_cast<Expr>(S))
2412     S = E->IgnoreParens();
2413   if (auto BO = dyn_cast<BinaryOperator>(S)) {
2414     if (BO->getOpcode() == BO_Assign)
2415       if (auto DRE = dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreParens()))
2416         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
2417                            BO->getRHS());
2418   } else if (auto DS = dyn_cast<DeclStmt>(S)) {
2419     if (DS->isSingleDecl()) {
2420       if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) {
2421         if (Var->hasInit() && !Var->getType()->isReferenceType()) {
2422           // Accept non-canonical init form here but emit ext. warning.
2423           if (Var->getInitStyle() != VarDecl::CInit && EmitDiags)
2424             SemaRef.Diag(S->getLocStart(),
2425                          diag::ext_omp_loop_not_canonical_init)
2426                 << S->getSourceRange();
2427           return SetVarAndLB(Var, nullptr, Var->getInit());
2428         }
2429       }
2430     }
2431   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S))
2432     if (CE->getOperator() == OO_Equal)
2433       if (auto DRE = dyn_cast<DeclRefExpr>(CE->getArg(0)))
2434         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
2435                            CE->getArg(1));
2436 
2437   if (EmitDiags) {
2438     SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_init)
2439         << S->getSourceRange();
2440   }
2441   return true;
2442 }
2443 
2444 /// \brief Ignore parenthesizes, implicit casts, copy constructor and return the
2445 /// variable (which may be the loop variable) if possible.
2446 static const VarDecl *GetInitVarDecl(const Expr *E) {
2447   if (!E)
2448     return nullptr;
2449   E = getExprAsWritten(E);
2450   if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E))
2451     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
2452       if ((Ctor->isCopyOrMoveConstructor() ||
2453            Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) &&
2454           CE->getNumArgs() > 0 && CE->getArg(0) != nullptr)
2455         E = CE->getArg(0)->IgnoreParenImpCasts();
2456   auto DRE = dyn_cast_or_null<DeclRefExpr>(E);
2457   if (!DRE)
2458     return nullptr;
2459   return dyn_cast<VarDecl>(DRE->getDecl());
2460 }
2461 
2462 bool OpenMPIterationSpaceChecker::CheckCond(Expr *S) {
2463   // Check test-expr for canonical form, save upper-bound UB, flags for
2464   // less/greater and for strict/non-strict comparison.
2465   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2466   //   var relational-op b
2467   //   b relational-op var
2468   //
2469   if (!S) {
2470     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << Var;
2471     return true;
2472   }
2473   S = getExprAsWritten(S);
2474   SourceLocation CondLoc = S->getLocStart();
2475   if (auto BO = dyn_cast<BinaryOperator>(S)) {
2476     if (BO->isRelationalOp()) {
2477       if (GetInitVarDecl(BO->getLHS()) == Var)
2478         return SetUB(BO->getRHS(),
2479                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE),
2480                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2481                      BO->getSourceRange(), BO->getOperatorLoc());
2482       if (GetInitVarDecl(BO->getRHS()) == Var)
2483         return SetUB(BO->getLHS(),
2484                      (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE),
2485                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2486                      BO->getSourceRange(), BO->getOperatorLoc());
2487     }
2488   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2489     if (CE->getNumArgs() == 2) {
2490       auto Op = CE->getOperator();
2491       switch (Op) {
2492       case OO_Greater:
2493       case OO_GreaterEqual:
2494       case OO_Less:
2495       case OO_LessEqual:
2496         if (GetInitVarDecl(CE->getArg(0)) == Var)
2497           return SetUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual,
2498                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2499                        CE->getOperatorLoc());
2500         if (GetInitVarDecl(CE->getArg(1)) == Var)
2501           return SetUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual,
2502                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2503                        CE->getOperatorLoc());
2504         break;
2505       default:
2506         break;
2507       }
2508     }
2509   }
2510   SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond)
2511       << S->getSourceRange() << Var;
2512   return true;
2513 }
2514 
2515 bool OpenMPIterationSpaceChecker::CheckIncRHS(Expr *RHS) {
2516   // RHS of canonical loop form increment can be:
2517   //   var + incr
2518   //   incr + var
2519   //   var - incr
2520   //
2521   RHS = RHS->IgnoreParenImpCasts();
2522   if (auto BO = dyn_cast<BinaryOperator>(RHS)) {
2523     if (BO->isAdditiveOp()) {
2524       bool IsAdd = BO->getOpcode() == BO_Add;
2525       if (GetInitVarDecl(BO->getLHS()) == Var)
2526         return SetStep(BO->getRHS(), !IsAdd);
2527       if (IsAdd && GetInitVarDecl(BO->getRHS()) == Var)
2528         return SetStep(BO->getLHS(), false);
2529     }
2530   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(RHS)) {
2531     bool IsAdd = CE->getOperator() == OO_Plus;
2532     if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) {
2533       if (GetInitVarDecl(CE->getArg(0)) == Var)
2534         return SetStep(CE->getArg(1), !IsAdd);
2535       if (IsAdd && GetInitVarDecl(CE->getArg(1)) == Var)
2536         return SetStep(CE->getArg(0), false);
2537     }
2538   }
2539   SemaRef.Diag(RHS->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2540       << RHS->getSourceRange() << Var;
2541   return true;
2542 }
2543 
2544 bool OpenMPIterationSpaceChecker::CheckInc(Expr *S) {
2545   // Check incr-expr for canonical loop form and return true if it
2546   // does not conform.
2547   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2548   //   ++var
2549   //   var++
2550   //   --var
2551   //   var--
2552   //   var += incr
2553   //   var -= incr
2554   //   var = var + incr
2555   //   var = incr + var
2556   //   var = var - incr
2557   //
2558   if (!S) {
2559     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << Var;
2560     return true;
2561   }
2562   IncrementSrcRange = S->getSourceRange();
2563   S = S->IgnoreParens();
2564   if (auto UO = dyn_cast<UnaryOperator>(S)) {
2565     if (UO->isIncrementDecrementOp() && GetInitVarDecl(UO->getSubExpr()) == Var)
2566       return SetStep(
2567           SemaRef.ActOnIntegerConstant(UO->getLocStart(),
2568                                        (UO->isDecrementOp() ? -1 : 1)).get(),
2569           false);
2570   } else if (auto BO = dyn_cast<BinaryOperator>(S)) {
2571     switch (BO->getOpcode()) {
2572     case BO_AddAssign:
2573     case BO_SubAssign:
2574       if (GetInitVarDecl(BO->getLHS()) == Var)
2575         return SetStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign);
2576       break;
2577     case BO_Assign:
2578       if (GetInitVarDecl(BO->getLHS()) == Var)
2579         return CheckIncRHS(BO->getRHS());
2580       break;
2581     default:
2582       break;
2583     }
2584   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2585     switch (CE->getOperator()) {
2586     case OO_PlusPlus:
2587     case OO_MinusMinus:
2588       if (GetInitVarDecl(CE->getArg(0)) == Var)
2589         return SetStep(
2590             SemaRef.ActOnIntegerConstant(
2591                         CE->getLocStart(),
2592                         ((CE->getOperator() == OO_MinusMinus) ? -1 : 1)).get(),
2593             false);
2594       break;
2595     case OO_PlusEqual:
2596     case OO_MinusEqual:
2597       if (GetInitVarDecl(CE->getArg(0)) == Var)
2598         return SetStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual);
2599       break;
2600     case OO_Equal:
2601       if (GetInitVarDecl(CE->getArg(0)) == Var)
2602         return CheckIncRHS(CE->getArg(1));
2603       break;
2604     default:
2605       break;
2606     }
2607   }
2608   SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2609       << S->getSourceRange() << Var;
2610   return true;
2611 }
2612 
2613 namespace {
2614 // Transform variables declared in GNU statement expressions to new ones to
2615 // avoid crash on codegen.
2616 class TransformToNewDefs : public TreeTransform<TransformToNewDefs> {
2617   typedef TreeTransform<TransformToNewDefs> BaseTransform;
2618 
2619 public:
2620   TransformToNewDefs(Sema &SemaRef) : BaseTransform(SemaRef) {}
2621 
2622   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
2623     if (auto *VD = cast<VarDecl>(D))
2624       if (!isa<ParmVarDecl>(D) && !isa<VarTemplateSpecializationDecl>(D) &&
2625           !isa<ImplicitParamDecl>(D)) {
2626         auto *NewVD = VarDecl::Create(
2627             SemaRef.Context, VD->getDeclContext(), VD->getLocStart(),
2628             VD->getLocation(), VD->getIdentifier(), VD->getType(),
2629             VD->getTypeSourceInfo(), VD->getStorageClass());
2630         NewVD->setTSCSpec(VD->getTSCSpec());
2631         NewVD->setInit(VD->getInit());
2632         NewVD->setInitStyle(VD->getInitStyle());
2633         NewVD->setExceptionVariable(VD->isExceptionVariable());
2634         NewVD->setNRVOVariable(VD->isNRVOVariable());
2635         NewVD->setCXXForRangeDecl(VD->isInExternCXXContext());
2636         NewVD->setConstexpr(VD->isConstexpr());
2637         NewVD->setInitCapture(VD->isInitCapture());
2638         NewVD->setPreviousDeclInSameBlockScope(
2639             VD->isPreviousDeclInSameBlockScope());
2640         VD->getDeclContext()->addHiddenDecl(NewVD);
2641         transformedLocalDecl(VD, NewVD);
2642         return NewVD;
2643       }
2644     return BaseTransform::TransformDefinition(Loc, D);
2645   }
2646 
2647   ExprResult TransformDeclRefExpr(DeclRefExpr *E) {
2648     if (auto *NewD = TransformDecl(E->getExprLoc(), E->getDecl()))
2649       if (E->getDecl() != NewD) {
2650         NewD->setReferenced();
2651         NewD->markUsed(SemaRef.Context);
2652         return DeclRefExpr::Create(
2653             SemaRef.Context, E->getQualifierLoc(), E->getTemplateKeywordLoc(),
2654             cast<ValueDecl>(NewD), E->refersToEnclosingVariableOrCapture(),
2655             E->getNameInfo(), E->getType(), E->getValueKind());
2656       }
2657     return BaseTransform::TransformDeclRefExpr(E);
2658   }
2659 };
2660 }
2661 
2662 /// \brief Build the expression to calculate the number of iterations.
2663 Expr *
2664 OpenMPIterationSpaceChecker::BuildNumIterations(Scope *S,
2665                                                 const bool LimitedType) const {
2666   TransformToNewDefs Transform(SemaRef);
2667   ExprResult Diff;
2668   auto VarType = Var->getType().getNonReferenceType();
2669   if (VarType->isIntegerType() || VarType->isPointerType() ||
2670       SemaRef.getLangOpts().CPlusPlus) {
2671     // Upper - Lower
2672     auto *UBExpr = TestIsLessOp ? UB : LB;
2673     auto *LBExpr = TestIsLessOp ? LB : UB;
2674     Expr *Upper = Transform.TransformExpr(UBExpr).get();
2675     Expr *Lower = Transform.TransformExpr(LBExpr).get();
2676     if (!Upper || !Lower)
2677       return nullptr;
2678     Upper = SemaRef.PerformImplicitConversion(Upper, UBExpr->getType(),
2679                                                     Sema::AA_Converting,
2680                                                     /*AllowExplicit=*/true)
2681                       .get();
2682     Lower = SemaRef.PerformImplicitConversion(Lower, LBExpr->getType(),
2683                                               Sema::AA_Converting,
2684                                               /*AllowExplicit=*/true)
2685                 .get();
2686     if (!Upper || !Lower)
2687       return nullptr;
2688 
2689     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower);
2690 
2691     if (!Diff.isUsable() && VarType->getAsCXXRecordDecl()) {
2692       // BuildBinOp already emitted error, this one is to point user to upper
2693       // and lower bound, and to tell what is passed to 'operator-'.
2694       SemaRef.Diag(Upper->getLocStart(), diag::err_omp_loop_diff_cxx)
2695           << Upper->getSourceRange() << Lower->getSourceRange();
2696       return nullptr;
2697     }
2698   }
2699 
2700   if (!Diff.isUsable())
2701     return nullptr;
2702 
2703   // Upper - Lower [- 1]
2704   if (TestIsStrictOp)
2705     Diff = SemaRef.BuildBinOp(
2706         S, DefaultLoc, BO_Sub, Diff.get(),
2707         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
2708   if (!Diff.isUsable())
2709     return nullptr;
2710 
2711   // Upper - Lower [- 1] + Step
2712   auto NewStep = Transform.TransformExpr(Step->IgnoreImplicit());
2713   if (NewStep.isInvalid())
2714     return nullptr;
2715   NewStep = SemaRef.PerformImplicitConversion(
2716       NewStep.get(), Step->IgnoreImplicit()->getType(), Sema::AA_Converting,
2717       /*AllowExplicit=*/true);
2718   if (NewStep.isInvalid())
2719     return nullptr;
2720   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Diff.get(), NewStep.get());
2721   if (!Diff.isUsable())
2722     return nullptr;
2723 
2724   // Parentheses (for dumping/debugging purposes only).
2725   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
2726   if (!Diff.isUsable())
2727     return nullptr;
2728 
2729   // (Upper - Lower [- 1] + Step) / Step
2730   NewStep = Transform.TransformExpr(Step->IgnoreImplicit());
2731   if (NewStep.isInvalid())
2732     return nullptr;
2733   NewStep = SemaRef.PerformImplicitConversion(
2734       NewStep.get(), Step->IgnoreImplicit()->getType(), Sema::AA_Converting,
2735       /*AllowExplicit=*/true);
2736   if (NewStep.isInvalid())
2737     return nullptr;
2738   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), NewStep.get());
2739   if (!Diff.isUsable())
2740     return nullptr;
2741 
2742   // OpenMP runtime requires 32-bit or 64-bit loop variables.
2743   QualType Type = Diff.get()->getType();
2744   auto &C = SemaRef.Context;
2745   bool UseVarType = VarType->hasIntegerRepresentation() &&
2746                     C.getTypeSize(Type) > C.getTypeSize(VarType);
2747   if (!Type->isIntegerType() || UseVarType) {
2748     unsigned NewSize =
2749         UseVarType ? C.getTypeSize(VarType) : C.getTypeSize(Type);
2750     bool IsSigned = UseVarType ? VarType->hasSignedIntegerRepresentation()
2751                                : Type->hasSignedIntegerRepresentation();
2752     Type = C.getIntTypeForBitwidth(NewSize, IsSigned);
2753     Diff = SemaRef.PerformImplicitConversion(
2754         Diff.get(), Type, Sema::AA_Converting, /*AllowExplicit=*/true);
2755     if (!Diff.isUsable())
2756       return nullptr;
2757   }
2758   if (LimitedType) {
2759     unsigned NewSize = (C.getTypeSize(Type) > 32) ? 64 : 32;
2760     if (NewSize != C.getTypeSize(Type)) {
2761       if (NewSize < C.getTypeSize(Type)) {
2762         assert(NewSize == 64 && "incorrect loop var size");
2763         SemaRef.Diag(DefaultLoc, diag::warn_omp_loop_64_bit_var)
2764             << InitSrcRange << ConditionSrcRange;
2765       }
2766       QualType NewType = C.getIntTypeForBitwidth(
2767           NewSize, Type->hasSignedIntegerRepresentation() ||
2768                        C.getTypeSize(Type) < NewSize);
2769       Diff = SemaRef.PerformImplicitConversion(Diff.get(), NewType,
2770                                                Sema::AA_Converting, true);
2771       if (!Diff.isUsable())
2772         return nullptr;
2773     }
2774   }
2775 
2776   return Diff.get();
2777 }
2778 
2779 Expr *OpenMPIterationSpaceChecker::BuildPreCond(Scope *S, Expr *Cond) const {
2780   // Try to build LB <op> UB, where <op> is <, >, <=, or >=.
2781   bool Suppress = SemaRef.getDiagnostics().getSuppressAllDiagnostics();
2782   SemaRef.getDiagnostics().setSuppressAllDiagnostics(/*Val=*/true);
2783   TransformToNewDefs Transform(SemaRef);
2784 
2785   auto NewLB = Transform.TransformExpr(LB);
2786   auto NewUB = Transform.TransformExpr(UB);
2787   if (NewLB.isInvalid() || NewUB.isInvalid())
2788     return Cond;
2789   NewLB = SemaRef.PerformImplicitConversion(NewLB.get(), LB->getType(),
2790                                             Sema::AA_Converting,
2791                                             /*AllowExplicit=*/true);
2792   NewUB = SemaRef.PerformImplicitConversion(NewUB.get(), UB->getType(),
2793                                             Sema::AA_Converting,
2794                                             /*AllowExplicit=*/true);
2795   if (NewLB.isInvalid() || NewUB.isInvalid())
2796     return Cond;
2797   auto CondExpr = SemaRef.BuildBinOp(
2798       S, DefaultLoc, TestIsLessOp ? (TestIsStrictOp ? BO_LT : BO_LE)
2799                                   : (TestIsStrictOp ? BO_GT : BO_GE),
2800       NewLB.get(), NewUB.get());
2801   if (CondExpr.isUsable()) {
2802     CondExpr = SemaRef.PerformImplicitConversion(
2803         CondExpr.get(), SemaRef.Context.BoolTy, /*Action=*/Sema::AA_Casting,
2804         /*AllowExplicit=*/true);
2805   }
2806   SemaRef.getDiagnostics().setSuppressAllDiagnostics(Suppress);
2807   // Otherwise use original loop conditon and evaluate it in runtime.
2808   return CondExpr.isUsable() ? CondExpr.get() : Cond;
2809 }
2810 
2811 /// \brief Build reference expression to the counter be used for codegen.
2812 Expr *OpenMPIterationSpaceChecker::BuildCounterVar() const {
2813   return buildDeclRefExpr(SemaRef, Var, Var->getType().getNonReferenceType(),
2814                           DefaultLoc);
2815 }
2816 
2817 Expr *OpenMPIterationSpaceChecker::BuildPrivateCounterVar() const {
2818   if (Var && !Var->isInvalidDecl()) {
2819     auto Type = Var->getType().getNonReferenceType();
2820     auto *PrivateVar = buildVarDecl(SemaRef, DefaultLoc, Type, Var->getName());
2821     if (PrivateVar->isInvalidDecl())
2822       return nullptr;
2823     return buildDeclRefExpr(SemaRef, PrivateVar, Type, DefaultLoc);
2824   }
2825   return nullptr;
2826 }
2827 
2828 /// \brief Build initization of the counter be used for codegen.
2829 Expr *OpenMPIterationSpaceChecker::BuildCounterInit() const { return LB; }
2830 
2831 /// \brief Build step of the counter be used for codegen.
2832 Expr *OpenMPIterationSpaceChecker::BuildCounterStep() const { return Step; }
2833 
2834 /// \brief Iteration space of a single for loop.
2835 struct LoopIterationSpace {
2836   /// \brief Condition of the loop.
2837   Expr *PreCond;
2838   /// \brief This expression calculates the number of iterations in the loop.
2839   /// It is always possible to calculate it before starting the loop.
2840   Expr *NumIterations;
2841   /// \brief The loop counter variable.
2842   Expr *CounterVar;
2843   /// \brief Private loop counter variable.
2844   Expr *PrivateCounterVar;
2845   /// \brief This is initializer for the initial value of #CounterVar.
2846   Expr *CounterInit;
2847   /// \brief This is step for the #CounterVar used to generate its update:
2848   /// #CounterVar = #CounterInit + #CounterStep * CurrentIteration.
2849   Expr *CounterStep;
2850   /// \brief Should step be subtracted?
2851   bool Subtract;
2852   /// \brief Source range of the loop init.
2853   SourceRange InitSrcRange;
2854   /// \brief Source range of the loop condition.
2855   SourceRange CondSrcRange;
2856   /// \brief Source range of the loop increment.
2857   SourceRange IncSrcRange;
2858 };
2859 
2860 } // namespace
2861 
2862 void Sema::ActOnOpenMPLoopInitialization(SourceLocation ForLoc, Stmt *Init) {
2863   assert(getLangOpts().OpenMP && "OpenMP is not active.");
2864   assert(Init && "Expected loop in canonical form.");
2865   unsigned CollapseIteration = DSAStack->getCollapseNumber();
2866   if (CollapseIteration > 0 &&
2867       isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {
2868     OpenMPIterationSpaceChecker ISC(*this, ForLoc);
2869     if (!ISC.CheckInit(Init, /*EmitDiags=*/false)) {
2870       DSAStack->addLoopControlVariable(ISC.GetLoopVar());
2871     }
2872     DSAStack->setCollapseNumber(CollapseIteration - 1);
2873   }
2874 }
2875 
2876 /// \brief Called on a for stmt to check and extract its iteration space
2877 /// for further processing (such as collapsing).
2878 static bool CheckOpenMPIterationSpace(
2879     OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA,
2880     unsigned CurrentNestedLoopCount, unsigned NestedLoopCount,
2881     Expr *CollapseLoopCountExpr, Expr *OrderedLoopCountExpr,
2882     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA,
2883     LoopIterationSpace &ResultIterSpace) {
2884   // OpenMP [2.6, Canonical Loop Form]
2885   //   for (init-expr; test-expr; incr-expr) structured-block
2886   auto For = dyn_cast_or_null<ForStmt>(S);
2887   if (!For) {
2888     SemaRef.Diag(S->getLocStart(), diag::err_omp_not_for)
2889         << (CollapseLoopCountExpr != nullptr || OrderedLoopCountExpr != nullptr)
2890         << getOpenMPDirectiveName(DKind) << NestedLoopCount
2891         << (CurrentNestedLoopCount > 0) << CurrentNestedLoopCount;
2892     if (NestedLoopCount > 1) {
2893       if (CollapseLoopCountExpr && OrderedLoopCountExpr)
2894         SemaRef.Diag(DSA.getConstructLoc(),
2895                      diag::note_omp_collapse_ordered_expr)
2896             << 2 << CollapseLoopCountExpr->getSourceRange()
2897             << OrderedLoopCountExpr->getSourceRange();
2898       else if (CollapseLoopCountExpr)
2899         SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(),
2900                      diag::note_omp_collapse_ordered_expr)
2901             << 0 << CollapseLoopCountExpr->getSourceRange();
2902       else
2903         SemaRef.Diag(OrderedLoopCountExpr->getExprLoc(),
2904                      diag::note_omp_collapse_ordered_expr)
2905             << 1 << OrderedLoopCountExpr->getSourceRange();
2906     }
2907     return true;
2908   }
2909   assert(For->getBody());
2910 
2911   OpenMPIterationSpaceChecker ISC(SemaRef, For->getForLoc());
2912 
2913   // Check init.
2914   auto Init = For->getInit();
2915   if (ISC.CheckInit(Init)) {
2916     return true;
2917   }
2918 
2919   bool HasErrors = false;
2920 
2921   // Check loop variable's type.
2922   auto Var = ISC.GetLoopVar();
2923 
2924   // OpenMP [2.6, Canonical Loop Form]
2925   // Var is one of the following:
2926   //   A variable of signed or unsigned integer type.
2927   //   For C++, a variable of a random access iterator type.
2928   //   For C, a variable of a pointer type.
2929   auto VarType = Var->getType().getNonReferenceType();
2930   if (!VarType->isDependentType() && !VarType->isIntegerType() &&
2931       !VarType->isPointerType() &&
2932       !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) {
2933     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_variable_type)
2934         << SemaRef.getLangOpts().CPlusPlus;
2935     HasErrors = true;
2936   }
2937 
2938   // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in a
2939   // Construct
2940   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2941   // parallel for construct is (are) private.
2942   // The loop iteration variable in the associated for-loop of a simd construct
2943   // with just one associated for-loop is linear with a constant-linear-step
2944   // that is the increment of the associated for-loop.
2945   // Exclude loop var from the list of variables with implicitly defined data
2946   // sharing attributes.
2947   VarsWithImplicitDSA.erase(Var);
2948 
2949   // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced in
2950   // a Construct, C/C++].
2951   // The loop iteration variable in the associated for-loop of a simd construct
2952   // with just one associated for-loop may be listed in a linear clause with a
2953   // constant-linear-step that is the increment of the associated for-loop.
2954   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2955   // parallel for construct may be listed in a private or lastprivate clause.
2956   DSAStackTy::DSAVarData DVar = DSA.getTopDSA(Var, false);
2957   auto LoopVarRefExpr = ISC.GetLoopVarRefExpr();
2958   // If LoopVarRefExpr is nullptr it means the corresponding loop variable is
2959   // declared in the loop and it is predetermined as a private.
2960   auto PredeterminedCKind =
2961       isOpenMPSimdDirective(DKind)
2962           ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate)
2963           : OMPC_private;
2964   if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
2965         DVar.CKind != OMPC_threadprivate && DVar.CKind != PredeterminedCKind) ||
2966        (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) &&
2967         DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private &&
2968         DVar.CKind != OMPC_lastprivate && DVar.CKind != OMPC_threadprivate)) &&
2969       ((DVar.CKind != OMPC_private && DVar.CKind != OMPC_threadprivate) ||
2970        DVar.RefExpr != nullptr)) {
2971     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa)
2972         << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind)
2973         << getOpenMPClauseName(PredeterminedCKind);
2974     if (DVar.RefExpr == nullptr)
2975       DVar.CKind = PredeterminedCKind;
2976     ReportOriginalDSA(SemaRef, &DSA, Var, DVar, /*IsLoopIterVar=*/true);
2977     HasErrors = true;
2978   } else if (LoopVarRefExpr != nullptr) {
2979     // Make the loop iteration variable private (for worksharing constructs),
2980     // linear (for simd directives with the only one associated loop) or
2981     // lastprivate (for simd directives with several collapsed or ordered
2982     // loops).
2983     if (DVar.CKind == OMPC_unknown)
2984       DVar = DSA.hasDSA(Var, isOpenMPPrivate, MatchesAlways(),
2985                         /*FromParent=*/false);
2986     DSA.addDSA(Var, LoopVarRefExpr, PredeterminedCKind);
2987   }
2988 
2989   assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars");
2990 
2991   // Check test-expr.
2992   HasErrors |= ISC.CheckCond(For->getCond());
2993 
2994   // Check incr-expr.
2995   HasErrors |= ISC.CheckInc(For->getInc());
2996 
2997   if (ISC.Dependent() || SemaRef.CurContext->isDependentContext() || HasErrors)
2998     return HasErrors;
2999 
3000   // Build the loop's iteration space representation.
3001   ResultIterSpace.PreCond = ISC.BuildPreCond(DSA.getCurScope(), For->getCond());
3002   ResultIterSpace.NumIterations = ISC.BuildNumIterations(
3003       DSA.getCurScope(), /* LimitedType */ isOpenMPWorksharingDirective(DKind));
3004   ResultIterSpace.CounterVar = ISC.BuildCounterVar();
3005   ResultIterSpace.PrivateCounterVar = ISC.BuildPrivateCounterVar();
3006   ResultIterSpace.CounterInit = ISC.BuildCounterInit();
3007   ResultIterSpace.CounterStep = ISC.BuildCounterStep();
3008   ResultIterSpace.InitSrcRange = ISC.GetInitSrcRange();
3009   ResultIterSpace.CondSrcRange = ISC.GetConditionSrcRange();
3010   ResultIterSpace.IncSrcRange = ISC.GetIncrementSrcRange();
3011   ResultIterSpace.Subtract = ISC.ShouldSubtractStep();
3012 
3013   HasErrors |= (ResultIterSpace.PreCond == nullptr ||
3014                 ResultIterSpace.NumIterations == nullptr ||
3015                 ResultIterSpace.CounterVar == nullptr ||
3016                 ResultIterSpace.PrivateCounterVar == nullptr ||
3017                 ResultIterSpace.CounterInit == nullptr ||
3018                 ResultIterSpace.CounterStep == nullptr);
3019 
3020   return HasErrors;
3021 }
3022 
3023 /// \brief Build 'VarRef = Start.
3024 static ExprResult BuildCounterInit(Sema &SemaRef, Scope *S, SourceLocation Loc,
3025                                    ExprResult VarRef, ExprResult Start) {
3026   TransformToNewDefs Transform(SemaRef);
3027   // Build 'VarRef = Start.
3028   auto NewStart = Transform.TransformExpr(Start.get()->IgnoreImplicit());
3029   if (NewStart.isInvalid())
3030     return ExprError();
3031   NewStart = SemaRef.PerformImplicitConversion(
3032       NewStart.get(), Start.get()->IgnoreImplicit()->getType(),
3033       Sema::AA_Converting,
3034       /*AllowExplicit=*/true);
3035   if (NewStart.isInvalid())
3036     return ExprError();
3037   NewStart = SemaRef.PerformImplicitConversion(
3038       NewStart.get(), VarRef.get()->getType(), Sema::AA_Converting,
3039       /*AllowExplicit=*/true);
3040   if (!NewStart.isUsable())
3041     return ExprError();
3042 
3043   auto Init =
3044       SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), NewStart.get());
3045   return Init;
3046 }
3047 
3048 /// \brief Build 'VarRef = Start + Iter * Step'.
3049 static ExprResult BuildCounterUpdate(Sema &SemaRef, Scope *S,
3050                                      SourceLocation Loc, ExprResult VarRef,
3051                                      ExprResult Start, ExprResult Iter,
3052                                      ExprResult Step, bool Subtract) {
3053   // Add parentheses (for debugging purposes only).
3054   Iter = SemaRef.ActOnParenExpr(Loc, Loc, Iter.get());
3055   if (!VarRef.isUsable() || !Start.isUsable() || !Iter.isUsable() ||
3056       !Step.isUsable())
3057     return ExprError();
3058 
3059   TransformToNewDefs Transform(SemaRef);
3060   auto NewStep = Transform.TransformExpr(Step.get()->IgnoreImplicit());
3061   if (NewStep.isInvalid())
3062     return ExprError();
3063   NewStep = SemaRef.PerformImplicitConversion(
3064       NewStep.get(), Step.get()->IgnoreImplicit()->getType(),
3065       Sema::AA_Converting,
3066       /*AllowExplicit=*/true);
3067   if (NewStep.isInvalid())
3068     return ExprError();
3069   ExprResult Update =
3070       SemaRef.BuildBinOp(S, Loc, BO_Mul, Iter.get(), NewStep.get());
3071   if (!Update.isUsable())
3072     return ExprError();
3073 
3074   // Build 'VarRef = Start + Iter * Step'.
3075   auto NewStart = Transform.TransformExpr(Start.get()->IgnoreImplicit());
3076   if (NewStart.isInvalid())
3077     return ExprError();
3078   NewStart = SemaRef.PerformImplicitConversion(
3079       NewStart.get(), Start.get()->IgnoreImplicit()->getType(),
3080       Sema::AA_Converting,
3081       /*AllowExplicit=*/true);
3082   if (NewStart.isInvalid())
3083     return ExprError();
3084   Update = SemaRef.BuildBinOp(S, Loc, (Subtract ? BO_Sub : BO_Add),
3085                               NewStart.get(), Update.get());
3086   if (!Update.isUsable())
3087     return ExprError();
3088 
3089   Update = SemaRef.PerformImplicitConversion(
3090       Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true);
3091   if (!Update.isUsable())
3092     return ExprError();
3093 
3094   Update = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), Update.get());
3095   return Update;
3096 }
3097 
3098 /// \brief Convert integer expression \a E to make it have at least \a Bits
3099 /// bits.
3100 static ExprResult WidenIterationCount(unsigned Bits, Expr *E,
3101                                       Sema &SemaRef) {
3102   if (E == nullptr)
3103     return ExprError();
3104   auto &C = SemaRef.Context;
3105   QualType OldType = E->getType();
3106   unsigned HasBits = C.getTypeSize(OldType);
3107   if (HasBits >= Bits)
3108     return ExprResult(E);
3109   // OK to convert to signed, because new type has more bits than old.
3110   QualType NewType = C.getIntTypeForBitwidth(Bits, /* Signed */ true);
3111   return SemaRef.PerformImplicitConversion(E, NewType, Sema::AA_Converting,
3112                                            true);
3113 }
3114 
3115 /// \brief Check if the given expression \a E is a constant integer that fits
3116 /// into \a Bits bits.
3117 static bool FitsInto(unsigned Bits, bool Signed, Expr *E, Sema &SemaRef) {
3118   if (E == nullptr)
3119     return false;
3120   llvm::APSInt Result;
3121   if (E->isIntegerConstantExpr(Result, SemaRef.Context))
3122     return Signed ? Result.isSignedIntN(Bits) : Result.isIntN(Bits);
3123   return false;
3124 }
3125 
3126 /// \brief Called on a for stmt to check itself and nested loops (if any).
3127 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop,
3128 /// number of collapsed loops otherwise.
3129 static unsigned
3130 CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr,
3131                 Expr *OrderedLoopCountExpr, Stmt *AStmt, Sema &SemaRef,
3132                 DSAStackTy &DSA,
3133                 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA,
3134                 OMPLoopDirective::HelperExprs &Built) {
3135   unsigned NestedLoopCount = 1;
3136   if (CollapseLoopCountExpr) {
3137     // Found 'collapse' clause - calculate collapse number.
3138     llvm::APSInt Result;
3139     if (CollapseLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
3140       NestedLoopCount += Result.getLimitedValue() - 1;
3141   }
3142   if (OrderedLoopCountExpr) {
3143     // Found 'ordered' clause - calculate collapse number.
3144     llvm::APSInt Result;
3145     if (OrderedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
3146       NestedLoopCount += Result.getLimitedValue() - 1;
3147   }
3148   // This is helper routine for loop directives (e.g., 'for', 'simd',
3149   // 'for simd', etc.).
3150   SmallVector<LoopIterationSpace, 4> IterSpaces;
3151   IterSpaces.resize(NestedLoopCount);
3152   Stmt *CurStmt = AStmt->IgnoreContainers(/* IgnoreCaptured */ true);
3153   for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) {
3154     if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt,
3155                                   NestedLoopCount, CollapseLoopCountExpr,
3156                                   OrderedLoopCountExpr, VarsWithImplicitDSA,
3157                                   IterSpaces[Cnt]))
3158       return 0;
3159     // Move on to the next nested for loop, or to the loop body.
3160     // OpenMP [2.8.1, simd construct, Restrictions]
3161     // All loops associated with the construct must be perfectly nested; that
3162     // is, there must be no intervening code nor any OpenMP directive between
3163     // any two loops.
3164     CurStmt = cast<ForStmt>(CurStmt)->getBody()->IgnoreContainers();
3165   }
3166 
3167   Built.clear(/* size */ NestedLoopCount);
3168 
3169   if (SemaRef.CurContext->isDependentContext())
3170     return NestedLoopCount;
3171 
3172   // An example of what is generated for the following code:
3173   //
3174   //   #pragma omp simd collapse(2) ordered(2)
3175   //   for (i = 0; i < NI; ++i)
3176   //     for (k = 0; k < NK; ++k)
3177   //       for (j = J0; j < NJ; j+=2) {
3178   //         <loop body>
3179   //       }
3180   //
3181   // We generate the code below.
3182   // Note: the loop body may be outlined in CodeGen.
3183   // Note: some counters may be C++ classes, operator- is used to find number of
3184   // iterations and operator+= to calculate counter value.
3185   // Note: decltype(NumIterations) must be integer type (in 'omp for', only i32
3186   // or i64 is currently supported).
3187   //
3188   //   #define NumIterations (NI * ((NJ - J0 - 1 + 2) / 2))
3189   //   for (int[32|64]_t IV = 0; IV < NumIterations; ++IV ) {
3190   //     .local.i = IV / ((NJ - J0 - 1 + 2) / 2);
3191   //     .local.j = J0 + (IV % ((NJ - J0 - 1 + 2) / 2)) * 2;
3192   //     // similar updates for vars in clauses (e.g. 'linear')
3193   //     <loop body (using local i and j)>
3194   //   }
3195   //   i = NI; // assign final values of counters
3196   //   j = NJ;
3197   //
3198 
3199   // Last iteration number is (I1 * I2 * ... In) - 1, where I1, I2 ... In are
3200   // the iteration counts of the collapsed for loops.
3201   // Precondition tests if there is at least one iteration (all conditions are
3202   // true).
3203   auto PreCond = ExprResult(IterSpaces[0].PreCond);
3204   auto N0 = IterSpaces[0].NumIterations;
3205   ExprResult LastIteration32 = WidenIterationCount(
3206       32 /* Bits */, SemaRef.PerformImplicitConversion(
3207                                 N0->IgnoreImpCasts(), N0->getType(),
3208                                 Sema::AA_Converting, /*AllowExplicit=*/true)
3209                          .get(),
3210       SemaRef);
3211   ExprResult LastIteration64 = WidenIterationCount(
3212       64 /* Bits */, SemaRef.PerformImplicitConversion(
3213                                 N0->IgnoreImpCasts(), N0->getType(),
3214                                 Sema::AA_Converting, /*AllowExplicit=*/true)
3215                          .get(),
3216       SemaRef);
3217 
3218   if (!LastIteration32.isUsable() || !LastIteration64.isUsable())
3219     return NestedLoopCount;
3220 
3221   auto &C = SemaRef.Context;
3222   bool AllCountsNeedLessThan32Bits = C.getTypeSize(N0->getType()) < 32;
3223 
3224   Scope *CurScope = DSA.getCurScope();
3225   for (unsigned Cnt = 1; Cnt < NestedLoopCount; ++Cnt) {
3226     if (PreCond.isUsable()) {
3227       PreCond = SemaRef.BuildBinOp(CurScope, SourceLocation(), BO_LAnd,
3228                                    PreCond.get(), IterSpaces[Cnt].PreCond);
3229     }
3230     auto N = IterSpaces[Cnt].NumIterations;
3231     AllCountsNeedLessThan32Bits &= C.getTypeSize(N->getType()) < 32;
3232     if (LastIteration32.isUsable())
3233       LastIteration32 = SemaRef.BuildBinOp(
3234           CurScope, SourceLocation(), BO_Mul, LastIteration32.get(),
3235           SemaRef.PerformImplicitConversion(N->IgnoreImpCasts(), N->getType(),
3236                                             Sema::AA_Converting,
3237                                             /*AllowExplicit=*/true)
3238               .get());
3239     if (LastIteration64.isUsable())
3240       LastIteration64 = SemaRef.BuildBinOp(
3241           CurScope, SourceLocation(), BO_Mul, LastIteration64.get(),
3242           SemaRef.PerformImplicitConversion(N->IgnoreImpCasts(), N->getType(),
3243                                             Sema::AA_Converting,
3244                                             /*AllowExplicit=*/true)
3245               .get());
3246   }
3247 
3248   // Choose either the 32-bit or 64-bit version.
3249   ExprResult LastIteration = LastIteration64;
3250   if (LastIteration32.isUsable() &&
3251       C.getTypeSize(LastIteration32.get()->getType()) == 32 &&
3252       (AllCountsNeedLessThan32Bits || NestedLoopCount == 1 ||
3253        FitsInto(
3254            32 /* Bits */,
3255            LastIteration32.get()->getType()->hasSignedIntegerRepresentation(),
3256            LastIteration64.get(), SemaRef)))
3257     LastIteration = LastIteration32;
3258 
3259   if (!LastIteration.isUsable())
3260     return 0;
3261 
3262   // Save the number of iterations.
3263   ExprResult NumIterations = LastIteration;
3264   {
3265     LastIteration = SemaRef.BuildBinOp(
3266         CurScope, SourceLocation(), BO_Sub, LastIteration.get(),
3267         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
3268     if (!LastIteration.isUsable())
3269       return 0;
3270   }
3271 
3272   // Calculate the last iteration number beforehand instead of doing this on
3273   // each iteration. Do not do this if the number of iterations may be kfold-ed.
3274   llvm::APSInt Result;
3275   bool IsConstant =
3276       LastIteration.get()->isIntegerConstantExpr(Result, SemaRef.Context);
3277   ExprResult CalcLastIteration;
3278   if (!IsConstant) {
3279     SourceLocation SaveLoc;
3280     VarDecl *SaveVar =
3281         buildVarDecl(SemaRef, SaveLoc, LastIteration.get()->getType(),
3282                      ".omp.last.iteration");
3283     ExprResult SaveRef = buildDeclRefExpr(
3284         SemaRef, SaveVar, LastIteration.get()->getType(), SaveLoc);
3285     CalcLastIteration = SemaRef.BuildBinOp(CurScope, SaveLoc, BO_Assign,
3286                                            SaveRef.get(), LastIteration.get());
3287     LastIteration = SaveRef;
3288 
3289     // Prepare SaveRef + 1.
3290     NumIterations = SemaRef.BuildBinOp(
3291         CurScope, SaveLoc, BO_Add, SaveRef.get(),
3292         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
3293     if (!NumIterations.isUsable())
3294       return 0;
3295   }
3296 
3297   SourceLocation InitLoc = IterSpaces[0].InitSrcRange.getBegin();
3298 
3299   QualType VType = LastIteration.get()->getType();
3300   // Build variables passed into runtime, nesessary for worksharing directives.
3301   ExprResult LB, UB, IL, ST, EUB;
3302   if (isOpenMPWorksharingDirective(DKind)) {
3303     // Lower bound variable, initialized with zero.
3304     VarDecl *LBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.lb");
3305     LB = buildDeclRefExpr(SemaRef, LBDecl, VType, InitLoc);
3306     SemaRef.AddInitializerToDecl(
3307         LBDecl, SemaRef.ActOnIntegerConstant(InitLoc, 0).get(),
3308         /*DirectInit*/ false, /*TypeMayContainAuto*/ false);
3309 
3310     // Upper bound variable, initialized with last iteration number.
3311     VarDecl *UBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.ub");
3312     UB = buildDeclRefExpr(SemaRef, UBDecl, VType, InitLoc);
3313     SemaRef.AddInitializerToDecl(UBDecl, LastIteration.get(),
3314                                  /*DirectInit*/ false,
3315                                  /*TypeMayContainAuto*/ false);
3316 
3317     // A 32-bit variable-flag where runtime returns 1 for the last iteration.
3318     // This will be used to implement clause 'lastprivate'.
3319     QualType Int32Ty = SemaRef.Context.getIntTypeForBitwidth(32, true);
3320     VarDecl *ILDecl = buildVarDecl(SemaRef, InitLoc, Int32Ty, ".omp.is_last");
3321     IL = buildDeclRefExpr(SemaRef, ILDecl, Int32Ty, InitLoc);
3322     SemaRef.AddInitializerToDecl(
3323         ILDecl, SemaRef.ActOnIntegerConstant(InitLoc, 0).get(),
3324         /*DirectInit*/ false, /*TypeMayContainAuto*/ false);
3325 
3326     // Stride variable returned by runtime (we initialize it to 1 by default).
3327     VarDecl *STDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.stride");
3328     ST = buildDeclRefExpr(SemaRef, STDecl, VType, InitLoc);
3329     SemaRef.AddInitializerToDecl(
3330         STDecl, SemaRef.ActOnIntegerConstant(InitLoc, 1).get(),
3331         /*DirectInit*/ false, /*TypeMayContainAuto*/ false);
3332 
3333     // Build expression: UB = min(UB, LastIteration)
3334     // It is nesessary for CodeGen of directives with static scheduling.
3335     ExprResult IsUBGreater = SemaRef.BuildBinOp(CurScope, InitLoc, BO_GT,
3336                                                 UB.get(), LastIteration.get());
3337     ExprResult CondOp = SemaRef.ActOnConditionalOp(
3338         InitLoc, InitLoc, IsUBGreater.get(), LastIteration.get(), UB.get());
3339     EUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, UB.get(),
3340                              CondOp.get());
3341     EUB = SemaRef.ActOnFinishFullExpr(EUB.get());
3342   }
3343 
3344   // Build the iteration variable and its initialization before loop.
3345   ExprResult IV;
3346   ExprResult Init;
3347   {
3348     VarDecl *IVDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.iv");
3349     IV = buildDeclRefExpr(SemaRef, IVDecl, VType, InitLoc);
3350     Expr *RHS = isOpenMPWorksharingDirective(DKind)
3351                     ? LB.get()
3352                     : SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get();
3353     Init = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, IV.get(), RHS);
3354     Init = SemaRef.ActOnFinishFullExpr(Init.get());
3355   }
3356 
3357   // Loop condition (IV < NumIterations) or (IV <= UB) for worksharing loops.
3358   SourceLocation CondLoc;
3359   ExprResult Cond =
3360       isOpenMPWorksharingDirective(DKind)
3361           ? SemaRef.BuildBinOp(CurScope, CondLoc, BO_LE, IV.get(), UB.get())
3362           : SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
3363                                NumIterations.get());
3364 
3365   // Loop increment (IV = IV + 1)
3366   SourceLocation IncLoc;
3367   ExprResult Inc =
3368       SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, IV.get(),
3369                          SemaRef.ActOnIntegerConstant(IncLoc, 1).get());
3370   if (!Inc.isUsable())
3371     return 0;
3372   Inc = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, IV.get(), Inc.get());
3373   Inc = SemaRef.ActOnFinishFullExpr(Inc.get());
3374   if (!Inc.isUsable())
3375     return 0;
3376 
3377   // Increments for worksharing loops (LB = LB + ST; UB = UB + ST).
3378   // Used for directives with static scheduling.
3379   ExprResult NextLB, NextUB;
3380   if (isOpenMPWorksharingDirective(DKind)) {
3381     // LB + ST
3382     NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, LB.get(), ST.get());
3383     if (!NextLB.isUsable())
3384       return 0;
3385     // LB = LB + ST
3386     NextLB =
3387         SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, LB.get(), NextLB.get());
3388     NextLB = SemaRef.ActOnFinishFullExpr(NextLB.get());
3389     if (!NextLB.isUsable())
3390       return 0;
3391     // UB + ST
3392     NextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, UB.get(), ST.get());
3393     if (!NextUB.isUsable())
3394       return 0;
3395     // UB = UB + ST
3396     NextUB =
3397         SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, UB.get(), NextUB.get());
3398     NextUB = SemaRef.ActOnFinishFullExpr(NextUB.get());
3399     if (!NextUB.isUsable())
3400       return 0;
3401   }
3402 
3403   // Build updates and final values of the loop counters.
3404   bool HasErrors = false;
3405   Built.Counters.resize(NestedLoopCount);
3406   Built.Inits.resize(NestedLoopCount);
3407   Built.Updates.resize(NestedLoopCount);
3408   Built.Finals.resize(NestedLoopCount);
3409   {
3410     ExprResult Div;
3411     // Go from inner nested loop to outer.
3412     for (int Cnt = NestedLoopCount - 1; Cnt >= 0; --Cnt) {
3413       LoopIterationSpace &IS = IterSpaces[Cnt];
3414       SourceLocation UpdLoc = IS.IncSrcRange.getBegin();
3415       // Build: Iter = (IV / Div) % IS.NumIters
3416       // where Div is product of previous iterations' IS.NumIters.
3417       ExprResult Iter;
3418       if (Div.isUsable()) {
3419         Iter =
3420             SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Div, IV.get(), Div.get());
3421       } else {
3422         Iter = IV;
3423         assert((Cnt == (int)NestedLoopCount - 1) &&
3424                "unusable div expected on first iteration only");
3425       }
3426 
3427       if (Cnt != 0 && Iter.isUsable())
3428         Iter = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Rem, Iter.get(),
3429                                   IS.NumIterations);
3430       if (!Iter.isUsable()) {
3431         HasErrors = true;
3432         break;
3433       }
3434 
3435       // Build update: IS.CounterVar(Private) = IS.Start + Iter * IS.Step
3436       auto *CounterVar = buildDeclRefExpr(
3437           SemaRef, cast<VarDecl>(cast<DeclRefExpr>(IS.CounterVar)->getDecl()),
3438           IS.CounterVar->getType(), IS.CounterVar->getExprLoc(),
3439           /*RefersToCapture=*/true);
3440       ExprResult Init = BuildCounterInit(SemaRef, CurScope, UpdLoc, CounterVar,
3441                                          IS.CounterInit);
3442       if (!Init.isUsable()) {
3443         HasErrors = true;
3444         break;
3445       }
3446       ExprResult Update =
3447           BuildCounterUpdate(SemaRef, CurScope, UpdLoc, CounterVar,
3448                              IS.CounterInit, Iter, IS.CounterStep, IS.Subtract);
3449       if (!Update.isUsable()) {
3450         HasErrors = true;
3451         break;
3452       }
3453 
3454       // Build final: IS.CounterVar = IS.Start + IS.NumIters * IS.Step
3455       ExprResult Final = BuildCounterUpdate(
3456           SemaRef, CurScope, UpdLoc, CounterVar, IS.CounterInit,
3457           IS.NumIterations, IS.CounterStep, IS.Subtract);
3458       if (!Final.isUsable()) {
3459         HasErrors = true;
3460         break;
3461       }
3462 
3463       // Build Div for the next iteration: Div <- Div * IS.NumIters
3464       if (Cnt != 0) {
3465         if (Div.isUnset())
3466           Div = IS.NumIterations;
3467         else
3468           Div = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Mul, Div.get(),
3469                                    IS.NumIterations);
3470 
3471         // Add parentheses (for debugging purposes only).
3472         if (Div.isUsable())
3473           Div = SemaRef.ActOnParenExpr(UpdLoc, UpdLoc, Div.get());
3474         if (!Div.isUsable()) {
3475           HasErrors = true;
3476           break;
3477         }
3478       }
3479       if (!Update.isUsable() || !Final.isUsable()) {
3480         HasErrors = true;
3481         break;
3482       }
3483       // Save results
3484       Built.Counters[Cnt] = IS.CounterVar;
3485       Built.PrivateCounters[Cnt] = IS.PrivateCounterVar;
3486       Built.Inits[Cnt] = Init.get();
3487       Built.Updates[Cnt] = Update.get();
3488       Built.Finals[Cnt] = Final.get();
3489     }
3490   }
3491 
3492   if (HasErrors)
3493     return 0;
3494 
3495   // Save results
3496   Built.IterationVarRef = IV.get();
3497   Built.LastIteration = LastIteration.get();
3498   Built.NumIterations = NumIterations.get();
3499   Built.CalcLastIteration =
3500       SemaRef.ActOnFinishFullExpr(CalcLastIteration.get()).get();
3501   Built.PreCond = PreCond.get();
3502   Built.Cond = Cond.get();
3503   Built.Init = Init.get();
3504   Built.Inc = Inc.get();
3505   Built.LB = LB.get();
3506   Built.UB = UB.get();
3507   Built.IL = IL.get();
3508   Built.ST = ST.get();
3509   Built.EUB = EUB.get();
3510   Built.NLB = NextLB.get();
3511   Built.NUB = NextUB.get();
3512 
3513   return NestedLoopCount;
3514 }
3515 
3516 static Expr *getCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) {
3517   auto &&CollapseFilter = [](const OMPClause *C) -> bool {
3518     return C->getClauseKind() == OMPC_collapse;
3519   };
3520   OMPExecutableDirective::filtered_clause_iterator<decltype(CollapseFilter)> I(
3521       Clauses, std::move(CollapseFilter));
3522   if (I)
3523     return cast<OMPCollapseClause>(*I)->getNumForLoops();
3524   return nullptr;
3525 }
3526 
3527 static Expr *getOrderedNumberExpr(ArrayRef<OMPClause *> Clauses) {
3528   auto &&OrderedFilter = [](const OMPClause *C) -> bool {
3529     return C->getClauseKind() == OMPC_ordered;
3530   };
3531   OMPExecutableDirective::filtered_clause_iterator<decltype(OrderedFilter)> I(
3532       Clauses, std::move(OrderedFilter));
3533   if (I)
3534     return cast<OMPOrderedClause>(*I)->getNumForLoops();
3535   return nullptr;
3536 }
3537 
3538 StmtResult Sema::ActOnOpenMPSimdDirective(
3539     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
3540     SourceLocation EndLoc,
3541     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
3542   OMPLoopDirective::HelperExprs B;
3543   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
3544   // define the nested loops number.
3545   unsigned NestedLoopCount = CheckOpenMPLoop(
3546       OMPD_simd, getCollapseNumberExpr(Clauses), getOrderedNumberExpr(Clauses),
3547       AStmt, *this, *DSAStack, VarsWithImplicitDSA, B);
3548   if (NestedLoopCount == 0)
3549     return StmtError();
3550 
3551   assert((CurContext->isDependentContext() || B.builtAll()) &&
3552          "omp simd loop exprs were not built");
3553 
3554   if (!CurContext->isDependentContext()) {
3555     // Finalize the clauses that need pre-built expressions for CodeGen.
3556     for (auto C : Clauses) {
3557       if (auto LC = dyn_cast<OMPLinearClause>(C))
3558         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
3559                                      B.NumIterations, *this, CurScope))
3560           return StmtError();
3561     }
3562   }
3563 
3564   getCurFunction()->setHasBranchProtectedScope();
3565   return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
3566                                   Clauses, AStmt, B);
3567 }
3568 
3569 StmtResult Sema::ActOnOpenMPForDirective(
3570     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
3571     SourceLocation EndLoc,
3572     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
3573   OMPLoopDirective::HelperExprs B;
3574   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
3575   // define the nested loops number.
3576   unsigned NestedLoopCount = CheckOpenMPLoop(
3577       OMPD_for, getCollapseNumberExpr(Clauses), getOrderedNumberExpr(Clauses),
3578       AStmt, *this, *DSAStack, VarsWithImplicitDSA, B);
3579   if (NestedLoopCount == 0)
3580     return StmtError();
3581 
3582   assert((CurContext->isDependentContext() || B.builtAll()) &&
3583          "omp for loop exprs were not built");
3584 
3585   if (!CurContext->isDependentContext()) {
3586     // Finalize the clauses that need pre-built expressions for CodeGen.
3587     for (auto C : Clauses) {
3588       if (auto LC = dyn_cast<OMPLinearClause>(C))
3589         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
3590                                      B.NumIterations, *this, CurScope))
3591           return StmtError();
3592     }
3593   }
3594 
3595   getCurFunction()->setHasBranchProtectedScope();
3596   return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
3597                                  Clauses, AStmt, B);
3598 }
3599 
3600 StmtResult Sema::ActOnOpenMPForSimdDirective(
3601     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
3602     SourceLocation EndLoc,
3603     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
3604   OMPLoopDirective::HelperExprs B;
3605   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
3606   // define the nested loops number.
3607   unsigned NestedLoopCount =
3608       CheckOpenMPLoop(OMPD_for_simd, getCollapseNumberExpr(Clauses),
3609                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
3610                       VarsWithImplicitDSA, B);
3611   if (NestedLoopCount == 0)
3612     return StmtError();
3613 
3614   assert((CurContext->isDependentContext() || B.builtAll()) &&
3615          "omp for simd loop exprs were not built");
3616 
3617   if (!CurContext->isDependentContext()) {
3618     // Finalize the clauses that need pre-built expressions for CodeGen.
3619     for (auto C : Clauses) {
3620       if (auto LC = dyn_cast<OMPLinearClause>(C))
3621         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
3622                                      B.NumIterations, *this, CurScope))
3623           return StmtError();
3624     }
3625   }
3626 
3627   getCurFunction()->setHasBranchProtectedScope();
3628   return OMPForSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
3629                                      Clauses, AStmt, B);
3630 }
3631 
3632 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
3633                                               Stmt *AStmt,
3634                                               SourceLocation StartLoc,
3635                                               SourceLocation EndLoc) {
3636   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3637   auto BaseStmt = AStmt;
3638   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
3639     BaseStmt = CS->getCapturedStmt();
3640   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
3641     auto S = C->children();
3642     if (S.begin() == S.end())
3643       return StmtError();
3644     // All associated statements must be '#pragma omp section' except for
3645     // the first one.
3646     for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) {
3647       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
3648         if (SectionStmt)
3649           Diag(SectionStmt->getLocStart(),
3650                diag::err_omp_sections_substmt_not_section);
3651         return StmtError();
3652       }
3653     }
3654   } else {
3655     Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt);
3656     return StmtError();
3657   }
3658 
3659   getCurFunction()->setHasBranchProtectedScope();
3660 
3661   return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses,
3662                                       AStmt);
3663 }
3664 
3665 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
3666                                              SourceLocation StartLoc,
3667                                              SourceLocation EndLoc) {
3668   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3669 
3670   getCurFunction()->setHasBranchProtectedScope();
3671 
3672   return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt);
3673 }
3674 
3675 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
3676                                             Stmt *AStmt,
3677                                             SourceLocation StartLoc,
3678                                             SourceLocation EndLoc) {
3679   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3680 
3681   getCurFunction()->setHasBranchProtectedScope();
3682 
3683   // OpenMP [2.7.3, single Construct, Restrictions]
3684   // The copyprivate clause must not be used with the nowait clause.
3685   OMPClause *Nowait = nullptr;
3686   OMPClause *Copyprivate = nullptr;
3687   for (auto *Clause : Clauses) {
3688     if (Clause->getClauseKind() == OMPC_nowait)
3689       Nowait = Clause;
3690     else if (Clause->getClauseKind() == OMPC_copyprivate)
3691       Copyprivate = Clause;
3692     if (Copyprivate && Nowait) {
3693       Diag(Copyprivate->getLocStart(),
3694            diag::err_omp_single_copyprivate_with_nowait);
3695       Diag(Nowait->getLocStart(), diag::note_omp_nowait_clause_here);
3696       return StmtError();
3697     }
3698   }
3699 
3700   return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
3701 }
3702 
3703 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt,
3704                                             SourceLocation StartLoc,
3705                                             SourceLocation EndLoc) {
3706   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3707 
3708   getCurFunction()->setHasBranchProtectedScope();
3709 
3710   return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt);
3711 }
3712 
3713 StmtResult
3714 Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName,
3715                                    Stmt *AStmt, SourceLocation StartLoc,
3716                                    SourceLocation EndLoc) {
3717   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3718 
3719   getCurFunction()->setHasBranchProtectedScope();
3720 
3721   return OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc,
3722                                       AStmt);
3723 }
3724 
3725 StmtResult Sema::ActOnOpenMPParallelForDirective(
3726     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
3727     SourceLocation EndLoc,
3728     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
3729   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3730   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
3731   // 1.2.2 OpenMP Language Terminology
3732   // Structured block - An executable statement with a single entry at the
3733   // top and a single exit at the bottom.
3734   // The point of exit cannot be a branch out of the structured block.
3735   // longjmp() and throw() must not violate the entry/exit criteria.
3736   CS->getCapturedDecl()->setNothrow();
3737 
3738   OMPLoopDirective::HelperExprs B;
3739   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
3740   // define the nested loops number.
3741   unsigned NestedLoopCount =
3742       CheckOpenMPLoop(OMPD_parallel_for, getCollapseNumberExpr(Clauses),
3743                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
3744                       VarsWithImplicitDSA, B);
3745   if (NestedLoopCount == 0)
3746     return StmtError();
3747 
3748   assert((CurContext->isDependentContext() || B.builtAll()) &&
3749          "omp parallel for loop exprs were not built");
3750 
3751   if (!CurContext->isDependentContext()) {
3752     // Finalize the clauses that need pre-built expressions for CodeGen.
3753     for (auto C : Clauses) {
3754       if (auto LC = dyn_cast<OMPLinearClause>(C))
3755         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
3756                                      B.NumIterations, *this, CurScope))
3757           return StmtError();
3758     }
3759   }
3760 
3761   getCurFunction()->setHasBranchProtectedScope();
3762   return OMPParallelForDirective::Create(Context, StartLoc, EndLoc,
3763                                          NestedLoopCount, Clauses, AStmt, B);
3764 }
3765 
3766 StmtResult Sema::ActOnOpenMPParallelForSimdDirective(
3767     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
3768     SourceLocation EndLoc,
3769     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
3770   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3771   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
3772   // 1.2.2 OpenMP Language Terminology
3773   // Structured block - An executable statement with a single entry at the
3774   // top and a single exit at the bottom.
3775   // The point of exit cannot be a branch out of the structured block.
3776   // longjmp() and throw() must not violate the entry/exit criteria.
3777   CS->getCapturedDecl()->setNothrow();
3778 
3779   OMPLoopDirective::HelperExprs B;
3780   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
3781   // define the nested loops number.
3782   unsigned NestedLoopCount =
3783       CheckOpenMPLoop(OMPD_parallel_for_simd, getCollapseNumberExpr(Clauses),
3784                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
3785                       VarsWithImplicitDSA, B);
3786   if (NestedLoopCount == 0)
3787     return StmtError();
3788 
3789   if (!CurContext->isDependentContext()) {
3790     // Finalize the clauses that need pre-built expressions for CodeGen.
3791     for (auto C : Clauses) {
3792       if (auto LC = dyn_cast<OMPLinearClause>(C))
3793         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
3794                                      B.NumIterations, *this, CurScope))
3795           return StmtError();
3796     }
3797   }
3798 
3799   getCurFunction()->setHasBranchProtectedScope();
3800   return OMPParallelForSimdDirective::Create(
3801       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
3802 }
3803 
3804 StmtResult
3805 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
3806                                            Stmt *AStmt, SourceLocation StartLoc,
3807                                            SourceLocation EndLoc) {
3808   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3809   auto BaseStmt = AStmt;
3810   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
3811     BaseStmt = CS->getCapturedStmt();
3812   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
3813     auto S = C->children();
3814     if (S.begin() == S.end())
3815       return StmtError();
3816     // All associated statements must be '#pragma omp section' except for
3817     // the first one.
3818     for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) {
3819       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
3820         if (SectionStmt)
3821           Diag(SectionStmt->getLocStart(),
3822                diag::err_omp_parallel_sections_substmt_not_section);
3823         return StmtError();
3824       }
3825     }
3826   } else {
3827     Diag(AStmt->getLocStart(),
3828          diag::err_omp_parallel_sections_not_compound_stmt);
3829     return StmtError();
3830   }
3831 
3832   getCurFunction()->setHasBranchProtectedScope();
3833 
3834   return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc,
3835                                               Clauses, AStmt);
3836 }
3837 
3838 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
3839                                           Stmt *AStmt, SourceLocation StartLoc,
3840                                           SourceLocation EndLoc) {
3841   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3842   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
3843   // 1.2.2 OpenMP Language Terminology
3844   // Structured block - An executable statement with a single entry at the
3845   // top and a single exit at the bottom.
3846   // The point of exit cannot be a branch out of the structured block.
3847   // longjmp() and throw() must not violate the entry/exit criteria.
3848   CS->getCapturedDecl()->setNothrow();
3849 
3850   getCurFunction()->setHasBranchProtectedScope();
3851 
3852   return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
3853 }
3854 
3855 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
3856                                                SourceLocation EndLoc) {
3857   return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc);
3858 }
3859 
3860 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc,
3861                                              SourceLocation EndLoc) {
3862   return OMPBarrierDirective::Create(Context, StartLoc, EndLoc);
3863 }
3864 
3865 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc,
3866                                               SourceLocation EndLoc) {
3867   return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc);
3868 }
3869 
3870 StmtResult Sema::ActOnOpenMPTaskgroupDirective(Stmt *AStmt,
3871                                                SourceLocation StartLoc,
3872                                                SourceLocation EndLoc) {
3873   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3874 
3875   getCurFunction()->setHasBranchProtectedScope();
3876 
3877   return OMPTaskgroupDirective::Create(Context, StartLoc, EndLoc, AStmt);
3878 }
3879 
3880 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses,
3881                                            SourceLocation StartLoc,
3882                                            SourceLocation EndLoc) {
3883   assert(Clauses.size() <= 1 && "Extra clauses in flush directive");
3884   return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses);
3885 }
3886 
3887 StmtResult Sema::ActOnOpenMPOrderedDirective(Stmt *AStmt,
3888                                              SourceLocation StartLoc,
3889                                              SourceLocation EndLoc) {
3890   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3891 
3892   getCurFunction()->setHasBranchProtectedScope();
3893 
3894   return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, AStmt);
3895 }
3896 
3897 namespace {
3898 /// \brief Helper class for checking expression in 'omp atomic [update]'
3899 /// construct.
3900 class OpenMPAtomicUpdateChecker {
3901   /// \brief Error results for atomic update expressions.
3902   enum ExprAnalysisErrorCode {
3903     /// \brief A statement is not an expression statement.
3904     NotAnExpression,
3905     /// \brief Expression is not builtin binary or unary operation.
3906     NotABinaryOrUnaryExpression,
3907     /// \brief Unary operation is not post-/pre- increment/decrement operation.
3908     NotAnUnaryIncDecExpression,
3909     /// \brief An expression is not of scalar type.
3910     NotAScalarType,
3911     /// \brief A binary operation is not an assignment operation.
3912     NotAnAssignmentOp,
3913     /// \brief RHS part of the binary operation is not a binary expression.
3914     NotABinaryExpression,
3915     /// \brief RHS part is not additive/multiplicative/shift/biwise binary
3916     /// expression.
3917     NotABinaryOperator,
3918     /// \brief RHS binary operation does not have reference to the updated LHS
3919     /// part.
3920     NotAnUpdateExpression,
3921     /// \brief No errors is found.
3922     NoError
3923   };
3924   /// \brief Reference to Sema.
3925   Sema &SemaRef;
3926   /// \brief A location for note diagnostics (when error is found).
3927   SourceLocation NoteLoc;
3928   /// \brief 'x' lvalue part of the source atomic expression.
3929   Expr *X;
3930   /// \brief 'expr' rvalue part of the source atomic expression.
3931   Expr *E;
3932   /// \brief Helper expression of the form
3933   /// 'OpaqueValueExpr(x) binop OpaqueValueExpr(expr)' or
3934   /// 'OpaqueValueExpr(expr) binop OpaqueValueExpr(x)'.
3935   Expr *UpdateExpr;
3936   /// \brief Is 'x' a LHS in a RHS part of full update expression. It is
3937   /// important for non-associative operations.
3938   bool IsXLHSInRHSPart;
3939   BinaryOperatorKind Op;
3940   SourceLocation OpLoc;
3941   /// \brief true if the source expression is a postfix unary operation, false
3942   /// if it is a prefix unary operation.
3943   bool IsPostfixUpdate;
3944 
3945 public:
3946   OpenMPAtomicUpdateChecker(Sema &SemaRef)
3947       : SemaRef(SemaRef), X(nullptr), E(nullptr), UpdateExpr(nullptr),
3948         IsXLHSInRHSPart(false), Op(BO_PtrMemD), IsPostfixUpdate(false) {}
3949   /// \brief Check specified statement that it is suitable for 'atomic update'
3950   /// constructs and extract 'x', 'expr' and Operation from the original
3951   /// expression. If DiagId and NoteId == 0, then only check is performed
3952   /// without error notification.
3953   /// \param DiagId Diagnostic which should be emitted if error is found.
3954   /// \param NoteId Diagnostic note for the main error message.
3955   /// \return true if statement is not an update expression, false otherwise.
3956   bool checkStatement(Stmt *S, unsigned DiagId = 0, unsigned NoteId = 0);
3957   /// \brief Return the 'x' lvalue part of the source atomic expression.
3958   Expr *getX() const { return X; }
3959   /// \brief Return the 'expr' rvalue part of the source atomic expression.
3960   Expr *getExpr() const { return E; }
3961   /// \brief Return the update expression used in calculation of the updated
3962   /// value. Always has form 'OpaqueValueExpr(x) binop OpaqueValueExpr(expr)' or
3963   /// 'OpaqueValueExpr(expr) binop OpaqueValueExpr(x)'.
3964   Expr *getUpdateExpr() const { return UpdateExpr; }
3965   /// \brief Return true if 'x' is LHS in RHS part of full update expression,
3966   /// false otherwise.
3967   bool isXLHSInRHSPart() const { return IsXLHSInRHSPart; }
3968 
3969   /// \brief true if the source expression is a postfix unary operation, false
3970   /// if it is a prefix unary operation.
3971   bool isPostfixUpdate() const { return IsPostfixUpdate; }
3972 
3973 private:
3974   bool checkBinaryOperation(BinaryOperator *AtomicBinOp, unsigned DiagId = 0,
3975                             unsigned NoteId = 0);
3976 };
3977 } // namespace
3978 
3979 bool OpenMPAtomicUpdateChecker::checkBinaryOperation(
3980     BinaryOperator *AtomicBinOp, unsigned DiagId, unsigned NoteId) {
3981   ExprAnalysisErrorCode ErrorFound = NoError;
3982   SourceLocation ErrorLoc, NoteLoc;
3983   SourceRange ErrorRange, NoteRange;
3984   // Allowed constructs are:
3985   //  x = x binop expr;
3986   //  x = expr binop x;
3987   if (AtomicBinOp->getOpcode() == BO_Assign) {
3988     X = AtomicBinOp->getLHS();
3989     if (auto *AtomicInnerBinOp = dyn_cast<BinaryOperator>(
3990             AtomicBinOp->getRHS()->IgnoreParenImpCasts())) {
3991       if (AtomicInnerBinOp->isMultiplicativeOp() ||
3992           AtomicInnerBinOp->isAdditiveOp() || AtomicInnerBinOp->isShiftOp() ||
3993           AtomicInnerBinOp->isBitwiseOp()) {
3994         Op = AtomicInnerBinOp->getOpcode();
3995         OpLoc = AtomicInnerBinOp->getOperatorLoc();
3996         auto *LHS = AtomicInnerBinOp->getLHS();
3997         auto *RHS = AtomicInnerBinOp->getRHS();
3998         llvm::FoldingSetNodeID XId, LHSId, RHSId;
3999         X->IgnoreParenImpCasts()->Profile(XId, SemaRef.getASTContext(),
4000                                           /*Canonical=*/true);
4001         LHS->IgnoreParenImpCasts()->Profile(LHSId, SemaRef.getASTContext(),
4002                                             /*Canonical=*/true);
4003         RHS->IgnoreParenImpCasts()->Profile(RHSId, SemaRef.getASTContext(),
4004                                             /*Canonical=*/true);
4005         if (XId == LHSId) {
4006           E = RHS;
4007           IsXLHSInRHSPart = true;
4008         } else if (XId == RHSId) {
4009           E = LHS;
4010           IsXLHSInRHSPart = false;
4011         } else {
4012           ErrorLoc = AtomicInnerBinOp->getExprLoc();
4013           ErrorRange = AtomicInnerBinOp->getSourceRange();
4014           NoteLoc = X->getExprLoc();
4015           NoteRange = X->getSourceRange();
4016           ErrorFound = NotAnUpdateExpression;
4017         }
4018       } else {
4019         ErrorLoc = AtomicInnerBinOp->getExprLoc();
4020         ErrorRange = AtomicInnerBinOp->getSourceRange();
4021         NoteLoc = AtomicInnerBinOp->getOperatorLoc();
4022         NoteRange = SourceRange(NoteLoc, NoteLoc);
4023         ErrorFound = NotABinaryOperator;
4024       }
4025     } else {
4026       NoteLoc = ErrorLoc = AtomicBinOp->getRHS()->getExprLoc();
4027       NoteRange = ErrorRange = AtomicBinOp->getRHS()->getSourceRange();
4028       ErrorFound = NotABinaryExpression;
4029     }
4030   } else {
4031     ErrorLoc = AtomicBinOp->getExprLoc();
4032     ErrorRange = AtomicBinOp->getSourceRange();
4033     NoteLoc = AtomicBinOp->getOperatorLoc();
4034     NoteRange = SourceRange(NoteLoc, NoteLoc);
4035     ErrorFound = NotAnAssignmentOp;
4036   }
4037   if (ErrorFound != NoError && DiagId != 0 && NoteId != 0) {
4038     SemaRef.Diag(ErrorLoc, DiagId) << ErrorRange;
4039     SemaRef.Diag(NoteLoc, NoteId) << ErrorFound << NoteRange;
4040     return true;
4041   } else if (SemaRef.CurContext->isDependentContext())
4042     E = X = UpdateExpr = nullptr;
4043   return ErrorFound != NoError;
4044 }
4045 
4046 bool OpenMPAtomicUpdateChecker::checkStatement(Stmt *S, unsigned DiagId,
4047                                                unsigned NoteId) {
4048   ExprAnalysisErrorCode ErrorFound = NoError;
4049   SourceLocation ErrorLoc, NoteLoc;
4050   SourceRange ErrorRange, NoteRange;
4051   // Allowed constructs are:
4052   //  x++;
4053   //  x--;
4054   //  ++x;
4055   //  --x;
4056   //  x binop= expr;
4057   //  x = x binop expr;
4058   //  x = expr binop x;
4059   if (auto *AtomicBody = dyn_cast<Expr>(S)) {
4060     AtomicBody = AtomicBody->IgnoreParenImpCasts();
4061     if (AtomicBody->getType()->isScalarType() ||
4062         AtomicBody->isInstantiationDependent()) {
4063       if (auto *AtomicCompAssignOp = dyn_cast<CompoundAssignOperator>(
4064               AtomicBody->IgnoreParenImpCasts())) {
4065         // Check for Compound Assignment Operation
4066         Op = BinaryOperator::getOpForCompoundAssignment(
4067             AtomicCompAssignOp->getOpcode());
4068         OpLoc = AtomicCompAssignOp->getOperatorLoc();
4069         E = AtomicCompAssignOp->getRHS();
4070         X = AtomicCompAssignOp->getLHS();
4071         IsXLHSInRHSPart = true;
4072       } else if (auto *AtomicBinOp = dyn_cast<BinaryOperator>(
4073                      AtomicBody->IgnoreParenImpCasts())) {
4074         // Check for Binary Operation
4075         if(checkBinaryOperation(AtomicBinOp, DiagId, NoteId))
4076           return true;
4077       } else if (auto *AtomicUnaryOp =
4078                  dyn_cast<UnaryOperator>(AtomicBody->IgnoreParenImpCasts())) {
4079         // Check for Unary Operation
4080         if (AtomicUnaryOp->isIncrementDecrementOp()) {
4081           IsPostfixUpdate = AtomicUnaryOp->isPostfix();
4082           Op = AtomicUnaryOp->isIncrementOp() ? BO_Add : BO_Sub;
4083           OpLoc = AtomicUnaryOp->getOperatorLoc();
4084           X = AtomicUnaryOp->getSubExpr();
4085           E = SemaRef.ActOnIntegerConstant(OpLoc, /*uint64_t Val=*/1).get();
4086           IsXLHSInRHSPart = true;
4087         } else {
4088           ErrorFound = NotAnUnaryIncDecExpression;
4089           ErrorLoc = AtomicUnaryOp->getExprLoc();
4090           ErrorRange = AtomicUnaryOp->getSourceRange();
4091           NoteLoc = AtomicUnaryOp->getOperatorLoc();
4092           NoteRange = SourceRange(NoteLoc, NoteLoc);
4093         }
4094       } else {
4095         ErrorFound = NotABinaryOrUnaryExpression;
4096         NoteLoc = ErrorLoc = AtomicBody->getExprLoc();
4097         NoteRange = ErrorRange = AtomicBody->getSourceRange();
4098       }
4099     } else {
4100       ErrorFound = NotAScalarType;
4101       NoteLoc = ErrorLoc = AtomicBody->getLocStart();
4102       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
4103     }
4104   } else {
4105     ErrorFound = NotAnExpression;
4106     NoteLoc = ErrorLoc = S->getLocStart();
4107     NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
4108   }
4109   if (ErrorFound != NoError && DiagId != 0 && NoteId != 0) {
4110     SemaRef.Diag(ErrorLoc, DiagId) << ErrorRange;
4111     SemaRef.Diag(NoteLoc, NoteId) << ErrorFound << NoteRange;
4112     return true;
4113   } else if (SemaRef.CurContext->isDependentContext())
4114     E = X = UpdateExpr = nullptr;
4115   if (ErrorFound == NoError && E && X) {
4116     // Build an update expression of form 'OpaqueValueExpr(x) binop
4117     // OpaqueValueExpr(expr)' or 'OpaqueValueExpr(expr) binop
4118     // OpaqueValueExpr(x)' and then cast it to the type of the 'x' expression.
4119     auto *OVEX = new (SemaRef.getASTContext())
4120         OpaqueValueExpr(X->getExprLoc(), X->getType(), VK_RValue);
4121     auto *OVEExpr = new (SemaRef.getASTContext())
4122         OpaqueValueExpr(E->getExprLoc(), E->getType(), VK_RValue);
4123     auto Update =
4124         SemaRef.CreateBuiltinBinOp(OpLoc, Op, IsXLHSInRHSPart ? OVEX : OVEExpr,
4125                                    IsXLHSInRHSPart ? OVEExpr : OVEX);
4126     if (Update.isInvalid())
4127       return true;
4128     Update = SemaRef.PerformImplicitConversion(Update.get(), X->getType(),
4129                                                Sema::AA_Casting);
4130     if (Update.isInvalid())
4131       return true;
4132     UpdateExpr = Update.get();
4133   }
4134   return ErrorFound != NoError;
4135 }
4136 
4137 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses,
4138                                             Stmt *AStmt,
4139                                             SourceLocation StartLoc,
4140                                             SourceLocation EndLoc) {
4141   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
4142   auto CS = cast<CapturedStmt>(AStmt);
4143   // 1.2.2 OpenMP Language Terminology
4144   // Structured block - An executable statement with a single entry at the
4145   // top and a single exit at the bottom.
4146   // The point of exit cannot be a branch out of the structured block.
4147   // longjmp() and throw() must not violate the entry/exit criteria.
4148   OpenMPClauseKind AtomicKind = OMPC_unknown;
4149   SourceLocation AtomicKindLoc;
4150   for (auto *C : Clauses) {
4151     if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write ||
4152         C->getClauseKind() == OMPC_update ||
4153         C->getClauseKind() == OMPC_capture) {
4154       if (AtomicKind != OMPC_unknown) {
4155         Diag(C->getLocStart(), diag::err_omp_atomic_several_clauses)
4156             << SourceRange(C->getLocStart(), C->getLocEnd());
4157         Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause)
4158             << getOpenMPClauseName(AtomicKind);
4159       } else {
4160         AtomicKind = C->getClauseKind();
4161         AtomicKindLoc = C->getLocStart();
4162       }
4163     }
4164   }
4165 
4166   auto Body = CS->getCapturedStmt();
4167   if (auto *EWC = dyn_cast<ExprWithCleanups>(Body))
4168     Body = EWC->getSubExpr();
4169 
4170   Expr *X = nullptr;
4171   Expr *V = nullptr;
4172   Expr *E = nullptr;
4173   Expr *UE = nullptr;
4174   bool IsXLHSInRHSPart = false;
4175   bool IsPostfixUpdate = false;
4176   // OpenMP [2.12.6, atomic Construct]
4177   // In the next expressions:
4178   // * x and v (as applicable) are both l-value expressions with scalar type.
4179   // * During the execution of an atomic region, multiple syntactic
4180   // occurrences of x must designate the same storage location.
4181   // * Neither of v and expr (as applicable) may access the storage location
4182   // designated by x.
4183   // * Neither of x and expr (as applicable) may access the storage location
4184   // designated by v.
4185   // * expr is an expression with scalar type.
4186   // * binop is one of +, *, -, /, &, ^, |, <<, or >>.
4187   // * binop, binop=, ++, and -- are not overloaded operators.
4188   // * The expression x binop expr must be numerically equivalent to x binop
4189   // (expr). This requirement is satisfied if the operators in expr have
4190   // precedence greater than binop, or by using parentheses around expr or
4191   // subexpressions of expr.
4192   // * The expression expr binop x must be numerically equivalent to (expr)
4193   // binop x. This requirement is satisfied if the operators in expr have
4194   // precedence equal to or greater than binop, or by using parentheses around
4195   // expr or subexpressions of expr.
4196   // * For forms that allow multiple occurrences of x, the number of times
4197   // that x is evaluated is unspecified.
4198   if (AtomicKind == OMPC_read) {
4199     enum {
4200       NotAnExpression,
4201       NotAnAssignmentOp,
4202       NotAScalarType,
4203       NotAnLValue,
4204       NoError
4205     } ErrorFound = NoError;
4206     SourceLocation ErrorLoc, NoteLoc;
4207     SourceRange ErrorRange, NoteRange;
4208     // If clause is read:
4209     //  v = x;
4210     if (auto AtomicBody = dyn_cast<Expr>(Body)) {
4211       auto AtomicBinOp =
4212           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
4213       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
4214         X = AtomicBinOp->getRHS()->IgnoreParenImpCasts();
4215         V = AtomicBinOp->getLHS()->IgnoreParenImpCasts();
4216         if ((X->isInstantiationDependent() || X->getType()->isScalarType()) &&
4217             (V->isInstantiationDependent() || V->getType()->isScalarType())) {
4218           if (!X->isLValue() || !V->isLValue()) {
4219             auto NotLValueExpr = X->isLValue() ? V : X;
4220             ErrorFound = NotAnLValue;
4221             ErrorLoc = AtomicBinOp->getExprLoc();
4222             ErrorRange = AtomicBinOp->getSourceRange();
4223             NoteLoc = NotLValueExpr->getExprLoc();
4224             NoteRange = NotLValueExpr->getSourceRange();
4225           }
4226         } else if (!X->isInstantiationDependent() ||
4227                    !V->isInstantiationDependent()) {
4228           auto NotScalarExpr =
4229               (X->isInstantiationDependent() || X->getType()->isScalarType())
4230                   ? V
4231                   : X;
4232           ErrorFound = NotAScalarType;
4233           ErrorLoc = AtomicBinOp->getExprLoc();
4234           ErrorRange = AtomicBinOp->getSourceRange();
4235           NoteLoc = NotScalarExpr->getExprLoc();
4236           NoteRange = NotScalarExpr->getSourceRange();
4237         }
4238       } else {
4239         ErrorFound = NotAnAssignmentOp;
4240         ErrorLoc = AtomicBody->getExprLoc();
4241         ErrorRange = AtomicBody->getSourceRange();
4242         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
4243                               : AtomicBody->getExprLoc();
4244         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
4245                                 : AtomicBody->getSourceRange();
4246       }
4247     } else {
4248       ErrorFound = NotAnExpression;
4249       NoteLoc = ErrorLoc = Body->getLocStart();
4250       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
4251     }
4252     if (ErrorFound != NoError) {
4253       Diag(ErrorLoc, diag::err_omp_atomic_read_not_expression_statement)
4254           << ErrorRange;
4255       Diag(NoteLoc, diag::note_omp_atomic_read_write) << ErrorFound
4256                                                       << NoteRange;
4257       return StmtError();
4258     } else if (CurContext->isDependentContext())
4259       V = X = nullptr;
4260   } else if (AtomicKind == OMPC_write) {
4261     enum {
4262       NotAnExpression,
4263       NotAnAssignmentOp,
4264       NotAScalarType,
4265       NotAnLValue,
4266       NoError
4267     } ErrorFound = NoError;
4268     SourceLocation ErrorLoc, NoteLoc;
4269     SourceRange ErrorRange, NoteRange;
4270     // If clause is write:
4271     //  x = expr;
4272     if (auto AtomicBody = dyn_cast<Expr>(Body)) {
4273       auto AtomicBinOp =
4274           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
4275       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
4276         X = AtomicBinOp->getLHS();
4277         E = AtomicBinOp->getRHS();
4278         if ((X->isInstantiationDependent() || X->getType()->isScalarType()) &&
4279             (E->isInstantiationDependent() || E->getType()->isScalarType())) {
4280           if (!X->isLValue()) {
4281             ErrorFound = NotAnLValue;
4282             ErrorLoc = AtomicBinOp->getExprLoc();
4283             ErrorRange = AtomicBinOp->getSourceRange();
4284             NoteLoc = X->getExprLoc();
4285             NoteRange = X->getSourceRange();
4286           }
4287         } else if (!X->isInstantiationDependent() ||
4288                    !E->isInstantiationDependent()) {
4289           auto NotScalarExpr =
4290               (X->isInstantiationDependent() || X->getType()->isScalarType())
4291                   ? E
4292                   : X;
4293           ErrorFound = NotAScalarType;
4294           ErrorLoc = AtomicBinOp->getExprLoc();
4295           ErrorRange = AtomicBinOp->getSourceRange();
4296           NoteLoc = NotScalarExpr->getExprLoc();
4297           NoteRange = NotScalarExpr->getSourceRange();
4298         }
4299       } else {
4300         ErrorFound = NotAnAssignmentOp;
4301         ErrorLoc = AtomicBody->getExprLoc();
4302         ErrorRange = AtomicBody->getSourceRange();
4303         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
4304                               : AtomicBody->getExprLoc();
4305         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
4306                                 : AtomicBody->getSourceRange();
4307       }
4308     } else {
4309       ErrorFound = NotAnExpression;
4310       NoteLoc = ErrorLoc = Body->getLocStart();
4311       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
4312     }
4313     if (ErrorFound != NoError) {
4314       Diag(ErrorLoc, diag::err_omp_atomic_write_not_expression_statement)
4315           << ErrorRange;
4316       Diag(NoteLoc, diag::note_omp_atomic_read_write) << ErrorFound
4317                                                       << NoteRange;
4318       return StmtError();
4319     } else if (CurContext->isDependentContext())
4320       E = X = nullptr;
4321   } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {
4322     // If clause is update:
4323     //  x++;
4324     //  x--;
4325     //  ++x;
4326     //  --x;
4327     //  x binop= expr;
4328     //  x = x binop expr;
4329     //  x = expr binop x;
4330     OpenMPAtomicUpdateChecker Checker(*this);
4331     if (Checker.checkStatement(
4332             Body, (AtomicKind == OMPC_update)
4333                       ? diag::err_omp_atomic_update_not_expression_statement
4334                       : diag::err_omp_atomic_not_expression_statement,
4335             diag::note_omp_atomic_update))
4336       return StmtError();
4337     if (!CurContext->isDependentContext()) {
4338       E = Checker.getExpr();
4339       X = Checker.getX();
4340       UE = Checker.getUpdateExpr();
4341       IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
4342     }
4343   } else if (AtomicKind == OMPC_capture) {
4344     enum {
4345       NotAnAssignmentOp,
4346       NotACompoundStatement,
4347       NotTwoSubstatements,
4348       NotASpecificExpression,
4349       NoError
4350     } ErrorFound = NoError;
4351     SourceLocation ErrorLoc, NoteLoc;
4352     SourceRange ErrorRange, NoteRange;
4353     if (auto *AtomicBody = dyn_cast<Expr>(Body)) {
4354       // If clause is a capture:
4355       //  v = x++;
4356       //  v = x--;
4357       //  v = ++x;
4358       //  v = --x;
4359       //  v = x binop= expr;
4360       //  v = x = x binop expr;
4361       //  v = x = expr binop x;
4362       auto *AtomicBinOp =
4363           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
4364       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
4365         V = AtomicBinOp->getLHS();
4366         Body = AtomicBinOp->getRHS()->IgnoreParenImpCasts();
4367         OpenMPAtomicUpdateChecker Checker(*this);
4368         if (Checker.checkStatement(
4369                 Body, diag::err_omp_atomic_capture_not_expression_statement,
4370                 diag::note_omp_atomic_update))
4371           return StmtError();
4372         E = Checker.getExpr();
4373         X = Checker.getX();
4374         UE = Checker.getUpdateExpr();
4375         IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
4376         IsPostfixUpdate = Checker.isPostfixUpdate();
4377       } else {
4378         ErrorLoc = AtomicBody->getExprLoc();
4379         ErrorRange = AtomicBody->getSourceRange();
4380         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
4381                               : AtomicBody->getExprLoc();
4382         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
4383                                 : AtomicBody->getSourceRange();
4384         ErrorFound = NotAnAssignmentOp;
4385       }
4386       if (ErrorFound != NoError) {
4387         Diag(ErrorLoc, diag::err_omp_atomic_capture_not_expression_statement)
4388             << ErrorRange;
4389         Diag(NoteLoc, diag::note_omp_atomic_capture) << ErrorFound << NoteRange;
4390         return StmtError();
4391       } else if (CurContext->isDependentContext()) {
4392         UE = V = E = X = nullptr;
4393       }
4394     } else {
4395       // If clause is a capture:
4396       //  { v = x; x = expr; }
4397       //  { v = x; x++; }
4398       //  { v = x; x--; }
4399       //  { v = x; ++x; }
4400       //  { v = x; --x; }
4401       //  { v = x; x binop= expr; }
4402       //  { v = x; x = x binop expr; }
4403       //  { v = x; x = expr binop x; }
4404       //  { x++; v = x; }
4405       //  { x--; v = x; }
4406       //  { ++x; v = x; }
4407       //  { --x; v = x; }
4408       //  { x binop= expr; v = x; }
4409       //  { x = x binop expr; v = x; }
4410       //  { x = expr binop x; v = x; }
4411       if (auto *CS = dyn_cast<CompoundStmt>(Body)) {
4412         // Check that this is { expr1; expr2; }
4413         if (CS->size() == 2) {
4414           auto *First = CS->body_front();
4415           auto *Second = CS->body_back();
4416           if (auto *EWC = dyn_cast<ExprWithCleanups>(First))
4417             First = EWC->getSubExpr()->IgnoreParenImpCasts();
4418           if (auto *EWC = dyn_cast<ExprWithCleanups>(Second))
4419             Second = EWC->getSubExpr()->IgnoreParenImpCasts();
4420           // Need to find what subexpression is 'v' and what is 'x'.
4421           OpenMPAtomicUpdateChecker Checker(*this);
4422           bool IsUpdateExprFound = !Checker.checkStatement(Second);
4423           BinaryOperator *BinOp = nullptr;
4424           if (IsUpdateExprFound) {
4425             BinOp = dyn_cast<BinaryOperator>(First);
4426             IsUpdateExprFound = BinOp && BinOp->getOpcode() == BO_Assign;
4427           }
4428           if (IsUpdateExprFound && !CurContext->isDependentContext()) {
4429             //  { v = x; x++; }
4430             //  { v = x; x--; }
4431             //  { v = x; ++x; }
4432             //  { v = x; --x; }
4433             //  { v = x; x binop= expr; }
4434             //  { v = x; x = x binop expr; }
4435             //  { v = x; x = expr binop x; }
4436             // Check that the first expression has form v = x.
4437             auto *PossibleX = BinOp->getRHS()->IgnoreParenImpCasts();
4438             llvm::FoldingSetNodeID XId, PossibleXId;
4439             Checker.getX()->Profile(XId, Context, /*Canonical=*/true);
4440             PossibleX->Profile(PossibleXId, Context, /*Canonical=*/true);
4441             IsUpdateExprFound = XId == PossibleXId;
4442             if (IsUpdateExprFound) {
4443               V = BinOp->getLHS();
4444               X = Checker.getX();
4445               E = Checker.getExpr();
4446               UE = Checker.getUpdateExpr();
4447               IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
4448               IsPostfixUpdate = true;
4449             }
4450           }
4451           if (!IsUpdateExprFound) {
4452             IsUpdateExprFound = !Checker.checkStatement(First);
4453             BinOp = nullptr;
4454             if (IsUpdateExprFound) {
4455               BinOp = dyn_cast<BinaryOperator>(Second);
4456               IsUpdateExprFound = BinOp && BinOp->getOpcode() == BO_Assign;
4457             }
4458             if (IsUpdateExprFound && !CurContext->isDependentContext()) {
4459               //  { x++; v = x; }
4460               //  { x--; v = x; }
4461               //  { ++x; v = x; }
4462               //  { --x; v = x; }
4463               //  { x binop= expr; v = x; }
4464               //  { x = x binop expr; v = x; }
4465               //  { x = expr binop x; v = x; }
4466               // Check that the second expression has form v = x.
4467               auto *PossibleX = BinOp->getRHS()->IgnoreParenImpCasts();
4468               llvm::FoldingSetNodeID XId, PossibleXId;
4469               Checker.getX()->Profile(XId, Context, /*Canonical=*/true);
4470               PossibleX->Profile(PossibleXId, Context, /*Canonical=*/true);
4471               IsUpdateExprFound = XId == PossibleXId;
4472               if (IsUpdateExprFound) {
4473                 V = BinOp->getLHS();
4474                 X = Checker.getX();
4475                 E = Checker.getExpr();
4476                 UE = Checker.getUpdateExpr();
4477                 IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
4478                 IsPostfixUpdate = false;
4479               }
4480             }
4481           }
4482           if (!IsUpdateExprFound) {
4483             //  { v = x; x = expr; }
4484             auto *FirstBinOp = dyn_cast<BinaryOperator>(First);
4485             if (!FirstBinOp || FirstBinOp->getOpcode() != BO_Assign) {
4486               ErrorFound = NotAnAssignmentOp;
4487               NoteLoc = ErrorLoc = FirstBinOp ? FirstBinOp->getOperatorLoc()
4488                                               : First->getLocStart();
4489               NoteRange = ErrorRange = FirstBinOp
4490                                            ? FirstBinOp->getSourceRange()
4491                                            : SourceRange(ErrorLoc, ErrorLoc);
4492             } else {
4493               auto *SecondBinOp = dyn_cast<BinaryOperator>(Second);
4494               if (!SecondBinOp || SecondBinOp->getOpcode() != BO_Assign) {
4495                 ErrorFound = NotAnAssignmentOp;
4496                 NoteLoc = ErrorLoc = SecondBinOp ? SecondBinOp->getOperatorLoc()
4497                                                  : Second->getLocStart();
4498                 NoteRange = ErrorRange = SecondBinOp
4499                                              ? SecondBinOp->getSourceRange()
4500                                              : SourceRange(ErrorLoc, ErrorLoc);
4501               } else {
4502                 auto *PossibleXRHSInFirst =
4503                     FirstBinOp->getRHS()->IgnoreParenImpCasts();
4504                 auto *PossibleXLHSInSecond =
4505                     SecondBinOp->getLHS()->IgnoreParenImpCasts();
4506                 llvm::FoldingSetNodeID X1Id, X2Id;
4507                 PossibleXRHSInFirst->Profile(X1Id, Context, /*Canonical=*/true);
4508                 PossibleXLHSInSecond->Profile(X2Id, Context,
4509                                               /*Canonical=*/true);
4510                 IsUpdateExprFound = X1Id == X2Id;
4511                 if (IsUpdateExprFound) {
4512                   V = FirstBinOp->getLHS();
4513                   X = SecondBinOp->getLHS();
4514                   E = SecondBinOp->getRHS();
4515                   UE = nullptr;
4516                   IsXLHSInRHSPart = false;
4517                   IsPostfixUpdate = true;
4518                 } else {
4519                   ErrorFound = NotASpecificExpression;
4520                   ErrorLoc = FirstBinOp->getExprLoc();
4521                   ErrorRange = FirstBinOp->getSourceRange();
4522                   NoteLoc = SecondBinOp->getLHS()->getExprLoc();
4523                   NoteRange = SecondBinOp->getRHS()->getSourceRange();
4524                 }
4525               }
4526             }
4527           }
4528         } else {
4529           NoteLoc = ErrorLoc = Body->getLocStart();
4530           NoteRange = ErrorRange =
4531               SourceRange(Body->getLocStart(), Body->getLocStart());
4532           ErrorFound = NotTwoSubstatements;
4533         }
4534       } else {
4535         NoteLoc = ErrorLoc = Body->getLocStart();
4536         NoteRange = ErrorRange =
4537             SourceRange(Body->getLocStart(), Body->getLocStart());
4538         ErrorFound = NotACompoundStatement;
4539       }
4540       if (ErrorFound != NoError) {
4541         Diag(ErrorLoc, diag::err_omp_atomic_capture_not_compound_statement)
4542             << ErrorRange;
4543         Diag(NoteLoc, diag::note_omp_atomic_capture) << ErrorFound << NoteRange;
4544         return StmtError();
4545       } else if (CurContext->isDependentContext()) {
4546         UE = V = E = X = nullptr;
4547       }
4548     }
4549   }
4550 
4551   getCurFunction()->setHasBranchProtectedScope();
4552 
4553   return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
4554                                     X, V, E, UE, IsXLHSInRHSPart,
4555                                     IsPostfixUpdate);
4556 }
4557 
4558 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses,
4559                                             Stmt *AStmt,
4560                                             SourceLocation StartLoc,
4561                                             SourceLocation EndLoc) {
4562   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
4563 
4564   // OpenMP [2.16, Nesting of Regions]
4565   // If specified, a teams construct must be contained within a target
4566   // construct. That target construct must contain no statements or directives
4567   // outside of the teams construct.
4568   if (DSAStack->hasInnerTeamsRegion()) {
4569     auto S = AStmt->IgnoreContainers(/*IgnoreCaptured*/ true);
4570     bool OMPTeamsFound = true;
4571     if (auto *CS = dyn_cast<CompoundStmt>(S)) {
4572       auto I = CS->body_begin();
4573       while (I != CS->body_end()) {
4574         auto OED = dyn_cast<OMPExecutableDirective>(*I);
4575         if (!OED || !isOpenMPTeamsDirective(OED->getDirectiveKind())) {
4576           OMPTeamsFound = false;
4577           break;
4578         }
4579         ++I;
4580       }
4581       assert(I != CS->body_end() && "Not found statement");
4582       S = *I;
4583     }
4584     if (!OMPTeamsFound) {
4585       Diag(StartLoc, diag::err_omp_target_contains_not_only_teams);
4586       Diag(DSAStack->getInnerTeamsRegionLoc(),
4587            diag::note_omp_nested_teams_construct_here);
4588       Diag(S->getLocStart(), diag::note_omp_nested_statement_here)
4589           << isa<OMPExecutableDirective>(S);
4590       return StmtError();
4591     }
4592   }
4593 
4594   getCurFunction()->setHasBranchProtectedScope();
4595 
4596   return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
4597 }
4598 
4599 StmtResult Sema::ActOnOpenMPTargetDataDirective(ArrayRef<OMPClause *> Clauses,
4600                                                 Stmt *AStmt,
4601                                                 SourceLocation StartLoc,
4602                                                 SourceLocation EndLoc) {
4603   getCurFunction()->setHasBranchProtectedScope();
4604 
4605   return OMPTargetDataDirective::Create(Context, StartLoc, EndLoc, Clauses,
4606                                         AStmt);
4607 }
4608 
4609 StmtResult Sema::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses,
4610                                            Stmt *AStmt, SourceLocation StartLoc,
4611                                            SourceLocation EndLoc) {
4612   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
4613   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
4614   // 1.2.2 OpenMP Language Terminology
4615   // Structured block - An executable statement with a single entry at the
4616   // top and a single exit at the bottom.
4617   // The point of exit cannot be a branch out of the structured block.
4618   // longjmp() and throw() must not violate the entry/exit criteria.
4619   CS->getCapturedDecl()->setNothrow();
4620 
4621   getCurFunction()->setHasBranchProtectedScope();
4622 
4623   return OMPTeamsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
4624 }
4625 
4626 StmtResult
4627 Sema::ActOnOpenMPCancellationPointDirective(SourceLocation StartLoc,
4628                                             SourceLocation EndLoc,
4629                                             OpenMPDirectiveKind CancelRegion) {
4630   if (CancelRegion != OMPD_parallel && CancelRegion != OMPD_for &&
4631       CancelRegion != OMPD_sections && CancelRegion != OMPD_taskgroup) {
4632     Diag(StartLoc, diag::err_omp_wrong_cancel_region)
4633         << getOpenMPDirectiveName(CancelRegion);
4634     return StmtError();
4635   }
4636   if (DSAStack->isParentNowaitRegion()) {
4637     Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 0;
4638     return StmtError();
4639   }
4640   if (DSAStack->isParentOrderedRegion()) {
4641     Diag(StartLoc, diag::err_omp_parent_cancel_region_ordered) << 0;
4642     return StmtError();
4643   }
4644   return OMPCancellationPointDirective::Create(Context, StartLoc, EndLoc,
4645                                                CancelRegion);
4646 }
4647 
4648 StmtResult Sema::ActOnOpenMPCancelDirective(SourceLocation StartLoc,
4649                                             SourceLocation EndLoc,
4650                                             OpenMPDirectiveKind CancelRegion) {
4651   if (CancelRegion != OMPD_parallel && CancelRegion != OMPD_for &&
4652       CancelRegion != OMPD_sections && CancelRegion != OMPD_taskgroup) {
4653     Diag(StartLoc, diag::err_omp_wrong_cancel_region)
4654         << getOpenMPDirectiveName(CancelRegion);
4655     return StmtError();
4656   }
4657   if (DSAStack->isParentNowaitRegion()) {
4658     Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 1;
4659     return StmtError();
4660   }
4661   if (DSAStack->isParentOrderedRegion()) {
4662     Diag(StartLoc, diag::err_omp_parent_cancel_region_ordered) << 1;
4663     return StmtError();
4664   }
4665   return OMPCancelDirective::Create(Context, StartLoc, EndLoc, CancelRegion);
4666 }
4667 
4668 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
4669                                              SourceLocation StartLoc,
4670                                              SourceLocation LParenLoc,
4671                                              SourceLocation EndLoc) {
4672   OMPClause *Res = nullptr;
4673   switch (Kind) {
4674   case OMPC_if:
4675     Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc);
4676     break;
4677   case OMPC_final:
4678     Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc);
4679     break;
4680   case OMPC_num_threads:
4681     Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc);
4682     break;
4683   case OMPC_safelen:
4684     Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc);
4685     break;
4686   case OMPC_collapse:
4687     Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc);
4688     break;
4689   case OMPC_ordered:
4690     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Expr);
4691     break;
4692   case OMPC_device:
4693     Res = ActOnOpenMPDeviceClause(Expr, StartLoc, LParenLoc, EndLoc);
4694     break;
4695   case OMPC_default:
4696   case OMPC_proc_bind:
4697   case OMPC_schedule:
4698   case OMPC_private:
4699   case OMPC_firstprivate:
4700   case OMPC_lastprivate:
4701   case OMPC_shared:
4702   case OMPC_reduction:
4703   case OMPC_linear:
4704   case OMPC_aligned:
4705   case OMPC_copyin:
4706   case OMPC_copyprivate:
4707   case OMPC_nowait:
4708   case OMPC_untied:
4709   case OMPC_mergeable:
4710   case OMPC_threadprivate:
4711   case OMPC_flush:
4712   case OMPC_read:
4713   case OMPC_write:
4714   case OMPC_update:
4715   case OMPC_capture:
4716   case OMPC_seq_cst:
4717   case OMPC_depend:
4718   case OMPC_unknown:
4719     llvm_unreachable("Clause is not allowed.");
4720   }
4721   return Res;
4722 }
4723 
4724 OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, SourceLocation StartLoc,
4725                                      SourceLocation LParenLoc,
4726                                      SourceLocation EndLoc) {
4727   Expr *ValExpr = Condition;
4728   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
4729       !Condition->isInstantiationDependent() &&
4730       !Condition->containsUnexpandedParameterPack()) {
4731     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
4732                                            Condition->getExprLoc(), Condition);
4733     if (Val.isInvalid())
4734       return nullptr;
4735 
4736     ValExpr = Val.get();
4737   }
4738 
4739   return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc);
4740 }
4741 
4742 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition,
4743                                         SourceLocation StartLoc,
4744                                         SourceLocation LParenLoc,
4745                                         SourceLocation EndLoc) {
4746   Expr *ValExpr = Condition;
4747   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
4748       !Condition->isInstantiationDependent() &&
4749       !Condition->containsUnexpandedParameterPack()) {
4750     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
4751                                            Condition->getExprLoc(), Condition);
4752     if (Val.isInvalid())
4753       return nullptr;
4754 
4755     ValExpr = Val.get();
4756   }
4757 
4758   return new (Context) OMPFinalClause(ValExpr, StartLoc, LParenLoc, EndLoc);
4759 }
4760 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc,
4761                                                         Expr *Op) {
4762   if (!Op)
4763     return ExprError();
4764 
4765   class IntConvertDiagnoser : public ICEConvertDiagnoser {
4766   public:
4767     IntConvertDiagnoser()
4768         : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {}
4769     SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
4770                                          QualType T) override {
4771       return S.Diag(Loc, diag::err_omp_not_integral) << T;
4772     }
4773     SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
4774                                              QualType T) override {
4775       return S.Diag(Loc, diag::err_omp_incomplete_type) << T;
4776     }
4777     SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
4778                                                QualType T,
4779                                                QualType ConvTy) override {
4780       return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy;
4781     }
4782     SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
4783                                            QualType ConvTy) override {
4784       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
4785              << ConvTy->isEnumeralType() << ConvTy;
4786     }
4787     SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
4788                                             QualType T) override {
4789       return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T;
4790     }
4791     SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
4792                                         QualType ConvTy) override {
4793       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
4794              << ConvTy->isEnumeralType() << ConvTy;
4795     }
4796     SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType,
4797                                              QualType) override {
4798       llvm_unreachable("conversion functions are permitted");
4799     }
4800   } ConvertDiagnoser;
4801   return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
4802 }
4803 
4804 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
4805                                              SourceLocation StartLoc,
4806                                              SourceLocation LParenLoc,
4807                                              SourceLocation EndLoc) {
4808   Expr *ValExpr = NumThreads;
4809   if (!NumThreads->isValueDependent() && !NumThreads->isTypeDependent() &&
4810       !NumThreads->containsUnexpandedParameterPack()) {
4811     SourceLocation NumThreadsLoc = NumThreads->getLocStart();
4812     ExprResult Val =
4813         PerformOpenMPImplicitIntegerConversion(NumThreadsLoc, NumThreads);
4814     if (Val.isInvalid())
4815       return nullptr;
4816 
4817     ValExpr = Val.get();
4818 
4819     // OpenMP [2.5, Restrictions]
4820     //  The num_threads expression must evaluate to a positive integer value.
4821     llvm::APSInt Result;
4822     if (ValExpr->isIntegerConstantExpr(Result, Context) && Result.isSigned() &&
4823         !Result.isStrictlyPositive()) {
4824       Diag(NumThreadsLoc, diag::err_omp_negative_expression_in_clause)
4825           << "num_threads" << NumThreads->getSourceRange();
4826       return nullptr;
4827     }
4828   }
4829 
4830   return new (Context)
4831       OMPNumThreadsClause(ValExpr, StartLoc, LParenLoc, EndLoc);
4832 }
4833 
4834 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E,
4835                                                        OpenMPClauseKind CKind) {
4836   if (!E)
4837     return ExprError();
4838   if (E->isValueDependent() || E->isTypeDependent() ||
4839       E->isInstantiationDependent() || E->containsUnexpandedParameterPack())
4840     return E;
4841   llvm::APSInt Result;
4842   ExprResult ICE = VerifyIntegerConstantExpression(E, &Result);
4843   if (ICE.isInvalid())
4844     return ExprError();
4845   if (!Result.isStrictlyPositive()) {
4846     Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause)
4847         << getOpenMPClauseName(CKind) << E->getSourceRange();
4848     return ExprError();
4849   }
4850   if (CKind == OMPC_aligned && !Result.isPowerOf2()) {
4851     Diag(E->getExprLoc(), diag::warn_omp_alignment_not_power_of_two)
4852         << E->getSourceRange();
4853     return ExprError();
4854   }
4855   if (CKind == OMPC_collapse) {
4856     DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
4857                                 Result.getExtValue());
4858   } else if (CKind == OMPC_ordered) {
4859     DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
4860                                 Result.getExtValue());
4861   }
4862   return ICE;
4863 }
4864 
4865 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc,
4866                                           SourceLocation LParenLoc,
4867                                           SourceLocation EndLoc) {
4868   // OpenMP [2.8.1, simd construct, Description]
4869   // The parameter of the safelen clause must be a constant
4870   // positive integer expression.
4871   ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen);
4872   if (Safelen.isInvalid())
4873     return nullptr;
4874   return new (Context)
4875       OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc);
4876 }
4877 
4878 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops,
4879                                            SourceLocation StartLoc,
4880                                            SourceLocation LParenLoc,
4881                                            SourceLocation EndLoc) {
4882   // OpenMP [2.7.1, loop construct, Description]
4883   // OpenMP [2.8.1, simd construct, Description]
4884   // OpenMP [2.9.6, distribute construct, Description]
4885   // The parameter of the collapse clause must be a constant
4886   // positive integer expression.
4887   ExprResult NumForLoopsResult =
4888       VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse);
4889   if (NumForLoopsResult.isInvalid())
4890     return nullptr;
4891   return new (Context)
4892       OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc);
4893 }
4894 
4895 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc,
4896                                           SourceLocation EndLoc,
4897                                           SourceLocation LParenLoc,
4898                                           Expr *NumForLoops) {
4899   DSAStack->setOrderedRegion();
4900   // OpenMP [2.7.1, loop construct, Description]
4901   // OpenMP [2.8.1, simd construct, Description]
4902   // OpenMP [2.9.6, distribute construct, Description]
4903   // The parameter of the ordered clause must be a constant
4904   // positive integer expression if any.
4905   if (NumForLoops && LParenLoc.isValid()) {
4906     ExprResult NumForLoopsResult =
4907         VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_ordered);
4908     if (NumForLoopsResult.isInvalid())
4909       return nullptr;
4910     NumForLoops = NumForLoopsResult.get();
4911   }
4912   return new (Context)
4913       OMPOrderedClause(NumForLoops, StartLoc, LParenLoc, EndLoc);
4914 }
4915 
4916 OMPClause *Sema::ActOnOpenMPSimpleClause(
4917     OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc,
4918     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
4919   OMPClause *Res = nullptr;
4920   switch (Kind) {
4921   case OMPC_default:
4922     Res =
4923         ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument),
4924                                  ArgumentLoc, StartLoc, LParenLoc, EndLoc);
4925     break;
4926   case OMPC_proc_bind:
4927     Res = ActOnOpenMPProcBindClause(
4928         static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc,
4929         LParenLoc, EndLoc);
4930     break;
4931   case OMPC_if:
4932   case OMPC_final:
4933   case OMPC_num_threads:
4934   case OMPC_safelen:
4935   case OMPC_collapse:
4936   case OMPC_schedule:
4937   case OMPC_private:
4938   case OMPC_firstprivate:
4939   case OMPC_lastprivate:
4940   case OMPC_shared:
4941   case OMPC_reduction:
4942   case OMPC_linear:
4943   case OMPC_aligned:
4944   case OMPC_copyin:
4945   case OMPC_copyprivate:
4946   case OMPC_ordered:
4947   case OMPC_nowait:
4948   case OMPC_untied:
4949   case OMPC_mergeable:
4950   case OMPC_threadprivate:
4951   case OMPC_flush:
4952   case OMPC_read:
4953   case OMPC_write:
4954   case OMPC_update:
4955   case OMPC_capture:
4956   case OMPC_seq_cst:
4957   case OMPC_depend:
4958   case OMPC_device:
4959   case OMPC_unknown:
4960     llvm_unreachable("Clause is not allowed.");
4961   }
4962   return Res;
4963 }
4964 
4965 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind,
4966                                           SourceLocation KindKwLoc,
4967                                           SourceLocation StartLoc,
4968                                           SourceLocation LParenLoc,
4969                                           SourceLocation EndLoc) {
4970   if (Kind == OMPC_DEFAULT_unknown) {
4971     std::string Values;
4972     static_assert(OMPC_DEFAULT_unknown > 0,
4973                   "OMPC_DEFAULT_unknown not greater than 0");
4974     std::string Sep(", ");
4975     for (unsigned i = 0; i < OMPC_DEFAULT_unknown; ++i) {
4976       Values += "'";
4977       Values += getOpenMPSimpleClauseTypeName(OMPC_default, i);
4978       Values += "'";
4979       switch (i) {
4980       case OMPC_DEFAULT_unknown - 2:
4981         Values += " or ";
4982         break;
4983       case OMPC_DEFAULT_unknown - 1:
4984         break;
4985       default:
4986         Values += Sep;
4987         break;
4988       }
4989     }
4990     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
4991         << Values << getOpenMPClauseName(OMPC_default);
4992     return nullptr;
4993   }
4994   switch (Kind) {
4995   case OMPC_DEFAULT_none:
4996     DSAStack->setDefaultDSANone(KindKwLoc);
4997     break;
4998   case OMPC_DEFAULT_shared:
4999     DSAStack->setDefaultDSAShared(KindKwLoc);
5000     break;
5001   case OMPC_DEFAULT_unknown:
5002     llvm_unreachable("Clause kind is not allowed.");
5003     break;
5004   }
5005   return new (Context)
5006       OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
5007 }
5008 
5009 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind,
5010                                            SourceLocation KindKwLoc,
5011                                            SourceLocation StartLoc,
5012                                            SourceLocation LParenLoc,
5013                                            SourceLocation EndLoc) {
5014   if (Kind == OMPC_PROC_BIND_unknown) {
5015     std::string Values;
5016     std::string Sep(", ");
5017     for (unsigned i = 0; i < OMPC_PROC_BIND_unknown; ++i) {
5018       Values += "'";
5019       Values += getOpenMPSimpleClauseTypeName(OMPC_proc_bind, i);
5020       Values += "'";
5021       switch (i) {
5022       case OMPC_PROC_BIND_unknown - 2:
5023         Values += " or ";
5024         break;
5025       case OMPC_PROC_BIND_unknown - 1:
5026         break;
5027       default:
5028         Values += Sep;
5029         break;
5030       }
5031     }
5032     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
5033         << Values << getOpenMPClauseName(OMPC_proc_bind);
5034     return nullptr;
5035   }
5036   return new (Context)
5037       OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
5038 }
5039 
5040 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
5041     OpenMPClauseKind Kind, unsigned Argument, Expr *Expr,
5042     SourceLocation StartLoc, SourceLocation LParenLoc,
5043     SourceLocation ArgumentLoc, SourceLocation CommaLoc,
5044     SourceLocation EndLoc) {
5045   OMPClause *Res = nullptr;
5046   switch (Kind) {
5047   case OMPC_schedule:
5048     Res = ActOnOpenMPScheduleClause(
5049         static_cast<OpenMPScheduleClauseKind>(Argument), Expr, StartLoc,
5050         LParenLoc, ArgumentLoc, CommaLoc, EndLoc);
5051     break;
5052   case OMPC_if:
5053   case OMPC_final:
5054   case OMPC_num_threads:
5055   case OMPC_safelen:
5056   case OMPC_collapse:
5057   case OMPC_default:
5058   case OMPC_proc_bind:
5059   case OMPC_private:
5060   case OMPC_firstprivate:
5061   case OMPC_lastprivate:
5062   case OMPC_shared:
5063   case OMPC_reduction:
5064   case OMPC_linear:
5065   case OMPC_aligned:
5066   case OMPC_copyin:
5067   case OMPC_copyprivate:
5068   case OMPC_ordered:
5069   case OMPC_nowait:
5070   case OMPC_untied:
5071   case OMPC_mergeable:
5072   case OMPC_threadprivate:
5073   case OMPC_flush:
5074   case OMPC_read:
5075   case OMPC_write:
5076   case OMPC_update:
5077   case OMPC_capture:
5078   case OMPC_seq_cst:
5079   case OMPC_depend:
5080   case OMPC_device:
5081   case OMPC_unknown:
5082     llvm_unreachable("Clause is not allowed.");
5083   }
5084   return Res;
5085 }
5086 
5087 OMPClause *Sema::ActOnOpenMPScheduleClause(
5088     OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
5089     SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc,
5090     SourceLocation EndLoc) {
5091   if (Kind == OMPC_SCHEDULE_unknown) {
5092     std::string Values;
5093     std::string Sep(", ");
5094     for (unsigned i = 0; i < OMPC_SCHEDULE_unknown; ++i) {
5095       Values += "'";
5096       Values += getOpenMPSimpleClauseTypeName(OMPC_schedule, i);
5097       Values += "'";
5098       switch (i) {
5099       case OMPC_SCHEDULE_unknown - 2:
5100         Values += " or ";
5101         break;
5102       case OMPC_SCHEDULE_unknown - 1:
5103         break;
5104       default:
5105         Values += Sep;
5106         break;
5107       }
5108     }
5109     Diag(KindLoc, diag::err_omp_unexpected_clause_value)
5110         << Values << getOpenMPClauseName(OMPC_schedule);
5111     return nullptr;
5112   }
5113   Expr *ValExpr = ChunkSize;
5114   Expr *HelperValExpr = nullptr;
5115   if (ChunkSize) {
5116     if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() &&
5117         !ChunkSize->isInstantiationDependent() &&
5118         !ChunkSize->containsUnexpandedParameterPack()) {
5119       SourceLocation ChunkSizeLoc = ChunkSize->getLocStart();
5120       ExprResult Val =
5121           PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize);
5122       if (Val.isInvalid())
5123         return nullptr;
5124 
5125       ValExpr = Val.get();
5126 
5127       // OpenMP [2.7.1, Restrictions]
5128       //  chunk_size must be a loop invariant integer expression with a positive
5129       //  value.
5130       llvm::APSInt Result;
5131       if (ValExpr->isIntegerConstantExpr(Result, Context)) {
5132         if (Result.isSigned() && !Result.isStrictlyPositive()) {
5133           Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause)
5134               << "schedule" << ChunkSize->getSourceRange();
5135           return nullptr;
5136         }
5137       } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) {
5138         auto *ImpVar = buildVarDecl(*this, ChunkSize->getExprLoc(),
5139                                     ChunkSize->getType(), ".chunk.");
5140         auto *ImpVarRef = buildDeclRefExpr(*this, ImpVar, ChunkSize->getType(),
5141                                            ChunkSize->getExprLoc(),
5142                                            /*RefersToCapture=*/true);
5143         HelperValExpr = ImpVarRef;
5144       }
5145     }
5146   }
5147 
5148   return new (Context) OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc,
5149                                          EndLoc, Kind, ValExpr, HelperValExpr);
5150 }
5151 
5152 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
5153                                    SourceLocation StartLoc,
5154                                    SourceLocation EndLoc) {
5155   OMPClause *Res = nullptr;
5156   switch (Kind) {
5157   case OMPC_ordered:
5158     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc);
5159     break;
5160   case OMPC_nowait:
5161     Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc);
5162     break;
5163   case OMPC_untied:
5164     Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc);
5165     break;
5166   case OMPC_mergeable:
5167     Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc);
5168     break;
5169   case OMPC_read:
5170     Res = ActOnOpenMPReadClause(StartLoc, EndLoc);
5171     break;
5172   case OMPC_write:
5173     Res = ActOnOpenMPWriteClause(StartLoc, EndLoc);
5174     break;
5175   case OMPC_update:
5176     Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc);
5177     break;
5178   case OMPC_capture:
5179     Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc);
5180     break;
5181   case OMPC_seq_cst:
5182     Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc);
5183     break;
5184   case OMPC_if:
5185   case OMPC_final:
5186   case OMPC_num_threads:
5187   case OMPC_safelen:
5188   case OMPC_collapse:
5189   case OMPC_schedule:
5190   case OMPC_private:
5191   case OMPC_firstprivate:
5192   case OMPC_lastprivate:
5193   case OMPC_shared:
5194   case OMPC_reduction:
5195   case OMPC_linear:
5196   case OMPC_aligned:
5197   case OMPC_copyin:
5198   case OMPC_copyprivate:
5199   case OMPC_default:
5200   case OMPC_proc_bind:
5201   case OMPC_threadprivate:
5202   case OMPC_flush:
5203   case OMPC_depend:
5204   case OMPC_device:
5205   case OMPC_unknown:
5206     llvm_unreachable("Clause is not allowed.");
5207   }
5208   return Res;
5209 }
5210 
5211 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc,
5212                                          SourceLocation EndLoc) {
5213   DSAStack->setNowaitRegion();
5214   return new (Context) OMPNowaitClause(StartLoc, EndLoc);
5215 }
5216 
5217 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc,
5218                                          SourceLocation EndLoc) {
5219   return new (Context) OMPUntiedClause(StartLoc, EndLoc);
5220 }
5221 
5222 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc,
5223                                             SourceLocation EndLoc) {
5224   return new (Context) OMPMergeableClause(StartLoc, EndLoc);
5225 }
5226 
5227 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc,
5228                                        SourceLocation EndLoc) {
5229   return new (Context) OMPReadClause(StartLoc, EndLoc);
5230 }
5231 
5232 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc,
5233                                         SourceLocation EndLoc) {
5234   return new (Context) OMPWriteClause(StartLoc, EndLoc);
5235 }
5236 
5237 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc,
5238                                          SourceLocation EndLoc) {
5239   return new (Context) OMPUpdateClause(StartLoc, EndLoc);
5240 }
5241 
5242 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc,
5243                                           SourceLocation EndLoc) {
5244   return new (Context) OMPCaptureClause(StartLoc, EndLoc);
5245 }
5246 
5247 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc,
5248                                          SourceLocation EndLoc) {
5249   return new (Context) OMPSeqCstClause(StartLoc, EndLoc);
5250 }
5251 
5252 OMPClause *Sema::ActOnOpenMPVarListClause(
5253     OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr,
5254     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc,
5255     SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
5256     const DeclarationNameInfo &ReductionId, OpenMPDependClauseKind DepKind,
5257     SourceLocation DepLoc) {
5258   OMPClause *Res = nullptr;
5259   switch (Kind) {
5260   case OMPC_private:
5261     Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc);
5262     break;
5263   case OMPC_firstprivate:
5264     Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
5265     break;
5266   case OMPC_lastprivate:
5267     Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
5268     break;
5269   case OMPC_shared:
5270     Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc);
5271     break;
5272   case OMPC_reduction:
5273     Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
5274                                      EndLoc, ReductionIdScopeSpec, ReductionId);
5275     break;
5276   case OMPC_linear:
5277     Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc,
5278                                   ColonLoc, EndLoc);
5279     break;
5280   case OMPC_aligned:
5281     Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc,
5282                                    ColonLoc, EndLoc);
5283     break;
5284   case OMPC_copyin:
5285     Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
5286     break;
5287   case OMPC_copyprivate:
5288     Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
5289     break;
5290   case OMPC_flush:
5291     Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc);
5292     break;
5293   case OMPC_depend:
5294     Res = ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, StartLoc,
5295                                   LParenLoc, EndLoc);
5296     break;
5297   case OMPC_if:
5298   case OMPC_final:
5299   case OMPC_num_threads:
5300   case OMPC_safelen:
5301   case OMPC_collapse:
5302   case OMPC_default:
5303   case OMPC_proc_bind:
5304   case OMPC_schedule:
5305   case OMPC_ordered:
5306   case OMPC_nowait:
5307   case OMPC_untied:
5308   case OMPC_mergeable:
5309   case OMPC_threadprivate:
5310   case OMPC_read:
5311   case OMPC_write:
5312   case OMPC_update:
5313   case OMPC_capture:
5314   case OMPC_seq_cst:
5315   case OMPC_device:
5316   case OMPC_unknown:
5317     llvm_unreachable("Clause is not allowed.");
5318   }
5319   return Res;
5320 }
5321 
5322 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
5323                                           SourceLocation StartLoc,
5324                                           SourceLocation LParenLoc,
5325                                           SourceLocation EndLoc) {
5326   SmallVector<Expr *, 8> Vars;
5327   SmallVector<Expr *, 8> PrivateCopies;
5328   for (auto &RefExpr : VarList) {
5329     assert(RefExpr && "NULL expr in OpenMP private clause.");
5330     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
5331       // It will be analyzed later.
5332       Vars.push_back(RefExpr);
5333       PrivateCopies.push_back(nullptr);
5334       continue;
5335     }
5336 
5337     SourceLocation ELoc = RefExpr->getExprLoc();
5338     // OpenMP [2.1, C/C++]
5339     //  A list item is a variable name.
5340     // OpenMP  [2.9.3.3, Restrictions, p.1]
5341     //  A variable that is part of another variable (as an array or
5342     //  structure element) cannot appear in a private clause.
5343     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
5344     if (!DE || !isa<VarDecl>(DE->getDecl())) {
5345       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
5346       continue;
5347     }
5348     Decl *D = DE->getDecl();
5349     VarDecl *VD = cast<VarDecl>(D);
5350 
5351     QualType Type = VD->getType();
5352     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
5353       // It will be analyzed later.
5354       Vars.push_back(DE);
5355       PrivateCopies.push_back(nullptr);
5356       continue;
5357     }
5358 
5359     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
5360     //  A variable that appears in a private clause must not have an incomplete
5361     //  type or a reference type.
5362     if (RequireCompleteType(ELoc, Type,
5363                             diag::err_omp_private_incomplete_type)) {
5364       continue;
5365     }
5366     Type = Type.getNonReferenceType();
5367 
5368     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
5369     // in a Construct]
5370     //  Variables with the predetermined data-sharing attributes may not be
5371     //  listed in data-sharing attributes clauses, except for the cases
5372     //  listed below. For these exceptions only, listing a predetermined
5373     //  variable in a data-sharing attribute clause is allowed and overrides
5374     //  the variable's predetermined data-sharing attributes.
5375     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
5376     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) {
5377       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
5378                                           << getOpenMPClauseName(OMPC_private);
5379       ReportOriginalDSA(*this, DSAStack, VD, DVar);
5380       continue;
5381     }
5382 
5383     // Variably modified types are not supported for tasks.
5384     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() &&
5385         DSAStack->getCurrentDirective() == OMPD_task) {
5386       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
5387           << getOpenMPClauseName(OMPC_private) << Type
5388           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
5389       bool IsDecl =
5390           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
5391       Diag(VD->getLocation(),
5392            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
5393           << VD;
5394       continue;
5395     }
5396 
5397     // OpenMP [2.9.3.3, Restrictions, C/C++, p.1]
5398     //  A variable of class type (or array thereof) that appears in a private
5399     //  clause requires an accessible, unambiguous default constructor for the
5400     //  class type.
5401     // Generate helper private variable and initialize it with the default
5402     // value. The address of the original variable is replaced by the address of
5403     // the new private variable in CodeGen. This new variable is not added to
5404     // IdResolver, so the code in the OpenMP region uses original variable for
5405     // proper diagnostics.
5406     Type = Type.getUnqualifiedType();
5407     auto VDPrivate = buildVarDecl(*this, DE->getExprLoc(), Type, VD->getName());
5408     ActOnUninitializedDecl(VDPrivate, /*TypeMayContainAuto=*/false);
5409     if (VDPrivate->isInvalidDecl())
5410       continue;
5411     auto VDPrivateRefExpr = buildDeclRefExpr(
5412         *this, VDPrivate, DE->getType().getUnqualifiedType(), DE->getExprLoc());
5413 
5414     DSAStack->addDSA(VD, DE, OMPC_private);
5415     Vars.push_back(DE);
5416     PrivateCopies.push_back(VDPrivateRefExpr);
5417   }
5418 
5419   if (Vars.empty())
5420     return nullptr;
5421 
5422   return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars,
5423                                   PrivateCopies);
5424 }
5425 
5426 namespace {
5427 class DiagsUninitializedSeveretyRAII {
5428 private:
5429   DiagnosticsEngine &Diags;
5430   SourceLocation SavedLoc;
5431   bool IsIgnored;
5432 
5433 public:
5434   DiagsUninitializedSeveretyRAII(DiagnosticsEngine &Diags, SourceLocation Loc,
5435                                  bool IsIgnored)
5436       : Diags(Diags), SavedLoc(Loc), IsIgnored(IsIgnored) {
5437     if (!IsIgnored) {
5438       Diags.setSeverity(/*Diag*/ diag::warn_uninit_self_reference_in_init,
5439                         /*Map*/ diag::Severity::Ignored, Loc);
5440     }
5441   }
5442   ~DiagsUninitializedSeveretyRAII() {
5443     if (!IsIgnored)
5444       Diags.popMappings(SavedLoc);
5445   }
5446 };
5447 }
5448 
5449 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,
5450                                                SourceLocation StartLoc,
5451                                                SourceLocation LParenLoc,
5452                                                SourceLocation EndLoc) {
5453   SmallVector<Expr *, 8> Vars;
5454   SmallVector<Expr *, 8> PrivateCopies;
5455   SmallVector<Expr *, 8> Inits;
5456   bool IsImplicitClause =
5457       StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid();
5458   auto ImplicitClauseLoc = DSAStack->getConstructLoc();
5459 
5460   for (auto &RefExpr : VarList) {
5461     assert(RefExpr && "NULL expr in OpenMP firstprivate clause.");
5462     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
5463       // It will be analyzed later.
5464       Vars.push_back(RefExpr);
5465       PrivateCopies.push_back(nullptr);
5466       Inits.push_back(nullptr);
5467       continue;
5468     }
5469 
5470     SourceLocation ELoc =
5471         IsImplicitClause ? ImplicitClauseLoc : RefExpr->getExprLoc();
5472     // OpenMP [2.1, C/C++]
5473     //  A list item is a variable name.
5474     // OpenMP  [2.9.3.3, Restrictions, p.1]
5475     //  A variable that is part of another variable (as an array or
5476     //  structure element) cannot appear in a private clause.
5477     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
5478     if (!DE || !isa<VarDecl>(DE->getDecl())) {
5479       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
5480       continue;
5481     }
5482     Decl *D = DE->getDecl();
5483     VarDecl *VD = cast<VarDecl>(D);
5484 
5485     QualType Type = VD->getType();
5486     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
5487       // It will be analyzed later.
5488       Vars.push_back(DE);
5489       PrivateCopies.push_back(nullptr);
5490       Inits.push_back(nullptr);
5491       continue;
5492     }
5493 
5494     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
5495     //  A variable that appears in a private clause must not have an incomplete
5496     //  type or a reference type.
5497     if (RequireCompleteType(ELoc, Type,
5498                             diag::err_omp_firstprivate_incomplete_type)) {
5499       continue;
5500     }
5501     Type = Type.getNonReferenceType();
5502 
5503     // OpenMP [2.9.3.4, Restrictions, C/C++, p.1]
5504     //  A variable of class type (or array thereof) that appears in a private
5505     //  clause requires an accessible, unambiguous copy constructor for the
5506     //  class type.
5507     auto ElemType = Context.getBaseElementType(Type).getNonReferenceType();
5508 
5509     // If an implicit firstprivate variable found it was checked already.
5510     if (!IsImplicitClause) {
5511       DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
5512       bool IsConstant = ElemType.isConstant(Context);
5513       // OpenMP [2.4.13, Data-sharing Attribute Clauses]
5514       //  A list item that specifies a given variable may not appear in more
5515       // than one clause on the same directive, except that a variable may be
5516       //  specified in both firstprivate and lastprivate clauses.
5517       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate &&
5518           DVar.CKind != OMPC_lastprivate && DVar.RefExpr) {
5519         Diag(ELoc, diag::err_omp_wrong_dsa)
5520             << getOpenMPClauseName(DVar.CKind)
5521             << getOpenMPClauseName(OMPC_firstprivate);
5522         ReportOriginalDSA(*this, DSAStack, VD, DVar);
5523         continue;
5524       }
5525 
5526       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
5527       // in a Construct]
5528       //  Variables with the predetermined data-sharing attributes may not be
5529       //  listed in data-sharing attributes clauses, except for the cases
5530       //  listed below. For these exceptions only, listing a predetermined
5531       //  variable in a data-sharing attribute clause is allowed and overrides
5532       //  the variable's predetermined data-sharing attributes.
5533       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
5534       // in a Construct, C/C++, p.2]
5535       //  Variables with const-qualified type having no mutable member may be
5536       //  listed in a firstprivate clause, even if they are static data members.
5537       if (!(IsConstant || VD->isStaticDataMember()) && !DVar.RefExpr &&
5538           DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) {
5539         Diag(ELoc, diag::err_omp_wrong_dsa)
5540             << getOpenMPClauseName(DVar.CKind)
5541             << getOpenMPClauseName(OMPC_firstprivate);
5542         ReportOriginalDSA(*this, DSAStack, VD, DVar);
5543         continue;
5544       }
5545 
5546       OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
5547       // OpenMP [2.9.3.4, Restrictions, p.2]
5548       //  A list item that is private within a parallel region must not appear
5549       //  in a firstprivate clause on a worksharing construct if any of the
5550       //  worksharing regions arising from the worksharing construct ever bind
5551       //  to any of the parallel regions arising from the parallel construct.
5552       if (isOpenMPWorksharingDirective(CurrDir) &&
5553           !isOpenMPParallelDirective(CurrDir)) {
5554         DVar = DSAStack->getImplicitDSA(VD, true);
5555         if (DVar.CKind != OMPC_shared &&
5556             (isOpenMPParallelDirective(DVar.DKind) ||
5557              DVar.DKind == OMPD_unknown)) {
5558           Diag(ELoc, diag::err_omp_required_access)
5559               << getOpenMPClauseName(OMPC_firstprivate)
5560               << getOpenMPClauseName(OMPC_shared);
5561           ReportOriginalDSA(*this, DSAStack, VD, DVar);
5562           continue;
5563         }
5564       }
5565       // OpenMP [2.9.3.4, Restrictions, p.3]
5566       //  A list item that appears in a reduction clause of a parallel construct
5567       //  must not appear in a firstprivate clause on a worksharing or task
5568       //  construct if any of the worksharing or task regions arising from the
5569       //  worksharing or task construct ever bind to any of the parallel regions
5570       //  arising from the parallel construct.
5571       // OpenMP [2.9.3.4, Restrictions, p.4]
5572       //  A list item that appears in a reduction clause in worksharing
5573       //  construct must not appear in a firstprivate clause in a task construct
5574       //  encountered during execution of any of the worksharing regions arising
5575       //  from the worksharing construct.
5576       if (CurrDir == OMPD_task) {
5577         DVar =
5578             DSAStack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction),
5579                                       [](OpenMPDirectiveKind K) -> bool {
5580                                         return isOpenMPParallelDirective(K) ||
5581                                                isOpenMPWorksharingDirective(K);
5582                                       },
5583                                       false);
5584         if (DVar.CKind == OMPC_reduction &&
5585             (isOpenMPParallelDirective(DVar.DKind) ||
5586              isOpenMPWorksharingDirective(DVar.DKind))) {
5587           Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate)
5588               << getOpenMPDirectiveName(DVar.DKind);
5589           ReportOriginalDSA(*this, DSAStack, VD, DVar);
5590           continue;
5591         }
5592       }
5593     }
5594 
5595     // Variably modified types are not supported for tasks.
5596     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() &&
5597         DSAStack->getCurrentDirective() == OMPD_task) {
5598       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
5599           << getOpenMPClauseName(OMPC_firstprivate) << Type
5600           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
5601       bool IsDecl =
5602           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
5603       Diag(VD->getLocation(),
5604            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
5605           << VD;
5606       continue;
5607     }
5608 
5609     Type = Type.getUnqualifiedType();
5610     auto VDPrivate = buildVarDecl(*this, ELoc, Type, VD->getName());
5611     // Generate helper private variable and initialize it with the value of the
5612     // original variable. The address of the original variable is replaced by
5613     // the address of the new private variable in the CodeGen. This new variable
5614     // is not added to IdResolver, so the code in the OpenMP region uses
5615     // original variable for proper diagnostics and variable capturing.
5616     Expr *VDInitRefExpr = nullptr;
5617     // For arrays generate initializer for single element and replace it by the
5618     // original array element in CodeGen.
5619     if (Type->isArrayType()) {
5620       auto VDInit =
5621           buildVarDecl(*this, DE->getExprLoc(), ElemType, VD->getName());
5622       VDInitRefExpr = buildDeclRefExpr(*this, VDInit, ElemType, ELoc);
5623       auto Init = DefaultLvalueConversion(VDInitRefExpr).get();
5624       ElemType = ElemType.getUnqualifiedType();
5625       auto *VDInitTemp = buildVarDecl(*this, DE->getLocStart(), ElemType,
5626                                       ".firstprivate.temp");
5627       InitializedEntity Entity =
5628           InitializedEntity::InitializeVariable(VDInitTemp);
5629       InitializationKind Kind = InitializationKind::CreateCopy(ELoc, ELoc);
5630 
5631       InitializationSequence InitSeq(*this, Entity, Kind, Init);
5632       ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Init);
5633       if (Result.isInvalid())
5634         VDPrivate->setInvalidDecl();
5635       else
5636         VDPrivate->setInit(Result.getAs<Expr>());
5637     } else {
5638       auto *VDInit =
5639           buildVarDecl(*this, DE->getLocStart(), Type, ".firstprivate.temp");
5640       VDInitRefExpr =
5641           buildDeclRefExpr(*this, VDInit, DE->getType(), DE->getExprLoc());
5642       AddInitializerToDecl(VDPrivate,
5643                            DefaultLvalueConversion(VDInitRefExpr).get(),
5644                            /*DirectInit=*/false, /*TypeMayContainAuto=*/false);
5645     }
5646     if (VDPrivate->isInvalidDecl()) {
5647       if (IsImplicitClause) {
5648         Diag(DE->getExprLoc(),
5649              diag::note_omp_task_predetermined_firstprivate_here);
5650       }
5651       continue;
5652     }
5653     CurContext->addDecl(VDPrivate);
5654     auto VDPrivateRefExpr = buildDeclRefExpr(
5655         *this, VDPrivate, DE->getType().getUnqualifiedType(), DE->getExprLoc());
5656     DSAStack->addDSA(VD, DE, OMPC_firstprivate);
5657     Vars.push_back(DE);
5658     PrivateCopies.push_back(VDPrivateRefExpr);
5659     Inits.push_back(VDInitRefExpr);
5660   }
5661 
5662   if (Vars.empty())
5663     return nullptr;
5664 
5665   return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
5666                                        Vars, PrivateCopies, Inits);
5667 }
5668 
5669 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList,
5670                                               SourceLocation StartLoc,
5671                                               SourceLocation LParenLoc,
5672                                               SourceLocation EndLoc) {
5673   SmallVector<Expr *, 8> Vars;
5674   SmallVector<Expr *, 8> SrcExprs;
5675   SmallVector<Expr *, 8> DstExprs;
5676   SmallVector<Expr *, 8> AssignmentOps;
5677   for (auto &RefExpr : VarList) {
5678     assert(RefExpr && "NULL expr in OpenMP lastprivate clause.");
5679     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
5680       // It will be analyzed later.
5681       Vars.push_back(RefExpr);
5682       SrcExprs.push_back(nullptr);
5683       DstExprs.push_back(nullptr);
5684       AssignmentOps.push_back(nullptr);
5685       continue;
5686     }
5687 
5688     SourceLocation ELoc = RefExpr->getExprLoc();
5689     // OpenMP [2.1, C/C++]
5690     //  A list item is a variable name.
5691     // OpenMP  [2.14.3.5, Restrictions, p.1]
5692     //  A variable that is part of another variable (as an array or structure
5693     //  element) cannot appear in a lastprivate clause.
5694     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
5695     if (!DE || !isa<VarDecl>(DE->getDecl())) {
5696       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
5697       continue;
5698     }
5699     Decl *D = DE->getDecl();
5700     VarDecl *VD = cast<VarDecl>(D);
5701 
5702     QualType Type = VD->getType();
5703     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
5704       // It will be analyzed later.
5705       Vars.push_back(DE);
5706       SrcExprs.push_back(nullptr);
5707       DstExprs.push_back(nullptr);
5708       AssignmentOps.push_back(nullptr);
5709       continue;
5710     }
5711 
5712     // OpenMP [2.14.3.5, Restrictions, C/C++, p.2]
5713     //  A variable that appears in a lastprivate clause must not have an
5714     //  incomplete type or a reference type.
5715     if (RequireCompleteType(ELoc, Type,
5716                             diag::err_omp_lastprivate_incomplete_type)) {
5717       continue;
5718     }
5719     Type = Type.getNonReferenceType();
5720 
5721     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
5722     // in a Construct]
5723     //  Variables with the predetermined data-sharing attributes may not be
5724     //  listed in data-sharing attributes clauses, except for the cases
5725     //  listed below.
5726     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
5727     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate &&
5728         DVar.CKind != OMPC_firstprivate &&
5729         (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
5730       Diag(ELoc, diag::err_omp_wrong_dsa)
5731           << getOpenMPClauseName(DVar.CKind)
5732           << getOpenMPClauseName(OMPC_lastprivate);
5733       ReportOriginalDSA(*this, DSAStack, VD, DVar);
5734       continue;
5735     }
5736 
5737     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
5738     // OpenMP [2.14.3.5, Restrictions, p.2]
5739     // A list item that is private within a parallel region, or that appears in
5740     // the reduction clause of a parallel construct, must not appear in a
5741     // lastprivate clause on a worksharing construct if any of the corresponding
5742     // worksharing regions ever binds to any of the corresponding parallel
5743     // regions.
5744     DSAStackTy::DSAVarData TopDVar = DVar;
5745     if (isOpenMPWorksharingDirective(CurrDir) &&
5746         !isOpenMPParallelDirective(CurrDir)) {
5747       DVar = DSAStack->getImplicitDSA(VD, true);
5748       if (DVar.CKind != OMPC_shared) {
5749         Diag(ELoc, diag::err_omp_required_access)
5750             << getOpenMPClauseName(OMPC_lastprivate)
5751             << getOpenMPClauseName(OMPC_shared);
5752         ReportOriginalDSA(*this, DSAStack, VD, DVar);
5753         continue;
5754       }
5755     }
5756     // OpenMP [2.14.3.5, Restrictions, C++, p.1,2]
5757     //  A variable of class type (or array thereof) that appears in a
5758     //  lastprivate clause requires an accessible, unambiguous default
5759     //  constructor for the class type, unless the list item is also specified
5760     //  in a firstprivate clause.
5761     //  A variable of class type (or array thereof) that appears in a
5762     //  lastprivate clause requires an accessible, unambiguous copy assignment
5763     //  operator for the class type.
5764     Type = Context.getBaseElementType(Type).getNonReferenceType();
5765     auto *SrcVD = buildVarDecl(*this, DE->getLocStart(),
5766                                Type.getUnqualifiedType(), ".lastprivate.src");
5767     auto *PseudoSrcExpr = buildDeclRefExpr(
5768         *this, SrcVD, Type.getUnqualifiedType(), DE->getExprLoc());
5769     auto *DstVD =
5770         buildVarDecl(*this, DE->getLocStart(), Type, ".lastprivate.dst");
5771     auto *PseudoDstExpr =
5772         buildDeclRefExpr(*this, DstVD, Type, DE->getExprLoc());
5773     // For arrays generate assignment operation for single element and replace
5774     // it by the original array element in CodeGen.
5775     auto AssignmentOp = BuildBinOp(/*S=*/nullptr, DE->getExprLoc(), BO_Assign,
5776                                    PseudoDstExpr, PseudoSrcExpr);
5777     if (AssignmentOp.isInvalid())
5778       continue;
5779     AssignmentOp = ActOnFinishFullExpr(AssignmentOp.get(), DE->getExprLoc(),
5780                                        /*DiscardedValue=*/true);
5781     if (AssignmentOp.isInvalid())
5782       continue;
5783 
5784     if (TopDVar.CKind != OMPC_firstprivate)
5785       DSAStack->addDSA(VD, DE, OMPC_lastprivate);
5786     Vars.push_back(DE);
5787     SrcExprs.push_back(PseudoSrcExpr);
5788     DstExprs.push_back(PseudoDstExpr);
5789     AssignmentOps.push_back(AssignmentOp.get());
5790   }
5791 
5792   if (Vars.empty())
5793     return nullptr;
5794 
5795   return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
5796                                       Vars, SrcExprs, DstExprs, AssignmentOps);
5797 }
5798 
5799 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
5800                                          SourceLocation StartLoc,
5801                                          SourceLocation LParenLoc,
5802                                          SourceLocation EndLoc) {
5803   SmallVector<Expr *, 8> Vars;
5804   for (auto &RefExpr : VarList) {
5805     assert(RefExpr && "NULL expr in OpenMP shared clause.");
5806     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
5807       // It will be analyzed later.
5808       Vars.push_back(RefExpr);
5809       continue;
5810     }
5811 
5812     SourceLocation ELoc = RefExpr->getExprLoc();
5813     // OpenMP [2.1, C/C++]
5814     //  A list item is a variable name.
5815     // OpenMP  [2.14.3.2, Restrictions, p.1]
5816     //  A variable that is part of another variable (as an array or structure
5817     //  element) cannot appear in a shared unless it is a static data member
5818     //  of a C++ class.
5819     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
5820     if (!DE || !isa<VarDecl>(DE->getDecl())) {
5821       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
5822       continue;
5823     }
5824     Decl *D = DE->getDecl();
5825     VarDecl *VD = cast<VarDecl>(D);
5826 
5827     QualType Type = VD->getType();
5828     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
5829       // It will be analyzed later.
5830       Vars.push_back(DE);
5831       continue;
5832     }
5833 
5834     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
5835     // in a Construct]
5836     //  Variables with the predetermined data-sharing attributes may not be
5837     //  listed in data-sharing attributes clauses, except for the cases
5838     //  listed below. For these exceptions only, listing a predetermined
5839     //  variable in a data-sharing attribute clause is allowed and overrides
5840     //  the variable's predetermined data-sharing attributes.
5841     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
5842     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared &&
5843         DVar.RefExpr) {
5844       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
5845                                           << getOpenMPClauseName(OMPC_shared);
5846       ReportOriginalDSA(*this, DSAStack, VD, DVar);
5847       continue;
5848     }
5849 
5850     DSAStack->addDSA(VD, DE, OMPC_shared);
5851     Vars.push_back(DE);
5852   }
5853 
5854   if (Vars.empty())
5855     return nullptr;
5856 
5857   return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
5858 }
5859 
5860 namespace {
5861 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> {
5862   DSAStackTy *Stack;
5863 
5864 public:
5865   bool VisitDeclRefExpr(DeclRefExpr *E) {
5866     if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
5867       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, false);
5868       if (DVar.CKind == OMPC_shared && !DVar.RefExpr)
5869         return false;
5870       if (DVar.CKind != OMPC_unknown)
5871         return true;
5872       DSAStackTy::DSAVarData DVarPrivate =
5873           Stack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(), false);
5874       if (DVarPrivate.CKind != OMPC_unknown)
5875         return true;
5876       return false;
5877     }
5878     return false;
5879   }
5880   bool VisitStmt(Stmt *S) {
5881     for (auto Child : S->children()) {
5882       if (Child && Visit(Child))
5883         return true;
5884     }
5885     return false;
5886   }
5887   explicit DSARefChecker(DSAStackTy *S) : Stack(S) {}
5888 };
5889 } // namespace
5890 
5891 OMPClause *Sema::ActOnOpenMPReductionClause(
5892     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
5893     SourceLocation ColonLoc, SourceLocation EndLoc,
5894     CXXScopeSpec &ReductionIdScopeSpec,
5895     const DeclarationNameInfo &ReductionId) {
5896   // TODO: Allow scope specification search when 'declare reduction' is
5897   // supported.
5898   assert(ReductionIdScopeSpec.isEmpty() &&
5899          "No support for scoped reduction identifiers yet.");
5900 
5901   auto DN = ReductionId.getName();
5902   auto OOK = DN.getCXXOverloadedOperator();
5903   BinaryOperatorKind BOK = BO_Comma;
5904 
5905   // OpenMP [2.14.3.6, reduction clause]
5906   // C
5907   // reduction-identifier is either an identifier or one of the following
5908   // operators: +, -, *,  &, |, ^, && and ||
5909   // C++
5910   // reduction-identifier is either an id-expression or one of the following
5911   // operators: +, -, *, &, |, ^, && and ||
5912   // FIXME: Only 'min' and 'max' identifiers are supported for now.
5913   switch (OOK) {
5914   case OO_Plus:
5915   case OO_Minus:
5916     BOK = BO_Add;
5917     break;
5918   case OO_Star:
5919     BOK = BO_Mul;
5920     break;
5921   case OO_Amp:
5922     BOK = BO_And;
5923     break;
5924   case OO_Pipe:
5925     BOK = BO_Or;
5926     break;
5927   case OO_Caret:
5928     BOK = BO_Xor;
5929     break;
5930   case OO_AmpAmp:
5931     BOK = BO_LAnd;
5932     break;
5933   case OO_PipePipe:
5934     BOK = BO_LOr;
5935     break;
5936   case OO_New:
5937   case OO_Delete:
5938   case OO_Array_New:
5939   case OO_Array_Delete:
5940   case OO_Slash:
5941   case OO_Percent:
5942   case OO_Tilde:
5943   case OO_Exclaim:
5944   case OO_Equal:
5945   case OO_Less:
5946   case OO_Greater:
5947   case OO_LessEqual:
5948   case OO_GreaterEqual:
5949   case OO_PlusEqual:
5950   case OO_MinusEqual:
5951   case OO_StarEqual:
5952   case OO_SlashEqual:
5953   case OO_PercentEqual:
5954   case OO_CaretEqual:
5955   case OO_AmpEqual:
5956   case OO_PipeEqual:
5957   case OO_LessLess:
5958   case OO_GreaterGreater:
5959   case OO_LessLessEqual:
5960   case OO_GreaterGreaterEqual:
5961   case OO_EqualEqual:
5962   case OO_ExclaimEqual:
5963   case OO_PlusPlus:
5964   case OO_MinusMinus:
5965   case OO_Comma:
5966   case OO_ArrowStar:
5967   case OO_Arrow:
5968   case OO_Call:
5969   case OO_Subscript:
5970   case OO_Conditional:
5971   case NUM_OVERLOADED_OPERATORS:
5972     llvm_unreachable("Unexpected reduction identifier");
5973   case OO_None:
5974     if (auto II = DN.getAsIdentifierInfo()) {
5975       if (II->isStr("max"))
5976         BOK = BO_GT;
5977       else if (II->isStr("min"))
5978         BOK = BO_LT;
5979     }
5980     break;
5981   }
5982   SourceRange ReductionIdRange;
5983   if (ReductionIdScopeSpec.isValid()) {
5984     ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc());
5985   }
5986   ReductionIdRange.setEnd(ReductionId.getEndLoc());
5987   if (BOK == BO_Comma) {
5988     // Not allowed reduction identifier is found.
5989     Diag(ReductionId.getLocStart(), diag::err_omp_unknown_reduction_identifier)
5990         << ReductionIdRange;
5991     return nullptr;
5992   }
5993 
5994   SmallVector<Expr *, 8> Vars;
5995   SmallVector<Expr *, 8> LHSs;
5996   SmallVector<Expr *, 8> RHSs;
5997   SmallVector<Expr *, 8> ReductionOps;
5998   for (auto RefExpr : VarList) {
5999     assert(RefExpr && "nullptr expr in OpenMP reduction clause.");
6000     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6001       // It will be analyzed later.
6002       Vars.push_back(RefExpr);
6003       LHSs.push_back(nullptr);
6004       RHSs.push_back(nullptr);
6005       ReductionOps.push_back(nullptr);
6006       continue;
6007     }
6008 
6009     if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() ||
6010         RefExpr->isInstantiationDependent() ||
6011         RefExpr->containsUnexpandedParameterPack()) {
6012       // It will be analyzed later.
6013       Vars.push_back(RefExpr);
6014       LHSs.push_back(nullptr);
6015       RHSs.push_back(nullptr);
6016       ReductionOps.push_back(nullptr);
6017       continue;
6018     }
6019 
6020     auto ELoc = RefExpr->getExprLoc();
6021     auto ERange = RefExpr->getSourceRange();
6022     // OpenMP [2.1, C/C++]
6023     //  A list item is a variable or array section, subject to the restrictions
6024     //  specified in Section 2.4 on page 42 and in each of the sections
6025     // describing clauses and directives for which a list appears.
6026     // OpenMP  [2.14.3.3, Restrictions, p.1]
6027     //  A variable that is part of another variable (as an array or
6028     //  structure element) cannot appear in a private clause.
6029     auto DE = dyn_cast<DeclRefExpr>(RefExpr);
6030     if (!DE || !isa<VarDecl>(DE->getDecl())) {
6031       Diag(ELoc, diag::err_omp_expected_var_name) << ERange;
6032       continue;
6033     }
6034     auto D = DE->getDecl();
6035     auto VD = cast<VarDecl>(D);
6036     auto Type = VD->getType();
6037     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
6038     //  A variable that appears in a private clause must not have an incomplete
6039     //  type or a reference type.
6040     if (RequireCompleteType(ELoc, Type,
6041                             diag::err_omp_reduction_incomplete_type))
6042       continue;
6043     // OpenMP [2.14.3.6, reduction clause, Restrictions]
6044     // Arrays may not appear in a reduction clause.
6045     if (Type.getNonReferenceType()->isArrayType()) {
6046       Diag(ELoc, diag::err_omp_reduction_type_array) << Type << ERange;
6047       bool IsDecl =
6048           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6049       Diag(VD->getLocation(),
6050            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6051           << VD;
6052       continue;
6053     }
6054     // OpenMP [2.14.3.6, reduction clause, Restrictions]
6055     // A list item that appears in a reduction clause must not be
6056     // const-qualified.
6057     if (Type.getNonReferenceType().isConstant(Context)) {
6058       Diag(ELoc, diag::err_omp_const_variable)
6059           << getOpenMPClauseName(OMPC_reduction) << Type << ERange;
6060       bool IsDecl =
6061           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6062       Diag(VD->getLocation(),
6063            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6064           << VD;
6065       continue;
6066     }
6067     // OpenMP [2.9.3.6, Restrictions, C/C++, p.4]
6068     //  If a list-item is a reference type then it must bind to the same object
6069     //  for all threads of the team.
6070     VarDecl *VDDef = VD->getDefinition();
6071     if (Type->isReferenceType() && VDDef) {
6072       DSARefChecker Check(DSAStack);
6073       if (Check.Visit(VDDef->getInit())) {
6074         Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange;
6075         Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef;
6076         continue;
6077       }
6078     }
6079     // OpenMP [2.14.3.6, reduction clause, Restrictions]
6080     // The type of a list item that appears in a reduction clause must be valid
6081     // for the reduction-identifier. For a max or min reduction in C, the type
6082     // of the list item must be an allowed arithmetic data type: char, int,
6083     // float, double, or _Bool, possibly modified with long, short, signed, or
6084     // unsigned. For a max or min reduction in C++, the type of the list item
6085     // must be an allowed arithmetic data type: char, wchar_t, int, float,
6086     // double, or bool, possibly modified with long, short, signed, or unsigned.
6087     if ((BOK == BO_GT || BOK == BO_LT) &&
6088         !(Type->isScalarType() ||
6089           (getLangOpts().CPlusPlus && Type->isArithmeticType()))) {
6090       Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg)
6091           << getLangOpts().CPlusPlus;
6092       bool IsDecl =
6093           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6094       Diag(VD->getLocation(),
6095            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6096           << VD;
6097       continue;
6098     }
6099     if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) &&
6100         !getLangOpts().CPlusPlus && Type->isFloatingType()) {
6101       Diag(ELoc, diag::err_omp_clause_floating_type_arg);
6102       bool IsDecl =
6103           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6104       Diag(VD->getLocation(),
6105            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6106           << VD;
6107       continue;
6108     }
6109     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
6110     // in a Construct]
6111     //  Variables with the predetermined data-sharing attributes may not be
6112     //  listed in data-sharing attributes clauses, except for the cases
6113     //  listed below. For these exceptions only, listing a predetermined
6114     //  variable in a data-sharing attribute clause is allowed and overrides
6115     //  the variable's predetermined data-sharing attributes.
6116     // OpenMP [2.14.3.6, Restrictions, p.3]
6117     //  Any number of reduction clauses can be specified on the directive,
6118     //  but a list item can appear only once in the reduction clauses for that
6119     //  directive.
6120     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
6121     if (DVar.CKind == OMPC_reduction) {
6122       Diag(ELoc, diag::err_omp_once_referenced)
6123           << getOpenMPClauseName(OMPC_reduction);
6124       if (DVar.RefExpr) {
6125         Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced);
6126       }
6127     } else if (DVar.CKind != OMPC_unknown) {
6128       Diag(ELoc, diag::err_omp_wrong_dsa)
6129           << getOpenMPClauseName(DVar.CKind)
6130           << getOpenMPClauseName(OMPC_reduction);
6131       ReportOriginalDSA(*this, DSAStack, VD, DVar);
6132       continue;
6133     }
6134 
6135     // OpenMP [2.14.3.6, Restrictions, p.1]
6136     //  A list item that appears in a reduction clause of a worksharing
6137     //  construct must be shared in the parallel regions to which any of the
6138     //  worksharing regions arising from the worksharing construct bind.
6139     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
6140     if (isOpenMPWorksharingDirective(CurrDir) &&
6141         !isOpenMPParallelDirective(CurrDir)) {
6142       DVar = DSAStack->getImplicitDSA(VD, true);
6143       if (DVar.CKind != OMPC_shared) {
6144         Diag(ELoc, diag::err_omp_required_access)
6145             << getOpenMPClauseName(OMPC_reduction)
6146             << getOpenMPClauseName(OMPC_shared);
6147         ReportOriginalDSA(*this, DSAStack, VD, DVar);
6148         continue;
6149       }
6150     }
6151     Type = Type.getNonLValueExprType(Context).getUnqualifiedType();
6152     auto *LHSVD = buildVarDecl(*this, ELoc, Type, ".reduction.lhs");
6153     auto *RHSVD = buildVarDecl(*this, ELoc, Type, VD->getName());
6154     // Add initializer for private variable.
6155     Expr *Init = nullptr;
6156     switch (BOK) {
6157     case BO_Add:
6158     case BO_Xor:
6159     case BO_Or:
6160     case BO_LOr:
6161       // '+', '-', '^', '|', '||' reduction ops - initializer is '0'.
6162       if (Type->isScalarType() || Type->isAnyComplexType()) {
6163         Init = ActOnIntegerConstant(ELoc, /*Val=*/0).get();
6164       }
6165       break;
6166     case BO_Mul:
6167     case BO_LAnd:
6168       if (Type->isScalarType() || Type->isAnyComplexType()) {
6169         // '*' and '&&' reduction ops - initializer is '1'.
6170         Init = ActOnIntegerConstant(ELoc, /*Val=*/1).get();
6171       }
6172       break;
6173     case BO_And: {
6174       // '&' reduction op - initializer is '~0'.
6175       QualType OrigType = Type;
6176       if (auto *ComplexTy = OrigType->getAs<ComplexType>()) {
6177         Type = ComplexTy->getElementType();
6178       }
6179       if (Type->isRealFloatingType()) {
6180         llvm::APFloat InitValue =
6181             llvm::APFloat::getAllOnesValue(Context.getTypeSize(Type),
6182                                            /*isIEEE=*/true);
6183         Init = FloatingLiteral::Create(Context, InitValue, /*isexact=*/true,
6184                                        Type, ELoc);
6185       } else if (Type->isScalarType()) {
6186         auto Size = Context.getTypeSize(Type);
6187         QualType IntTy = Context.getIntTypeForBitwidth(Size, /*Signed=*/0);
6188         llvm::APInt InitValue = llvm::APInt::getAllOnesValue(Size);
6189         Init = IntegerLiteral::Create(Context, InitValue, IntTy, ELoc);
6190       }
6191       if (Init && OrigType->isAnyComplexType()) {
6192         // Init = 0xFFFF + 0xFFFFi;
6193         auto *Im = new (Context) ImaginaryLiteral(Init, OrigType);
6194         Init = CreateBuiltinBinOp(ELoc, BO_Add, Init, Im).get();
6195       }
6196       Type = OrigType;
6197       break;
6198     }
6199     case BO_LT:
6200     case BO_GT: {
6201       // 'min' reduction op - initializer is 'Largest representable number in
6202       // the reduction list item type'.
6203       // 'max' reduction op - initializer is 'Least representable number in
6204       // the reduction list item type'.
6205       if (Type->isIntegerType() || Type->isPointerType()) {
6206         bool IsSigned = Type->hasSignedIntegerRepresentation();
6207         auto Size = Context.getTypeSize(Type);
6208         QualType IntTy =
6209             Context.getIntTypeForBitwidth(Size, /*Signed=*/IsSigned);
6210         llvm::APInt InitValue =
6211             (BOK != BO_LT)
6212                 ? IsSigned ? llvm::APInt::getSignedMinValue(Size)
6213                            : llvm::APInt::getMinValue(Size)
6214                 : IsSigned ? llvm::APInt::getSignedMaxValue(Size)
6215                            : llvm::APInt::getMaxValue(Size);
6216         Init = IntegerLiteral::Create(Context, InitValue, IntTy, ELoc);
6217         if (Type->isPointerType()) {
6218           // Cast to pointer type.
6219           auto CastExpr = BuildCStyleCastExpr(
6220               SourceLocation(), Context.getTrivialTypeSourceInfo(Type, ELoc),
6221               SourceLocation(), Init);
6222           if (CastExpr.isInvalid())
6223             continue;
6224           Init = CastExpr.get();
6225         }
6226       } else if (Type->isRealFloatingType()) {
6227         llvm::APFloat InitValue = llvm::APFloat::getLargest(
6228             Context.getFloatTypeSemantics(Type), BOK != BO_LT);
6229         Init = FloatingLiteral::Create(Context, InitValue, /*isexact=*/true,
6230                                        Type, ELoc);
6231       }
6232       break;
6233     }
6234     case BO_PtrMemD:
6235     case BO_PtrMemI:
6236     case BO_MulAssign:
6237     case BO_Div:
6238     case BO_Rem:
6239     case BO_Sub:
6240     case BO_Shl:
6241     case BO_Shr:
6242     case BO_LE:
6243     case BO_GE:
6244     case BO_EQ:
6245     case BO_NE:
6246     case BO_AndAssign:
6247     case BO_XorAssign:
6248     case BO_OrAssign:
6249     case BO_Assign:
6250     case BO_AddAssign:
6251     case BO_SubAssign:
6252     case BO_DivAssign:
6253     case BO_RemAssign:
6254     case BO_ShlAssign:
6255     case BO_ShrAssign:
6256     case BO_Comma:
6257       llvm_unreachable("Unexpected reduction operation");
6258     }
6259     if (Init) {
6260       AddInitializerToDecl(RHSVD, Init, /*DirectInit=*/false,
6261                            /*TypeMayContainAuto=*/false);
6262     } else {
6263       ActOnUninitializedDecl(RHSVD, /*TypeMayContainAuto=*/false);
6264     }
6265     if (!RHSVD->hasInit()) {
6266       Diag(ELoc, diag::err_omp_reduction_id_not_compatible) << Type
6267                                                             << ReductionIdRange;
6268       bool IsDecl =
6269           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6270       Diag(VD->getLocation(),
6271            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6272           << VD;
6273       continue;
6274     }
6275     auto *LHSDRE = buildDeclRefExpr(*this, LHSVD, Type, ELoc);
6276     auto *RHSDRE = buildDeclRefExpr(*this, RHSVD, Type, ELoc);
6277     ExprResult ReductionOp =
6278         BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK,
6279                    LHSDRE, RHSDRE);
6280     if (ReductionOp.isUsable()) {
6281       if (BOK != BO_LT && BOK != BO_GT) {
6282         ReductionOp =
6283             BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(),
6284                        BO_Assign, LHSDRE, ReductionOp.get());
6285       } else {
6286         auto *ConditionalOp = new (Context) ConditionalOperator(
6287             ReductionOp.get(), SourceLocation(), LHSDRE, SourceLocation(),
6288             RHSDRE, Type, VK_LValue, OK_Ordinary);
6289         ReductionOp =
6290             BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(),
6291                        BO_Assign, LHSDRE, ConditionalOp);
6292       }
6293       if (ReductionOp.isUsable()) {
6294         ReductionOp = ActOnFinishFullExpr(ReductionOp.get());
6295       }
6296     }
6297     if (ReductionOp.isInvalid())
6298       continue;
6299 
6300     DSAStack->addDSA(VD, DE, OMPC_reduction);
6301     Vars.push_back(DE);
6302     LHSs.push_back(LHSDRE);
6303     RHSs.push_back(RHSDRE);
6304     ReductionOps.push_back(ReductionOp.get());
6305   }
6306 
6307   if (Vars.empty())
6308     return nullptr;
6309 
6310   return OMPReductionClause::Create(
6311       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, Vars,
6312       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId, LHSs,
6313       RHSs, ReductionOps);
6314 }
6315 
6316 OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
6317                                          SourceLocation StartLoc,
6318                                          SourceLocation LParenLoc,
6319                                          SourceLocation ColonLoc,
6320                                          SourceLocation EndLoc) {
6321   SmallVector<Expr *, 8> Vars;
6322   SmallVector<Expr *, 8> Privates;
6323   SmallVector<Expr *, 8> Inits;
6324   for (auto &RefExpr : VarList) {
6325     assert(RefExpr && "NULL expr in OpenMP linear clause.");
6326     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6327       // It will be analyzed later.
6328       Vars.push_back(RefExpr);
6329       Privates.push_back(nullptr);
6330       Inits.push_back(nullptr);
6331       continue;
6332     }
6333 
6334     // OpenMP [2.14.3.7, linear clause]
6335     // A list item that appears in a linear clause is subject to the private
6336     // clause semantics described in Section 2.14.3.3 on page 159 except as
6337     // noted. In addition, the value of the new list item on each iteration
6338     // of the associated loop(s) corresponds to the value of the original
6339     // list item before entering the construct plus the logical number of
6340     // the iteration times linear-step.
6341 
6342     SourceLocation ELoc = RefExpr->getExprLoc();
6343     // OpenMP [2.1, C/C++]
6344     //  A list item is a variable name.
6345     // OpenMP  [2.14.3.3, Restrictions, p.1]
6346     //  A variable that is part of another variable (as an array or
6347     //  structure element) cannot appear in a private clause.
6348     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
6349     if (!DE || !isa<VarDecl>(DE->getDecl())) {
6350       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
6351       continue;
6352     }
6353 
6354     VarDecl *VD = cast<VarDecl>(DE->getDecl());
6355 
6356     // OpenMP [2.14.3.7, linear clause]
6357     //  A list-item cannot appear in more than one linear clause.
6358     //  A list-item that appears in a linear clause cannot appear in any
6359     //  other data-sharing attribute clause.
6360     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
6361     if (DVar.RefExpr) {
6362       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
6363                                           << getOpenMPClauseName(OMPC_linear);
6364       ReportOriginalDSA(*this, DSAStack, VD, DVar);
6365       continue;
6366     }
6367 
6368     QualType QType = VD->getType();
6369     if (QType->isDependentType() || QType->isInstantiationDependentType()) {
6370       // It will be analyzed later.
6371       Vars.push_back(DE);
6372       Privates.push_back(nullptr);
6373       Inits.push_back(nullptr);
6374       continue;
6375     }
6376 
6377     // A variable must not have an incomplete type or a reference type.
6378     if (RequireCompleteType(ELoc, QType,
6379                             diag::err_omp_linear_incomplete_type)) {
6380       continue;
6381     }
6382     QType = QType.getNonReferenceType();
6383 
6384     // A list item must not be const-qualified.
6385     if (QType.isConstant(Context)) {
6386       Diag(ELoc, diag::err_omp_const_variable)
6387           << getOpenMPClauseName(OMPC_linear);
6388       bool IsDecl =
6389           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6390       Diag(VD->getLocation(),
6391            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6392           << VD;
6393       continue;
6394     }
6395 
6396     // A list item must be of integral or pointer type.
6397     QType = QType.getUnqualifiedType().getCanonicalType();
6398     const Type *Ty = QType.getTypePtrOrNull();
6399     if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) &&
6400                 !Ty->isPointerType())) {
6401       Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << QType;
6402       bool IsDecl =
6403           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6404       Diag(VD->getLocation(),
6405            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6406           << VD;
6407       continue;
6408     }
6409 
6410     // Build private copy of original var.
6411     auto *Private = buildVarDecl(*this, ELoc, QType, VD->getName());
6412     auto *PrivateRef = buildDeclRefExpr(
6413         *this, Private, DE->getType().getUnqualifiedType(), DE->getExprLoc());
6414     // Build var to save initial value.
6415     VarDecl *Init = buildVarDecl(*this, ELoc, QType, ".linear.start");
6416     AddInitializerToDecl(Init, DefaultLvalueConversion(DE).get(),
6417                          /*DirectInit*/ false, /*TypeMayContainAuto*/ false);
6418     auto InitRef = buildDeclRefExpr(
6419         *this, Init, DE->getType().getUnqualifiedType(), DE->getExprLoc());
6420     DSAStack->addDSA(VD, DE, OMPC_linear);
6421     Vars.push_back(DE);
6422     Privates.push_back(PrivateRef);
6423     Inits.push_back(InitRef);
6424   }
6425 
6426   if (Vars.empty())
6427     return nullptr;
6428 
6429   Expr *StepExpr = Step;
6430   Expr *CalcStepExpr = nullptr;
6431   if (Step && !Step->isValueDependent() && !Step->isTypeDependent() &&
6432       !Step->isInstantiationDependent() &&
6433       !Step->containsUnexpandedParameterPack()) {
6434     SourceLocation StepLoc = Step->getLocStart();
6435     ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step);
6436     if (Val.isInvalid())
6437       return nullptr;
6438     StepExpr = Val.get();
6439 
6440     // Build var to save the step value.
6441     VarDecl *SaveVar =
6442         buildVarDecl(*this, StepLoc, StepExpr->getType(), ".linear.step");
6443     ExprResult SaveRef =
6444         buildDeclRefExpr(*this, SaveVar, StepExpr->getType(), StepLoc);
6445     ExprResult CalcStep =
6446         BuildBinOp(CurScope, StepLoc, BO_Assign, SaveRef.get(), StepExpr);
6447 
6448     // Warn about zero linear step (it would be probably better specified as
6449     // making corresponding variables 'const').
6450     llvm::APSInt Result;
6451     bool IsConstant = StepExpr->isIntegerConstantExpr(Result, Context);
6452     if (IsConstant && !Result.isNegative() && !Result.isStrictlyPositive())
6453       Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0]
6454                                                      << (Vars.size() > 1);
6455     if (!IsConstant && CalcStep.isUsable()) {
6456       // Calculate the step beforehand instead of doing this on each iteration.
6457       // (This is not used if the number of iterations may be kfold-ed).
6458       CalcStepExpr = CalcStep.get();
6459     }
6460   }
6461 
6462   return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc,
6463                                  Vars, Privates, Inits, StepExpr, CalcStepExpr);
6464 }
6465 
6466 static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
6467                                      Expr *NumIterations, Sema &SemaRef,
6468                                      Scope *S) {
6469   // Walk the vars and build update/final expressions for the CodeGen.
6470   SmallVector<Expr *, 8> Updates;
6471   SmallVector<Expr *, 8> Finals;
6472   Expr *Step = Clause.getStep();
6473   Expr *CalcStep = Clause.getCalcStep();
6474   // OpenMP [2.14.3.7, linear clause]
6475   // If linear-step is not specified it is assumed to be 1.
6476   if (Step == nullptr)
6477     Step = SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get();
6478   else if (CalcStep)
6479     Step = cast<BinaryOperator>(CalcStep)->getLHS();
6480   bool HasErrors = false;
6481   auto CurInit = Clause.inits().begin();
6482   auto CurPrivate = Clause.privates().begin();
6483   for (auto &RefExpr : Clause.varlists()) {
6484     Expr *InitExpr = *CurInit;
6485 
6486     // Build privatized reference to the current linear var.
6487     auto DE = cast<DeclRefExpr>(RefExpr);
6488     auto CapturedRef =
6489         buildDeclRefExpr(SemaRef, cast<VarDecl>(DE->getDecl()),
6490                          DE->getType().getUnqualifiedType(), DE->getExprLoc(),
6491                          /*RefersToCapture=*/true);
6492 
6493     // Build update: Var = InitExpr + IV * Step
6494     ExprResult Update =
6495         BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), *CurPrivate,
6496                            InitExpr, IV, Step, /* Subtract */ false);
6497     Update = SemaRef.ActOnFinishFullExpr(Update.get());
6498 
6499     // Build final: Var = InitExpr + NumIterations * Step
6500     ExprResult Final =
6501         BuildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), CapturedRef,
6502                            InitExpr, NumIterations, Step, /* Subtract */ false);
6503     Final = SemaRef.ActOnFinishFullExpr(Final.get());
6504     if (!Update.isUsable() || !Final.isUsable()) {
6505       Updates.push_back(nullptr);
6506       Finals.push_back(nullptr);
6507       HasErrors = true;
6508     } else {
6509       Updates.push_back(Update.get());
6510       Finals.push_back(Final.get());
6511     }
6512     ++CurInit, ++CurPrivate;
6513   }
6514   Clause.setUpdates(Updates);
6515   Clause.setFinals(Finals);
6516   return HasErrors;
6517 }
6518 
6519 OMPClause *Sema::ActOnOpenMPAlignedClause(
6520     ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc,
6521     SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {
6522 
6523   SmallVector<Expr *, 8> Vars;
6524   for (auto &RefExpr : VarList) {
6525     assert(RefExpr && "NULL expr in OpenMP aligned clause.");
6526     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6527       // It will be analyzed later.
6528       Vars.push_back(RefExpr);
6529       continue;
6530     }
6531 
6532     SourceLocation ELoc = RefExpr->getExprLoc();
6533     // OpenMP [2.1, C/C++]
6534     //  A list item is a variable name.
6535     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
6536     if (!DE || !isa<VarDecl>(DE->getDecl())) {
6537       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
6538       continue;
6539     }
6540 
6541     VarDecl *VD = cast<VarDecl>(DE->getDecl());
6542 
6543     // OpenMP  [2.8.1, simd construct, Restrictions]
6544     // The type of list items appearing in the aligned clause must be
6545     // array, pointer, reference to array, or reference to pointer.
6546     QualType QType = VD->getType();
6547     QType = QType.getNonReferenceType().getUnqualifiedType().getCanonicalType();
6548     const Type *Ty = QType.getTypePtrOrNull();
6549     if (!Ty || (!Ty->isDependentType() && !Ty->isArrayType() &&
6550                 !Ty->isPointerType())) {
6551       Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr)
6552           << QType << getLangOpts().CPlusPlus << RefExpr->getSourceRange();
6553       bool IsDecl =
6554           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6555       Diag(VD->getLocation(),
6556            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6557           << VD;
6558       continue;
6559     }
6560 
6561     // OpenMP  [2.8.1, simd construct, Restrictions]
6562     // A list-item cannot appear in more than one aligned clause.
6563     if (DeclRefExpr *PrevRef = DSAStack->addUniqueAligned(VD, DE)) {
6564       Diag(ELoc, diag::err_omp_aligned_twice) << RefExpr->getSourceRange();
6565       Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa)
6566           << getOpenMPClauseName(OMPC_aligned);
6567       continue;
6568     }
6569 
6570     Vars.push_back(DE);
6571   }
6572 
6573   // OpenMP [2.8.1, simd construct, Description]
6574   // The parameter of the aligned clause, alignment, must be a constant
6575   // positive integer expression.
6576   // If no optional parameter is specified, implementation-defined default
6577   // alignments for SIMD instructions on the target platforms are assumed.
6578   if (Alignment != nullptr) {
6579     ExprResult AlignResult =
6580         VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned);
6581     if (AlignResult.isInvalid())
6582       return nullptr;
6583     Alignment = AlignResult.get();
6584   }
6585   if (Vars.empty())
6586     return nullptr;
6587 
6588   return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc,
6589                                   EndLoc, Vars, Alignment);
6590 }
6591 
6592 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList,
6593                                          SourceLocation StartLoc,
6594                                          SourceLocation LParenLoc,
6595                                          SourceLocation EndLoc) {
6596   SmallVector<Expr *, 8> Vars;
6597   SmallVector<Expr *, 8> SrcExprs;
6598   SmallVector<Expr *, 8> DstExprs;
6599   SmallVector<Expr *, 8> AssignmentOps;
6600   for (auto &RefExpr : VarList) {
6601     assert(RefExpr && "NULL expr in OpenMP copyin clause.");
6602     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6603       // It will be analyzed later.
6604       Vars.push_back(RefExpr);
6605       SrcExprs.push_back(nullptr);
6606       DstExprs.push_back(nullptr);
6607       AssignmentOps.push_back(nullptr);
6608       continue;
6609     }
6610 
6611     SourceLocation ELoc = RefExpr->getExprLoc();
6612     // OpenMP [2.1, C/C++]
6613     //  A list item is a variable name.
6614     // OpenMP  [2.14.4.1, Restrictions, p.1]
6615     //  A list item that appears in a copyin clause must be threadprivate.
6616     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
6617     if (!DE || !isa<VarDecl>(DE->getDecl())) {
6618       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
6619       continue;
6620     }
6621 
6622     Decl *D = DE->getDecl();
6623     VarDecl *VD = cast<VarDecl>(D);
6624 
6625     QualType Type = VD->getType();
6626     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
6627       // It will be analyzed later.
6628       Vars.push_back(DE);
6629       SrcExprs.push_back(nullptr);
6630       DstExprs.push_back(nullptr);
6631       AssignmentOps.push_back(nullptr);
6632       continue;
6633     }
6634 
6635     // OpenMP [2.14.4.1, Restrictions, C/C++, p.1]
6636     //  A list item that appears in a copyin clause must be threadprivate.
6637     if (!DSAStack->isThreadPrivate(VD)) {
6638       Diag(ELoc, diag::err_omp_required_access)
6639           << getOpenMPClauseName(OMPC_copyin)
6640           << getOpenMPDirectiveName(OMPD_threadprivate);
6641       continue;
6642     }
6643 
6644     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
6645     //  A variable of class type (or array thereof) that appears in a
6646     //  copyin clause requires an accessible, unambiguous copy assignment
6647     //  operator for the class type.
6648     auto ElemType = Context.getBaseElementType(Type).getNonReferenceType();
6649     auto *SrcVD = buildVarDecl(*this, DE->getLocStart(),
6650                                ElemType.getUnqualifiedType(), ".copyin.src");
6651     auto *PseudoSrcExpr = buildDeclRefExpr(
6652         *this, SrcVD, ElemType.getUnqualifiedType(), DE->getExprLoc());
6653     auto *DstVD =
6654         buildVarDecl(*this, DE->getLocStart(), ElemType, ".copyin.dst");
6655     auto *PseudoDstExpr =
6656         buildDeclRefExpr(*this, DstVD, ElemType, DE->getExprLoc());
6657     // For arrays generate assignment operation for single element and replace
6658     // it by the original array element in CodeGen.
6659     auto AssignmentOp = BuildBinOp(/*S=*/nullptr, DE->getExprLoc(), BO_Assign,
6660                                    PseudoDstExpr, PseudoSrcExpr);
6661     if (AssignmentOp.isInvalid())
6662       continue;
6663     AssignmentOp = ActOnFinishFullExpr(AssignmentOp.get(), DE->getExprLoc(),
6664                                        /*DiscardedValue=*/true);
6665     if (AssignmentOp.isInvalid())
6666       continue;
6667 
6668     DSAStack->addDSA(VD, DE, OMPC_copyin);
6669     Vars.push_back(DE);
6670     SrcExprs.push_back(PseudoSrcExpr);
6671     DstExprs.push_back(PseudoDstExpr);
6672     AssignmentOps.push_back(AssignmentOp.get());
6673   }
6674 
6675   if (Vars.empty())
6676     return nullptr;
6677 
6678   return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars,
6679                                  SrcExprs, DstExprs, AssignmentOps);
6680 }
6681 
6682 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
6683                                               SourceLocation StartLoc,
6684                                               SourceLocation LParenLoc,
6685                                               SourceLocation EndLoc) {
6686   SmallVector<Expr *, 8> Vars;
6687   SmallVector<Expr *, 8> SrcExprs;
6688   SmallVector<Expr *, 8> DstExprs;
6689   SmallVector<Expr *, 8> AssignmentOps;
6690   for (auto &RefExpr : VarList) {
6691     assert(RefExpr && "NULL expr in OpenMP copyprivate clause.");
6692     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6693       // It will be analyzed later.
6694       Vars.push_back(RefExpr);
6695       SrcExprs.push_back(nullptr);
6696       DstExprs.push_back(nullptr);
6697       AssignmentOps.push_back(nullptr);
6698       continue;
6699     }
6700 
6701     SourceLocation ELoc = RefExpr->getExprLoc();
6702     // OpenMP [2.1, C/C++]
6703     //  A list item is a variable name.
6704     // OpenMP  [2.14.4.1, Restrictions, p.1]
6705     //  A list item that appears in a copyin clause must be threadprivate.
6706     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
6707     if (!DE || !isa<VarDecl>(DE->getDecl())) {
6708       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
6709       continue;
6710     }
6711 
6712     Decl *D = DE->getDecl();
6713     VarDecl *VD = cast<VarDecl>(D);
6714 
6715     QualType Type = VD->getType();
6716     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
6717       // It will be analyzed later.
6718       Vars.push_back(DE);
6719       SrcExprs.push_back(nullptr);
6720       DstExprs.push_back(nullptr);
6721       AssignmentOps.push_back(nullptr);
6722       continue;
6723     }
6724 
6725     // OpenMP [2.14.4.2, Restrictions, p.2]
6726     //  A list item that appears in a copyprivate clause may not appear in a
6727     //  private or firstprivate clause on the single construct.
6728     if (!DSAStack->isThreadPrivate(VD)) {
6729       auto DVar = DSAStack->getTopDSA(VD, false);
6730       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_copyprivate &&
6731           DVar.RefExpr) {
6732         Diag(ELoc, diag::err_omp_wrong_dsa)
6733             << getOpenMPClauseName(DVar.CKind)
6734             << getOpenMPClauseName(OMPC_copyprivate);
6735         ReportOriginalDSA(*this, DSAStack, VD, DVar);
6736         continue;
6737       }
6738 
6739       // OpenMP [2.11.4.2, Restrictions, p.1]
6740       //  All list items that appear in a copyprivate clause must be either
6741       //  threadprivate or private in the enclosing context.
6742       if (DVar.CKind == OMPC_unknown) {
6743         DVar = DSAStack->getImplicitDSA(VD, false);
6744         if (DVar.CKind == OMPC_shared) {
6745           Diag(ELoc, diag::err_omp_required_access)
6746               << getOpenMPClauseName(OMPC_copyprivate)
6747               << "threadprivate or private in the enclosing context";
6748           ReportOriginalDSA(*this, DSAStack, VD, DVar);
6749           continue;
6750         }
6751       }
6752     }
6753 
6754     // Variably modified types are not supported.
6755     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType()) {
6756       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
6757           << getOpenMPClauseName(OMPC_copyprivate) << Type
6758           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
6759       bool IsDecl =
6760           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
6761       Diag(VD->getLocation(),
6762            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
6763           << VD;
6764       continue;
6765     }
6766 
6767     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
6768     //  A variable of class type (or array thereof) that appears in a
6769     //  copyin clause requires an accessible, unambiguous copy assignment
6770     //  operator for the class type.
6771     Type = Context.getBaseElementType(Type.getNonReferenceType())
6772                .getUnqualifiedType();
6773     auto *SrcVD =
6774         buildVarDecl(*this, DE->getLocStart(), Type, ".copyprivate.src");
6775     auto *PseudoSrcExpr =
6776         buildDeclRefExpr(*this, SrcVD, Type, DE->getExprLoc());
6777     auto *DstVD =
6778         buildVarDecl(*this, DE->getLocStart(), Type, ".copyprivate.dst");
6779     auto *PseudoDstExpr =
6780         buildDeclRefExpr(*this, DstVD, Type, DE->getExprLoc());
6781     auto AssignmentOp = BuildBinOp(/*S=*/nullptr, DE->getExprLoc(), BO_Assign,
6782                                    PseudoDstExpr, PseudoSrcExpr);
6783     if (AssignmentOp.isInvalid())
6784       continue;
6785     AssignmentOp = ActOnFinishFullExpr(AssignmentOp.get(), DE->getExprLoc(),
6786                                        /*DiscardedValue=*/true);
6787     if (AssignmentOp.isInvalid())
6788       continue;
6789 
6790     // No need to mark vars as copyprivate, they are already threadprivate or
6791     // implicitly private.
6792     Vars.push_back(DE);
6793     SrcExprs.push_back(PseudoSrcExpr);
6794     DstExprs.push_back(PseudoDstExpr);
6795     AssignmentOps.push_back(AssignmentOp.get());
6796   }
6797 
6798   if (Vars.empty())
6799     return nullptr;
6800 
6801   return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
6802                                       Vars, SrcExprs, DstExprs, AssignmentOps);
6803 }
6804 
6805 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList,
6806                                         SourceLocation StartLoc,
6807                                         SourceLocation LParenLoc,
6808                                         SourceLocation EndLoc) {
6809   if (VarList.empty())
6810     return nullptr;
6811 
6812   return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList);
6813 }
6814 
6815 OMPClause *
6816 Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
6817                               SourceLocation DepLoc, SourceLocation ColonLoc,
6818                               ArrayRef<Expr *> VarList, SourceLocation StartLoc,
6819                               SourceLocation LParenLoc, SourceLocation EndLoc) {
6820   if (DepKind == OMPC_DEPEND_unknown) {
6821     std::string Values;
6822     std::string Sep(", ");
6823     for (unsigned i = 0; i < OMPC_DEPEND_unknown; ++i) {
6824       Values += "'";
6825       Values += getOpenMPSimpleClauseTypeName(OMPC_depend, i);
6826       Values += "'";
6827       switch (i) {
6828       case OMPC_DEPEND_unknown - 2:
6829         Values += " or ";
6830         break;
6831       case OMPC_DEPEND_unknown - 1:
6832         break;
6833       default:
6834         Values += Sep;
6835         break;
6836       }
6837     }
6838     Diag(DepLoc, diag::err_omp_unexpected_clause_value)
6839         << Values << getOpenMPClauseName(OMPC_depend);
6840     return nullptr;
6841   }
6842   SmallVector<Expr *, 8> Vars;
6843   for (auto &RefExpr : VarList) {
6844     assert(RefExpr && "NULL expr in OpenMP shared clause.");
6845     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
6846       // It will be analyzed later.
6847       Vars.push_back(RefExpr);
6848       continue;
6849     }
6850 
6851     SourceLocation ELoc = RefExpr->getExprLoc();
6852     // OpenMP  [2.11.1.1, Restrictions, p.3]
6853     //  A variable that is part of another variable (such as a field of a
6854     //  structure) but is not an array element or an array section cannot appear
6855     //  in a depend clause.
6856     auto *SimpleExpr = RefExpr->IgnoreParenCasts();
6857     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(SimpleExpr);
6858     ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(SimpleExpr);
6859     if (!RefExpr->IgnoreParenImpCasts()->isLValue() || (!ASE && !DE) ||
6860         (DE && !isa<VarDecl>(DE->getDecl())) ||
6861         (ASE && !ASE->getBase()->getType()->isAnyPointerType() &&
6862          !ASE->getBase()->getType()->isArrayType())) {
6863       Diag(ELoc, diag::err_omp_expected_var_name_or_array_item)
6864           << RefExpr->getSourceRange();
6865       continue;
6866     }
6867 
6868     Vars.push_back(RefExpr->IgnoreParenImpCasts());
6869   }
6870 
6871   if (Vars.empty())
6872     return nullptr;
6873 
6874   return OMPDependClause::Create(Context, StartLoc, LParenLoc, EndLoc, DepKind,
6875                                  DepLoc, ColonLoc, Vars);
6876 }
6877 
6878 OMPClause *Sema::ActOnOpenMPDeviceClause(Expr *Device, SourceLocation StartLoc,
6879                                          SourceLocation LParenLoc,
6880                                          SourceLocation EndLoc) {
6881   Expr *ValExpr = Device;
6882   if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
6883       !ValExpr->isInstantiationDependent()) {
6884     SourceLocation Loc = ValExpr->getExprLoc();
6885     ExprResult Value = PerformOpenMPImplicitIntegerConversion(Loc, ValExpr);
6886     if (Value.isInvalid())
6887       return nullptr;
6888 
6889     // OpenMP [2.9.1, Restrictions]
6890     // The device expression must evaluate to a non-negative integer value.
6891     llvm::APSInt Result;
6892     if (Value.get()->isIntegerConstantExpr(Result, Context) &&
6893         Result.isSigned() && !Result.isStrictlyPositive()) {
6894       Diag(Loc, diag::err_omp_negative_expression_in_clause)
6895           << "device" << ValExpr->getSourceRange();
6896       return nullptr;
6897     }
6898   }
6899 
6900   return new (Context) OMPDeviceClause(ValExpr, StartLoc, LParenLoc, EndLoc);
6901 }
6902