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 "clang/AST/ASTContext.h"
16 #include "clang/AST/Decl.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclOpenMP.h"
19 #include "clang/AST/StmtCXX.h"
20 #include "clang/AST/StmtOpenMP.h"
21 #include "clang/AST/StmtVisitor.h"
22 #include "clang/Basic/OpenMPKinds.h"
23 #include "clang/Lex/Preprocessor.h"
24 #include "clang/Sema/Initialization.h"
25 #include "clang/Sema/Lookup.h"
26 #include "clang/Sema/Scope.h"
27 #include "clang/Sema/ScopeInfo.h"
28 #include "clang/Sema/SemaInternal.h"
29 using namespace clang;
30 
31 //===----------------------------------------------------------------------===//
32 // Stack of data-sharing attributes for variables
33 //===----------------------------------------------------------------------===//
34 
35 namespace {
36 /// \brief Default data sharing attributes, which can be applied to directive.
37 enum DefaultDataSharingAttributes {
38   DSA_unspecified = 0, /// \brief Data sharing attribute not specified.
39   DSA_none = 1 << 0,   /// \brief Default data sharing attribute 'none'.
40   DSA_shared = 1 << 1  /// \brief Default data sharing attribute 'shared'.
41 };
42 
43 template <class T> struct MatchesAny {
44   explicit MatchesAny(ArrayRef<T> Arr) : Arr(std::move(Arr)) {}
45   bool operator()(T Kind) {
46     for (auto KindEl : Arr)
47       if (KindEl == Kind)
48         return true;
49     return false;
50   }
51 
52 private:
53   ArrayRef<T> Arr;
54 };
55 struct MatchesAlways {
56   MatchesAlways() {}
57   template <class T> bool operator()(T) { return true; }
58 };
59 
60 typedef MatchesAny<OpenMPClauseKind> MatchesAnyClause;
61 typedef MatchesAny<OpenMPDirectiveKind> MatchesAnyDirective;
62 
63 /// \brief Stack for tracking declarations used in OpenMP directives and
64 /// clauses and their data-sharing attributes.
65 class DSAStackTy {
66 public:
67   struct DSAVarData {
68     OpenMPDirectiveKind DKind;
69     OpenMPClauseKind CKind;
70     DeclRefExpr *RefExpr;
71     SourceLocation ImplicitDSALoc;
72     DSAVarData()
73         : DKind(OMPD_unknown), CKind(OMPC_unknown), RefExpr(nullptr),
74           ImplicitDSALoc() {}
75   };
76 
77 private:
78   struct DSAInfo {
79     OpenMPClauseKind Attributes;
80     DeclRefExpr *RefExpr;
81   };
82   typedef llvm::SmallDenseMap<VarDecl *, DSAInfo, 64> DeclSAMapTy;
83   typedef llvm::SmallDenseMap<VarDecl *, DeclRefExpr *, 64> AlignedMapTy;
84 
85   struct SharingMapTy {
86     DeclSAMapTy SharingMap;
87     AlignedMapTy AlignedMap;
88     DefaultDataSharingAttributes DefaultAttr;
89     SourceLocation DefaultAttrLoc;
90     OpenMPDirectiveKind Directive;
91     DeclarationNameInfo DirectiveName;
92     Scope *CurScope;
93     SourceLocation ConstructLoc;
94     bool OrderedRegion;
95     SharingMapTy(OpenMPDirectiveKind DKind, DeclarationNameInfo Name,
96                  Scope *CurScope, SourceLocation Loc)
97         : SharingMap(), AlignedMap(), DefaultAttr(DSA_unspecified),
98           Directive(DKind), DirectiveName(std::move(Name)), CurScope(CurScope),
99           ConstructLoc(Loc), OrderedRegion(false) {}
100     SharingMapTy()
101         : SharingMap(), AlignedMap(), DefaultAttr(DSA_unspecified),
102           Directive(OMPD_unknown), DirectiveName(), CurScope(nullptr),
103           ConstructLoc(), OrderedRegion(false) {}
104   };
105 
106   typedef SmallVector<SharingMapTy, 64> StackTy;
107 
108   /// \brief Stack of used declaration and their data-sharing attributes.
109   StackTy Stack;
110   Sema &SemaRef;
111 
112   typedef SmallVector<SharingMapTy, 8>::reverse_iterator reverse_iterator;
113 
114   DSAVarData getDSA(StackTy::reverse_iterator Iter, VarDecl *D);
115 
116   /// \brief Checks if the variable is a local for OpenMP region.
117   bool isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter);
118 
119 public:
120   explicit DSAStackTy(Sema &S) : Stack(1), SemaRef(S) {}
121 
122   void push(OpenMPDirectiveKind DKind, const DeclarationNameInfo &DirName,
123             Scope *CurScope, SourceLocation Loc) {
124     Stack.push_back(SharingMapTy(DKind, DirName, CurScope, Loc));
125     Stack.back().DefaultAttrLoc = Loc;
126   }
127 
128   void pop() {
129     assert(Stack.size() > 1 && "Data-sharing attributes stack is empty!");
130     Stack.pop_back();
131   }
132 
133   /// \brief If 'aligned' declaration for given variable \a D was not seen yet,
134   /// add it and return NULL; otherwise return previous occurrence's expression
135   /// for diagnostics.
136   DeclRefExpr *addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE);
137 
138   /// \brief Adds explicit data sharing attribute to the specified declaration.
139   void addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A);
140 
141   /// \brief Returns data sharing attributes from top of the stack for the
142   /// specified declaration.
143   DSAVarData getTopDSA(VarDecl *D, bool FromParent);
144   /// \brief Returns data-sharing attributes for the specified declaration.
145   DSAVarData getImplicitDSA(VarDecl *D, bool FromParent);
146   /// \brief Checks if the specified variables has data-sharing attributes which
147   /// match specified \a CPred predicate in any directive which matches \a DPred
148   /// predicate.
149   template <class ClausesPredicate, class DirectivesPredicate>
150   DSAVarData hasDSA(VarDecl *D, ClausesPredicate CPred,
151                     DirectivesPredicate DPred, bool FromParent);
152   /// \brief Checks if the specified variables has data-sharing attributes which
153   /// match specified \a CPred predicate in any innermost directive which
154   /// matches \a DPred predicate.
155   template <class ClausesPredicate, class DirectivesPredicate>
156   DSAVarData hasInnermostDSA(VarDecl *D, ClausesPredicate CPred,
157                              DirectivesPredicate DPred,
158                              bool FromParent);
159   /// \brief Finds a directive which matches specified \a DPred predicate.
160   template <class NamedDirectivesPredicate>
161   bool hasDirective(NamedDirectivesPredicate DPred, bool FromParent);
162 
163   /// \brief Returns currently analyzed directive.
164   OpenMPDirectiveKind getCurrentDirective() const {
165     return Stack.back().Directive;
166   }
167   /// \brief Returns parent directive.
168   OpenMPDirectiveKind getParentDirective() const {
169     if (Stack.size() > 2)
170       return Stack[Stack.size() - 2].Directive;
171     return OMPD_unknown;
172   }
173 
174   /// \brief Set default data sharing attribute to none.
175   void setDefaultDSANone(SourceLocation Loc) {
176     Stack.back().DefaultAttr = DSA_none;
177     Stack.back().DefaultAttrLoc = Loc;
178   }
179   /// \brief Set default data sharing attribute to shared.
180   void setDefaultDSAShared(SourceLocation Loc) {
181     Stack.back().DefaultAttr = DSA_shared;
182     Stack.back().DefaultAttrLoc = Loc;
183   }
184 
185   DefaultDataSharingAttributes getDefaultDSA() const {
186     return Stack.back().DefaultAttr;
187   }
188   SourceLocation getDefaultDSALocation() const {
189     return Stack.back().DefaultAttrLoc;
190   }
191 
192   /// \brief Checks if the specified variable is a threadprivate.
193   bool isThreadPrivate(VarDecl *D) {
194     DSAVarData DVar = getTopDSA(D, false);
195     return isOpenMPThreadPrivate(DVar.CKind);
196   }
197 
198   /// \brief Marks current region as ordered (it has an 'ordered' clause).
199   void setOrderedRegion(bool IsOrdered = true) {
200     Stack.back().OrderedRegion = IsOrdered;
201   }
202   /// \brief Returns true, if parent region is ordered (has associated
203   /// 'ordered' clause), false - otherwise.
204   bool isParentOrderedRegion() const {
205     if (Stack.size() > 2)
206       return Stack[Stack.size() - 2].OrderedRegion;
207     return false;
208   }
209 
210   Scope *getCurScope() const { return Stack.back().CurScope; }
211   Scope *getCurScope() { return Stack.back().CurScope; }
212   SourceLocation getConstructLoc() { return Stack.back().ConstructLoc; }
213 };
214 bool isParallelOrTaskRegion(OpenMPDirectiveKind DKind) {
215   return isOpenMPParallelDirective(DKind) || DKind == OMPD_task ||
216          DKind == OMPD_unknown;
217 }
218 } // namespace
219 
220 DSAStackTy::DSAVarData DSAStackTy::getDSA(StackTy::reverse_iterator Iter,
221                                           VarDecl *D) {
222   DSAVarData DVar;
223   if (Iter == std::prev(Stack.rend())) {
224     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
225     // in a region but not in construct]
226     //  File-scope or namespace-scope variables referenced in called routines
227     //  in the region are shared unless they appear in a threadprivate
228     //  directive.
229     if (!D->isFunctionOrMethodVarDecl() && !isa<ParmVarDecl>(D))
230       DVar.CKind = OMPC_shared;
231 
232     // OpenMP [2.9.1.2, Data-sharing Attribute Rules for Variables Referenced
233     // in a region but not in construct]
234     //  Variables with static storage duration that are declared in called
235     //  routines in the region are shared.
236     if (D->hasGlobalStorage())
237       DVar.CKind = OMPC_shared;
238 
239     return DVar;
240   }
241 
242   DVar.DKind = Iter->Directive;
243   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
244   // in a Construct, C/C++, predetermined, p.1]
245   // Variables with automatic storage duration that are declared in a scope
246   // inside the construct are private.
247   if (isOpenMPLocal(D, Iter) && D->isLocalVarDecl() &&
248       (D->getStorageClass() == SC_Auto || D->getStorageClass() == SC_None)) {
249     DVar.CKind = OMPC_private;
250     return DVar;
251   }
252 
253   // Explicitly specified attributes and local variables with predetermined
254   // attributes.
255   if (Iter->SharingMap.count(D)) {
256     DVar.RefExpr = Iter->SharingMap[D].RefExpr;
257     DVar.CKind = Iter->SharingMap[D].Attributes;
258     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
259     return DVar;
260   }
261 
262   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
263   // in a Construct, C/C++, implicitly determined, p.1]
264   //  In a parallel or task construct, the data-sharing attributes of these
265   //  variables are determined by the default clause, if present.
266   switch (Iter->DefaultAttr) {
267   case DSA_shared:
268     DVar.CKind = OMPC_shared;
269     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
270     return DVar;
271   case DSA_none:
272     return DVar;
273   case DSA_unspecified:
274     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
275     // in a Construct, implicitly determined, p.2]
276     //  In a parallel construct, if no default clause is present, these
277     //  variables are shared.
278     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
279     if (isOpenMPParallelDirective(DVar.DKind)) {
280       DVar.CKind = OMPC_shared;
281       return DVar;
282     }
283 
284     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
285     // in a Construct, implicitly determined, p.4]
286     //  In a task construct, if no default clause is present, a variable that in
287     //  the enclosing context is determined to be shared by all implicit tasks
288     //  bound to the current team is shared.
289     if (DVar.DKind == OMPD_task) {
290       DSAVarData DVarTemp;
291       for (StackTy::reverse_iterator I = std::next(Iter),
292                                      EE = std::prev(Stack.rend());
293            I != EE; ++I) {
294         // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables
295         // Referenced
296         // in a Construct, implicitly determined, p.6]
297         //  In a task construct, if no default clause is present, a variable
298         //  whose data-sharing attribute is not determined by the rules above is
299         //  firstprivate.
300         DVarTemp = getDSA(I, D);
301         if (DVarTemp.CKind != OMPC_shared) {
302           DVar.RefExpr = nullptr;
303           DVar.DKind = OMPD_task;
304           DVar.CKind = OMPC_firstprivate;
305           return DVar;
306         }
307         if (isParallelOrTaskRegion(I->Directive))
308           break;
309       }
310       DVar.DKind = OMPD_task;
311       DVar.CKind =
312           (DVarTemp.CKind == OMPC_unknown) ? OMPC_firstprivate : OMPC_shared;
313       return DVar;
314     }
315   }
316   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
317   // in a Construct, implicitly determined, p.3]
318   //  For constructs other than task, if no default clause is present, these
319   //  variables inherit their data-sharing attributes from the enclosing
320   //  context.
321   return getDSA(std::next(Iter), D);
322 }
323 
324 DeclRefExpr *DSAStackTy::addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE) {
325   assert(Stack.size() > 1 && "Data sharing attributes stack is empty");
326   auto It = Stack.back().AlignedMap.find(D);
327   if (It == Stack.back().AlignedMap.end()) {
328     assert(NewDE && "Unexpected nullptr expr to be added into aligned map");
329     Stack.back().AlignedMap[D] = NewDE;
330     return nullptr;
331   } else {
332     assert(It->second && "Unexpected nullptr expr in the aligned map");
333     return It->second;
334   }
335   return nullptr;
336 }
337 
338 void DSAStackTy::addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A) {
339   if (A == OMPC_threadprivate) {
340     Stack[0].SharingMap[D].Attributes = A;
341     Stack[0].SharingMap[D].RefExpr = E;
342   } else {
343     assert(Stack.size() > 1 && "Data-sharing attributes stack is empty");
344     Stack.back().SharingMap[D].Attributes = A;
345     Stack.back().SharingMap[D].RefExpr = E;
346   }
347 }
348 
349 bool DSAStackTy::isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter) {
350   if (Stack.size() > 2) {
351     reverse_iterator I = Iter, E = std::prev(Stack.rend());
352     Scope *TopScope = nullptr;
353     while (I != E && !isParallelOrTaskRegion(I->Directive)) {
354       ++I;
355     }
356     if (I == E)
357       return false;
358     TopScope = I->CurScope ? I->CurScope->getParent() : nullptr;
359     Scope *CurScope = getCurScope();
360     while (CurScope != TopScope && !CurScope->isDeclScope(D)) {
361       CurScope = CurScope->getParent();
362     }
363     return CurScope != TopScope;
364   }
365   return false;
366 }
367 
368 DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) {
369   DSAVarData DVar;
370 
371   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
372   // in a Construct, C/C++, predetermined, p.1]
373   //  Variables appearing in threadprivate directives are threadprivate.
374   if (D->getTLSKind() != VarDecl::TLS_None) {
375     DVar.CKind = OMPC_threadprivate;
376     return DVar;
377   }
378   if (Stack[0].SharingMap.count(D)) {
379     DVar.RefExpr = Stack[0].SharingMap[D].RefExpr;
380     DVar.CKind = OMPC_threadprivate;
381     return DVar;
382   }
383 
384   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
385   // in a Construct, C/C++, predetermined, p.1]
386   // Variables with automatic storage duration that are declared in a scope
387   // inside the construct are private.
388   OpenMPDirectiveKind Kind =
389       FromParent ? getParentDirective() : getCurrentDirective();
390   auto StartI = std::next(Stack.rbegin());
391   auto EndI = std::prev(Stack.rend());
392   if (FromParent && StartI != EndI) {
393     StartI = std::next(StartI);
394   }
395   if (!isParallelOrTaskRegion(Kind)) {
396     if (isOpenMPLocal(D, StartI) &&
397         ((D->isLocalVarDecl() && (D->getStorageClass() == SC_Auto ||
398                                   D->getStorageClass() == SC_None)) ||
399          isa<ParmVarDecl>(D))) {
400       DVar.CKind = OMPC_private;
401       return DVar;
402     }
403   }
404 
405   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
406   // in a Construct, C/C++, predetermined, p.4]
407   //  Static data members are shared.
408   if (D->isStaticDataMember()) {
409     // Variables with const-qualified type having no mutable member may be
410     // listed in a firstprivate clause, even if they are static data members.
411     DSAVarData DVarTemp = hasDSA(D, MatchesAnyClause(OMPC_firstprivate),
412                                  MatchesAlways(), FromParent);
413     if (DVarTemp.CKind == OMPC_firstprivate && DVarTemp.RefExpr)
414       return DVar;
415 
416     DVar.CKind = OMPC_shared;
417     return DVar;
418   }
419 
420   QualType Type = D->getType().getNonReferenceType().getCanonicalType();
421   bool IsConstant = Type.isConstant(SemaRef.getASTContext());
422   while (Type->isArrayType()) {
423     QualType ElemType = cast<ArrayType>(Type.getTypePtr())->getElementType();
424     Type = ElemType.getNonReferenceType().getCanonicalType();
425   }
426   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
427   // in a Construct, C/C++, predetermined, p.6]
428   //  Variables with const qualified type having no mutable member are
429   //  shared.
430   CXXRecordDecl *RD =
431       SemaRef.getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
432   if (IsConstant &&
433       !(SemaRef.getLangOpts().CPlusPlus && RD && RD->hasMutableFields())) {
434     // Variables with const-qualified type having no mutable member may be
435     // listed in a firstprivate clause, even if they are static data members.
436     DSAVarData DVarTemp = hasDSA(D, MatchesAnyClause(OMPC_firstprivate),
437                                  MatchesAlways(), FromParent);
438     if (DVarTemp.CKind == OMPC_firstprivate && DVarTemp.RefExpr)
439       return DVar;
440 
441     DVar.CKind = OMPC_shared;
442     return DVar;
443   }
444 
445   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
446   // in a Construct, C/C++, predetermined, p.7]
447   //  Variables with static storage duration that are declared in a scope
448   //  inside the construct are shared.
449   if (D->isStaticLocal()) {
450     DVar.CKind = OMPC_shared;
451     return DVar;
452   }
453 
454   // Explicitly specified attributes and local variables with predetermined
455   // attributes.
456   auto I = std::prev(StartI);
457   if (I->SharingMap.count(D)) {
458     DVar.RefExpr = I->SharingMap[D].RefExpr;
459     DVar.CKind = I->SharingMap[D].Attributes;
460     DVar.ImplicitDSALoc = I->DefaultAttrLoc;
461   }
462 
463   return DVar;
464 }
465 
466 DSAStackTy::DSAVarData DSAStackTy::getImplicitDSA(VarDecl *D, bool FromParent) {
467   auto StartI = Stack.rbegin();
468   auto EndI = std::prev(Stack.rend());
469   if (FromParent && StartI != EndI) {
470     StartI = std::next(StartI);
471   }
472   return getDSA(StartI, D);
473 }
474 
475 template <class ClausesPredicate, class DirectivesPredicate>
476 DSAStackTy::DSAVarData DSAStackTy::hasDSA(VarDecl *D, ClausesPredicate CPred,
477                                           DirectivesPredicate DPred,
478                                           bool FromParent) {
479   auto StartI = std::next(Stack.rbegin());
480   auto EndI = std::prev(Stack.rend());
481   if (FromParent && StartI != EndI) {
482     StartI = std::next(StartI);
483   }
484   for (auto I = StartI, EE = EndI; I != EE; ++I) {
485     if (!DPred(I->Directive) && !isParallelOrTaskRegion(I->Directive))
486       continue;
487     DSAVarData DVar = getDSA(I, D);
488     if (CPred(DVar.CKind))
489       return DVar;
490   }
491   return DSAVarData();
492 }
493 
494 template <class ClausesPredicate, class DirectivesPredicate>
495 DSAStackTy::DSAVarData
496 DSAStackTy::hasInnermostDSA(VarDecl *D, ClausesPredicate CPred,
497                             DirectivesPredicate DPred, bool FromParent) {
498   auto StartI = std::next(Stack.rbegin());
499   auto EndI = std::prev(Stack.rend());
500   if (FromParent && StartI != EndI) {
501     StartI = std::next(StartI);
502   }
503   for (auto I = StartI, EE = EndI; I != EE; ++I) {
504     if (!DPred(I->Directive))
505       break;
506     DSAVarData DVar = getDSA(I, D);
507     if (CPred(DVar.CKind))
508       return DVar;
509     return DSAVarData();
510   }
511   return DSAVarData();
512 }
513 
514 template <class NamedDirectivesPredicate>
515 bool DSAStackTy::hasDirective(NamedDirectivesPredicate DPred, bool FromParent) {
516   auto StartI = std::next(Stack.rbegin());
517   auto EndI = std::prev(Stack.rend());
518   if (FromParent && StartI != EndI) {
519     StartI = std::next(StartI);
520   }
521   for (auto I = StartI, EE = EndI; I != EE; ++I) {
522     if (DPred(I->Directive, I->DirectiveName, I->ConstructLoc))
523       return true;
524   }
525   return false;
526 }
527 
528 void Sema::InitDataSharingAttributesStack() {
529   VarDataSharingAttributesStack = new DSAStackTy(*this);
530 }
531 
532 #define DSAStack static_cast<DSAStackTy *>(VarDataSharingAttributesStack)
533 
534 void Sema::DestroyDataSharingAttributesStack() { delete DSAStack; }
535 
536 void Sema::StartOpenMPDSABlock(OpenMPDirectiveKind DKind,
537                                const DeclarationNameInfo &DirName,
538                                Scope *CurScope, SourceLocation Loc) {
539   DSAStack->push(DKind, DirName, CurScope, Loc);
540   PushExpressionEvaluationContext(PotentiallyEvaluated);
541 }
542 
543 void Sema::EndOpenMPDSABlock(Stmt *CurDirective) {
544   // OpenMP [2.14.3.5, Restrictions, C/C++, p.1]
545   //  A variable of class type (or array thereof) that appears in a lastprivate
546   //  clause requires an accessible, unambiguous default constructor for the
547   //  class type, unless the list item is also specified in a firstprivate
548   //  clause.
549   if (auto D = dyn_cast_or_null<OMPExecutableDirective>(CurDirective)) {
550     for (auto C : D->clauses()) {
551       if (auto Clause = dyn_cast<OMPLastprivateClause>(C)) {
552         for (auto VarRef : Clause->varlists()) {
553           if (VarRef->isValueDependent() || VarRef->isTypeDependent())
554             continue;
555           auto VD = cast<VarDecl>(cast<DeclRefExpr>(VarRef)->getDecl());
556           auto DVar = DSAStack->getTopDSA(VD, false);
557           if (DVar.CKind == OMPC_lastprivate) {
558             SourceLocation ELoc = VarRef->getExprLoc();
559             auto Type = VarRef->getType();
560             if (Type->isArrayType())
561               Type = QualType(Type->getArrayElementTypeNoTypeQual(), 0);
562             CXXRecordDecl *RD =
563                 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
564             // FIXME This code must be replaced by actual constructing of the
565             // lastprivate variable.
566             if (RD) {
567               CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
568               PartialDiagnostic PD =
569                   PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
570               if (!CD ||
571                   CheckConstructorAccess(
572                       ELoc, CD, InitializedEntity::InitializeTemporary(Type),
573                       CD->getAccess(), PD) == AR_inaccessible ||
574                   CD->isDeleted()) {
575                 Diag(ELoc, diag::err_omp_required_method)
576                     << getOpenMPClauseName(OMPC_lastprivate) << 0;
577                 bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
578                               VarDecl::DeclarationOnly;
579                 Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl
580                                                : diag::note_defined_here)
581                     << VD;
582                 Diag(RD->getLocation(), diag::note_previous_decl) << RD;
583                 continue;
584               }
585               MarkFunctionReferenced(ELoc, CD);
586               DiagnoseUseOfDecl(CD, ELoc);
587             }
588           }
589         }
590       }
591     }
592   }
593 
594   DSAStack->pop();
595   DiscardCleanupsInEvaluationContext();
596   PopExpressionEvaluationContext();
597 }
598 
599 namespace {
600 
601 class VarDeclFilterCCC : public CorrectionCandidateCallback {
602 private:
603   Sema &SemaRef;
604 
605 public:
606   explicit VarDeclFilterCCC(Sema &S) : SemaRef(S) {}
607   bool ValidateCandidate(const TypoCorrection &Candidate) override {
608     NamedDecl *ND = Candidate.getCorrectionDecl();
609     if (VarDecl *VD = dyn_cast_or_null<VarDecl>(ND)) {
610       return VD->hasGlobalStorage() &&
611              SemaRef.isDeclInScope(ND, SemaRef.getCurLexicalContext(),
612                                    SemaRef.getCurScope());
613     }
614     return false;
615   }
616 };
617 } // namespace
618 
619 ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope,
620                                          CXXScopeSpec &ScopeSpec,
621                                          const DeclarationNameInfo &Id) {
622   LookupResult Lookup(*this, Id, LookupOrdinaryName);
623   LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
624 
625   if (Lookup.isAmbiguous())
626     return ExprError();
627 
628   VarDecl *VD;
629   if (!Lookup.isSingleResult()) {
630     VarDeclFilterCCC Validator(*this);
631     if (TypoCorrection Corrected =
632             CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, Validator,
633                         CTK_ErrorRecovery)) {
634       diagnoseTypo(Corrected,
635                    PDiag(Lookup.empty()
636                              ? diag::err_undeclared_var_use_suggest
637                              : diag::err_omp_expected_var_arg_suggest)
638                        << Id.getName());
639       VD = Corrected.getCorrectionDeclAs<VarDecl>();
640     } else {
641       Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use
642                                        : diag::err_omp_expected_var_arg)
643           << Id.getName();
644       return ExprError();
645     }
646   } else {
647     if (!(VD = Lookup.getAsSingle<VarDecl>())) {
648       Diag(Id.getLoc(), diag::err_omp_expected_var_arg) << Id.getName();
649       Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at);
650       return ExprError();
651     }
652   }
653   Lookup.suppressDiagnostics();
654 
655   // OpenMP [2.9.2, Syntax, C/C++]
656   //   Variables must be file-scope, namespace-scope, or static block-scope.
657   if (!VD->hasGlobalStorage()) {
658     Diag(Id.getLoc(), diag::err_omp_global_var_arg)
659         << getOpenMPDirectiveName(OMPD_threadprivate) << !VD->isStaticLocal();
660     bool IsDecl =
661         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
662     Diag(VD->getLocation(),
663          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
664         << VD;
665     return ExprError();
666   }
667 
668   VarDecl *CanonicalVD = VD->getCanonicalDecl();
669   NamedDecl *ND = cast<NamedDecl>(CanonicalVD);
670   // OpenMP [2.9.2, Restrictions, C/C++, p.2]
671   //   A threadprivate directive for file-scope variables must appear outside
672   //   any definition or declaration.
673   if (CanonicalVD->getDeclContext()->isTranslationUnit() &&
674       !getCurLexicalContext()->isTranslationUnit()) {
675     Diag(Id.getLoc(), diag::err_omp_var_scope)
676         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
677     bool IsDecl =
678         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
679     Diag(VD->getLocation(),
680          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
681         << VD;
682     return ExprError();
683   }
684   // OpenMP [2.9.2, Restrictions, C/C++, p.3]
685   //   A threadprivate directive for static class member variables must appear
686   //   in the class definition, in the same scope in which the member
687   //   variables are declared.
688   if (CanonicalVD->isStaticDataMember() &&
689       !CanonicalVD->getDeclContext()->Equals(getCurLexicalContext())) {
690     Diag(Id.getLoc(), diag::err_omp_var_scope)
691         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
692     bool IsDecl =
693         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
694     Diag(VD->getLocation(),
695          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
696         << VD;
697     return ExprError();
698   }
699   // OpenMP [2.9.2, Restrictions, C/C++, p.4]
700   //   A threadprivate directive for namespace-scope variables must appear
701   //   outside any definition or declaration other than the namespace
702   //   definition itself.
703   if (CanonicalVD->getDeclContext()->isNamespace() &&
704       (!getCurLexicalContext()->isFileContext() ||
705        !getCurLexicalContext()->Encloses(CanonicalVD->getDeclContext()))) {
706     Diag(Id.getLoc(), diag::err_omp_var_scope)
707         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
708     bool IsDecl =
709         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
710     Diag(VD->getLocation(),
711          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
712         << VD;
713     return ExprError();
714   }
715   // OpenMP [2.9.2, Restrictions, C/C++, p.6]
716   //   A threadprivate directive for static block-scope variables must appear
717   //   in the scope of the variable and not in a nested scope.
718   if (CanonicalVD->isStaticLocal() && CurScope &&
719       !isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
720     Diag(Id.getLoc(), diag::err_omp_var_scope)
721         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
722     bool IsDecl =
723         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
724     Diag(VD->getLocation(),
725          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
726         << VD;
727     return ExprError();
728   }
729 
730   // OpenMP [2.9.2, Restrictions, C/C++, p.2-6]
731   //   A threadprivate directive must lexically precede all references to any
732   //   of the variables in its list.
733   if (VD->isUsed()) {
734     Diag(Id.getLoc(), diag::err_omp_var_used)
735         << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
736     return ExprError();
737   }
738 
739   QualType ExprType = VD->getType().getNonReferenceType();
740   ExprResult DE = BuildDeclRefExpr(VD, ExprType, VK_LValue, Id.getLoc());
741   return DE;
742 }
743 
744 Sema::DeclGroupPtrTy
745 Sema::ActOnOpenMPThreadprivateDirective(SourceLocation Loc,
746                                         ArrayRef<Expr *> VarList) {
747   if (OMPThreadPrivateDecl *D = CheckOMPThreadPrivateDecl(Loc, VarList)) {
748     CurContext->addDecl(D);
749     return DeclGroupPtrTy::make(DeclGroupRef(D));
750   }
751   return DeclGroupPtrTy();
752 }
753 
754 namespace {
755 class LocalVarRefChecker : public ConstStmtVisitor<LocalVarRefChecker, bool> {
756   Sema &SemaRef;
757 
758 public:
759   bool VisitDeclRefExpr(const DeclRefExpr *E) {
760     if (auto VD = dyn_cast<VarDecl>(E->getDecl())) {
761       if (VD->hasLocalStorage()) {
762         SemaRef.Diag(E->getLocStart(),
763                      diag::err_omp_local_var_in_threadprivate_init)
764             << E->getSourceRange();
765         SemaRef.Diag(VD->getLocation(), diag::note_defined_here)
766             << VD << VD->getSourceRange();
767         return true;
768       }
769     }
770     return false;
771   }
772   bool VisitStmt(const Stmt *S) {
773     for (auto Child : S->children()) {
774       if (Child && Visit(Child))
775         return true;
776     }
777     return false;
778   }
779   explicit LocalVarRefChecker(Sema &SemaRef) : SemaRef(SemaRef) {}
780 };
781 } // namespace
782 
783 OMPThreadPrivateDecl *
784 Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {
785   SmallVector<Expr *, 8> Vars;
786   for (auto &RefExpr : VarList) {
787     DeclRefExpr *DE = cast<DeclRefExpr>(RefExpr);
788     VarDecl *VD = cast<VarDecl>(DE->getDecl());
789     SourceLocation ILoc = DE->getExprLoc();
790 
791     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
792     //   A threadprivate variable must not have an incomplete type.
793     if (RequireCompleteType(ILoc, VD->getType(),
794                             diag::err_omp_threadprivate_incomplete_type)) {
795       continue;
796     }
797 
798     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
799     //   A threadprivate variable must not have a reference type.
800     if (VD->getType()->isReferenceType()) {
801       Diag(ILoc, diag::err_omp_ref_type_arg)
802           << getOpenMPDirectiveName(OMPD_threadprivate) << VD->getType();
803       bool IsDecl =
804           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
805       Diag(VD->getLocation(),
806            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
807           << VD;
808       continue;
809     }
810 
811     // Check if this is a TLS variable.
812     if (VD->getTLSKind()) {
813       Diag(ILoc, diag::err_omp_var_thread_local) << VD;
814       bool IsDecl =
815           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
816       Diag(VD->getLocation(),
817            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
818           << VD;
819       continue;
820     }
821 
822     // Check if initial value of threadprivate variable reference variable with
823     // local storage (it is not supported by runtime).
824     if (auto Init = VD->getAnyInitializer()) {
825       LocalVarRefChecker Checker(*this);
826       if (Checker.Visit(Init))
827         continue;
828     }
829 
830     Vars.push_back(RefExpr);
831     DSAStack->addDSA(VD, DE, OMPC_threadprivate);
832   }
833   OMPThreadPrivateDecl *D = nullptr;
834   if (!Vars.empty()) {
835     D = OMPThreadPrivateDecl::Create(Context, getCurLexicalContext(), Loc,
836                                      Vars);
837     D->setAccess(AS_public);
838   }
839   return D;
840 }
841 
842 static void ReportOriginalDSA(Sema &SemaRef, DSAStackTy *Stack,
843                               const VarDecl *VD, DSAStackTy::DSAVarData DVar,
844                               bool IsLoopIterVar = false) {
845   if (DVar.RefExpr) {
846     SemaRef.Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_explicit_dsa)
847         << getOpenMPClauseName(DVar.CKind);
848     return;
849   }
850   enum {
851     PDSA_StaticMemberShared,
852     PDSA_StaticLocalVarShared,
853     PDSA_LoopIterVarPrivate,
854     PDSA_LoopIterVarLinear,
855     PDSA_LoopIterVarLastprivate,
856     PDSA_ConstVarShared,
857     PDSA_GlobalVarShared,
858     PDSA_TaskVarFirstprivate,
859     PDSA_LocalVarPrivate,
860     PDSA_Implicit
861   } Reason = PDSA_Implicit;
862   bool ReportHint = false;
863   auto ReportLoc = VD->getLocation();
864   if (IsLoopIterVar) {
865     if (DVar.CKind == OMPC_private)
866       Reason = PDSA_LoopIterVarPrivate;
867     else if (DVar.CKind == OMPC_lastprivate)
868       Reason = PDSA_LoopIterVarLastprivate;
869     else
870       Reason = PDSA_LoopIterVarLinear;
871   } else if (DVar.DKind == OMPD_task && DVar.CKind == OMPC_firstprivate) {
872     Reason = PDSA_TaskVarFirstprivate;
873     ReportLoc = DVar.ImplicitDSALoc;
874   } else if (VD->isStaticLocal())
875     Reason = PDSA_StaticLocalVarShared;
876   else if (VD->isStaticDataMember())
877     Reason = PDSA_StaticMemberShared;
878   else if (VD->isFileVarDecl())
879     Reason = PDSA_GlobalVarShared;
880   else if (VD->getType().isConstant(SemaRef.getASTContext()))
881     Reason = PDSA_ConstVarShared;
882   else if (VD->isLocalVarDecl() && DVar.CKind == OMPC_private) {
883     ReportHint = true;
884     Reason = PDSA_LocalVarPrivate;
885   }
886   if (Reason != PDSA_Implicit) {
887     SemaRef.Diag(ReportLoc, diag::note_omp_predetermined_dsa)
888         << Reason << ReportHint
889         << getOpenMPDirectiveName(Stack->getCurrentDirective());
890   } else if (DVar.ImplicitDSALoc.isValid()) {
891     SemaRef.Diag(DVar.ImplicitDSALoc, diag::note_omp_implicit_dsa)
892         << getOpenMPClauseName(DVar.CKind);
893   }
894 }
895 
896 namespace {
897 class DSAAttrChecker : public StmtVisitor<DSAAttrChecker, void> {
898   DSAStackTy *Stack;
899   Sema &SemaRef;
900   bool ErrorFound;
901   CapturedStmt *CS;
902   llvm::SmallVector<Expr *, 8> ImplicitFirstprivate;
903   llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA;
904 
905 public:
906   void VisitDeclRefExpr(DeclRefExpr *E) {
907     if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
908       // Skip internally declared variables.
909       if (VD->isLocalVarDecl() && !CS->capturesVariable(VD))
910         return;
911 
912       auto DVar = Stack->getTopDSA(VD, false);
913       // Check if the variable has explicit DSA set and stop analysis if it so.
914       if (DVar.RefExpr) return;
915 
916       auto ELoc = E->getExprLoc();
917       auto DKind = Stack->getCurrentDirective();
918       // The default(none) clause requires that each variable that is referenced
919       // in the construct, and does not have a predetermined data-sharing
920       // attribute, must have its data-sharing attribute explicitly determined
921       // by being listed in a data-sharing attribute clause.
922       if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none &&
923           isParallelOrTaskRegion(DKind) &&
924           VarsWithInheritedDSA.count(VD) == 0) {
925         VarsWithInheritedDSA[VD] = E;
926         return;
927       }
928 
929       // OpenMP [2.9.3.6, Restrictions, p.2]
930       //  A list item that appears in a reduction clause of the innermost
931       //  enclosing worksharing or parallel construct may not be accessed in an
932       //  explicit task.
933       DVar = Stack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction),
934                                     [](OpenMPDirectiveKind K) -> bool {
935                                       return isOpenMPParallelDirective(K) ||
936                                              isOpenMPWorksharingDirective(K);
937                                     },
938                                     false);
939       if (DKind == OMPD_task && DVar.CKind == OMPC_reduction) {
940         ErrorFound = true;
941         SemaRef.Diag(ELoc, diag::err_omp_reduction_in_task);
942         ReportOriginalDSA(SemaRef, Stack, VD, DVar);
943         return;
944       }
945 
946       // Define implicit data-sharing attributes for task.
947       DVar = Stack->getImplicitDSA(VD, false);
948       if (DKind == OMPD_task && DVar.CKind != OMPC_shared)
949         ImplicitFirstprivate.push_back(E);
950     }
951   }
952   void VisitOMPExecutableDirective(OMPExecutableDirective *S) {
953     for (auto *C : S->clauses()) {
954       // Skip analysis of arguments of implicitly defined firstprivate clause
955       // for task directives.
956       if (C && (!isa<OMPFirstprivateClause>(C) || C->getLocStart().isValid()))
957         for (auto *CC : C->children()) {
958           if (CC)
959             Visit(CC);
960         }
961     }
962   }
963   void VisitStmt(Stmt *S) {
964     for (auto *C : S->children()) {
965       if (C && !isa<OMPExecutableDirective>(C))
966         Visit(C);
967     }
968   }
969 
970   bool isErrorFound() { return ErrorFound; }
971   ArrayRef<Expr *> getImplicitFirstprivate() { return ImplicitFirstprivate; }
972   llvm::DenseMap<VarDecl *, Expr *> &getVarsWithInheritedDSA() {
973     return VarsWithInheritedDSA;
974   }
975 
976   DSAAttrChecker(DSAStackTy *S, Sema &SemaRef, CapturedStmt *CS)
977       : Stack(S), SemaRef(SemaRef), ErrorFound(false), CS(CS) {}
978 };
979 } // namespace
980 
981 void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) {
982   switch (DKind) {
983   case OMPD_parallel: {
984     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
985     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
986     Sema::CapturedParamNameType Params[] = {
987         std::make_pair(".global_tid.", KmpInt32PtrTy),
988         std::make_pair(".bound_tid.", KmpInt32PtrTy),
989         std::make_pair(StringRef(), QualType()) // __context with shared vars
990     };
991     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
992                              Params);
993     break;
994   }
995   case OMPD_simd: {
996     Sema::CapturedParamNameType Params[] = {
997         std::make_pair(StringRef(), QualType()) // __context with shared vars
998     };
999     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1000                              Params);
1001     break;
1002   }
1003   case OMPD_for: {
1004     Sema::CapturedParamNameType Params[] = {
1005         std::make_pair(StringRef(), QualType()) // __context with shared vars
1006     };
1007     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1008                              Params);
1009     break;
1010   }
1011   case OMPD_for_simd: {
1012     Sema::CapturedParamNameType Params[] = {
1013         std::make_pair(StringRef(), QualType()) // __context with shared vars
1014     };
1015     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1016                              Params);
1017     break;
1018   }
1019   case OMPD_sections: {
1020     Sema::CapturedParamNameType Params[] = {
1021         std::make_pair(StringRef(), QualType()) // __context with shared vars
1022     };
1023     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1024                              Params);
1025     break;
1026   }
1027   case OMPD_section: {
1028     Sema::CapturedParamNameType Params[] = {
1029         std::make_pair(StringRef(), QualType()) // __context with shared vars
1030     };
1031     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1032                              Params);
1033     break;
1034   }
1035   case OMPD_single: {
1036     Sema::CapturedParamNameType Params[] = {
1037         std::make_pair(StringRef(), QualType()) // __context with shared vars
1038     };
1039     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1040                              Params);
1041     break;
1042   }
1043   case OMPD_master: {
1044     Sema::CapturedParamNameType Params[] = {
1045         std::make_pair(StringRef(), QualType()) // __context with shared vars
1046     };
1047     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1048                              Params);
1049     break;
1050   }
1051   case OMPD_critical: {
1052     Sema::CapturedParamNameType Params[] = {
1053         std::make_pair(StringRef(), QualType()) // __context with shared vars
1054     };
1055     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1056                              Params);
1057     break;
1058   }
1059   case OMPD_parallel_for: {
1060     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1061     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1062     Sema::CapturedParamNameType Params[] = {
1063         std::make_pair(".global_tid.", KmpInt32PtrTy),
1064         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1065         std::make_pair(StringRef(), QualType()) // __context with shared vars
1066     };
1067     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1068                              Params);
1069     break;
1070   }
1071   case OMPD_parallel_for_simd: {
1072     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1);
1073     QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty);
1074     Sema::CapturedParamNameType Params[] = {
1075         std::make_pair(".global_tid.", KmpInt32PtrTy),
1076         std::make_pair(".bound_tid.", KmpInt32PtrTy),
1077         std::make_pair(StringRef(), QualType()) // __context with shared vars
1078     };
1079     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1080                              Params);
1081     break;
1082   }
1083   case OMPD_parallel_sections: {
1084     Sema::CapturedParamNameType Params[] = {
1085         std::make_pair(StringRef(), QualType()) // __context with shared vars
1086     };
1087     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1088                              Params);
1089     break;
1090   }
1091   case OMPD_task: {
1092     Sema::CapturedParamNameType Params[] = {
1093         std::make_pair(StringRef(), QualType()) // __context with shared vars
1094     };
1095     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1096                              Params);
1097     break;
1098   }
1099   case OMPD_taskyield: {
1100     Sema::CapturedParamNameType Params[] = {
1101         std::make_pair(StringRef(), QualType()) // __context with shared vars
1102     };
1103     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1104                              Params);
1105     break;
1106   }
1107   case OMPD_barrier: {
1108     Sema::CapturedParamNameType Params[] = {
1109         std::make_pair(StringRef(), QualType()) // __context with shared vars
1110     };
1111     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1112                              Params);
1113     break;
1114   }
1115   case OMPD_taskwait: {
1116     Sema::CapturedParamNameType Params[] = {
1117         std::make_pair(StringRef(), QualType()) // __context with shared vars
1118     };
1119     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1120                              Params);
1121     break;
1122   }
1123   case OMPD_flush: {
1124     Sema::CapturedParamNameType Params[] = {
1125         std::make_pair(StringRef(), QualType()) // __context with shared vars
1126     };
1127     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1128                              Params);
1129     break;
1130   }
1131   case OMPD_ordered: {
1132     Sema::CapturedParamNameType Params[] = {
1133         std::make_pair(StringRef(), QualType()) // __context with shared vars
1134     };
1135     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1136                              Params);
1137     break;
1138   }
1139   case OMPD_atomic: {
1140     Sema::CapturedParamNameType Params[] = {
1141         std::make_pair(StringRef(), QualType()) // __context with shared vars
1142     };
1143     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1144                              Params);
1145     break;
1146   }
1147   case OMPD_target: {
1148     Sema::CapturedParamNameType Params[] = {
1149         std::make_pair(StringRef(), QualType()) // __context with shared vars
1150     };
1151     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
1152                              Params);
1153     break;
1154   }
1155   case OMPD_threadprivate:
1156     llvm_unreachable("OpenMP Directive is not allowed");
1157   case OMPD_unknown:
1158     llvm_unreachable("Unknown OpenMP directive");
1159   }
1160 }
1161 
1162 static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack,
1163                                   OpenMPDirectiveKind CurrentRegion,
1164                                   const DeclarationNameInfo &CurrentName,
1165                                   SourceLocation StartLoc) {
1166   // Allowed nesting of constructs
1167   // +------------------+-----------------+------------------------------------+
1168   // | Parent directive | Child directive | Closely (!), No-Closely(+), Both(*)|
1169   // +------------------+-----------------+------------------------------------+
1170   // | parallel         | parallel        | *                                  |
1171   // | parallel         | for             | *                                  |
1172   // | parallel         | for simd        | *                                  |
1173   // | parallel         | master          | *                                  |
1174   // | parallel         | critical        | *                                  |
1175   // | parallel         | simd            | *                                  |
1176   // | parallel         | sections        | *                                  |
1177   // | parallel         | section         | +                                  |
1178   // | parallel         | single          | *                                  |
1179   // | parallel         | parallel for    | *                                  |
1180   // | parallel         |parallel for simd| *                                  |
1181   // | parallel         |parallel sections| *                                  |
1182   // | parallel         | task            | *                                  |
1183   // | parallel         | taskyield       | *                                  |
1184   // | parallel         | barrier         | *                                  |
1185   // | parallel         | taskwait        | *                                  |
1186   // | parallel         | flush           | *                                  |
1187   // | parallel         | ordered         | +                                  |
1188   // | parallel         | atomic          | *                                  |
1189   // | parallel         | target          | *                                  |
1190   // +------------------+-----------------+------------------------------------+
1191   // | for              | parallel        | *                                  |
1192   // | for              | for             | +                                  |
1193   // | for              | for simd        | +                                  |
1194   // | for              | master          | +                                  |
1195   // | for              | critical        | *                                  |
1196   // | for              | simd            | *                                  |
1197   // | for              | sections        | +                                  |
1198   // | for              | section         | +                                  |
1199   // | for              | single          | +                                  |
1200   // | for              | parallel for    | *                                  |
1201   // | for              |parallel for simd| *                                  |
1202   // | for              |parallel sections| *                                  |
1203   // | for              | task            | *                                  |
1204   // | for              | taskyield       | *                                  |
1205   // | for              | barrier         | +                                  |
1206   // | for              | taskwait        | *                                  |
1207   // | for              | flush           | *                                  |
1208   // | for              | ordered         | * (if construct is ordered)        |
1209   // | for              | atomic          | *                                  |
1210   // | for              | target          | *                                  |
1211   // +------------------+-----------------+------------------------------------+
1212   // | master           | parallel        | *                                  |
1213   // | master           | for             | +                                  |
1214   // | master           | for simd        | +                                  |
1215   // | master           | master          | *                                  |
1216   // | master           | critical        | *                                  |
1217   // | master           | simd            | *                                  |
1218   // | master           | sections        | +                                  |
1219   // | master           | section         | +                                  |
1220   // | master           | single          | +                                  |
1221   // | master           | parallel for    | *                                  |
1222   // | master           |parallel for simd| *                                  |
1223   // | master           |parallel sections| *                                  |
1224   // | master           | task            | *                                  |
1225   // | master           | taskyield       | *                                  |
1226   // | master           | barrier         | +                                  |
1227   // | master           | taskwait        | *                                  |
1228   // | master           | flush           | *                                  |
1229   // | master           | ordered         | +                                  |
1230   // | master           | atomic          | *                                  |
1231   // | master           | target          | *                                  |
1232   // +------------------+-----------------+------------------------------------+
1233   // | critical         | parallel        | *                                  |
1234   // | critical         | for             | +                                  |
1235   // | critical         | for simd        | +                                  |
1236   // | critical         | master          | *                                  |
1237   // | critical         | critical        | * (should have different names)    |
1238   // | critical         | simd            | *                                  |
1239   // | critical         | sections        | +                                  |
1240   // | critical         | section         | +                                  |
1241   // | critical         | single          | +                                  |
1242   // | critical         | parallel for    | *                                  |
1243   // | critical         |parallel for simd| *                                  |
1244   // | critical         |parallel sections| *                                  |
1245   // | critical         | task            | *                                  |
1246   // | critical         | taskyield       | *                                  |
1247   // | critical         | barrier         | +                                  |
1248   // | critical         | taskwait        | *                                  |
1249   // | critical         | ordered         | +                                  |
1250   // | critical         | atomic          | *                                  |
1251   // | critical         | target          | *                                  |
1252   // +------------------+-----------------+------------------------------------+
1253   // | simd             | parallel        |                                    |
1254   // | simd             | for             |                                    |
1255   // | simd             | for simd        |                                    |
1256   // | simd             | master          |                                    |
1257   // | simd             | critical        |                                    |
1258   // | simd             | simd            |                                    |
1259   // | simd             | sections        |                                    |
1260   // | simd             | section         |                                    |
1261   // | simd             | single          |                                    |
1262   // | simd             | parallel for    |                                    |
1263   // | simd             |parallel for simd|                                    |
1264   // | simd             |parallel sections|                                    |
1265   // | simd             | task            |                                    |
1266   // | simd             | taskyield       |                                    |
1267   // | simd             | barrier         |                                    |
1268   // | simd             | taskwait        |                                    |
1269   // | simd             | flush           |                                    |
1270   // | simd             | ordered         |                                    |
1271   // | simd             | atomic          |                                    |
1272   // | simd             | target          |                                    |
1273   // +------------------+-----------------+------------------------------------+
1274   // | for simd         | parallel        |                                    |
1275   // | for simd         | for             |                                    |
1276   // | for simd         | for simd        |                                    |
1277   // | for simd         | master          |                                    |
1278   // | for simd         | critical        |                                    |
1279   // | for simd         | simd            |                                    |
1280   // | for simd         | sections        |                                    |
1281   // | for simd         | section         |                                    |
1282   // | for simd         | single          |                                    |
1283   // | for simd         | parallel for    |                                    |
1284   // | for simd         |parallel for simd|                                    |
1285   // | for simd         |parallel sections|                                    |
1286   // | for simd         | task            |                                    |
1287   // | for simd         | taskyield       |                                    |
1288   // | for simd         | barrier         |                                    |
1289   // | for simd         | taskwait        |                                    |
1290   // | for simd         | flush           |                                    |
1291   // | for simd         | ordered         |                                    |
1292   // | for simd         | atomic          |                                    |
1293   // | for simd         | target          |                                    |
1294   // +------------------+-----------------+------------------------------------+
1295   // | parallel for simd| parallel        |                                    |
1296   // | parallel for simd| for             |                                    |
1297   // | parallel for simd| for simd        |                                    |
1298   // | parallel for simd| master          |                                    |
1299   // | parallel for simd| critical        |                                    |
1300   // | parallel for simd| simd            |                                    |
1301   // | parallel for simd| sections        |                                    |
1302   // | parallel for simd| section         |                                    |
1303   // | parallel for simd| single          |                                    |
1304   // | parallel for simd| parallel for    |                                    |
1305   // | parallel for simd|parallel for simd|                                    |
1306   // | parallel for simd|parallel sections|                                    |
1307   // | parallel for simd| task            |                                    |
1308   // | parallel for simd| taskyield       |                                    |
1309   // | parallel for simd| barrier         |                                    |
1310   // | parallel for simd| taskwait        |                                    |
1311   // | parallel for simd| flush           |                                    |
1312   // | parallel for simd| ordered         |                                    |
1313   // | parallel for simd| atomic          |                                    |
1314   // | parallel for simd| target          |                                    |
1315   // +------------------+-----------------+------------------------------------+
1316   // | sections         | parallel        | *                                  |
1317   // | sections         | for             | +                                  |
1318   // | sections         | for simd        | +                                  |
1319   // | sections         | master          | +                                  |
1320   // | sections         | critical        | *                                  |
1321   // | sections         | simd            | *                                  |
1322   // | sections         | sections        | +                                  |
1323   // | sections         | section         | *                                  |
1324   // | sections         | single          | +                                  |
1325   // | sections         | parallel for    | *                                  |
1326   // | sections         |parallel for simd| *                                  |
1327   // | sections         |parallel sections| *                                  |
1328   // | sections         | task            | *                                  |
1329   // | sections         | taskyield       | *                                  |
1330   // | sections         | barrier         | +                                  |
1331   // | sections         | taskwait        | *                                  |
1332   // | sections         | flush           | *                                  |
1333   // | sections         | ordered         | +                                  |
1334   // | sections         | atomic          | *                                  |
1335   // | sections         | target          | *                                  |
1336   // +------------------+-----------------+------------------------------------+
1337   // | section          | parallel        | *                                  |
1338   // | section          | for             | +                                  |
1339   // | section          | for simd        | +                                  |
1340   // | section          | master          | +                                  |
1341   // | section          | critical        | *                                  |
1342   // | section          | simd            | *                                  |
1343   // | section          | sections        | +                                  |
1344   // | section          | section         | +                                  |
1345   // | section          | single          | +                                  |
1346   // | section          | parallel for    | *                                  |
1347   // | section          |parallel for simd| *                                  |
1348   // | section          |parallel sections| *                                  |
1349   // | section          | task            | *                                  |
1350   // | section          | taskyield       | *                                  |
1351   // | section          | barrier         | +                                  |
1352   // | section          | taskwait        | *                                  |
1353   // | section          | flush           | *                                  |
1354   // | section          | ordered         | +                                  |
1355   // | section          | atomic          | *                                  |
1356   // | section          | target          | *                                  |
1357   // +------------------+-----------------+------------------------------------+
1358   // | single           | parallel        | *                                  |
1359   // | single           | for             | +                                  |
1360   // | single           | for simd        | +                                  |
1361   // | single           | master          | +                                  |
1362   // | single           | critical        | *                                  |
1363   // | single           | simd            | *                                  |
1364   // | single           | sections        | +                                  |
1365   // | single           | section         | +                                  |
1366   // | single           | single          | +                                  |
1367   // | single           | parallel for    | *                                  |
1368   // | single           |parallel for simd| *                                  |
1369   // | single           |parallel sections| *                                  |
1370   // | single           | task            | *                                  |
1371   // | single           | taskyield       | *                                  |
1372   // | single           | barrier         | +                                  |
1373   // | single           | taskwait        | *                                  |
1374   // | single           | flush           | *                                  |
1375   // | single           | ordered         | +                                  |
1376   // | single           | atomic          | *                                  |
1377   // | single           | target          | *                                  |
1378   // +------------------+-----------------+------------------------------------+
1379   // | parallel for     | parallel        | *                                  |
1380   // | parallel for     | for             | +                                  |
1381   // | parallel for     | for simd        | +                                  |
1382   // | parallel for     | master          | +                                  |
1383   // | parallel for     | critical        | *                                  |
1384   // | parallel for     | simd            | *                                  |
1385   // | parallel for     | sections        | +                                  |
1386   // | parallel for     | section         | +                                  |
1387   // | parallel for     | single          | +                                  |
1388   // | parallel for     | parallel for    | *                                  |
1389   // | parallel for     |parallel for simd| *                                  |
1390   // | parallel for     |parallel sections| *                                  |
1391   // | parallel for     | task            | *                                  |
1392   // | parallel for     | taskyield       | *                                  |
1393   // | parallel for     | barrier         | +                                  |
1394   // | parallel for     | taskwait        | *                                  |
1395   // | parallel for     | flush           | *                                  |
1396   // | parallel for     | ordered         | * (if construct is ordered)        |
1397   // | parallel for     | atomic          | *                                  |
1398   // | parallel for     | target          | *                                  |
1399   // +------------------+-----------------+------------------------------------+
1400   // | parallel sections| parallel        | *                                  |
1401   // | parallel sections| for             | +                                  |
1402   // | parallel sections| for simd        | +                                  |
1403   // | parallel sections| master          | +                                  |
1404   // | parallel sections| critical        | +                                  |
1405   // | parallel sections| simd            | *                                  |
1406   // | parallel sections| sections        | +                                  |
1407   // | parallel sections| section         | *                                  |
1408   // | parallel sections| single          | +                                  |
1409   // | parallel sections| parallel for    | *                                  |
1410   // | parallel sections|parallel for simd| *                                  |
1411   // | parallel sections|parallel sections| *                                  |
1412   // | parallel sections| task            | *                                  |
1413   // | parallel sections| taskyield       | *                                  |
1414   // | parallel sections| barrier         | +                                  |
1415   // | parallel sections| taskwait        | *                                  |
1416   // | parallel sections| flush           | *                                  |
1417   // | parallel sections| ordered         | +                                  |
1418   // | parallel sections| atomic          | *                                  |
1419   // | parallel sections| target          | *                                  |
1420   // +------------------+-----------------+------------------------------------+
1421   // | task             | parallel        | *                                  |
1422   // | task             | for             | +                                  |
1423   // | task             | for simd        | +                                  |
1424   // | task             | master          | +                                  |
1425   // | task             | critical        | *                                  |
1426   // | task             | simd            | *                                  |
1427   // | task             | sections        | +                                  |
1428   // | task             | section         | +                                  |
1429   // | task             | single          | +                                  |
1430   // | task             | parallel for    | *                                  |
1431   // | task             |parallel for simd| *                                  |
1432   // | task             |parallel sections| *                                  |
1433   // | task             | task            | *                                  |
1434   // | task             | taskyield       | *                                  |
1435   // | task             | barrier         | +                                  |
1436   // | task             | taskwait        | *                                  |
1437   // | task             | flush           | *                                  |
1438   // | task             | ordered         | +                                  |
1439   // | task             | atomic          | *                                  |
1440   // | task             | target          | *                                  |
1441   // +------------------+-----------------+------------------------------------+
1442   // | ordered          | parallel        | *                                  |
1443   // | ordered          | for             | +                                  |
1444   // | ordered          | for simd        | +                                  |
1445   // | ordered          | master          | *                                  |
1446   // | ordered          | critical        | *                                  |
1447   // | ordered          | simd            | *                                  |
1448   // | ordered          | sections        | +                                  |
1449   // | ordered          | section         | +                                  |
1450   // | ordered          | single          | +                                  |
1451   // | ordered          | parallel for    | *                                  |
1452   // | ordered          |parallel for simd| *                                  |
1453   // | ordered          |parallel sections| *                                  |
1454   // | ordered          | task            | *                                  |
1455   // | ordered          | taskyield       | *                                  |
1456   // | ordered          | barrier         | +                                  |
1457   // | ordered          | taskwait        | *                                  |
1458   // | ordered          | flush           | *                                  |
1459   // | ordered          | ordered         | +                                  |
1460   // | ordered          | atomic          | *                                  |
1461   // | ordered          | target          | *                                  |
1462   // +------------------+-----------------+------------------------------------+
1463   // | atomic           | parallel        |                                    |
1464   // | atomic           | for             |                                    |
1465   // | atomic           | for simd        |                                    |
1466   // | atomic           | master          |                                    |
1467   // | atomic           | critical        |                                    |
1468   // | atomic           | simd            |                                    |
1469   // | atomic           | sections        |                                    |
1470   // | atomic           | section         |                                    |
1471   // | atomic           | single          |                                    |
1472   // | atomic           | parallel for    |                                    |
1473   // | atomic           |parallel for simd|                                    |
1474   // | atomic           |parallel sections|                                    |
1475   // | atomic           | task            |                                    |
1476   // | atomic           | taskyield       |                                    |
1477   // | atomic           | barrier         |                                    |
1478   // | atomic           | taskwait        |                                    |
1479   // | atomic           | flush           |                                    |
1480   // | atomic           | ordered         |                                    |
1481   // | atomic           | atomic          |                                    |
1482   // | atomic           | target          |                                    |
1483   // +------------------+-----------------+------------------------------------+
1484   // | target           | parallel        | *                                  |
1485   // | target           | for             | *                                  |
1486   // | target           | for simd        | *                                  |
1487   // | target           | master          | *                                  |
1488   // | target           | critical        | *                                  |
1489   // | target           | simd            | *                                  |
1490   // | target           | sections        | *                                  |
1491   // | target           | section         | *                                  |
1492   // | target           | single          | *                                  |
1493   // | target           | parallel for    | *                                  |
1494   // | target           |parallel for simd| *                                  |
1495   // | target           |parallel sections| *                                  |
1496   // | target           | task            | *                                  |
1497   // | target           | taskyield       | *                                  |
1498   // | target           | barrier         | *                                  |
1499   // | target           | taskwait        | *                                  |
1500   // | target           | flush           | *                                  |
1501   // | target           | ordered         | *                                  |
1502   // | target           | atomic          | *                                  |
1503   // | target           | target          | *                                  |
1504   // +------------------+-----------------+------------------------------------+
1505   if (Stack->getCurScope()) {
1506     auto ParentRegion = Stack->getParentDirective();
1507     bool NestingProhibited = false;
1508     bool CloseNesting = true;
1509     enum {
1510       NoRecommend,
1511       ShouldBeInParallelRegion,
1512       ShouldBeInOrderedRegion
1513     } Recommend = NoRecommend;
1514     if (isOpenMPSimdDirective(ParentRegion)) {
1515       // OpenMP [2.16, Nesting of Regions]
1516       // OpenMP constructs may not be nested inside a simd region.
1517       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_simd);
1518       return true;
1519     }
1520     if (ParentRegion == OMPD_atomic) {
1521       // OpenMP [2.16, Nesting of Regions]
1522       // OpenMP constructs may not be nested inside an atomic region.
1523       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_atomic);
1524       return true;
1525     }
1526     if (CurrentRegion == OMPD_section) {
1527       // OpenMP [2.7.2, sections Construct, Restrictions]
1528       // Orphaned section directives are prohibited. That is, the section
1529       // directives must appear within the sections construct and must not be
1530       // encountered elsewhere in the sections region.
1531       if (ParentRegion != OMPD_sections &&
1532           ParentRegion != OMPD_parallel_sections) {
1533         SemaRef.Diag(StartLoc, diag::err_omp_orphaned_section_directive)
1534             << (ParentRegion != OMPD_unknown)
1535             << getOpenMPDirectiveName(ParentRegion);
1536         return true;
1537       }
1538       return false;
1539     }
1540     // Allow some constructs to be orphaned (they could be used in functions,
1541     // called from OpenMP regions with the required preconditions).
1542     if (ParentRegion == OMPD_unknown)
1543       return false;
1544     if (CurrentRegion == OMPD_master) {
1545       // OpenMP [2.16, Nesting of Regions]
1546       // A master region may not be closely nested inside a worksharing,
1547       // atomic, or explicit task region.
1548       NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) ||
1549                           ParentRegion == OMPD_task;
1550     } else if (CurrentRegion == OMPD_critical && CurrentName.getName()) {
1551       // OpenMP [2.16, Nesting of Regions]
1552       // A critical region may not be nested (closely or otherwise) inside a
1553       // critical region with the same name. Note that this restriction is not
1554       // sufficient to prevent deadlock.
1555       SourceLocation PreviousCriticalLoc;
1556       bool DeadLock =
1557           Stack->hasDirective([CurrentName, &PreviousCriticalLoc](
1558                                   OpenMPDirectiveKind K,
1559                                   const DeclarationNameInfo &DNI,
1560                                   SourceLocation Loc)
1561                                   ->bool {
1562                                 if (K == OMPD_critical &&
1563                                     DNI.getName() == CurrentName.getName()) {
1564                                   PreviousCriticalLoc = Loc;
1565                                   return true;
1566                                 } else
1567                                   return false;
1568                               },
1569                               false /* skip top directive */);
1570       if (DeadLock) {
1571         SemaRef.Diag(StartLoc,
1572                      diag::err_omp_prohibited_region_critical_same_name)
1573             << CurrentName.getName();
1574         if (PreviousCriticalLoc.isValid())
1575           SemaRef.Diag(PreviousCriticalLoc,
1576                        diag::note_omp_previous_critical_region);
1577         return true;
1578       }
1579     } else if (CurrentRegion == OMPD_barrier) {
1580       // OpenMP [2.16, Nesting of Regions]
1581       // A barrier region may not be closely nested inside a worksharing,
1582       // explicit task, critical, ordered, atomic, or master region.
1583       NestingProhibited =
1584           isOpenMPWorksharingDirective(ParentRegion) ||
1585           ParentRegion == OMPD_task || ParentRegion == OMPD_master ||
1586           ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered;
1587     } else if (isOpenMPWorksharingDirective(CurrentRegion) &&
1588                !isOpenMPParallelDirective(CurrentRegion)) {
1589       // OpenMP [2.16, Nesting of Regions]
1590       // A worksharing region may not be closely nested inside a worksharing,
1591       // explicit task, critical, ordered, atomic, or master region.
1592       NestingProhibited =
1593           isOpenMPWorksharingDirective(ParentRegion) ||
1594           ParentRegion == OMPD_task || ParentRegion == OMPD_master ||
1595           ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered;
1596       Recommend = ShouldBeInParallelRegion;
1597     } else if (CurrentRegion == OMPD_ordered) {
1598       // OpenMP [2.16, Nesting of Regions]
1599       // An ordered region may not be closely nested inside a critical,
1600       // atomic, or explicit task region.
1601       // An ordered region must be closely nested inside a loop region (or
1602       // parallel loop region) with an ordered clause.
1603       NestingProhibited = ParentRegion == OMPD_critical ||
1604                           ParentRegion == OMPD_task ||
1605                           !Stack->isParentOrderedRegion();
1606       Recommend = ShouldBeInOrderedRegion;
1607     }
1608     if (NestingProhibited) {
1609       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region)
1610           << CloseNesting << getOpenMPDirectiveName(ParentRegion) << Recommend
1611           << getOpenMPDirectiveName(CurrentRegion);
1612       return true;
1613     }
1614   }
1615   return false;
1616 }
1617 
1618 StmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind,
1619                                                 const DeclarationNameInfo &DirName,
1620                                                 ArrayRef<OMPClause *> Clauses,
1621                                                 Stmt *AStmt,
1622                                                 SourceLocation StartLoc,
1623                                                 SourceLocation EndLoc) {
1624   StmtResult Res = StmtError();
1625   if (CheckNestingOfRegions(*this, DSAStack, Kind, DirName, StartLoc))
1626     return StmtError();
1627 
1628   llvm::SmallVector<OMPClause *, 8> ClausesWithImplicit;
1629   llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA;
1630   bool ErrorFound = false;
1631   ClausesWithImplicit.append(Clauses.begin(), Clauses.end());
1632   if (AStmt) {
1633     assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
1634 
1635     // Check default data sharing attributes for referenced variables.
1636     DSAAttrChecker DSAChecker(DSAStack, *this, cast<CapturedStmt>(AStmt));
1637     DSAChecker.Visit(cast<CapturedStmt>(AStmt)->getCapturedStmt());
1638     if (DSAChecker.isErrorFound())
1639       return StmtError();
1640     // Generate list of implicitly defined firstprivate variables.
1641     VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
1642 
1643     if (!DSAChecker.getImplicitFirstprivate().empty()) {
1644       if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
1645               DSAChecker.getImplicitFirstprivate(), SourceLocation(),
1646               SourceLocation(), SourceLocation())) {
1647         ClausesWithImplicit.push_back(Implicit);
1648         ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
1649                      DSAChecker.getImplicitFirstprivate().size();
1650       } else
1651         ErrorFound = true;
1652     }
1653   }
1654 
1655   switch (Kind) {
1656   case OMPD_parallel:
1657     Res = ActOnOpenMPParallelDirective(ClausesWithImplicit, AStmt, StartLoc,
1658                                        EndLoc);
1659     break;
1660   case OMPD_simd:
1661     Res = ActOnOpenMPSimdDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
1662                                    VarsWithInheritedDSA);
1663     break;
1664   case OMPD_for:
1665     Res = ActOnOpenMPForDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
1666                                   VarsWithInheritedDSA);
1667     break;
1668   case OMPD_for_simd:
1669     Res = ActOnOpenMPForSimdDirective(ClausesWithImplicit, AStmt, StartLoc,
1670                                       EndLoc, VarsWithInheritedDSA);
1671     break;
1672   case OMPD_sections:
1673     Res = ActOnOpenMPSectionsDirective(ClausesWithImplicit, AStmt, StartLoc,
1674                                        EndLoc);
1675     break;
1676   case OMPD_section:
1677     assert(ClausesWithImplicit.empty() &&
1678            "No clauses are allowed for 'omp section' directive");
1679     Res = ActOnOpenMPSectionDirective(AStmt, StartLoc, EndLoc);
1680     break;
1681   case OMPD_single:
1682     Res = ActOnOpenMPSingleDirective(ClausesWithImplicit, AStmt, StartLoc,
1683                                      EndLoc);
1684     break;
1685   case OMPD_master:
1686     assert(ClausesWithImplicit.empty() &&
1687            "No clauses are allowed for 'omp master' directive");
1688     Res = ActOnOpenMPMasterDirective(AStmt, StartLoc, EndLoc);
1689     break;
1690   case OMPD_critical:
1691     assert(ClausesWithImplicit.empty() &&
1692            "No clauses are allowed for 'omp critical' directive");
1693     Res = ActOnOpenMPCriticalDirective(DirName, AStmt, StartLoc, EndLoc);
1694     break;
1695   case OMPD_parallel_for:
1696     Res = ActOnOpenMPParallelForDirective(ClausesWithImplicit, AStmt, StartLoc,
1697                                           EndLoc, VarsWithInheritedDSA);
1698     break;
1699   case OMPD_parallel_for_simd:
1700     Res = ActOnOpenMPParallelForSimdDirective(
1701         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
1702     break;
1703   case OMPD_parallel_sections:
1704     Res = ActOnOpenMPParallelSectionsDirective(ClausesWithImplicit, AStmt,
1705                                                StartLoc, EndLoc);
1706     break;
1707   case OMPD_task:
1708     Res =
1709         ActOnOpenMPTaskDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc);
1710     break;
1711   case OMPD_taskyield:
1712     assert(ClausesWithImplicit.empty() &&
1713            "No clauses are allowed for 'omp taskyield' directive");
1714     assert(AStmt == nullptr &&
1715            "No associated statement allowed for 'omp taskyield' directive");
1716     Res = ActOnOpenMPTaskyieldDirective(StartLoc, EndLoc);
1717     break;
1718   case OMPD_barrier:
1719     assert(ClausesWithImplicit.empty() &&
1720            "No clauses are allowed for 'omp barrier' directive");
1721     assert(AStmt == nullptr &&
1722            "No associated statement allowed for 'omp barrier' directive");
1723     Res = ActOnOpenMPBarrierDirective(StartLoc, EndLoc);
1724     break;
1725   case OMPD_taskwait:
1726     assert(ClausesWithImplicit.empty() &&
1727            "No clauses are allowed for 'omp taskwait' directive");
1728     assert(AStmt == nullptr &&
1729            "No associated statement allowed for 'omp taskwait' directive");
1730     Res = ActOnOpenMPTaskwaitDirective(StartLoc, EndLoc);
1731     break;
1732   case OMPD_flush:
1733     assert(AStmt == nullptr &&
1734            "No associated statement allowed for 'omp flush' directive");
1735     Res = ActOnOpenMPFlushDirective(ClausesWithImplicit, StartLoc, EndLoc);
1736     break;
1737   case OMPD_ordered:
1738     assert(ClausesWithImplicit.empty() &&
1739            "No clauses are allowed for 'omp ordered' directive");
1740     Res = ActOnOpenMPOrderedDirective(AStmt, StartLoc, EndLoc);
1741     break;
1742   case OMPD_atomic:
1743     Res = ActOnOpenMPAtomicDirective(ClausesWithImplicit, AStmt, StartLoc,
1744                                      EndLoc);
1745     break;
1746   case OMPD_target:
1747     Res = ActOnOpenMPTargetDirective(ClausesWithImplicit, AStmt, StartLoc,
1748                                      EndLoc);
1749     break;
1750   case OMPD_threadprivate:
1751     llvm_unreachable("OpenMP Directive is not allowed");
1752   case OMPD_unknown:
1753     llvm_unreachable("Unknown OpenMP directive");
1754   }
1755 
1756   for (auto P : VarsWithInheritedDSA) {
1757     Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
1758         << P.first << P.second->getSourceRange();
1759   }
1760   if (!VarsWithInheritedDSA.empty())
1761     return StmtError();
1762 
1763   if (ErrorFound)
1764     return StmtError();
1765   return Res;
1766 }
1767 
1768 StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
1769                                               Stmt *AStmt,
1770                                               SourceLocation StartLoc,
1771                                               SourceLocation EndLoc) {
1772   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
1773   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
1774   // 1.2.2 OpenMP Language Terminology
1775   // Structured block - An executable statement with a single entry at the
1776   // top and a single exit at the bottom.
1777   // The point of exit cannot be a branch out of the structured block.
1778   // longjmp() and throw() must not violate the entry/exit criteria.
1779   CS->getCapturedDecl()->setNothrow();
1780 
1781   getCurFunction()->setHasBranchProtectedScope();
1782 
1783   return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses,
1784                                       AStmt);
1785 }
1786 
1787 namespace {
1788 /// \brief Helper class for checking canonical form of the OpenMP loops and
1789 /// extracting iteration space of each loop in the loop nest, that will be used
1790 /// for IR generation.
1791 class OpenMPIterationSpaceChecker {
1792   /// \brief Reference to Sema.
1793   Sema &SemaRef;
1794   /// \brief A location for diagnostics (when there is no some better location).
1795   SourceLocation DefaultLoc;
1796   /// \brief A location for diagnostics (when increment is not compatible).
1797   SourceLocation ConditionLoc;
1798   /// \brief A source location for referring to loop init later.
1799   SourceRange InitSrcRange;
1800   /// \brief A source location for referring to condition later.
1801   SourceRange ConditionSrcRange;
1802   /// \brief A source location for referring to increment later.
1803   SourceRange IncrementSrcRange;
1804   /// \brief Loop variable.
1805   VarDecl *Var;
1806   /// \brief Reference to loop variable.
1807   DeclRefExpr *VarRef;
1808   /// \brief Lower bound (initializer for the var).
1809   Expr *LB;
1810   /// \brief Upper bound.
1811   Expr *UB;
1812   /// \brief Loop step (increment).
1813   Expr *Step;
1814   /// \brief This flag is true when condition is one of:
1815   ///   Var <  UB
1816   ///   Var <= UB
1817   ///   UB  >  Var
1818   ///   UB  >= Var
1819   bool TestIsLessOp;
1820   /// \brief This flag is true when condition is strict ( < or > ).
1821   bool TestIsStrictOp;
1822   /// \brief This flag is true when step is subtracted on each iteration.
1823   bool SubtractStep;
1824 
1825 public:
1826   OpenMPIterationSpaceChecker(Sema &SemaRef, SourceLocation DefaultLoc)
1827       : SemaRef(SemaRef), DefaultLoc(DefaultLoc), ConditionLoc(DefaultLoc),
1828         InitSrcRange(SourceRange()), ConditionSrcRange(SourceRange()),
1829         IncrementSrcRange(SourceRange()), Var(nullptr), VarRef(nullptr),
1830         LB(nullptr), UB(nullptr), Step(nullptr), TestIsLessOp(false),
1831         TestIsStrictOp(false), SubtractStep(false) {}
1832   /// \brief Check init-expr for canonical loop form and save loop counter
1833   /// variable - #Var and its initialization value - #LB.
1834   bool CheckInit(Stmt *S);
1835   /// \brief Check test-expr for canonical form, save upper-bound (#UB), flags
1836   /// for less/greater and for strict/non-strict comparison.
1837   bool CheckCond(Expr *S);
1838   /// \brief Check incr-expr for canonical loop form and return true if it
1839   /// does not conform, otherwise save loop step (#Step).
1840   bool CheckInc(Expr *S);
1841   /// \brief Return the loop counter variable.
1842   VarDecl *GetLoopVar() const { return Var; }
1843   /// \brief Return the reference expression to loop counter variable.
1844   DeclRefExpr *GetLoopVarRefExpr() const { return VarRef; }
1845   /// \brief Source range of the loop init.
1846   SourceRange GetInitSrcRange() const { return InitSrcRange; }
1847   /// \brief Source range of the loop condition.
1848   SourceRange GetConditionSrcRange() const { return ConditionSrcRange; }
1849   /// \brief Source range of the loop increment.
1850   SourceRange GetIncrementSrcRange() const { return IncrementSrcRange; }
1851   /// \brief True if the step should be subtracted.
1852   bool ShouldSubtractStep() const { return SubtractStep; }
1853   /// \brief Build the expression to calculate the number of iterations.
1854   Expr *BuildNumIterations(Scope *S, const bool LimitedType) const;
1855   /// \brief Build reference expression to the counter be used for codegen.
1856   Expr *BuildCounterVar() const;
1857   /// \brief Build initization of the counter be used for codegen.
1858   Expr *BuildCounterInit() const;
1859   /// \brief Build step of the counter be used for codegen.
1860   Expr *BuildCounterStep() const;
1861   /// \brief Return true if any expression is dependent.
1862   bool Dependent() const;
1863 
1864 private:
1865   /// \brief Check the right-hand side of an assignment in the increment
1866   /// expression.
1867   bool CheckIncRHS(Expr *RHS);
1868   /// \brief Helper to set loop counter variable and its initializer.
1869   bool SetVarAndLB(VarDecl *NewVar, DeclRefExpr *NewVarRefExpr, Expr *NewLB);
1870   /// \brief Helper to set upper bound.
1871   bool SetUB(Expr *NewUB, bool LessOp, bool StrictOp, const SourceRange &SR,
1872              const SourceLocation &SL);
1873   /// \brief Helper to set loop increment.
1874   bool SetStep(Expr *NewStep, bool Subtract);
1875 };
1876 
1877 bool OpenMPIterationSpaceChecker::Dependent() const {
1878   if (!Var) {
1879     assert(!LB && !UB && !Step);
1880     return false;
1881   }
1882   return Var->getType()->isDependentType() || (LB && LB->isValueDependent()) ||
1883          (UB && UB->isValueDependent()) || (Step && Step->isValueDependent());
1884 }
1885 
1886 bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar,
1887                                               DeclRefExpr *NewVarRefExpr,
1888                                               Expr *NewLB) {
1889   // State consistency checking to ensure correct usage.
1890   assert(Var == nullptr && LB == nullptr && VarRef == nullptr &&
1891          UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp);
1892   if (!NewVar || !NewLB)
1893     return true;
1894   Var = NewVar;
1895   VarRef = NewVarRefExpr;
1896   LB = NewLB;
1897   return false;
1898 }
1899 
1900 bool OpenMPIterationSpaceChecker::SetUB(Expr *NewUB, bool LessOp, bool StrictOp,
1901                                         const SourceRange &SR,
1902                                         const SourceLocation &SL) {
1903   // State consistency checking to ensure correct usage.
1904   assert(Var != nullptr && LB != nullptr && UB == nullptr && Step == nullptr &&
1905          !TestIsLessOp && !TestIsStrictOp);
1906   if (!NewUB)
1907     return true;
1908   UB = NewUB;
1909   TestIsLessOp = LessOp;
1910   TestIsStrictOp = StrictOp;
1911   ConditionSrcRange = SR;
1912   ConditionLoc = SL;
1913   return false;
1914 }
1915 
1916 bool OpenMPIterationSpaceChecker::SetStep(Expr *NewStep, bool Subtract) {
1917   // State consistency checking to ensure correct usage.
1918   assert(Var != nullptr && LB != nullptr && Step == nullptr);
1919   if (!NewStep)
1920     return true;
1921   if (!NewStep->isValueDependent()) {
1922     // Check that the step is integer expression.
1923     SourceLocation StepLoc = NewStep->getLocStart();
1924     ExprResult Val =
1925         SemaRef.PerformOpenMPImplicitIntegerConversion(StepLoc, NewStep);
1926     if (Val.isInvalid())
1927       return true;
1928     NewStep = Val.get();
1929 
1930     // OpenMP [2.6, Canonical Loop Form, Restrictions]
1931     //  If test-expr is of form var relational-op b and relational-op is < or
1932     //  <= then incr-expr must cause var to increase on each iteration of the
1933     //  loop. If test-expr is of form var relational-op b and relational-op is
1934     //  > or >= then incr-expr must cause var to decrease on each iteration of
1935     //  the loop.
1936     //  If test-expr is of form b relational-op var and relational-op is < or
1937     //  <= then incr-expr must cause var to decrease on each iteration of the
1938     //  loop. If test-expr is of form b relational-op var and relational-op is
1939     //  > or >= then incr-expr must cause var to increase on each iteration of
1940     //  the loop.
1941     llvm::APSInt Result;
1942     bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context);
1943     bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation();
1944     bool IsConstNeg =
1945         IsConstant && Result.isSigned() && (Subtract != Result.isNegative());
1946     bool IsConstPos =
1947         IsConstant && Result.isSigned() && (Subtract == Result.isNegative());
1948     bool IsConstZero = IsConstant && !Result.getBoolValue();
1949     if (UB && (IsConstZero ||
1950                (TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract))
1951                              : (IsConstPos || (IsUnsigned && !Subtract))))) {
1952       SemaRef.Diag(NewStep->getExprLoc(),
1953                    diag::err_omp_loop_incr_not_compatible)
1954           << Var << TestIsLessOp << NewStep->getSourceRange();
1955       SemaRef.Diag(ConditionLoc,
1956                    diag::note_omp_loop_cond_requres_compatible_incr)
1957           << TestIsLessOp << ConditionSrcRange;
1958       return true;
1959     }
1960     if (TestIsLessOp == Subtract) {
1961       NewStep = SemaRef.CreateBuiltinUnaryOp(NewStep->getExprLoc(), UO_Minus,
1962                                              NewStep).get();
1963       Subtract = !Subtract;
1964     }
1965   }
1966 
1967   Step = NewStep;
1968   SubtractStep = Subtract;
1969   return false;
1970 }
1971 
1972 bool OpenMPIterationSpaceChecker::CheckInit(Stmt *S) {
1973   // Check init-expr for canonical loop form and save loop counter
1974   // variable - #Var and its initialization value - #LB.
1975   // OpenMP [2.6] Canonical loop form. init-expr may be one of the following:
1976   //   var = lb
1977   //   integer-type var = lb
1978   //   random-access-iterator-type var = lb
1979   //   pointer-type var = lb
1980   //
1981   if (!S) {
1982     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init);
1983     return true;
1984   }
1985   InitSrcRange = S->getSourceRange();
1986   if (Expr *E = dyn_cast<Expr>(S))
1987     S = E->IgnoreParens();
1988   if (auto BO = dyn_cast<BinaryOperator>(S)) {
1989     if (BO->getOpcode() == BO_Assign)
1990       if (auto DRE = dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreParens()))
1991         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
1992                            BO->getRHS());
1993   } else if (auto DS = dyn_cast<DeclStmt>(S)) {
1994     if (DS->isSingleDecl()) {
1995       if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) {
1996         if (Var->hasInit()) {
1997           // Accept non-canonical init form here but emit ext. warning.
1998           if (Var->getInitStyle() != VarDecl::CInit)
1999             SemaRef.Diag(S->getLocStart(),
2000                          diag::ext_omp_loop_not_canonical_init)
2001                 << S->getSourceRange();
2002           return SetVarAndLB(Var, nullptr, Var->getInit());
2003         }
2004       }
2005     }
2006   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S))
2007     if (CE->getOperator() == OO_Equal)
2008       if (auto DRE = dyn_cast<DeclRefExpr>(CE->getArg(0)))
2009         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
2010                            CE->getArg(1));
2011 
2012   SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_init)
2013       << S->getSourceRange();
2014   return true;
2015 }
2016 
2017 /// \brief Ignore parenthesizes, implicit casts, copy constructor and return the
2018 /// variable (which may be the loop variable) if possible.
2019 static const VarDecl *GetInitVarDecl(const Expr *E) {
2020   if (!E)
2021     return nullptr;
2022   E = E->IgnoreParenImpCasts();
2023   if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E))
2024     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
2025       if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 &&
2026           CE->getArg(0) != nullptr)
2027         E = CE->getArg(0)->IgnoreParenImpCasts();
2028   auto DRE = dyn_cast_or_null<DeclRefExpr>(E);
2029   if (!DRE)
2030     return nullptr;
2031   return dyn_cast<VarDecl>(DRE->getDecl());
2032 }
2033 
2034 bool OpenMPIterationSpaceChecker::CheckCond(Expr *S) {
2035   // Check test-expr for canonical form, save upper-bound UB, flags for
2036   // less/greater and for strict/non-strict comparison.
2037   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2038   //   var relational-op b
2039   //   b relational-op var
2040   //
2041   if (!S) {
2042     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << Var;
2043     return true;
2044   }
2045   S = S->IgnoreParenImpCasts();
2046   SourceLocation CondLoc = S->getLocStart();
2047   if (auto BO = dyn_cast<BinaryOperator>(S)) {
2048     if (BO->isRelationalOp()) {
2049       if (GetInitVarDecl(BO->getLHS()) == Var)
2050         return SetUB(BO->getRHS(),
2051                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE),
2052                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2053                      BO->getSourceRange(), BO->getOperatorLoc());
2054       if (GetInitVarDecl(BO->getRHS()) == Var)
2055         return SetUB(BO->getLHS(),
2056                      (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE),
2057                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2058                      BO->getSourceRange(), BO->getOperatorLoc());
2059     }
2060   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2061     if (CE->getNumArgs() == 2) {
2062       auto Op = CE->getOperator();
2063       switch (Op) {
2064       case OO_Greater:
2065       case OO_GreaterEqual:
2066       case OO_Less:
2067       case OO_LessEqual:
2068         if (GetInitVarDecl(CE->getArg(0)) == Var)
2069           return SetUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual,
2070                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2071                        CE->getOperatorLoc());
2072         if (GetInitVarDecl(CE->getArg(1)) == Var)
2073           return SetUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual,
2074                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2075                        CE->getOperatorLoc());
2076         break;
2077       default:
2078         break;
2079       }
2080     }
2081   }
2082   SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond)
2083       << S->getSourceRange() << Var;
2084   return true;
2085 }
2086 
2087 bool OpenMPIterationSpaceChecker::CheckIncRHS(Expr *RHS) {
2088   // RHS of canonical loop form increment can be:
2089   //   var + incr
2090   //   incr + var
2091   //   var - incr
2092   //
2093   RHS = RHS->IgnoreParenImpCasts();
2094   if (auto BO = dyn_cast<BinaryOperator>(RHS)) {
2095     if (BO->isAdditiveOp()) {
2096       bool IsAdd = BO->getOpcode() == BO_Add;
2097       if (GetInitVarDecl(BO->getLHS()) == Var)
2098         return SetStep(BO->getRHS(), !IsAdd);
2099       if (IsAdd && GetInitVarDecl(BO->getRHS()) == Var)
2100         return SetStep(BO->getLHS(), false);
2101     }
2102   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(RHS)) {
2103     bool IsAdd = CE->getOperator() == OO_Plus;
2104     if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) {
2105       if (GetInitVarDecl(CE->getArg(0)) == Var)
2106         return SetStep(CE->getArg(1), !IsAdd);
2107       if (IsAdd && GetInitVarDecl(CE->getArg(1)) == Var)
2108         return SetStep(CE->getArg(0), false);
2109     }
2110   }
2111   SemaRef.Diag(RHS->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2112       << RHS->getSourceRange() << Var;
2113   return true;
2114 }
2115 
2116 bool OpenMPIterationSpaceChecker::CheckInc(Expr *S) {
2117   // Check incr-expr for canonical loop form and return true if it
2118   // does not conform.
2119   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2120   //   ++var
2121   //   var++
2122   //   --var
2123   //   var--
2124   //   var += incr
2125   //   var -= incr
2126   //   var = var + incr
2127   //   var = incr + var
2128   //   var = var - incr
2129   //
2130   if (!S) {
2131     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << Var;
2132     return true;
2133   }
2134   IncrementSrcRange = S->getSourceRange();
2135   S = S->IgnoreParens();
2136   if (auto UO = dyn_cast<UnaryOperator>(S)) {
2137     if (UO->isIncrementDecrementOp() && GetInitVarDecl(UO->getSubExpr()) == Var)
2138       return SetStep(
2139           SemaRef.ActOnIntegerConstant(UO->getLocStart(),
2140                                        (UO->isDecrementOp() ? -1 : 1)).get(),
2141           false);
2142   } else if (auto BO = dyn_cast<BinaryOperator>(S)) {
2143     switch (BO->getOpcode()) {
2144     case BO_AddAssign:
2145     case BO_SubAssign:
2146       if (GetInitVarDecl(BO->getLHS()) == Var)
2147         return SetStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign);
2148       break;
2149     case BO_Assign:
2150       if (GetInitVarDecl(BO->getLHS()) == Var)
2151         return CheckIncRHS(BO->getRHS());
2152       break;
2153     default:
2154       break;
2155     }
2156   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2157     switch (CE->getOperator()) {
2158     case OO_PlusPlus:
2159     case OO_MinusMinus:
2160       if (GetInitVarDecl(CE->getArg(0)) == Var)
2161         return SetStep(
2162             SemaRef.ActOnIntegerConstant(
2163                         CE->getLocStart(),
2164                         ((CE->getOperator() == OO_MinusMinus) ? -1 : 1)).get(),
2165             false);
2166       break;
2167     case OO_PlusEqual:
2168     case OO_MinusEqual:
2169       if (GetInitVarDecl(CE->getArg(0)) == Var)
2170         return SetStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual);
2171       break;
2172     case OO_Equal:
2173       if (GetInitVarDecl(CE->getArg(0)) == Var)
2174         return CheckIncRHS(CE->getArg(1));
2175       break;
2176     default:
2177       break;
2178     }
2179   }
2180   SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2181       << S->getSourceRange() << Var;
2182   return true;
2183 }
2184 
2185 /// \brief Build the expression to calculate the number of iterations.
2186 Expr *
2187 OpenMPIterationSpaceChecker::BuildNumIterations(Scope *S,
2188                                                 const bool LimitedType) const {
2189   ExprResult Diff;
2190   if (Var->getType()->isIntegerType() || Var->getType()->isPointerType() ||
2191       SemaRef.getLangOpts().CPlusPlus) {
2192     // Upper - Lower
2193     Expr *Upper = TestIsLessOp ? UB : LB;
2194     Expr *Lower = TestIsLessOp ? LB : UB;
2195 
2196     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower);
2197 
2198     if (!Diff.isUsable() && Var->getType()->getAsCXXRecordDecl()) {
2199       // BuildBinOp already emitted error, this one is to point user to upper
2200       // and lower bound, and to tell what is passed to 'operator-'.
2201       SemaRef.Diag(Upper->getLocStart(), diag::err_omp_loop_diff_cxx)
2202           << Upper->getSourceRange() << Lower->getSourceRange();
2203       return nullptr;
2204     }
2205   }
2206 
2207   if (!Diff.isUsable())
2208     return nullptr;
2209 
2210   // Upper - Lower [- 1]
2211   if (TestIsStrictOp)
2212     Diff = SemaRef.BuildBinOp(
2213         S, DefaultLoc, BO_Sub, Diff.get(),
2214         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
2215   if (!Diff.isUsable())
2216     return nullptr;
2217 
2218   // Upper - Lower [- 1] + Step
2219   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Diff.get(),
2220                             Step->IgnoreImplicit());
2221   if (!Diff.isUsable())
2222     return nullptr;
2223 
2224   // Parentheses (for dumping/debugging purposes only).
2225   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
2226   if (!Diff.isUsable())
2227     return nullptr;
2228 
2229   // (Upper - Lower [- 1] + Step) / Step
2230   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(),
2231                             Step->IgnoreImplicit());
2232   if (!Diff.isUsable())
2233     return nullptr;
2234 
2235   // OpenMP runtime requires 32-bit or 64-bit loop variables.
2236   if (LimitedType) {
2237     auto &C = SemaRef.Context;
2238     QualType Type = Diff.get()->getType();
2239     unsigned NewSize = (C.getTypeSize(Type) > 32) ? 64 : 32;
2240     if (NewSize != C.getTypeSize(Type)) {
2241       if (NewSize < C.getTypeSize(Type)) {
2242         assert(NewSize == 64 && "incorrect loop var size");
2243         SemaRef.Diag(DefaultLoc, diag::warn_omp_loop_64_bit_var)
2244             << InitSrcRange << ConditionSrcRange;
2245       }
2246       QualType NewType = C.getIntTypeForBitwidth(
2247           NewSize, Type->hasSignedIntegerRepresentation());
2248       Diff = SemaRef.PerformImplicitConversion(Diff.get(), NewType,
2249                                                Sema::AA_Converting, true);
2250       if (!Diff.isUsable())
2251         return nullptr;
2252     }
2253   }
2254 
2255   return Diff.get();
2256 }
2257 
2258 /// \brief Build reference expression to the counter be used for codegen.
2259 Expr *OpenMPIterationSpaceChecker::BuildCounterVar() const {
2260   return DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(),
2261                              GetIncrementSrcRange().getBegin(), Var, false,
2262                              DefaultLoc, Var->getType(), VK_LValue);
2263 }
2264 
2265 /// \brief Build initization of the counter be used for codegen.
2266 Expr *OpenMPIterationSpaceChecker::BuildCounterInit() const { return LB; }
2267 
2268 /// \brief Build step of the counter be used for codegen.
2269 Expr *OpenMPIterationSpaceChecker::BuildCounterStep() const { return Step; }
2270 
2271 /// \brief Iteration space of a single for loop.
2272 struct LoopIterationSpace {
2273   /// \brief This expression calculates the number of iterations in the loop.
2274   /// It is always possible to calculate it before starting the loop.
2275   Expr *NumIterations;
2276   /// \brief The loop counter variable.
2277   Expr *CounterVar;
2278   /// \brief This is initializer for the initial value of #CounterVar.
2279   Expr *CounterInit;
2280   /// \brief This is step for the #CounterVar used to generate its update:
2281   /// #CounterVar = #CounterInit + #CounterStep * CurrentIteration.
2282   Expr *CounterStep;
2283   /// \brief Should step be subtracted?
2284   bool Subtract;
2285   /// \brief Source range of the loop init.
2286   SourceRange InitSrcRange;
2287   /// \brief Source range of the loop condition.
2288   SourceRange CondSrcRange;
2289   /// \brief Source range of the loop increment.
2290   SourceRange IncSrcRange;
2291 };
2292 
2293 /// \brief The resulting expressions built for the OpenMP loop CodeGen for the
2294 /// whole collapsed loop nest. See class OMPLoopDirective for their description.
2295 struct BuiltLoopExprs {
2296   Expr *IterationVarRef;
2297   Expr *LastIteration;
2298   Expr *CalcLastIteration;
2299   Expr *PreCond;
2300   Expr *Cond;
2301   Expr *SeparatedCond;
2302   Expr *Init;
2303   Expr *Inc;
2304   SmallVector<Expr *, 4> Counters;
2305   SmallVector<Expr *, 4> Updates;
2306   SmallVector<Expr *, 4> Finals;
2307 
2308   bool builtAll() {
2309     return IterationVarRef != nullptr && LastIteration != nullptr &&
2310            PreCond != nullptr && Cond != nullptr && SeparatedCond != nullptr &&
2311            Init != nullptr && Inc != nullptr;
2312   }
2313   void clear(unsigned size) {
2314     IterationVarRef = nullptr;
2315     LastIteration = nullptr;
2316     CalcLastIteration = nullptr;
2317     PreCond = nullptr;
2318     Cond = nullptr;
2319     SeparatedCond = nullptr;
2320     Init = nullptr;
2321     Inc = nullptr;
2322     Counters.resize(size);
2323     Updates.resize(size);
2324     Finals.resize(size);
2325     for (unsigned i = 0; i < size; ++i) {
2326       Counters[i] = nullptr;
2327       Updates[i] = nullptr;
2328       Finals[i] = nullptr;
2329     }
2330   }
2331 };
2332 
2333 } // namespace
2334 
2335 /// \brief Called on a for stmt to check and extract its iteration space
2336 /// for further processing (such as collapsing).
2337 static bool CheckOpenMPIterationSpace(
2338     OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA,
2339     unsigned CurrentNestedLoopCount, unsigned NestedLoopCount,
2340     Expr *NestedLoopCountExpr,
2341     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA,
2342     LoopIterationSpace &ResultIterSpace) {
2343   // OpenMP [2.6, Canonical Loop Form]
2344   //   for (init-expr; test-expr; incr-expr) structured-block
2345   auto For = dyn_cast_or_null<ForStmt>(S);
2346   if (!For) {
2347     SemaRef.Diag(S->getLocStart(), diag::err_omp_not_for)
2348         << (NestedLoopCountExpr != nullptr) << getOpenMPDirectiveName(DKind)
2349         << NestedLoopCount << (CurrentNestedLoopCount > 0)
2350         << CurrentNestedLoopCount;
2351     if (NestedLoopCount > 1)
2352       SemaRef.Diag(NestedLoopCountExpr->getExprLoc(),
2353                    diag::note_omp_collapse_expr)
2354           << NestedLoopCountExpr->getSourceRange();
2355     return true;
2356   }
2357   assert(For->getBody());
2358 
2359   OpenMPIterationSpaceChecker ISC(SemaRef, For->getForLoc());
2360 
2361   // Check init.
2362   auto Init = For->getInit();
2363   if (ISC.CheckInit(Init)) {
2364     return true;
2365   }
2366 
2367   bool HasErrors = false;
2368 
2369   // Check loop variable's type.
2370   auto Var = ISC.GetLoopVar();
2371 
2372   // OpenMP [2.6, Canonical Loop Form]
2373   // Var is one of the following:
2374   //   A variable of signed or unsigned integer type.
2375   //   For C++, a variable of a random access iterator type.
2376   //   For C, a variable of a pointer type.
2377   auto VarType = Var->getType();
2378   if (!VarType->isDependentType() && !VarType->isIntegerType() &&
2379       !VarType->isPointerType() &&
2380       !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) {
2381     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_variable_type)
2382         << SemaRef.getLangOpts().CPlusPlus;
2383     HasErrors = true;
2384   }
2385 
2386   // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in a
2387   // Construct
2388   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2389   // parallel for construct is (are) private.
2390   // The loop iteration variable in the associated for-loop of a simd construct
2391   // with just one associated for-loop is linear with a constant-linear-step
2392   // that is the increment of the associated for-loop.
2393   // Exclude loop var from the list of variables with implicitly defined data
2394   // sharing attributes.
2395   while (VarsWithImplicitDSA.count(Var) > 0)
2396     VarsWithImplicitDSA.erase(Var);
2397 
2398   // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced in
2399   // a Construct, C/C++].
2400   // The loop iteration variable in the associated for-loop of a simd construct
2401   // with just one associated for-loop may be listed in a linear clause with a
2402   // constant-linear-step that is the increment of the associated for-loop.
2403   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2404   // parallel for construct may be listed in a private or lastprivate clause.
2405   DSAStackTy::DSAVarData DVar = DSA.getTopDSA(Var, false);
2406   auto LoopVarRefExpr = ISC.GetLoopVarRefExpr();
2407   // If LoopVarRefExpr is nullptr it means the corresponding loop variable is
2408   // declared in the loop and it is predetermined as a private.
2409   auto PredeterminedCKind =
2410       isOpenMPSimdDirective(DKind)
2411           ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate)
2412           : OMPC_private;
2413   if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
2414         DVar.CKind != PredeterminedCKind) ||
2415        (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) &&
2416         DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private &&
2417         DVar.CKind != OMPC_lastprivate)) &&
2418       (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
2419     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa)
2420         << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind)
2421         << getOpenMPClauseName(PredeterminedCKind);
2422     ReportOriginalDSA(SemaRef, &DSA, Var, DVar, true);
2423     HasErrors = true;
2424   } else if (LoopVarRefExpr != nullptr) {
2425     // Make the loop iteration variable private (for worksharing constructs),
2426     // linear (for simd directives with the only one associated loop) or
2427     // lastprivate (for simd directives with several collapsed loops).
2428     DSA.addDSA(Var, LoopVarRefExpr, PredeterminedCKind);
2429   }
2430 
2431   assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars");
2432 
2433   // Check test-expr.
2434   HasErrors |= ISC.CheckCond(For->getCond());
2435 
2436   // Check incr-expr.
2437   HasErrors |= ISC.CheckInc(For->getInc());
2438 
2439   if (ISC.Dependent() || SemaRef.CurContext->isDependentContext() || HasErrors)
2440     return HasErrors;
2441 
2442   // Build the loop's iteration space representation.
2443   ResultIterSpace.NumIterations = ISC.BuildNumIterations(
2444       DSA.getCurScope(), /* LimitedType */ isOpenMPWorksharingDirective(DKind));
2445   ResultIterSpace.CounterVar = ISC.BuildCounterVar();
2446   ResultIterSpace.CounterInit = ISC.BuildCounterInit();
2447   ResultIterSpace.CounterStep = ISC.BuildCounterStep();
2448   ResultIterSpace.InitSrcRange = ISC.GetInitSrcRange();
2449   ResultIterSpace.CondSrcRange = ISC.GetConditionSrcRange();
2450   ResultIterSpace.IncSrcRange = ISC.GetIncrementSrcRange();
2451   ResultIterSpace.Subtract = ISC.ShouldSubtractStep();
2452 
2453   HasErrors |= (ResultIterSpace.NumIterations == nullptr ||
2454                 ResultIterSpace.CounterVar == nullptr ||
2455                 ResultIterSpace.CounterInit == nullptr ||
2456                 ResultIterSpace.CounterStep == nullptr);
2457 
2458   return HasErrors;
2459 }
2460 
2461 /// \brief Build a variable declaration for OpenMP loop iteration variable.
2462 static VarDecl *BuildVarDecl(Sema &SemaRef, SourceLocation Loc, QualType Type,
2463                              StringRef Name) {
2464   DeclContext *DC = SemaRef.CurContext;
2465   IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name);
2466   TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
2467   VarDecl *Decl =
2468       VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type, TInfo, SC_None);
2469   Decl->setImplicit();
2470   return Decl;
2471 }
2472 
2473 /// \brief Build 'VarRef = Start + Iter * Step'.
2474 static ExprResult BuildCounterUpdate(Sema &SemaRef, Scope *S,
2475                                      SourceLocation Loc, ExprResult VarRef,
2476                                      ExprResult Start, ExprResult Iter,
2477                                      ExprResult Step, bool Subtract) {
2478   // Add parentheses (for debugging purposes only).
2479   Iter = SemaRef.ActOnParenExpr(Loc, Loc, Iter.get());
2480   if (!VarRef.isUsable() || !Start.isUsable() || !Iter.isUsable() ||
2481       !Step.isUsable())
2482     return ExprError();
2483 
2484   ExprResult Update = SemaRef.BuildBinOp(S, Loc, BO_Mul, Iter.get(),
2485                                          Step.get()->IgnoreImplicit());
2486   if (!Update.isUsable())
2487     return ExprError();
2488 
2489   // Build 'VarRef = Start + Iter * Step'.
2490   Update = SemaRef.BuildBinOp(S, Loc, (Subtract ? BO_Sub : BO_Add),
2491                               Start.get()->IgnoreImplicit(), Update.get());
2492   if (!Update.isUsable())
2493     return ExprError();
2494 
2495   Update = SemaRef.PerformImplicitConversion(
2496       Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true);
2497   if (!Update.isUsable())
2498     return ExprError();
2499 
2500   Update = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), Update.get());
2501   return Update;
2502 }
2503 
2504 /// \brief Convert integer expression \a E to make it have at least \a Bits
2505 /// bits.
2506 static ExprResult WidenIterationCount(unsigned Bits, Expr *E,
2507                                       Sema &SemaRef) {
2508   if (E == nullptr)
2509     return ExprError();
2510   auto &C = SemaRef.Context;
2511   QualType OldType = E->getType();
2512   unsigned HasBits = C.getTypeSize(OldType);
2513   if (HasBits >= Bits)
2514     return ExprResult(E);
2515   // OK to convert to signed, because new type has more bits than old.
2516   QualType NewType = C.getIntTypeForBitwidth(Bits, /* Signed */ true);
2517   return SemaRef.PerformImplicitConversion(E, NewType, Sema::AA_Converting,
2518                                            true);
2519 }
2520 
2521 /// \brief Check if the given expression \a E is a constant integer that fits
2522 /// into \a Bits bits.
2523 static bool FitsInto(unsigned Bits, bool Signed, Expr *E, Sema &SemaRef) {
2524   if (E == nullptr)
2525     return false;
2526   llvm::APSInt Result;
2527   if (E->isIntegerConstantExpr(Result, SemaRef.Context))
2528     return Signed ? Result.isSignedIntN(Bits) : Result.isIntN(Bits);
2529   return false;
2530 }
2531 
2532 /// \brief Called on a for stmt to check itself and nested loops (if any).
2533 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop,
2534 /// number of collapsed loops otherwise.
2535 static unsigned
2536 CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr,
2537                 Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA,
2538                 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA,
2539                 BuiltLoopExprs &Built) {
2540   unsigned NestedLoopCount = 1;
2541   if (NestedLoopCountExpr) {
2542     // Found 'collapse' clause - calculate collapse number.
2543     llvm::APSInt Result;
2544     if (NestedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
2545       NestedLoopCount = Result.getLimitedValue();
2546   }
2547   // This is helper routine for loop directives (e.g., 'for', 'simd',
2548   // 'for simd', etc.).
2549   SmallVector<LoopIterationSpace, 4> IterSpaces;
2550   IterSpaces.resize(NestedLoopCount);
2551   Stmt *CurStmt = AStmt->IgnoreContainers(/* IgnoreCaptured */ true);
2552   for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) {
2553     if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt,
2554                                   NestedLoopCount, NestedLoopCountExpr,
2555                                   VarsWithImplicitDSA, IterSpaces[Cnt]))
2556       return 0;
2557     // Move on to the next nested for loop, or to the loop body.
2558     // OpenMP [2.8.1, simd construct, Restrictions]
2559     // All loops associated with the construct must be perfectly nested; that
2560     // is, there must be no intervening code nor any OpenMP directive between
2561     // any two loops.
2562     CurStmt = cast<ForStmt>(CurStmt)->getBody()->IgnoreContainers();
2563   }
2564 
2565   Built.clear(/* size */ NestedLoopCount);
2566 
2567   if (SemaRef.CurContext->isDependentContext())
2568     return NestedLoopCount;
2569 
2570   // An example of what is generated for the following code:
2571   //
2572   //   #pragma omp simd collapse(2)
2573   //   for (i = 0; i < NI; ++i)
2574   //     for (j = J0; j < NJ; j+=2) {
2575   //     <loop body>
2576   //   }
2577   //
2578   // We generate the code below.
2579   // Note: the loop body may be outlined in CodeGen.
2580   // Note: some counters may be C++ classes, operator- is used to find number of
2581   // iterations and operator+= to calculate counter value.
2582   // Note: decltype(NumIterations) must be integer type (in 'omp for', only i32
2583   // or i64 is currently supported).
2584   //
2585   //   #define NumIterations (NI * ((NJ - J0 - 1 + 2) / 2))
2586   //   for (int[32|64]_t IV = 0; IV < NumIterations; ++IV ) {
2587   //     .local.i = IV / ((NJ - J0 - 1 + 2) / 2);
2588   //     .local.j = J0 + (IV % ((NJ - J0 - 1 + 2) / 2)) * 2;
2589   //     // similar updates for vars in clauses (e.g. 'linear')
2590   //     <loop body (using local i and j)>
2591   //   }
2592   //   i = NI; // assign final values of counters
2593   //   j = NJ;
2594   //
2595 
2596   // Last iteration number is (I1 * I2 * ... In) - 1, where I1, I2 ... In are
2597   // the iteration counts of the collapsed for loops.
2598   auto N0 = IterSpaces[0].NumIterations;
2599   ExprResult LastIteration32 = WidenIterationCount(32 /* Bits */, N0, SemaRef);
2600   ExprResult LastIteration64 = WidenIterationCount(64 /* Bits */, N0, SemaRef);
2601 
2602   if (!LastIteration32.isUsable() || !LastIteration64.isUsable())
2603     return NestedLoopCount;
2604 
2605   auto &C = SemaRef.Context;
2606   bool AllCountsNeedLessThan32Bits = C.getTypeSize(N0->getType()) < 32;
2607 
2608   Scope *CurScope = DSA.getCurScope();
2609   for (unsigned Cnt = 1; Cnt < NestedLoopCount; ++Cnt) {
2610     auto N = IterSpaces[Cnt].NumIterations;
2611     AllCountsNeedLessThan32Bits &= C.getTypeSize(N->getType()) < 32;
2612     if (LastIteration32.isUsable())
2613       LastIteration32 = SemaRef.BuildBinOp(CurScope, SourceLocation(), BO_Mul,
2614                                            LastIteration32.get(), N);
2615     if (LastIteration64.isUsable())
2616       LastIteration64 = SemaRef.BuildBinOp(CurScope, SourceLocation(), BO_Mul,
2617                                            LastIteration64.get(), N);
2618   }
2619 
2620   // Choose either the 32-bit or 64-bit version.
2621   ExprResult LastIteration = LastIteration64;
2622   if (LastIteration32.isUsable() &&
2623       C.getTypeSize(LastIteration32.get()->getType()) == 32 &&
2624       (AllCountsNeedLessThan32Bits || NestedLoopCount == 1 ||
2625        FitsInto(
2626            32 /* Bits */,
2627            LastIteration32.get()->getType()->hasSignedIntegerRepresentation(),
2628            LastIteration64.get(), SemaRef)))
2629     LastIteration = LastIteration32;
2630 
2631   if (!LastIteration.isUsable())
2632     return 0;
2633 
2634   // Save the number of iterations.
2635   ExprResult NumIterations = LastIteration;
2636   {
2637     LastIteration = SemaRef.BuildBinOp(
2638         CurScope, SourceLocation(), BO_Sub, LastIteration.get(),
2639         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
2640     if (!LastIteration.isUsable())
2641       return 0;
2642   }
2643 
2644   // Calculate the last iteration number beforehand instead of doing this on
2645   // each iteration. Do not do this if the number of iterations may be kfold-ed.
2646   llvm::APSInt Result;
2647   bool IsConstant =
2648       LastIteration.get()->isIntegerConstantExpr(Result, SemaRef.Context);
2649   ExprResult CalcLastIteration;
2650   if (!IsConstant) {
2651     SourceLocation SaveLoc;
2652     VarDecl *SaveVar =
2653         BuildVarDecl(SemaRef, SaveLoc, LastIteration.get()->getType(),
2654                      ".omp.last.iteration");
2655     ExprResult SaveRef = SemaRef.BuildDeclRefExpr(
2656         SaveVar, LastIteration.get()->getType(), VK_LValue, SaveLoc);
2657     CalcLastIteration = SemaRef.BuildBinOp(CurScope, SaveLoc, BO_Assign,
2658                                            SaveRef.get(), LastIteration.get());
2659     LastIteration = SaveRef;
2660 
2661     // Prepare SaveRef + 1.
2662     NumIterations = SemaRef.BuildBinOp(
2663         CurScope, SaveLoc, BO_Add, SaveRef.get(),
2664         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
2665     if (!NumIterations.isUsable())
2666       return 0;
2667   }
2668 
2669   SourceLocation InitLoc = IterSpaces[0].InitSrcRange.getBegin();
2670 
2671   // Precondition tests if there is at least one iteration (LastIteration > 0).
2672   ExprResult PreCond = SemaRef.BuildBinOp(
2673       CurScope, InitLoc, BO_GT, LastIteration.get(),
2674       SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get());
2675 
2676   // Build the iteration variable and its initialization to zero before loop.
2677   ExprResult IV;
2678   ExprResult Init;
2679   {
2680     VarDecl *IVDecl = BuildVarDecl(SemaRef, InitLoc,
2681                                    LastIteration.get()->getType(), ".omp.iv");
2682     IV = SemaRef.BuildDeclRefExpr(IVDecl, LastIteration.get()->getType(),
2683                                   VK_LValue, InitLoc);
2684     Init = SemaRef.BuildBinOp(
2685         CurScope, InitLoc, BO_Assign, IV.get(),
2686         SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get());
2687   }
2688 
2689   // Loop condition (IV < NumIterations)
2690   SourceLocation CondLoc;
2691   ExprResult Cond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
2692                                        NumIterations.get());
2693   // Loop condition with 1 iteration separated (IV < LastIteration)
2694   ExprResult SeparatedCond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT,
2695                                                 IV.get(), LastIteration.get());
2696 
2697   // Loop increment (IV = IV + 1)
2698   SourceLocation IncLoc;
2699   ExprResult Inc =
2700       SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, IV.get(),
2701                          SemaRef.ActOnIntegerConstant(IncLoc, 1).get());
2702   if (!Inc.isUsable())
2703     return 0;
2704   Inc = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, IV.get(), Inc.get());
2705 
2706   // Build updates and final values of the loop counters.
2707   bool HasErrors = false;
2708   Built.Counters.resize(NestedLoopCount);
2709   Built.Updates.resize(NestedLoopCount);
2710   Built.Finals.resize(NestedLoopCount);
2711   {
2712     ExprResult Div;
2713     // Go from inner nested loop to outer.
2714     for (int Cnt = NestedLoopCount - 1; Cnt >= 0; --Cnt) {
2715       LoopIterationSpace &IS = IterSpaces[Cnt];
2716       SourceLocation UpdLoc = IS.IncSrcRange.getBegin();
2717       // Build: Iter = (IV / Div) % IS.NumIters
2718       // where Div is product of previous iterations' IS.NumIters.
2719       ExprResult Iter;
2720       if (Div.isUsable()) {
2721         Iter =
2722             SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Div, IV.get(), Div.get());
2723       } else {
2724         Iter = IV;
2725         assert((Cnt == (int)NestedLoopCount - 1) &&
2726                "unusable div expected on first iteration only");
2727       }
2728 
2729       if (Cnt != 0 && Iter.isUsable())
2730         Iter = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Rem, Iter.get(),
2731                                   IS.NumIterations);
2732       if (!Iter.isUsable()) {
2733         HasErrors = true;
2734         break;
2735       }
2736 
2737       // Build update: IS.CounterVar = IS.Start + Iter * IS.Step
2738       ExprResult Update =
2739           BuildCounterUpdate(SemaRef, CurScope, UpdLoc, IS.CounterVar,
2740                              IS.CounterInit, Iter, IS.CounterStep, IS.Subtract);
2741       if (!Update.isUsable()) {
2742         HasErrors = true;
2743         break;
2744       }
2745 
2746       // Build final: IS.CounterVar = IS.Start + IS.NumIters * IS.Step
2747       ExprResult Final = BuildCounterUpdate(
2748           SemaRef, CurScope, UpdLoc, IS.CounterVar, IS.CounterInit,
2749           IS.NumIterations, IS.CounterStep, IS.Subtract);
2750       if (!Final.isUsable()) {
2751         HasErrors = true;
2752         break;
2753       }
2754 
2755       // Build Div for the next iteration: Div <- Div * IS.NumIters
2756       if (Cnt != 0) {
2757         if (Div.isUnset())
2758           Div = IS.NumIterations;
2759         else
2760           Div = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Mul, Div.get(),
2761                                    IS.NumIterations);
2762 
2763         // Add parentheses (for debugging purposes only).
2764         if (Div.isUsable())
2765           Div = SemaRef.ActOnParenExpr(UpdLoc, UpdLoc, Div.get());
2766         if (!Div.isUsable()) {
2767           HasErrors = true;
2768           break;
2769         }
2770       }
2771       if (!Update.isUsable() || !Final.isUsable()) {
2772         HasErrors = true;
2773         break;
2774       }
2775       // Save results
2776       Built.Counters[Cnt] = IS.CounterVar;
2777       Built.Updates[Cnt] = Update.get();
2778       Built.Finals[Cnt] = Final.get();
2779     }
2780   }
2781 
2782   if (HasErrors)
2783     return 0;
2784 
2785   // Save results
2786   Built.IterationVarRef = IV.get();
2787   Built.LastIteration = LastIteration.get();
2788   Built.CalcLastIteration = CalcLastIteration.get();
2789   Built.PreCond = PreCond.get();
2790   Built.Cond = Cond.get();
2791   Built.SeparatedCond = SeparatedCond.get();
2792   Built.Init = Init.get();
2793   Built.Inc = Inc.get();
2794 
2795   return NestedLoopCount;
2796 }
2797 
2798 static Expr *GetCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) {
2799   auto CollapseFilter = [](const OMPClause *C) -> bool {
2800     return C->getClauseKind() == OMPC_collapse;
2801   };
2802   OMPExecutableDirective::filtered_clause_iterator<decltype(CollapseFilter)> I(
2803       Clauses, CollapseFilter);
2804   if (I)
2805     return cast<OMPCollapseClause>(*I)->getNumForLoops();
2806   return nullptr;
2807 }
2808 
2809 StmtResult Sema::ActOnOpenMPSimdDirective(
2810     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2811     SourceLocation EndLoc,
2812     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2813   BuiltLoopExprs B;
2814   // In presence of clause 'collapse', it will define the nested loops number.
2815   unsigned NestedLoopCount =
2816       CheckOpenMPLoop(OMPD_simd, GetCollapseNumberExpr(Clauses), AStmt, *this,
2817                       *DSAStack, VarsWithImplicitDSA, B);
2818   if (NestedLoopCount == 0)
2819     return StmtError();
2820 
2821   assert((CurContext->isDependentContext() || B.builtAll()) &&
2822          "omp simd loop exprs were not built");
2823 
2824   getCurFunction()->setHasBranchProtectedScope();
2825   return OMPSimdDirective::Create(
2826       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt,
2827       B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond,
2828       B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals);
2829 }
2830 
2831 StmtResult Sema::ActOnOpenMPForDirective(
2832     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2833     SourceLocation EndLoc,
2834     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2835   BuiltLoopExprs B;
2836   // In presence of clause 'collapse', it will define the nested loops number.
2837   unsigned NestedLoopCount =
2838       CheckOpenMPLoop(OMPD_for, GetCollapseNumberExpr(Clauses), AStmt, *this,
2839                       *DSAStack, VarsWithImplicitDSA, B);
2840   if (NestedLoopCount == 0)
2841     return StmtError();
2842 
2843   assert((CurContext->isDependentContext() || B.builtAll()) &&
2844          "omp for loop exprs were not built");
2845 
2846   getCurFunction()->setHasBranchProtectedScope();
2847   return OMPForDirective::Create(
2848       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt,
2849       B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond,
2850       B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals);
2851 }
2852 
2853 StmtResult Sema::ActOnOpenMPForSimdDirective(
2854     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2855     SourceLocation EndLoc,
2856     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2857   BuiltLoopExprs B;
2858   // In presence of clause 'collapse', it will define the nested loops number.
2859   unsigned NestedLoopCount =
2860       CheckOpenMPLoop(OMPD_for_simd, GetCollapseNumberExpr(Clauses), AStmt,
2861                       *this, *DSAStack, VarsWithImplicitDSA, B);
2862   if (NestedLoopCount == 0)
2863     return StmtError();
2864 
2865   getCurFunction()->setHasBranchProtectedScope();
2866   return OMPForSimdDirective::Create(
2867       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt,
2868       B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond,
2869       B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals);
2870 }
2871 
2872 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
2873                                               Stmt *AStmt,
2874                                               SourceLocation StartLoc,
2875                                               SourceLocation EndLoc) {
2876   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2877   auto BaseStmt = AStmt;
2878   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
2879     BaseStmt = CS->getCapturedStmt();
2880   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
2881     auto S = C->children();
2882     if (!S)
2883       return StmtError();
2884     // All associated statements must be '#pragma omp section' except for
2885     // the first one.
2886     for (++S; S; ++S) {
2887       auto SectionStmt = *S;
2888       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
2889         if (SectionStmt)
2890           Diag(SectionStmt->getLocStart(),
2891                diag::err_omp_sections_substmt_not_section);
2892         return StmtError();
2893       }
2894     }
2895   } else {
2896     Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt);
2897     return StmtError();
2898   }
2899 
2900   getCurFunction()->setHasBranchProtectedScope();
2901 
2902   return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses,
2903                                       AStmt);
2904 }
2905 
2906 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
2907                                              SourceLocation StartLoc,
2908                                              SourceLocation EndLoc) {
2909   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2910 
2911   getCurFunction()->setHasBranchProtectedScope();
2912 
2913   return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt);
2914 }
2915 
2916 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
2917                                             Stmt *AStmt,
2918                                             SourceLocation StartLoc,
2919                                             SourceLocation EndLoc) {
2920   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2921 
2922   getCurFunction()->setHasBranchProtectedScope();
2923 
2924   return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
2925 }
2926 
2927 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt,
2928                                             SourceLocation StartLoc,
2929                                             SourceLocation EndLoc) {
2930   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2931 
2932   getCurFunction()->setHasBranchProtectedScope();
2933 
2934   return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt);
2935 }
2936 
2937 StmtResult
2938 Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName,
2939                                    Stmt *AStmt, SourceLocation StartLoc,
2940                                    SourceLocation EndLoc) {
2941   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2942 
2943   getCurFunction()->setHasBranchProtectedScope();
2944 
2945   return OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc,
2946                                       AStmt);
2947 }
2948 
2949 StmtResult Sema::ActOnOpenMPParallelForDirective(
2950     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2951     SourceLocation EndLoc,
2952     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2953   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2954   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2955   // 1.2.2 OpenMP Language Terminology
2956   // Structured block - An executable statement with a single entry at the
2957   // top and a single exit at the bottom.
2958   // The point of exit cannot be a branch out of the structured block.
2959   // longjmp() and throw() must not violate the entry/exit criteria.
2960   CS->getCapturedDecl()->setNothrow();
2961 
2962   BuiltLoopExprs B;
2963   // In presence of clause 'collapse', it will define the nested loops number.
2964   unsigned NestedLoopCount =
2965       CheckOpenMPLoop(OMPD_parallel_for, GetCollapseNumberExpr(Clauses), AStmt,
2966                       *this, *DSAStack, VarsWithImplicitDSA, B);
2967   if (NestedLoopCount == 0)
2968     return StmtError();
2969 
2970   assert((CurContext->isDependentContext() || B.builtAll()) &&
2971          "omp parallel for loop exprs were not built");
2972 
2973   getCurFunction()->setHasBranchProtectedScope();
2974   return OMPParallelForDirective::Create(
2975       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt,
2976       B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond,
2977       B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals);
2978 }
2979 
2980 StmtResult Sema::ActOnOpenMPParallelForSimdDirective(
2981     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2982     SourceLocation EndLoc,
2983     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2984   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2985   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2986   // 1.2.2 OpenMP Language Terminology
2987   // Structured block - An executable statement with a single entry at the
2988   // top and a single exit at the bottom.
2989   // The point of exit cannot be a branch out of the structured block.
2990   // longjmp() and throw() must not violate the entry/exit criteria.
2991   CS->getCapturedDecl()->setNothrow();
2992 
2993   BuiltLoopExprs B;
2994   // In presence of clause 'collapse', it will define the nested loops number.
2995   unsigned NestedLoopCount =
2996       CheckOpenMPLoop(OMPD_parallel_for_simd, GetCollapseNumberExpr(Clauses),
2997                       AStmt, *this, *DSAStack, VarsWithImplicitDSA, B);
2998   if (NestedLoopCount == 0)
2999     return StmtError();
3000 
3001   getCurFunction()->setHasBranchProtectedScope();
3002   return OMPParallelForSimdDirective::Create(
3003       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt,
3004       B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond,
3005       B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals);
3006 }
3007 
3008 StmtResult
3009 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
3010                                            Stmt *AStmt, SourceLocation StartLoc,
3011                                            SourceLocation EndLoc) {
3012   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3013   auto BaseStmt = AStmt;
3014   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
3015     BaseStmt = CS->getCapturedStmt();
3016   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
3017     auto S = C->children();
3018     if (!S)
3019       return StmtError();
3020     // All associated statements must be '#pragma omp section' except for
3021     // the first one.
3022     for (++S; S; ++S) {
3023       auto SectionStmt = *S;
3024       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
3025         if (SectionStmt)
3026           Diag(SectionStmt->getLocStart(),
3027                diag::err_omp_parallel_sections_substmt_not_section);
3028         return StmtError();
3029       }
3030     }
3031   } else {
3032     Diag(AStmt->getLocStart(),
3033          diag::err_omp_parallel_sections_not_compound_stmt);
3034     return StmtError();
3035   }
3036 
3037   getCurFunction()->setHasBranchProtectedScope();
3038 
3039   return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc,
3040                                               Clauses, AStmt);
3041 }
3042 
3043 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
3044                                           Stmt *AStmt, SourceLocation StartLoc,
3045                                           SourceLocation EndLoc) {
3046   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3047   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
3048   // 1.2.2 OpenMP Language Terminology
3049   // Structured block - An executable statement with a single entry at the
3050   // top and a single exit at the bottom.
3051   // The point of exit cannot be a branch out of the structured block.
3052   // longjmp() and throw() must not violate the entry/exit criteria.
3053   CS->getCapturedDecl()->setNothrow();
3054 
3055   getCurFunction()->setHasBranchProtectedScope();
3056 
3057   return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
3058 }
3059 
3060 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
3061                                                SourceLocation EndLoc) {
3062   return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc);
3063 }
3064 
3065 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc,
3066                                              SourceLocation EndLoc) {
3067   return OMPBarrierDirective::Create(Context, StartLoc, EndLoc);
3068 }
3069 
3070 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc,
3071                                               SourceLocation EndLoc) {
3072   return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc);
3073 }
3074 
3075 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses,
3076                                            SourceLocation StartLoc,
3077                                            SourceLocation EndLoc) {
3078   assert(Clauses.size() <= 1 && "Extra clauses in flush directive");
3079   return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses);
3080 }
3081 
3082 StmtResult Sema::ActOnOpenMPOrderedDirective(Stmt *AStmt,
3083                                              SourceLocation StartLoc,
3084                                              SourceLocation EndLoc) {
3085   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3086 
3087   getCurFunction()->setHasBranchProtectedScope();
3088 
3089   return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, AStmt);
3090 }
3091 
3092 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses,
3093                                             Stmt *AStmt,
3094                                             SourceLocation StartLoc,
3095                                             SourceLocation EndLoc) {
3096   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3097   auto CS = cast<CapturedStmt>(AStmt);
3098   // 1.2.2 OpenMP Language Terminology
3099   // Structured block - An executable statement with a single entry at the
3100   // top and a single exit at the bottom.
3101   // The point of exit cannot be a branch out of the structured block.
3102   // longjmp() and throw() must not violate the entry/exit criteria.
3103   // TODO further analysis of associated statements and clauses.
3104   OpenMPClauseKind AtomicKind = OMPC_unknown;
3105   SourceLocation AtomicKindLoc;
3106   for (auto *C : Clauses) {
3107     if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write ||
3108         C->getClauseKind() == OMPC_update ||
3109         C->getClauseKind() == OMPC_capture) {
3110       if (AtomicKind != OMPC_unknown) {
3111         Diag(C->getLocStart(), diag::err_omp_atomic_several_clauses)
3112             << SourceRange(C->getLocStart(), C->getLocEnd());
3113         Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause)
3114             << getOpenMPClauseName(AtomicKind);
3115       } else {
3116         AtomicKind = C->getClauseKind();
3117         AtomicKindLoc = C->getLocStart();
3118       }
3119     }
3120   }
3121   auto Body = CS->getCapturedStmt();
3122   if (AtomicKind == OMPC_read) {
3123     if (!isa<Expr>(Body)) {
3124       Diag(Body->getLocStart(),
3125            diag::err_omp_atomic_read_not_expression_statement);
3126       return StmtError();
3127     }
3128   } else if (AtomicKind == OMPC_write) {
3129     if (!isa<Expr>(Body)) {
3130       Diag(Body->getLocStart(),
3131            diag::err_omp_atomic_write_not_expression_statement);
3132       return StmtError();
3133     }
3134   } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {
3135     if (!isa<Expr>(Body)) {
3136       Diag(Body->getLocStart(),
3137            diag::err_omp_atomic_update_not_expression_statement)
3138           << (AtomicKind == OMPC_update);
3139       return StmtError();
3140     }
3141   } else if (AtomicKind == OMPC_capture) {
3142     if (isa<Expr>(Body) && !isa<BinaryOperator>(Body)) {
3143       Diag(Body->getLocStart(),
3144            diag::err_omp_atomic_capture_not_expression_statement);
3145       return StmtError();
3146     } else if (!isa<Expr>(Body) && !isa<CompoundStmt>(Body)) {
3147       Diag(Body->getLocStart(),
3148            diag::err_omp_atomic_capture_not_compound_statement);
3149       return StmtError();
3150     }
3151   }
3152 
3153   getCurFunction()->setHasBranchProtectedScope();
3154 
3155   return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
3156 }
3157 
3158 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses,
3159                                             Stmt *AStmt,
3160                                             SourceLocation StartLoc,
3161                                             SourceLocation EndLoc) {
3162   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
3163 
3164   getCurFunction()->setHasBranchProtectedScope();
3165 
3166   return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
3167 }
3168 
3169 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
3170                                              SourceLocation StartLoc,
3171                                              SourceLocation LParenLoc,
3172                                              SourceLocation EndLoc) {
3173   OMPClause *Res = nullptr;
3174   switch (Kind) {
3175   case OMPC_if:
3176     Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc);
3177     break;
3178   case OMPC_final:
3179     Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc);
3180     break;
3181   case OMPC_num_threads:
3182     Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc);
3183     break;
3184   case OMPC_safelen:
3185     Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc);
3186     break;
3187   case OMPC_collapse:
3188     Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc);
3189     break;
3190   case OMPC_default:
3191   case OMPC_proc_bind:
3192   case OMPC_schedule:
3193   case OMPC_private:
3194   case OMPC_firstprivate:
3195   case OMPC_lastprivate:
3196   case OMPC_shared:
3197   case OMPC_reduction:
3198   case OMPC_linear:
3199   case OMPC_aligned:
3200   case OMPC_copyin:
3201   case OMPC_copyprivate:
3202   case OMPC_ordered:
3203   case OMPC_nowait:
3204   case OMPC_untied:
3205   case OMPC_mergeable:
3206   case OMPC_threadprivate:
3207   case OMPC_flush:
3208   case OMPC_read:
3209   case OMPC_write:
3210   case OMPC_update:
3211   case OMPC_capture:
3212   case OMPC_seq_cst:
3213   case OMPC_unknown:
3214     llvm_unreachable("Clause is not allowed.");
3215   }
3216   return Res;
3217 }
3218 
3219 OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, SourceLocation StartLoc,
3220                                      SourceLocation LParenLoc,
3221                                      SourceLocation EndLoc) {
3222   Expr *ValExpr = Condition;
3223   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
3224       !Condition->isInstantiationDependent() &&
3225       !Condition->containsUnexpandedParameterPack()) {
3226     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
3227                                            Condition->getExprLoc(), Condition);
3228     if (Val.isInvalid())
3229       return nullptr;
3230 
3231     ValExpr = Val.get();
3232   }
3233 
3234   return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc);
3235 }
3236 
3237 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition,
3238                                         SourceLocation StartLoc,
3239                                         SourceLocation LParenLoc,
3240                                         SourceLocation EndLoc) {
3241   Expr *ValExpr = Condition;
3242   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
3243       !Condition->isInstantiationDependent() &&
3244       !Condition->containsUnexpandedParameterPack()) {
3245     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
3246                                            Condition->getExprLoc(), Condition);
3247     if (Val.isInvalid())
3248       return nullptr;
3249 
3250     ValExpr = Val.get();
3251   }
3252 
3253   return new (Context) OMPFinalClause(ValExpr, StartLoc, LParenLoc, EndLoc);
3254 }
3255 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc,
3256                                                         Expr *Op) {
3257   if (!Op)
3258     return ExprError();
3259 
3260   class IntConvertDiagnoser : public ICEConvertDiagnoser {
3261   public:
3262     IntConvertDiagnoser()
3263         : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {}
3264     SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
3265                                          QualType T) override {
3266       return S.Diag(Loc, diag::err_omp_not_integral) << T;
3267     }
3268     SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
3269                                              QualType T) override {
3270       return S.Diag(Loc, diag::err_omp_incomplete_type) << T;
3271     }
3272     SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
3273                                                QualType T,
3274                                                QualType ConvTy) override {
3275       return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy;
3276     }
3277     SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
3278                                            QualType ConvTy) override {
3279       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
3280              << ConvTy->isEnumeralType() << ConvTy;
3281     }
3282     SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
3283                                             QualType T) override {
3284       return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T;
3285     }
3286     SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
3287                                         QualType ConvTy) override {
3288       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
3289              << ConvTy->isEnumeralType() << ConvTy;
3290     }
3291     SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType,
3292                                              QualType) override {
3293       llvm_unreachable("conversion functions are permitted");
3294     }
3295   } ConvertDiagnoser;
3296   return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
3297 }
3298 
3299 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
3300                                              SourceLocation StartLoc,
3301                                              SourceLocation LParenLoc,
3302                                              SourceLocation EndLoc) {
3303   Expr *ValExpr = NumThreads;
3304   if (!NumThreads->isValueDependent() && !NumThreads->isTypeDependent() &&
3305       !NumThreads->isInstantiationDependent() &&
3306       !NumThreads->containsUnexpandedParameterPack()) {
3307     SourceLocation NumThreadsLoc = NumThreads->getLocStart();
3308     ExprResult Val =
3309         PerformOpenMPImplicitIntegerConversion(NumThreadsLoc, NumThreads);
3310     if (Val.isInvalid())
3311       return nullptr;
3312 
3313     ValExpr = Val.get();
3314 
3315     // OpenMP [2.5, Restrictions]
3316     //  The num_threads expression must evaluate to a positive integer value.
3317     llvm::APSInt Result;
3318     if (ValExpr->isIntegerConstantExpr(Result, Context) && Result.isSigned() &&
3319         !Result.isStrictlyPositive()) {
3320       Diag(NumThreadsLoc, diag::err_omp_negative_expression_in_clause)
3321           << "num_threads" << NumThreads->getSourceRange();
3322       return nullptr;
3323     }
3324   }
3325 
3326   return new (Context)
3327       OMPNumThreadsClause(ValExpr, StartLoc, LParenLoc, EndLoc);
3328 }
3329 
3330 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E,
3331                                                        OpenMPClauseKind CKind) {
3332   if (!E)
3333     return ExprError();
3334   if (E->isValueDependent() || E->isTypeDependent() ||
3335       E->isInstantiationDependent() || E->containsUnexpandedParameterPack())
3336     return E;
3337   llvm::APSInt Result;
3338   ExprResult ICE = VerifyIntegerConstantExpression(E, &Result);
3339   if (ICE.isInvalid())
3340     return ExprError();
3341   if (!Result.isStrictlyPositive()) {
3342     Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause)
3343         << getOpenMPClauseName(CKind) << E->getSourceRange();
3344     return ExprError();
3345   }
3346   if (CKind == OMPC_aligned && !Result.isPowerOf2()) {
3347     Diag(E->getExprLoc(), diag::warn_omp_alignment_not_power_of_two)
3348         << E->getSourceRange();
3349     return ExprError();
3350   }
3351   return ICE;
3352 }
3353 
3354 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc,
3355                                           SourceLocation LParenLoc,
3356                                           SourceLocation EndLoc) {
3357   // OpenMP [2.8.1, simd construct, Description]
3358   // The parameter of the safelen clause must be a constant
3359   // positive integer expression.
3360   ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen);
3361   if (Safelen.isInvalid())
3362     return nullptr;
3363   return new (Context)
3364       OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc);
3365 }
3366 
3367 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops,
3368                                            SourceLocation StartLoc,
3369                                            SourceLocation LParenLoc,
3370                                            SourceLocation EndLoc) {
3371   // OpenMP [2.7.1, loop construct, Description]
3372   // OpenMP [2.8.1, simd construct, Description]
3373   // OpenMP [2.9.6, distribute construct, Description]
3374   // The parameter of the collapse clause must be a constant
3375   // positive integer expression.
3376   ExprResult NumForLoopsResult =
3377       VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse);
3378   if (NumForLoopsResult.isInvalid())
3379     return nullptr;
3380   return new (Context)
3381       OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc);
3382 }
3383 
3384 OMPClause *Sema::ActOnOpenMPSimpleClause(
3385     OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc,
3386     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
3387   OMPClause *Res = nullptr;
3388   switch (Kind) {
3389   case OMPC_default:
3390     Res =
3391         ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument),
3392                                  ArgumentLoc, StartLoc, LParenLoc, EndLoc);
3393     break;
3394   case OMPC_proc_bind:
3395     Res = ActOnOpenMPProcBindClause(
3396         static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc,
3397         LParenLoc, EndLoc);
3398     break;
3399   case OMPC_if:
3400   case OMPC_final:
3401   case OMPC_num_threads:
3402   case OMPC_safelen:
3403   case OMPC_collapse:
3404   case OMPC_schedule:
3405   case OMPC_private:
3406   case OMPC_firstprivate:
3407   case OMPC_lastprivate:
3408   case OMPC_shared:
3409   case OMPC_reduction:
3410   case OMPC_linear:
3411   case OMPC_aligned:
3412   case OMPC_copyin:
3413   case OMPC_copyprivate:
3414   case OMPC_ordered:
3415   case OMPC_nowait:
3416   case OMPC_untied:
3417   case OMPC_mergeable:
3418   case OMPC_threadprivate:
3419   case OMPC_flush:
3420   case OMPC_read:
3421   case OMPC_write:
3422   case OMPC_update:
3423   case OMPC_capture:
3424   case OMPC_seq_cst:
3425   case OMPC_unknown:
3426     llvm_unreachable("Clause is not allowed.");
3427   }
3428   return Res;
3429 }
3430 
3431 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind,
3432                                           SourceLocation KindKwLoc,
3433                                           SourceLocation StartLoc,
3434                                           SourceLocation LParenLoc,
3435                                           SourceLocation EndLoc) {
3436   if (Kind == OMPC_DEFAULT_unknown) {
3437     std::string Values;
3438     static_assert(OMPC_DEFAULT_unknown > 0,
3439                   "OMPC_DEFAULT_unknown not greater than 0");
3440     std::string Sep(", ");
3441     for (unsigned i = 0; i < OMPC_DEFAULT_unknown; ++i) {
3442       Values += "'";
3443       Values += getOpenMPSimpleClauseTypeName(OMPC_default, i);
3444       Values += "'";
3445       switch (i) {
3446       case OMPC_DEFAULT_unknown - 2:
3447         Values += " or ";
3448         break;
3449       case OMPC_DEFAULT_unknown - 1:
3450         break;
3451       default:
3452         Values += Sep;
3453         break;
3454       }
3455     }
3456     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
3457         << Values << getOpenMPClauseName(OMPC_default);
3458     return nullptr;
3459   }
3460   switch (Kind) {
3461   case OMPC_DEFAULT_none:
3462     DSAStack->setDefaultDSANone(KindKwLoc);
3463     break;
3464   case OMPC_DEFAULT_shared:
3465     DSAStack->setDefaultDSAShared(KindKwLoc);
3466     break;
3467   case OMPC_DEFAULT_unknown:
3468     llvm_unreachable("Clause kind is not allowed.");
3469     break;
3470   }
3471   return new (Context)
3472       OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
3473 }
3474 
3475 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind,
3476                                            SourceLocation KindKwLoc,
3477                                            SourceLocation StartLoc,
3478                                            SourceLocation LParenLoc,
3479                                            SourceLocation EndLoc) {
3480   if (Kind == OMPC_PROC_BIND_unknown) {
3481     std::string Values;
3482     std::string Sep(", ");
3483     for (unsigned i = 0; i < OMPC_PROC_BIND_unknown; ++i) {
3484       Values += "'";
3485       Values += getOpenMPSimpleClauseTypeName(OMPC_proc_bind, i);
3486       Values += "'";
3487       switch (i) {
3488       case OMPC_PROC_BIND_unknown - 2:
3489         Values += " or ";
3490         break;
3491       case OMPC_PROC_BIND_unknown - 1:
3492         break;
3493       default:
3494         Values += Sep;
3495         break;
3496       }
3497     }
3498     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
3499         << Values << getOpenMPClauseName(OMPC_proc_bind);
3500     return nullptr;
3501   }
3502   return new (Context)
3503       OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
3504 }
3505 
3506 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
3507     OpenMPClauseKind Kind, unsigned Argument, Expr *Expr,
3508     SourceLocation StartLoc, SourceLocation LParenLoc,
3509     SourceLocation ArgumentLoc, SourceLocation CommaLoc,
3510     SourceLocation EndLoc) {
3511   OMPClause *Res = nullptr;
3512   switch (Kind) {
3513   case OMPC_schedule:
3514     Res = ActOnOpenMPScheduleClause(
3515         static_cast<OpenMPScheduleClauseKind>(Argument), Expr, StartLoc,
3516         LParenLoc, ArgumentLoc, CommaLoc, EndLoc);
3517     break;
3518   case OMPC_if:
3519   case OMPC_final:
3520   case OMPC_num_threads:
3521   case OMPC_safelen:
3522   case OMPC_collapse:
3523   case OMPC_default:
3524   case OMPC_proc_bind:
3525   case OMPC_private:
3526   case OMPC_firstprivate:
3527   case OMPC_lastprivate:
3528   case OMPC_shared:
3529   case OMPC_reduction:
3530   case OMPC_linear:
3531   case OMPC_aligned:
3532   case OMPC_copyin:
3533   case OMPC_copyprivate:
3534   case OMPC_ordered:
3535   case OMPC_nowait:
3536   case OMPC_untied:
3537   case OMPC_mergeable:
3538   case OMPC_threadprivate:
3539   case OMPC_flush:
3540   case OMPC_read:
3541   case OMPC_write:
3542   case OMPC_update:
3543   case OMPC_capture:
3544   case OMPC_seq_cst:
3545   case OMPC_unknown:
3546     llvm_unreachable("Clause is not allowed.");
3547   }
3548   return Res;
3549 }
3550 
3551 OMPClause *Sema::ActOnOpenMPScheduleClause(
3552     OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
3553     SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc,
3554     SourceLocation EndLoc) {
3555   if (Kind == OMPC_SCHEDULE_unknown) {
3556     std::string Values;
3557     std::string Sep(", ");
3558     for (unsigned i = 0; i < OMPC_SCHEDULE_unknown; ++i) {
3559       Values += "'";
3560       Values += getOpenMPSimpleClauseTypeName(OMPC_schedule, i);
3561       Values += "'";
3562       switch (i) {
3563       case OMPC_SCHEDULE_unknown - 2:
3564         Values += " or ";
3565         break;
3566       case OMPC_SCHEDULE_unknown - 1:
3567         break;
3568       default:
3569         Values += Sep;
3570         break;
3571       }
3572     }
3573     Diag(KindLoc, diag::err_omp_unexpected_clause_value)
3574         << Values << getOpenMPClauseName(OMPC_schedule);
3575     return nullptr;
3576   }
3577   Expr *ValExpr = ChunkSize;
3578   if (ChunkSize) {
3579     if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() &&
3580         !ChunkSize->isInstantiationDependent() &&
3581         !ChunkSize->containsUnexpandedParameterPack()) {
3582       SourceLocation ChunkSizeLoc = ChunkSize->getLocStart();
3583       ExprResult Val =
3584           PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize);
3585       if (Val.isInvalid())
3586         return nullptr;
3587 
3588       ValExpr = Val.get();
3589 
3590       // OpenMP [2.7.1, Restrictions]
3591       //  chunk_size must be a loop invariant integer expression with a positive
3592       //  value.
3593       llvm::APSInt Result;
3594       if (ValExpr->isIntegerConstantExpr(Result, Context) &&
3595           Result.isSigned() && !Result.isStrictlyPositive()) {
3596         Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause)
3597             << "schedule" << ChunkSize->getSourceRange();
3598         return nullptr;
3599       }
3600     }
3601   }
3602 
3603   return new (Context) OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc,
3604                                          EndLoc, Kind, ValExpr);
3605 }
3606 
3607 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
3608                                    SourceLocation StartLoc,
3609                                    SourceLocation EndLoc) {
3610   OMPClause *Res = nullptr;
3611   switch (Kind) {
3612   case OMPC_ordered:
3613     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc);
3614     break;
3615   case OMPC_nowait:
3616     Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc);
3617     break;
3618   case OMPC_untied:
3619     Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc);
3620     break;
3621   case OMPC_mergeable:
3622     Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc);
3623     break;
3624   case OMPC_read:
3625     Res = ActOnOpenMPReadClause(StartLoc, EndLoc);
3626     break;
3627   case OMPC_write:
3628     Res = ActOnOpenMPWriteClause(StartLoc, EndLoc);
3629     break;
3630   case OMPC_update:
3631     Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc);
3632     break;
3633   case OMPC_capture:
3634     Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc);
3635     break;
3636   case OMPC_seq_cst:
3637     Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc);
3638     break;
3639   case OMPC_if:
3640   case OMPC_final:
3641   case OMPC_num_threads:
3642   case OMPC_safelen:
3643   case OMPC_collapse:
3644   case OMPC_schedule:
3645   case OMPC_private:
3646   case OMPC_firstprivate:
3647   case OMPC_lastprivate:
3648   case OMPC_shared:
3649   case OMPC_reduction:
3650   case OMPC_linear:
3651   case OMPC_aligned:
3652   case OMPC_copyin:
3653   case OMPC_copyprivate:
3654   case OMPC_default:
3655   case OMPC_proc_bind:
3656   case OMPC_threadprivate:
3657   case OMPC_flush:
3658   case OMPC_unknown:
3659     llvm_unreachable("Clause is not allowed.");
3660   }
3661   return Res;
3662 }
3663 
3664 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc,
3665                                           SourceLocation EndLoc) {
3666   DSAStack->setOrderedRegion();
3667   return new (Context) OMPOrderedClause(StartLoc, EndLoc);
3668 }
3669 
3670 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc,
3671                                          SourceLocation EndLoc) {
3672   return new (Context) OMPNowaitClause(StartLoc, EndLoc);
3673 }
3674 
3675 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc,
3676                                          SourceLocation EndLoc) {
3677   return new (Context) OMPUntiedClause(StartLoc, EndLoc);
3678 }
3679 
3680 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc,
3681                                             SourceLocation EndLoc) {
3682   return new (Context) OMPMergeableClause(StartLoc, EndLoc);
3683 }
3684 
3685 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc,
3686                                        SourceLocation EndLoc) {
3687   return new (Context) OMPReadClause(StartLoc, EndLoc);
3688 }
3689 
3690 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc,
3691                                         SourceLocation EndLoc) {
3692   return new (Context) OMPWriteClause(StartLoc, EndLoc);
3693 }
3694 
3695 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc,
3696                                          SourceLocation EndLoc) {
3697   return new (Context) OMPUpdateClause(StartLoc, EndLoc);
3698 }
3699 
3700 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc,
3701                                           SourceLocation EndLoc) {
3702   return new (Context) OMPCaptureClause(StartLoc, EndLoc);
3703 }
3704 
3705 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc,
3706                                          SourceLocation EndLoc) {
3707   return new (Context) OMPSeqCstClause(StartLoc, EndLoc);
3708 }
3709 
3710 OMPClause *Sema::ActOnOpenMPVarListClause(
3711     OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr,
3712     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc,
3713     SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
3714     const DeclarationNameInfo &ReductionId) {
3715   OMPClause *Res = nullptr;
3716   switch (Kind) {
3717   case OMPC_private:
3718     Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3719     break;
3720   case OMPC_firstprivate:
3721     Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3722     break;
3723   case OMPC_lastprivate:
3724     Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3725     break;
3726   case OMPC_shared:
3727     Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc);
3728     break;
3729   case OMPC_reduction:
3730     Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
3731                                      EndLoc, ReductionIdScopeSpec, ReductionId);
3732     break;
3733   case OMPC_linear:
3734     Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc,
3735                                   ColonLoc, EndLoc);
3736     break;
3737   case OMPC_aligned:
3738     Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc,
3739                                    ColonLoc, EndLoc);
3740     break;
3741   case OMPC_copyin:
3742     Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
3743     break;
3744   case OMPC_copyprivate:
3745     Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3746     break;
3747   case OMPC_flush:
3748     Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc);
3749     break;
3750   case OMPC_if:
3751   case OMPC_final:
3752   case OMPC_num_threads:
3753   case OMPC_safelen:
3754   case OMPC_collapse:
3755   case OMPC_default:
3756   case OMPC_proc_bind:
3757   case OMPC_schedule:
3758   case OMPC_ordered:
3759   case OMPC_nowait:
3760   case OMPC_untied:
3761   case OMPC_mergeable:
3762   case OMPC_threadprivate:
3763   case OMPC_read:
3764   case OMPC_write:
3765   case OMPC_update:
3766   case OMPC_capture:
3767   case OMPC_seq_cst:
3768   case OMPC_unknown:
3769     llvm_unreachable("Clause is not allowed.");
3770   }
3771   return Res;
3772 }
3773 
3774 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
3775                                           SourceLocation StartLoc,
3776                                           SourceLocation LParenLoc,
3777                                           SourceLocation EndLoc) {
3778   SmallVector<Expr *, 8> Vars;
3779   for (auto &RefExpr : VarList) {
3780     assert(RefExpr && "NULL expr in OpenMP private clause.");
3781     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3782       // It will be analyzed later.
3783       Vars.push_back(RefExpr);
3784       continue;
3785     }
3786 
3787     SourceLocation ELoc = RefExpr->getExprLoc();
3788     // OpenMP [2.1, C/C++]
3789     //  A list item is a variable name.
3790     // OpenMP  [2.9.3.3, Restrictions, p.1]
3791     //  A variable that is part of another variable (as an array or
3792     //  structure element) cannot appear in a private clause.
3793     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
3794     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3795       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3796       continue;
3797     }
3798     Decl *D = DE->getDecl();
3799     VarDecl *VD = cast<VarDecl>(D);
3800 
3801     QualType Type = VD->getType();
3802     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3803       // It will be analyzed later.
3804       Vars.push_back(DE);
3805       continue;
3806     }
3807 
3808     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3809     //  A variable that appears in a private clause must not have an incomplete
3810     //  type or a reference type.
3811     if (RequireCompleteType(ELoc, Type,
3812                             diag::err_omp_private_incomplete_type)) {
3813       continue;
3814     }
3815     if (Type->isReferenceType()) {
3816       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3817           << getOpenMPClauseName(OMPC_private) << Type;
3818       bool IsDecl =
3819           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3820       Diag(VD->getLocation(),
3821            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3822           << VD;
3823       continue;
3824     }
3825 
3826     // OpenMP [2.9.3.3, Restrictions, C/C++, p.1]
3827     //  A variable of class type (or array thereof) that appears in a private
3828     //  clause requires an accessible, unambiguous default constructor for the
3829     //  class type.
3830     while (Type.getNonReferenceType()->isArrayType()) {
3831       Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr())
3832                  ->getElementType();
3833     }
3834     CXXRecordDecl *RD = getLangOpts().CPlusPlus
3835                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
3836                             : nullptr;
3837     // FIXME This code must be replaced by actual constructing/destructing of
3838     // the private variable.
3839     if (RD) {
3840       CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
3841       PartialDiagnostic PD =
3842           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3843       if (!CD ||
3844           CheckConstructorAccess(ELoc, CD,
3845                                  InitializedEntity::InitializeTemporary(Type),
3846                                  CD->getAccess(), PD) == AR_inaccessible ||
3847           CD->isDeleted()) {
3848         Diag(ELoc, diag::err_omp_required_method)
3849             << getOpenMPClauseName(OMPC_private) << 0;
3850         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3851                       VarDecl::DeclarationOnly;
3852         Diag(VD->getLocation(),
3853              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3854             << VD;
3855         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3856         continue;
3857       }
3858       MarkFunctionReferenced(ELoc, CD);
3859       DiagnoseUseOfDecl(CD, ELoc);
3860 
3861       CXXDestructorDecl *DD = RD->getDestructor();
3862       if (DD) {
3863         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
3864             DD->isDeleted()) {
3865           Diag(ELoc, diag::err_omp_required_method)
3866               << getOpenMPClauseName(OMPC_private) << 4;
3867           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3868                         VarDecl::DeclarationOnly;
3869           Diag(VD->getLocation(),
3870                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3871               << VD;
3872           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3873           continue;
3874         }
3875         MarkFunctionReferenced(ELoc, DD);
3876         DiagnoseUseOfDecl(DD, ELoc);
3877       }
3878     }
3879 
3880     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
3881     // in a Construct]
3882     //  Variables with the predetermined data-sharing attributes may not be
3883     //  listed in data-sharing attributes clauses, except for the cases
3884     //  listed below. For these exceptions only, listing a predetermined
3885     //  variable in a data-sharing attribute clause is allowed and overrides
3886     //  the variable's predetermined data-sharing attributes.
3887     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
3888     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) {
3889       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
3890                                           << getOpenMPClauseName(OMPC_private);
3891       ReportOriginalDSA(*this, DSAStack, VD, DVar);
3892       continue;
3893     }
3894 
3895     DSAStack->addDSA(VD, DE, OMPC_private);
3896     Vars.push_back(DE);
3897   }
3898 
3899   if (Vars.empty())
3900     return nullptr;
3901 
3902   return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
3903 }
3904 
3905 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,
3906                                                SourceLocation StartLoc,
3907                                                SourceLocation LParenLoc,
3908                                                SourceLocation EndLoc) {
3909   SmallVector<Expr *, 8> Vars;
3910   bool IsImplicitClause =
3911       StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid();
3912   auto ImplicitClauseLoc = DSAStack->getConstructLoc();
3913 
3914   for (auto &RefExpr : VarList) {
3915     assert(RefExpr && "NULL expr in OpenMP firstprivate clause.");
3916     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3917       // It will be analyzed later.
3918       Vars.push_back(RefExpr);
3919       continue;
3920     }
3921 
3922     SourceLocation ELoc = IsImplicitClause ? ImplicitClauseLoc
3923                                            : RefExpr->getExprLoc();
3924     // OpenMP [2.1, C/C++]
3925     //  A list item is a variable name.
3926     // OpenMP  [2.9.3.3, Restrictions, p.1]
3927     //  A variable that is part of another variable (as an array or
3928     //  structure element) cannot appear in a private clause.
3929     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
3930     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3931       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3932       continue;
3933     }
3934     Decl *D = DE->getDecl();
3935     VarDecl *VD = cast<VarDecl>(D);
3936 
3937     QualType Type = VD->getType();
3938     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3939       // It will be analyzed later.
3940       Vars.push_back(DE);
3941       continue;
3942     }
3943 
3944     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3945     //  A variable that appears in a private clause must not have an incomplete
3946     //  type or a reference type.
3947     if (RequireCompleteType(ELoc, Type,
3948                             diag::err_omp_firstprivate_incomplete_type)) {
3949       continue;
3950     }
3951     if (Type->isReferenceType()) {
3952       if (IsImplicitClause) {
3953         Diag(ImplicitClauseLoc,
3954              diag::err_omp_task_predetermined_firstprivate_ref_type_arg)
3955             << Type;
3956         Diag(RefExpr->getExprLoc(), diag::note_used_here);
3957       } else {
3958         Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3959             << getOpenMPClauseName(OMPC_firstprivate) << Type;
3960       }
3961       bool IsDecl =
3962           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3963       Diag(VD->getLocation(),
3964            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3965           << VD;
3966       continue;
3967     }
3968 
3969     // OpenMP [2.9.3.4, Restrictions, C/C++, p.1]
3970     //  A variable of class type (or array thereof) that appears in a private
3971     //  clause requires an accessible, unambiguous copy constructor for the
3972     //  class type.
3973     Type = Context.getBaseElementType(Type);
3974     CXXRecordDecl *RD = getLangOpts().CPlusPlus
3975                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
3976                             : nullptr;
3977     // FIXME This code must be replaced by actual constructing/destructing of
3978     // the firstprivate variable.
3979     if (RD) {
3980       CXXConstructorDecl *CD = LookupCopyingConstructor(RD, 0);
3981       PartialDiagnostic PD =
3982           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3983       if (!CD ||
3984           CheckConstructorAccess(ELoc, CD,
3985                                  InitializedEntity::InitializeTemporary(Type),
3986                                  CD->getAccess(), PD) == AR_inaccessible ||
3987           CD->isDeleted()) {
3988         if (IsImplicitClause) {
3989           Diag(ImplicitClauseLoc,
3990                diag::err_omp_task_predetermined_firstprivate_required_method)
3991               << 0;
3992           Diag(RefExpr->getExprLoc(), diag::note_used_here);
3993         } else {
3994           Diag(ELoc, diag::err_omp_required_method)
3995               << getOpenMPClauseName(OMPC_firstprivate) << 1;
3996         }
3997         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3998                       VarDecl::DeclarationOnly;
3999         Diag(VD->getLocation(),
4000              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4001             << VD;
4002         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4003         continue;
4004       }
4005       MarkFunctionReferenced(ELoc, CD);
4006       DiagnoseUseOfDecl(CD, ELoc);
4007 
4008       CXXDestructorDecl *DD = RD->getDestructor();
4009       if (DD) {
4010         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
4011             DD->isDeleted()) {
4012           if (IsImplicitClause) {
4013             Diag(ImplicitClauseLoc,
4014                  diag::err_omp_task_predetermined_firstprivate_required_method)
4015                 << 1;
4016             Diag(RefExpr->getExprLoc(), diag::note_used_here);
4017           } else {
4018             Diag(ELoc, diag::err_omp_required_method)
4019                 << getOpenMPClauseName(OMPC_firstprivate) << 4;
4020           }
4021           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4022                         VarDecl::DeclarationOnly;
4023           Diag(VD->getLocation(),
4024                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4025               << VD;
4026           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4027           continue;
4028         }
4029         MarkFunctionReferenced(ELoc, DD);
4030         DiagnoseUseOfDecl(DD, ELoc);
4031       }
4032     }
4033 
4034     // If an implicit firstprivate variable found it was checked already.
4035     if (!IsImplicitClause) {
4036       DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4037       Type = Type.getNonReferenceType().getCanonicalType();
4038       bool IsConstant = Type.isConstant(Context);
4039       Type = Context.getBaseElementType(Type);
4040       // OpenMP [2.4.13, Data-sharing Attribute Clauses]
4041       //  A list item that specifies a given variable may not appear in more
4042       // than one clause on the same directive, except that a variable may be
4043       //  specified in both firstprivate and lastprivate clauses.
4044       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate &&
4045           DVar.CKind != OMPC_lastprivate && DVar.RefExpr) {
4046         Diag(ELoc, diag::err_omp_wrong_dsa)
4047             << getOpenMPClauseName(DVar.CKind)
4048             << getOpenMPClauseName(OMPC_firstprivate);
4049         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4050         continue;
4051       }
4052 
4053       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
4054       // in a Construct]
4055       //  Variables with the predetermined data-sharing attributes may not be
4056       //  listed in data-sharing attributes clauses, except for the cases
4057       //  listed below. For these exceptions only, listing a predetermined
4058       //  variable in a data-sharing attribute clause is allowed and overrides
4059       //  the variable's predetermined data-sharing attributes.
4060       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
4061       // in a Construct, C/C++, p.2]
4062       //  Variables with const-qualified type having no mutable member may be
4063       //  listed in a firstprivate clause, even if they are static data members.
4064       if (!(IsConstant || VD->isStaticDataMember()) && !DVar.RefExpr &&
4065           DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) {
4066         Diag(ELoc, diag::err_omp_wrong_dsa)
4067             << getOpenMPClauseName(DVar.CKind)
4068             << getOpenMPClauseName(OMPC_firstprivate);
4069         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4070         continue;
4071       }
4072 
4073       OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
4074       // OpenMP [2.9.3.4, Restrictions, p.2]
4075       //  A list item that is private within a parallel region must not appear
4076       //  in a firstprivate clause on a worksharing construct if any of the
4077       //  worksharing regions arising from the worksharing construct ever bind
4078       //  to any of the parallel regions arising from the parallel construct.
4079       if (isOpenMPWorksharingDirective(CurrDir) &&
4080           !isOpenMPParallelDirective(CurrDir)) {
4081         DVar = DSAStack->getImplicitDSA(VD, true);
4082         if (DVar.CKind != OMPC_shared &&
4083             (isOpenMPParallelDirective(DVar.DKind) ||
4084              DVar.DKind == OMPD_unknown)) {
4085           Diag(ELoc, diag::err_omp_required_access)
4086               << getOpenMPClauseName(OMPC_firstprivate)
4087               << getOpenMPClauseName(OMPC_shared);
4088           ReportOriginalDSA(*this, DSAStack, VD, DVar);
4089           continue;
4090         }
4091       }
4092       // OpenMP [2.9.3.4, Restrictions, p.3]
4093       //  A list item that appears in a reduction clause of a parallel construct
4094       //  must not appear in a firstprivate clause on a worksharing or task
4095       //  construct if any of the worksharing or task regions arising from the
4096       //  worksharing or task construct ever bind to any of the parallel regions
4097       //  arising from the parallel construct.
4098       // OpenMP [2.9.3.4, Restrictions, p.4]
4099       //  A list item that appears in a reduction clause in worksharing
4100       //  construct must not appear in a firstprivate clause in a task construct
4101       //  encountered during execution of any of the worksharing regions arising
4102       //  from the worksharing construct.
4103       if (CurrDir == OMPD_task) {
4104         DVar =
4105             DSAStack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction),
4106                                       [](OpenMPDirectiveKind K) -> bool {
4107                                         return isOpenMPParallelDirective(K) ||
4108                                                isOpenMPWorksharingDirective(K);
4109                                       },
4110                                       false);
4111         if (DVar.CKind == OMPC_reduction &&
4112             (isOpenMPParallelDirective(DVar.DKind) ||
4113              isOpenMPWorksharingDirective(DVar.DKind))) {
4114           Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate)
4115               << getOpenMPDirectiveName(DVar.DKind);
4116           ReportOriginalDSA(*this, DSAStack, VD, DVar);
4117           continue;
4118         }
4119       }
4120     }
4121 
4122     DSAStack->addDSA(VD, DE, OMPC_firstprivate);
4123     Vars.push_back(DE);
4124   }
4125 
4126   if (Vars.empty())
4127     return nullptr;
4128 
4129   return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
4130                                        Vars);
4131 }
4132 
4133 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList,
4134                                               SourceLocation StartLoc,
4135                                               SourceLocation LParenLoc,
4136                                               SourceLocation EndLoc) {
4137   SmallVector<Expr *, 8> Vars;
4138   for (auto &RefExpr : VarList) {
4139     assert(RefExpr && "NULL expr in OpenMP lastprivate clause.");
4140     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4141       // It will be analyzed later.
4142       Vars.push_back(RefExpr);
4143       continue;
4144     }
4145 
4146     SourceLocation ELoc = RefExpr->getExprLoc();
4147     // OpenMP [2.1, C/C++]
4148     //  A list item is a variable name.
4149     // OpenMP  [2.14.3.5, Restrictions, p.1]
4150     //  A variable that is part of another variable (as an array or structure
4151     //  element) cannot appear in a lastprivate clause.
4152     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
4153     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4154       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4155       continue;
4156     }
4157     Decl *D = DE->getDecl();
4158     VarDecl *VD = cast<VarDecl>(D);
4159 
4160     QualType Type = VD->getType();
4161     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4162       // It will be analyzed later.
4163       Vars.push_back(DE);
4164       continue;
4165     }
4166 
4167     // OpenMP [2.14.3.5, Restrictions, C/C++, p.2]
4168     //  A variable that appears in a lastprivate clause must not have an
4169     //  incomplete type or a reference type.
4170     if (RequireCompleteType(ELoc, Type,
4171                             diag::err_omp_lastprivate_incomplete_type)) {
4172       continue;
4173     }
4174     if (Type->isReferenceType()) {
4175       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
4176           << getOpenMPClauseName(OMPC_lastprivate) << Type;
4177       bool IsDecl =
4178           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4179       Diag(VD->getLocation(),
4180            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4181           << VD;
4182       continue;
4183     }
4184 
4185     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
4186     // in a Construct]
4187     //  Variables with the predetermined data-sharing attributes may not be
4188     //  listed in data-sharing attributes clauses, except for the cases
4189     //  listed below.
4190     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4191     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate &&
4192         DVar.CKind != OMPC_firstprivate &&
4193         (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
4194       Diag(ELoc, diag::err_omp_wrong_dsa)
4195           << getOpenMPClauseName(DVar.CKind)
4196           << getOpenMPClauseName(OMPC_lastprivate);
4197       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4198       continue;
4199     }
4200 
4201     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
4202     // OpenMP [2.14.3.5, Restrictions, p.2]
4203     // A list item that is private within a parallel region, or that appears in
4204     // the reduction clause of a parallel construct, must not appear in a
4205     // lastprivate clause on a worksharing construct if any of the corresponding
4206     // worksharing regions ever binds to any of the corresponding parallel
4207     // regions.
4208     if (isOpenMPWorksharingDirective(CurrDir) &&
4209         !isOpenMPParallelDirective(CurrDir)) {
4210       DVar = DSAStack->getImplicitDSA(VD, true);
4211       if (DVar.CKind != OMPC_shared) {
4212         Diag(ELoc, diag::err_omp_required_access)
4213             << getOpenMPClauseName(OMPC_lastprivate)
4214             << getOpenMPClauseName(OMPC_shared);
4215         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4216         continue;
4217       }
4218     }
4219     // OpenMP [2.14.3.5, Restrictions, C++, p.1,2]
4220     //  A variable of class type (or array thereof) that appears in a
4221     //  lastprivate clause requires an accessible, unambiguous default
4222     //  constructor for the class type, unless the list item is also specified
4223     //  in a firstprivate clause.
4224     //  A variable of class type (or array thereof) that appears in a
4225     //  lastprivate clause requires an accessible, unambiguous copy assignment
4226     //  operator for the class type.
4227     while (Type.getNonReferenceType()->isArrayType())
4228       Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr())
4229                  ->getElementType();
4230     CXXRecordDecl *RD = getLangOpts().CPlusPlus
4231                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
4232                             : nullptr;
4233     // FIXME This code must be replaced by actual copying and destructing of the
4234     // lastprivate variable.
4235     if (RD) {
4236       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
4237       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
4238       if (MD) {
4239         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
4240             MD->isDeleted()) {
4241           Diag(ELoc, diag::err_omp_required_method)
4242               << getOpenMPClauseName(OMPC_lastprivate) << 2;
4243           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4244                         VarDecl::DeclarationOnly;
4245           Diag(VD->getLocation(),
4246                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4247               << VD;
4248           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4249           continue;
4250         }
4251         MarkFunctionReferenced(ELoc, MD);
4252         DiagnoseUseOfDecl(MD, ELoc);
4253       }
4254 
4255       CXXDestructorDecl *DD = RD->getDestructor();
4256       if (DD) {
4257         PartialDiagnostic PD =
4258             PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
4259         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
4260             DD->isDeleted()) {
4261           Diag(ELoc, diag::err_omp_required_method)
4262               << getOpenMPClauseName(OMPC_lastprivate) << 4;
4263           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4264                         VarDecl::DeclarationOnly;
4265           Diag(VD->getLocation(),
4266                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4267               << VD;
4268           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4269           continue;
4270         }
4271         MarkFunctionReferenced(ELoc, DD);
4272         DiagnoseUseOfDecl(DD, ELoc);
4273       }
4274     }
4275 
4276     if (DVar.CKind != OMPC_firstprivate)
4277       DSAStack->addDSA(VD, DE, OMPC_lastprivate);
4278     Vars.push_back(DE);
4279   }
4280 
4281   if (Vars.empty())
4282     return nullptr;
4283 
4284   return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
4285                                       Vars);
4286 }
4287 
4288 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
4289                                          SourceLocation StartLoc,
4290                                          SourceLocation LParenLoc,
4291                                          SourceLocation EndLoc) {
4292   SmallVector<Expr *, 8> Vars;
4293   for (auto &RefExpr : VarList) {
4294     assert(RefExpr && "NULL expr in OpenMP shared clause.");
4295     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4296       // It will be analyzed later.
4297       Vars.push_back(RefExpr);
4298       continue;
4299     }
4300 
4301     SourceLocation ELoc = RefExpr->getExprLoc();
4302     // OpenMP [2.1, C/C++]
4303     //  A list item is a variable name.
4304     // OpenMP  [2.14.3.2, Restrictions, p.1]
4305     //  A variable that is part of another variable (as an array or structure
4306     //  element) cannot appear in a shared unless it is a static data member
4307     //  of a C++ class.
4308     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4309     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4310       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4311       continue;
4312     }
4313     Decl *D = DE->getDecl();
4314     VarDecl *VD = cast<VarDecl>(D);
4315 
4316     QualType Type = VD->getType();
4317     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4318       // It will be analyzed later.
4319       Vars.push_back(DE);
4320       continue;
4321     }
4322 
4323     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
4324     // in a Construct]
4325     //  Variables with the predetermined data-sharing attributes may not be
4326     //  listed in data-sharing attributes clauses, except for the cases
4327     //  listed below. For these exceptions only, listing a predetermined
4328     //  variable in a data-sharing attribute clause is allowed and overrides
4329     //  the variable's predetermined data-sharing attributes.
4330     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4331     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared &&
4332         DVar.RefExpr) {
4333       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
4334                                           << getOpenMPClauseName(OMPC_shared);
4335       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4336       continue;
4337     }
4338 
4339     DSAStack->addDSA(VD, DE, OMPC_shared);
4340     Vars.push_back(DE);
4341   }
4342 
4343   if (Vars.empty())
4344     return nullptr;
4345 
4346   return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
4347 }
4348 
4349 namespace {
4350 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> {
4351   DSAStackTy *Stack;
4352 
4353 public:
4354   bool VisitDeclRefExpr(DeclRefExpr *E) {
4355     if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
4356       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, false);
4357       if (DVar.CKind == OMPC_shared && !DVar.RefExpr)
4358         return false;
4359       if (DVar.CKind != OMPC_unknown)
4360         return true;
4361       DSAStackTy::DSAVarData DVarPrivate =
4362           Stack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(), false);
4363       if (DVarPrivate.CKind != OMPC_unknown)
4364         return true;
4365       return false;
4366     }
4367     return false;
4368   }
4369   bool VisitStmt(Stmt *S) {
4370     for (auto Child : S->children()) {
4371       if (Child && Visit(Child))
4372         return true;
4373     }
4374     return false;
4375   }
4376   explicit DSARefChecker(DSAStackTy *S) : Stack(S) {}
4377 };
4378 } // namespace
4379 
4380 OMPClause *Sema::ActOnOpenMPReductionClause(
4381     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
4382     SourceLocation ColonLoc, SourceLocation EndLoc,
4383     CXXScopeSpec &ReductionIdScopeSpec,
4384     const DeclarationNameInfo &ReductionId) {
4385   // TODO: Allow scope specification search when 'declare reduction' is
4386   // supported.
4387   assert(ReductionIdScopeSpec.isEmpty() &&
4388          "No support for scoped reduction identifiers yet.");
4389 
4390   auto DN = ReductionId.getName();
4391   auto OOK = DN.getCXXOverloadedOperator();
4392   BinaryOperatorKind BOK = BO_Comma;
4393 
4394   // OpenMP [2.14.3.6, reduction clause]
4395   // C
4396   // reduction-identifier is either an identifier or one of the following
4397   // operators: +, -, *,  &, |, ^, && and ||
4398   // C++
4399   // reduction-identifier is either an id-expression or one of the following
4400   // operators: +, -, *, &, |, ^, && and ||
4401   // FIXME: Only 'min' and 'max' identifiers are supported for now.
4402   switch (OOK) {
4403   case OO_Plus:
4404   case OO_Minus:
4405     BOK = BO_AddAssign;
4406     break;
4407   case OO_Star:
4408     BOK = BO_MulAssign;
4409     break;
4410   case OO_Amp:
4411     BOK = BO_AndAssign;
4412     break;
4413   case OO_Pipe:
4414     BOK = BO_OrAssign;
4415     break;
4416   case OO_Caret:
4417     BOK = BO_XorAssign;
4418     break;
4419   case OO_AmpAmp:
4420     BOK = BO_LAnd;
4421     break;
4422   case OO_PipePipe:
4423     BOK = BO_LOr;
4424     break;
4425   default:
4426     if (auto II = DN.getAsIdentifierInfo()) {
4427       if (II->isStr("max"))
4428         BOK = BO_GT;
4429       else if (II->isStr("min"))
4430         BOK = BO_LT;
4431     }
4432     break;
4433   }
4434   SourceRange ReductionIdRange;
4435   if (ReductionIdScopeSpec.isValid()) {
4436     ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc());
4437   }
4438   ReductionIdRange.setEnd(ReductionId.getEndLoc());
4439   if (BOK == BO_Comma) {
4440     // Not allowed reduction identifier is found.
4441     Diag(ReductionId.getLocStart(), diag::err_omp_unknown_reduction_identifier)
4442         << ReductionIdRange;
4443     return nullptr;
4444   }
4445 
4446   SmallVector<Expr *, 8> Vars;
4447   for (auto RefExpr : VarList) {
4448     assert(RefExpr && "nullptr expr in OpenMP reduction clause.");
4449     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4450       // It will be analyzed later.
4451       Vars.push_back(RefExpr);
4452       continue;
4453     }
4454 
4455     if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() ||
4456         RefExpr->isInstantiationDependent() ||
4457         RefExpr->containsUnexpandedParameterPack()) {
4458       // It will be analyzed later.
4459       Vars.push_back(RefExpr);
4460       continue;
4461     }
4462 
4463     auto ELoc = RefExpr->getExprLoc();
4464     auto ERange = RefExpr->getSourceRange();
4465     // OpenMP [2.1, C/C++]
4466     //  A list item is a variable or array section, subject to the restrictions
4467     //  specified in Section 2.4 on page 42 and in each of the sections
4468     // describing clauses and directives for which a list appears.
4469     // OpenMP  [2.14.3.3, Restrictions, p.1]
4470     //  A variable that is part of another variable (as an array or
4471     //  structure element) cannot appear in a private clause.
4472     auto DE = dyn_cast<DeclRefExpr>(RefExpr);
4473     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4474       Diag(ELoc, diag::err_omp_expected_var_name) << ERange;
4475       continue;
4476     }
4477     auto D = DE->getDecl();
4478     auto VD = cast<VarDecl>(D);
4479     auto Type = VD->getType();
4480     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
4481     //  A variable that appears in a private clause must not have an incomplete
4482     //  type or a reference type.
4483     if (RequireCompleteType(ELoc, Type,
4484                             diag::err_omp_reduction_incomplete_type))
4485       continue;
4486     // OpenMP [2.14.3.6, reduction clause, Restrictions]
4487     // Arrays may not appear in a reduction clause.
4488     if (Type.getNonReferenceType()->isArrayType()) {
4489       Diag(ELoc, diag::err_omp_reduction_type_array) << Type << ERange;
4490       bool IsDecl =
4491           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4492       Diag(VD->getLocation(),
4493            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4494           << VD;
4495       continue;
4496     }
4497     // OpenMP [2.14.3.6, reduction clause, Restrictions]
4498     // A list item that appears in a reduction clause must not be
4499     // const-qualified.
4500     if (Type.getNonReferenceType().isConstant(Context)) {
4501       Diag(ELoc, diag::err_omp_const_variable)
4502           << getOpenMPClauseName(OMPC_reduction) << Type << ERange;
4503       bool IsDecl =
4504           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4505       Diag(VD->getLocation(),
4506            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4507           << VD;
4508       continue;
4509     }
4510     // OpenMP [2.9.3.6, Restrictions, C/C++, p.4]
4511     //  If a list-item is a reference type then it must bind to the same object
4512     //  for all threads of the team.
4513     VarDecl *VDDef = VD->getDefinition();
4514     if (Type->isReferenceType() && VDDef) {
4515       DSARefChecker Check(DSAStack);
4516       if (Check.Visit(VDDef->getInit())) {
4517         Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange;
4518         Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef;
4519         continue;
4520       }
4521     }
4522     // OpenMP [2.14.3.6, reduction clause, Restrictions]
4523     // The type of a list item that appears in a reduction clause must be valid
4524     // for the reduction-identifier. For a max or min reduction in C, the type
4525     // of the list item must be an allowed arithmetic data type: char, int,
4526     // float, double, or _Bool, possibly modified with long, short, signed, or
4527     // unsigned. For a max or min reduction in C++, the type of the list item
4528     // must be an allowed arithmetic data type: char, wchar_t, int, float,
4529     // double, or bool, possibly modified with long, short, signed, or unsigned.
4530     if ((BOK == BO_GT || BOK == BO_LT) &&
4531         !(Type->isScalarType() ||
4532           (getLangOpts().CPlusPlus && Type->isArithmeticType()))) {
4533       Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg)
4534           << getLangOpts().CPlusPlus;
4535       bool IsDecl =
4536           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4537       Diag(VD->getLocation(),
4538            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4539           << VD;
4540       continue;
4541     }
4542     if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) &&
4543         !getLangOpts().CPlusPlus && Type->isFloatingType()) {
4544       Diag(ELoc, diag::err_omp_clause_floating_type_arg);
4545       bool IsDecl =
4546           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4547       Diag(VD->getLocation(),
4548            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4549           << VD;
4550       continue;
4551     }
4552     bool Suppress = getDiagnostics().getSuppressAllDiagnostics();
4553     getDiagnostics().setSuppressAllDiagnostics(true);
4554     ExprResult ReductionOp =
4555         BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK,
4556                    RefExpr, RefExpr);
4557     getDiagnostics().setSuppressAllDiagnostics(Suppress);
4558     if (ReductionOp.isInvalid()) {
4559       Diag(ELoc, diag::err_omp_reduction_id_not_compatible) << Type
4560                                                             << ReductionIdRange;
4561       bool IsDecl =
4562           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4563       Diag(VD->getLocation(),
4564            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4565           << VD;
4566       continue;
4567     }
4568 
4569     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
4570     // in a Construct]
4571     //  Variables with the predetermined data-sharing attributes may not be
4572     //  listed in data-sharing attributes clauses, except for the cases
4573     //  listed below. For these exceptions only, listing a predetermined
4574     //  variable in a data-sharing attribute clause is allowed and overrides
4575     //  the variable's predetermined data-sharing attributes.
4576     // OpenMP [2.14.3.6, Restrictions, p.3]
4577     //  Any number of reduction clauses can be specified on the directive,
4578     //  but a list item can appear only once in the reduction clauses for that
4579     //  directive.
4580     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4581     if (DVar.CKind == OMPC_reduction) {
4582       Diag(ELoc, diag::err_omp_once_referenced)
4583           << getOpenMPClauseName(OMPC_reduction);
4584       if (DVar.RefExpr) {
4585         Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced);
4586       }
4587     } else if (DVar.CKind != OMPC_unknown) {
4588       Diag(ELoc, diag::err_omp_wrong_dsa)
4589           << getOpenMPClauseName(DVar.CKind)
4590           << getOpenMPClauseName(OMPC_reduction);
4591       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4592       continue;
4593     }
4594 
4595     // OpenMP [2.14.3.6, Restrictions, p.1]
4596     //  A list item that appears in a reduction clause of a worksharing
4597     //  construct must be shared in the parallel regions to which any of the
4598     //  worksharing regions arising from the worksharing construct bind.
4599     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
4600     if (isOpenMPWorksharingDirective(CurrDir) &&
4601         !isOpenMPParallelDirective(CurrDir)) {
4602       DVar = DSAStack->getImplicitDSA(VD, true);
4603       if (DVar.CKind != OMPC_shared) {
4604         Diag(ELoc, diag::err_omp_required_access)
4605             << getOpenMPClauseName(OMPC_reduction)
4606             << getOpenMPClauseName(OMPC_shared);
4607         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4608         continue;
4609       }
4610     }
4611 
4612     CXXRecordDecl *RD = getLangOpts().CPlusPlus
4613                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
4614                             : nullptr;
4615     // FIXME This code must be replaced by actual constructing/destructing of
4616     // the reduction variable.
4617     if (RD) {
4618       CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
4619       PartialDiagnostic PD =
4620           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
4621       if (!CD ||
4622           CheckConstructorAccess(ELoc, CD,
4623                                  InitializedEntity::InitializeTemporary(Type),
4624                                  CD->getAccess(), PD) == AR_inaccessible ||
4625           CD->isDeleted()) {
4626         Diag(ELoc, diag::err_omp_required_method)
4627             << getOpenMPClauseName(OMPC_reduction) << 0;
4628         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4629                       VarDecl::DeclarationOnly;
4630         Diag(VD->getLocation(),
4631              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4632             << VD;
4633         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4634         continue;
4635       }
4636       MarkFunctionReferenced(ELoc, CD);
4637       DiagnoseUseOfDecl(CD, ELoc);
4638 
4639       CXXDestructorDecl *DD = RD->getDestructor();
4640       if (DD) {
4641         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
4642             DD->isDeleted()) {
4643           Diag(ELoc, diag::err_omp_required_method)
4644               << getOpenMPClauseName(OMPC_reduction) << 4;
4645           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4646                         VarDecl::DeclarationOnly;
4647           Diag(VD->getLocation(),
4648                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4649               << VD;
4650           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4651           continue;
4652         }
4653         MarkFunctionReferenced(ELoc, DD);
4654         DiagnoseUseOfDecl(DD, ELoc);
4655       }
4656     }
4657 
4658     DSAStack->addDSA(VD, DE, OMPC_reduction);
4659     Vars.push_back(DE);
4660   }
4661 
4662   if (Vars.empty())
4663     return nullptr;
4664 
4665   return OMPReductionClause::Create(
4666       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, Vars,
4667       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId);
4668 }
4669 
4670 OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
4671                                          SourceLocation StartLoc,
4672                                          SourceLocation LParenLoc,
4673                                          SourceLocation ColonLoc,
4674                                          SourceLocation EndLoc) {
4675   SmallVector<Expr *, 8> Vars;
4676   for (auto &RefExpr : VarList) {
4677     assert(RefExpr && "NULL expr in OpenMP linear clause.");
4678     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4679       // It will be analyzed later.
4680       Vars.push_back(RefExpr);
4681       continue;
4682     }
4683 
4684     // OpenMP [2.14.3.7, linear clause]
4685     // A list item that appears in a linear clause is subject to the private
4686     // clause semantics described in Section 2.14.3.3 on page 159 except as
4687     // noted. In addition, the value of the new list item on each iteration
4688     // of the associated loop(s) corresponds to the value of the original
4689     // list item before entering the construct plus the logical number of
4690     // the iteration times linear-step.
4691 
4692     SourceLocation ELoc = RefExpr->getExprLoc();
4693     // OpenMP [2.1, C/C++]
4694     //  A list item is a variable name.
4695     // OpenMP  [2.14.3.3, Restrictions, p.1]
4696     //  A variable that is part of another variable (as an array or
4697     //  structure element) cannot appear in a private clause.
4698     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4699     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4700       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4701       continue;
4702     }
4703 
4704     VarDecl *VD = cast<VarDecl>(DE->getDecl());
4705 
4706     // OpenMP [2.14.3.7, linear clause]
4707     //  A list-item cannot appear in more than one linear clause.
4708     //  A list-item that appears in a linear clause cannot appear in any
4709     //  other data-sharing attribute clause.
4710     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4711     if (DVar.RefExpr) {
4712       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
4713                                           << getOpenMPClauseName(OMPC_linear);
4714       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4715       continue;
4716     }
4717 
4718     QualType QType = VD->getType();
4719     if (QType->isDependentType() || QType->isInstantiationDependentType()) {
4720       // It will be analyzed later.
4721       Vars.push_back(DE);
4722       continue;
4723     }
4724 
4725     // A variable must not have an incomplete type or a reference type.
4726     if (RequireCompleteType(ELoc, QType,
4727                             diag::err_omp_linear_incomplete_type)) {
4728       continue;
4729     }
4730     if (QType->isReferenceType()) {
4731       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
4732           << getOpenMPClauseName(OMPC_linear) << QType;
4733       bool IsDecl =
4734           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4735       Diag(VD->getLocation(),
4736            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4737           << VD;
4738       continue;
4739     }
4740 
4741     // A list item must not be const-qualified.
4742     if (QType.isConstant(Context)) {
4743       Diag(ELoc, diag::err_omp_const_variable)
4744           << getOpenMPClauseName(OMPC_linear);
4745       bool IsDecl =
4746           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4747       Diag(VD->getLocation(),
4748            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4749           << VD;
4750       continue;
4751     }
4752 
4753     // A list item must be of integral or pointer type.
4754     QType = QType.getUnqualifiedType().getCanonicalType();
4755     const Type *Ty = QType.getTypePtrOrNull();
4756     if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) &&
4757                 !Ty->isPointerType())) {
4758       Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << QType;
4759       bool IsDecl =
4760           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4761       Diag(VD->getLocation(),
4762            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4763           << VD;
4764       continue;
4765     }
4766 
4767     DSAStack->addDSA(VD, DE, OMPC_linear);
4768     Vars.push_back(DE);
4769   }
4770 
4771   if (Vars.empty())
4772     return nullptr;
4773 
4774   Expr *StepExpr = Step;
4775   if (Step && !Step->isValueDependent() && !Step->isTypeDependent() &&
4776       !Step->isInstantiationDependent() &&
4777       !Step->containsUnexpandedParameterPack()) {
4778     SourceLocation StepLoc = Step->getLocStart();
4779     ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step);
4780     if (Val.isInvalid())
4781       return nullptr;
4782     StepExpr = Val.get();
4783 
4784     // Warn about zero linear step (it would be probably better specified as
4785     // making corresponding variables 'const').
4786     llvm::APSInt Result;
4787     if (StepExpr->isIntegerConstantExpr(Result, Context) &&
4788         !Result.isNegative() && !Result.isStrictlyPositive())
4789       Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0]
4790                                                      << (Vars.size() > 1);
4791   }
4792 
4793   return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc,
4794                                  Vars, StepExpr);
4795 }
4796 
4797 OMPClause *Sema::ActOnOpenMPAlignedClause(
4798     ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc,
4799     SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {
4800 
4801   SmallVector<Expr *, 8> Vars;
4802   for (auto &RefExpr : VarList) {
4803     assert(RefExpr && "NULL expr in OpenMP aligned clause.");
4804     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4805       // It will be analyzed later.
4806       Vars.push_back(RefExpr);
4807       continue;
4808     }
4809 
4810     SourceLocation ELoc = RefExpr->getExprLoc();
4811     // OpenMP [2.1, C/C++]
4812     //  A list item is a variable name.
4813     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4814     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4815       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4816       continue;
4817     }
4818 
4819     VarDecl *VD = cast<VarDecl>(DE->getDecl());
4820 
4821     // OpenMP  [2.8.1, simd construct, Restrictions]
4822     // The type of list items appearing in the aligned clause must be
4823     // array, pointer, reference to array, or reference to pointer.
4824     QualType QType = DE->getType()
4825                          .getNonReferenceType()
4826                          .getUnqualifiedType()
4827                          .getCanonicalType();
4828     const Type *Ty = QType.getTypePtrOrNull();
4829     if (!Ty || (!Ty->isDependentType() && !Ty->isArrayType() &&
4830                 !Ty->isPointerType())) {
4831       Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr)
4832           << QType << getLangOpts().CPlusPlus << RefExpr->getSourceRange();
4833       bool IsDecl =
4834           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4835       Diag(VD->getLocation(),
4836            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4837           << VD;
4838       continue;
4839     }
4840 
4841     // OpenMP  [2.8.1, simd construct, Restrictions]
4842     // A list-item cannot appear in more than one aligned clause.
4843     if (DeclRefExpr *PrevRef = DSAStack->addUniqueAligned(VD, DE)) {
4844       Diag(ELoc, diag::err_omp_aligned_twice) << RefExpr->getSourceRange();
4845       Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa)
4846           << getOpenMPClauseName(OMPC_aligned);
4847       continue;
4848     }
4849 
4850     Vars.push_back(DE);
4851   }
4852 
4853   // OpenMP [2.8.1, simd construct, Description]
4854   // The parameter of the aligned clause, alignment, must be a constant
4855   // positive integer expression.
4856   // If no optional parameter is specified, implementation-defined default
4857   // alignments for SIMD instructions on the target platforms are assumed.
4858   if (Alignment != nullptr) {
4859     ExprResult AlignResult =
4860         VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned);
4861     if (AlignResult.isInvalid())
4862       return nullptr;
4863     Alignment = AlignResult.get();
4864   }
4865   if (Vars.empty())
4866     return nullptr;
4867 
4868   return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc,
4869                                   EndLoc, Vars, Alignment);
4870 }
4871 
4872 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList,
4873                                          SourceLocation StartLoc,
4874                                          SourceLocation LParenLoc,
4875                                          SourceLocation EndLoc) {
4876   SmallVector<Expr *, 8> Vars;
4877   for (auto &RefExpr : VarList) {
4878     assert(RefExpr && "NULL expr in OpenMP copyin clause.");
4879     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4880       // It will be analyzed later.
4881       Vars.push_back(RefExpr);
4882       continue;
4883     }
4884 
4885     SourceLocation ELoc = RefExpr->getExprLoc();
4886     // OpenMP [2.1, C/C++]
4887     //  A list item is a variable name.
4888     // OpenMP  [2.14.4.1, Restrictions, p.1]
4889     //  A list item that appears in a copyin clause must be threadprivate.
4890     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4891     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4892       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4893       continue;
4894     }
4895 
4896     Decl *D = DE->getDecl();
4897     VarDecl *VD = cast<VarDecl>(D);
4898 
4899     QualType Type = VD->getType();
4900     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4901       // It will be analyzed later.
4902       Vars.push_back(DE);
4903       continue;
4904     }
4905 
4906     // OpenMP [2.14.4.1, Restrictions, C/C++, p.1]
4907     //  A list item that appears in a copyin clause must be threadprivate.
4908     if (!DSAStack->isThreadPrivate(VD)) {
4909       Diag(ELoc, diag::err_omp_required_access)
4910           << getOpenMPClauseName(OMPC_copyin)
4911           << getOpenMPDirectiveName(OMPD_threadprivate);
4912       continue;
4913     }
4914 
4915     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
4916     //  A variable of class type (or array thereof) that appears in a
4917     //  copyin clause requires an accessible, unambiguous copy assignment
4918     //  operator for the class type.
4919     Type = Context.getBaseElementType(Type);
4920     CXXRecordDecl *RD =
4921         getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
4922     // FIXME This code must be replaced by actual assignment of the
4923     // threadprivate variable.
4924     if (RD) {
4925       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
4926       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
4927       if (MD) {
4928         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
4929             MD->isDeleted()) {
4930           Diag(ELoc, diag::err_omp_required_method)
4931               << getOpenMPClauseName(OMPC_copyin) << 2;
4932           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4933                         VarDecl::DeclarationOnly;
4934           Diag(VD->getLocation(),
4935                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4936               << VD;
4937           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4938           continue;
4939         }
4940         MarkFunctionReferenced(ELoc, MD);
4941         DiagnoseUseOfDecl(MD, ELoc);
4942       }
4943     }
4944 
4945     DSAStack->addDSA(VD, DE, OMPC_copyin);
4946     Vars.push_back(DE);
4947   }
4948 
4949   if (Vars.empty())
4950     return nullptr;
4951 
4952   return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
4953 }
4954 
4955 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
4956                                               SourceLocation StartLoc,
4957                                               SourceLocation LParenLoc,
4958                                               SourceLocation EndLoc) {
4959   SmallVector<Expr *, 8> Vars;
4960   for (auto &RefExpr : VarList) {
4961     assert(RefExpr && "NULL expr in OpenMP copyprivate clause.");
4962     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4963       // It will be analyzed later.
4964       Vars.push_back(RefExpr);
4965       continue;
4966     }
4967 
4968     SourceLocation ELoc = RefExpr->getExprLoc();
4969     // OpenMP [2.1, C/C++]
4970     //  A list item is a variable name.
4971     // OpenMP  [2.14.4.1, Restrictions, p.1]
4972     //  A list item that appears in a copyin clause must be threadprivate.
4973     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4974     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4975       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4976       continue;
4977     }
4978 
4979     Decl *D = DE->getDecl();
4980     VarDecl *VD = cast<VarDecl>(D);
4981 
4982     QualType Type = VD->getType();
4983     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4984       // It will be analyzed later.
4985       Vars.push_back(DE);
4986       continue;
4987     }
4988 
4989     // OpenMP [2.14.4.2, Restrictions, p.2]
4990     //  A list item that appears in a copyprivate clause may not appear in a
4991     //  private or firstprivate clause on the single construct.
4992     if (!DSAStack->isThreadPrivate(VD)) {
4993       auto DVar = DSAStack->getTopDSA(VD, false);
4994       if (DVar.CKind != OMPC_copyprivate && DVar.CKind != OMPC_unknown &&
4995           !(DVar.CKind == OMPC_private && !DVar.RefExpr)) {
4996         Diag(ELoc, diag::err_omp_wrong_dsa)
4997             << getOpenMPClauseName(DVar.CKind)
4998             << getOpenMPClauseName(OMPC_copyprivate);
4999         ReportOriginalDSA(*this, DSAStack, VD, DVar);
5000         continue;
5001       }
5002 
5003       // OpenMP [2.11.4.2, Restrictions, p.1]
5004       //  All list items that appear in a copyprivate clause must be either
5005       //  threadprivate or private in the enclosing context.
5006       if (DVar.CKind == OMPC_unknown) {
5007         DVar = DSAStack->getImplicitDSA(VD, false);
5008         if (DVar.CKind == OMPC_shared) {
5009           Diag(ELoc, diag::err_omp_required_access)
5010               << getOpenMPClauseName(OMPC_copyprivate)
5011               << "threadprivate or private in the enclosing context";
5012           ReportOriginalDSA(*this, DSAStack, VD, DVar);
5013           continue;
5014         }
5015       }
5016     }
5017 
5018     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
5019     //  A variable of class type (or array thereof) that appears in a
5020     //  copyin clause requires an accessible, unambiguous copy assignment
5021     //  operator for the class type.
5022     Type = Context.getBaseElementType(Type);
5023     CXXRecordDecl *RD =
5024         getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
5025     // FIXME This code must be replaced by actual assignment of the
5026     // threadprivate variable.
5027     if (RD) {
5028       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
5029       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
5030       if (MD) {
5031         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
5032             MD->isDeleted()) {
5033           Diag(ELoc, diag::err_omp_required_method)
5034               << getOpenMPClauseName(OMPC_copyprivate) << 2;
5035           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
5036                         VarDecl::DeclarationOnly;
5037           Diag(VD->getLocation(),
5038                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
5039               << VD;
5040           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
5041           continue;
5042         }
5043         MarkFunctionReferenced(ELoc, MD);
5044         DiagnoseUseOfDecl(MD, ELoc);
5045       }
5046     }
5047 
5048     // No need to mark vars as copyprivate, they are already threadprivate or
5049     // implicitly private.
5050     Vars.push_back(DE);
5051   }
5052 
5053   if (Vars.empty())
5054     return nullptr;
5055 
5056   return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
5057 }
5058 
5059 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList,
5060                                         SourceLocation StartLoc,
5061                                         SourceLocation LParenLoc,
5062                                         SourceLocation EndLoc) {
5063   if (VarList.empty())
5064     return nullptr;
5065 
5066   return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList);
5067 }
5068 
5069