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 condition later.
1799   SourceRange ConditionSrcRange;
1800   /// \brief Loop variable.
1801   VarDecl *Var;
1802   /// \brief Reference to loop variable.
1803   DeclRefExpr *VarRef;
1804   /// \brief Lower bound (initializer for the var).
1805   Expr *LB;
1806   /// \brief Upper bound.
1807   Expr *UB;
1808   /// \brief Loop step (increment).
1809   Expr *Step;
1810   /// \brief This flag is true when condition is one of:
1811   ///   Var <  UB
1812   ///   Var <= UB
1813   ///   UB  >  Var
1814   ///   UB  >= Var
1815   bool TestIsLessOp;
1816   /// \brief This flag is true when condition is strict ( < or > ).
1817   bool TestIsStrictOp;
1818   /// \brief This flag is true when step is subtracted on each iteration.
1819   bool SubtractStep;
1820 
1821 public:
1822   OpenMPIterationSpaceChecker(Sema &SemaRef, SourceLocation DefaultLoc)
1823       : SemaRef(SemaRef), DefaultLoc(DefaultLoc), ConditionLoc(DefaultLoc),
1824         ConditionSrcRange(SourceRange()), Var(nullptr), VarRef(nullptr),
1825         LB(nullptr), UB(nullptr), Step(nullptr), TestIsLessOp(false),
1826         TestIsStrictOp(false), SubtractStep(false) {}
1827   /// \brief Check init-expr for canonical loop form and save loop counter
1828   /// variable - #Var and its initialization value - #LB.
1829   bool CheckInit(Stmt *S);
1830   /// \brief Check test-expr for canonical form, save upper-bound (#UB), flags
1831   /// for less/greater and for strict/non-strict comparison.
1832   bool CheckCond(Expr *S);
1833   /// \brief Check incr-expr for canonical loop form and return true if it
1834   /// does not conform, otherwise save loop step (#Step).
1835   bool CheckInc(Expr *S);
1836   /// \brief Return the loop counter variable.
1837   VarDecl *GetLoopVar() const { return Var; }
1838   /// \brief Return the reference expression to loop counter variable.
1839   DeclRefExpr *GetLoopVarRefExpr() const { return VarRef; }
1840   /// \brief Return true if any expression is dependent.
1841   bool Dependent() const;
1842 
1843 private:
1844   /// \brief Check the right-hand side of an assignment in the increment
1845   /// expression.
1846   bool CheckIncRHS(Expr *RHS);
1847   /// \brief Helper to set loop counter variable and its initializer.
1848   bool SetVarAndLB(VarDecl *NewVar, DeclRefExpr *NewVarRefExpr, Expr *NewLB);
1849   /// \brief Helper to set upper bound.
1850   bool SetUB(Expr *NewUB, bool LessOp, bool StrictOp, const SourceRange &SR,
1851              const SourceLocation &SL);
1852   /// \brief Helper to set loop increment.
1853   bool SetStep(Expr *NewStep, bool Subtract);
1854 };
1855 
1856 bool OpenMPIterationSpaceChecker::Dependent() const {
1857   if (!Var) {
1858     assert(!LB && !UB && !Step);
1859     return false;
1860   }
1861   return Var->getType()->isDependentType() || (LB && LB->isValueDependent()) ||
1862          (UB && UB->isValueDependent()) || (Step && Step->isValueDependent());
1863 }
1864 
1865 bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar,
1866                                               DeclRefExpr *NewVarRefExpr,
1867                                               Expr *NewLB) {
1868   // State consistency checking to ensure correct usage.
1869   assert(Var == nullptr && LB == nullptr && VarRef == nullptr &&
1870          UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp);
1871   if (!NewVar || !NewLB)
1872     return true;
1873   Var = NewVar;
1874   VarRef = NewVarRefExpr;
1875   LB = NewLB;
1876   return false;
1877 }
1878 
1879 bool OpenMPIterationSpaceChecker::SetUB(Expr *NewUB, bool LessOp, bool StrictOp,
1880                                         const SourceRange &SR,
1881                                         const SourceLocation &SL) {
1882   // State consistency checking to ensure correct usage.
1883   assert(Var != nullptr && LB != nullptr && UB == nullptr && Step == nullptr &&
1884          !TestIsLessOp && !TestIsStrictOp);
1885   if (!NewUB)
1886     return true;
1887   UB = NewUB;
1888   TestIsLessOp = LessOp;
1889   TestIsStrictOp = StrictOp;
1890   ConditionSrcRange = SR;
1891   ConditionLoc = SL;
1892   return false;
1893 }
1894 
1895 bool OpenMPIterationSpaceChecker::SetStep(Expr *NewStep, bool Subtract) {
1896   // State consistency checking to ensure correct usage.
1897   assert(Var != nullptr && LB != nullptr && Step == nullptr);
1898   if (!NewStep)
1899     return true;
1900   if (!NewStep->isValueDependent()) {
1901     // Check that the step is integer expression.
1902     SourceLocation StepLoc = NewStep->getLocStart();
1903     ExprResult Val =
1904         SemaRef.PerformOpenMPImplicitIntegerConversion(StepLoc, NewStep);
1905     if (Val.isInvalid())
1906       return true;
1907     NewStep = Val.get();
1908 
1909     // OpenMP [2.6, Canonical Loop Form, Restrictions]
1910     //  If test-expr is of form var relational-op b and relational-op is < or
1911     //  <= then incr-expr must cause var to increase on each iteration of the
1912     //  loop. If test-expr is of form var relational-op b and relational-op is
1913     //  > or >= then incr-expr must cause var to decrease on each iteration of
1914     //  the loop.
1915     //  If test-expr is of form b relational-op var and relational-op is < or
1916     //  <= then incr-expr must cause var to decrease on each iteration of the
1917     //  loop. If test-expr is of form b relational-op var and relational-op is
1918     //  > or >= then incr-expr must cause var to increase on each iteration of
1919     //  the loop.
1920     llvm::APSInt Result;
1921     bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context);
1922     bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation();
1923     bool IsConstNeg =
1924         IsConstant && Result.isSigned() && (Subtract != Result.isNegative());
1925     bool IsConstZero = IsConstant && !Result.getBoolValue();
1926     if (UB && (IsConstZero ||
1927                (TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract))
1928                              : (!IsConstNeg || (IsUnsigned && !Subtract))))) {
1929       SemaRef.Diag(NewStep->getExprLoc(),
1930                    diag::err_omp_loop_incr_not_compatible)
1931           << Var << TestIsLessOp << NewStep->getSourceRange();
1932       SemaRef.Diag(ConditionLoc,
1933                    diag::note_omp_loop_cond_requres_compatible_incr)
1934           << TestIsLessOp << ConditionSrcRange;
1935       return true;
1936     }
1937   }
1938 
1939   Step = NewStep;
1940   SubtractStep = Subtract;
1941   return false;
1942 }
1943 
1944 bool OpenMPIterationSpaceChecker::CheckInit(Stmt *S) {
1945   // Check init-expr for canonical loop form and save loop counter
1946   // variable - #Var and its initialization value - #LB.
1947   // OpenMP [2.6] Canonical loop form. init-expr may be one of the following:
1948   //   var = lb
1949   //   integer-type var = lb
1950   //   random-access-iterator-type var = lb
1951   //   pointer-type var = lb
1952   //
1953   if (!S) {
1954     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init);
1955     return true;
1956   }
1957   if (Expr *E = dyn_cast<Expr>(S))
1958     S = E->IgnoreParens();
1959   if (auto BO = dyn_cast<BinaryOperator>(S)) {
1960     if (BO->getOpcode() == BO_Assign)
1961       if (auto DRE = dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreParens()))
1962         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
1963                            BO->getLHS());
1964   } else if (auto DS = dyn_cast<DeclStmt>(S)) {
1965     if (DS->isSingleDecl()) {
1966       if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) {
1967         if (Var->hasInit()) {
1968           // Accept non-canonical init form here but emit ext. warning.
1969           if (Var->getInitStyle() != VarDecl::CInit)
1970             SemaRef.Diag(S->getLocStart(),
1971                          diag::ext_omp_loop_not_canonical_init)
1972                 << S->getSourceRange();
1973           return SetVarAndLB(Var, nullptr, Var->getInit());
1974         }
1975       }
1976     }
1977   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S))
1978     if (CE->getOperator() == OO_Equal)
1979       if (auto DRE = dyn_cast<DeclRefExpr>(CE->getArg(0)))
1980         return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE,
1981                            CE->getArg(1));
1982 
1983   SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_init)
1984       << S->getSourceRange();
1985   return true;
1986 }
1987 
1988 /// \brief Ignore parenthesizes, implicit casts, copy constructor and return the
1989 /// variable (which may be the loop variable) if possible.
1990 static const VarDecl *GetInitVarDecl(const Expr *E) {
1991   if (!E)
1992     return nullptr;
1993   E = E->IgnoreParenImpCasts();
1994   if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E))
1995     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
1996       if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 &&
1997           CE->getArg(0) != nullptr)
1998         E = CE->getArg(0)->IgnoreParenImpCasts();
1999   auto DRE = dyn_cast_or_null<DeclRefExpr>(E);
2000   if (!DRE)
2001     return nullptr;
2002   return dyn_cast<VarDecl>(DRE->getDecl());
2003 }
2004 
2005 bool OpenMPIterationSpaceChecker::CheckCond(Expr *S) {
2006   // Check test-expr for canonical form, save upper-bound UB, flags for
2007   // less/greater and for strict/non-strict comparison.
2008   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2009   //   var relational-op b
2010   //   b relational-op var
2011   //
2012   if (!S) {
2013     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << Var;
2014     return true;
2015   }
2016   S = S->IgnoreParenImpCasts();
2017   SourceLocation CondLoc = S->getLocStart();
2018   if (auto BO = dyn_cast<BinaryOperator>(S)) {
2019     if (BO->isRelationalOp()) {
2020       if (GetInitVarDecl(BO->getLHS()) == Var)
2021         return SetUB(BO->getRHS(),
2022                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE),
2023                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2024                      BO->getSourceRange(), BO->getOperatorLoc());
2025       if (GetInitVarDecl(BO->getRHS()) == Var)
2026         return SetUB(BO->getLHS(),
2027                      (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE),
2028                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
2029                      BO->getSourceRange(), BO->getOperatorLoc());
2030     }
2031   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2032     if (CE->getNumArgs() == 2) {
2033       auto Op = CE->getOperator();
2034       switch (Op) {
2035       case OO_Greater:
2036       case OO_GreaterEqual:
2037       case OO_Less:
2038       case OO_LessEqual:
2039         if (GetInitVarDecl(CE->getArg(0)) == Var)
2040           return SetUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual,
2041                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2042                        CE->getOperatorLoc());
2043         if (GetInitVarDecl(CE->getArg(1)) == Var)
2044           return SetUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual,
2045                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
2046                        CE->getOperatorLoc());
2047         break;
2048       default:
2049         break;
2050       }
2051     }
2052   }
2053   SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond)
2054       << S->getSourceRange() << Var;
2055   return true;
2056 }
2057 
2058 bool OpenMPIterationSpaceChecker::CheckIncRHS(Expr *RHS) {
2059   // RHS of canonical loop form increment can be:
2060   //   var + incr
2061   //   incr + var
2062   //   var - incr
2063   //
2064   RHS = RHS->IgnoreParenImpCasts();
2065   if (auto BO = dyn_cast<BinaryOperator>(RHS)) {
2066     if (BO->isAdditiveOp()) {
2067       bool IsAdd = BO->getOpcode() == BO_Add;
2068       if (GetInitVarDecl(BO->getLHS()) == Var)
2069         return SetStep(BO->getRHS(), !IsAdd);
2070       if (IsAdd && GetInitVarDecl(BO->getRHS()) == Var)
2071         return SetStep(BO->getLHS(), false);
2072     }
2073   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(RHS)) {
2074     bool IsAdd = CE->getOperator() == OO_Plus;
2075     if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) {
2076       if (GetInitVarDecl(CE->getArg(0)) == Var)
2077         return SetStep(CE->getArg(1), !IsAdd);
2078       if (IsAdd && GetInitVarDecl(CE->getArg(1)) == Var)
2079         return SetStep(CE->getArg(0), false);
2080     }
2081   }
2082   SemaRef.Diag(RHS->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2083       << RHS->getSourceRange() << Var;
2084   return true;
2085 }
2086 
2087 bool OpenMPIterationSpaceChecker::CheckInc(Expr *S) {
2088   // Check incr-expr for canonical loop form and return true if it
2089   // does not conform.
2090   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
2091   //   ++var
2092   //   var++
2093   //   --var
2094   //   var--
2095   //   var += incr
2096   //   var -= incr
2097   //   var = var + incr
2098   //   var = incr + var
2099   //   var = var - incr
2100   //
2101   if (!S) {
2102     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << Var;
2103     return true;
2104   }
2105   S = S->IgnoreParens();
2106   if (auto UO = dyn_cast<UnaryOperator>(S)) {
2107     if (UO->isIncrementDecrementOp() && GetInitVarDecl(UO->getSubExpr()) == Var)
2108       return SetStep(
2109           SemaRef.ActOnIntegerConstant(UO->getLocStart(),
2110                                        (UO->isDecrementOp() ? -1 : 1)).get(),
2111           false);
2112   } else if (auto BO = dyn_cast<BinaryOperator>(S)) {
2113     switch (BO->getOpcode()) {
2114     case BO_AddAssign:
2115     case BO_SubAssign:
2116       if (GetInitVarDecl(BO->getLHS()) == Var)
2117         return SetStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign);
2118       break;
2119     case BO_Assign:
2120       if (GetInitVarDecl(BO->getLHS()) == Var)
2121         return CheckIncRHS(BO->getRHS());
2122       break;
2123     default:
2124       break;
2125     }
2126   } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) {
2127     switch (CE->getOperator()) {
2128     case OO_PlusPlus:
2129     case OO_MinusMinus:
2130       if (GetInitVarDecl(CE->getArg(0)) == Var)
2131         return SetStep(
2132             SemaRef.ActOnIntegerConstant(
2133                         CE->getLocStart(),
2134                         ((CE->getOperator() == OO_MinusMinus) ? -1 : 1)).get(),
2135             false);
2136       break;
2137     case OO_PlusEqual:
2138     case OO_MinusEqual:
2139       if (GetInitVarDecl(CE->getArg(0)) == Var)
2140         return SetStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual);
2141       break;
2142     case OO_Equal:
2143       if (GetInitVarDecl(CE->getArg(0)) == Var)
2144         return CheckIncRHS(CE->getArg(1));
2145       break;
2146     default:
2147       break;
2148     }
2149   }
2150   SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_incr)
2151       << S->getSourceRange() << Var;
2152   return true;
2153 }
2154 } // namespace
2155 
2156 /// \brief Called on a for stmt to check and extract its iteration space
2157 /// for further processing (such as collapsing).
2158 static bool CheckOpenMPIterationSpace(
2159     OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA,
2160     unsigned CurrentNestedLoopCount, unsigned NestedLoopCount,
2161     Expr *NestedLoopCountExpr,
2162     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2163   // OpenMP [2.6, Canonical Loop Form]
2164   //   for (init-expr; test-expr; incr-expr) structured-block
2165   auto For = dyn_cast_or_null<ForStmt>(S);
2166   if (!For) {
2167     SemaRef.Diag(S->getLocStart(), diag::err_omp_not_for)
2168         << (NestedLoopCountExpr != nullptr) << getOpenMPDirectiveName(DKind)
2169         << NestedLoopCount << (CurrentNestedLoopCount > 0)
2170         << CurrentNestedLoopCount;
2171     if (NestedLoopCount > 1)
2172       SemaRef.Diag(NestedLoopCountExpr->getExprLoc(),
2173                    diag::note_omp_collapse_expr)
2174           << NestedLoopCountExpr->getSourceRange();
2175     return true;
2176   }
2177   assert(For->getBody());
2178 
2179   OpenMPIterationSpaceChecker ISC(SemaRef, For->getForLoc());
2180 
2181   // Check init.
2182   auto Init = For->getInit();
2183   if (ISC.CheckInit(Init)) {
2184     return true;
2185   }
2186 
2187   bool HasErrors = false;
2188 
2189   // Check loop variable's type.
2190   auto Var = ISC.GetLoopVar();
2191 
2192   // OpenMP [2.6, Canonical Loop Form]
2193   // Var is one of the following:
2194   //   A variable of signed or unsigned integer type.
2195   //   For C++, a variable of a random access iterator type.
2196   //   For C, a variable of a pointer type.
2197   auto VarType = Var->getType();
2198   if (!VarType->isDependentType() && !VarType->isIntegerType() &&
2199       !VarType->isPointerType() &&
2200       !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) {
2201     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_variable_type)
2202         << SemaRef.getLangOpts().CPlusPlus;
2203     HasErrors = true;
2204   }
2205 
2206   // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in a
2207   // Construct
2208   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2209   // parallel for construct is (are) private.
2210   // The loop iteration variable in the associated for-loop of a simd construct
2211   // with just one associated for-loop is linear with a constant-linear-step
2212   // that is the increment of the associated for-loop.
2213   // Exclude loop var from the list of variables with implicitly defined data
2214   // sharing attributes.
2215   while (VarsWithImplicitDSA.count(Var) > 0)
2216     VarsWithImplicitDSA.erase(Var);
2217 
2218   // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced in
2219   // a Construct, C/C++].
2220   // The loop iteration variable in the associated for-loop of a simd construct
2221   // with just one associated for-loop may be listed in a linear clause with a
2222   // constant-linear-step that is the increment of the associated for-loop.
2223   // The loop iteration variable(s) in the associated for-loop(s) of a for or
2224   // parallel for construct may be listed in a private or lastprivate clause.
2225   DSAStackTy::DSAVarData DVar = DSA.getTopDSA(Var, false);
2226   auto LoopVarRefExpr = ISC.GetLoopVarRefExpr();
2227   // If LoopVarRefExpr is nullptr it means the corresponding loop variable is
2228   // declared in the loop and it is predetermined as a private.
2229   auto PredeterminedCKind =
2230       isOpenMPSimdDirective(DKind)
2231           ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate)
2232           : OMPC_private;
2233   if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
2234         DVar.CKind != PredeterminedCKind) ||
2235        (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) &&
2236         DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private &&
2237         DVar.CKind != OMPC_lastprivate)) &&
2238       (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
2239     SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa)
2240         << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind)
2241         << getOpenMPClauseName(PredeterminedCKind);
2242     ReportOriginalDSA(SemaRef, &DSA, Var, DVar, true);
2243     HasErrors = true;
2244   } else if (LoopVarRefExpr != nullptr) {
2245     // Make the loop iteration variable private (for worksharing constructs),
2246     // linear (for simd directives with the only one associated loop) or
2247     // lastprivate (for simd directives with several collapsed loops).
2248     DSA.addDSA(Var, LoopVarRefExpr, PredeterminedCKind);
2249   }
2250 
2251   assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars");
2252 
2253   // Check test-expr.
2254   HasErrors |= ISC.CheckCond(For->getCond());
2255 
2256   // Check incr-expr.
2257   HasErrors |= ISC.CheckInc(For->getInc());
2258 
2259   if (ISC.Dependent())
2260     return HasErrors;
2261 
2262   // FIXME: Build loop's iteration space representation.
2263   return HasErrors;
2264 }
2265 
2266 /// \brief A helper routine to skip no-op (attributed, compound) stmts get the
2267 /// next nested for loop. If \a IgnoreCaptured is true, it skips captured stmt
2268 /// to get the first for loop.
2269 static Stmt *IgnoreContainerStmts(Stmt *S, bool IgnoreCaptured) {
2270   if (IgnoreCaptured)
2271     if (auto CapS = dyn_cast_or_null<CapturedStmt>(S))
2272       S = CapS->getCapturedStmt();
2273   // OpenMP [2.8.1, simd construct, Restrictions]
2274   // All loops associated with the construct must be perfectly nested; that is,
2275   // there must be no intervening code nor any OpenMP directive between any two
2276   // loops.
2277   while (true) {
2278     if (auto AS = dyn_cast_or_null<AttributedStmt>(S))
2279       S = AS->getSubStmt();
2280     else if (auto CS = dyn_cast_or_null<CompoundStmt>(S)) {
2281       if (CS->size() != 1)
2282         break;
2283       S = CS->body_back();
2284     } else
2285       break;
2286   }
2287   return S;
2288 }
2289 
2290 /// \brief Called on a for stmt to check itself and nested loops (if any).
2291 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop,
2292 /// number of collapsed loops otherwise.
2293 static unsigned
2294 CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr,
2295                 Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA,
2296                 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2297   unsigned NestedLoopCount = 1;
2298   if (NestedLoopCountExpr) {
2299     // Found 'collapse' clause - calculate collapse number.
2300     llvm::APSInt Result;
2301     if (NestedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
2302       NestedLoopCount = Result.getLimitedValue();
2303   }
2304   // This is helper routine for loop directives (e.g., 'for', 'simd',
2305   // 'for simd', etc.).
2306   Stmt *CurStmt = IgnoreContainerStmts(AStmt, true);
2307   for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) {
2308     if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt,
2309                                   NestedLoopCount, NestedLoopCountExpr,
2310                                   VarsWithImplicitDSA))
2311       return 0;
2312     // Move on to the next nested for loop, or to the loop body.
2313     CurStmt = IgnoreContainerStmts(cast<ForStmt>(CurStmt)->getBody(), false);
2314   }
2315 
2316   // FIXME: Build resulting iteration space for IR generation (collapsing
2317   // iteration spaces when loop count > 1 ('collapse' clause)).
2318   return NestedLoopCount;
2319 }
2320 
2321 static Expr *GetCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) {
2322   auto CollapseFilter = [](const OMPClause *C) -> bool {
2323     return C->getClauseKind() == OMPC_collapse;
2324   };
2325   OMPExecutableDirective::filtered_clause_iterator<decltype(CollapseFilter)> I(
2326       Clauses, CollapseFilter);
2327   if (I)
2328     return cast<OMPCollapseClause>(*I)->getNumForLoops();
2329   return nullptr;
2330 }
2331 
2332 StmtResult Sema::ActOnOpenMPSimdDirective(
2333     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2334     SourceLocation EndLoc,
2335     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2336   // In presence of clause 'collapse', it will define the nested loops number.
2337   unsigned NestedLoopCount =
2338       CheckOpenMPLoop(OMPD_simd, GetCollapseNumberExpr(Clauses), AStmt, *this,
2339                       *DSAStack, VarsWithImplicitDSA);
2340   if (NestedLoopCount == 0)
2341     return StmtError();
2342 
2343   getCurFunction()->setHasBranchProtectedScope();
2344   return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
2345                                   Clauses, AStmt);
2346 }
2347 
2348 StmtResult Sema::ActOnOpenMPForDirective(
2349     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2350     SourceLocation EndLoc,
2351     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2352   // In presence of clause 'collapse', it will define the nested loops number.
2353   unsigned NestedLoopCount =
2354       CheckOpenMPLoop(OMPD_for, GetCollapseNumberExpr(Clauses), AStmt, *this,
2355                       *DSAStack, VarsWithImplicitDSA);
2356   if (NestedLoopCount == 0)
2357     return StmtError();
2358 
2359   getCurFunction()->setHasBranchProtectedScope();
2360   return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
2361                                  Clauses, AStmt);
2362 }
2363 
2364 StmtResult Sema::ActOnOpenMPForSimdDirective(
2365     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2366     SourceLocation EndLoc,
2367     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2368   // In presence of clause 'collapse', it will define the nested loops number.
2369   unsigned NestedLoopCount =
2370       CheckOpenMPLoop(OMPD_for_simd, GetCollapseNumberExpr(Clauses), AStmt,
2371                       *this, *DSAStack, VarsWithImplicitDSA);
2372   if (NestedLoopCount == 0)
2373     return StmtError();
2374 
2375   getCurFunction()->setHasBranchProtectedScope();
2376   return OMPForSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
2377                                      Clauses, AStmt);
2378 }
2379 
2380 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
2381                                               Stmt *AStmt,
2382                                               SourceLocation StartLoc,
2383                                               SourceLocation EndLoc) {
2384   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2385   auto BaseStmt = AStmt;
2386   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
2387     BaseStmt = CS->getCapturedStmt();
2388   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
2389     auto S = C->children();
2390     if (!S)
2391       return StmtError();
2392     // All associated statements must be '#pragma omp section' except for
2393     // the first one.
2394     for (++S; S; ++S) {
2395       auto SectionStmt = *S;
2396       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
2397         if (SectionStmt)
2398           Diag(SectionStmt->getLocStart(),
2399                diag::err_omp_sections_substmt_not_section);
2400         return StmtError();
2401       }
2402     }
2403   } else {
2404     Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt);
2405     return StmtError();
2406   }
2407 
2408   getCurFunction()->setHasBranchProtectedScope();
2409 
2410   return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses,
2411                                       AStmt);
2412 }
2413 
2414 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
2415                                              SourceLocation StartLoc,
2416                                              SourceLocation EndLoc) {
2417   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2418 
2419   getCurFunction()->setHasBranchProtectedScope();
2420 
2421   return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt);
2422 }
2423 
2424 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
2425                                             Stmt *AStmt,
2426                                             SourceLocation StartLoc,
2427                                             SourceLocation EndLoc) {
2428   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2429 
2430   getCurFunction()->setHasBranchProtectedScope();
2431 
2432   return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
2433 }
2434 
2435 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt,
2436                                             SourceLocation StartLoc,
2437                                             SourceLocation EndLoc) {
2438   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2439 
2440   getCurFunction()->setHasBranchProtectedScope();
2441 
2442   return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt);
2443 }
2444 
2445 StmtResult
2446 Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName,
2447                                    Stmt *AStmt, SourceLocation StartLoc,
2448                                    SourceLocation EndLoc) {
2449   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2450 
2451   getCurFunction()->setHasBranchProtectedScope();
2452 
2453   return OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc,
2454                                       AStmt);
2455 }
2456 
2457 StmtResult Sema::ActOnOpenMPParallelForDirective(
2458     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2459     SourceLocation EndLoc,
2460     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2461   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2462   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2463   // 1.2.2 OpenMP Language Terminology
2464   // Structured block - An executable statement with a single entry at the
2465   // top and a single exit at the bottom.
2466   // The point of exit cannot be a branch out of the structured block.
2467   // longjmp() and throw() must not violate the entry/exit criteria.
2468   CS->getCapturedDecl()->setNothrow();
2469 
2470   // In presence of clause 'collapse', it will define the nested loops number.
2471   unsigned NestedLoopCount =
2472       CheckOpenMPLoop(OMPD_parallel_for, GetCollapseNumberExpr(Clauses), AStmt,
2473                       *this, *DSAStack, VarsWithImplicitDSA);
2474   if (NestedLoopCount == 0)
2475     return StmtError();
2476 
2477   getCurFunction()->setHasBranchProtectedScope();
2478   return OMPParallelForDirective::Create(Context, StartLoc, EndLoc,
2479                                          NestedLoopCount, Clauses, AStmt);
2480 }
2481 
2482 StmtResult Sema::ActOnOpenMPParallelForSimdDirective(
2483     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
2484     SourceLocation EndLoc,
2485     llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) {
2486   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2487   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2488   // 1.2.2 OpenMP Language Terminology
2489   // Structured block - An executable statement with a single entry at the
2490   // top and a single exit at the bottom.
2491   // The point of exit cannot be a branch out of the structured block.
2492   // longjmp() and throw() must not violate the entry/exit criteria.
2493   CS->getCapturedDecl()->setNothrow();
2494 
2495   // In presence of clause 'collapse', it will define the nested loops number.
2496   unsigned NestedLoopCount =
2497       CheckOpenMPLoop(OMPD_parallel_for_simd, GetCollapseNumberExpr(Clauses),
2498                       AStmt, *this, *DSAStack, VarsWithImplicitDSA);
2499   if (NestedLoopCount == 0)
2500     return StmtError();
2501 
2502   getCurFunction()->setHasBranchProtectedScope();
2503   return OMPParallelForSimdDirective::Create(Context, StartLoc, EndLoc,
2504                                              NestedLoopCount, Clauses, AStmt);
2505 }
2506 
2507 StmtResult
2508 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
2509                                            Stmt *AStmt, SourceLocation StartLoc,
2510                                            SourceLocation EndLoc) {
2511   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2512   auto BaseStmt = AStmt;
2513   while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
2514     BaseStmt = CS->getCapturedStmt();
2515   if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
2516     auto S = C->children();
2517     if (!S)
2518       return StmtError();
2519     // All associated statements must be '#pragma omp section' except for
2520     // the first one.
2521     for (++S; S; ++S) {
2522       auto SectionStmt = *S;
2523       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
2524         if (SectionStmt)
2525           Diag(SectionStmt->getLocStart(),
2526                diag::err_omp_parallel_sections_substmt_not_section);
2527         return StmtError();
2528       }
2529     }
2530   } else {
2531     Diag(AStmt->getLocStart(),
2532          diag::err_omp_parallel_sections_not_compound_stmt);
2533     return StmtError();
2534   }
2535 
2536   getCurFunction()->setHasBranchProtectedScope();
2537 
2538   return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc,
2539                                               Clauses, AStmt);
2540 }
2541 
2542 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
2543                                           Stmt *AStmt, SourceLocation StartLoc,
2544                                           SourceLocation EndLoc) {
2545   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2546   CapturedStmt *CS = cast<CapturedStmt>(AStmt);
2547   // 1.2.2 OpenMP Language Terminology
2548   // Structured block - An executable statement with a single entry at the
2549   // top and a single exit at the bottom.
2550   // The point of exit cannot be a branch out of the structured block.
2551   // longjmp() and throw() must not violate the entry/exit criteria.
2552   CS->getCapturedDecl()->setNothrow();
2553 
2554   getCurFunction()->setHasBranchProtectedScope();
2555 
2556   return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
2557 }
2558 
2559 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
2560                                                SourceLocation EndLoc) {
2561   return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc);
2562 }
2563 
2564 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc,
2565                                              SourceLocation EndLoc) {
2566   return OMPBarrierDirective::Create(Context, StartLoc, EndLoc);
2567 }
2568 
2569 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc,
2570                                               SourceLocation EndLoc) {
2571   return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc);
2572 }
2573 
2574 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses,
2575                                            SourceLocation StartLoc,
2576                                            SourceLocation EndLoc) {
2577   assert(Clauses.size() <= 1 && "Extra clauses in flush directive");
2578   return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses);
2579 }
2580 
2581 StmtResult Sema::ActOnOpenMPOrderedDirective(Stmt *AStmt,
2582                                              SourceLocation StartLoc,
2583                                              SourceLocation EndLoc) {
2584   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2585 
2586   getCurFunction()->setHasBranchProtectedScope();
2587 
2588   return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, AStmt);
2589 }
2590 
2591 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses,
2592                                             Stmt *AStmt,
2593                                             SourceLocation StartLoc,
2594                                             SourceLocation EndLoc) {
2595   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2596   auto CS = cast<CapturedStmt>(AStmt);
2597   // 1.2.2 OpenMP Language Terminology
2598   // Structured block - An executable statement with a single entry at the
2599   // top and a single exit at the bottom.
2600   // The point of exit cannot be a branch out of the structured block.
2601   // longjmp() and throw() must not violate the entry/exit criteria.
2602   // TODO further analysis of associated statements and clauses.
2603   OpenMPClauseKind AtomicKind = OMPC_unknown;
2604   SourceLocation AtomicKindLoc;
2605   for (auto *C : Clauses) {
2606     if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write ||
2607         C->getClauseKind() == OMPC_update ||
2608         C->getClauseKind() == OMPC_capture) {
2609       if (AtomicKind != OMPC_unknown) {
2610         Diag(C->getLocStart(), diag::err_omp_atomic_several_clauses)
2611             << SourceRange(C->getLocStart(), C->getLocEnd());
2612         Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause)
2613             << getOpenMPClauseName(AtomicKind);
2614       } else {
2615         AtomicKind = C->getClauseKind();
2616         AtomicKindLoc = C->getLocStart();
2617       }
2618     }
2619   }
2620   auto Body = CS->getCapturedStmt();
2621   if (AtomicKind == OMPC_read) {
2622     if (!isa<Expr>(Body)) {
2623       Diag(Body->getLocStart(),
2624            diag::err_omp_atomic_read_not_expression_statement);
2625       return StmtError();
2626     }
2627   } else if (AtomicKind == OMPC_write) {
2628     if (!isa<Expr>(Body)) {
2629       Diag(Body->getLocStart(),
2630            diag::err_omp_atomic_write_not_expression_statement);
2631       return StmtError();
2632     }
2633   } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {
2634     if (!isa<Expr>(Body)) {
2635       Diag(Body->getLocStart(),
2636            diag::err_omp_atomic_update_not_expression_statement)
2637           << (AtomicKind == OMPC_update);
2638       return StmtError();
2639     }
2640   } else if (AtomicKind == OMPC_capture) {
2641     if (isa<Expr>(Body) && !isa<BinaryOperator>(Body)) {
2642       Diag(Body->getLocStart(),
2643            diag::err_omp_atomic_capture_not_expression_statement);
2644       return StmtError();
2645     } else if (!isa<Expr>(Body) && !isa<CompoundStmt>(Body)) {
2646       Diag(Body->getLocStart(),
2647            diag::err_omp_atomic_capture_not_compound_statement);
2648       return StmtError();
2649     }
2650   }
2651 
2652   getCurFunction()->setHasBranchProtectedScope();
2653 
2654   return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
2655 }
2656 
2657 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses,
2658                                             Stmt *AStmt,
2659                                             SourceLocation StartLoc,
2660                                             SourceLocation EndLoc) {
2661   assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected");
2662 
2663   getCurFunction()->setHasBranchProtectedScope();
2664 
2665   return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
2666 }
2667 
2668 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
2669                                              SourceLocation StartLoc,
2670                                              SourceLocation LParenLoc,
2671                                              SourceLocation EndLoc) {
2672   OMPClause *Res = nullptr;
2673   switch (Kind) {
2674   case OMPC_if:
2675     Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc);
2676     break;
2677   case OMPC_final:
2678     Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc);
2679     break;
2680   case OMPC_num_threads:
2681     Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc);
2682     break;
2683   case OMPC_safelen:
2684     Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc);
2685     break;
2686   case OMPC_collapse:
2687     Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc);
2688     break;
2689   case OMPC_default:
2690   case OMPC_proc_bind:
2691   case OMPC_schedule:
2692   case OMPC_private:
2693   case OMPC_firstprivate:
2694   case OMPC_lastprivate:
2695   case OMPC_shared:
2696   case OMPC_reduction:
2697   case OMPC_linear:
2698   case OMPC_aligned:
2699   case OMPC_copyin:
2700   case OMPC_copyprivate:
2701   case OMPC_ordered:
2702   case OMPC_nowait:
2703   case OMPC_untied:
2704   case OMPC_mergeable:
2705   case OMPC_threadprivate:
2706   case OMPC_flush:
2707   case OMPC_read:
2708   case OMPC_write:
2709   case OMPC_update:
2710   case OMPC_capture:
2711   case OMPC_seq_cst:
2712   case OMPC_unknown:
2713     llvm_unreachable("Clause is not allowed.");
2714   }
2715   return Res;
2716 }
2717 
2718 OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, SourceLocation StartLoc,
2719                                      SourceLocation LParenLoc,
2720                                      SourceLocation EndLoc) {
2721   Expr *ValExpr = Condition;
2722   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
2723       !Condition->isInstantiationDependent() &&
2724       !Condition->containsUnexpandedParameterPack()) {
2725     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
2726                                            Condition->getExprLoc(), Condition);
2727     if (Val.isInvalid())
2728       return nullptr;
2729 
2730     ValExpr = Val.get();
2731   }
2732 
2733   return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc);
2734 }
2735 
2736 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition,
2737                                         SourceLocation StartLoc,
2738                                         SourceLocation LParenLoc,
2739                                         SourceLocation EndLoc) {
2740   Expr *ValExpr = Condition;
2741   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
2742       !Condition->isInstantiationDependent() &&
2743       !Condition->containsUnexpandedParameterPack()) {
2744     ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(),
2745                                            Condition->getExprLoc(), Condition);
2746     if (Val.isInvalid())
2747       return nullptr;
2748 
2749     ValExpr = Val.get();
2750   }
2751 
2752   return new (Context) OMPFinalClause(ValExpr, StartLoc, LParenLoc, EndLoc);
2753 }
2754 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc,
2755                                                         Expr *Op) {
2756   if (!Op)
2757     return ExprError();
2758 
2759   class IntConvertDiagnoser : public ICEConvertDiagnoser {
2760   public:
2761     IntConvertDiagnoser()
2762         : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {}
2763     SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
2764                                          QualType T) override {
2765       return S.Diag(Loc, diag::err_omp_not_integral) << T;
2766     }
2767     SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
2768                                              QualType T) override {
2769       return S.Diag(Loc, diag::err_omp_incomplete_type) << T;
2770     }
2771     SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
2772                                                QualType T,
2773                                                QualType ConvTy) override {
2774       return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy;
2775     }
2776     SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
2777                                            QualType ConvTy) override {
2778       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
2779              << ConvTy->isEnumeralType() << ConvTy;
2780     }
2781     SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
2782                                             QualType T) override {
2783       return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T;
2784     }
2785     SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
2786                                         QualType ConvTy) override {
2787       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
2788              << ConvTy->isEnumeralType() << ConvTy;
2789     }
2790     SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType,
2791                                              QualType) override {
2792       llvm_unreachable("conversion functions are permitted");
2793     }
2794   } ConvertDiagnoser;
2795   return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
2796 }
2797 
2798 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
2799                                              SourceLocation StartLoc,
2800                                              SourceLocation LParenLoc,
2801                                              SourceLocation EndLoc) {
2802   Expr *ValExpr = NumThreads;
2803   if (!NumThreads->isValueDependent() && !NumThreads->isTypeDependent() &&
2804       !NumThreads->isInstantiationDependent() &&
2805       !NumThreads->containsUnexpandedParameterPack()) {
2806     SourceLocation NumThreadsLoc = NumThreads->getLocStart();
2807     ExprResult Val =
2808         PerformOpenMPImplicitIntegerConversion(NumThreadsLoc, NumThreads);
2809     if (Val.isInvalid())
2810       return nullptr;
2811 
2812     ValExpr = Val.get();
2813 
2814     // OpenMP [2.5, Restrictions]
2815     //  The num_threads expression must evaluate to a positive integer value.
2816     llvm::APSInt Result;
2817     if (ValExpr->isIntegerConstantExpr(Result, Context) && Result.isSigned() &&
2818         !Result.isStrictlyPositive()) {
2819       Diag(NumThreadsLoc, diag::err_omp_negative_expression_in_clause)
2820           << "num_threads" << NumThreads->getSourceRange();
2821       return nullptr;
2822     }
2823   }
2824 
2825   return new (Context)
2826       OMPNumThreadsClause(ValExpr, StartLoc, LParenLoc, EndLoc);
2827 }
2828 
2829 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E,
2830                                                        OpenMPClauseKind CKind) {
2831   if (!E)
2832     return ExprError();
2833   if (E->isValueDependent() || E->isTypeDependent() ||
2834       E->isInstantiationDependent() || E->containsUnexpandedParameterPack())
2835     return E;
2836   llvm::APSInt Result;
2837   ExprResult ICE = VerifyIntegerConstantExpression(E, &Result);
2838   if (ICE.isInvalid())
2839     return ExprError();
2840   if (!Result.isStrictlyPositive()) {
2841     Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause)
2842         << getOpenMPClauseName(CKind) << E->getSourceRange();
2843     return ExprError();
2844   }
2845   return ICE;
2846 }
2847 
2848 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc,
2849                                           SourceLocation LParenLoc,
2850                                           SourceLocation EndLoc) {
2851   // OpenMP [2.8.1, simd construct, Description]
2852   // The parameter of the safelen clause must be a constant
2853   // positive integer expression.
2854   ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen);
2855   if (Safelen.isInvalid())
2856     return nullptr;
2857   return new (Context)
2858       OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc);
2859 }
2860 
2861 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops,
2862                                            SourceLocation StartLoc,
2863                                            SourceLocation LParenLoc,
2864                                            SourceLocation EndLoc) {
2865   // OpenMP [2.7.1, loop construct, Description]
2866   // OpenMP [2.8.1, simd construct, Description]
2867   // OpenMP [2.9.6, distribute construct, Description]
2868   // The parameter of the collapse clause must be a constant
2869   // positive integer expression.
2870   ExprResult NumForLoopsResult =
2871       VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse);
2872   if (NumForLoopsResult.isInvalid())
2873     return nullptr;
2874   return new (Context)
2875       OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc);
2876 }
2877 
2878 OMPClause *Sema::ActOnOpenMPSimpleClause(
2879     OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc,
2880     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
2881   OMPClause *Res = nullptr;
2882   switch (Kind) {
2883   case OMPC_default:
2884     Res =
2885         ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument),
2886                                  ArgumentLoc, StartLoc, LParenLoc, EndLoc);
2887     break;
2888   case OMPC_proc_bind:
2889     Res = ActOnOpenMPProcBindClause(
2890         static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc,
2891         LParenLoc, EndLoc);
2892     break;
2893   case OMPC_if:
2894   case OMPC_final:
2895   case OMPC_num_threads:
2896   case OMPC_safelen:
2897   case OMPC_collapse:
2898   case OMPC_schedule:
2899   case OMPC_private:
2900   case OMPC_firstprivate:
2901   case OMPC_lastprivate:
2902   case OMPC_shared:
2903   case OMPC_reduction:
2904   case OMPC_linear:
2905   case OMPC_aligned:
2906   case OMPC_copyin:
2907   case OMPC_copyprivate:
2908   case OMPC_ordered:
2909   case OMPC_nowait:
2910   case OMPC_untied:
2911   case OMPC_mergeable:
2912   case OMPC_threadprivate:
2913   case OMPC_flush:
2914   case OMPC_read:
2915   case OMPC_write:
2916   case OMPC_update:
2917   case OMPC_capture:
2918   case OMPC_seq_cst:
2919   case OMPC_unknown:
2920     llvm_unreachable("Clause is not allowed.");
2921   }
2922   return Res;
2923 }
2924 
2925 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind,
2926                                           SourceLocation KindKwLoc,
2927                                           SourceLocation StartLoc,
2928                                           SourceLocation LParenLoc,
2929                                           SourceLocation EndLoc) {
2930   if (Kind == OMPC_DEFAULT_unknown) {
2931     std::string Values;
2932     static_assert(OMPC_DEFAULT_unknown > 0,
2933                   "OMPC_DEFAULT_unknown not greater than 0");
2934     std::string Sep(", ");
2935     for (unsigned i = 0; i < OMPC_DEFAULT_unknown; ++i) {
2936       Values += "'";
2937       Values += getOpenMPSimpleClauseTypeName(OMPC_default, i);
2938       Values += "'";
2939       switch (i) {
2940       case OMPC_DEFAULT_unknown - 2:
2941         Values += " or ";
2942         break;
2943       case OMPC_DEFAULT_unknown - 1:
2944         break;
2945       default:
2946         Values += Sep;
2947         break;
2948       }
2949     }
2950     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
2951         << Values << getOpenMPClauseName(OMPC_default);
2952     return nullptr;
2953   }
2954   switch (Kind) {
2955   case OMPC_DEFAULT_none:
2956     DSAStack->setDefaultDSANone(KindKwLoc);
2957     break;
2958   case OMPC_DEFAULT_shared:
2959     DSAStack->setDefaultDSAShared(KindKwLoc);
2960     break;
2961   case OMPC_DEFAULT_unknown:
2962     llvm_unreachable("Clause kind is not allowed.");
2963     break;
2964   }
2965   return new (Context)
2966       OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
2967 }
2968 
2969 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind,
2970                                            SourceLocation KindKwLoc,
2971                                            SourceLocation StartLoc,
2972                                            SourceLocation LParenLoc,
2973                                            SourceLocation EndLoc) {
2974   if (Kind == OMPC_PROC_BIND_unknown) {
2975     std::string Values;
2976     std::string Sep(", ");
2977     for (unsigned i = 0; i < OMPC_PROC_BIND_unknown; ++i) {
2978       Values += "'";
2979       Values += getOpenMPSimpleClauseTypeName(OMPC_proc_bind, i);
2980       Values += "'";
2981       switch (i) {
2982       case OMPC_PROC_BIND_unknown - 2:
2983         Values += " or ";
2984         break;
2985       case OMPC_PROC_BIND_unknown - 1:
2986         break;
2987       default:
2988         Values += Sep;
2989         break;
2990       }
2991     }
2992     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
2993         << Values << getOpenMPClauseName(OMPC_proc_bind);
2994     return nullptr;
2995   }
2996   return new (Context)
2997       OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
2998 }
2999 
3000 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
3001     OpenMPClauseKind Kind, unsigned Argument, Expr *Expr,
3002     SourceLocation StartLoc, SourceLocation LParenLoc,
3003     SourceLocation ArgumentLoc, SourceLocation CommaLoc,
3004     SourceLocation EndLoc) {
3005   OMPClause *Res = nullptr;
3006   switch (Kind) {
3007   case OMPC_schedule:
3008     Res = ActOnOpenMPScheduleClause(
3009         static_cast<OpenMPScheduleClauseKind>(Argument), Expr, StartLoc,
3010         LParenLoc, ArgumentLoc, CommaLoc, EndLoc);
3011     break;
3012   case OMPC_if:
3013   case OMPC_final:
3014   case OMPC_num_threads:
3015   case OMPC_safelen:
3016   case OMPC_collapse:
3017   case OMPC_default:
3018   case OMPC_proc_bind:
3019   case OMPC_private:
3020   case OMPC_firstprivate:
3021   case OMPC_lastprivate:
3022   case OMPC_shared:
3023   case OMPC_reduction:
3024   case OMPC_linear:
3025   case OMPC_aligned:
3026   case OMPC_copyin:
3027   case OMPC_copyprivate:
3028   case OMPC_ordered:
3029   case OMPC_nowait:
3030   case OMPC_untied:
3031   case OMPC_mergeable:
3032   case OMPC_threadprivate:
3033   case OMPC_flush:
3034   case OMPC_read:
3035   case OMPC_write:
3036   case OMPC_update:
3037   case OMPC_capture:
3038   case OMPC_seq_cst:
3039   case OMPC_unknown:
3040     llvm_unreachable("Clause is not allowed.");
3041   }
3042   return Res;
3043 }
3044 
3045 OMPClause *Sema::ActOnOpenMPScheduleClause(
3046     OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
3047     SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc,
3048     SourceLocation EndLoc) {
3049   if (Kind == OMPC_SCHEDULE_unknown) {
3050     std::string Values;
3051     std::string Sep(", ");
3052     for (unsigned i = 0; i < OMPC_SCHEDULE_unknown; ++i) {
3053       Values += "'";
3054       Values += getOpenMPSimpleClauseTypeName(OMPC_schedule, i);
3055       Values += "'";
3056       switch (i) {
3057       case OMPC_SCHEDULE_unknown - 2:
3058         Values += " or ";
3059         break;
3060       case OMPC_SCHEDULE_unknown - 1:
3061         break;
3062       default:
3063         Values += Sep;
3064         break;
3065       }
3066     }
3067     Diag(KindLoc, diag::err_omp_unexpected_clause_value)
3068         << Values << getOpenMPClauseName(OMPC_schedule);
3069     return nullptr;
3070   }
3071   Expr *ValExpr = ChunkSize;
3072   if (ChunkSize) {
3073     if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() &&
3074         !ChunkSize->isInstantiationDependent() &&
3075         !ChunkSize->containsUnexpandedParameterPack()) {
3076       SourceLocation ChunkSizeLoc = ChunkSize->getLocStart();
3077       ExprResult Val =
3078           PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize);
3079       if (Val.isInvalid())
3080         return nullptr;
3081 
3082       ValExpr = Val.get();
3083 
3084       // OpenMP [2.7.1, Restrictions]
3085       //  chunk_size must be a loop invariant integer expression with a positive
3086       //  value.
3087       llvm::APSInt Result;
3088       if (ValExpr->isIntegerConstantExpr(Result, Context) &&
3089           Result.isSigned() && !Result.isStrictlyPositive()) {
3090         Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause)
3091             << "schedule" << ChunkSize->getSourceRange();
3092         return nullptr;
3093       }
3094     }
3095   }
3096 
3097   return new (Context) OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc,
3098                                          EndLoc, Kind, ValExpr);
3099 }
3100 
3101 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
3102                                    SourceLocation StartLoc,
3103                                    SourceLocation EndLoc) {
3104   OMPClause *Res = nullptr;
3105   switch (Kind) {
3106   case OMPC_ordered:
3107     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc);
3108     break;
3109   case OMPC_nowait:
3110     Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc);
3111     break;
3112   case OMPC_untied:
3113     Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc);
3114     break;
3115   case OMPC_mergeable:
3116     Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc);
3117     break;
3118   case OMPC_read:
3119     Res = ActOnOpenMPReadClause(StartLoc, EndLoc);
3120     break;
3121   case OMPC_write:
3122     Res = ActOnOpenMPWriteClause(StartLoc, EndLoc);
3123     break;
3124   case OMPC_update:
3125     Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc);
3126     break;
3127   case OMPC_capture:
3128     Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc);
3129     break;
3130   case OMPC_seq_cst:
3131     Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc);
3132     break;
3133   case OMPC_if:
3134   case OMPC_final:
3135   case OMPC_num_threads:
3136   case OMPC_safelen:
3137   case OMPC_collapse:
3138   case OMPC_schedule:
3139   case OMPC_private:
3140   case OMPC_firstprivate:
3141   case OMPC_lastprivate:
3142   case OMPC_shared:
3143   case OMPC_reduction:
3144   case OMPC_linear:
3145   case OMPC_aligned:
3146   case OMPC_copyin:
3147   case OMPC_copyprivate:
3148   case OMPC_default:
3149   case OMPC_proc_bind:
3150   case OMPC_threadprivate:
3151   case OMPC_flush:
3152   case OMPC_unknown:
3153     llvm_unreachable("Clause is not allowed.");
3154   }
3155   return Res;
3156 }
3157 
3158 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc,
3159                                           SourceLocation EndLoc) {
3160   DSAStack->setOrderedRegion();
3161   return new (Context) OMPOrderedClause(StartLoc, EndLoc);
3162 }
3163 
3164 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc,
3165                                          SourceLocation EndLoc) {
3166   return new (Context) OMPNowaitClause(StartLoc, EndLoc);
3167 }
3168 
3169 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc,
3170                                          SourceLocation EndLoc) {
3171   return new (Context) OMPUntiedClause(StartLoc, EndLoc);
3172 }
3173 
3174 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc,
3175                                             SourceLocation EndLoc) {
3176   return new (Context) OMPMergeableClause(StartLoc, EndLoc);
3177 }
3178 
3179 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc,
3180                                        SourceLocation EndLoc) {
3181   return new (Context) OMPReadClause(StartLoc, EndLoc);
3182 }
3183 
3184 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc,
3185                                         SourceLocation EndLoc) {
3186   return new (Context) OMPWriteClause(StartLoc, EndLoc);
3187 }
3188 
3189 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc,
3190                                          SourceLocation EndLoc) {
3191   return new (Context) OMPUpdateClause(StartLoc, EndLoc);
3192 }
3193 
3194 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc,
3195                                           SourceLocation EndLoc) {
3196   return new (Context) OMPCaptureClause(StartLoc, EndLoc);
3197 }
3198 
3199 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc,
3200                                          SourceLocation EndLoc) {
3201   return new (Context) OMPSeqCstClause(StartLoc, EndLoc);
3202 }
3203 
3204 OMPClause *Sema::ActOnOpenMPVarListClause(
3205     OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr,
3206     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc,
3207     SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
3208     const DeclarationNameInfo &ReductionId) {
3209   OMPClause *Res = nullptr;
3210   switch (Kind) {
3211   case OMPC_private:
3212     Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3213     break;
3214   case OMPC_firstprivate:
3215     Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3216     break;
3217   case OMPC_lastprivate:
3218     Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3219     break;
3220   case OMPC_shared:
3221     Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc);
3222     break;
3223   case OMPC_reduction:
3224     Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
3225                                      EndLoc, ReductionIdScopeSpec, ReductionId);
3226     break;
3227   case OMPC_linear:
3228     Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc,
3229                                   ColonLoc, EndLoc);
3230     break;
3231   case OMPC_aligned:
3232     Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc,
3233                                    ColonLoc, EndLoc);
3234     break;
3235   case OMPC_copyin:
3236     Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
3237     break;
3238   case OMPC_copyprivate:
3239     Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
3240     break;
3241   case OMPC_flush:
3242     Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc);
3243     break;
3244   case OMPC_if:
3245   case OMPC_final:
3246   case OMPC_num_threads:
3247   case OMPC_safelen:
3248   case OMPC_collapse:
3249   case OMPC_default:
3250   case OMPC_proc_bind:
3251   case OMPC_schedule:
3252   case OMPC_ordered:
3253   case OMPC_nowait:
3254   case OMPC_untied:
3255   case OMPC_mergeable:
3256   case OMPC_threadprivate:
3257   case OMPC_read:
3258   case OMPC_write:
3259   case OMPC_update:
3260   case OMPC_capture:
3261   case OMPC_seq_cst:
3262   case OMPC_unknown:
3263     llvm_unreachable("Clause is not allowed.");
3264   }
3265   return Res;
3266 }
3267 
3268 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
3269                                           SourceLocation StartLoc,
3270                                           SourceLocation LParenLoc,
3271                                           SourceLocation EndLoc) {
3272   SmallVector<Expr *, 8> Vars;
3273   for (auto &RefExpr : VarList) {
3274     assert(RefExpr && "NULL expr in OpenMP private clause.");
3275     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3276       // It will be analyzed later.
3277       Vars.push_back(RefExpr);
3278       continue;
3279     }
3280 
3281     SourceLocation ELoc = RefExpr->getExprLoc();
3282     // OpenMP [2.1, C/C++]
3283     //  A list item is a variable name.
3284     // OpenMP  [2.9.3.3, Restrictions, p.1]
3285     //  A variable that is part of another variable (as an array or
3286     //  structure element) cannot appear in a private clause.
3287     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
3288     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3289       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3290       continue;
3291     }
3292     Decl *D = DE->getDecl();
3293     VarDecl *VD = cast<VarDecl>(D);
3294 
3295     QualType Type = VD->getType();
3296     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3297       // It will be analyzed later.
3298       Vars.push_back(DE);
3299       continue;
3300     }
3301 
3302     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3303     //  A variable that appears in a private clause must not have an incomplete
3304     //  type or a reference type.
3305     if (RequireCompleteType(ELoc, Type,
3306                             diag::err_omp_private_incomplete_type)) {
3307       continue;
3308     }
3309     if (Type->isReferenceType()) {
3310       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3311           << getOpenMPClauseName(OMPC_private) << Type;
3312       bool IsDecl =
3313           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3314       Diag(VD->getLocation(),
3315            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3316           << VD;
3317       continue;
3318     }
3319 
3320     // OpenMP [2.9.3.3, Restrictions, C/C++, p.1]
3321     //  A variable of class type (or array thereof) that appears in a private
3322     //  clause requires an accessible, unambiguous default constructor for the
3323     //  class type.
3324     while (Type.getNonReferenceType()->isArrayType()) {
3325       Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr())
3326                  ->getElementType();
3327     }
3328     CXXRecordDecl *RD = getLangOpts().CPlusPlus
3329                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
3330                             : nullptr;
3331     // FIXME This code must be replaced by actual constructing/destructing of
3332     // the private variable.
3333     if (RD) {
3334       CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
3335       PartialDiagnostic PD =
3336           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3337       if (!CD ||
3338           CheckConstructorAccess(ELoc, CD,
3339                                  InitializedEntity::InitializeTemporary(Type),
3340                                  CD->getAccess(), PD) == AR_inaccessible ||
3341           CD->isDeleted()) {
3342         Diag(ELoc, diag::err_omp_required_method)
3343             << getOpenMPClauseName(OMPC_private) << 0;
3344         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3345                       VarDecl::DeclarationOnly;
3346         Diag(VD->getLocation(),
3347              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3348             << VD;
3349         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3350         continue;
3351       }
3352       MarkFunctionReferenced(ELoc, CD);
3353       DiagnoseUseOfDecl(CD, ELoc);
3354 
3355       CXXDestructorDecl *DD = RD->getDestructor();
3356       if (DD) {
3357         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
3358             DD->isDeleted()) {
3359           Diag(ELoc, diag::err_omp_required_method)
3360               << getOpenMPClauseName(OMPC_private) << 4;
3361           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3362                         VarDecl::DeclarationOnly;
3363           Diag(VD->getLocation(),
3364                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3365               << VD;
3366           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3367           continue;
3368         }
3369         MarkFunctionReferenced(ELoc, DD);
3370         DiagnoseUseOfDecl(DD, ELoc);
3371       }
3372     }
3373 
3374     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
3375     // in a Construct]
3376     //  Variables with the predetermined data-sharing attributes may not be
3377     //  listed in data-sharing attributes clauses, except for the cases
3378     //  listed below. For these exceptions only, listing a predetermined
3379     //  variable in a data-sharing attribute clause is allowed and overrides
3380     //  the variable's predetermined data-sharing attributes.
3381     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
3382     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) {
3383       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
3384                                           << getOpenMPClauseName(OMPC_private);
3385       ReportOriginalDSA(*this, DSAStack, VD, DVar);
3386       continue;
3387     }
3388 
3389     DSAStack->addDSA(VD, DE, OMPC_private);
3390     Vars.push_back(DE);
3391   }
3392 
3393   if (Vars.empty())
3394     return nullptr;
3395 
3396   return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
3397 }
3398 
3399 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,
3400                                                SourceLocation StartLoc,
3401                                                SourceLocation LParenLoc,
3402                                                SourceLocation EndLoc) {
3403   SmallVector<Expr *, 8> Vars;
3404   bool IsImplicitClause =
3405       StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid();
3406   auto ImplicitClauseLoc = DSAStack->getConstructLoc();
3407 
3408   for (auto &RefExpr : VarList) {
3409     assert(RefExpr && "NULL expr in OpenMP firstprivate clause.");
3410     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3411       // It will be analyzed later.
3412       Vars.push_back(RefExpr);
3413       continue;
3414     }
3415 
3416     SourceLocation ELoc = IsImplicitClause ? ImplicitClauseLoc
3417                                            : RefExpr->getExprLoc();
3418     // OpenMP [2.1, C/C++]
3419     //  A list item is a variable name.
3420     // OpenMP  [2.9.3.3, Restrictions, p.1]
3421     //  A variable that is part of another variable (as an array or
3422     //  structure element) cannot appear in a private clause.
3423     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
3424     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3425       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3426       continue;
3427     }
3428     Decl *D = DE->getDecl();
3429     VarDecl *VD = cast<VarDecl>(D);
3430 
3431     QualType Type = VD->getType();
3432     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3433       // It will be analyzed later.
3434       Vars.push_back(DE);
3435       continue;
3436     }
3437 
3438     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3439     //  A variable that appears in a private clause must not have an incomplete
3440     //  type or a reference type.
3441     if (RequireCompleteType(ELoc, Type,
3442                             diag::err_omp_firstprivate_incomplete_type)) {
3443       continue;
3444     }
3445     if (Type->isReferenceType()) {
3446       if (IsImplicitClause) {
3447         Diag(ImplicitClauseLoc,
3448              diag::err_omp_task_predetermined_firstprivate_ref_type_arg)
3449             << Type;
3450         Diag(RefExpr->getExprLoc(), diag::note_used_here);
3451       } else {
3452         Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3453             << getOpenMPClauseName(OMPC_firstprivate) << Type;
3454       }
3455       bool IsDecl =
3456           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3457       Diag(VD->getLocation(),
3458            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3459           << VD;
3460       continue;
3461     }
3462 
3463     // OpenMP [2.9.3.4, Restrictions, C/C++, p.1]
3464     //  A variable of class type (or array thereof) that appears in a private
3465     //  clause requires an accessible, unambiguous copy constructor for the
3466     //  class type.
3467     Type = Context.getBaseElementType(Type);
3468     CXXRecordDecl *RD = getLangOpts().CPlusPlus
3469                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
3470                             : nullptr;
3471     // FIXME This code must be replaced by actual constructing/destructing of
3472     // the firstprivate variable.
3473     if (RD) {
3474       CXXConstructorDecl *CD = LookupCopyingConstructor(RD, 0);
3475       PartialDiagnostic PD =
3476           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3477       if (!CD ||
3478           CheckConstructorAccess(ELoc, CD,
3479                                  InitializedEntity::InitializeTemporary(Type),
3480                                  CD->getAccess(), PD) == AR_inaccessible ||
3481           CD->isDeleted()) {
3482         if (IsImplicitClause) {
3483           Diag(ImplicitClauseLoc,
3484                diag::err_omp_task_predetermined_firstprivate_required_method)
3485               << 0;
3486           Diag(RefExpr->getExprLoc(), diag::note_used_here);
3487         } else {
3488           Diag(ELoc, diag::err_omp_required_method)
3489               << getOpenMPClauseName(OMPC_firstprivate) << 1;
3490         }
3491         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3492                       VarDecl::DeclarationOnly;
3493         Diag(VD->getLocation(),
3494              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3495             << VD;
3496         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3497         continue;
3498       }
3499       MarkFunctionReferenced(ELoc, CD);
3500       DiagnoseUseOfDecl(CD, ELoc);
3501 
3502       CXXDestructorDecl *DD = RD->getDestructor();
3503       if (DD) {
3504         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
3505             DD->isDeleted()) {
3506           if (IsImplicitClause) {
3507             Diag(ImplicitClauseLoc,
3508                  diag::err_omp_task_predetermined_firstprivate_required_method)
3509                 << 1;
3510             Diag(RefExpr->getExprLoc(), diag::note_used_here);
3511           } else {
3512             Diag(ELoc, diag::err_omp_required_method)
3513                 << getOpenMPClauseName(OMPC_firstprivate) << 4;
3514           }
3515           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3516                         VarDecl::DeclarationOnly;
3517           Diag(VD->getLocation(),
3518                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3519               << VD;
3520           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3521           continue;
3522         }
3523         MarkFunctionReferenced(ELoc, DD);
3524         DiagnoseUseOfDecl(DD, ELoc);
3525       }
3526     }
3527 
3528     // If an implicit firstprivate variable found it was checked already.
3529     if (!IsImplicitClause) {
3530       DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
3531       Type = Type.getNonReferenceType().getCanonicalType();
3532       bool IsConstant = Type.isConstant(Context);
3533       Type = Context.getBaseElementType(Type);
3534       // OpenMP [2.4.13, Data-sharing Attribute Clauses]
3535       //  A list item that specifies a given variable may not appear in more
3536       // than one clause on the same directive, except that a variable may be
3537       //  specified in both firstprivate and lastprivate clauses.
3538       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate &&
3539           DVar.CKind != OMPC_lastprivate && DVar.RefExpr) {
3540         Diag(ELoc, diag::err_omp_wrong_dsa)
3541             << getOpenMPClauseName(DVar.CKind)
3542             << getOpenMPClauseName(OMPC_firstprivate);
3543         ReportOriginalDSA(*this, DSAStack, VD, DVar);
3544         continue;
3545       }
3546 
3547       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
3548       // in a Construct]
3549       //  Variables with the predetermined data-sharing attributes may not be
3550       //  listed in data-sharing attributes clauses, except for the cases
3551       //  listed below. For these exceptions only, listing a predetermined
3552       //  variable in a data-sharing attribute clause is allowed and overrides
3553       //  the variable's predetermined data-sharing attributes.
3554       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
3555       // in a Construct, C/C++, p.2]
3556       //  Variables with const-qualified type having no mutable member may be
3557       //  listed in a firstprivate clause, even if they are static data members.
3558       if (!(IsConstant || VD->isStaticDataMember()) && !DVar.RefExpr &&
3559           DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) {
3560         Diag(ELoc, diag::err_omp_wrong_dsa)
3561             << getOpenMPClauseName(DVar.CKind)
3562             << getOpenMPClauseName(OMPC_firstprivate);
3563         ReportOriginalDSA(*this, DSAStack, VD, DVar);
3564         continue;
3565       }
3566 
3567       OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
3568       // OpenMP [2.9.3.4, Restrictions, p.2]
3569       //  A list item that is private within a parallel region must not appear
3570       //  in a firstprivate clause on a worksharing construct if any of the
3571       //  worksharing regions arising from the worksharing construct ever bind
3572       //  to any of the parallel regions arising from the parallel construct.
3573       if (isOpenMPWorksharingDirective(CurrDir) &&
3574           !isOpenMPParallelDirective(CurrDir)) {
3575         DVar = DSAStack->getImplicitDSA(VD, true);
3576         if (DVar.CKind != OMPC_shared &&
3577             (isOpenMPParallelDirective(DVar.DKind) ||
3578              DVar.DKind == OMPD_unknown)) {
3579           Diag(ELoc, diag::err_omp_required_access)
3580               << getOpenMPClauseName(OMPC_firstprivate)
3581               << getOpenMPClauseName(OMPC_shared);
3582           ReportOriginalDSA(*this, DSAStack, VD, DVar);
3583           continue;
3584         }
3585       }
3586       // OpenMP [2.9.3.4, Restrictions, p.3]
3587       //  A list item that appears in a reduction clause of a parallel construct
3588       //  must not appear in a firstprivate clause on a worksharing or task
3589       //  construct if any of the worksharing or task regions arising from the
3590       //  worksharing or task construct ever bind to any of the parallel regions
3591       //  arising from the parallel construct.
3592       // OpenMP [2.9.3.4, Restrictions, p.4]
3593       //  A list item that appears in a reduction clause in worksharing
3594       //  construct must not appear in a firstprivate clause in a task construct
3595       //  encountered during execution of any of the worksharing regions arising
3596       //  from the worksharing construct.
3597       if (CurrDir == OMPD_task) {
3598         DVar =
3599             DSAStack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction),
3600                                       [](OpenMPDirectiveKind K) -> bool {
3601                                         return isOpenMPParallelDirective(K) ||
3602                                                isOpenMPWorksharingDirective(K);
3603                                       },
3604                                       false);
3605         if (DVar.CKind == OMPC_reduction &&
3606             (isOpenMPParallelDirective(DVar.DKind) ||
3607              isOpenMPWorksharingDirective(DVar.DKind))) {
3608           Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate)
3609               << getOpenMPDirectiveName(DVar.DKind);
3610           ReportOriginalDSA(*this, DSAStack, VD, DVar);
3611           continue;
3612         }
3613       }
3614     }
3615 
3616     DSAStack->addDSA(VD, DE, OMPC_firstprivate);
3617     Vars.push_back(DE);
3618   }
3619 
3620   if (Vars.empty())
3621     return nullptr;
3622 
3623   return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
3624                                        Vars);
3625 }
3626 
3627 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList,
3628                                               SourceLocation StartLoc,
3629                                               SourceLocation LParenLoc,
3630                                               SourceLocation EndLoc) {
3631   SmallVector<Expr *, 8> Vars;
3632   for (auto &RefExpr : VarList) {
3633     assert(RefExpr && "NULL expr in OpenMP lastprivate clause.");
3634     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3635       // It will be analyzed later.
3636       Vars.push_back(RefExpr);
3637       continue;
3638     }
3639 
3640     SourceLocation ELoc = RefExpr->getExprLoc();
3641     // OpenMP [2.1, C/C++]
3642     //  A list item is a variable name.
3643     // OpenMP  [2.14.3.5, Restrictions, p.1]
3644     //  A variable that is part of another variable (as an array or structure
3645     //  element) cannot appear in a lastprivate clause.
3646     DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
3647     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3648       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3649       continue;
3650     }
3651     Decl *D = DE->getDecl();
3652     VarDecl *VD = cast<VarDecl>(D);
3653 
3654     QualType Type = VD->getType();
3655     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3656       // It will be analyzed later.
3657       Vars.push_back(DE);
3658       continue;
3659     }
3660 
3661     // OpenMP [2.14.3.5, Restrictions, C/C++, p.2]
3662     //  A variable that appears in a lastprivate clause must not have an
3663     //  incomplete type or a reference type.
3664     if (RequireCompleteType(ELoc, Type,
3665                             diag::err_omp_lastprivate_incomplete_type)) {
3666       continue;
3667     }
3668     if (Type->isReferenceType()) {
3669       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3670           << getOpenMPClauseName(OMPC_lastprivate) << Type;
3671       bool IsDecl =
3672           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3673       Diag(VD->getLocation(),
3674            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3675           << VD;
3676       continue;
3677     }
3678 
3679     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
3680     // in a Construct]
3681     //  Variables with the predetermined data-sharing attributes may not be
3682     //  listed in data-sharing attributes clauses, except for the cases
3683     //  listed below.
3684     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
3685     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate &&
3686         DVar.CKind != OMPC_firstprivate &&
3687         (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
3688       Diag(ELoc, diag::err_omp_wrong_dsa)
3689           << getOpenMPClauseName(DVar.CKind)
3690           << getOpenMPClauseName(OMPC_lastprivate);
3691       ReportOriginalDSA(*this, DSAStack, VD, DVar);
3692       continue;
3693     }
3694 
3695     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
3696     // OpenMP [2.14.3.5, Restrictions, p.2]
3697     // A list item that is private within a parallel region, or that appears in
3698     // the reduction clause of a parallel construct, must not appear in a
3699     // lastprivate clause on a worksharing construct if any of the corresponding
3700     // worksharing regions ever binds to any of the corresponding parallel
3701     // regions.
3702     if (isOpenMPWorksharingDirective(CurrDir) &&
3703         !isOpenMPParallelDirective(CurrDir)) {
3704       DVar = DSAStack->getImplicitDSA(VD, true);
3705       if (DVar.CKind != OMPC_shared) {
3706         Diag(ELoc, diag::err_omp_required_access)
3707             << getOpenMPClauseName(OMPC_lastprivate)
3708             << getOpenMPClauseName(OMPC_shared);
3709         ReportOriginalDSA(*this, DSAStack, VD, DVar);
3710         continue;
3711       }
3712     }
3713     // OpenMP [2.14.3.5, Restrictions, C++, p.1,2]
3714     //  A variable of class type (or array thereof) that appears in a
3715     //  lastprivate clause requires an accessible, unambiguous default
3716     //  constructor for the class type, unless the list item is also specified
3717     //  in a firstprivate clause.
3718     //  A variable of class type (or array thereof) that appears in a
3719     //  lastprivate clause requires an accessible, unambiguous copy assignment
3720     //  operator for the class type.
3721     while (Type.getNonReferenceType()->isArrayType())
3722       Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr())
3723                  ->getElementType();
3724     CXXRecordDecl *RD = getLangOpts().CPlusPlus
3725                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
3726                             : nullptr;
3727     // FIXME This code must be replaced by actual copying and destructing of the
3728     // lastprivate variable.
3729     if (RD) {
3730       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
3731       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
3732       if (MD) {
3733         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
3734             MD->isDeleted()) {
3735           Diag(ELoc, diag::err_omp_required_method)
3736               << getOpenMPClauseName(OMPC_lastprivate) << 2;
3737           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3738                         VarDecl::DeclarationOnly;
3739           Diag(VD->getLocation(),
3740                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3741               << VD;
3742           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3743           continue;
3744         }
3745         MarkFunctionReferenced(ELoc, MD);
3746         DiagnoseUseOfDecl(MD, ELoc);
3747       }
3748 
3749       CXXDestructorDecl *DD = RD->getDestructor();
3750       if (DD) {
3751         PartialDiagnostic PD =
3752             PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3753         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
3754             DD->isDeleted()) {
3755           Diag(ELoc, diag::err_omp_required_method)
3756               << getOpenMPClauseName(OMPC_lastprivate) << 4;
3757           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3758                         VarDecl::DeclarationOnly;
3759           Diag(VD->getLocation(),
3760                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3761               << VD;
3762           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3763           continue;
3764         }
3765         MarkFunctionReferenced(ELoc, DD);
3766         DiagnoseUseOfDecl(DD, ELoc);
3767       }
3768     }
3769 
3770     if (DVar.CKind != OMPC_firstprivate)
3771       DSAStack->addDSA(VD, DE, OMPC_lastprivate);
3772     Vars.push_back(DE);
3773   }
3774 
3775   if (Vars.empty())
3776     return nullptr;
3777 
3778   return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
3779                                       Vars);
3780 }
3781 
3782 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
3783                                          SourceLocation StartLoc,
3784                                          SourceLocation LParenLoc,
3785                                          SourceLocation EndLoc) {
3786   SmallVector<Expr *, 8> Vars;
3787   for (auto &RefExpr : VarList) {
3788     assert(RefExpr && "NULL expr in OpenMP shared clause.");
3789     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3790       // It will be analyzed later.
3791       Vars.push_back(RefExpr);
3792       continue;
3793     }
3794 
3795     SourceLocation ELoc = RefExpr->getExprLoc();
3796     // OpenMP [2.1, C/C++]
3797     //  A list item is a variable name.
3798     // OpenMP  [2.14.3.2, Restrictions, p.1]
3799     //  A variable that is part of another variable (as an array or structure
3800     //  element) cannot appear in a shared unless it is a static data member
3801     //  of a C++ class.
3802     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
3803     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3804       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
3805       continue;
3806     }
3807     Decl *D = DE->getDecl();
3808     VarDecl *VD = cast<VarDecl>(D);
3809 
3810     QualType Type = VD->getType();
3811     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3812       // It will be analyzed later.
3813       Vars.push_back(DE);
3814       continue;
3815     }
3816 
3817     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
3818     // in a Construct]
3819     //  Variables with the predetermined data-sharing attributes may not be
3820     //  listed in data-sharing attributes clauses, except for the cases
3821     //  listed below. For these exceptions only, listing a predetermined
3822     //  variable in a data-sharing attribute clause is allowed and overrides
3823     //  the variable's predetermined data-sharing attributes.
3824     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
3825     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared &&
3826         DVar.RefExpr) {
3827       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
3828                                           << getOpenMPClauseName(OMPC_shared);
3829       ReportOriginalDSA(*this, DSAStack, VD, DVar);
3830       continue;
3831     }
3832 
3833     DSAStack->addDSA(VD, DE, OMPC_shared);
3834     Vars.push_back(DE);
3835   }
3836 
3837   if (Vars.empty())
3838     return nullptr;
3839 
3840   return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
3841 }
3842 
3843 namespace {
3844 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> {
3845   DSAStackTy *Stack;
3846 
3847 public:
3848   bool VisitDeclRefExpr(DeclRefExpr *E) {
3849     if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
3850       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, false);
3851       if (DVar.CKind == OMPC_shared && !DVar.RefExpr)
3852         return false;
3853       if (DVar.CKind != OMPC_unknown)
3854         return true;
3855       DSAStackTy::DSAVarData DVarPrivate =
3856           Stack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(), false);
3857       if (DVarPrivate.CKind != OMPC_unknown)
3858         return true;
3859       return false;
3860     }
3861     return false;
3862   }
3863   bool VisitStmt(Stmt *S) {
3864     for (auto Child : S->children()) {
3865       if (Child && Visit(Child))
3866         return true;
3867     }
3868     return false;
3869   }
3870   explicit DSARefChecker(DSAStackTy *S) : Stack(S) {}
3871 };
3872 } // namespace
3873 
3874 OMPClause *Sema::ActOnOpenMPReductionClause(
3875     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
3876     SourceLocation ColonLoc, SourceLocation EndLoc,
3877     CXXScopeSpec &ReductionIdScopeSpec,
3878     const DeclarationNameInfo &ReductionId) {
3879   // TODO: Allow scope specification search when 'declare reduction' is
3880   // supported.
3881   assert(ReductionIdScopeSpec.isEmpty() &&
3882          "No support for scoped reduction identifiers yet.");
3883 
3884   auto DN = ReductionId.getName();
3885   auto OOK = DN.getCXXOverloadedOperator();
3886   BinaryOperatorKind BOK = BO_Comma;
3887 
3888   // OpenMP [2.14.3.6, reduction clause]
3889   // C
3890   // reduction-identifier is either an identifier or one of the following
3891   // operators: +, -, *,  &, |, ^, && and ||
3892   // C++
3893   // reduction-identifier is either an id-expression or one of the following
3894   // operators: +, -, *, &, |, ^, && and ||
3895   // FIXME: Only 'min' and 'max' identifiers are supported for now.
3896   switch (OOK) {
3897   case OO_Plus:
3898   case OO_Minus:
3899     BOK = BO_AddAssign;
3900     break;
3901   case OO_Star:
3902     BOK = BO_MulAssign;
3903     break;
3904   case OO_Amp:
3905     BOK = BO_AndAssign;
3906     break;
3907   case OO_Pipe:
3908     BOK = BO_OrAssign;
3909     break;
3910   case OO_Caret:
3911     BOK = BO_XorAssign;
3912     break;
3913   case OO_AmpAmp:
3914     BOK = BO_LAnd;
3915     break;
3916   case OO_PipePipe:
3917     BOK = BO_LOr;
3918     break;
3919   default:
3920     if (auto II = DN.getAsIdentifierInfo()) {
3921       if (II->isStr("max"))
3922         BOK = BO_GT;
3923       else if (II->isStr("min"))
3924         BOK = BO_LT;
3925     }
3926     break;
3927   }
3928   SourceRange ReductionIdRange;
3929   if (ReductionIdScopeSpec.isValid()) {
3930     ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc());
3931   }
3932   ReductionIdRange.setEnd(ReductionId.getEndLoc());
3933   if (BOK == BO_Comma) {
3934     // Not allowed reduction identifier is found.
3935     Diag(ReductionId.getLocStart(), diag::err_omp_unknown_reduction_identifier)
3936         << ReductionIdRange;
3937     return nullptr;
3938   }
3939 
3940   SmallVector<Expr *, 8> Vars;
3941   for (auto RefExpr : VarList) {
3942     assert(RefExpr && "nullptr expr in OpenMP reduction clause.");
3943     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
3944       // It will be analyzed later.
3945       Vars.push_back(RefExpr);
3946       continue;
3947     }
3948 
3949     if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() ||
3950         RefExpr->isInstantiationDependent() ||
3951         RefExpr->containsUnexpandedParameterPack()) {
3952       // It will be analyzed later.
3953       Vars.push_back(RefExpr);
3954       continue;
3955     }
3956 
3957     auto ELoc = RefExpr->getExprLoc();
3958     auto ERange = RefExpr->getSourceRange();
3959     // OpenMP [2.1, C/C++]
3960     //  A list item is a variable or array section, subject to the restrictions
3961     //  specified in Section 2.4 on page 42 and in each of the sections
3962     // describing clauses and directives for which a list appears.
3963     // OpenMP  [2.14.3.3, Restrictions, p.1]
3964     //  A variable that is part of another variable (as an array or
3965     //  structure element) cannot appear in a private clause.
3966     auto DE = dyn_cast<DeclRefExpr>(RefExpr);
3967     if (!DE || !isa<VarDecl>(DE->getDecl())) {
3968       Diag(ELoc, diag::err_omp_expected_var_name) << ERange;
3969       continue;
3970     }
3971     auto D = DE->getDecl();
3972     auto VD = cast<VarDecl>(D);
3973     auto Type = VD->getType();
3974     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3975     //  A variable that appears in a private clause must not have an incomplete
3976     //  type or a reference type.
3977     if (RequireCompleteType(ELoc, Type,
3978                             diag::err_omp_reduction_incomplete_type))
3979       continue;
3980     // OpenMP [2.14.3.6, reduction clause, Restrictions]
3981     // Arrays may not appear in a reduction clause.
3982     if (Type.getNonReferenceType()->isArrayType()) {
3983       Diag(ELoc, diag::err_omp_reduction_type_array) << Type << ERange;
3984       bool IsDecl =
3985           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3986       Diag(VD->getLocation(),
3987            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
3988           << VD;
3989       continue;
3990     }
3991     // OpenMP [2.14.3.6, reduction clause, Restrictions]
3992     // A list item that appears in a reduction clause must not be
3993     // const-qualified.
3994     if (Type.getNonReferenceType().isConstant(Context)) {
3995       Diag(ELoc, diag::err_omp_const_variable)
3996           << getOpenMPClauseName(OMPC_reduction) << Type << ERange;
3997       bool IsDecl =
3998           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
3999       Diag(VD->getLocation(),
4000            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4001           << VD;
4002       continue;
4003     }
4004     // OpenMP [2.9.3.6, Restrictions, C/C++, p.4]
4005     //  If a list-item is a reference type then it must bind to the same object
4006     //  for all threads of the team.
4007     VarDecl *VDDef = VD->getDefinition();
4008     if (Type->isReferenceType() && VDDef) {
4009       DSARefChecker Check(DSAStack);
4010       if (Check.Visit(VDDef->getInit())) {
4011         Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange;
4012         Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef;
4013         continue;
4014       }
4015     }
4016     // OpenMP [2.14.3.6, reduction clause, Restrictions]
4017     // The type of a list item that appears in a reduction clause must be valid
4018     // for the reduction-identifier. For a max or min reduction in C, the type
4019     // of the list item must be an allowed arithmetic data type: char, int,
4020     // float, double, or _Bool, possibly modified with long, short, signed, or
4021     // unsigned. For a max or min reduction in C++, the type of the list item
4022     // must be an allowed arithmetic data type: char, wchar_t, int, float,
4023     // double, or bool, possibly modified with long, short, signed, or unsigned.
4024     if ((BOK == BO_GT || BOK == BO_LT) &&
4025         !(Type->isScalarType() ||
4026           (getLangOpts().CPlusPlus && Type->isArithmeticType()))) {
4027       Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg)
4028           << getLangOpts().CPlusPlus;
4029       bool IsDecl =
4030           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4031       Diag(VD->getLocation(),
4032            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4033           << VD;
4034       continue;
4035     }
4036     if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) &&
4037         !getLangOpts().CPlusPlus && Type->isFloatingType()) {
4038       Diag(ELoc, diag::err_omp_clause_floating_type_arg);
4039       bool IsDecl =
4040           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4041       Diag(VD->getLocation(),
4042            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4043           << VD;
4044       continue;
4045     }
4046     bool Suppress = getDiagnostics().getSuppressAllDiagnostics();
4047     getDiagnostics().setSuppressAllDiagnostics(true);
4048     ExprResult ReductionOp =
4049         BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK,
4050                    RefExpr, RefExpr);
4051     getDiagnostics().setSuppressAllDiagnostics(Suppress);
4052     if (ReductionOp.isInvalid()) {
4053       Diag(ELoc, diag::err_omp_reduction_id_not_compatible) << Type
4054                                                             << ReductionIdRange;
4055       bool IsDecl =
4056           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4057       Diag(VD->getLocation(),
4058            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4059           << VD;
4060       continue;
4061     }
4062 
4063     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
4064     // in a Construct]
4065     //  Variables with the predetermined data-sharing attributes may not be
4066     //  listed in data-sharing attributes clauses, except for the cases
4067     //  listed below. For these exceptions only, listing a predetermined
4068     //  variable in a data-sharing attribute clause is allowed and overrides
4069     //  the variable's predetermined data-sharing attributes.
4070     // OpenMP [2.14.3.6, Restrictions, p.3]
4071     //  Any number of reduction clauses can be specified on the directive,
4072     //  but a list item can appear only once in the reduction clauses for that
4073     //  directive.
4074     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4075     if (DVar.CKind == OMPC_reduction) {
4076       Diag(ELoc, diag::err_omp_once_referenced)
4077           << getOpenMPClauseName(OMPC_reduction);
4078       if (DVar.RefExpr) {
4079         Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced);
4080       }
4081     } else if (DVar.CKind != OMPC_unknown) {
4082       Diag(ELoc, diag::err_omp_wrong_dsa)
4083           << getOpenMPClauseName(DVar.CKind)
4084           << getOpenMPClauseName(OMPC_reduction);
4085       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4086       continue;
4087     }
4088 
4089     // OpenMP [2.14.3.6, Restrictions, p.1]
4090     //  A list item that appears in a reduction clause of a worksharing
4091     //  construct must be shared in the parallel regions to which any of the
4092     //  worksharing regions arising from the worksharing construct bind.
4093     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
4094     if (isOpenMPWorksharingDirective(CurrDir) &&
4095         !isOpenMPParallelDirective(CurrDir)) {
4096       DVar = DSAStack->getImplicitDSA(VD, true);
4097       if (DVar.CKind != OMPC_shared) {
4098         Diag(ELoc, diag::err_omp_required_access)
4099             << getOpenMPClauseName(OMPC_reduction)
4100             << getOpenMPClauseName(OMPC_shared);
4101         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4102         continue;
4103       }
4104     }
4105 
4106     CXXRecordDecl *RD = getLangOpts().CPlusPlus
4107                             ? Type.getNonReferenceType()->getAsCXXRecordDecl()
4108                             : nullptr;
4109     // FIXME This code must be replaced by actual constructing/destructing of
4110     // the reduction variable.
4111     if (RD) {
4112       CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
4113       PartialDiagnostic PD =
4114           PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
4115       if (!CD ||
4116           CheckConstructorAccess(ELoc, CD,
4117                                  InitializedEntity::InitializeTemporary(Type),
4118                                  CD->getAccess(), PD) == AR_inaccessible ||
4119           CD->isDeleted()) {
4120         Diag(ELoc, diag::err_omp_required_method)
4121             << getOpenMPClauseName(OMPC_reduction) << 0;
4122         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4123                       VarDecl::DeclarationOnly;
4124         Diag(VD->getLocation(),
4125              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4126             << VD;
4127         Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4128         continue;
4129       }
4130       MarkFunctionReferenced(ELoc, CD);
4131       DiagnoseUseOfDecl(CD, ELoc);
4132 
4133       CXXDestructorDecl *DD = RD->getDestructor();
4134       if (DD) {
4135         if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
4136             DD->isDeleted()) {
4137           Diag(ELoc, diag::err_omp_required_method)
4138               << getOpenMPClauseName(OMPC_reduction) << 4;
4139           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4140                         VarDecl::DeclarationOnly;
4141           Diag(VD->getLocation(),
4142                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4143               << VD;
4144           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4145           continue;
4146         }
4147         MarkFunctionReferenced(ELoc, DD);
4148         DiagnoseUseOfDecl(DD, ELoc);
4149       }
4150     }
4151 
4152     DSAStack->addDSA(VD, DE, OMPC_reduction);
4153     Vars.push_back(DE);
4154   }
4155 
4156   if (Vars.empty())
4157     return nullptr;
4158 
4159   return OMPReductionClause::Create(
4160       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, Vars,
4161       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId);
4162 }
4163 
4164 OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
4165                                          SourceLocation StartLoc,
4166                                          SourceLocation LParenLoc,
4167                                          SourceLocation ColonLoc,
4168                                          SourceLocation EndLoc) {
4169   SmallVector<Expr *, 8> Vars;
4170   for (auto &RefExpr : VarList) {
4171     assert(RefExpr && "NULL expr in OpenMP linear clause.");
4172     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4173       // It will be analyzed later.
4174       Vars.push_back(RefExpr);
4175       continue;
4176     }
4177 
4178     // OpenMP [2.14.3.7, linear clause]
4179     // A list item that appears in a linear clause is subject to the private
4180     // clause semantics described in Section 2.14.3.3 on page 159 except as
4181     // noted. In addition, the value of the new list item on each iteration
4182     // of the associated loop(s) corresponds to the value of the original
4183     // list item before entering the construct plus the logical number of
4184     // the iteration times linear-step.
4185 
4186     SourceLocation ELoc = RefExpr->getExprLoc();
4187     // OpenMP [2.1, C/C++]
4188     //  A list item is a variable name.
4189     // OpenMP  [2.14.3.3, Restrictions, p.1]
4190     //  A variable that is part of another variable (as an array or
4191     //  structure element) cannot appear in a private clause.
4192     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4193     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4194       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4195       continue;
4196     }
4197 
4198     VarDecl *VD = cast<VarDecl>(DE->getDecl());
4199 
4200     // OpenMP [2.14.3.7, linear clause]
4201     //  A list-item cannot appear in more than one linear clause.
4202     //  A list-item that appears in a linear clause cannot appear in any
4203     //  other data-sharing attribute clause.
4204     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false);
4205     if (DVar.RefExpr) {
4206       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
4207                                           << getOpenMPClauseName(OMPC_linear);
4208       ReportOriginalDSA(*this, DSAStack, VD, DVar);
4209       continue;
4210     }
4211 
4212     QualType QType = VD->getType();
4213     if (QType->isDependentType() || QType->isInstantiationDependentType()) {
4214       // It will be analyzed later.
4215       Vars.push_back(DE);
4216       continue;
4217     }
4218 
4219     // A variable must not have an incomplete type or a reference type.
4220     if (RequireCompleteType(ELoc, QType,
4221                             diag::err_omp_linear_incomplete_type)) {
4222       continue;
4223     }
4224     if (QType->isReferenceType()) {
4225       Diag(ELoc, diag::err_omp_clause_ref_type_arg)
4226           << getOpenMPClauseName(OMPC_linear) << QType;
4227       bool IsDecl =
4228           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4229       Diag(VD->getLocation(),
4230            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4231           << VD;
4232       continue;
4233     }
4234 
4235     // A list item must not be const-qualified.
4236     if (QType.isConstant(Context)) {
4237       Diag(ELoc, diag::err_omp_const_variable)
4238           << getOpenMPClauseName(OMPC_linear);
4239       bool IsDecl =
4240           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4241       Diag(VD->getLocation(),
4242            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4243           << VD;
4244       continue;
4245     }
4246 
4247     // A list item must be of integral or pointer type.
4248     QType = QType.getUnqualifiedType().getCanonicalType();
4249     const Type *Ty = QType.getTypePtrOrNull();
4250     if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) &&
4251                 !Ty->isPointerType())) {
4252       Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << QType;
4253       bool IsDecl =
4254           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4255       Diag(VD->getLocation(),
4256            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4257           << VD;
4258       continue;
4259     }
4260 
4261     DSAStack->addDSA(VD, DE, OMPC_linear);
4262     Vars.push_back(DE);
4263   }
4264 
4265   if (Vars.empty())
4266     return nullptr;
4267 
4268   Expr *StepExpr = Step;
4269   if (Step && !Step->isValueDependent() && !Step->isTypeDependent() &&
4270       !Step->isInstantiationDependent() &&
4271       !Step->containsUnexpandedParameterPack()) {
4272     SourceLocation StepLoc = Step->getLocStart();
4273     ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step);
4274     if (Val.isInvalid())
4275       return nullptr;
4276     StepExpr = Val.get();
4277 
4278     // Warn about zero linear step (it would be probably better specified as
4279     // making corresponding variables 'const').
4280     llvm::APSInt Result;
4281     if (StepExpr->isIntegerConstantExpr(Result, Context) &&
4282         !Result.isNegative() && !Result.isStrictlyPositive())
4283       Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0]
4284                                                      << (Vars.size() > 1);
4285   }
4286 
4287   return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc,
4288                                  Vars, StepExpr);
4289 }
4290 
4291 OMPClause *Sema::ActOnOpenMPAlignedClause(
4292     ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc,
4293     SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {
4294 
4295   SmallVector<Expr *, 8> Vars;
4296   for (auto &RefExpr : VarList) {
4297     assert(RefExpr && "NULL expr in OpenMP aligned clause.");
4298     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4299       // It will be analyzed later.
4300       Vars.push_back(RefExpr);
4301       continue;
4302     }
4303 
4304     SourceLocation ELoc = RefExpr->getExprLoc();
4305     // OpenMP [2.1, C/C++]
4306     //  A list item is a variable name.
4307     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4308     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4309       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4310       continue;
4311     }
4312 
4313     VarDecl *VD = cast<VarDecl>(DE->getDecl());
4314 
4315     // OpenMP  [2.8.1, simd construct, Restrictions]
4316     // The type of list items appearing in the aligned clause must be
4317     // array, pointer, reference to array, or reference to pointer.
4318     QualType QType = DE->getType()
4319                          .getNonReferenceType()
4320                          .getUnqualifiedType()
4321                          .getCanonicalType();
4322     const Type *Ty = QType.getTypePtrOrNull();
4323     if (!Ty || (!Ty->isDependentType() && !Ty->isArrayType() &&
4324                 !Ty->isPointerType())) {
4325       Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr)
4326           << QType << getLangOpts().CPlusPlus << RefExpr->getSourceRange();
4327       bool IsDecl =
4328           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
4329       Diag(VD->getLocation(),
4330            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4331           << VD;
4332       continue;
4333     }
4334 
4335     // OpenMP  [2.8.1, simd construct, Restrictions]
4336     // A list-item cannot appear in more than one aligned clause.
4337     if (DeclRefExpr *PrevRef = DSAStack->addUniqueAligned(VD, DE)) {
4338       Diag(ELoc, diag::err_omp_aligned_twice) << RefExpr->getSourceRange();
4339       Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa)
4340           << getOpenMPClauseName(OMPC_aligned);
4341       continue;
4342     }
4343 
4344     Vars.push_back(DE);
4345   }
4346 
4347   // OpenMP [2.8.1, simd construct, Description]
4348   // The parameter of the aligned clause, alignment, must be a constant
4349   // positive integer expression.
4350   // If no optional parameter is specified, implementation-defined default
4351   // alignments for SIMD instructions on the target platforms are assumed.
4352   if (Alignment != nullptr) {
4353     ExprResult AlignResult =
4354         VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned);
4355     if (AlignResult.isInvalid())
4356       return nullptr;
4357     Alignment = AlignResult.get();
4358   }
4359   if (Vars.empty())
4360     return nullptr;
4361 
4362   return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc,
4363                                   EndLoc, Vars, Alignment);
4364 }
4365 
4366 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList,
4367                                          SourceLocation StartLoc,
4368                                          SourceLocation LParenLoc,
4369                                          SourceLocation EndLoc) {
4370   SmallVector<Expr *, 8> Vars;
4371   for (auto &RefExpr : VarList) {
4372     assert(RefExpr && "NULL expr in OpenMP copyin clause.");
4373     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4374       // It will be analyzed later.
4375       Vars.push_back(RefExpr);
4376       continue;
4377     }
4378 
4379     SourceLocation ELoc = RefExpr->getExprLoc();
4380     // OpenMP [2.1, C/C++]
4381     //  A list item is a variable name.
4382     // OpenMP  [2.14.4.1, Restrictions, p.1]
4383     //  A list item that appears in a copyin clause must be threadprivate.
4384     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4385     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4386       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4387       continue;
4388     }
4389 
4390     Decl *D = DE->getDecl();
4391     VarDecl *VD = cast<VarDecl>(D);
4392 
4393     QualType Type = VD->getType();
4394     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4395       // It will be analyzed later.
4396       Vars.push_back(DE);
4397       continue;
4398     }
4399 
4400     // OpenMP [2.14.4.1, Restrictions, C/C++, p.1]
4401     //  A list item that appears in a copyin clause must be threadprivate.
4402     if (!DSAStack->isThreadPrivate(VD)) {
4403       Diag(ELoc, diag::err_omp_required_access)
4404           << getOpenMPClauseName(OMPC_copyin)
4405           << getOpenMPDirectiveName(OMPD_threadprivate);
4406       continue;
4407     }
4408 
4409     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
4410     //  A variable of class type (or array thereof) that appears in a
4411     //  copyin clause requires an accessible, unambiguous copy assignment
4412     //  operator for the class type.
4413     Type = Context.getBaseElementType(Type);
4414     CXXRecordDecl *RD =
4415         getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
4416     // FIXME This code must be replaced by actual assignment of the
4417     // threadprivate variable.
4418     if (RD) {
4419       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
4420       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
4421       if (MD) {
4422         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
4423             MD->isDeleted()) {
4424           Diag(ELoc, diag::err_omp_required_method)
4425               << getOpenMPClauseName(OMPC_copyin) << 2;
4426           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4427                         VarDecl::DeclarationOnly;
4428           Diag(VD->getLocation(),
4429                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4430               << VD;
4431           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4432           continue;
4433         }
4434         MarkFunctionReferenced(ELoc, MD);
4435         DiagnoseUseOfDecl(MD, ELoc);
4436       }
4437     }
4438 
4439     DSAStack->addDSA(VD, DE, OMPC_copyin);
4440     Vars.push_back(DE);
4441   }
4442 
4443   if (Vars.empty())
4444     return nullptr;
4445 
4446   return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
4447 }
4448 
4449 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
4450                                               SourceLocation StartLoc,
4451                                               SourceLocation LParenLoc,
4452                                               SourceLocation EndLoc) {
4453   SmallVector<Expr *, 8> Vars;
4454   for (auto &RefExpr : VarList) {
4455     assert(RefExpr && "NULL expr in OpenMP copyprivate clause.");
4456     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
4457       // It will be analyzed later.
4458       Vars.push_back(RefExpr);
4459       continue;
4460     }
4461 
4462     SourceLocation ELoc = RefExpr->getExprLoc();
4463     // OpenMP [2.1, C/C++]
4464     //  A list item is a variable name.
4465     // OpenMP  [2.14.4.1, Restrictions, p.1]
4466     //  A list item that appears in a copyin clause must be threadprivate.
4467     DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr);
4468     if (!DE || !isa<VarDecl>(DE->getDecl())) {
4469       Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange();
4470       continue;
4471     }
4472 
4473     Decl *D = DE->getDecl();
4474     VarDecl *VD = cast<VarDecl>(D);
4475 
4476     QualType Type = VD->getType();
4477     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
4478       // It will be analyzed later.
4479       Vars.push_back(DE);
4480       continue;
4481     }
4482 
4483     // OpenMP [2.14.4.2, Restrictions, p.2]
4484     //  A list item that appears in a copyprivate clause may not appear in a
4485     //  private or firstprivate clause on the single construct.
4486     if (!DSAStack->isThreadPrivate(VD)) {
4487       auto DVar = DSAStack->getTopDSA(VD, false);
4488       if (DVar.CKind != OMPC_copyprivate && DVar.CKind != OMPC_unknown &&
4489           !(DVar.CKind == OMPC_private && !DVar.RefExpr)) {
4490         Diag(ELoc, diag::err_omp_wrong_dsa)
4491             << getOpenMPClauseName(DVar.CKind)
4492             << getOpenMPClauseName(OMPC_copyprivate);
4493         ReportOriginalDSA(*this, DSAStack, VD, DVar);
4494         continue;
4495       }
4496 
4497       // OpenMP [2.11.4.2, Restrictions, p.1]
4498       //  All list items that appear in a copyprivate clause must be either
4499       //  threadprivate or private in the enclosing context.
4500       if (DVar.CKind == OMPC_unknown) {
4501         DVar = DSAStack->getImplicitDSA(VD, false);
4502         if (DVar.CKind == OMPC_shared) {
4503           Diag(ELoc, diag::err_omp_required_access)
4504               << getOpenMPClauseName(OMPC_copyprivate)
4505               << "threadprivate or private in the enclosing context";
4506           ReportOriginalDSA(*this, DSAStack, VD, DVar);
4507           continue;
4508         }
4509       }
4510     }
4511 
4512     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
4513     //  A variable of class type (or array thereof) that appears in a
4514     //  copyin clause requires an accessible, unambiguous copy assignment
4515     //  operator for the class type.
4516     Type = Context.getBaseElementType(Type);
4517     CXXRecordDecl *RD =
4518         getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr;
4519     // FIXME This code must be replaced by actual assignment of the
4520     // threadprivate variable.
4521     if (RD) {
4522       CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0);
4523       DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess());
4524       if (MD) {
4525         if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible ||
4526             MD->isDeleted()) {
4527           Diag(ELoc, diag::err_omp_required_method)
4528               << getOpenMPClauseName(OMPC_copyprivate) << 2;
4529           bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
4530                         VarDecl::DeclarationOnly;
4531           Diag(VD->getLocation(),
4532                IsDecl ? diag::note_previous_decl : diag::note_defined_here)
4533               << VD;
4534           Diag(RD->getLocation(), diag::note_previous_decl) << RD;
4535           continue;
4536         }
4537         MarkFunctionReferenced(ELoc, MD);
4538         DiagnoseUseOfDecl(MD, ELoc);
4539       }
4540     }
4541 
4542     // No need to mark vars as copyprivate, they are already threadprivate or
4543     // implicitly private.
4544     Vars.push_back(DE);
4545   }
4546 
4547   if (Vars.empty())
4548     return nullptr;
4549 
4550   return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
4551 }
4552 
4553 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList,
4554                                         SourceLocation StartLoc,
4555                                         SourceLocation LParenLoc,
4556                                         SourceLocation EndLoc) {
4557   if (VarList.empty())
4558     return nullptr;
4559 
4560   return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList);
4561 }
4562 
4563