xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Sema/SemaOpenMP.cpp (revision ed75d7a867996c84cfa88e3b8906816277e957f7)
1 //===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 /// This file implements semantic analysis for OpenMP directives and
10 /// clauses.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #include "TreeTransform.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTMutationListener.h"
17 #include "clang/AST/CXXInheritance.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclCXX.h"
20 #include "clang/AST/DeclOpenMP.h"
21 #include "clang/AST/StmtCXX.h"
22 #include "clang/AST/StmtOpenMP.h"
23 #include "clang/AST/StmtVisitor.h"
24 #include "clang/AST/TypeOrdering.h"
25 #include "clang/Basic/OpenMPKinds.h"
26 #include "clang/Sema/Initialization.h"
27 #include "clang/Sema/Lookup.h"
28 #include "clang/Sema/Scope.h"
29 #include "clang/Sema/ScopeInfo.h"
30 #include "clang/Sema/SemaInternal.h"
31 #include "llvm/ADT/PointerEmbeddedInt.h"
32 using namespace clang;
33 
34 //===----------------------------------------------------------------------===//
35 // Stack of data-sharing attributes for variables
36 //===----------------------------------------------------------------------===//
37 
38 static const Expr *checkMapClauseExpressionBase(
39     Sema &SemaRef, Expr *E,
40     OMPClauseMappableExprCommon::MappableExprComponentList &CurComponents,
41     OpenMPClauseKind CKind, bool NoDiagnose);
42 
43 namespace {
44 /// Default data sharing attributes, which can be applied to directive.
45 enum DefaultDataSharingAttributes {
46   DSA_unspecified = 0, /// Data sharing attribute not specified.
47   DSA_none = 1 << 0,   /// Default data sharing attribute 'none'.
48   DSA_shared = 1 << 1, /// Default data sharing attribute 'shared'.
49 };
50 
51 /// Attributes of the defaultmap clause.
52 enum DefaultMapAttributes {
53   DMA_unspecified,   /// Default mapping is not specified.
54   DMA_tofrom_scalar, /// Default mapping is 'tofrom:scalar'.
55 };
56 
57 /// Stack for tracking declarations used in OpenMP directives and
58 /// clauses and their data-sharing attributes.
59 class DSAStackTy {
60 public:
61   struct DSAVarData {
62     OpenMPDirectiveKind DKind = OMPD_unknown;
63     OpenMPClauseKind CKind = OMPC_unknown;
64     const Expr *RefExpr = nullptr;
65     DeclRefExpr *PrivateCopy = nullptr;
66     SourceLocation ImplicitDSALoc;
67     DSAVarData() = default;
68     DSAVarData(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind,
69                const Expr *RefExpr, DeclRefExpr *PrivateCopy,
70                SourceLocation ImplicitDSALoc)
71         : DKind(DKind), CKind(CKind), RefExpr(RefExpr),
72           PrivateCopy(PrivateCopy), ImplicitDSALoc(ImplicitDSALoc) {}
73   };
74   using OperatorOffsetTy =
75       llvm::SmallVector<std::pair<Expr *, OverloadedOperatorKind>, 4>;
76   using DoacrossDependMapTy =
77       llvm::DenseMap<OMPDependClause *, OperatorOffsetTy>;
78 
79 private:
80   struct DSAInfo {
81     OpenMPClauseKind Attributes = OMPC_unknown;
82     /// Pointer to a reference expression and a flag which shows that the
83     /// variable is marked as lastprivate(true) or not (false).
84     llvm::PointerIntPair<const Expr *, 1, bool> RefExpr;
85     DeclRefExpr *PrivateCopy = nullptr;
86   };
87   using DeclSAMapTy = llvm::SmallDenseMap<const ValueDecl *, DSAInfo, 8>;
88   using AlignedMapTy = llvm::SmallDenseMap<const ValueDecl *, const Expr *, 8>;
89   using LCDeclInfo = std::pair<unsigned, VarDecl *>;
90   using LoopControlVariablesMapTy =
91       llvm::SmallDenseMap<const ValueDecl *, LCDeclInfo, 8>;
92   /// Struct that associates a component with the clause kind where they are
93   /// found.
94   struct MappedExprComponentTy {
95     OMPClauseMappableExprCommon::MappableExprComponentLists Components;
96     OpenMPClauseKind Kind = OMPC_unknown;
97   };
98   using MappedExprComponentsTy =
99       llvm::DenseMap<const ValueDecl *, MappedExprComponentTy>;
100   using CriticalsWithHintsTy =
101       llvm::StringMap<std::pair<const OMPCriticalDirective *, llvm::APSInt>>;
102   struct ReductionData {
103     using BOKPtrType = llvm::PointerEmbeddedInt<BinaryOperatorKind, 16>;
104     SourceRange ReductionRange;
105     llvm::PointerUnion<const Expr *, BOKPtrType> ReductionOp;
106     ReductionData() = default;
107     void set(BinaryOperatorKind BO, SourceRange RR) {
108       ReductionRange = RR;
109       ReductionOp = BO;
110     }
111     void set(const Expr *RefExpr, SourceRange RR) {
112       ReductionRange = RR;
113       ReductionOp = RefExpr;
114     }
115   };
116   using DeclReductionMapTy =
117       llvm::SmallDenseMap<const ValueDecl *, ReductionData, 4>;
118 
119   struct SharingMapTy {
120     DeclSAMapTy SharingMap;
121     DeclReductionMapTy ReductionMap;
122     AlignedMapTy AlignedMap;
123     MappedExprComponentsTy MappedExprComponents;
124     LoopControlVariablesMapTy LCVMap;
125     DefaultDataSharingAttributes DefaultAttr = DSA_unspecified;
126     SourceLocation DefaultAttrLoc;
127     DefaultMapAttributes DefaultMapAttr = DMA_unspecified;
128     SourceLocation DefaultMapAttrLoc;
129     OpenMPDirectiveKind Directive = OMPD_unknown;
130     DeclarationNameInfo DirectiveName;
131     Scope *CurScope = nullptr;
132     SourceLocation ConstructLoc;
133     /// Set of 'depend' clauses with 'sink|source' dependence kind. Required to
134     /// get the data (loop counters etc.) about enclosing loop-based construct.
135     /// This data is required during codegen.
136     DoacrossDependMapTy DoacrossDepends;
137     /// First argument (Expr *) contains optional argument of the
138     /// 'ordered' clause, the second one is true if the regions has 'ordered'
139     /// clause, false otherwise.
140     llvm::Optional<std::pair<const Expr *, OMPOrderedClause *>> OrderedRegion;
141     unsigned AssociatedLoops = 1;
142     bool HasMutipleLoops = false;
143     const Decl *PossiblyLoopCounter = nullptr;
144     bool NowaitRegion = false;
145     bool CancelRegion = false;
146     bool LoopStart = false;
147     bool BodyComplete = false;
148     SourceLocation InnerTeamsRegionLoc;
149     /// Reference to the taskgroup task_reduction reference expression.
150     Expr *TaskgroupReductionRef = nullptr;
151     llvm::DenseSet<QualType> MappedClassesQualTypes;
152     /// List of globals marked as declare target link in this target region
153     /// (isOpenMPTargetExecutionDirective(Directive) == true).
154     llvm::SmallVector<DeclRefExpr *, 4> DeclareTargetLinkVarDecls;
155     SharingMapTy(OpenMPDirectiveKind DKind, DeclarationNameInfo Name,
156                  Scope *CurScope, SourceLocation Loc)
157         : Directive(DKind), DirectiveName(Name), CurScope(CurScope),
158           ConstructLoc(Loc) {}
159     SharingMapTy() = default;
160   };
161 
162   using StackTy = SmallVector<SharingMapTy, 4>;
163 
164   /// Stack of used declaration and their data-sharing attributes.
165   DeclSAMapTy Threadprivates;
166   const FunctionScopeInfo *CurrentNonCapturingFunctionScope = nullptr;
167   SmallVector<std::pair<StackTy, const FunctionScopeInfo *>, 4> Stack;
168   /// true, if check for DSA must be from parent directive, false, if
169   /// from current directive.
170   OpenMPClauseKind ClauseKindMode = OMPC_unknown;
171   Sema &SemaRef;
172   bool ForceCapturing = false;
173   /// true if all the variables in the target executable directives must be
174   /// captured by reference.
175   bool ForceCaptureByReferenceInTargetExecutable = false;
176   CriticalsWithHintsTy Criticals;
177   unsigned IgnoredStackElements = 0;
178 
179   /// Iterators over the stack iterate in order from innermost to outermost
180   /// directive.
181   using const_iterator = StackTy::const_reverse_iterator;
182   const_iterator begin() const {
183     return Stack.empty() ? const_iterator()
184                          : Stack.back().first.rbegin() + IgnoredStackElements;
185   }
186   const_iterator end() const {
187     return Stack.empty() ? const_iterator() : Stack.back().first.rend();
188   }
189   using iterator = StackTy::reverse_iterator;
190   iterator begin() {
191     return Stack.empty() ? iterator()
192                          : Stack.back().first.rbegin() + IgnoredStackElements;
193   }
194   iterator end() {
195     return Stack.empty() ? iterator() : Stack.back().first.rend();
196   }
197 
198   // Convenience operations to get at the elements of the stack.
199 
200   bool isStackEmpty() const {
201     return Stack.empty() ||
202            Stack.back().second != CurrentNonCapturingFunctionScope ||
203            Stack.back().first.size() <= IgnoredStackElements;
204   }
205   size_t getStackSize() const {
206     return isStackEmpty() ? 0
207                           : Stack.back().first.size() - IgnoredStackElements;
208   }
209 
210   SharingMapTy *getTopOfStackOrNull() {
211     size_t Size = getStackSize();
212     if (Size == 0)
213       return nullptr;
214     return &Stack.back().first[Size - 1];
215   }
216   const SharingMapTy *getTopOfStackOrNull() const {
217     return const_cast<DSAStackTy&>(*this).getTopOfStackOrNull();
218   }
219   SharingMapTy &getTopOfStack() {
220     assert(!isStackEmpty() && "no current directive");
221     return *getTopOfStackOrNull();
222   }
223   const SharingMapTy &getTopOfStack() const {
224     return const_cast<DSAStackTy&>(*this).getTopOfStack();
225   }
226 
227   SharingMapTy *getSecondOnStackOrNull() {
228     size_t Size = getStackSize();
229     if (Size <= 1)
230       return nullptr;
231     return &Stack.back().first[Size - 2];
232   }
233   const SharingMapTy *getSecondOnStackOrNull() const {
234     return const_cast<DSAStackTy&>(*this).getSecondOnStackOrNull();
235   }
236 
237   /// Get the stack element at a certain level (previously returned by
238   /// \c getNestingLevel).
239   ///
240   /// Note that nesting levels count from outermost to innermost, and this is
241   /// the reverse of our iteration order where new inner levels are pushed at
242   /// the front of the stack.
243   SharingMapTy &getStackElemAtLevel(unsigned Level) {
244     assert(Level < getStackSize() && "no such stack element");
245     return Stack.back().first[Level];
246   }
247   const SharingMapTy &getStackElemAtLevel(unsigned Level) const {
248     return const_cast<DSAStackTy&>(*this).getStackElemAtLevel(Level);
249   }
250 
251   DSAVarData getDSA(const_iterator &Iter, ValueDecl *D) const;
252 
253   /// Checks if the variable is a local for OpenMP region.
254   bool isOpenMPLocal(VarDecl *D, const_iterator Iter) const;
255 
256   /// Vector of previously declared requires directives
257   SmallVector<const OMPRequiresDecl *, 2> RequiresDecls;
258   /// omp_allocator_handle_t type.
259   QualType OMPAllocatorHandleT;
260   /// Expression for the predefined allocators.
261   Expr *OMPPredefinedAllocators[OMPAllocateDeclAttr::OMPUserDefinedMemAlloc] = {
262       nullptr};
263   /// Vector of previously encountered target directives
264   SmallVector<SourceLocation, 2> TargetLocations;
265 
266 public:
267   explicit DSAStackTy(Sema &S) : SemaRef(S) {}
268 
269   /// Sets omp_allocator_handle_t type.
270   void setOMPAllocatorHandleT(QualType Ty) { OMPAllocatorHandleT = Ty; }
271   /// Gets omp_allocator_handle_t type.
272   QualType getOMPAllocatorHandleT() const { return OMPAllocatorHandleT; }
273   /// Sets the given default allocator.
274   void setAllocator(OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind,
275                     Expr *Allocator) {
276     OMPPredefinedAllocators[AllocatorKind] = Allocator;
277   }
278   /// Returns the specified default allocator.
279   Expr *getAllocator(OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind) const {
280     return OMPPredefinedAllocators[AllocatorKind];
281   }
282 
283   bool isClauseParsingMode() const { return ClauseKindMode != OMPC_unknown; }
284   OpenMPClauseKind getClauseParsingMode() const {
285     assert(isClauseParsingMode() && "Must be in clause parsing mode.");
286     return ClauseKindMode;
287   }
288   void setClauseParsingMode(OpenMPClauseKind K) { ClauseKindMode = K; }
289 
290   bool isBodyComplete() const {
291     const SharingMapTy *Top = getTopOfStackOrNull();
292     return Top && Top->BodyComplete;
293   }
294   void setBodyComplete() {
295     getTopOfStack().BodyComplete = true;
296   }
297 
298   bool isForceVarCapturing() const { return ForceCapturing; }
299   void setForceVarCapturing(bool V) { ForceCapturing = V; }
300 
301   void setForceCaptureByReferenceInTargetExecutable(bool V) {
302     ForceCaptureByReferenceInTargetExecutable = V;
303   }
304   bool isForceCaptureByReferenceInTargetExecutable() const {
305     return ForceCaptureByReferenceInTargetExecutable;
306   }
307 
308   void push(OpenMPDirectiveKind DKind, const DeclarationNameInfo &DirName,
309             Scope *CurScope, SourceLocation Loc) {
310     assert(!IgnoredStackElements &&
311            "cannot change stack while ignoring elements");
312     if (Stack.empty() ||
313         Stack.back().second != CurrentNonCapturingFunctionScope)
314       Stack.emplace_back(StackTy(), CurrentNonCapturingFunctionScope);
315     Stack.back().first.emplace_back(DKind, DirName, CurScope, Loc);
316     Stack.back().first.back().DefaultAttrLoc = Loc;
317   }
318 
319   void pop() {
320     assert(!IgnoredStackElements &&
321            "cannot change stack while ignoring elements");
322     assert(!Stack.back().first.empty() &&
323            "Data-sharing attributes stack is empty!");
324     Stack.back().first.pop_back();
325   }
326 
327   /// RAII object to temporarily leave the scope of a directive when we want to
328   /// logically operate in its parent.
329   class ParentDirectiveScope {
330     DSAStackTy &Self;
331     bool Active;
332   public:
333     ParentDirectiveScope(DSAStackTy &Self, bool Activate)
334         : Self(Self), Active(false) {
335       if (Activate)
336         enable();
337     }
338     ~ParentDirectiveScope() { disable(); }
339     void disable() {
340       if (Active) {
341         --Self.IgnoredStackElements;
342         Active = false;
343       }
344     }
345     void enable() {
346       if (!Active) {
347         ++Self.IgnoredStackElements;
348         Active = true;
349       }
350     }
351   };
352 
353   /// Marks that we're started loop parsing.
354   void loopInit() {
355     assert(isOpenMPLoopDirective(getCurrentDirective()) &&
356            "Expected loop-based directive.");
357     getTopOfStack().LoopStart = true;
358   }
359   /// Start capturing of the variables in the loop context.
360   void loopStart() {
361     assert(isOpenMPLoopDirective(getCurrentDirective()) &&
362            "Expected loop-based directive.");
363     getTopOfStack().LoopStart = false;
364   }
365   /// true, if variables are captured, false otherwise.
366   bool isLoopStarted() const {
367     assert(isOpenMPLoopDirective(getCurrentDirective()) &&
368            "Expected loop-based directive.");
369     return !getTopOfStack().LoopStart;
370   }
371   /// Marks (or clears) declaration as possibly loop counter.
372   void resetPossibleLoopCounter(const Decl *D = nullptr) {
373     getTopOfStack().PossiblyLoopCounter =
374         D ? D->getCanonicalDecl() : D;
375   }
376   /// Gets the possible loop counter decl.
377   const Decl *getPossiblyLoopCunter() const {
378     return getTopOfStack().PossiblyLoopCounter;
379   }
380   /// Start new OpenMP region stack in new non-capturing function.
381   void pushFunction() {
382     assert(!IgnoredStackElements &&
383            "cannot change stack while ignoring elements");
384     const FunctionScopeInfo *CurFnScope = SemaRef.getCurFunction();
385     assert(!isa<CapturingScopeInfo>(CurFnScope));
386     CurrentNonCapturingFunctionScope = CurFnScope;
387   }
388   /// Pop region stack for non-capturing function.
389   void popFunction(const FunctionScopeInfo *OldFSI) {
390     assert(!IgnoredStackElements &&
391            "cannot change stack while ignoring elements");
392     if (!Stack.empty() && Stack.back().second == OldFSI) {
393       assert(Stack.back().first.empty());
394       Stack.pop_back();
395     }
396     CurrentNonCapturingFunctionScope = nullptr;
397     for (const FunctionScopeInfo *FSI : llvm::reverse(SemaRef.FunctionScopes)) {
398       if (!isa<CapturingScopeInfo>(FSI)) {
399         CurrentNonCapturingFunctionScope = FSI;
400         break;
401       }
402     }
403   }
404 
405   void addCriticalWithHint(const OMPCriticalDirective *D, llvm::APSInt Hint) {
406     Criticals.try_emplace(D->getDirectiveName().getAsString(), D, Hint);
407   }
408   const std::pair<const OMPCriticalDirective *, llvm::APSInt>
409   getCriticalWithHint(const DeclarationNameInfo &Name) const {
410     auto I = Criticals.find(Name.getAsString());
411     if (I != Criticals.end())
412       return I->second;
413     return std::make_pair(nullptr, llvm::APSInt());
414   }
415   /// If 'aligned' declaration for given variable \a D was not seen yet,
416   /// add it and return NULL; otherwise return previous occurrence's expression
417   /// for diagnostics.
418   const Expr *addUniqueAligned(const ValueDecl *D, const Expr *NewDE);
419 
420   /// Register specified variable as loop control variable.
421   void addLoopControlVariable(const ValueDecl *D, VarDecl *Capture);
422   /// Check if the specified variable is a loop control variable for
423   /// current region.
424   /// \return The index of the loop control variable in the list of associated
425   /// for-loops (from outer to inner).
426   const LCDeclInfo isLoopControlVariable(const ValueDecl *D) const;
427   /// Check if the specified variable is a loop control variable for
428   /// parent region.
429   /// \return The index of the loop control variable in the list of associated
430   /// for-loops (from outer to inner).
431   const LCDeclInfo isParentLoopControlVariable(const ValueDecl *D) const;
432   /// Get the loop control variable for the I-th loop (or nullptr) in
433   /// parent directive.
434   const ValueDecl *getParentLoopControlVariable(unsigned I) const;
435 
436   /// Adds explicit data sharing attribute to the specified declaration.
437   void addDSA(const ValueDecl *D, const Expr *E, OpenMPClauseKind A,
438               DeclRefExpr *PrivateCopy = nullptr);
439 
440   /// Adds additional information for the reduction items with the reduction id
441   /// represented as an operator.
442   void addTaskgroupReductionData(const ValueDecl *D, SourceRange SR,
443                                  BinaryOperatorKind BOK);
444   /// Adds additional information for the reduction items with the reduction id
445   /// represented as reduction identifier.
446   void addTaskgroupReductionData(const ValueDecl *D, SourceRange SR,
447                                  const Expr *ReductionRef);
448   /// Returns the location and reduction operation from the innermost parent
449   /// region for the given \p D.
450   const DSAVarData
451   getTopMostTaskgroupReductionData(const ValueDecl *D, SourceRange &SR,
452                                    BinaryOperatorKind &BOK,
453                                    Expr *&TaskgroupDescriptor) const;
454   /// Returns the location and reduction operation from the innermost parent
455   /// region for the given \p D.
456   const DSAVarData
457   getTopMostTaskgroupReductionData(const ValueDecl *D, SourceRange &SR,
458                                    const Expr *&ReductionRef,
459                                    Expr *&TaskgroupDescriptor) const;
460   /// Return reduction reference expression for the current taskgroup.
461   Expr *getTaskgroupReductionRef() const {
462     assert(getTopOfStack().Directive == OMPD_taskgroup &&
463            "taskgroup reference expression requested for non taskgroup "
464            "directive.");
465     return getTopOfStack().TaskgroupReductionRef;
466   }
467   /// Checks if the given \p VD declaration is actually a taskgroup reduction
468   /// descriptor variable at the \p Level of OpenMP regions.
469   bool isTaskgroupReductionRef(const ValueDecl *VD, unsigned Level) const {
470     return getStackElemAtLevel(Level).TaskgroupReductionRef &&
471            cast<DeclRefExpr>(getStackElemAtLevel(Level).TaskgroupReductionRef)
472                    ->getDecl() == VD;
473   }
474 
475   /// Returns data sharing attributes from top of the stack for the
476   /// specified declaration.
477   const DSAVarData getTopDSA(ValueDecl *D, bool FromParent);
478   /// Returns data-sharing attributes for the specified declaration.
479   const DSAVarData getImplicitDSA(ValueDecl *D, bool FromParent) const;
480   /// Checks if the specified variables has data-sharing attributes which
481   /// match specified \a CPred predicate in any directive which matches \a DPred
482   /// predicate.
483   const DSAVarData
484   hasDSA(ValueDecl *D, const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
485          const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
486          bool FromParent) const;
487   /// Checks if the specified variables has data-sharing attributes which
488   /// match specified \a CPred predicate in any innermost directive which
489   /// matches \a DPred predicate.
490   const DSAVarData
491   hasInnermostDSA(ValueDecl *D,
492                   const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
493                   const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
494                   bool FromParent) const;
495   /// Checks if the specified variables has explicit data-sharing
496   /// attributes which match specified \a CPred predicate at the specified
497   /// OpenMP region.
498   bool hasExplicitDSA(const ValueDecl *D,
499                       const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
500                       unsigned Level, bool NotLastprivate = false) const;
501 
502   /// Returns true if the directive at level \Level matches in the
503   /// specified \a DPred predicate.
504   bool hasExplicitDirective(
505       const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
506       unsigned Level) const;
507 
508   /// Finds a directive which matches specified \a DPred predicate.
509   bool hasDirective(
510       const llvm::function_ref<bool(
511           OpenMPDirectiveKind, const DeclarationNameInfo &, SourceLocation)>
512           DPred,
513       bool FromParent) const;
514 
515   /// Returns currently analyzed directive.
516   OpenMPDirectiveKind getCurrentDirective() const {
517     const SharingMapTy *Top = getTopOfStackOrNull();
518     return Top ? Top->Directive : OMPD_unknown;
519   }
520   /// Returns directive kind at specified level.
521   OpenMPDirectiveKind getDirective(unsigned Level) const {
522     assert(!isStackEmpty() && "No directive at specified level.");
523     return getStackElemAtLevel(Level).Directive;
524   }
525   /// Returns the capture region at the specified level.
526   OpenMPDirectiveKind getCaptureRegion(unsigned Level,
527                                        unsigned OpenMPCaptureLevel) const {
528     SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
529     getOpenMPCaptureRegions(CaptureRegions, getDirective(Level));
530     return CaptureRegions[OpenMPCaptureLevel];
531   }
532   /// Returns parent directive.
533   OpenMPDirectiveKind getParentDirective() const {
534     const SharingMapTy *Parent = getSecondOnStackOrNull();
535     return Parent ? Parent->Directive : OMPD_unknown;
536   }
537 
538   /// Add requires decl to internal vector
539   void addRequiresDecl(OMPRequiresDecl *RD) {
540     RequiresDecls.push_back(RD);
541   }
542 
543   /// Checks if the defined 'requires' directive has specified type of clause.
544   template <typename ClauseType>
545   bool hasRequiresDeclWithClause() {
546     return llvm::any_of(RequiresDecls, [](const OMPRequiresDecl *D) {
547       return llvm::any_of(D->clauselists(), [](const OMPClause *C) {
548         return isa<ClauseType>(C);
549       });
550     });
551   }
552 
553   /// Checks for a duplicate clause amongst previously declared requires
554   /// directives
555   bool hasDuplicateRequiresClause(ArrayRef<OMPClause *> ClauseList) const {
556     bool IsDuplicate = false;
557     for (OMPClause *CNew : ClauseList) {
558       for (const OMPRequiresDecl *D : RequiresDecls) {
559         for (const OMPClause *CPrev : D->clauselists()) {
560           if (CNew->getClauseKind() == CPrev->getClauseKind()) {
561             SemaRef.Diag(CNew->getBeginLoc(),
562                          diag::err_omp_requires_clause_redeclaration)
563                 << getOpenMPClauseName(CNew->getClauseKind());
564             SemaRef.Diag(CPrev->getBeginLoc(),
565                          diag::note_omp_requires_previous_clause)
566                 << getOpenMPClauseName(CPrev->getClauseKind());
567             IsDuplicate = true;
568           }
569         }
570       }
571     }
572     return IsDuplicate;
573   }
574 
575   /// Add location of previously encountered target to internal vector
576   void addTargetDirLocation(SourceLocation LocStart) {
577     TargetLocations.push_back(LocStart);
578   }
579 
580   // Return previously encountered target region locations.
581   ArrayRef<SourceLocation> getEncounteredTargetLocs() const {
582     return TargetLocations;
583   }
584 
585   /// Set default data sharing attribute to none.
586   void setDefaultDSANone(SourceLocation Loc) {
587     getTopOfStack().DefaultAttr = DSA_none;
588     getTopOfStack().DefaultAttrLoc = Loc;
589   }
590   /// Set default data sharing attribute to shared.
591   void setDefaultDSAShared(SourceLocation Loc) {
592     getTopOfStack().DefaultAttr = DSA_shared;
593     getTopOfStack().DefaultAttrLoc = Loc;
594   }
595   /// Set default data mapping attribute to 'tofrom:scalar'.
596   void setDefaultDMAToFromScalar(SourceLocation Loc) {
597     getTopOfStack().DefaultMapAttr = DMA_tofrom_scalar;
598     getTopOfStack().DefaultMapAttrLoc = Loc;
599   }
600 
601   DefaultDataSharingAttributes getDefaultDSA() const {
602     return isStackEmpty() ? DSA_unspecified
603                           : getTopOfStack().DefaultAttr;
604   }
605   SourceLocation getDefaultDSALocation() const {
606     return isStackEmpty() ? SourceLocation()
607                           : getTopOfStack().DefaultAttrLoc;
608   }
609   DefaultMapAttributes getDefaultDMA() const {
610     return isStackEmpty() ? DMA_unspecified
611                           : getTopOfStack().DefaultMapAttr;
612   }
613   DefaultMapAttributes getDefaultDMAAtLevel(unsigned Level) const {
614     return getStackElemAtLevel(Level).DefaultMapAttr;
615   }
616   SourceLocation getDefaultDMALocation() const {
617     return isStackEmpty() ? SourceLocation()
618                           : getTopOfStack().DefaultMapAttrLoc;
619   }
620 
621   /// Checks if the specified variable is a threadprivate.
622   bool isThreadPrivate(VarDecl *D) {
623     const DSAVarData DVar = getTopDSA(D, false);
624     return isOpenMPThreadPrivate(DVar.CKind);
625   }
626 
627   /// Marks current region as ordered (it has an 'ordered' clause).
628   void setOrderedRegion(bool IsOrdered, const Expr *Param,
629                         OMPOrderedClause *Clause) {
630     if (IsOrdered)
631       getTopOfStack().OrderedRegion.emplace(Param, Clause);
632     else
633       getTopOfStack().OrderedRegion.reset();
634   }
635   /// Returns true, if region is ordered (has associated 'ordered' clause),
636   /// false - otherwise.
637   bool isOrderedRegion() const {
638     if (const SharingMapTy *Top = getTopOfStackOrNull())
639       return Top->OrderedRegion.hasValue();
640     return false;
641   }
642   /// Returns optional parameter for the ordered region.
643   std::pair<const Expr *, OMPOrderedClause *> getOrderedRegionParam() const {
644     if (const SharingMapTy *Top = getTopOfStackOrNull())
645       if (Top->OrderedRegion.hasValue())
646         return Top->OrderedRegion.getValue();
647     return std::make_pair(nullptr, nullptr);
648   }
649   /// Returns true, if parent region is ordered (has associated
650   /// 'ordered' clause), false - otherwise.
651   bool isParentOrderedRegion() const {
652     if (const SharingMapTy *Parent = getSecondOnStackOrNull())
653       return Parent->OrderedRegion.hasValue();
654     return false;
655   }
656   /// Returns optional parameter for the ordered region.
657   std::pair<const Expr *, OMPOrderedClause *>
658   getParentOrderedRegionParam() const {
659     if (const SharingMapTy *Parent = getSecondOnStackOrNull())
660       if (Parent->OrderedRegion.hasValue())
661         return Parent->OrderedRegion.getValue();
662     return std::make_pair(nullptr, nullptr);
663   }
664   /// Marks current region as nowait (it has a 'nowait' clause).
665   void setNowaitRegion(bool IsNowait = true) {
666     getTopOfStack().NowaitRegion = IsNowait;
667   }
668   /// Returns true, if parent region is nowait (has associated
669   /// 'nowait' clause), false - otherwise.
670   bool isParentNowaitRegion() const {
671     if (const SharingMapTy *Parent = getSecondOnStackOrNull())
672       return Parent->NowaitRegion;
673     return false;
674   }
675   /// Marks parent region as cancel region.
676   void setParentCancelRegion(bool Cancel = true) {
677     if (SharingMapTy *Parent = getSecondOnStackOrNull())
678       Parent->CancelRegion |= Cancel;
679   }
680   /// Return true if current region has inner cancel construct.
681   bool isCancelRegion() const {
682     const SharingMapTy *Top = getTopOfStackOrNull();
683     return Top ? Top->CancelRegion : false;
684   }
685 
686   /// Set collapse value for the region.
687   void setAssociatedLoops(unsigned Val) {
688     getTopOfStack().AssociatedLoops = Val;
689     if (Val > 1)
690       getTopOfStack().HasMutipleLoops = true;
691   }
692   /// Return collapse value for region.
693   unsigned getAssociatedLoops() const {
694     const SharingMapTy *Top = getTopOfStackOrNull();
695     return Top ? Top->AssociatedLoops : 0;
696   }
697   /// Returns true if the construct is associated with multiple loops.
698   bool hasMutipleLoops() const {
699     const SharingMapTy *Top = getTopOfStackOrNull();
700     return Top ? Top->HasMutipleLoops : false;
701   }
702 
703   /// Marks current target region as one with closely nested teams
704   /// region.
705   void setParentTeamsRegionLoc(SourceLocation TeamsRegionLoc) {
706     if (SharingMapTy *Parent = getSecondOnStackOrNull())
707       Parent->InnerTeamsRegionLoc = TeamsRegionLoc;
708   }
709   /// Returns true, if current region has closely nested teams region.
710   bool hasInnerTeamsRegion() const {
711     return getInnerTeamsRegionLoc().isValid();
712   }
713   /// Returns location of the nested teams region (if any).
714   SourceLocation getInnerTeamsRegionLoc() const {
715     const SharingMapTy *Top = getTopOfStackOrNull();
716     return Top ? Top->InnerTeamsRegionLoc : SourceLocation();
717   }
718 
719   Scope *getCurScope() const {
720     const SharingMapTy *Top = getTopOfStackOrNull();
721     return Top ? Top->CurScope : nullptr;
722   }
723   SourceLocation getConstructLoc() const {
724     const SharingMapTy *Top = getTopOfStackOrNull();
725     return Top ? Top->ConstructLoc : SourceLocation();
726   }
727 
728   /// Do the check specified in \a Check to all component lists and return true
729   /// if any issue is found.
730   bool checkMappableExprComponentListsForDecl(
731       const ValueDecl *VD, bool CurrentRegionOnly,
732       const llvm::function_ref<
733           bool(OMPClauseMappableExprCommon::MappableExprComponentListRef,
734                OpenMPClauseKind)>
735           Check) const {
736     if (isStackEmpty())
737       return false;
738     auto SI = begin();
739     auto SE = end();
740 
741     if (SI == SE)
742       return false;
743 
744     if (CurrentRegionOnly)
745       SE = std::next(SI);
746     else
747       std::advance(SI, 1);
748 
749     for (; SI != SE; ++SI) {
750       auto MI = SI->MappedExprComponents.find(VD);
751       if (MI != SI->MappedExprComponents.end())
752         for (OMPClauseMappableExprCommon::MappableExprComponentListRef L :
753              MI->second.Components)
754           if (Check(L, MI->second.Kind))
755             return true;
756     }
757     return false;
758   }
759 
760   /// Do the check specified in \a Check to all component lists at a given level
761   /// and return true if any issue is found.
762   bool checkMappableExprComponentListsForDeclAtLevel(
763       const ValueDecl *VD, unsigned Level,
764       const llvm::function_ref<
765           bool(OMPClauseMappableExprCommon::MappableExprComponentListRef,
766                OpenMPClauseKind)>
767           Check) const {
768     if (getStackSize() <= Level)
769       return false;
770 
771     const SharingMapTy &StackElem = getStackElemAtLevel(Level);
772     auto MI = StackElem.MappedExprComponents.find(VD);
773     if (MI != StackElem.MappedExprComponents.end())
774       for (OMPClauseMappableExprCommon::MappableExprComponentListRef L :
775            MI->second.Components)
776         if (Check(L, MI->second.Kind))
777           return true;
778     return false;
779   }
780 
781   /// Create a new mappable expression component list associated with a given
782   /// declaration and initialize it with the provided list of components.
783   void addMappableExpressionComponents(
784       const ValueDecl *VD,
785       OMPClauseMappableExprCommon::MappableExprComponentListRef Components,
786       OpenMPClauseKind WhereFoundClauseKind) {
787     MappedExprComponentTy &MEC = getTopOfStack().MappedExprComponents[VD];
788     // Create new entry and append the new components there.
789     MEC.Components.resize(MEC.Components.size() + 1);
790     MEC.Components.back().append(Components.begin(), Components.end());
791     MEC.Kind = WhereFoundClauseKind;
792   }
793 
794   unsigned getNestingLevel() const {
795     assert(!isStackEmpty());
796     return getStackSize() - 1;
797   }
798   void addDoacrossDependClause(OMPDependClause *C,
799                                const OperatorOffsetTy &OpsOffs) {
800     SharingMapTy *Parent = getSecondOnStackOrNull();
801     assert(Parent && isOpenMPWorksharingDirective(Parent->Directive));
802     Parent->DoacrossDepends.try_emplace(C, OpsOffs);
803   }
804   llvm::iterator_range<DoacrossDependMapTy::const_iterator>
805   getDoacrossDependClauses() const {
806     const SharingMapTy &StackElem = getTopOfStack();
807     if (isOpenMPWorksharingDirective(StackElem.Directive)) {
808       const DoacrossDependMapTy &Ref = StackElem.DoacrossDepends;
809       return llvm::make_range(Ref.begin(), Ref.end());
810     }
811     return llvm::make_range(StackElem.DoacrossDepends.end(),
812                             StackElem.DoacrossDepends.end());
813   }
814 
815   // Store types of classes which have been explicitly mapped
816   void addMappedClassesQualTypes(QualType QT) {
817     SharingMapTy &StackElem = getTopOfStack();
818     StackElem.MappedClassesQualTypes.insert(QT);
819   }
820 
821   // Return set of mapped classes types
822   bool isClassPreviouslyMapped(QualType QT) const {
823     const SharingMapTy &StackElem = getTopOfStack();
824     return StackElem.MappedClassesQualTypes.count(QT) != 0;
825   }
826 
827   /// Adds global declare target to the parent target region.
828   void addToParentTargetRegionLinkGlobals(DeclRefExpr *E) {
829     assert(*OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(
830                E->getDecl()) == OMPDeclareTargetDeclAttr::MT_Link &&
831            "Expected declare target link global.");
832     for (auto &Elem : *this) {
833       if (isOpenMPTargetExecutionDirective(Elem.Directive)) {
834         Elem.DeclareTargetLinkVarDecls.push_back(E);
835         return;
836       }
837     }
838   }
839 
840   /// Returns the list of globals with declare target link if current directive
841   /// is target.
842   ArrayRef<DeclRefExpr *> getLinkGlobals() const {
843     assert(isOpenMPTargetExecutionDirective(getCurrentDirective()) &&
844            "Expected target executable directive.");
845     return getTopOfStack().DeclareTargetLinkVarDecls;
846   }
847 };
848 
849 bool isImplicitTaskingRegion(OpenMPDirectiveKind DKind) {
850   return isOpenMPParallelDirective(DKind) || isOpenMPTeamsDirective(DKind);
851 }
852 
853 bool isImplicitOrExplicitTaskingRegion(OpenMPDirectiveKind DKind) {
854   return isImplicitTaskingRegion(DKind) || isOpenMPTaskingDirective(DKind) ||
855          DKind == OMPD_unknown;
856 }
857 
858 } // namespace
859 
860 static const Expr *getExprAsWritten(const Expr *E) {
861   if (const auto *FE = dyn_cast<FullExpr>(E))
862     E = FE->getSubExpr();
863 
864   if (const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(E))
865     E = MTE->GetTemporaryExpr();
866 
867   while (const auto *Binder = dyn_cast<CXXBindTemporaryExpr>(E))
868     E = Binder->getSubExpr();
869 
870   if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E))
871     E = ICE->getSubExprAsWritten();
872   return E->IgnoreParens();
873 }
874 
875 static Expr *getExprAsWritten(Expr *E) {
876   return const_cast<Expr *>(getExprAsWritten(const_cast<const Expr *>(E)));
877 }
878 
879 static const ValueDecl *getCanonicalDecl(const ValueDecl *D) {
880   if (const auto *CED = dyn_cast<OMPCapturedExprDecl>(D))
881     if (const auto *ME = dyn_cast<MemberExpr>(getExprAsWritten(CED->getInit())))
882       D = ME->getMemberDecl();
883   const auto *VD = dyn_cast<VarDecl>(D);
884   const auto *FD = dyn_cast<FieldDecl>(D);
885   if (VD != nullptr) {
886     VD = VD->getCanonicalDecl();
887     D = VD;
888   } else {
889     assert(FD);
890     FD = FD->getCanonicalDecl();
891     D = FD;
892   }
893   return D;
894 }
895 
896 static ValueDecl *getCanonicalDecl(ValueDecl *D) {
897   return const_cast<ValueDecl *>(
898       getCanonicalDecl(const_cast<const ValueDecl *>(D)));
899 }
900 
901 DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter,
902                                           ValueDecl *D) const {
903   D = getCanonicalDecl(D);
904   auto *VD = dyn_cast<VarDecl>(D);
905   const auto *FD = dyn_cast<FieldDecl>(D);
906   DSAVarData DVar;
907   if (Iter == end()) {
908     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
909     // in a region but not in construct]
910     //  File-scope or namespace-scope variables referenced in called routines
911     //  in the region are shared unless they appear in a threadprivate
912     //  directive.
913     if (VD && !VD->isFunctionOrMethodVarDecl() && !isa<ParmVarDecl>(VD))
914       DVar.CKind = OMPC_shared;
915 
916     // OpenMP [2.9.1.2, Data-sharing Attribute Rules for Variables Referenced
917     // in a region but not in construct]
918     //  Variables with static storage duration that are declared in called
919     //  routines in the region are shared.
920     if (VD && VD->hasGlobalStorage())
921       DVar.CKind = OMPC_shared;
922 
923     // Non-static data members are shared by default.
924     if (FD)
925       DVar.CKind = OMPC_shared;
926 
927     return DVar;
928   }
929 
930   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
931   // in a Construct, C/C++, predetermined, p.1]
932   // Variables with automatic storage duration that are declared in a scope
933   // inside the construct are private.
934   if (VD && isOpenMPLocal(VD, Iter) && VD->isLocalVarDecl() &&
935       (VD->getStorageClass() == SC_Auto || VD->getStorageClass() == SC_None)) {
936     DVar.CKind = OMPC_private;
937     return DVar;
938   }
939 
940   DVar.DKind = Iter->Directive;
941   // Explicitly specified attributes and local variables with predetermined
942   // attributes.
943   if (Iter->SharingMap.count(D)) {
944     const DSAInfo &Data = Iter->SharingMap.lookup(D);
945     DVar.RefExpr = Data.RefExpr.getPointer();
946     DVar.PrivateCopy = Data.PrivateCopy;
947     DVar.CKind = Data.Attributes;
948     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
949     return DVar;
950   }
951 
952   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
953   // in a Construct, C/C++, implicitly determined, p.1]
954   //  In a parallel or task construct, the data-sharing attributes of these
955   //  variables are determined by the default clause, if present.
956   switch (Iter->DefaultAttr) {
957   case DSA_shared:
958     DVar.CKind = OMPC_shared;
959     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
960     return DVar;
961   case DSA_none:
962     return DVar;
963   case DSA_unspecified:
964     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
965     // in a Construct, implicitly determined, p.2]
966     //  In a parallel construct, if no default clause is present, these
967     //  variables are shared.
968     DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
969     if ((isOpenMPParallelDirective(DVar.DKind) &&
970          !isOpenMPTaskLoopDirective(DVar.DKind)) ||
971         isOpenMPTeamsDirective(DVar.DKind)) {
972       DVar.CKind = OMPC_shared;
973       return DVar;
974     }
975 
976     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
977     // in a Construct, implicitly determined, p.4]
978     //  In a task construct, if no default clause is present, a variable that in
979     //  the enclosing context is determined to be shared by all implicit tasks
980     //  bound to the current team is shared.
981     if (isOpenMPTaskingDirective(DVar.DKind)) {
982       DSAVarData DVarTemp;
983       const_iterator I = Iter, E = end();
984       do {
985         ++I;
986         // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables
987         // Referenced in a Construct, implicitly determined, p.6]
988         //  In a task construct, if no default clause is present, a variable
989         //  whose data-sharing attribute is not determined by the rules above is
990         //  firstprivate.
991         DVarTemp = getDSA(I, D);
992         if (DVarTemp.CKind != OMPC_shared) {
993           DVar.RefExpr = nullptr;
994           DVar.CKind = OMPC_firstprivate;
995           return DVar;
996         }
997       } while (I != E && !isImplicitTaskingRegion(I->Directive));
998       DVar.CKind =
999           (DVarTemp.CKind == OMPC_unknown) ? OMPC_firstprivate : OMPC_shared;
1000       return DVar;
1001     }
1002   }
1003   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
1004   // in a Construct, implicitly determined, p.3]
1005   //  For constructs other than task, if no default clause is present, these
1006   //  variables inherit their data-sharing attributes from the enclosing
1007   //  context.
1008   return getDSA(++Iter, D);
1009 }
1010 
1011 const Expr *DSAStackTy::addUniqueAligned(const ValueDecl *D,
1012                                          const Expr *NewDE) {
1013   assert(!isStackEmpty() && "Data sharing attributes stack is empty");
1014   D = getCanonicalDecl(D);
1015   SharingMapTy &StackElem = getTopOfStack();
1016   auto It = StackElem.AlignedMap.find(D);
1017   if (It == StackElem.AlignedMap.end()) {
1018     assert(NewDE && "Unexpected nullptr expr to be added into aligned map");
1019     StackElem.AlignedMap[D] = NewDE;
1020     return nullptr;
1021   }
1022   assert(It->second && "Unexpected nullptr expr in the aligned map");
1023   return It->second;
1024 }
1025 
1026 void DSAStackTy::addLoopControlVariable(const ValueDecl *D, VarDecl *Capture) {
1027   assert(!isStackEmpty() && "Data-sharing attributes stack is empty");
1028   D = getCanonicalDecl(D);
1029   SharingMapTy &StackElem = getTopOfStack();
1030   StackElem.LCVMap.try_emplace(
1031       D, LCDeclInfo(StackElem.LCVMap.size() + 1, Capture));
1032 }
1033 
1034 const DSAStackTy::LCDeclInfo
1035 DSAStackTy::isLoopControlVariable(const ValueDecl *D) const {
1036   assert(!isStackEmpty() && "Data-sharing attributes stack is empty");
1037   D = getCanonicalDecl(D);
1038   const SharingMapTy &StackElem = getTopOfStack();
1039   auto It = StackElem.LCVMap.find(D);
1040   if (It != StackElem.LCVMap.end())
1041     return It->second;
1042   return {0, nullptr};
1043 }
1044 
1045 const DSAStackTy::LCDeclInfo
1046 DSAStackTy::isParentLoopControlVariable(const ValueDecl *D) const {
1047   const SharingMapTy *Parent = getSecondOnStackOrNull();
1048   assert(Parent && "Data-sharing attributes stack is empty");
1049   D = getCanonicalDecl(D);
1050   auto It = Parent->LCVMap.find(D);
1051   if (It != Parent->LCVMap.end())
1052     return It->second;
1053   return {0, nullptr};
1054 }
1055 
1056 const ValueDecl *DSAStackTy::getParentLoopControlVariable(unsigned I) const {
1057   const SharingMapTy *Parent = getSecondOnStackOrNull();
1058   assert(Parent && "Data-sharing attributes stack is empty");
1059   if (Parent->LCVMap.size() < I)
1060     return nullptr;
1061   for (const auto &Pair : Parent->LCVMap)
1062     if (Pair.second.first == I)
1063       return Pair.first;
1064   return nullptr;
1065 }
1066 
1067 void DSAStackTy::addDSA(const ValueDecl *D, const Expr *E, OpenMPClauseKind A,
1068                         DeclRefExpr *PrivateCopy) {
1069   D = getCanonicalDecl(D);
1070   if (A == OMPC_threadprivate) {
1071     DSAInfo &Data = Threadprivates[D];
1072     Data.Attributes = A;
1073     Data.RefExpr.setPointer(E);
1074     Data.PrivateCopy = nullptr;
1075   } else {
1076     DSAInfo &Data = getTopOfStack().SharingMap[D];
1077     assert(Data.Attributes == OMPC_unknown || (A == Data.Attributes) ||
1078            (A == OMPC_firstprivate && Data.Attributes == OMPC_lastprivate) ||
1079            (A == OMPC_lastprivate && Data.Attributes == OMPC_firstprivate) ||
1080            (isLoopControlVariable(D).first && A == OMPC_private));
1081     if (A == OMPC_lastprivate && Data.Attributes == OMPC_firstprivate) {
1082       Data.RefExpr.setInt(/*IntVal=*/true);
1083       return;
1084     }
1085     const bool IsLastprivate =
1086         A == OMPC_lastprivate || Data.Attributes == OMPC_lastprivate;
1087     Data.Attributes = A;
1088     Data.RefExpr.setPointerAndInt(E, IsLastprivate);
1089     Data.PrivateCopy = PrivateCopy;
1090     if (PrivateCopy) {
1091       DSAInfo &Data = getTopOfStack().SharingMap[PrivateCopy->getDecl()];
1092       Data.Attributes = A;
1093       Data.RefExpr.setPointerAndInt(PrivateCopy, IsLastprivate);
1094       Data.PrivateCopy = nullptr;
1095     }
1096   }
1097 }
1098 
1099 /// Build a variable declaration for OpenMP loop iteration variable.
1100 static VarDecl *buildVarDecl(Sema &SemaRef, SourceLocation Loc, QualType Type,
1101                              StringRef Name, const AttrVec *Attrs = nullptr,
1102                              DeclRefExpr *OrigRef = nullptr) {
1103   DeclContext *DC = SemaRef.CurContext;
1104   IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name);
1105   TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
1106   auto *Decl =
1107       VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type, TInfo, SC_None);
1108   if (Attrs) {
1109     for (specific_attr_iterator<AlignedAttr> I(Attrs->begin()), E(Attrs->end());
1110          I != E; ++I)
1111       Decl->addAttr(*I);
1112   }
1113   Decl->setImplicit();
1114   if (OrigRef) {
1115     Decl->addAttr(
1116         OMPReferencedVarAttr::CreateImplicit(SemaRef.Context, OrigRef));
1117   }
1118   return Decl;
1119 }
1120 
1121 static DeclRefExpr *buildDeclRefExpr(Sema &S, VarDecl *D, QualType Ty,
1122                                      SourceLocation Loc,
1123                                      bool RefersToCapture = false) {
1124   D->setReferenced();
1125   D->markUsed(S.Context);
1126   return DeclRefExpr::Create(S.getASTContext(), NestedNameSpecifierLoc(),
1127                              SourceLocation(), D, RefersToCapture, Loc, Ty,
1128                              VK_LValue);
1129 }
1130 
1131 void DSAStackTy::addTaskgroupReductionData(const ValueDecl *D, SourceRange SR,
1132                                            BinaryOperatorKind BOK) {
1133   D = getCanonicalDecl(D);
1134   assert(!isStackEmpty() && "Data-sharing attributes stack is empty");
1135   assert(
1136       getTopOfStack().SharingMap[D].Attributes == OMPC_reduction &&
1137       "Additional reduction info may be specified only for reduction items.");
1138   ReductionData &ReductionData = getTopOfStack().ReductionMap[D];
1139   assert(ReductionData.ReductionRange.isInvalid() &&
1140          getTopOfStack().Directive == OMPD_taskgroup &&
1141          "Additional reduction info may be specified only once for reduction "
1142          "items.");
1143   ReductionData.set(BOK, SR);
1144   Expr *&TaskgroupReductionRef =
1145       getTopOfStack().TaskgroupReductionRef;
1146   if (!TaskgroupReductionRef) {
1147     VarDecl *VD = buildVarDecl(SemaRef, SR.getBegin(),
1148                                SemaRef.Context.VoidPtrTy, ".task_red.");
1149     TaskgroupReductionRef =
1150         buildDeclRefExpr(SemaRef, VD, SemaRef.Context.VoidPtrTy, SR.getBegin());
1151   }
1152 }
1153 
1154 void DSAStackTy::addTaskgroupReductionData(const ValueDecl *D, SourceRange SR,
1155                                            const Expr *ReductionRef) {
1156   D = getCanonicalDecl(D);
1157   assert(!isStackEmpty() && "Data-sharing attributes stack is empty");
1158   assert(
1159       getTopOfStack().SharingMap[D].Attributes == OMPC_reduction &&
1160       "Additional reduction info may be specified only for reduction items.");
1161   ReductionData &ReductionData = getTopOfStack().ReductionMap[D];
1162   assert(ReductionData.ReductionRange.isInvalid() &&
1163          getTopOfStack().Directive == OMPD_taskgroup &&
1164          "Additional reduction info may be specified only once for reduction "
1165          "items.");
1166   ReductionData.set(ReductionRef, SR);
1167   Expr *&TaskgroupReductionRef =
1168       getTopOfStack().TaskgroupReductionRef;
1169   if (!TaskgroupReductionRef) {
1170     VarDecl *VD = buildVarDecl(SemaRef, SR.getBegin(),
1171                                SemaRef.Context.VoidPtrTy, ".task_red.");
1172     TaskgroupReductionRef =
1173         buildDeclRefExpr(SemaRef, VD, SemaRef.Context.VoidPtrTy, SR.getBegin());
1174   }
1175 }
1176 
1177 const DSAStackTy::DSAVarData DSAStackTy::getTopMostTaskgroupReductionData(
1178     const ValueDecl *D, SourceRange &SR, BinaryOperatorKind &BOK,
1179     Expr *&TaskgroupDescriptor) const {
1180   D = getCanonicalDecl(D);
1181   assert(!isStackEmpty() && "Data-sharing attributes stack is empty.");
1182   for (const_iterator I = begin() + 1, E = end(); I != E; ++I) {
1183     const DSAInfo &Data = I->SharingMap.lookup(D);
1184     if (Data.Attributes != OMPC_reduction || I->Directive != OMPD_taskgroup)
1185       continue;
1186     const ReductionData &ReductionData = I->ReductionMap.lookup(D);
1187     if (!ReductionData.ReductionOp ||
1188         ReductionData.ReductionOp.is<const Expr *>())
1189       return DSAVarData();
1190     SR = ReductionData.ReductionRange;
1191     BOK = ReductionData.ReductionOp.get<ReductionData::BOKPtrType>();
1192     assert(I->TaskgroupReductionRef && "taskgroup reduction reference "
1193                                        "expression for the descriptor is not "
1194                                        "set.");
1195     TaskgroupDescriptor = I->TaskgroupReductionRef;
1196     return DSAVarData(OMPD_taskgroup, OMPC_reduction, Data.RefExpr.getPointer(),
1197                       Data.PrivateCopy, I->DefaultAttrLoc);
1198   }
1199   return DSAVarData();
1200 }
1201 
1202 const DSAStackTy::DSAVarData DSAStackTy::getTopMostTaskgroupReductionData(
1203     const ValueDecl *D, SourceRange &SR, const Expr *&ReductionRef,
1204     Expr *&TaskgroupDescriptor) const {
1205   D = getCanonicalDecl(D);
1206   assert(!isStackEmpty() && "Data-sharing attributes stack is empty.");
1207   for (const_iterator I = begin() + 1, E = end(); I != E; ++I) {
1208     const DSAInfo &Data = I->SharingMap.lookup(D);
1209     if (Data.Attributes != OMPC_reduction || I->Directive != OMPD_taskgroup)
1210       continue;
1211     const ReductionData &ReductionData = I->ReductionMap.lookup(D);
1212     if (!ReductionData.ReductionOp ||
1213         !ReductionData.ReductionOp.is<const Expr *>())
1214       return DSAVarData();
1215     SR = ReductionData.ReductionRange;
1216     ReductionRef = ReductionData.ReductionOp.get<const Expr *>();
1217     assert(I->TaskgroupReductionRef && "taskgroup reduction reference "
1218                                        "expression for the descriptor is not "
1219                                        "set.");
1220     TaskgroupDescriptor = I->TaskgroupReductionRef;
1221     return DSAVarData(OMPD_taskgroup, OMPC_reduction, Data.RefExpr.getPointer(),
1222                       Data.PrivateCopy, I->DefaultAttrLoc);
1223   }
1224   return DSAVarData();
1225 }
1226 
1227 bool DSAStackTy::isOpenMPLocal(VarDecl *D, const_iterator I) const {
1228   D = D->getCanonicalDecl();
1229   for (const_iterator E = end(); I != E; ++I) {
1230     if (isImplicitOrExplicitTaskingRegion(I->Directive) ||
1231         isOpenMPTargetExecutionDirective(I->Directive)) {
1232       Scope *TopScope = I->CurScope ? I->CurScope->getParent() : nullptr;
1233       Scope *CurScope = getCurScope();
1234       while (CurScope && CurScope != TopScope && !CurScope->isDeclScope(D))
1235         CurScope = CurScope->getParent();
1236       return CurScope != TopScope;
1237     }
1238   }
1239   return false;
1240 }
1241 
1242 static bool isConstNotMutableType(Sema &SemaRef, QualType Type,
1243                                   bool AcceptIfMutable = true,
1244                                   bool *IsClassType = nullptr) {
1245   ASTContext &Context = SemaRef.getASTContext();
1246   Type = Type.getNonReferenceType().getCanonicalType();
1247   bool IsConstant = Type.isConstant(Context);
1248   Type = Context.getBaseElementType(Type);
1249   const CXXRecordDecl *RD = AcceptIfMutable && SemaRef.getLangOpts().CPlusPlus
1250                                 ? Type->getAsCXXRecordDecl()
1251                                 : nullptr;
1252   if (const auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(RD))
1253     if (const ClassTemplateDecl *CTD = CTSD->getSpecializedTemplate())
1254       RD = CTD->getTemplatedDecl();
1255   if (IsClassType)
1256     *IsClassType = RD;
1257   return IsConstant && !(SemaRef.getLangOpts().CPlusPlus && RD &&
1258                          RD->hasDefinition() && RD->hasMutableFields());
1259 }
1260 
1261 static bool rejectConstNotMutableType(Sema &SemaRef, const ValueDecl *D,
1262                                       QualType Type, OpenMPClauseKind CKind,
1263                                       SourceLocation ELoc,
1264                                       bool AcceptIfMutable = true,
1265                                       bool ListItemNotVar = false) {
1266   ASTContext &Context = SemaRef.getASTContext();
1267   bool IsClassType;
1268   if (isConstNotMutableType(SemaRef, Type, AcceptIfMutable, &IsClassType)) {
1269     unsigned Diag = ListItemNotVar
1270                         ? diag::err_omp_const_list_item
1271                         : IsClassType ? diag::err_omp_const_not_mutable_variable
1272                                       : diag::err_omp_const_variable;
1273     SemaRef.Diag(ELoc, Diag) << getOpenMPClauseName(CKind);
1274     if (!ListItemNotVar && D) {
1275       const VarDecl *VD = dyn_cast<VarDecl>(D);
1276       bool IsDecl = !VD || VD->isThisDeclarationADefinition(Context) ==
1277                                VarDecl::DeclarationOnly;
1278       SemaRef.Diag(D->getLocation(),
1279                    IsDecl ? diag::note_previous_decl : diag::note_defined_here)
1280           << D;
1281     }
1282     return true;
1283   }
1284   return false;
1285 }
1286 
1287 const DSAStackTy::DSAVarData DSAStackTy::getTopDSA(ValueDecl *D,
1288                                                    bool FromParent) {
1289   D = getCanonicalDecl(D);
1290   DSAVarData DVar;
1291 
1292   auto *VD = dyn_cast<VarDecl>(D);
1293   auto TI = Threadprivates.find(D);
1294   if (TI != Threadprivates.end()) {
1295     DVar.RefExpr = TI->getSecond().RefExpr.getPointer();
1296     DVar.CKind = OMPC_threadprivate;
1297     return DVar;
1298   }
1299   if (VD && VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
1300     DVar.RefExpr = buildDeclRefExpr(
1301         SemaRef, VD, D->getType().getNonReferenceType(),
1302         VD->getAttr<OMPThreadPrivateDeclAttr>()->getLocation());
1303     DVar.CKind = OMPC_threadprivate;
1304     addDSA(D, DVar.RefExpr, OMPC_threadprivate);
1305     return DVar;
1306   }
1307   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
1308   // in a Construct, C/C++, predetermined, p.1]
1309   //  Variables appearing in threadprivate directives are threadprivate.
1310   if ((VD && VD->getTLSKind() != VarDecl::TLS_None &&
1311        !(VD->hasAttr<OMPThreadPrivateDeclAttr>() &&
1312          SemaRef.getLangOpts().OpenMPUseTLS &&
1313          SemaRef.getASTContext().getTargetInfo().isTLSSupported())) ||
1314       (VD && VD->getStorageClass() == SC_Register &&
1315        VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())) {
1316     DVar.RefExpr = buildDeclRefExpr(
1317         SemaRef, VD, D->getType().getNonReferenceType(), D->getLocation());
1318     DVar.CKind = OMPC_threadprivate;
1319     addDSA(D, DVar.RefExpr, OMPC_threadprivate);
1320     return DVar;
1321   }
1322   if (SemaRef.getLangOpts().OpenMPCUDAMode && VD &&
1323       VD->isLocalVarDeclOrParm() && !isStackEmpty() &&
1324       !isLoopControlVariable(D).first) {
1325     const_iterator IterTarget =
1326         std::find_if(begin(), end(), [](const SharingMapTy &Data) {
1327           return isOpenMPTargetExecutionDirective(Data.Directive);
1328         });
1329     if (IterTarget != end()) {
1330       const_iterator ParentIterTarget = IterTarget + 1;
1331       for (const_iterator Iter = begin();
1332            Iter != ParentIterTarget; ++Iter) {
1333         if (isOpenMPLocal(VD, Iter)) {
1334           DVar.RefExpr =
1335               buildDeclRefExpr(SemaRef, VD, D->getType().getNonReferenceType(),
1336                                D->getLocation());
1337           DVar.CKind = OMPC_threadprivate;
1338           return DVar;
1339         }
1340       }
1341       if (!isClauseParsingMode() || IterTarget != begin()) {
1342         auto DSAIter = IterTarget->SharingMap.find(D);
1343         if (DSAIter != IterTarget->SharingMap.end() &&
1344             isOpenMPPrivate(DSAIter->getSecond().Attributes)) {
1345           DVar.RefExpr = DSAIter->getSecond().RefExpr.getPointer();
1346           DVar.CKind = OMPC_threadprivate;
1347           return DVar;
1348         }
1349         const_iterator End = end();
1350         if (!SemaRef.isOpenMPCapturedByRef(
1351                 D, std::distance(ParentIterTarget, End),
1352                 /*OpenMPCaptureLevel=*/0)) {
1353           DVar.RefExpr =
1354               buildDeclRefExpr(SemaRef, VD, D->getType().getNonReferenceType(),
1355                                IterTarget->ConstructLoc);
1356           DVar.CKind = OMPC_threadprivate;
1357           return DVar;
1358         }
1359       }
1360     }
1361   }
1362 
1363   if (isStackEmpty())
1364     // Not in OpenMP execution region and top scope was already checked.
1365     return DVar;
1366 
1367   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
1368   // in a Construct, C/C++, predetermined, p.4]
1369   //  Static data members are shared.
1370   // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
1371   // in a Construct, C/C++, predetermined, p.7]
1372   //  Variables with static storage duration that are declared in a scope
1373   //  inside the construct are shared.
1374   if (VD && VD->isStaticDataMember()) {
1375     // Check for explicitly specified attributes.
1376     const_iterator I = begin();
1377     const_iterator EndI = end();
1378     if (FromParent && I != EndI)
1379       ++I;
1380     auto It = I->SharingMap.find(D);
1381     if (It != I->SharingMap.end()) {
1382       const DSAInfo &Data = It->getSecond();
1383       DVar.RefExpr = Data.RefExpr.getPointer();
1384       DVar.PrivateCopy = Data.PrivateCopy;
1385       DVar.CKind = Data.Attributes;
1386       DVar.ImplicitDSALoc = I->DefaultAttrLoc;
1387       DVar.DKind = I->Directive;
1388       return DVar;
1389     }
1390 
1391     DVar.CKind = OMPC_shared;
1392     return DVar;
1393   }
1394 
1395   auto &&MatchesAlways = [](OpenMPDirectiveKind) { return true; };
1396   // The predetermined shared attribute for const-qualified types having no
1397   // mutable members was removed after OpenMP 3.1.
1398   if (SemaRef.LangOpts.OpenMP <= 31) {
1399     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
1400     // in a Construct, C/C++, predetermined, p.6]
1401     //  Variables with const qualified type having no mutable member are
1402     //  shared.
1403     if (isConstNotMutableType(SemaRef, D->getType())) {
1404       // Variables with const-qualified type having no mutable member may be
1405       // listed in a firstprivate clause, even if they are static data members.
1406       DSAVarData DVarTemp = hasInnermostDSA(
1407           D,
1408           [](OpenMPClauseKind C) {
1409             return C == OMPC_firstprivate || C == OMPC_shared;
1410           },
1411           MatchesAlways, FromParent);
1412       if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr)
1413         return DVarTemp;
1414 
1415       DVar.CKind = OMPC_shared;
1416       return DVar;
1417     }
1418   }
1419 
1420   // Explicitly specified attributes and local variables with predetermined
1421   // attributes.
1422   const_iterator I = begin();
1423   const_iterator EndI = end();
1424   if (FromParent && I != EndI)
1425     ++I;
1426   auto It = I->SharingMap.find(D);
1427   if (It != I->SharingMap.end()) {
1428     const DSAInfo &Data = It->getSecond();
1429     DVar.RefExpr = Data.RefExpr.getPointer();
1430     DVar.PrivateCopy = Data.PrivateCopy;
1431     DVar.CKind = Data.Attributes;
1432     DVar.ImplicitDSALoc = I->DefaultAttrLoc;
1433     DVar.DKind = I->Directive;
1434   }
1435 
1436   return DVar;
1437 }
1438 
1439 const DSAStackTy::DSAVarData DSAStackTy::getImplicitDSA(ValueDecl *D,
1440                                                         bool FromParent) const {
1441   if (isStackEmpty()) {
1442     const_iterator I;
1443     return getDSA(I, D);
1444   }
1445   D = getCanonicalDecl(D);
1446   const_iterator StartI = begin();
1447   const_iterator EndI = end();
1448   if (FromParent && StartI != EndI)
1449     ++StartI;
1450   return getDSA(StartI, D);
1451 }
1452 
1453 const DSAStackTy::DSAVarData
1454 DSAStackTy::hasDSA(ValueDecl *D,
1455                    const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
1456                    const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
1457                    bool FromParent) const {
1458   if (isStackEmpty())
1459     return {};
1460   D = getCanonicalDecl(D);
1461   const_iterator I = begin();
1462   const_iterator EndI = end();
1463   if (FromParent && I != EndI)
1464     ++I;
1465   for (; I != EndI; ++I) {
1466     if (!DPred(I->Directive) &&
1467         !isImplicitOrExplicitTaskingRegion(I->Directive))
1468       continue;
1469     const_iterator NewI = I;
1470     DSAVarData DVar = getDSA(NewI, D);
1471     if (I == NewI && CPred(DVar.CKind))
1472       return DVar;
1473   }
1474   return {};
1475 }
1476 
1477 const DSAStackTy::DSAVarData DSAStackTy::hasInnermostDSA(
1478     ValueDecl *D, const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
1479     const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
1480     bool FromParent) const {
1481   if (isStackEmpty())
1482     return {};
1483   D = getCanonicalDecl(D);
1484   const_iterator StartI = begin();
1485   const_iterator EndI = end();
1486   if (FromParent && StartI != EndI)
1487     ++StartI;
1488   if (StartI == EndI || !DPred(StartI->Directive))
1489     return {};
1490   const_iterator NewI = StartI;
1491   DSAVarData DVar = getDSA(NewI, D);
1492   return (NewI == StartI && CPred(DVar.CKind)) ? DVar : DSAVarData();
1493 }
1494 
1495 bool DSAStackTy::hasExplicitDSA(
1496     const ValueDecl *D, const llvm::function_ref<bool(OpenMPClauseKind)> CPred,
1497     unsigned Level, bool NotLastprivate) const {
1498   if (getStackSize() <= Level)
1499     return false;
1500   D = getCanonicalDecl(D);
1501   const SharingMapTy &StackElem = getStackElemAtLevel(Level);
1502   auto I = StackElem.SharingMap.find(D);
1503   if (I != StackElem.SharingMap.end() &&
1504       I->getSecond().RefExpr.getPointer() &&
1505       CPred(I->getSecond().Attributes) &&
1506       (!NotLastprivate || !I->getSecond().RefExpr.getInt()))
1507     return true;
1508   // Check predetermined rules for the loop control variables.
1509   auto LI = StackElem.LCVMap.find(D);
1510   if (LI != StackElem.LCVMap.end())
1511     return CPred(OMPC_private);
1512   return false;
1513 }
1514 
1515 bool DSAStackTy::hasExplicitDirective(
1516     const llvm::function_ref<bool(OpenMPDirectiveKind)> DPred,
1517     unsigned Level) const {
1518   if (getStackSize() <= Level)
1519     return false;
1520   const SharingMapTy &StackElem = getStackElemAtLevel(Level);
1521   return DPred(StackElem.Directive);
1522 }
1523 
1524 bool DSAStackTy::hasDirective(
1525     const llvm::function_ref<bool(OpenMPDirectiveKind,
1526                                   const DeclarationNameInfo &, SourceLocation)>
1527         DPred,
1528     bool FromParent) const {
1529   // We look only in the enclosing region.
1530   size_t Skip = FromParent ? 2 : 1;
1531   for (const_iterator I = begin() + std::min(Skip, getStackSize()), E = end();
1532        I != E; ++I) {
1533     if (DPred(I->Directive, I->DirectiveName, I->ConstructLoc))
1534       return true;
1535   }
1536   return false;
1537 }
1538 
1539 void Sema::InitDataSharingAttributesStack() {
1540   VarDataSharingAttributesStack = new DSAStackTy(*this);
1541 }
1542 
1543 #define DSAStack static_cast<DSAStackTy *>(VarDataSharingAttributesStack)
1544 
1545 void Sema::pushOpenMPFunctionRegion() {
1546   DSAStack->pushFunction();
1547 }
1548 
1549 void Sema::popOpenMPFunctionRegion(const FunctionScopeInfo *OldFSI) {
1550   DSAStack->popFunction(OldFSI);
1551 }
1552 
1553 static bool isOpenMPDeviceDelayedContext(Sema &S) {
1554   assert(S.LangOpts.OpenMP && S.LangOpts.OpenMPIsDevice &&
1555          "Expected OpenMP device compilation.");
1556   return !S.isInOpenMPTargetExecutionDirective() &&
1557          !S.isInOpenMPDeclareTargetContext();
1558 }
1559 
1560 namespace {
1561 /// Status of the function emission on the host/device.
1562 enum class FunctionEmissionStatus {
1563   Emitted,
1564   Discarded,
1565   Unknown,
1566 };
1567 } // anonymous namespace
1568 
1569 Sema::DeviceDiagBuilder Sema::diagIfOpenMPDeviceCode(SourceLocation Loc,
1570                                                      unsigned DiagID) {
1571   assert(LangOpts.OpenMP && LangOpts.OpenMPIsDevice &&
1572          "Expected OpenMP device compilation.");
1573   FunctionEmissionStatus FES = getEmissionStatus(getCurFunctionDecl());
1574   DeviceDiagBuilder::Kind Kind = DeviceDiagBuilder::K_Nop;
1575   switch (FES) {
1576   case FunctionEmissionStatus::Emitted:
1577     Kind = DeviceDiagBuilder::K_Immediate;
1578     break;
1579   case FunctionEmissionStatus::Unknown:
1580     Kind = isOpenMPDeviceDelayedContext(*this) ? DeviceDiagBuilder::K_Deferred
1581                                                : DeviceDiagBuilder::K_Immediate;
1582     break;
1583   case FunctionEmissionStatus::TemplateDiscarded:
1584   case FunctionEmissionStatus::OMPDiscarded:
1585     Kind = DeviceDiagBuilder::K_Nop;
1586     break;
1587   case FunctionEmissionStatus::CUDADiscarded:
1588     llvm_unreachable("CUDADiscarded unexpected in OpenMP device compilation");
1589     break;
1590   }
1591 
1592   return DeviceDiagBuilder(Kind, Loc, DiagID, getCurFunctionDecl(), *this);
1593 }
1594 
1595 Sema::DeviceDiagBuilder Sema::diagIfOpenMPHostCode(SourceLocation Loc,
1596                                                    unsigned DiagID) {
1597   assert(LangOpts.OpenMP && !LangOpts.OpenMPIsDevice &&
1598          "Expected OpenMP host compilation.");
1599   FunctionEmissionStatus FES = getEmissionStatus(getCurFunctionDecl());
1600   DeviceDiagBuilder::Kind Kind = DeviceDiagBuilder::K_Nop;
1601   switch (FES) {
1602   case FunctionEmissionStatus::Emitted:
1603     Kind = DeviceDiagBuilder::K_Immediate;
1604     break;
1605   case FunctionEmissionStatus::Unknown:
1606     Kind = DeviceDiagBuilder::K_Deferred;
1607     break;
1608   case FunctionEmissionStatus::TemplateDiscarded:
1609   case FunctionEmissionStatus::OMPDiscarded:
1610   case FunctionEmissionStatus::CUDADiscarded:
1611     Kind = DeviceDiagBuilder::K_Nop;
1612     break;
1613   }
1614 
1615   return DeviceDiagBuilder(Kind, Loc, DiagID, getCurFunctionDecl(), *this);
1616 }
1617 
1618 void Sema::checkOpenMPDeviceFunction(SourceLocation Loc, FunctionDecl *Callee,
1619                                      bool CheckForDelayedContext) {
1620   assert(LangOpts.OpenMP && LangOpts.OpenMPIsDevice &&
1621          "Expected OpenMP device compilation.");
1622   assert(Callee && "Callee may not be null.");
1623   Callee = Callee->getMostRecentDecl();
1624   FunctionDecl *Caller = getCurFunctionDecl();
1625 
1626   // host only function are not available on the device.
1627   if (Caller) {
1628     FunctionEmissionStatus CallerS = getEmissionStatus(Caller);
1629     FunctionEmissionStatus CalleeS = getEmissionStatus(Callee);
1630     assert(CallerS != FunctionEmissionStatus::CUDADiscarded &&
1631            CalleeS != FunctionEmissionStatus::CUDADiscarded &&
1632            "CUDADiscarded unexpected in OpenMP device function check");
1633     if ((CallerS == FunctionEmissionStatus::Emitted ||
1634          (!isOpenMPDeviceDelayedContext(*this) &&
1635           CallerS == FunctionEmissionStatus::Unknown)) &&
1636         CalleeS == FunctionEmissionStatus::OMPDiscarded) {
1637       StringRef HostDevTy = getOpenMPSimpleClauseTypeName(
1638           OMPC_device_type, OMPC_DEVICE_TYPE_host);
1639       Diag(Loc, diag::err_omp_wrong_device_function_call) << HostDevTy << 0;
1640       Diag(Callee->getAttr<OMPDeclareTargetDeclAttr>()->getLocation(),
1641            diag::note_omp_marked_device_type_here)
1642           << HostDevTy;
1643       return;
1644     }
1645   }
1646   // If the caller is known-emitted, mark the callee as known-emitted.
1647   // Otherwise, mark the call in our call graph so we can traverse it later.
1648   if ((CheckForDelayedContext && !isOpenMPDeviceDelayedContext(*this)) ||
1649       (!Caller && !CheckForDelayedContext) ||
1650       (Caller && getEmissionStatus(Caller) == FunctionEmissionStatus::Emitted))
1651     markKnownEmitted(*this, Caller, Callee, Loc,
1652                      [CheckForDelayedContext](Sema &S, FunctionDecl *FD) {
1653                        return CheckForDelayedContext &&
1654                               S.getEmissionStatus(FD) ==
1655                                   FunctionEmissionStatus::Emitted;
1656                      });
1657   else if (Caller)
1658     DeviceCallGraph[Caller].insert({Callee, Loc});
1659 }
1660 
1661 void Sema::checkOpenMPHostFunction(SourceLocation Loc, FunctionDecl *Callee,
1662                                    bool CheckCaller) {
1663   assert(LangOpts.OpenMP && !LangOpts.OpenMPIsDevice &&
1664          "Expected OpenMP host compilation.");
1665   assert(Callee && "Callee may not be null.");
1666   Callee = Callee->getMostRecentDecl();
1667   FunctionDecl *Caller = getCurFunctionDecl();
1668 
1669   // device only function are not available on the host.
1670   if (Caller) {
1671     FunctionEmissionStatus CallerS = getEmissionStatus(Caller);
1672     FunctionEmissionStatus CalleeS = getEmissionStatus(Callee);
1673     assert(
1674         (LangOpts.CUDA || (CallerS != FunctionEmissionStatus::CUDADiscarded &&
1675                            CalleeS != FunctionEmissionStatus::CUDADiscarded)) &&
1676         "CUDADiscarded unexpected in OpenMP host function check");
1677     if (CallerS == FunctionEmissionStatus::Emitted &&
1678         CalleeS == FunctionEmissionStatus::OMPDiscarded) {
1679       StringRef NoHostDevTy = getOpenMPSimpleClauseTypeName(
1680           OMPC_device_type, OMPC_DEVICE_TYPE_nohost);
1681       Diag(Loc, diag::err_omp_wrong_device_function_call) << NoHostDevTy << 1;
1682       Diag(Callee->getAttr<OMPDeclareTargetDeclAttr>()->getLocation(),
1683            diag::note_omp_marked_device_type_here)
1684           << NoHostDevTy;
1685       return;
1686     }
1687   }
1688   // If the caller is known-emitted, mark the callee as known-emitted.
1689   // Otherwise, mark the call in our call graph so we can traverse it later.
1690   if (!shouldIgnoreInHostDeviceCheck(Callee)) {
1691     if ((!CheckCaller && !Caller) ||
1692         (Caller &&
1693          getEmissionStatus(Caller) == FunctionEmissionStatus::Emitted))
1694       markKnownEmitted(
1695           *this, Caller, Callee, Loc, [CheckCaller](Sema &S, FunctionDecl *FD) {
1696             return CheckCaller &&
1697                    S.getEmissionStatus(FD) == FunctionEmissionStatus::Emitted;
1698           });
1699     else if (Caller)
1700       DeviceCallGraph[Caller].insert({Callee, Loc});
1701   }
1702 }
1703 
1704 void Sema::checkOpenMPDeviceExpr(const Expr *E) {
1705   assert(getLangOpts().OpenMP && getLangOpts().OpenMPIsDevice &&
1706          "OpenMP device compilation mode is expected.");
1707   QualType Ty = E->getType();
1708   if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) ||
1709       ((Ty->isFloat128Type() ||
1710         (Ty->isRealFloatingType() && Context.getTypeSize(Ty) == 128)) &&
1711        !Context.getTargetInfo().hasFloat128Type()) ||
1712       (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 &&
1713        !Context.getTargetInfo().hasInt128Type()))
1714     targetDiag(E->getExprLoc(), diag::err_omp_unsupported_type)
1715         << static_cast<unsigned>(Context.getTypeSize(Ty)) << Ty
1716         << Context.getTargetInfo().getTriple().str() << E->getSourceRange();
1717 }
1718 
1719 bool Sema::isOpenMPCapturedByRef(const ValueDecl *D, unsigned Level,
1720                                  unsigned OpenMPCaptureLevel) const {
1721   assert(LangOpts.OpenMP && "OpenMP is not allowed");
1722 
1723   ASTContext &Ctx = getASTContext();
1724   bool IsByRef = true;
1725 
1726   // Find the directive that is associated with the provided scope.
1727   D = cast<ValueDecl>(D->getCanonicalDecl());
1728   QualType Ty = D->getType();
1729 
1730   bool IsVariableUsedInMapClause = false;
1731   if (DSAStack->hasExplicitDirective(isOpenMPTargetExecutionDirective, Level)) {
1732     // This table summarizes how a given variable should be passed to the device
1733     // given its type and the clauses where it appears. This table is based on
1734     // the description in OpenMP 4.5 [2.10.4, target Construct] and
1735     // OpenMP 4.5 [2.15.5, Data-mapping Attribute Rules and Clauses].
1736     //
1737     // =========================================================================
1738     // | type |  defaultmap   | pvt | first | is_device_ptr |    map   | res.  |
1739     // |      |(tofrom:scalar)|     |  pvt  |               |          |       |
1740     // =========================================================================
1741     // | scl  |               |     |       |       -       |          | bycopy|
1742     // | scl  |               |  -  |   x   |       -       |     -    | bycopy|
1743     // | scl  |               |  x  |   -   |       -       |     -    | null  |
1744     // | scl  |       x       |     |       |       -       |          | byref |
1745     // | scl  |       x       |  -  |   x   |       -       |     -    | bycopy|
1746     // | scl  |       x       |  x  |   -   |       -       |     -    | null  |
1747     // | scl  |               |  -  |   -   |       -       |     x    | byref |
1748     // | scl  |       x       |  -  |   -   |       -       |     x    | byref |
1749     //
1750     // | agg  |      n.a.     |     |       |       -       |          | byref |
1751     // | agg  |      n.a.     |  -  |   x   |       -       |     -    | byref |
1752     // | agg  |      n.a.     |  x  |   -   |       -       |     -    | null  |
1753     // | agg  |      n.a.     |  -  |   -   |       -       |     x    | byref |
1754     // | agg  |      n.a.     |  -  |   -   |       -       |    x[]   | byref |
1755     //
1756     // | ptr  |      n.a.     |     |       |       -       |          | bycopy|
1757     // | ptr  |      n.a.     |  -  |   x   |       -       |     -    | bycopy|
1758     // | ptr  |      n.a.     |  x  |   -   |       -       |     -    | null  |
1759     // | ptr  |      n.a.     |  -  |   -   |       -       |     x    | byref |
1760     // | ptr  |      n.a.     |  -  |   -   |       -       |    x[]   | bycopy|
1761     // | ptr  |      n.a.     |  -  |   -   |       x       |          | bycopy|
1762     // | ptr  |      n.a.     |  -  |   -   |       x       |     x    | bycopy|
1763     // | ptr  |      n.a.     |  -  |   -   |       x       |    x[]   | bycopy|
1764     // =========================================================================
1765     // Legend:
1766     //  scl - scalar
1767     //  ptr - pointer
1768     //  agg - aggregate
1769     //  x - applies
1770     //  - - invalid in this combination
1771     //  [] - mapped with an array section
1772     //  byref - should be mapped by reference
1773     //  byval - should be mapped by value
1774     //  null - initialize a local variable to null on the device
1775     //
1776     // Observations:
1777     //  - All scalar declarations that show up in a map clause have to be passed
1778     //    by reference, because they may have been mapped in the enclosing data
1779     //    environment.
1780     //  - If the scalar value does not fit the size of uintptr, it has to be
1781     //    passed by reference, regardless the result in the table above.
1782     //  - For pointers mapped by value that have either an implicit map or an
1783     //    array section, the runtime library may pass the NULL value to the
1784     //    device instead of the value passed to it by the compiler.
1785 
1786     if (Ty->isReferenceType())
1787       Ty = Ty->castAs<ReferenceType>()->getPointeeType();
1788 
1789     // Locate map clauses and see if the variable being captured is referred to
1790     // in any of those clauses. Here we only care about variables, not fields,
1791     // because fields are part of aggregates.
1792     bool IsVariableAssociatedWithSection = false;
1793 
1794     DSAStack->checkMappableExprComponentListsForDeclAtLevel(
1795         D, Level,
1796         [&IsVariableUsedInMapClause, &IsVariableAssociatedWithSection, D](
1797             OMPClauseMappableExprCommon::MappableExprComponentListRef
1798                 MapExprComponents,
1799             OpenMPClauseKind WhereFoundClauseKind) {
1800           // Only the map clause information influences how a variable is
1801           // captured. E.g. is_device_ptr does not require changing the default
1802           // behavior.
1803           if (WhereFoundClauseKind != OMPC_map)
1804             return false;
1805 
1806           auto EI = MapExprComponents.rbegin();
1807           auto EE = MapExprComponents.rend();
1808 
1809           assert(EI != EE && "Invalid map expression!");
1810 
1811           if (isa<DeclRefExpr>(EI->getAssociatedExpression()))
1812             IsVariableUsedInMapClause |= EI->getAssociatedDeclaration() == D;
1813 
1814           ++EI;
1815           if (EI == EE)
1816             return false;
1817 
1818           if (isa<ArraySubscriptExpr>(EI->getAssociatedExpression()) ||
1819               isa<OMPArraySectionExpr>(EI->getAssociatedExpression()) ||
1820               isa<MemberExpr>(EI->getAssociatedExpression())) {
1821             IsVariableAssociatedWithSection = true;
1822             // There is nothing more we need to know about this variable.
1823             return true;
1824           }
1825 
1826           // Keep looking for more map info.
1827           return false;
1828         });
1829 
1830     if (IsVariableUsedInMapClause) {
1831       // If variable is identified in a map clause it is always captured by
1832       // reference except if it is a pointer that is dereferenced somehow.
1833       IsByRef = !(Ty->isPointerType() && IsVariableAssociatedWithSection);
1834     } else {
1835       // By default, all the data that has a scalar type is mapped by copy
1836       // (except for reduction variables).
1837       IsByRef =
1838           (DSAStack->isForceCaptureByReferenceInTargetExecutable() &&
1839            !Ty->isAnyPointerType()) ||
1840           !Ty->isScalarType() ||
1841           DSAStack->getDefaultDMAAtLevel(Level) == DMA_tofrom_scalar ||
1842           DSAStack->hasExplicitDSA(
1843               D, [](OpenMPClauseKind K) { return K == OMPC_reduction; }, Level);
1844     }
1845   }
1846 
1847   if (IsByRef && Ty.getNonReferenceType()->isScalarType()) {
1848     IsByRef =
1849         ((IsVariableUsedInMapClause &&
1850           DSAStack->getCaptureRegion(Level, OpenMPCaptureLevel) ==
1851               OMPD_target) ||
1852          !DSAStack->hasExplicitDSA(
1853              D,
1854              [](OpenMPClauseKind K) -> bool { return K == OMPC_firstprivate; },
1855              Level, /*NotLastprivate=*/true)) &&
1856         // If the variable is artificial and must be captured by value - try to
1857         // capture by value.
1858         !(isa<OMPCapturedExprDecl>(D) && !D->hasAttr<OMPCaptureNoInitAttr>() &&
1859           !cast<OMPCapturedExprDecl>(D)->getInit()->isGLValue());
1860   }
1861 
1862   // When passing data by copy, we need to make sure it fits the uintptr size
1863   // and alignment, because the runtime library only deals with uintptr types.
1864   // If it does not fit the uintptr size, we need to pass the data by reference
1865   // instead.
1866   if (!IsByRef &&
1867       (Ctx.getTypeSizeInChars(Ty) >
1868            Ctx.getTypeSizeInChars(Ctx.getUIntPtrType()) ||
1869        Ctx.getDeclAlign(D) > Ctx.getTypeAlignInChars(Ctx.getUIntPtrType()))) {
1870     IsByRef = true;
1871   }
1872 
1873   return IsByRef;
1874 }
1875 
1876 unsigned Sema::getOpenMPNestingLevel() const {
1877   assert(getLangOpts().OpenMP);
1878   return DSAStack->getNestingLevel();
1879 }
1880 
1881 bool Sema::isInOpenMPTargetExecutionDirective() const {
1882   return (isOpenMPTargetExecutionDirective(DSAStack->getCurrentDirective()) &&
1883           !DSAStack->isClauseParsingMode()) ||
1884          DSAStack->hasDirective(
1885              [](OpenMPDirectiveKind K, const DeclarationNameInfo &,
1886                 SourceLocation) -> bool {
1887                return isOpenMPTargetExecutionDirective(K);
1888              },
1889              false);
1890 }
1891 
1892 VarDecl *Sema::isOpenMPCapturedDecl(ValueDecl *D, bool CheckScopeInfo,
1893                                     unsigned StopAt) {
1894   assert(LangOpts.OpenMP && "OpenMP is not allowed");
1895   D = getCanonicalDecl(D);
1896 
1897   auto *VD = dyn_cast<VarDecl>(D);
1898   // Do not capture constexpr variables.
1899   if (VD && VD->isConstexpr())
1900     return nullptr;
1901 
1902   // If we want to determine whether the variable should be captured from the
1903   // perspective of the current capturing scope, and we've already left all the
1904   // capturing scopes of the top directive on the stack, check from the
1905   // perspective of its parent directive (if any) instead.
1906   DSAStackTy::ParentDirectiveScope InParentDirectiveRAII(
1907       *DSAStack, CheckScopeInfo && DSAStack->isBodyComplete());
1908 
1909   // If we are attempting to capture a global variable in a directive with
1910   // 'target' we return true so that this global is also mapped to the device.
1911   //
1912   if (VD && !VD->hasLocalStorage() &&
1913       (getCurCapturedRegion() || getCurBlock() || getCurLambda())) {
1914     if (isInOpenMPDeclareTargetContext()) {
1915       // Try to mark variable as declare target if it is used in capturing
1916       // regions.
1917       if (LangOpts.OpenMP <= 45 &&
1918           !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
1919         checkDeclIsAllowedInOpenMPTarget(nullptr, VD);
1920       return nullptr;
1921     } else if (isInOpenMPTargetExecutionDirective()) {
1922       // If the declaration is enclosed in a 'declare target' directive,
1923       // then it should not be captured.
1924       //
1925       if (OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD))
1926         return nullptr;
1927       return VD;
1928     }
1929   }
1930 
1931   if (CheckScopeInfo) {
1932     bool OpenMPFound = false;
1933     for (unsigned I = StopAt + 1; I > 0; --I) {
1934       FunctionScopeInfo *FSI = FunctionScopes[I - 1];
1935       if(!isa<CapturingScopeInfo>(FSI))
1936         return nullptr;
1937       if (auto *RSI = dyn_cast<CapturedRegionScopeInfo>(FSI))
1938         if (RSI->CapRegionKind == CR_OpenMP) {
1939           OpenMPFound = true;
1940           break;
1941         }
1942     }
1943     if (!OpenMPFound)
1944       return nullptr;
1945   }
1946 
1947   if (DSAStack->getCurrentDirective() != OMPD_unknown &&
1948       (!DSAStack->isClauseParsingMode() ||
1949        DSAStack->getParentDirective() != OMPD_unknown)) {
1950     auto &&Info = DSAStack->isLoopControlVariable(D);
1951     if (Info.first ||
1952         (VD && VD->hasLocalStorage() &&
1953          isImplicitOrExplicitTaskingRegion(DSAStack->getCurrentDirective())) ||
1954         (VD && DSAStack->isForceVarCapturing()))
1955       return VD ? VD : Info.second;
1956     DSAStackTy::DSAVarData DVarPrivate =
1957         DSAStack->getTopDSA(D, DSAStack->isClauseParsingMode());
1958     if (DVarPrivate.CKind != OMPC_unknown && isOpenMPPrivate(DVarPrivate.CKind))
1959       return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl());
1960     // Threadprivate variables must not be captured.
1961     if (isOpenMPThreadPrivate(DVarPrivate.CKind))
1962       return nullptr;
1963     // The variable is not private or it is the variable in the directive with
1964     // default(none) clause and not used in any clause.
1965     DVarPrivate = DSAStack->hasDSA(D, isOpenMPPrivate,
1966                                    [](OpenMPDirectiveKind) { return true; },
1967                                    DSAStack->isClauseParsingMode());
1968     if (DVarPrivate.CKind != OMPC_unknown ||
1969         (VD && DSAStack->getDefaultDSA() == DSA_none))
1970       return VD ? VD : cast<VarDecl>(DVarPrivate.PrivateCopy->getDecl());
1971   }
1972   return nullptr;
1973 }
1974 
1975 void Sema::adjustOpenMPTargetScopeIndex(unsigned &FunctionScopesIndex,
1976                                         unsigned Level) const {
1977   SmallVector<OpenMPDirectiveKind, 4> Regions;
1978   getOpenMPCaptureRegions(Regions, DSAStack->getDirective(Level));
1979   FunctionScopesIndex -= Regions.size();
1980 }
1981 
1982 void Sema::startOpenMPLoop() {
1983   assert(LangOpts.OpenMP && "OpenMP must be enabled.");
1984   if (isOpenMPLoopDirective(DSAStack->getCurrentDirective()))
1985     DSAStack->loopInit();
1986 }
1987 
1988 void Sema::startOpenMPCXXRangeFor() {
1989   assert(LangOpts.OpenMP && "OpenMP must be enabled.");
1990   if (isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {
1991     DSAStack->resetPossibleLoopCounter();
1992     DSAStack->loopStart();
1993   }
1994 }
1995 
1996 bool Sema::isOpenMPPrivateDecl(const ValueDecl *D, unsigned Level) const {
1997   assert(LangOpts.OpenMP && "OpenMP is not allowed");
1998   if (isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {
1999     if (DSAStack->getAssociatedLoops() > 0 &&
2000         !DSAStack->isLoopStarted()) {
2001       DSAStack->resetPossibleLoopCounter(D);
2002       DSAStack->loopStart();
2003       return true;
2004     }
2005     if ((DSAStack->getPossiblyLoopCunter() == D->getCanonicalDecl() ||
2006          DSAStack->isLoopControlVariable(D).first) &&
2007         !DSAStack->hasExplicitDSA(
2008             D, [](OpenMPClauseKind K) { return K != OMPC_private; }, Level) &&
2009         !isOpenMPSimdDirective(DSAStack->getCurrentDirective()))
2010       return true;
2011   }
2012   if (const auto *VD = dyn_cast<VarDecl>(D)) {
2013     if (DSAStack->isThreadPrivate(const_cast<VarDecl *>(VD)) &&
2014         DSAStack->isForceVarCapturing() &&
2015         !DSAStack->hasExplicitDSA(
2016             D, [](OpenMPClauseKind K) { return K == OMPC_copyin; }, Level))
2017       return true;
2018   }
2019   return DSAStack->hasExplicitDSA(
2020              D, [](OpenMPClauseKind K) { return K == OMPC_private; }, Level) ||
2021          (DSAStack->isClauseParsingMode() &&
2022           DSAStack->getClauseParsingMode() == OMPC_private) ||
2023          // Consider taskgroup reduction descriptor variable a private to avoid
2024          // possible capture in the region.
2025          (DSAStack->hasExplicitDirective(
2026               [](OpenMPDirectiveKind K) { return K == OMPD_taskgroup; },
2027               Level) &&
2028           DSAStack->isTaskgroupReductionRef(D, Level));
2029 }
2030 
2031 void Sema::setOpenMPCaptureKind(FieldDecl *FD, const ValueDecl *D,
2032                                 unsigned Level) {
2033   assert(LangOpts.OpenMP && "OpenMP is not allowed");
2034   D = getCanonicalDecl(D);
2035   OpenMPClauseKind OMPC = OMPC_unknown;
2036   for (unsigned I = DSAStack->getNestingLevel() + 1; I > Level; --I) {
2037     const unsigned NewLevel = I - 1;
2038     if (DSAStack->hasExplicitDSA(D,
2039                                  [&OMPC](const OpenMPClauseKind K) {
2040                                    if (isOpenMPPrivate(K)) {
2041                                      OMPC = K;
2042                                      return true;
2043                                    }
2044                                    return false;
2045                                  },
2046                                  NewLevel))
2047       break;
2048     if (DSAStack->checkMappableExprComponentListsForDeclAtLevel(
2049             D, NewLevel,
2050             [](OMPClauseMappableExprCommon::MappableExprComponentListRef,
2051                OpenMPClauseKind) { return true; })) {
2052       OMPC = OMPC_map;
2053       break;
2054     }
2055     if (DSAStack->hasExplicitDirective(isOpenMPTargetExecutionDirective,
2056                                        NewLevel)) {
2057       OMPC = OMPC_map;
2058       if (D->getType()->isScalarType() &&
2059           DSAStack->getDefaultDMAAtLevel(NewLevel) !=
2060               DefaultMapAttributes::DMA_tofrom_scalar)
2061         OMPC = OMPC_firstprivate;
2062       break;
2063     }
2064   }
2065   if (OMPC != OMPC_unknown)
2066     FD->addAttr(OMPCaptureKindAttr::CreateImplicit(Context, OMPC));
2067 }
2068 
2069 bool Sema::isOpenMPTargetCapturedDecl(const ValueDecl *D,
2070                                       unsigned Level) const {
2071   assert(LangOpts.OpenMP && "OpenMP is not allowed");
2072   // Return true if the current level is no longer enclosed in a target region.
2073 
2074   const auto *VD = dyn_cast<VarDecl>(D);
2075   return VD && !VD->hasLocalStorage() &&
2076          DSAStack->hasExplicitDirective(isOpenMPTargetExecutionDirective,
2077                                         Level);
2078 }
2079 
2080 void Sema::DestroyDataSharingAttributesStack() { delete DSAStack; }
2081 
2082 void Sema::finalizeOpenMPDelayedAnalysis() {
2083   assert(LangOpts.OpenMP && "Expected OpenMP compilation mode.");
2084   // Diagnose implicit declare target functions and their callees.
2085   for (const auto &CallerCallees : DeviceCallGraph) {
2086     Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
2087         OMPDeclareTargetDeclAttr::getDeviceType(
2088             CallerCallees.getFirst()->getMostRecentDecl());
2089     // Ignore host functions during device analyzis.
2090     if (LangOpts.OpenMPIsDevice && DevTy &&
2091         *DevTy == OMPDeclareTargetDeclAttr::DT_Host)
2092       continue;
2093     // Ignore nohost functions during host analyzis.
2094     if (!LangOpts.OpenMPIsDevice && DevTy &&
2095         *DevTy == OMPDeclareTargetDeclAttr::DT_NoHost)
2096       continue;
2097     for (const std::pair<CanonicalDeclPtr<FunctionDecl>, SourceLocation>
2098              &Callee : CallerCallees.getSecond()) {
2099       const FunctionDecl *FD = Callee.first->getMostRecentDecl();
2100       Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
2101           OMPDeclareTargetDeclAttr::getDeviceType(FD);
2102       if (LangOpts.OpenMPIsDevice && DevTy &&
2103           *DevTy == OMPDeclareTargetDeclAttr::DT_Host) {
2104         // Diagnose host function called during device codegen.
2105         StringRef HostDevTy = getOpenMPSimpleClauseTypeName(
2106             OMPC_device_type, OMPC_DEVICE_TYPE_host);
2107         Diag(Callee.second, diag::err_omp_wrong_device_function_call)
2108             << HostDevTy << 0;
2109         Diag(FD->getAttr<OMPDeclareTargetDeclAttr>()->getLocation(),
2110              diag::note_omp_marked_device_type_here)
2111             << HostDevTy;
2112         continue;
2113       }
2114       if (!LangOpts.OpenMPIsDevice && DevTy &&
2115           *DevTy == OMPDeclareTargetDeclAttr::DT_NoHost) {
2116         // Diagnose nohost function called during host codegen.
2117         StringRef NoHostDevTy = getOpenMPSimpleClauseTypeName(
2118             OMPC_device_type, OMPC_DEVICE_TYPE_nohost);
2119         Diag(Callee.second, diag::err_omp_wrong_device_function_call)
2120             << NoHostDevTy << 1;
2121         Diag(FD->getAttr<OMPDeclareTargetDeclAttr>()->getLocation(),
2122              diag::note_omp_marked_device_type_here)
2123             << NoHostDevTy;
2124         continue;
2125       }
2126     }
2127   }
2128 }
2129 
2130 void Sema::StartOpenMPDSABlock(OpenMPDirectiveKind DKind,
2131                                const DeclarationNameInfo &DirName,
2132                                Scope *CurScope, SourceLocation Loc) {
2133   DSAStack->push(DKind, DirName, CurScope, Loc);
2134   PushExpressionEvaluationContext(
2135       ExpressionEvaluationContext::PotentiallyEvaluated);
2136 }
2137 
2138 void Sema::StartOpenMPClause(OpenMPClauseKind K) {
2139   DSAStack->setClauseParsingMode(K);
2140 }
2141 
2142 void Sema::EndOpenMPClause() {
2143   DSAStack->setClauseParsingMode(/*K=*/OMPC_unknown);
2144 }
2145 
2146 static void checkAllocateClauses(Sema &S, DSAStackTy *Stack,
2147                                  ArrayRef<OMPClause *> Clauses);
2148 
2149 void Sema::EndOpenMPDSABlock(Stmt *CurDirective) {
2150   // OpenMP [2.14.3.5, Restrictions, C/C++, p.1]
2151   //  A variable of class type (or array thereof) that appears in a lastprivate
2152   //  clause requires an accessible, unambiguous default constructor for the
2153   //  class type, unless the list item is also specified in a firstprivate
2154   //  clause.
2155   if (const auto *D = dyn_cast_or_null<OMPExecutableDirective>(CurDirective)) {
2156     for (OMPClause *C : D->clauses()) {
2157       if (auto *Clause = dyn_cast<OMPLastprivateClause>(C)) {
2158         SmallVector<Expr *, 8> PrivateCopies;
2159         for (Expr *DE : Clause->varlists()) {
2160           if (DE->isValueDependent() || DE->isTypeDependent()) {
2161             PrivateCopies.push_back(nullptr);
2162             continue;
2163           }
2164           auto *DRE = cast<DeclRefExpr>(DE->IgnoreParens());
2165           auto *VD = cast<VarDecl>(DRE->getDecl());
2166           QualType Type = VD->getType().getNonReferenceType();
2167           const DSAStackTy::DSAVarData DVar =
2168               DSAStack->getTopDSA(VD, /*FromParent=*/false);
2169           if (DVar.CKind == OMPC_lastprivate) {
2170             // Generate helper private variable and initialize it with the
2171             // default value. The address of the original variable is replaced
2172             // by the address of the new private variable in CodeGen. This new
2173             // variable is not added to IdResolver, so the code in the OpenMP
2174             // region uses original variable for proper diagnostics.
2175             VarDecl *VDPrivate = buildVarDecl(
2176                 *this, DE->getExprLoc(), Type.getUnqualifiedType(),
2177                 VD->getName(), VD->hasAttrs() ? &VD->getAttrs() : nullptr, DRE);
2178             ActOnUninitializedDecl(VDPrivate);
2179             if (VDPrivate->isInvalidDecl()) {
2180               PrivateCopies.push_back(nullptr);
2181               continue;
2182             }
2183             PrivateCopies.push_back(buildDeclRefExpr(
2184                 *this, VDPrivate, DE->getType(), DE->getExprLoc()));
2185           } else {
2186             // The variable is also a firstprivate, so initialization sequence
2187             // for private copy is generated already.
2188             PrivateCopies.push_back(nullptr);
2189           }
2190         }
2191         Clause->setPrivateCopies(PrivateCopies);
2192       }
2193     }
2194     // Check allocate clauses.
2195     if (!CurContext->isDependentContext())
2196       checkAllocateClauses(*this, DSAStack, D->clauses());
2197   }
2198 
2199   DSAStack->pop();
2200   DiscardCleanupsInEvaluationContext();
2201   PopExpressionEvaluationContext();
2202 }
2203 
2204 static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
2205                                      Expr *NumIterations, Sema &SemaRef,
2206                                      Scope *S, DSAStackTy *Stack);
2207 
2208 namespace {
2209 
2210 class VarDeclFilterCCC final : public CorrectionCandidateCallback {
2211 private:
2212   Sema &SemaRef;
2213 
2214 public:
2215   explicit VarDeclFilterCCC(Sema &S) : SemaRef(S) {}
2216   bool ValidateCandidate(const TypoCorrection &Candidate) override {
2217     NamedDecl *ND = Candidate.getCorrectionDecl();
2218     if (const auto *VD = dyn_cast_or_null<VarDecl>(ND)) {
2219       return VD->hasGlobalStorage() &&
2220              SemaRef.isDeclInScope(ND, SemaRef.getCurLexicalContext(),
2221                                    SemaRef.getCurScope());
2222     }
2223     return false;
2224   }
2225 
2226   std::unique_ptr<CorrectionCandidateCallback> clone() override {
2227     return std::make_unique<VarDeclFilterCCC>(*this);
2228   }
2229 
2230 };
2231 
2232 class VarOrFuncDeclFilterCCC final : public CorrectionCandidateCallback {
2233 private:
2234   Sema &SemaRef;
2235 
2236 public:
2237   explicit VarOrFuncDeclFilterCCC(Sema &S) : SemaRef(S) {}
2238   bool ValidateCandidate(const TypoCorrection &Candidate) override {
2239     NamedDecl *ND = Candidate.getCorrectionDecl();
2240     if (ND && ((isa<VarDecl>(ND) && ND->getKind() == Decl::Var) ||
2241                isa<FunctionDecl>(ND))) {
2242       return SemaRef.isDeclInScope(ND, SemaRef.getCurLexicalContext(),
2243                                    SemaRef.getCurScope());
2244     }
2245     return false;
2246   }
2247 
2248   std::unique_ptr<CorrectionCandidateCallback> clone() override {
2249     return std::make_unique<VarOrFuncDeclFilterCCC>(*this);
2250   }
2251 };
2252 
2253 } // namespace
2254 
2255 ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope,
2256                                          CXXScopeSpec &ScopeSpec,
2257                                          const DeclarationNameInfo &Id,
2258                                          OpenMPDirectiveKind Kind) {
2259   LookupResult Lookup(*this, Id, LookupOrdinaryName);
2260   LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
2261 
2262   if (Lookup.isAmbiguous())
2263     return ExprError();
2264 
2265   VarDecl *VD;
2266   if (!Lookup.isSingleResult()) {
2267     VarDeclFilterCCC CCC(*this);
2268     if (TypoCorrection Corrected =
2269             CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC,
2270                         CTK_ErrorRecovery)) {
2271       diagnoseTypo(Corrected,
2272                    PDiag(Lookup.empty()
2273                              ? diag::err_undeclared_var_use_suggest
2274                              : diag::err_omp_expected_var_arg_suggest)
2275                        << Id.getName());
2276       VD = Corrected.getCorrectionDeclAs<VarDecl>();
2277     } else {
2278       Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use
2279                                        : diag::err_omp_expected_var_arg)
2280           << Id.getName();
2281       return ExprError();
2282     }
2283   } else if (!(VD = Lookup.getAsSingle<VarDecl>())) {
2284     Diag(Id.getLoc(), diag::err_omp_expected_var_arg) << Id.getName();
2285     Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at);
2286     return ExprError();
2287   }
2288   Lookup.suppressDiagnostics();
2289 
2290   // OpenMP [2.9.2, Syntax, C/C++]
2291   //   Variables must be file-scope, namespace-scope, or static block-scope.
2292   if (Kind == OMPD_threadprivate && !VD->hasGlobalStorage()) {
2293     Diag(Id.getLoc(), diag::err_omp_global_var_arg)
2294         << getOpenMPDirectiveName(Kind) << !VD->isStaticLocal();
2295     bool IsDecl =
2296         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2297     Diag(VD->getLocation(),
2298          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2299         << VD;
2300     return ExprError();
2301   }
2302 
2303   VarDecl *CanonicalVD = VD->getCanonicalDecl();
2304   NamedDecl *ND = CanonicalVD;
2305   // OpenMP [2.9.2, Restrictions, C/C++, p.2]
2306   //   A threadprivate directive for file-scope variables must appear outside
2307   //   any definition or declaration.
2308   if (CanonicalVD->getDeclContext()->isTranslationUnit() &&
2309       !getCurLexicalContext()->isTranslationUnit()) {
2310     Diag(Id.getLoc(), diag::err_omp_var_scope)
2311         << getOpenMPDirectiveName(Kind) << VD;
2312     bool IsDecl =
2313         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2314     Diag(VD->getLocation(),
2315          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2316         << VD;
2317     return ExprError();
2318   }
2319   // OpenMP [2.9.2, Restrictions, C/C++, p.3]
2320   //   A threadprivate directive for static class member variables must appear
2321   //   in the class definition, in the same scope in which the member
2322   //   variables are declared.
2323   if (CanonicalVD->isStaticDataMember() &&
2324       !CanonicalVD->getDeclContext()->Equals(getCurLexicalContext())) {
2325     Diag(Id.getLoc(), diag::err_omp_var_scope)
2326         << getOpenMPDirectiveName(Kind) << VD;
2327     bool IsDecl =
2328         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2329     Diag(VD->getLocation(),
2330          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2331         << VD;
2332     return ExprError();
2333   }
2334   // OpenMP [2.9.2, Restrictions, C/C++, p.4]
2335   //   A threadprivate directive for namespace-scope variables must appear
2336   //   outside any definition or declaration other than the namespace
2337   //   definition itself.
2338   if (CanonicalVD->getDeclContext()->isNamespace() &&
2339       (!getCurLexicalContext()->isFileContext() ||
2340        !getCurLexicalContext()->Encloses(CanonicalVD->getDeclContext()))) {
2341     Diag(Id.getLoc(), diag::err_omp_var_scope)
2342         << getOpenMPDirectiveName(Kind) << VD;
2343     bool IsDecl =
2344         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2345     Diag(VD->getLocation(),
2346          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2347         << VD;
2348     return ExprError();
2349   }
2350   // OpenMP [2.9.2, Restrictions, C/C++, p.6]
2351   //   A threadprivate directive for static block-scope variables must appear
2352   //   in the scope of the variable and not in a nested scope.
2353   if (CanonicalVD->isLocalVarDecl() && CurScope &&
2354       !isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
2355     Diag(Id.getLoc(), diag::err_omp_var_scope)
2356         << getOpenMPDirectiveName(Kind) << VD;
2357     bool IsDecl =
2358         VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2359     Diag(VD->getLocation(),
2360          IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2361         << VD;
2362     return ExprError();
2363   }
2364 
2365   // OpenMP [2.9.2, Restrictions, C/C++, p.2-6]
2366   //   A threadprivate directive must lexically precede all references to any
2367   //   of the variables in its list.
2368   if (Kind == OMPD_threadprivate && VD->isUsed() &&
2369       !DSAStack->isThreadPrivate(VD)) {
2370     Diag(Id.getLoc(), diag::err_omp_var_used)
2371         << getOpenMPDirectiveName(Kind) << VD;
2372     return ExprError();
2373   }
2374 
2375   QualType ExprType = VD->getType().getNonReferenceType();
2376   return DeclRefExpr::Create(Context, NestedNameSpecifierLoc(),
2377                              SourceLocation(), VD,
2378                              /*RefersToEnclosingVariableOrCapture=*/false,
2379                              Id.getLoc(), ExprType, VK_LValue);
2380 }
2381 
2382 Sema::DeclGroupPtrTy
2383 Sema::ActOnOpenMPThreadprivateDirective(SourceLocation Loc,
2384                                         ArrayRef<Expr *> VarList) {
2385   if (OMPThreadPrivateDecl *D = CheckOMPThreadPrivateDecl(Loc, VarList)) {
2386     CurContext->addDecl(D);
2387     return DeclGroupPtrTy::make(DeclGroupRef(D));
2388   }
2389   return nullptr;
2390 }
2391 
2392 namespace {
2393 class LocalVarRefChecker final
2394     : public ConstStmtVisitor<LocalVarRefChecker, bool> {
2395   Sema &SemaRef;
2396 
2397 public:
2398   bool VisitDeclRefExpr(const DeclRefExpr *E) {
2399     if (const auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
2400       if (VD->hasLocalStorage()) {
2401         SemaRef.Diag(E->getBeginLoc(),
2402                      diag::err_omp_local_var_in_threadprivate_init)
2403             << E->getSourceRange();
2404         SemaRef.Diag(VD->getLocation(), diag::note_defined_here)
2405             << VD << VD->getSourceRange();
2406         return true;
2407       }
2408     }
2409     return false;
2410   }
2411   bool VisitStmt(const Stmt *S) {
2412     for (const Stmt *Child : S->children()) {
2413       if (Child && Visit(Child))
2414         return true;
2415     }
2416     return false;
2417   }
2418   explicit LocalVarRefChecker(Sema &SemaRef) : SemaRef(SemaRef) {}
2419 };
2420 } // namespace
2421 
2422 OMPThreadPrivateDecl *
2423 Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {
2424   SmallVector<Expr *, 8> Vars;
2425   for (Expr *RefExpr : VarList) {
2426     auto *DE = cast<DeclRefExpr>(RefExpr);
2427     auto *VD = cast<VarDecl>(DE->getDecl());
2428     SourceLocation ILoc = DE->getExprLoc();
2429 
2430     // Mark variable as used.
2431     VD->setReferenced();
2432     VD->markUsed(Context);
2433 
2434     QualType QType = VD->getType();
2435     if (QType->isDependentType() || QType->isInstantiationDependentType()) {
2436       // It will be analyzed later.
2437       Vars.push_back(DE);
2438       continue;
2439     }
2440 
2441     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
2442     //   A threadprivate variable must not have an incomplete type.
2443     if (RequireCompleteType(ILoc, VD->getType(),
2444                             diag::err_omp_threadprivate_incomplete_type)) {
2445       continue;
2446     }
2447 
2448     // OpenMP [2.9.2, Restrictions, C/C++, p.10]
2449     //   A threadprivate variable must not have a reference type.
2450     if (VD->getType()->isReferenceType()) {
2451       Diag(ILoc, diag::err_omp_ref_type_arg)
2452           << getOpenMPDirectiveName(OMPD_threadprivate) << VD->getType();
2453       bool IsDecl =
2454           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2455       Diag(VD->getLocation(),
2456            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2457           << VD;
2458       continue;
2459     }
2460 
2461     // Check if this is a TLS variable. If TLS is not being supported, produce
2462     // the corresponding diagnostic.
2463     if ((VD->getTLSKind() != VarDecl::TLS_None &&
2464          !(VD->hasAttr<OMPThreadPrivateDeclAttr>() &&
2465            getLangOpts().OpenMPUseTLS &&
2466            getASTContext().getTargetInfo().isTLSSupported())) ||
2467         (VD->getStorageClass() == SC_Register && VD->hasAttr<AsmLabelAttr>() &&
2468          !VD->isLocalVarDecl())) {
2469       Diag(ILoc, diag::err_omp_var_thread_local)
2470           << VD << ((VD->getTLSKind() != VarDecl::TLS_None) ? 0 : 1);
2471       bool IsDecl =
2472           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
2473       Diag(VD->getLocation(),
2474            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2475           << VD;
2476       continue;
2477     }
2478 
2479     // Check if initial value of threadprivate variable reference variable with
2480     // local storage (it is not supported by runtime).
2481     if (const Expr *Init = VD->getAnyInitializer()) {
2482       LocalVarRefChecker Checker(*this);
2483       if (Checker.Visit(Init))
2484         continue;
2485     }
2486 
2487     Vars.push_back(RefExpr);
2488     DSAStack->addDSA(VD, DE, OMPC_threadprivate);
2489     VD->addAttr(OMPThreadPrivateDeclAttr::CreateImplicit(
2490         Context, SourceRange(Loc, Loc)));
2491     if (ASTMutationListener *ML = Context.getASTMutationListener())
2492       ML->DeclarationMarkedOpenMPThreadPrivate(VD);
2493   }
2494   OMPThreadPrivateDecl *D = nullptr;
2495   if (!Vars.empty()) {
2496     D = OMPThreadPrivateDecl::Create(Context, getCurLexicalContext(), Loc,
2497                                      Vars);
2498     D->setAccess(AS_public);
2499   }
2500   return D;
2501 }
2502 
2503 static OMPAllocateDeclAttr::AllocatorTypeTy
2504 getAllocatorKind(Sema &S, DSAStackTy *Stack, Expr *Allocator) {
2505   if (!Allocator)
2506     return OMPAllocateDeclAttr::OMPDefaultMemAlloc;
2507   if (Allocator->isTypeDependent() || Allocator->isValueDependent() ||
2508       Allocator->isInstantiationDependent() ||
2509       Allocator->containsUnexpandedParameterPack())
2510     return OMPAllocateDeclAttr::OMPUserDefinedMemAlloc;
2511   auto AllocatorKindRes = OMPAllocateDeclAttr::OMPUserDefinedMemAlloc;
2512   const Expr *AE = Allocator->IgnoreParenImpCasts();
2513   for (int I = OMPAllocateDeclAttr::OMPDefaultMemAlloc;
2514        I < OMPAllocateDeclAttr::OMPUserDefinedMemAlloc; ++I) {
2515     auto AllocatorKind = static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(I);
2516     const Expr *DefAllocator = Stack->getAllocator(AllocatorKind);
2517     llvm::FoldingSetNodeID AEId, DAEId;
2518     AE->Profile(AEId, S.getASTContext(), /*Canonical=*/true);
2519     DefAllocator->Profile(DAEId, S.getASTContext(), /*Canonical=*/true);
2520     if (AEId == DAEId) {
2521       AllocatorKindRes = AllocatorKind;
2522       break;
2523     }
2524   }
2525   return AllocatorKindRes;
2526 }
2527 
2528 static bool checkPreviousOMPAllocateAttribute(
2529     Sema &S, DSAStackTy *Stack, Expr *RefExpr, VarDecl *VD,
2530     OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind, Expr *Allocator) {
2531   if (!VD->hasAttr<OMPAllocateDeclAttr>())
2532     return false;
2533   const auto *A = VD->getAttr<OMPAllocateDeclAttr>();
2534   Expr *PrevAllocator = A->getAllocator();
2535   OMPAllocateDeclAttr::AllocatorTypeTy PrevAllocatorKind =
2536       getAllocatorKind(S, Stack, PrevAllocator);
2537   bool AllocatorsMatch = AllocatorKind == PrevAllocatorKind;
2538   if (AllocatorsMatch &&
2539       AllocatorKind == OMPAllocateDeclAttr::OMPUserDefinedMemAlloc &&
2540       Allocator && PrevAllocator) {
2541     const Expr *AE = Allocator->IgnoreParenImpCasts();
2542     const Expr *PAE = PrevAllocator->IgnoreParenImpCasts();
2543     llvm::FoldingSetNodeID AEId, PAEId;
2544     AE->Profile(AEId, S.Context, /*Canonical=*/true);
2545     PAE->Profile(PAEId, S.Context, /*Canonical=*/true);
2546     AllocatorsMatch = AEId == PAEId;
2547   }
2548   if (!AllocatorsMatch) {
2549     SmallString<256> AllocatorBuffer;
2550     llvm::raw_svector_ostream AllocatorStream(AllocatorBuffer);
2551     if (Allocator)
2552       Allocator->printPretty(AllocatorStream, nullptr, S.getPrintingPolicy());
2553     SmallString<256> PrevAllocatorBuffer;
2554     llvm::raw_svector_ostream PrevAllocatorStream(PrevAllocatorBuffer);
2555     if (PrevAllocator)
2556       PrevAllocator->printPretty(PrevAllocatorStream, nullptr,
2557                                  S.getPrintingPolicy());
2558 
2559     SourceLocation AllocatorLoc =
2560         Allocator ? Allocator->getExprLoc() : RefExpr->getExprLoc();
2561     SourceRange AllocatorRange =
2562         Allocator ? Allocator->getSourceRange() : RefExpr->getSourceRange();
2563     SourceLocation PrevAllocatorLoc =
2564         PrevAllocator ? PrevAllocator->getExprLoc() : A->getLocation();
2565     SourceRange PrevAllocatorRange =
2566         PrevAllocator ? PrevAllocator->getSourceRange() : A->getRange();
2567     S.Diag(AllocatorLoc, diag::warn_omp_used_different_allocator)
2568         << (Allocator ? 1 : 0) << AllocatorStream.str()
2569         << (PrevAllocator ? 1 : 0) << PrevAllocatorStream.str()
2570         << AllocatorRange;
2571     S.Diag(PrevAllocatorLoc, diag::note_omp_previous_allocator)
2572         << PrevAllocatorRange;
2573     return true;
2574   }
2575   return false;
2576 }
2577 
2578 static void
2579 applyOMPAllocateAttribute(Sema &S, VarDecl *VD,
2580                           OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind,
2581                           Expr *Allocator, SourceRange SR) {
2582   if (VD->hasAttr<OMPAllocateDeclAttr>())
2583     return;
2584   if (Allocator &&
2585       (Allocator->isTypeDependent() || Allocator->isValueDependent() ||
2586        Allocator->isInstantiationDependent() ||
2587        Allocator->containsUnexpandedParameterPack()))
2588     return;
2589   auto *A = OMPAllocateDeclAttr::CreateImplicit(S.Context, AllocatorKind,
2590                                                 Allocator, SR);
2591   VD->addAttr(A);
2592   if (ASTMutationListener *ML = S.Context.getASTMutationListener())
2593     ML->DeclarationMarkedOpenMPAllocate(VD, A);
2594 }
2595 
2596 Sema::DeclGroupPtrTy Sema::ActOnOpenMPAllocateDirective(
2597     SourceLocation Loc, ArrayRef<Expr *> VarList,
2598     ArrayRef<OMPClause *> Clauses, DeclContext *Owner) {
2599   assert(Clauses.size() <= 1 && "Expected at most one clause.");
2600   Expr *Allocator = nullptr;
2601   if (Clauses.empty()) {
2602     // OpenMP 5.0, 2.11.3 allocate Directive, Restrictions.
2603     // allocate directives that appear in a target region must specify an
2604     // allocator clause unless a requires directive with the dynamic_allocators
2605     // clause is present in the same compilation unit.
2606     if (LangOpts.OpenMPIsDevice &&
2607         !DSAStack->hasRequiresDeclWithClause<OMPDynamicAllocatorsClause>())
2608       targetDiag(Loc, diag::err_expected_allocator_clause);
2609   } else {
2610     Allocator = cast<OMPAllocatorClause>(Clauses.back())->getAllocator();
2611   }
2612   OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind =
2613       getAllocatorKind(*this, DSAStack, Allocator);
2614   SmallVector<Expr *, 8> Vars;
2615   for (Expr *RefExpr : VarList) {
2616     auto *DE = cast<DeclRefExpr>(RefExpr);
2617     auto *VD = cast<VarDecl>(DE->getDecl());
2618 
2619     // Check if this is a TLS variable or global register.
2620     if (VD->getTLSKind() != VarDecl::TLS_None ||
2621         VD->hasAttr<OMPThreadPrivateDeclAttr>() ||
2622         (VD->getStorageClass() == SC_Register && VD->hasAttr<AsmLabelAttr>() &&
2623          !VD->isLocalVarDecl()))
2624       continue;
2625 
2626     // If the used several times in the allocate directive, the same allocator
2627     // must be used.
2628     if (checkPreviousOMPAllocateAttribute(*this, DSAStack, RefExpr, VD,
2629                                           AllocatorKind, Allocator))
2630       continue;
2631 
2632     // OpenMP, 2.11.3 allocate Directive, Restrictions, C / C++
2633     // If a list item has a static storage type, the allocator expression in the
2634     // allocator clause must be a constant expression that evaluates to one of
2635     // the predefined memory allocator values.
2636     if (Allocator && VD->hasGlobalStorage()) {
2637       if (AllocatorKind == OMPAllocateDeclAttr::OMPUserDefinedMemAlloc) {
2638         Diag(Allocator->getExprLoc(),
2639              diag::err_omp_expected_predefined_allocator)
2640             << Allocator->getSourceRange();
2641         bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
2642                       VarDecl::DeclarationOnly;
2643         Diag(VD->getLocation(),
2644              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
2645             << VD;
2646         continue;
2647       }
2648     }
2649 
2650     Vars.push_back(RefExpr);
2651     applyOMPAllocateAttribute(*this, VD, AllocatorKind, Allocator,
2652                               DE->getSourceRange());
2653   }
2654   if (Vars.empty())
2655     return nullptr;
2656   if (!Owner)
2657     Owner = getCurLexicalContext();
2658   auto *D = OMPAllocateDecl::Create(Context, Owner, Loc, Vars, Clauses);
2659   D->setAccess(AS_public);
2660   Owner->addDecl(D);
2661   return DeclGroupPtrTy::make(DeclGroupRef(D));
2662 }
2663 
2664 Sema::DeclGroupPtrTy
2665 Sema::ActOnOpenMPRequiresDirective(SourceLocation Loc,
2666                                    ArrayRef<OMPClause *> ClauseList) {
2667   OMPRequiresDecl *D = nullptr;
2668   if (!CurContext->isFileContext()) {
2669     Diag(Loc, diag::err_omp_invalid_scope) << "requires";
2670   } else {
2671     D = CheckOMPRequiresDecl(Loc, ClauseList);
2672     if (D) {
2673       CurContext->addDecl(D);
2674       DSAStack->addRequiresDecl(D);
2675     }
2676   }
2677   return DeclGroupPtrTy::make(DeclGroupRef(D));
2678 }
2679 
2680 OMPRequiresDecl *Sema::CheckOMPRequiresDecl(SourceLocation Loc,
2681                                             ArrayRef<OMPClause *> ClauseList) {
2682   /// For target specific clauses, the requires directive cannot be
2683   /// specified after the handling of any of the target regions in the
2684   /// current compilation unit.
2685   ArrayRef<SourceLocation> TargetLocations =
2686       DSAStack->getEncounteredTargetLocs();
2687   if (!TargetLocations.empty()) {
2688     for (const OMPClause *CNew : ClauseList) {
2689       // Check if any of the requires clauses affect target regions.
2690       if (isa<OMPUnifiedSharedMemoryClause>(CNew) ||
2691           isa<OMPUnifiedAddressClause>(CNew) ||
2692           isa<OMPReverseOffloadClause>(CNew) ||
2693           isa<OMPDynamicAllocatorsClause>(CNew)) {
2694         Diag(Loc, diag::err_omp_target_before_requires)
2695             << getOpenMPClauseName(CNew->getClauseKind());
2696         for (SourceLocation TargetLoc : TargetLocations) {
2697           Diag(TargetLoc, diag::note_omp_requires_encountered_target);
2698         }
2699       }
2700     }
2701   }
2702 
2703   if (!DSAStack->hasDuplicateRequiresClause(ClauseList))
2704     return OMPRequiresDecl::Create(Context, getCurLexicalContext(), Loc,
2705                                    ClauseList);
2706   return nullptr;
2707 }
2708 
2709 static void reportOriginalDsa(Sema &SemaRef, const DSAStackTy *Stack,
2710                               const ValueDecl *D,
2711                               const DSAStackTy::DSAVarData &DVar,
2712                               bool IsLoopIterVar = false) {
2713   if (DVar.RefExpr) {
2714     SemaRef.Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_explicit_dsa)
2715         << getOpenMPClauseName(DVar.CKind);
2716     return;
2717   }
2718   enum {
2719     PDSA_StaticMemberShared,
2720     PDSA_StaticLocalVarShared,
2721     PDSA_LoopIterVarPrivate,
2722     PDSA_LoopIterVarLinear,
2723     PDSA_LoopIterVarLastprivate,
2724     PDSA_ConstVarShared,
2725     PDSA_GlobalVarShared,
2726     PDSA_TaskVarFirstprivate,
2727     PDSA_LocalVarPrivate,
2728     PDSA_Implicit
2729   } Reason = PDSA_Implicit;
2730   bool ReportHint = false;
2731   auto ReportLoc = D->getLocation();
2732   auto *VD = dyn_cast<VarDecl>(D);
2733   if (IsLoopIterVar) {
2734     if (DVar.CKind == OMPC_private)
2735       Reason = PDSA_LoopIterVarPrivate;
2736     else if (DVar.CKind == OMPC_lastprivate)
2737       Reason = PDSA_LoopIterVarLastprivate;
2738     else
2739       Reason = PDSA_LoopIterVarLinear;
2740   } else if (isOpenMPTaskingDirective(DVar.DKind) &&
2741              DVar.CKind == OMPC_firstprivate) {
2742     Reason = PDSA_TaskVarFirstprivate;
2743     ReportLoc = DVar.ImplicitDSALoc;
2744   } else if (VD && VD->isStaticLocal())
2745     Reason = PDSA_StaticLocalVarShared;
2746   else if (VD && VD->isStaticDataMember())
2747     Reason = PDSA_StaticMemberShared;
2748   else if (VD && VD->isFileVarDecl())
2749     Reason = PDSA_GlobalVarShared;
2750   else if (D->getType().isConstant(SemaRef.getASTContext()))
2751     Reason = PDSA_ConstVarShared;
2752   else if (VD && VD->isLocalVarDecl() && DVar.CKind == OMPC_private) {
2753     ReportHint = true;
2754     Reason = PDSA_LocalVarPrivate;
2755   }
2756   if (Reason != PDSA_Implicit) {
2757     SemaRef.Diag(ReportLoc, diag::note_omp_predetermined_dsa)
2758         << Reason << ReportHint
2759         << getOpenMPDirectiveName(Stack->getCurrentDirective());
2760   } else if (DVar.ImplicitDSALoc.isValid()) {
2761     SemaRef.Diag(DVar.ImplicitDSALoc, diag::note_omp_implicit_dsa)
2762         << getOpenMPClauseName(DVar.CKind);
2763   }
2764 }
2765 
2766 namespace {
2767 class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
2768   DSAStackTy *Stack;
2769   Sema &SemaRef;
2770   bool ErrorFound = false;
2771   CapturedStmt *CS = nullptr;
2772   llvm::SmallVector<Expr *, 4> ImplicitFirstprivate;
2773   llvm::SmallVector<Expr *, 4> ImplicitMap;
2774   Sema::VarsWithInheritedDSAType VarsWithInheritedDSA;
2775   llvm::SmallDenseSet<const ValueDecl *, 4> ImplicitDeclarations;
2776 
2777   void VisitSubCaptures(OMPExecutableDirective *S) {
2778     // Check implicitly captured variables.
2779     if (!S->hasAssociatedStmt() || !S->getAssociatedStmt())
2780       return;
2781     visitSubCaptures(S->getInnermostCapturedStmt());
2782   }
2783 
2784 public:
2785   void VisitDeclRefExpr(DeclRefExpr *E) {
2786     if (E->isTypeDependent() || E->isValueDependent() ||
2787         E->containsUnexpandedParameterPack() || E->isInstantiationDependent())
2788       return;
2789     if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
2790       // Check the datasharing rules for the expressions in the clauses.
2791       if (!CS) {
2792         if (auto *CED = dyn_cast<OMPCapturedExprDecl>(VD))
2793           if (!CED->hasAttr<OMPCaptureNoInitAttr>()) {
2794             Visit(CED->getInit());
2795             return;
2796           }
2797       } else if (VD->isImplicit() || isa<OMPCapturedExprDecl>(VD))
2798         // Do not analyze internal variables and do not enclose them into
2799         // implicit clauses.
2800         return;
2801       VD = VD->getCanonicalDecl();
2802       // Skip internally declared variables.
2803       if (VD->hasLocalStorage() && CS && !CS->capturesVariable(VD))
2804         return;
2805 
2806       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, /*FromParent=*/false);
2807       // Check if the variable has explicit DSA set and stop analysis if it so.
2808       if (DVar.RefExpr || !ImplicitDeclarations.insert(VD).second)
2809         return;
2810 
2811       // Skip internally declared static variables.
2812       llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
2813           OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
2814       if (VD->hasGlobalStorage() && CS && !CS->capturesVariable(VD) &&
2815           (Stack->hasRequiresDeclWithClause<OMPUnifiedSharedMemoryClause>() ||
2816            !Res || *Res != OMPDeclareTargetDeclAttr::MT_Link))
2817         return;
2818 
2819       SourceLocation ELoc = E->getExprLoc();
2820       OpenMPDirectiveKind DKind = Stack->getCurrentDirective();
2821       // The default(none) clause requires that each variable that is referenced
2822       // in the construct, and does not have a predetermined data-sharing
2823       // attribute, must have its data-sharing attribute explicitly determined
2824       // by being listed in a data-sharing attribute clause.
2825       if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none &&
2826           isImplicitOrExplicitTaskingRegion(DKind) &&
2827           VarsWithInheritedDSA.count(VD) == 0) {
2828         VarsWithInheritedDSA[VD] = E;
2829         return;
2830       }
2831 
2832       if (isOpenMPTargetExecutionDirective(DKind) &&
2833           !Stack->isLoopControlVariable(VD).first) {
2834         if (!Stack->checkMappableExprComponentListsForDecl(
2835                 VD, /*CurrentRegionOnly=*/true,
2836                 [](OMPClauseMappableExprCommon::MappableExprComponentListRef
2837                        StackComponents,
2838                    OpenMPClauseKind) {
2839                   // Variable is used if it has been marked as an array, array
2840                   // section or the variable iself.
2841                   return StackComponents.size() == 1 ||
2842                          std::all_of(
2843                              std::next(StackComponents.rbegin()),
2844                              StackComponents.rend(),
2845                              [](const OMPClauseMappableExprCommon::
2846                                     MappableComponent &MC) {
2847                                return MC.getAssociatedDeclaration() ==
2848                                           nullptr &&
2849                                       (isa<OMPArraySectionExpr>(
2850                                            MC.getAssociatedExpression()) ||
2851                                        isa<ArraySubscriptExpr>(
2852                                            MC.getAssociatedExpression()));
2853                              });
2854                 })) {
2855           bool IsFirstprivate = false;
2856           // By default lambdas are captured as firstprivates.
2857           if (const auto *RD =
2858                   VD->getType().getNonReferenceType()->getAsCXXRecordDecl())
2859             IsFirstprivate = RD->isLambda();
2860           IsFirstprivate =
2861               IsFirstprivate ||
2862               (VD->getType().getNonReferenceType()->isScalarType() &&
2863                Stack->getDefaultDMA() != DMA_tofrom_scalar && !Res);
2864           if (IsFirstprivate)
2865             ImplicitFirstprivate.emplace_back(E);
2866           else
2867             ImplicitMap.emplace_back(E);
2868           return;
2869         }
2870       }
2871 
2872       // OpenMP [2.9.3.6, Restrictions, p.2]
2873       //  A list item that appears in a reduction clause of the innermost
2874       //  enclosing worksharing or parallel construct may not be accessed in an
2875       //  explicit task.
2876       DVar = Stack->hasInnermostDSA(
2877           VD, [](OpenMPClauseKind C) { return C == OMPC_reduction; },
2878           [](OpenMPDirectiveKind K) {
2879             return isOpenMPParallelDirective(K) ||
2880                    isOpenMPWorksharingDirective(K) || isOpenMPTeamsDirective(K);
2881           },
2882           /*FromParent=*/true);
2883       if (isOpenMPTaskingDirective(DKind) && DVar.CKind == OMPC_reduction) {
2884         ErrorFound = true;
2885         SemaRef.Diag(ELoc, diag::err_omp_reduction_in_task);
2886         reportOriginalDsa(SemaRef, Stack, VD, DVar);
2887         return;
2888       }
2889 
2890       // Define implicit data-sharing attributes for task.
2891       DVar = Stack->getImplicitDSA(VD, /*FromParent=*/false);
2892       if (isOpenMPTaskingDirective(DKind) && DVar.CKind != OMPC_shared &&
2893           !Stack->isLoopControlVariable(VD).first) {
2894         ImplicitFirstprivate.push_back(E);
2895         return;
2896       }
2897 
2898       // Store implicitly used globals with declare target link for parent
2899       // target.
2900       if (!isOpenMPTargetExecutionDirective(DKind) && Res &&
2901           *Res == OMPDeclareTargetDeclAttr::MT_Link) {
2902         Stack->addToParentTargetRegionLinkGlobals(E);
2903         return;
2904       }
2905     }
2906   }
2907   void VisitMemberExpr(MemberExpr *E) {
2908     if (E->isTypeDependent() || E->isValueDependent() ||
2909         E->containsUnexpandedParameterPack() || E->isInstantiationDependent())
2910       return;
2911     auto *FD = dyn_cast<FieldDecl>(E->getMemberDecl());
2912     OpenMPDirectiveKind DKind = Stack->getCurrentDirective();
2913     if (auto *TE = dyn_cast<CXXThisExpr>(E->getBase()->IgnoreParens())) {
2914       if (!FD)
2915         return;
2916       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(FD, /*FromParent=*/false);
2917       // Check if the variable has explicit DSA set and stop analysis if it
2918       // so.
2919       if (DVar.RefExpr || !ImplicitDeclarations.insert(FD).second)
2920         return;
2921 
2922       if (isOpenMPTargetExecutionDirective(DKind) &&
2923           !Stack->isLoopControlVariable(FD).first &&
2924           !Stack->checkMappableExprComponentListsForDecl(
2925               FD, /*CurrentRegionOnly=*/true,
2926               [](OMPClauseMappableExprCommon::MappableExprComponentListRef
2927                      StackComponents,
2928                  OpenMPClauseKind) {
2929                 return isa<CXXThisExpr>(
2930                     cast<MemberExpr>(
2931                         StackComponents.back().getAssociatedExpression())
2932                         ->getBase()
2933                         ->IgnoreParens());
2934               })) {
2935         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C/C++, p.3]
2936         //  A bit-field cannot appear in a map clause.
2937         //
2938         if (FD->isBitField())
2939           return;
2940 
2941         // Check to see if the member expression is referencing a class that
2942         // has already been explicitly mapped
2943         if (Stack->isClassPreviouslyMapped(TE->getType()))
2944           return;
2945 
2946         ImplicitMap.emplace_back(E);
2947         return;
2948       }
2949 
2950       SourceLocation ELoc = E->getExprLoc();
2951       // OpenMP [2.9.3.6, Restrictions, p.2]
2952       //  A list item that appears in a reduction clause of the innermost
2953       //  enclosing worksharing or parallel construct may not be accessed in
2954       //  an  explicit task.
2955       DVar = Stack->hasInnermostDSA(
2956           FD, [](OpenMPClauseKind C) { return C == OMPC_reduction; },
2957           [](OpenMPDirectiveKind K) {
2958             return isOpenMPParallelDirective(K) ||
2959                    isOpenMPWorksharingDirective(K) || isOpenMPTeamsDirective(K);
2960           },
2961           /*FromParent=*/true);
2962       if (isOpenMPTaskingDirective(DKind) && DVar.CKind == OMPC_reduction) {
2963         ErrorFound = true;
2964         SemaRef.Diag(ELoc, diag::err_omp_reduction_in_task);
2965         reportOriginalDsa(SemaRef, Stack, FD, DVar);
2966         return;
2967       }
2968 
2969       // Define implicit data-sharing attributes for task.
2970       DVar = Stack->getImplicitDSA(FD, /*FromParent=*/false);
2971       if (isOpenMPTaskingDirective(DKind) && DVar.CKind != OMPC_shared &&
2972           !Stack->isLoopControlVariable(FD).first) {
2973         // Check if there is a captured expression for the current field in the
2974         // region. Do not mark it as firstprivate unless there is no captured
2975         // expression.
2976         // TODO: try to make it firstprivate.
2977         if (DVar.CKind != OMPC_unknown)
2978           ImplicitFirstprivate.push_back(E);
2979       }
2980       return;
2981     }
2982     if (isOpenMPTargetExecutionDirective(DKind)) {
2983       OMPClauseMappableExprCommon::MappableExprComponentList CurComponents;
2984       if (!checkMapClauseExpressionBase(SemaRef, E, CurComponents, OMPC_map,
2985                                         /*NoDiagnose=*/true))
2986         return;
2987       const auto *VD = cast<ValueDecl>(
2988           CurComponents.back().getAssociatedDeclaration()->getCanonicalDecl());
2989       if (!Stack->checkMappableExprComponentListsForDecl(
2990               VD, /*CurrentRegionOnly=*/true,
2991               [&CurComponents](
2992                   OMPClauseMappableExprCommon::MappableExprComponentListRef
2993                       StackComponents,
2994                   OpenMPClauseKind) {
2995                 auto CCI = CurComponents.rbegin();
2996                 auto CCE = CurComponents.rend();
2997                 for (const auto &SC : llvm::reverse(StackComponents)) {
2998                   // Do both expressions have the same kind?
2999                   if (CCI->getAssociatedExpression()->getStmtClass() !=
3000                       SC.getAssociatedExpression()->getStmtClass())
3001                     if (!(isa<OMPArraySectionExpr>(
3002                               SC.getAssociatedExpression()) &&
3003                           isa<ArraySubscriptExpr>(
3004                               CCI->getAssociatedExpression())))
3005                       return false;
3006 
3007                   const Decl *CCD = CCI->getAssociatedDeclaration();
3008                   const Decl *SCD = SC.getAssociatedDeclaration();
3009                   CCD = CCD ? CCD->getCanonicalDecl() : nullptr;
3010                   SCD = SCD ? SCD->getCanonicalDecl() : nullptr;
3011                   if (SCD != CCD)
3012                     return false;
3013                   std::advance(CCI, 1);
3014                   if (CCI == CCE)
3015                     break;
3016                 }
3017                 return true;
3018               })) {
3019         Visit(E->getBase());
3020       }
3021     } else {
3022       Visit(E->getBase());
3023     }
3024   }
3025   void VisitOMPExecutableDirective(OMPExecutableDirective *S) {
3026     for (OMPClause *C : S->clauses()) {
3027       // Skip analysis of arguments of implicitly defined firstprivate clause
3028       // for task|target directives.
3029       // Skip analysis of arguments of implicitly defined map clause for target
3030       // directives.
3031       if (C && !((isa<OMPFirstprivateClause>(C) || isa<OMPMapClause>(C)) &&
3032                  C->isImplicit())) {
3033         for (Stmt *CC : C->children()) {
3034           if (CC)
3035             Visit(CC);
3036         }
3037       }
3038     }
3039     // Check implicitly captured variables.
3040     VisitSubCaptures(S);
3041   }
3042   void VisitStmt(Stmt *S) {
3043     for (Stmt *C : S->children()) {
3044       if (C) {
3045         // Check implicitly captured variables in the task-based directives to
3046         // check if they must be firstprivatized.
3047         Visit(C);
3048       }
3049     }
3050   }
3051 
3052   void visitSubCaptures(CapturedStmt *S) {
3053     for (const CapturedStmt::Capture &Cap : S->captures()) {
3054       if (!Cap.capturesVariable() && !Cap.capturesVariableByCopy())
3055         continue;
3056       VarDecl *VD = Cap.getCapturedVar();
3057       // Do not try to map the variable if it or its sub-component was mapped
3058       // already.
3059       if (isOpenMPTargetExecutionDirective(Stack->getCurrentDirective()) &&
3060           Stack->checkMappableExprComponentListsForDecl(
3061               VD, /*CurrentRegionOnly=*/true,
3062               [](OMPClauseMappableExprCommon::MappableExprComponentListRef,
3063                  OpenMPClauseKind) { return true; }))
3064         continue;
3065       DeclRefExpr *DRE = buildDeclRefExpr(
3066           SemaRef, VD, VD->getType().getNonLValueExprType(SemaRef.Context),
3067           Cap.getLocation(), /*RefersToCapture=*/true);
3068       Visit(DRE);
3069     }
3070   }
3071   bool isErrorFound() const { return ErrorFound; }
3072   ArrayRef<Expr *> getImplicitFirstprivate() const {
3073     return ImplicitFirstprivate;
3074   }
3075   ArrayRef<Expr *> getImplicitMap() const { return ImplicitMap; }
3076   const Sema::VarsWithInheritedDSAType &getVarsWithInheritedDSA() const {
3077     return VarsWithInheritedDSA;
3078   }
3079 
3080   DSAAttrChecker(DSAStackTy *S, Sema &SemaRef, CapturedStmt *CS)
3081       : Stack(S), SemaRef(SemaRef), ErrorFound(false), CS(CS) {
3082     // Process declare target link variables for the target directives.
3083     if (isOpenMPTargetExecutionDirective(S->getCurrentDirective())) {
3084       for (DeclRefExpr *E : Stack->getLinkGlobals())
3085         Visit(E);
3086     }
3087   }
3088 };
3089 } // namespace
3090 
3091 void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) {
3092   switch (DKind) {
3093   case OMPD_parallel:
3094   case OMPD_parallel_for:
3095   case OMPD_parallel_for_simd:
3096   case OMPD_parallel_sections:
3097   case OMPD_teams:
3098   case OMPD_teams_distribute:
3099   case OMPD_teams_distribute_simd: {
3100     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3101     QualType KmpInt32PtrTy =
3102         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3103     Sema::CapturedParamNameType Params[] = {
3104         std::make_pair(".global_tid.", KmpInt32PtrTy),
3105         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3106         std::make_pair(StringRef(), QualType()) // __context with shared vars
3107     };
3108     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3109                              Params);
3110     break;
3111   }
3112   case OMPD_target_teams:
3113   case OMPD_target_parallel:
3114   case OMPD_target_parallel_for:
3115   case OMPD_target_parallel_for_simd:
3116   case OMPD_target_teams_distribute:
3117   case OMPD_target_teams_distribute_simd: {
3118     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3119     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3120     QualType KmpInt32PtrTy =
3121         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3122     QualType Args[] = {VoidPtrTy};
3123     FunctionProtoType::ExtProtoInfo EPI;
3124     EPI.Variadic = true;
3125     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3126     Sema::CapturedParamNameType Params[] = {
3127         std::make_pair(".global_tid.", KmpInt32Ty),
3128         std::make_pair(".part_id.", KmpInt32PtrTy),
3129         std::make_pair(".privates.", VoidPtrTy),
3130         std::make_pair(
3131             ".copy_fn.",
3132             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3133         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3134         std::make_pair(StringRef(), QualType()) // __context with shared vars
3135     };
3136     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3137                              Params, /*OpenMPCaptureLevel=*/0);
3138     // Mark this captured region as inlined, because we don't use outlined
3139     // function directly.
3140     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3141         AlwaysInlineAttr::CreateImplicit(
3142             Context, {}, AttributeCommonInfo::AS_Keyword,
3143             AlwaysInlineAttr::Keyword_forceinline));
3144     Sema::CapturedParamNameType ParamsTarget[] = {
3145         std::make_pair(StringRef(), QualType()) // __context with shared vars
3146     };
3147     // Start a captured region for 'target' with no implicit parameters.
3148     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3149                              ParamsTarget, /*OpenMPCaptureLevel=*/1);
3150     Sema::CapturedParamNameType ParamsTeamsOrParallel[] = {
3151         std::make_pair(".global_tid.", KmpInt32PtrTy),
3152         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3153         std::make_pair(StringRef(), QualType()) // __context with shared vars
3154     };
3155     // Start a captured region for 'teams' or 'parallel'.  Both regions have
3156     // the same implicit parameters.
3157     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3158                              ParamsTeamsOrParallel, /*OpenMPCaptureLevel=*/2);
3159     break;
3160   }
3161   case OMPD_target:
3162   case OMPD_target_simd: {
3163     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3164     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3165     QualType KmpInt32PtrTy =
3166         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3167     QualType Args[] = {VoidPtrTy};
3168     FunctionProtoType::ExtProtoInfo EPI;
3169     EPI.Variadic = true;
3170     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3171     Sema::CapturedParamNameType Params[] = {
3172         std::make_pair(".global_tid.", KmpInt32Ty),
3173         std::make_pair(".part_id.", KmpInt32PtrTy),
3174         std::make_pair(".privates.", VoidPtrTy),
3175         std::make_pair(
3176             ".copy_fn.",
3177             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3178         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3179         std::make_pair(StringRef(), QualType()) // __context with shared vars
3180     };
3181     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3182                              Params, /*OpenMPCaptureLevel=*/0);
3183     // Mark this captured region as inlined, because we don't use outlined
3184     // function directly.
3185     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3186         AlwaysInlineAttr::CreateImplicit(
3187             Context, {}, AttributeCommonInfo::AS_Keyword,
3188             AlwaysInlineAttr::Keyword_forceinline));
3189     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3190                              std::make_pair(StringRef(), QualType()),
3191                              /*OpenMPCaptureLevel=*/1);
3192     break;
3193   }
3194   case OMPD_simd:
3195   case OMPD_for:
3196   case OMPD_for_simd:
3197   case OMPD_sections:
3198   case OMPD_section:
3199   case OMPD_single:
3200   case OMPD_master:
3201   case OMPD_critical:
3202   case OMPD_taskgroup:
3203   case OMPD_distribute:
3204   case OMPD_distribute_simd:
3205   case OMPD_ordered:
3206   case OMPD_atomic:
3207   case OMPD_target_data: {
3208     Sema::CapturedParamNameType Params[] = {
3209         std::make_pair(StringRef(), QualType()) // __context with shared vars
3210     };
3211     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3212                              Params);
3213     break;
3214   }
3215   case OMPD_task: {
3216     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3217     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3218     QualType KmpInt32PtrTy =
3219         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3220     QualType Args[] = {VoidPtrTy};
3221     FunctionProtoType::ExtProtoInfo EPI;
3222     EPI.Variadic = true;
3223     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3224     Sema::CapturedParamNameType Params[] = {
3225         std::make_pair(".global_tid.", KmpInt32Ty),
3226         std::make_pair(".part_id.", KmpInt32PtrTy),
3227         std::make_pair(".privates.", VoidPtrTy),
3228         std::make_pair(
3229             ".copy_fn.",
3230             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3231         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3232         std::make_pair(StringRef(), QualType()) // __context with shared vars
3233     };
3234     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3235                              Params);
3236     // Mark this captured region as inlined, because we don't use outlined
3237     // function directly.
3238     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3239         AlwaysInlineAttr::CreateImplicit(
3240             Context, {}, AttributeCommonInfo::AS_Keyword,
3241             AlwaysInlineAttr::Keyword_forceinline));
3242     break;
3243   }
3244   case OMPD_taskloop:
3245   case OMPD_taskloop_simd:
3246   case OMPD_master_taskloop:
3247   case OMPD_master_taskloop_simd: {
3248     QualType KmpInt32Ty =
3249         Context.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/1)
3250             .withConst();
3251     QualType KmpUInt64Ty =
3252         Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/0)
3253             .withConst();
3254     QualType KmpInt64Ty =
3255         Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/1)
3256             .withConst();
3257     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3258     QualType KmpInt32PtrTy =
3259         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3260     QualType Args[] = {VoidPtrTy};
3261     FunctionProtoType::ExtProtoInfo EPI;
3262     EPI.Variadic = true;
3263     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3264     Sema::CapturedParamNameType Params[] = {
3265         std::make_pair(".global_tid.", KmpInt32Ty),
3266         std::make_pair(".part_id.", KmpInt32PtrTy),
3267         std::make_pair(".privates.", VoidPtrTy),
3268         std::make_pair(
3269             ".copy_fn.",
3270             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3271         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3272         std::make_pair(".lb.", KmpUInt64Ty),
3273         std::make_pair(".ub.", KmpUInt64Ty),
3274         std::make_pair(".st.", KmpInt64Ty),
3275         std::make_pair(".liter.", KmpInt32Ty),
3276         std::make_pair(".reductions.", VoidPtrTy),
3277         std::make_pair(StringRef(), QualType()) // __context with shared vars
3278     };
3279     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3280                              Params);
3281     // Mark this captured region as inlined, because we don't use outlined
3282     // function directly.
3283     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3284         AlwaysInlineAttr::CreateImplicit(
3285             Context, {}, AttributeCommonInfo::AS_Keyword,
3286             AlwaysInlineAttr::Keyword_forceinline));
3287     break;
3288   }
3289   case OMPD_parallel_master_taskloop: {
3290     QualType KmpInt32Ty =
3291         Context.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/1)
3292             .withConst();
3293     QualType KmpUInt64Ty =
3294         Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/0)
3295             .withConst();
3296     QualType KmpInt64Ty =
3297         Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/1)
3298             .withConst();
3299     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3300     QualType KmpInt32PtrTy =
3301         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3302     Sema::CapturedParamNameType ParamsParallel[] = {
3303         std::make_pair(".global_tid.", KmpInt32PtrTy),
3304         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3305         std::make_pair(StringRef(), QualType()) // __context with shared vars
3306     };
3307     // Start a captured region for 'parallel'.
3308     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3309                              ParamsParallel, /*OpenMPCaptureLevel=*/1);
3310     QualType Args[] = {VoidPtrTy};
3311     FunctionProtoType::ExtProtoInfo EPI;
3312     EPI.Variadic = true;
3313     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3314     Sema::CapturedParamNameType Params[] = {
3315         std::make_pair(".global_tid.", KmpInt32Ty),
3316         std::make_pair(".part_id.", KmpInt32PtrTy),
3317         std::make_pair(".privates.", VoidPtrTy),
3318         std::make_pair(
3319             ".copy_fn.",
3320             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3321         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3322         std::make_pair(".lb.", KmpUInt64Ty),
3323         std::make_pair(".ub.", KmpUInt64Ty),
3324         std::make_pair(".st.", KmpInt64Ty),
3325         std::make_pair(".liter.", KmpInt32Ty),
3326         std::make_pair(".reductions.", VoidPtrTy),
3327         std::make_pair(StringRef(), QualType()) // __context with shared vars
3328     };
3329     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3330                              Params, /*OpenMPCaptureLevel=*/2);
3331     // Mark this captured region as inlined, because we don't use outlined
3332     // function directly.
3333     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3334         AlwaysInlineAttr::CreateImplicit(
3335             Context, {}, AttributeCommonInfo::AS_Keyword,
3336             AlwaysInlineAttr::Keyword_forceinline));
3337     break;
3338   }
3339   case OMPD_distribute_parallel_for_simd:
3340   case OMPD_distribute_parallel_for: {
3341     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3342     QualType KmpInt32PtrTy =
3343         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3344     Sema::CapturedParamNameType Params[] = {
3345         std::make_pair(".global_tid.", KmpInt32PtrTy),
3346         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3347         std::make_pair(".previous.lb.", Context.getSizeType().withConst()),
3348         std::make_pair(".previous.ub.", Context.getSizeType().withConst()),
3349         std::make_pair(StringRef(), QualType()) // __context with shared vars
3350     };
3351     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3352                              Params);
3353     break;
3354   }
3355   case OMPD_target_teams_distribute_parallel_for:
3356   case OMPD_target_teams_distribute_parallel_for_simd: {
3357     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3358     QualType KmpInt32PtrTy =
3359         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3360     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3361 
3362     QualType Args[] = {VoidPtrTy};
3363     FunctionProtoType::ExtProtoInfo EPI;
3364     EPI.Variadic = true;
3365     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3366     Sema::CapturedParamNameType Params[] = {
3367         std::make_pair(".global_tid.", KmpInt32Ty),
3368         std::make_pair(".part_id.", KmpInt32PtrTy),
3369         std::make_pair(".privates.", VoidPtrTy),
3370         std::make_pair(
3371             ".copy_fn.",
3372             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3373         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3374         std::make_pair(StringRef(), QualType()) // __context with shared vars
3375     };
3376     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3377                              Params, /*OpenMPCaptureLevel=*/0);
3378     // Mark this captured region as inlined, because we don't use outlined
3379     // function directly.
3380     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3381         AlwaysInlineAttr::CreateImplicit(
3382             Context, {}, AttributeCommonInfo::AS_Keyword,
3383             AlwaysInlineAttr::Keyword_forceinline));
3384     Sema::CapturedParamNameType ParamsTarget[] = {
3385         std::make_pair(StringRef(), QualType()) // __context with shared vars
3386     };
3387     // Start a captured region for 'target' with no implicit parameters.
3388     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3389                              ParamsTarget, /*OpenMPCaptureLevel=*/1);
3390 
3391     Sema::CapturedParamNameType ParamsTeams[] = {
3392         std::make_pair(".global_tid.", KmpInt32PtrTy),
3393         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3394         std::make_pair(StringRef(), QualType()) // __context with shared vars
3395     };
3396     // Start a captured region for 'target' with no implicit parameters.
3397     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3398                              ParamsTeams, /*OpenMPCaptureLevel=*/2);
3399 
3400     Sema::CapturedParamNameType ParamsParallel[] = {
3401         std::make_pair(".global_tid.", KmpInt32PtrTy),
3402         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3403         std::make_pair(".previous.lb.", Context.getSizeType().withConst()),
3404         std::make_pair(".previous.ub.", Context.getSizeType().withConst()),
3405         std::make_pair(StringRef(), QualType()) // __context with shared vars
3406     };
3407     // Start a captured region for 'teams' or 'parallel'.  Both regions have
3408     // the same implicit parameters.
3409     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3410                              ParamsParallel, /*OpenMPCaptureLevel=*/3);
3411     break;
3412   }
3413 
3414   case OMPD_teams_distribute_parallel_for:
3415   case OMPD_teams_distribute_parallel_for_simd: {
3416     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3417     QualType KmpInt32PtrTy =
3418         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3419 
3420     Sema::CapturedParamNameType ParamsTeams[] = {
3421         std::make_pair(".global_tid.", KmpInt32PtrTy),
3422         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3423         std::make_pair(StringRef(), QualType()) // __context with shared vars
3424     };
3425     // Start a captured region for 'target' with no implicit parameters.
3426     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3427                              ParamsTeams, /*OpenMPCaptureLevel=*/0);
3428 
3429     Sema::CapturedParamNameType ParamsParallel[] = {
3430         std::make_pair(".global_tid.", KmpInt32PtrTy),
3431         std::make_pair(".bound_tid.", KmpInt32PtrTy),
3432         std::make_pair(".previous.lb.", Context.getSizeType().withConst()),
3433         std::make_pair(".previous.ub.", Context.getSizeType().withConst()),
3434         std::make_pair(StringRef(), QualType()) // __context with shared vars
3435     };
3436     // Start a captured region for 'teams' or 'parallel'.  Both regions have
3437     // the same implicit parameters.
3438     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3439                              ParamsParallel, /*OpenMPCaptureLevel=*/1);
3440     break;
3441   }
3442   case OMPD_target_update:
3443   case OMPD_target_enter_data:
3444   case OMPD_target_exit_data: {
3445     QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1).withConst();
3446     QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
3447     QualType KmpInt32PtrTy =
3448         Context.getPointerType(KmpInt32Ty).withConst().withRestrict();
3449     QualType Args[] = {VoidPtrTy};
3450     FunctionProtoType::ExtProtoInfo EPI;
3451     EPI.Variadic = true;
3452     QualType CopyFnType = Context.getFunctionType(Context.VoidTy, Args, EPI);
3453     Sema::CapturedParamNameType Params[] = {
3454         std::make_pair(".global_tid.", KmpInt32Ty),
3455         std::make_pair(".part_id.", KmpInt32PtrTy),
3456         std::make_pair(".privates.", VoidPtrTy),
3457         std::make_pair(
3458             ".copy_fn.",
3459             Context.getPointerType(CopyFnType).withConst().withRestrict()),
3460         std::make_pair(".task_t.", Context.VoidPtrTy.withConst()),
3461         std::make_pair(StringRef(), QualType()) // __context with shared vars
3462     };
3463     ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP,
3464                              Params);
3465     // Mark this captured region as inlined, because we don't use outlined
3466     // function directly.
3467     getCurCapturedRegion()->TheCapturedDecl->addAttr(
3468         AlwaysInlineAttr::CreateImplicit(
3469             Context, {}, AttributeCommonInfo::AS_Keyword,
3470             AlwaysInlineAttr::Keyword_forceinline));
3471     break;
3472   }
3473   case OMPD_threadprivate:
3474   case OMPD_allocate:
3475   case OMPD_taskyield:
3476   case OMPD_barrier:
3477   case OMPD_taskwait:
3478   case OMPD_cancellation_point:
3479   case OMPD_cancel:
3480   case OMPD_flush:
3481   case OMPD_declare_reduction:
3482   case OMPD_declare_mapper:
3483   case OMPD_declare_simd:
3484   case OMPD_declare_target:
3485   case OMPD_end_declare_target:
3486   case OMPD_requires:
3487   case OMPD_declare_variant:
3488     llvm_unreachable("OpenMP Directive is not allowed");
3489   case OMPD_unknown:
3490     llvm_unreachable("Unknown OpenMP directive");
3491   }
3492 }
3493 
3494 int Sema::getNumberOfConstructScopes(unsigned Level) const {
3495   return getOpenMPCaptureLevels(DSAStack->getDirective(Level));
3496 }
3497 
3498 int Sema::getOpenMPCaptureLevels(OpenMPDirectiveKind DKind) {
3499   SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
3500   getOpenMPCaptureRegions(CaptureRegions, DKind);
3501   return CaptureRegions.size();
3502 }
3503 
3504 static OMPCapturedExprDecl *buildCaptureDecl(Sema &S, IdentifierInfo *Id,
3505                                              Expr *CaptureExpr, bool WithInit,
3506                                              bool AsExpression) {
3507   assert(CaptureExpr);
3508   ASTContext &C = S.getASTContext();
3509   Expr *Init = AsExpression ? CaptureExpr : CaptureExpr->IgnoreImpCasts();
3510   QualType Ty = Init->getType();
3511   if (CaptureExpr->getObjectKind() == OK_Ordinary && CaptureExpr->isGLValue()) {
3512     if (S.getLangOpts().CPlusPlus) {
3513       Ty = C.getLValueReferenceType(Ty);
3514     } else {
3515       Ty = C.getPointerType(Ty);
3516       ExprResult Res =
3517           S.CreateBuiltinUnaryOp(CaptureExpr->getExprLoc(), UO_AddrOf, Init);
3518       if (!Res.isUsable())
3519         return nullptr;
3520       Init = Res.get();
3521     }
3522     WithInit = true;
3523   }
3524   auto *CED = OMPCapturedExprDecl::Create(C, S.CurContext, Id, Ty,
3525                                           CaptureExpr->getBeginLoc());
3526   if (!WithInit)
3527     CED->addAttr(OMPCaptureNoInitAttr::CreateImplicit(C));
3528   S.CurContext->addHiddenDecl(CED);
3529   S.AddInitializerToDecl(CED, Init, /*DirectInit=*/false);
3530   return CED;
3531 }
3532 
3533 static DeclRefExpr *buildCapture(Sema &S, ValueDecl *D, Expr *CaptureExpr,
3534                                  bool WithInit) {
3535   OMPCapturedExprDecl *CD;
3536   if (VarDecl *VD = S.isOpenMPCapturedDecl(D))
3537     CD = cast<OMPCapturedExprDecl>(VD);
3538   else
3539     CD = buildCaptureDecl(S, D->getIdentifier(), CaptureExpr, WithInit,
3540                           /*AsExpression=*/false);
3541   return buildDeclRefExpr(S, CD, CD->getType().getNonReferenceType(),
3542                           CaptureExpr->getExprLoc());
3543 }
3544 
3545 static ExprResult buildCapture(Sema &S, Expr *CaptureExpr, DeclRefExpr *&Ref) {
3546   CaptureExpr = S.DefaultLvalueConversion(CaptureExpr).get();
3547   if (!Ref) {
3548     OMPCapturedExprDecl *CD = buildCaptureDecl(
3549         S, &S.getASTContext().Idents.get(".capture_expr."), CaptureExpr,
3550         /*WithInit=*/true, /*AsExpression=*/true);
3551     Ref = buildDeclRefExpr(S, CD, CD->getType().getNonReferenceType(),
3552                            CaptureExpr->getExprLoc());
3553   }
3554   ExprResult Res = Ref;
3555   if (!S.getLangOpts().CPlusPlus &&
3556       CaptureExpr->getObjectKind() == OK_Ordinary && CaptureExpr->isGLValue() &&
3557       Ref->getType()->isPointerType()) {
3558     Res = S.CreateBuiltinUnaryOp(CaptureExpr->getExprLoc(), UO_Deref, Ref);
3559     if (!Res.isUsable())
3560       return ExprError();
3561   }
3562   return S.DefaultLvalueConversion(Res.get());
3563 }
3564 
3565 namespace {
3566 // OpenMP directives parsed in this section are represented as a
3567 // CapturedStatement with an associated statement.  If a syntax error
3568 // is detected during the parsing of the associated statement, the
3569 // compiler must abort processing and close the CapturedStatement.
3570 //
3571 // Combined directives such as 'target parallel' have more than one
3572 // nested CapturedStatements.  This RAII ensures that we unwind out
3573 // of all the nested CapturedStatements when an error is found.
3574 class CaptureRegionUnwinderRAII {
3575 private:
3576   Sema &S;
3577   bool &ErrorFound;
3578   OpenMPDirectiveKind DKind = OMPD_unknown;
3579 
3580 public:
3581   CaptureRegionUnwinderRAII(Sema &S, bool &ErrorFound,
3582                             OpenMPDirectiveKind DKind)
3583       : S(S), ErrorFound(ErrorFound), DKind(DKind) {}
3584   ~CaptureRegionUnwinderRAII() {
3585     if (ErrorFound) {
3586       int ThisCaptureLevel = S.getOpenMPCaptureLevels(DKind);
3587       while (--ThisCaptureLevel >= 0)
3588         S.ActOnCapturedRegionError();
3589     }
3590   }
3591 };
3592 } // namespace
3593 
3594 void Sema::tryCaptureOpenMPLambdas(ValueDecl *V) {
3595   // Capture variables captured by reference in lambdas for target-based
3596   // directives.
3597   if (!CurContext->isDependentContext() &&
3598       (isOpenMPTargetExecutionDirective(DSAStack->getCurrentDirective()) ||
3599        isOpenMPTargetDataManagementDirective(
3600            DSAStack->getCurrentDirective()))) {
3601     QualType Type = V->getType();
3602     if (const auto *RD = Type.getCanonicalType()
3603                              .getNonReferenceType()
3604                              ->getAsCXXRecordDecl()) {
3605       bool SavedForceCaptureByReferenceInTargetExecutable =
3606           DSAStack->isForceCaptureByReferenceInTargetExecutable();
3607       DSAStack->setForceCaptureByReferenceInTargetExecutable(
3608           /*V=*/true);
3609       if (RD->isLambda()) {
3610         llvm::DenseMap<const VarDecl *, FieldDecl *> Captures;
3611         FieldDecl *ThisCapture;
3612         RD->getCaptureFields(Captures, ThisCapture);
3613         for (const LambdaCapture &LC : RD->captures()) {
3614           if (LC.getCaptureKind() == LCK_ByRef) {
3615             VarDecl *VD = LC.getCapturedVar();
3616             DeclContext *VDC = VD->getDeclContext();
3617             if (!VDC->Encloses(CurContext))
3618               continue;
3619             MarkVariableReferenced(LC.getLocation(), VD);
3620           } else if (LC.getCaptureKind() == LCK_This) {
3621             QualType ThisTy = getCurrentThisType();
3622             if (!ThisTy.isNull() &&
3623                 Context.typesAreCompatible(ThisTy, ThisCapture->getType()))
3624               CheckCXXThisCapture(LC.getLocation());
3625           }
3626         }
3627       }
3628       DSAStack->setForceCaptureByReferenceInTargetExecutable(
3629           SavedForceCaptureByReferenceInTargetExecutable);
3630     }
3631   }
3632 }
3633 
3634 StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
3635                                       ArrayRef<OMPClause *> Clauses) {
3636   bool ErrorFound = false;
3637   CaptureRegionUnwinderRAII CaptureRegionUnwinder(
3638       *this, ErrorFound, DSAStack->getCurrentDirective());
3639   if (!S.isUsable()) {
3640     ErrorFound = true;
3641     return StmtError();
3642   }
3643 
3644   SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
3645   getOpenMPCaptureRegions(CaptureRegions, DSAStack->getCurrentDirective());
3646   OMPOrderedClause *OC = nullptr;
3647   OMPScheduleClause *SC = nullptr;
3648   SmallVector<const OMPLinearClause *, 4> LCs;
3649   SmallVector<const OMPClauseWithPreInit *, 4> PICs;
3650   // This is required for proper codegen.
3651   for (OMPClause *Clause : Clauses) {
3652     if (isOpenMPTaskingDirective(DSAStack->getCurrentDirective()) &&
3653         Clause->getClauseKind() == OMPC_in_reduction) {
3654       // Capture taskgroup task_reduction descriptors inside the tasking regions
3655       // with the corresponding in_reduction items.
3656       auto *IRC = cast<OMPInReductionClause>(Clause);
3657       for (Expr *E : IRC->taskgroup_descriptors())
3658         if (E)
3659           MarkDeclarationsReferencedInExpr(E);
3660     }
3661     if (isOpenMPPrivate(Clause->getClauseKind()) ||
3662         Clause->getClauseKind() == OMPC_copyprivate ||
3663         (getLangOpts().OpenMPUseTLS &&
3664          getASTContext().getTargetInfo().isTLSSupported() &&
3665          Clause->getClauseKind() == OMPC_copyin)) {
3666       DSAStack->setForceVarCapturing(Clause->getClauseKind() == OMPC_copyin);
3667       // Mark all variables in private list clauses as used in inner region.
3668       for (Stmt *VarRef : Clause->children()) {
3669         if (auto *E = cast_or_null<Expr>(VarRef)) {
3670           MarkDeclarationsReferencedInExpr(E);
3671         }
3672       }
3673       DSAStack->setForceVarCapturing(/*V=*/false);
3674     } else if (CaptureRegions.size() > 1 ||
3675                CaptureRegions.back() != OMPD_unknown) {
3676       if (auto *C = OMPClauseWithPreInit::get(Clause))
3677         PICs.push_back(C);
3678       if (auto *C = OMPClauseWithPostUpdate::get(Clause)) {
3679         if (Expr *E = C->getPostUpdateExpr())
3680           MarkDeclarationsReferencedInExpr(E);
3681       }
3682     }
3683     if (Clause->getClauseKind() == OMPC_schedule)
3684       SC = cast<OMPScheduleClause>(Clause);
3685     else if (Clause->getClauseKind() == OMPC_ordered)
3686       OC = cast<OMPOrderedClause>(Clause);
3687     else if (Clause->getClauseKind() == OMPC_linear)
3688       LCs.push_back(cast<OMPLinearClause>(Clause));
3689   }
3690   // OpenMP, 2.7.1 Loop Construct, Restrictions
3691   // The nonmonotonic modifier cannot be specified if an ordered clause is
3692   // specified.
3693   if (SC &&
3694       (SC->getFirstScheduleModifier() == OMPC_SCHEDULE_MODIFIER_nonmonotonic ||
3695        SC->getSecondScheduleModifier() ==
3696            OMPC_SCHEDULE_MODIFIER_nonmonotonic) &&
3697       OC) {
3698     Diag(SC->getFirstScheduleModifier() == OMPC_SCHEDULE_MODIFIER_nonmonotonic
3699              ? SC->getFirstScheduleModifierLoc()
3700              : SC->getSecondScheduleModifierLoc(),
3701          diag::err_omp_schedule_nonmonotonic_ordered)
3702         << SourceRange(OC->getBeginLoc(), OC->getEndLoc());
3703     ErrorFound = true;
3704   }
3705   if (!LCs.empty() && OC && OC->getNumForLoops()) {
3706     for (const OMPLinearClause *C : LCs) {
3707       Diag(C->getBeginLoc(), diag::err_omp_linear_ordered)
3708           << SourceRange(OC->getBeginLoc(), OC->getEndLoc());
3709     }
3710     ErrorFound = true;
3711   }
3712   if (isOpenMPWorksharingDirective(DSAStack->getCurrentDirective()) &&
3713       isOpenMPSimdDirective(DSAStack->getCurrentDirective()) && OC &&
3714       OC->getNumForLoops()) {
3715     Diag(OC->getBeginLoc(), diag::err_omp_ordered_simd)
3716         << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
3717     ErrorFound = true;
3718   }
3719   if (ErrorFound) {
3720     return StmtError();
3721   }
3722   StmtResult SR = S;
3723   unsigned CompletedRegions = 0;
3724   for (OpenMPDirectiveKind ThisCaptureRegion : llvm::reverse(CaptureRegions)) {
3725     // Mark all variables in private list clauses as used in inner region.
3726     // Required for proper codegen of combined directives.
3727     // TODO: add processing for other clauses.
3728     if (ThisCaptureRegion != OMPD_unknown) {
3729       for (const clang::OMPClauseWithPreInit *C : PICs) {
3730         OpenMPDirectiveKind CaptureRegion = C->getCaptureRegion();
3731         // Find the particular capture region for the clause if the
3732         // directive is a combined one with multiple capture regions.
3733         // If the directive is not a combined one, the capture region
3734         // associated with the clause is OMPD_unknown and is generated
3735         // only once.
3736         if (CaptureRegion == ThisCaptureRegion ||
3737             CaptureRegion == OMPD_unknown) {
3738           if (auto *DS = cast_or_null<DeclStmt>(C->getPreInitStmt())) {
3739             for (Decl *D : DS->decls())
3740               MarkVariableReferenced(D->getLocation(), cast<VarDecl>(D));
3741           }
3742         }
3743       }
3744     }
3745     if (++CompletedRegions == CaptureRegions.size())
3746       DSAStack->setBodyComplete();
3747     SR = ActOnCapturedRegionEnd(SR.get());
3748   }
3749   return SR;
3750 }
3751 
3752 static bool checkCancelRegion(Sema &SemaRef, OpenMPDirectiveKind CurrentRegion,
3753                               OpenMPDirectiveKind CancelRegion,
3754                               SourceLocation StartLoc) {
3755   // CancelRegion is only needed for cancel and cancellation_point.
3756   if (CurrentRegion != OMPD_cancel && CurrentRegion != OMPD_cancellation_point)
3757     return false;
3758 
3759   if (CancelRegion == OMPD_parallel || CancelRegion == OMPD_for ||
3760       CancelRegion == OMPD_sections || CancelRegion == OMPD_taskgroup)
3761     return false;
3762 
3763   SemaRef.Diag(StartLoc, diag::err_omp_wrong_cancel_region)
3764       << getOpenMPDirectiveName(CancelRegion);
3765   return true;
3766 }
3767 
3768 static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack,
3769                                   OpenMPDirectiveKind CurrentRegion,
3770                                   const DeclarationNameInfo &CurrentName,
3771                                   OpenMPDirectiveKind CancelRegion,
3772                                   SourceLocation StartLoc) {
3773   if (Stack->getCurScope()) {
3774     OpenMPDirectiveKind ParentRegion = Stack->getParentDirective();
3775     OpenMPDirectiveKind OffendingRegion = ParentRegion;
3776     bool NestingProhibited = false;
3777     bool CloseNesting = true;
3778     bool OrphanSeen = false;
3779     enum {
3780       NoRecommend,
3781       ShouldBeInParallelRegion,
3782       ShouldBeInOrderedRegion,
3783       ShouldBeInTargetRegion,
3784       ShouldBeInTeamsRegion
3785     } Recommend = NoRecommend;
3786     if (isOpenMPSimdDirective(ParentRegion) && CurrentRegion != OMPD_ordered) {
3787       // OpenMP [2.16, Nesting of Regions]
3788       // OpenMP constructs may not be nested inside a simd region.
3789       // OpenMP [2.8.1,simd Construct, Restrictions]
3790       // An ordered construct with the simd clause is the only OpenMP
3791       // construct that can appear in the simd region.
3792       // Allowing a SIMD construct nested in another SIMD construct is an
3793       // extension. The OpenMP 4.5 spec does not allow it. Issue a warning
3794       // message.
3795       SemaRef.Diag(StartLoc, (CurrentRegion != OMPD_simd)
3796                                  ? diag::err_omp_prohibited_region_simd
3797                                  : diag::warn_omp_nesting_simd);
3798       return CurrentRegion != OMPD_simd;
3799     }
3800     if (ParentRegion == OMPD_atomic) {
3801       // OpenMP [2.16, Nesting of Regions]
3802       // OpenMP constructs may not be nested inside an atomic region.
3803       SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_atomic);
3804       return true;
3805     }
3806     if (CurrentRegion == OMPD_section) {
3807       // OpenMP [2.7.2, sections Construct, Restrictions]
3808       // Orphaned section directives are prohibited. That is, the section
3809       // directives must appear within the sections construct and must not be
3810       // encountered elsewhere in the sections region.
3811       if (ParentRegion != OMPD_sections &&
3812           ParentRegion != OMPD_parallel_sections) {
3813         SemaRef.Diag(StartLoc, diag::err_omp_orphaned_section_directive)
3814             << (ParentRegion != OMPD_unknown)
3815             << getOpenMPDirectiveName(ParentRegion);
3816         return true;
3817       }
3818       return false;
3819     }
3820     // Allow some constructs (except teams and cancellation constructs) to be
3821     // orphaned (they could be used in functions, called from OpenMP regions
3822     // with the required preconditions).
3823     if (ParentRegion == OMPD_unknown &&
3824         !isOpenMPNestingTeamsDirective(CurrentRegion) &&
3825         CurrentRegion != OMPD_cancellation_point &&
3826         CurrentRegion != OMPD_cancel)
3827       return false;
3828     if (CurrentRegion == OMPD_cancellation_point ||
3829         CurrentRegion == OMPD_cancel) {
3830       // OpenMP [2.16, Nesting of Regions]
3831       // A cancellation point construct for which construct-type-clause is
3832       // taskgroup must be nested inside a task construct. A cancellation
3833       // point construct for which construct-type-clause is not taskgroup must
3834       // be closely nested inside an OpenMP construct that matches the type
3835       // specified in construct-type-clause.
3836       // A cancel construct for which construct-type-clause is taskgroup must be
3837       // nested inside a task construct. A cancel construct for which
3838       // construct-type-clause is not taskgroup must be closely nested inside an
3839       // OpenMP construct that matches the type specified in
3840       // construct-type-clause.
3841       NestingProhibited =
3842           !((CancelRegion == OMPD_parallel &&
3843              (ParentRegion == OMPD_parallel ||
3844               ParentRegion == OMPD_target_parallel)) ||
3845             (CancelRegion == OMPD_for &&
3846              (ParentRegion == OMPD_for || ParentRegion == OMPD_parallel_for ||
3847               ParentRegion == OMPD_target_parallel_for ||
3848               ParentRegion == OMPD_distribute_parallel_for ||
3849               ParentRegion == OMPD_teams_distribute_parallel_for ||
3850               ParentRegion == OMPD_target_teams_distribute_parallel_for)) ||
3851             (CancelRegion == OMPD_taskgroup && ParentRegion == OMPD_task) ||
3852             (CancelRegion == OMPD_sections &&
3853              (ParentRegion == OMPD_section || ParentRegion == OMPD_sections ||
3854               ParentRegion == OMPD_parallel_sections)));
3855       OrphanSeen = ParentRegion == OMPD_unknown;
3856     } else if (CurrentRegion == OMPD_master) {
3857       // OpenMP [2.16, Nesting of Regions]
3858       // A master region may not be closely nested inside a worksharing,
3859       // atomic, or explicit task region.
3860       NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) ||
3861                           isOpenMPTaskingDirective(ParentRegion);
3862     } else if (CurrentRegion == OMPD_critical && CurrentName.getName()) {
3863       // OpenMP [2.16, Nesting of Regions]
3864       // A critical region may not be nested (closely or otherwise) inside a
3865       // critical region with the same name. Note that this restriction is not
3866       // sufficient to prevent deadlock.
3867       SourceLocation PreviousCriticalLoc;
3868       bool DeadLock = Stack->hasDirective(
3869           [CurrentName, &PreviousCriticalLoc](OpenMPDirectiveKind K,
3870                                               const DeclarationNameInfo &DNI,
3871                                               SourceLocation Loc) {
3872             if (K == OMPD_critical && DNI.getName() == CurrentName.getName()) {
3873               PreviousCriticalLoc = Loc;
3874               return true;
3875             }
3876             return false;
3877           },
3878           false /* skip top directive */);
3879       if (DeadLock) {
3880         SemaRef.Diag(StartLoc,
3881                      diag::err_omp_prohibited_region_critical_same_name)
3882             << CurrentName.getName();
3883         if (PreviousCriticalLoc.isValid())
3884           SemaRef.Diag(PreviousCriticalLoc,
3885                        diag::note_omp_previous_critical_region);
3886         return true;
3887       }
3888     } else if (CurrentRegion == OMPD_barrier) {
3889       // OpenMP [2.16, Nesting of Regions]
3890       // A barrier region may not be closely nested inside a worksharing,
3891       // explicit task, critical, ordered, atomic, or master region.
3892       NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) ||
3893                           isOpenMPTaskingDirective(ParentRegion) ||
3894                           ParentRegion == OMPD_master ||
3895                           ParentRegion == OMPD_critical ||
3896                           ParentRegion == OMPD_ordered;
3897     } else if (isOpenMPWorksharingDirective(CurrentRegion) &&
3898                !isOpenMPParallelDirective(CurrentRegion) &&
3899                !isOpenMPTeamsDirective(CurrentRegion)) {
3900       // OpenMP [2.16, Nesting of Regions]
3901       // A worksharing region may not be closely nested inside a worksharing,
3902       // explicit task, critical, ordered, atomic, or master region.
3903       NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) ||
3904                           isOpenMPTaskingDirective(ParentRegion) ||
3905                           ParentRegion == OMPD_master ||
3906                           ParentRegion == OMPD_critical ||
3907                           ParentRegion == OMPD_ordered;
3908       Recommend = ShouldBeInParallelRegion;
3909     } else if (CurrentRegion == OMPD_ordered) {
3910       // OpenMP [2.16, Nesting of Regions]
3911       // An ordered region may not be closely nested inside a critical,
3912       // atomic, or explicit task region.
3913       // An ordered region must be closely nested inside a loop region (or
3914       // parallel loop region) with an ordered clause.
3915       // OpenMP [2.8.1,simd Construct, Restrictions]
3916       // An ordered construct with the simd clause is the only OpenMP construct
3917       // that can appear in the simd region.
3918       NestingProhibited = ParentRegion == OMPD_critical ||
3919                           isOpenMPTaskingDirective(ParentRegion) ||
3920                           !(isOpenMPSimdDirective(ParentRegion) ||
3921                             Stack->isParentOrderedRegion());
3922       Recommend = ShouldBeInOrderedRegion;
3923     } else if (isOpenMPNestingTeamsDirective(CurrentRegion)) {
3924       // OpenMP [2.16, Nesting of Regions]
3925       // If specified, a teams construct must be contained within a target
3926       // construct.
3927       NestingProhibited =
3928           (SemaRef.LangOpts.OpenMP <= 45 && ParentRegion != OMPD_target) ||
3929           (SemaRef.LangOpts.OpenMP >= 50 && ParentRegion != OMPD_unknown &&
3930            ParentRegion != OMPD_target);
3931       OrphanSeen = ParentRegion == OMPD_unknown;
3932       Recommend = ShouldBeInTargetRegion;
3933     }
3934     if (!NestingProhibited &&
3935         !isOpenMPTargetExecutionDirective(CurrentRegion) &&
3936         !isOpenMPTargetDataManagementDirective(CurrentRegion) &&
3937         (ParentRegion == OMPD_teams || ParentRegion == OMPD_target_teams)) {
3938       // OpenMP [2.16, Nesting of Regions]
3939       // distribute, parallel, parallel sections, parallel workshare, and the
3940       // parallel loop and parallel loop SIMD constructs are the only OpenMP
3941       // constructs that can be closely nested in the teams region.
3942       NestingProhibited = !isOpenMPParallelDirective(CurrentRegion) &&
3943                           !isOpenMPDistributeDirective(CurrentRegion);
3944       Recommend = ShouldBeInParallelRegion;
3945     }
3946     if (!NestingProhibited &&
3947         isOpenMPNestingDistributeDirective(CurrentRegion)) {
3948       // OpenMP 4.5 [2.17 Nesting of Regions]
3949       // The region associated with the distribute construct must be strictly
3950       // nested inside a teams region
3951       NestingProhibited =
3952           (ParentRegion != OMPD_teams && ParentRegion != OMPD_target_teams);
3953       Recommend = ShouldBeInTeamsRegion;
3954     }
3955     if (!NestingProhibited &&
3956         (isOpenMPTargetExecutionDirective(CurrentRegion) ||
3957          isOpenMPTargetDataManagementDirective(CurrentRegion))) {
3958       // OpenMP 4.5 [2.17 Nesting of Regions]
3959       // If a target, target update, target data, target enter data, or
3960       // target exit data construct is encountered during execution of a
3961       // target region, the behavior is unspecified.
3962       NestingProhibited = Stack->hasDirective(
3963           [&OffendingRegion](OpenMPDirectiveKind K, const DeclarationNameInfo &,
3964                              SourceLocation) {
3965             if (isOpenMPTargetExecutionDirective(K)) {
3966               OffendingRegion = K;
3967               return true;
3968             }
3969             return false;
3970           },
3971           false /* don't skip top directive */);
3972       CloseNesting = false;
3973     }
3974     if (NestingProhibited) {
3975       if (OrphanSeen) {
3976         SemaRef.Diag(StartLoc, diag::err_omp_orphaned_device_directive)
3977             << getOpenMPDirectiveName(CurrentRegion) << Recommend;
3978       } else {
3979         SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region)
3980             << CloseNesting << getOpenMPDirectiveName(OffendingRegion)
3981             << Recommend << getOpenMPDirectiveName(CurrentRegion);
3982       }
3983       return true;
3984     }
3985   }
3986   return false;
3987 }
3988 
3989 static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind,
3990                            ArrayRef<OMPClause *> Clauses,
3991                            ArrayRef<OpenMPDirectiveKind> AllowedNameModifiers) {
3992   bool ErrorFound = false;
3993   unsigned NamedModifiersNumber = 0;
3994   SmallVector<const OMPIfClause *, OMPC_unknown + 1> FoundNameModifiers(
3995       OMPD_unknown + 1);
3996   SmallVector<SourceLocation, 4> NameModifierLoc;
3997   for (const OMPClause *C : Clauses) {
3998     if (const auto *IC = dyn_cast_or_null<OMPIfClause>(C)) {
3999       // At most one if clause without a directive-name-modifier can appear on
4000       // the directive.
4001       OpenMPDirectiveKind CurNM = IC->getNameModifier();
4002       if (FoundNameModifiers[CurNM]) {
4003         S.Diag(C->getBeginLoc(), diag::err_omp_more_one_clause)
4004             << getOpenMPDirectiveName(Kind) << getOpenMPClauseName(OMPC_if)
4005             << (CurNM != OMPD_unknown) << getOpenMPDirectiveName(CurNM);
4006         ErrorFound = true;
4007       } else if (CurNM != OMPD_unknown) {
4008         NameModifierLoc.push_back(IC->getNameModifierLoc());
4009         ++NamedModifiersNumber;
4010       }
4011       FoundNameModifiers[CurNM] = IC;
4012       if (CurNM == OMPD_unknown)
4013         continue;
4014       // Check if the specified name modifier is allowed for the current
4015       // directive.
4016       // At most one if clause with the particular directive-name-modifier can
4017       // appear on the directive.
4018       bool MatchFound = false;
4019       for (auto NM : AllowedNameModifiers) {
4020         if (CurNM == NM) {
4021           MatchFound = true;
4022           break;
4023         }
4024       }
4025       if (!MatchFound) {
4026         S.Diag(IC->getNameModifierLoc(),
4027                diag::err_omp_wrong_if_directive_name_modifier)
4028             << getOpenMPDirectiveName(CurNM) << getOpenMPDirectiveName(Kind);
4029         ErrorFound = true;
4030       }
4031     }
4032   }
4033   // If any if clause on the directive includes a directive-name-modifier then
4034   // all if clauses on the directive must include a directive-name-modifier.
4035   if (FoundNameModifiers[OMPD_unknown] && NamedModifiersNumber > 0) {
4036     if (NamedModifiersNumber == AllowedNameModifiers.size()) {
4037       S.Diag(FoundNameModifiers[OMPD_unknown]->getBeginLoc(),
4038              diag::err_omp_no_more_if_clause);
4039     } else {
4040       std::string Values;
4041       std::string Sep(", ");
4042       unsigned AllowedCnt = 0;
4043       unsigned TotalAllowedNum =
4044           AllowedNameModifiers.size() - NamedModifiersNumber;
4045       for (unsigned Cnt = 0, End = AllowedNameModifiers.size(); Cnt < End;
4046            ++Cnt) {
4047         OpenMPDirectiveKind NM = AllowedNameModifiers[Cnt];
4048         if (!FoundNameModifiers[NM]) {
4049           Values += "'";
4050           Values += getOpenMPDirectiveName(NM);
4051           Values += "'";
4052           if (AllowedCnt + 2 == TotalAllowedNum)
4053             Values += " or ";
4054           else if (AllowedCnt + 1 != TotalAllowedNum)
4055             Values += Sep;
4056           ++AllowedCnt;
4057         }
4058       }
4059       S.Diag(FoundNameModifiers[OMPD_unknown]->getCondition()->getBeginLoc(),
4060              diag::err_omp_unnamed_if_clause)
4061           << (TotalAllowedNum > 1) << Values;
4062     }
4063     for (SourceLocation Loc : NameModifierLoc) {
4064       S.Diag(Loc, diag::note_omp_previous_named_if_clause);
4065     }
4066     ErrorFound = true;
4067   }
4068   return ErrorFound;
4069 }
4070 
4071 static std::pair<ValueDecl *, bool>
4072 getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc,
4073                SourceRange &ERange, bool AllowArraySection = false) {
4074   if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() ||
4075       RefExpr->containsUnexpandedParameterPack())
4076     return std::make_pair(nullptr, true);
4077 
4078   // OpenMP [3.1, C/C++]
4079   //  A list item is a variable name.
4080   // OpenMP  [2.9.3.3, Restrictions, p.1]
4081   //  A variable that is part of another variable (as an array or
4082   //  structure element) cannot appear in a private clause.
4083   RefExpr = RefExpr->IgnoreParens();
4084   enum {
4085     NoArrayExpr = -1,
4086     ArraySubscript = 0,
4087     OMPArraySection = 1
4088   } IsArrayExpr = NoArrayExpr;
4089   if (AllowArraySection) {
4090     if (auto *ASE = dyn_cast_or_null<ArraySubscriptExpr>(RefExpr)) {
4091       Expr *Base = ASE->getBase()->IgnoreParenImpCasts();
4092       while (auto *TempASE = dyn_cast<ArraySubscriptExpr>(Base))
4093         Base = TempASE->getBase()->IgnoreParenImpCasts();
4094       RefExpr = Base;
4095       IsArrayExpr = ArraySubscript;
4096     } else if (auto *OASE = dyn_cast_or_null<OMPArraySectionExpr>(RefExpr)) {
4097       Expr *Base = OASE->getBase()->IgnoreParenImpCasts();
4098       while (auto *TempOASE = dyn_cast<OMPArraySectionExpr>(Base))
4099         Base = TempOASE->getBase()->IgnoreParenImpCasts();
4100       while (auto *TempASE = dyn_cast<ArraySubscriptExpr>(Base))
4101         Base = TempASE->getBase()->IgnoreParenImpCasts();
4102       RefExpr = Base;
4103       IsArrayExpr = OMPArraySection;
4104     }
4105   }
4106   ELoc = RefExpr->getExprLoc();
4107   ERange = RefExpr->getSourceRange();
4108   RefExpr = RefExpr->IgnoreParenImpCasts();
4109   auto *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr);
4110   auto *ME = dyn_cast_or_null<MemberExpr>(RefExpr);
4111   if ((!DE || !isa<VarDecl>(DE->getDecl())) &&
4112       (S.getCurrentThisType().isNull() || !ME ||
4113        !isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()) ||
4114        !isa<FieldDecl>(ME->getMemberDecl()))) {
4115     if (IsArrayExpr != NoArrayExpr) {
4116       S.Diag(ELoc, diag::err_omp_expected_base_var_name) << IsArrayExpr
4117                                                          << ERange;
4118     } else {
4119       S.Diag(ELoc,
4120              AllowArraySection
4121                  ? diag::err_omp_expected_var_name_member_expr_or_array_item
4122                  : diag::err_omp_expected_var_name_member_expr)
4123           << (S.getCurrentThisType().isNull() ? 0 : 1) << ERange;
4124     }
4125     return std::make_pair(nullptr, false);
4126   }
4127   return std::make_pair(
4128       getCanonicalDecl(DE ? DE->getDecl() : ME->getMemberDecl()), false);
4129 }
4130 
4131 static void checkAllocateClauses(Sema &S, DSAStackTy *Stack,
4132                                  ArrayRef<OMPClause *> Clauses) {
4133   assert(!S.CurContext->isDependentContext() &&
4134          "Expected non-dependent context.");
4135   auto AllocateRange =
4136       llvm::make_filter_range(Clauses, OMPAllocateClause::classof);
4137   llvm::DenseMap<CanonicalDeclPtr<Decl>, CanonicalDeclPtr<VarDecl>>
4138       DeclToCopy;
4139   auto PrivateRange = llvm::make_filter_range(Clauses, [](const OMPClause *C) {
4140     return isOpenMPPrivate(C->getClauseKind());
4141   });
4142   for (OMPClause *Cl : PrivateRange) {
4143     MutableArrayRef<Expr *>::iterator I, It, Et;
4144     if (Cl->getClauseKind() == OMPC_private) {
4145       auto *PC = cast<OMPPrivateClause>(Cl);
4146       I = PC->private_copies().begin();
4147       It = PC->varlist_begin();
4148       Et = PC->varlist_end();
4149     } else if (Cl->getClauseKind() == OMPC_firstprivate) {
4150       auto *PC = cast<OMPFirstprivateClause>(Cl);
4151       I = PC->private_copies().begin();
4152       It = PC->varlist_begin();
4153       Et = PC->varlist_end();
4154     } else if (Cl->getClauseKind() == OMPC_lastprivate) {
4155       auto *PC = cast<OMPLastprivateClause>(Cl);
4156       I = PC->private_copies().begin();
4157       It = PC->varlist_begin();
4158       Et = PC->varlist_end();
4159     } else if (Cl->getClauseKind() == OMPC_linear) {
4160       auto *PC = cast<OMPLinearClause>(Cl);
4161       I = PC->privates().begin();
4162       It = PC->varlist_begin();
4163       Et = PC->varlist_end();
4164     } else if (Cl->getClauseKind() == OMPC_reduction) {
4165       auto *PC = cast<OMPReductionClause>(Cl);
4166       I = PC->privates().begin();
4167       It = PC->varlist_begin();
4168       Et = PC->varlist_end();
4169     } else if (Cl->getClauseKind() == OMPC_task_reduction) {
4170       auto *PC = cast<OMPTaskReductionClause>(Cl);
4171       I = PC->privates().begin();
4172       It = PC->varlist_begin();
4173       Et = PC->varlist_end();
4174     } else if (Cl->getClauseKind() == OMPC_in_reduction) {
4175       auto *PC = cast<OMPInReductionClause>(Cl);
4176       I = PC->privates().begin();
4177       It = PC->varlist_begin();
4178       Et = PC->varlist_end();
4179     } else {
4180       llvm_unreachable("Expected private clause.");
4181     }
4182     for (Expr *E : llvm::make_range(It, Et)) {
4183       if (!*I) {
4184         ++I;
4185         continue;
4186       }
4187       SourceLocation ELoc;
4188       SourceRange ERange;
4189       Expr *SimpleRefExpr = E;
4190       auto Res = getPrivateItem(S, SimpleRefExpr, ELoc, ERange,
4191                                 /*AllowArraySection=*/true);
4192       DeclToCopy.try_emplace(Res.first,
4193                              cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()));
4194       ++I;
4195     }
4196   }
4197   for (OMPClause *C : AllocateRange) {
4198     auto *AC = cast<OMPAllocateClause>(C);
4199     OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind =
4200         getAllocatorKind(S, Stack, AC->getAllocator());
4201     // OpenMP, 2.11.4 allocate Clause, Restrictions.
4202     // For task, taskloop or target directives, allocation requests to memory
4203     // allocators with the trait access set to thread result in unspecified
4204     // behavior.
4205     if (AllocatorKind == OMPAllocateDeclAttr::OMPThreadMemAlloc &&
4206         (isOpenMPTaskingDirective(Stack->getCurrentDirective()) ||
4207          isOpenMPTargetExecutionDirective(Stack->getCurrentDirective()))) {
4208       S.Diag(AC->getAllocator()->getExprLoc(),
4209              diag::warn_omp_allocate_thread_on_task_target_directive)
4210           << getOpenMPDirectiveName(Stack->getCurrentDirective());
4211     }
4212     for (Expr *E : AC->varlists()) {
4213       SourceLocation ELoc;
4214       SourceRange ERange;
4215       Expr *SimpleRefExpr = E;
4216       auto Res = getPrivateItem(S, SimpleRefExpr, ELoc, ERange);
4217       ValueDecl *VD = Res.first;
4218       DSAStackTy::DSAVarData Data = Stack->getTopDSA(VD, /*FromParent=*/false);
4219       if (!isOpenMPPrivate(Data.CKind)) {
4220         S.Diag(E->getExprLoc(),
4221                diag::err_omp_expected_private_copy_for_allocate);
4222         continue;
4223       }
4224       VarDecl *PrivateVD = DeclToCopy[VD];
4225       if (checkPreviousOMPAllocateAttribute(S, Stack, E, PrivateVD,
4226                                             AllocatorKind, AC->getAllocator()))
4227         continue;
4228       applyOMPAllocateAttribute(S, PrivateVD, AllocatorKind, AC->getAllocator(),
4229                                 E->getSourceRange());
4230     }
4231   }
4232 }
4233 
4234 StmtResult Sema::ActOnOpenMPExecutableDirective(
4235     OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName,
4236     OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses,
4237     Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {
4238   StmtResult Res = StmtError();
4239   // First check CancelRegion which is then used in checkNestingOfRegions.
4240   if (checkCancelRegion(*this, Kind, CancelRegion, StartLoc) ||
4241       checkNestingOfRegions(*this, DSAStack, Kind, DirName, CancelRegion,
4242                             StartLoc))
4243     return StmtError();
4244 
4245   llvm::SmallVector<OMPClause *, 8> ClausesWithImplicit;
4246   VarsWithInheritedDSAType VarsWithInheritedDSA;
4247   bool ErrorFound = false;
4248   ClausesWithImplicit.append(Clauses.begin(), Clauses.end());
4249   if (AStmt && !CurContext->isDependentContext()) {
4250     assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
4251 
4252     // Check default data sharing attributes for referenced variables.
4253     DSAAttrChecker DSAChecker(DSAStack, *this, cast<CapturedStmt>(AStmt));
4254     int ThisCaptureLevel = getOpenMPCaptureLevels(Kind);
4255     Stmt *S = AStmt;
4256     while (--ThisCaptureLevel >= 0)
4257       S = cast<CapturedStmt>(S)->getCapturedStmt();
4258     DSAChecker.Visit(S);
4259     if (!isOpenMPTargetDataManagementDirective(Kind) &&
4260         !isOpenMPTaskingDirective(Kind)) {
4261       // Visit subcaptures to generate implicit clauses for captured vars.
4262       auto *CS = cast<CapturedStmt>(AStmt);
4263       SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
4264       getOpenMPCaptureRegions(CaptureRegions, Kind);
4265       // Ignore outer tasking regions for target directives.
4266       if (CaptureRegions.size() > 1 && CaptureRegions.front() == OMPD_task)
4267         CS = cast<CapturedStmt>(CS->getCapturedStmt());
4268       DSAChecker.visitSubCaptures(CS);
4269     }
4270     if (DSAChecker.isErrorFound())
4271       return StmtError();
4272     // Generate list of implicitly defined firstprivate variables.
4273     VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA();
4274 
4275     SmallVector<Expr *, 4> ImplicitFirstprivates(
4276         DSAChecker.getImplicitFirstprivate().begin(),
4277         DSAChecker.getImplicitFirstprivate().end());
4278     SmallVector<Expr *, 4> ImplicitMaps(DSAChecker.getImplicitMap().begin(),
4279                                         DSAChecker.getImplicitMap().end());
4280     // Mark taskgroup task_reduction descriptors as implicitly firstprivate.
4281     for (OMPClause *C : Clauses) {
4282       if (auto *IRC = dyn_cast<OMPInReductionClause>(C)) {
4283         for (Expr *E : IRC->taskgroup_descriptors())
4284           if (E)
4285             ImplicitFirstprivates.emplace_back(E);
4286       }
4287     }
4288     if (!ImplicitFirstprivates.empty()) {
4289       if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause(
4290               ImplicitFirstprivates, SourceLocation(), SourceLocation(),
4291               SourceLocation())) {
4292         ClausesWithImplicit.push_back(Implicit);
4293         ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() !=
4294                      ImplicitFirstprivates.size();
4295       } else {
4296         ErrorFound = true;
4297       }
4298     }
4299     if (!ImplicitMaps.empty()) {
4300       CXXScopeSpec MapperIdScopeSpec;
4301       DeclarationNameInfo MapperId;
4302       if (OMPClause *Implicit = ActOnOpenMPMapClause(
4303               llvm::None, llvm::None, MapperIdScopeSpec, MapperId,
4304               OMPC_MAP_tofrom, /*IsMapTypeImplicit=*/true, SourceLocation(),
4305               SourceLocation(), ImplicitMaps, OMPVarListLocTy())) {
4306         ClausesWithImplicit.emplace_back(Implicit);
4307         ErrorFound |=
4308             cast<OMPMapClause>(Implicit)->varlist_size() != ImplicitMaps.size();
4309       } else {
4310         ErrorFound = true;
4311       }
4312     }
4313   }
4314 
4315   llvm::SmallVector<OpenMPDirectiveKind, 4> AllowedNameModifiers;
4316   switch (Kind) {
4317   case OMPD_parallel:
4318     Res = ActOnOpenMPParallelDirective(ClausesWithImplicit, AStmt, StartLoc,
4319                                        EndLoc);
4320     AllowedNameModifiers.push_back(OMPD_parallel);
4321     break;
4322   case OMPD_simd:
4323     Res = ActOnOpenMPSimdDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
4324                                    VarsWithInheritedDSA);
4325     break;
4326   case OMPD_for:
4327     Res = ActOnOpenMPForDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc,
4328                                   VarsWithInheritedDSA);
4329     break;
4330   case OMPD_for_simd:
4331     Res = ActOnOpenMPForSimdDirective(ClausesWithImplicit, AStmt, StartLoc,
4332                                       EndLoc, VarsWithInheritedDSA);
4333     break;
4334   case OMPD_sections:
4335     Res = ActOnOpenMPSectionsDirective(ClausesWithImplicit, AStmt, StartLoc,
4336                                        EndLoc);
4337     break;
4338   case OMPD_section:
4339     assert(ClausesWithImplicit.empty() &&
4340            "No clauses are allowed for 'omp section' directive");
4341     Res = ActOnOpenMPSectionDirective(AStmt, StartLoc, EndLoc);
4342     break;
4343   case OMPD_single:
4344     Res = ActOnOpenMPSingleDirective(ClausesWithImplicit, AStmt, StartLoc,
4345                                      EndLoc);
4346     break;
4347   case OMPD_master:
4348     assert(ClausesWithImplicit.empty() &&
4349            "No clauses are allowed for 'omp master' directive");
4350     Res = ActOnOpenMPMasterDirective(AStmt, StartLoc, EndLoc);
4351     break;
4352   case OMPD_critical:
4353     Res = ActOnOpenMPCriticalDirective(DirName, ClausesWithImplicit, AStmt,
4354                                        StartLoc, EndLoc);
4355     break;
4356   case OMPD_parallel_for:
4357     Res = ActOnOpenMPParallelForDirective(ClausesWithImplicit, AStmt, StartLoc,
4358                                           EndLoc, VarsWithInheritedDSA);
4359     AllowedNameModifiers.push_back(OMPD_parallel);
4360     break;
4361   case OMPD_parallel_for_simd:
4362     Res = ActOnOpenMPParallelForSimdDirective(
4363         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4364     AllowedNameModifiers.push_back(OMPD_parallel);
4365     break;
4366   case OMPD_parallel_sections:
4367     Res = ActOnOpenMPParallelSectionsDirective(ClausesWithImplicit, AStmt,
4368                                                StartLoc, EndLoc);
4369     AllowedNameModifiers.push_back(OMPD_parallel);
4370     break;
4371   case OMPD_task:
4372     Res =
4373         ActOnOpenMPTaskDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc);
4374     AllowedNameModifiers.push_back(OMPD_task);
4375     break;
4376   case OMPD_taskyield:
4377     assert(ClausesWithImplicit.empty() &&
4378            "No clauses are allowed for 'omp taskyield' directive");
4379     assert(AStmt == nullptr &&
4380            "No associated statement allowed for 'omp taskyield' directive");
4381     Res = ActOnOpenMPTaskyieldDirective(StartLoc, EndLoc);
4382     break;
4383   case OMPD_barrier:
4384     assert(ClausesWithImplicit.empty() &&
4385            "No clauses are allowed for 'omp barrier' directive");
4386     assert(AStmt == nullptr &&
4387            "No associated statement allowed for 'omp barrier' directive");
4388     Res = ActOnOpenMPBarrierDirective(StartLoc, EndLoc);
4389     break;
4390   case OMPD_taskwait:
4391     assert(ClausesWithImplicit.empty() &&
4392            "No clauses are allowed for 'omp taskwait' directive");
4393     assert(AStmt == nullptr &&
4394            "No associated statement allowed for 'omp taskwait' directive");
4395     Res = ActOnOpenMPTaskwaitDirective(StartLoc, EndLoc);
4396     break;
4397   case OMPD_taskgroup:
4398     Res = ActOnOpenMPTaskgroupDirective(ClausesWithImplicit, AStmt, StartLoc,
4399                                         EndLoc);
4400     break;
4401   case OMPD_flush:
4402     assert(AStmt == nullptr &&
4403            "No associated statement allowed for 'omp flush' directive");
4404     Res = ActOnOpenMPFlushDirective(ClausesWithImplicit, StartLoc, EndLoc);
4405     break;
4406   case OMPD_ordered:
4407     Res = ActOnOpenMPOrderedDirective(ClausesWithImplicit, AStmt, StartLoc,
4408                                       EndLoc);
4409     break;
4410   case OMPD_atomic:
4411     Res = ActOnOpenMPAtomicDirective(ClausesWithImplicit, AStmt, StartLoc,
4412                                      EndLoc);
4413     break;
4414   case OMPD_teams:
4415     Res =
4416         ActOnOpenMPTeamsDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc);
4417     break;
4418   case OMPD_target:
4419     Res = ActOnOpenMPTargetDirective(ClausesWithImplicit, AStmt, StartLoc,
4420                                      EndLoc);
4421     AllowedNameModifiers.push_back(OMPD_target);
4422     break;
4423   case OMPD_target_parallel:
4424     Res = ActOnOpenMPTargetParallelDirective(ClausesWithImplicit, AStmt,
4425                                              StartLoc, EndLoc);
4426     AllowedNameModifiers.push_back(OMPD_target);
4427     AllowedNameModifiers.push_back(OMPD_parallel);
4428     break;
4429   case OMPD_target_parallel_for:
4430     Res = ActOnOpenMPTargetParallelForDirective(
4431         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4432     AllowedNameModifiers.push_back(OMPD_target);
4433     AllowedNameModifiers.push_back(OMPD_parallel);
4434     break;
4435   case OMPD_cancellation_point:
4436     assert(ClausesWithImplicit.empty() &&
4437            "No clauses are allowed for 'omp cancellation point' directive");
4438     assert(AStmt == nullptr && "No associated statement allowed for 'omp "
4439                                "cancellation point' directive");
4440     Res = ActOnOpenMPCancellationPointDirective(StartLoc, EndLoc, CancelRegion);
4441     break;
4442   case OMPD_cancel:
4443     assert(AStmt == nullptr &&
4444            "No associated statement allowed for 'omp cancel' directive");
4445     Res = ActOnOpenMPCancelDirective(ClausesWithImplicit, StartLoc, EndLoc,
4446                                      CancelRegion);
4447     AllowedNameModifiers.push_back(OMPD_cancel);
4448     break;
4449   case OMPD_target_data:
4450     Res = ActOnOpenMPTargetDataDirective(ClausesWithImplicit, AStmt, StartLoc,
4451                                          EndLoc);
4452     AllowedNameModifiers.push_back(OMPD_target_data);
4453     break;
4454   case OMPD_target_enter_data:
4455     Res = ActOnOpenMPTargetEnterDataDirective(ClausesWithImplicit, StartLoc,
4456                                               EndLoc, AStmt);
4457     AllowedNameModifiers.push_back(OMPD_target_enter_data);
4458     break;
4459   case OMPD_target_exit_data:
4460     Res = ActOnOpenMPTargetExitDataDirective(ClausesWithImplicit, StartLoc,
4461                                              EndLoc, AStmt);
4462     AllowedNameModifiers.push_back(OMPD_target_exit_data);
4463     break;
4464   case OMPD_taskloop:
4465     Res = ActOnOpenMPTaskLoopDirective(ClausesWithImplicit, AStmt, StartLoc,
4466                                        EndLoc, VarsWithInheritedDSA);
4467     AllowedNameModifiers.push_back(OMPD_taskloop);
4468     break;
4469   case OMPD_taskloop_simd:
4470     Res = ActOnOpenMPTaskLoopSimdDirective(ClausesWithImplicit, AStmt, StartLoc,
4471                                            EndLoc, VarsWithInheritedDSA);
4472     AllowedNameModifiers.push_back(OMPD_taskloop);
4473     break;
4474   case OMPD_master_taskloop:
4475     Res = ActOnOpenMPMasterTaskLoopDirective(
4476         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4477     AllowedNameModifiers.push_back(OMPD_taskloop);
4478     break;
4479   case OMPD_master_taskloop_simd:
4480     Res = ActOnOpenMPMasterTaskLoopSimdDirective(
4481         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4482     AllowedNameModifiers.push_back(OMPD_taskloop);
4483     break;
4484   case OMPD_parallel_master_taskloop:
4485     Res = ActOnOpenMPParallelMasterTaskLoopDirective(
4486         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4487     AllowedNameModifiers.push_back(OMPD_taskloop);
4488     AllowedNameModifiers.push_back(OMPD_parallel);
4489     break;
4490   case OMPD_distribute:
4491     Res = ActOnOpenMPDistributeDirective(ClausesWithImplicit, AStmt, StartLoc,
4492                                          EndLoc, VarsWithInheritedDSA);
4493     break;
4494   case OMPD_target_update:
4495     Res = ActOnOpenMPTargetUpdateDirective(ClausesWithImplicit, StartLoc,
4496                                            EndLoc, AStmt);
4497     AllowedNameModifiers.push_back(OMPD_target_update);
4498     break;
4499   case OMPD_distribute_parallel_for:
4500     Res = ActOnOpenMPDistributeParallelForDirective(
4501         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4502     AllowedNameModifiers.push_back(OMPD_parallel);
4503     break;
4504   case OMPD_distribute_parallel_for_simd:
4505     Res = ActOnOpenMPDistributeParallelForSimdDirective(
4506         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4507     AllowedNameModifiers.push_back(OMPD_parallel);
4508     break;
4509   case OMPD_distribute_simd:
4510     Res = ActOnOpenMPDistributeSimdDirective(
4511         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4512     break;
4513   case OMPD_target_parallel_for_simd:
4514     Res = ActOnOpenMPTargetParallelForSimdDirective(
4515         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4516     AllowedNameModifiers.push_back(OMPD_target);
4517     AllowedNameModifiers.push_back(OMPD_parallel);
4518     break;
4519   case OMPD_target_simd:
4520     Res = ActOnOpenMPTargetSimdDirective(ClausesWithImplicit, AStmt, StartLoc,
4521                                          EndLoc, VarsWithInheritedDSA);
4522     AllowedNameModifiers.push_back(OMPD_target);
4523     break;
4524   case OMPD_teams_distribute:
4525     Res = ActOnOpenMPTeamsDistributeDirective(
4526         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4527     break;
4528   case OMPD_teams_distribute_simd:
4529     Res = ActOnOpenMPTeamsDistributeSimdDirective(
4530         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4531     break;
4532   case OMPD_teams_distribute_parallel_for_simd:
4533     Res = ActOnOpenMPTeamsDistributeParallelForSimdDirective(
4534         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4535     AllowedNameModifiers.push_back(OMPD_parallel);
4536     break;
4537   case OMPD_teams_distribute_parallel_for:
4538     Res = ActOnOpenMPTeamsDistributeParallelForDirective(
4539         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4540     AllowedNameModifiers.push_back(OMPD_parallel);
4541     break;
4542   case OMPD_target_teams:
4543     Res = ActOnOpenMPTargetTeamsDirective(ClausesWithImplicit, AStmt, StartLoc,
4544                                           EndLoc);
4545     AllowedNameModifiers.push_back(OMPD_target);
4546     break;
4547   case OMPD_target_teams_distribute:
4548     Res = ActOnOpenMPTargetTeamsDistributeDirective(
4549         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4550     AllowedNameModifiers.push_back(OMPD_target);
4551     break;
4552   case OMPD_target_teams_distribute_parallel_for:
4553     Res = ActOnOpenMPTargetTeamsDistributeParallelForDirective(
4554         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4555     AllowedNameModifiers.push_back(OMPD_target);
4556     AllowedNameModifiers.push_back(OMPD_parallel);
4557     break;
4558   case OMPD_target_teams_distribute_parallel_for_simd:
4559     Res = ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective(
4560         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4561     AllowedNameModifiers.push_back(OMPD_target);
4562     AllowedNameModifiers.push_back(OMPD_parallel);
4563     break;
4564   case OMPD_target_teams_distribute_simd:
4565     Res = ActOnOpenMPTargetTeamsDistributeSimdDirective(
4566         ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA);
4567     AllowedNameModifiers.push_back(OMPD_target);
4568     break;
4569   case OMPD_declare_target:
4570   case OMPD_end_declare_target:
4571   case OMPD_threadprivate:
4572   case OMPD_allocate:
4573   case OMPD_declare_reduction:
4574   case OMPD_declare_mapper:
4575   case OMPD_declare_simd:
4576   case OMPD_requires:
4577   case OMPD_declare_variant:
4578     llvm_unreachable("OpenMP Directive is not allowed");
4579   case OMPD_unknown:
4580     llvm_unreachable("Unknown OpenMP directive");
4581   }
4582 
4583   ErrorFound = Res.isInvalid() || ErrorFound;
4584 
4585   // Check variables in the clauses if default(none) was specified.
4586   if (DSAStack->getDefaultDSA() == DSA_none) {
4587     DSAAttrChecker DSAChecker(DSAStack, *this, nullptr);
4588     for (OMPClause *C : Clauses) {
4589       switch (C->getClauseKind()) {
4590       case OMPC_num_threads:
4591       case OMPC_dist_schedule:
4592         // Do not analyse if no parent teams directive.
4593         if (isOpenMPTeamsDirective(DSAStack->getCurrentDirective()))
4594           break;
4595         continue;
4596       case OMPC_if:
4597         if (isOpenMPTeamsDirective(DSAStack->getCurrentDirective()) &&
4598             cast<OMPIfClause>(C)->getNameModifier() != OMPD_target)
4599           break;
4600         continue;
4601       case OMPC_schedule:
4602         break;
4603       case OMPC_grainsize:
4604       case OMPC_num_tasks:
4605       case OMPC_final:
4606       case OMPC_priority:
4607         // Do not analyze if no parent parallel directive.
4608         if (isOpenMPParallelDirective(DSAStack->getCurrentDirective()))
4609           break;
4610         continue;
4611       case OMPC_ordered:
4612       case OMPC_device:
4613       case OMPC_num_teams:
4614       case OMPC_thread_limit:
4615       case OMPC_hint:
4616       case OMPC_collapse:
4617       case OMPC_safelen:
4618       case OMPC_simdlen:
4619       case OMPC_default:
4620       case OMPC_proc_bind:
4621       case OMPC_private:
4622       case OMPC_firstprivate:
4623       case OMPC_lastprivate:
4624       case OMPC_shared:
4625       case OMPC_reduction:
4626       case OMPC_task_reduction:
4627       case OMPC_in_reduction:
4628       case OMPC_linear:
4629       case OMPC_aligned:
4630       case OMPC_copyin:
4631       case OMPC_copyprivate:
4632       case OMPC_nowait:
4633       case OMPC_untied:
4634       case OMPC_mergeable:
4635       case OMPC_allocate:
4636       case OMPC_read:
4637       case OMPC_write:
4638       case OMPC_update:
4639       case OMPC_capture:
4640       case OMPC_seq_cst:
4641       case OMPC_depend:
4642       case OMPC_threads:
4643       case OMPC_simd:
4644       case OMPC_map:
4645       case OMPC_nogroup:
4646       case OMPC_defaultmap:
4647       case OMPC_to:
4648       case OMPC_from:
4649       case OMPC_use_device_ptr:
4650       case OMPC_is_device_ptr:
4651         continue;
4652       case OMPC_allocator:
4653       case OMPC_flush:
4654       case OMPC_threadprivate:
4655       case OMPC_uniform:
4656       case OMPC_unknown:
4657       case OMPC_unified_address:
4658       case OMPC_unified_shared_memory:
4659       case OMPC_reverse_offload:
4660       case OMPC_dynamic_allocators:
4661       case OMPC_atomic_default_mem_order:
4662       case OMPC_device_type:
4663       case OMPC_match:
4664         llvm_unreachable("Unexpected clause");
4665       }
4666       for (Stmt *CC : C->children()) {
4667         if (CC)
4668           DSAChecker.Visit(CC);
4669       }
4670     }
4671     for (auto &P : DSAChecker.getVarsWithInheritedDSA())
4672       VarsWithInheritedDSA[P.getFirst()] = P.getSecond();
4673   }
4674   for (const auto &P : VarsWithInheritedDSA) {
4675     if (P.getFirst()->isImplicit() || isa<OMPCapturedExprDecl>(P.getFirst()))
4676       continue;
4677     ErrorFound = true;
4678     Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable)
4679         << P.first << P.second->getSourceRange();
4680     Diag(DSAStack->getDefaultDSALocation(), diag::note_omp_default_dsa_none);
4681   }
4682 
4683   if (!AllowedNameModifiers.empty())
4684     ErrorFound = checkIfClauses(*this, Kind, Clauses, AllowedNameModifiers) ||
4685                  ErrorFound;
4686 
4687   if (ErrorFound)
4688     return StmtError();
4689 
4690   if (!(Res.getAs<OMPExecutableDirective>()->isStandaloneDirective())) {
4691     Res.getAs<OMPExecutableDirective>()
4692         ->getStructuredBlock()
4693         ->setIsOMPStructuredBlock(true);
4694   }
4695 
4696   if (!CurContext->isDependentContext() &&
4697       isOpenMPTargetExecutionDirective(Kind) &&
4698       !(DSAStack->hasRequiresDeclWithClause<OMPUnifiedSharedMemoryClause>() ||
4699         DSAStack->hasRequiresDeclWithClause<OMPUnifiedAddressClause>() ||
4700         DSAStack->hasRequiresDeclWithClause<OMPReverseOffloadClause>() ||
4701         DSAStack->hasRequiresDeclWithClause<OMPDynamicAllocatorsClause>())) {
4702     // Register target to DSA Stack.
4703     DSAStack->addTargetDirLocation(StartLoc);
4704   }
4705 
4706   return Res;
4707 }
4708 
4709 Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(
4710     DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen,
4711     ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds,
4712     ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears,
4713     ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {
4714   assert(Aligneds.size() == Alignments.size());
4715   assert(Linears.size() == LinModifiers.size());
4716   assert(Linears.size() == Steps.size());
4717   if (!DG || DG.get().isNull())
4718     return DeclGroupPtrTy();
4719 
4720   const int SimdId = 0;
4721   if (!DG.get().isSingleDecl()) {
4722     Diag(SR.getBegin(), diag::err_omp_single_decl_in_declare_simd_variant)
4723         << SimdId;
4724     return DG;
4725   }
4726   Decl *ADecl = DG.get().getSingleDecl();
4727   if (auto *FTD = dyn_cast<FunctionTemplateDecl>(ADecl))
4728     ADecl = FTD->getTemplatedDecl();
4729 
4730   auto *FD = dyn_cast<FunctionDecl>(ADecl);
4731   if (!FD) {
4732     Diag(ADecl->getLocation(), diag::err_omp_function_expected) << SimdId;
4733     return DeclGroupPtrTy();
4734   }
4735 
4736   // OpenMP [2.8.2, declare simd construct, Description]
4737   // The parameter of the simdlen clause must be a constant positive integer
4738   // expression.
4739   ExprResult SL;
4740   if (Simdlen)
4741     SL = VerifyPositiveIntegerConstantInClause(Simdlen, OMPC_simdlen);
4742   // OpenMP [2.8.2, declare simd construct, Description]
4743   // The special this pointer can be used as if was one of the arguments to the
4744   // function in any of the linear, aligned, or uniform clauses.
4745   // The uniform clause declares one or more arguments to have an invariant
4746   // value for all concurrent invocations of the function in the execution of a
4747   // single SIMD loop.
4748   llvm::DenseMap<const Decl *, const Expr *> UniformedArgs;
4749   const Expr *UniformedLinearThis = nullptr;
4750   for (const Expr *E : Uniforms) {
4751     E = E->IgnoreParenImpCasts();
4752     if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
4753       if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
4754         if (FD->getNumParams() > PVD->getFunctionScopeIndex() &&
4755             FD->getParamDecl(PVD->getFunctionScopeIndex())
4756                     ->getCanonicalDecl() == PVD->getCanonicalDecl()) {
4757           UniformedArgs.try_emplace(PVD->getCanonicalDecl(), E);
4758           continue;
4759         }
4760     if (isa<CXXThisExpr>(E)) {
4761       UniformedLinearThis = E;
4762       continue;
4763     }
4764     Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause)
4765         << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);
4766   }
4767   // OpenMP [2.8.2, declare simd construct, Description]
4768   // The aligned clause declares that the object to which each list item points
4769   // is aligned to the number of bytes expressed in the optional parameter of
4770   // the aligned clause.
4771   // The special this pointer can be used as if was one of the arguments to the
4772   // function in any of the linear, aligned, or uniform clauses.
4773   // The type of list items appearing in the aligned clause must be array,
4774   // pointer, reference to array, or reference to pointer.
4775   llvm::DenseMap<const Decl *, const Expr *> AlignedArgs;
4776   const Expr *AlignedThis = nullptr;
4777   for (const Expr *E : Aligneds) {
4778     E = E->IgnoreParenImpCasts();
4779     if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
4780       if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
4781         const VarDecl *CanonPVD = PVD->getCanonicalDecl();
4782         if (FD->getNumParams() > PVD->getFunctionScopeIndex() &&
4783             FD->getParamDecl(PVD->getFunctionScopeIndex())
4784                     ->getCanonicalDecl() == CanonPVD) {
4785           // OpenMP  [2.8.1, simd construct, Restrictions]
4786           // A list-item cannot appear in more than one aligned clause.
4787           if (AlignedArgs.count(CanonPVD) > 0) {
4788             Diag(E->getExprLoc(), diag::err_omp_aligned_twice)
4789                 << 1 << E->getSourceRange();
4790             Diag(AlignedArgs[CanonPVD]->getExprLoc(),
4791                  diag::note_omp_explicit_dsa)
4792                 << getOpenMPClauseName(OMPC_aligned);
4793             continue;
4794           }
4795           AlignedArgs[CanonPVD] = E;
4796           QualType QTy = PVD->getType()
4797                              .getNonReferenceType()
4798                              .getUnqualifiedType()
4799                              .getCanonicalType();
4800           const Type *Ty = QTy.getTypePtrOrNull();
4801           if (!Ty || (!Ty->isArrayType() && !Ty->isPointerType())) {
4802             Diag(E->getExprLoc(), diag::err_omp_aligned_expected_array_or_ptr)
4803                 << QTy << getLangOpts().CPlusPlus << E->getSourceRange();
4804             Diag(PVD->getLocation(), diag::note_previous_decl) << PVD;
4805           }
4806           continue;
4807         }
4808       }
4809     if (isa<CXXThisExpr>(E)) {
4810       if (AlignedThis) {
4811         Diag(E->getExprLoc(), diag::err_omp_aligned_twice)
4812             << 2 << E->getSourceRange();
4813         Diag(AlignedThis->getExprLoc(), diag::note_omp_explicit_dsa)
4814             << getOpenMPClauseName(OMPC_aligned);
4815       }
4816       AlignedThis = E;
4817       continue;
4818     }
4819     Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause)
4820         << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);
4821   }
4822   // The optional parameter of the aligned clause, alignment, must be a constant
4823   // positive integer expression. If no optional parameter is specified,
4824   // implementation-defined default alignments for SIMD instructions on the
4825   // target platforms are assumed.
4826   SmallVector<const Expr *, 4> NewAligns;
4827   for (Expr *E : Alignments) {
4828     ExprResult Align;
4829     if (E)
4830       Align = VerifyPositiveIntegerConstantInClause(E, OMPC_aligned);
4831     NewAligns.push_back(Align.get());
4832   }
4833   // OpenMP [2.8.2, declare simd construct, Description]
4834   // The linear clause declares one or more list items to be private to a SIMD
4835   // lane and to have a linear relationship with respect to the iteration space
4836   // of a loop.
4837   // The special this pointer can be used as if was one of the arguments to the
4838   // function in any of the linear, aligned, or uniform clauses.
4839   // When a linear-step expression is specified in a linear clause it must be
4840   // either a constant integer expression or an integer-typed parameter that is
4841   // specified in a uniform clause on the directive.
4842   llvm::DenseMap<const Decl *, const Expr *> LinearArgs;
4843   const bool IsUniformedThis = UniformedLinearThis != nullptr;
4844   auto MI = LinModifiers.begin();
4845   for (const Expr *E : Linears) {
4846     auto LinKind = static_cast<OpenMPLinearClauseKind>(*MI);
4847     ++MI;
4848     E = E->IgnoreParenImpCasts();
4849     if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
4850       if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
4851         const VarDecl *CanonPVD = PVD->getCanonicalDecl();
4852         if (FD->getNumParams() > PVD->getFunctionScopeIndex() &&
4853             FD->getParamDecl(PVD->getFunctionScopeIndex())
4854                     ->getCanonicalDecl() == CanonPVD) {
4855           // OpenMP  [2.15.3.7, linear Clause, Restrictions]
4856           // A list-item cannot appear in more than one linear clause.
4857           if (LinearArgs.count(CanonPVD) > 0) {
4858             Diag(E->getExprLoc(), diag::err_omp_wrong_dsa)
4859                 << getOpenMPClauseName(OMPC_linear)
4860                 << getOpenMPClauseName(OMPC_linear) << E->getSourceRange();
4861             Diag(LinearArgs[CanonPVD]->getExprLoc(),
4862                  diag::note_omp_explicit_dsa)
4863                 << getOpenMPClauseName(OMPC_linear);
4864             continue;
4865           }
4866           // Each argument can appear in at most one uniform or linear clause.
4867           if (UniformedArgs.count(CanonPVD) > 0) {
4868             Diag(E->getExprLoc(), diag::err_omp_wrong_dsa)
4869                 << getOpenMPClauseName(OMPC_linear)
4870                 << getOpenMPClauseName(OMPC_uniform) << E->getSourceRange();
4871             Diag(UniformedArgs[CanonPVD]->getExprLoc(),
4872                  diag::note_omp_explicit_dsa)
4873                 << getOpenMPClauseName(OMPC_uniform);
4874             continue;
4875           }
4876           LinearArgs[CanonPVD] = E;
4877           if (E->isValueDependent() || E->isTypeDependent() ||
4878               E->isInstantiationDependent() ||
4879               E->containsUnexpandedParameterPack())
4880             continue;
4881           (void)CheckOpenMPLinearDecl(CanonPVD, E->getExprLoc(), LinKind,
4882                                       PVD->getOriginalType());
4883           continue;
4884         }
4885       }
4886     if (isa<CXXThisExpr>(E)) {
4887       if (UniformedLinearThis) {
4888         Diag(E->getExprLoc(), diag::err_omp_wrong_dsa)
4889             << getOpenMPClauseName(OMPC_linear)
4890             << getOpenMPClauseName(IsUniformedThis ? OMPC_uniform : OMPC_linear)
4891             << E->getSourceRange();
4892         Diag(UniformedLinearThis->getExprLoc(), diag::note_omp_explicit_dsa)
4893             << getOpenMPClauseName(IsUniformedThis ? OMPC_uniform
4894                                                    : OMPC_linear);
4895         continue;
4896       }
4897       UniformedLinearThis = E;
4898       if (E->isValueDependent() || E->isTypeDependent() ||
4899           E->isInstantiationDependent() || E->containsUnexpandedParameterPack())
4900         continue;
4901       (void)CheckOpenMPLinearDecl(/*D=*/nullptr, E->getExprLoc(), LinKind,
4902                                   E->getType());
4903       continue;
4904     }
4905     Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause)
4906         << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);
4907   }
4908   Expr *Step = nullptr;
4909   Expr *NewStep = nullptr;
4910   SmallVector<Expr *, 4> NewSteps;
4911   for (Expr *E : Steps) {
4912     // Skip the same step expression, it was checked already.
4913     if (Step == E || !E) {
4914       NewSteps.push_back(E ? NewStep : nullptr);
4915       continue;
4916     }
4917     Step = E;
4918     if (const auto *DRE = dyn_cast<DeclRefExpr>(Step))
4919       if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
4920         const VarDecl *CanonPVD = PVD->getCanonicalDecl();
4921         if (UniformedArgs.count(CanonPVD) == 0) {
4922           Diag(Step->getExprLoc(), diag::err_omp_expected_uniform_param)
4923               << Step->getSourceRange();
4924         } else if (E->isValueDependent() || E->isTypeDependent() ||
4925                    E->isInstantiationDependent() ||
4926                    E->containsUnexpandedParameterPack() ||
4927                    CanonPVD->getType()->hasIntegerRepresentation()) {
4928           NewSteps.push_back(Step);
4929         } else {
4930           Diag(Step->getExprLoc(), diag::err_omp_expected_int_param)
4931               << Step->getSourceRange();
4932         }
4933         continue;
4934       }
4935     NewStep = Step;
4936     if (Step && !Step->isValueDependent() && !Step->isTypeDependent() &&
4937         !Step->isInstantiationDependent() &&
4938         !Step->containsUnexpandedParameterPack()) {
4939       NewStep = PerformOpenMPImplicitIntegerConversion(Step->getExprLoc(), Step)
4940                     .get();
4941       if (NewStep)
4942         NewStep = VerifyIntegerConstantExpression(NewStep).get();
4943     }
4944     NewSteps.push_back(NewStep);
4945   }
4946   auto *NewAttr = OMPDeclareSimdDeclAttr::CreateImplicit(
4947       Context, BS, SL.get(), const_cast<Expr **>(Uniforms.data()),
4948       Uniforms.size(), const_cast<Expr **>(Aligneds.data()), Aligneds.size(),
4949       const_cast<Expr **>(NewAligns.data()), NewAligns.size(),
4950       const_cast<Expr **>(Linears.data()), Linears.size(),
4951       const_cast<unsigned *>(LinModifiers.data()), LinModifiers.size(),
4952       NewSteps.data(), NewSteps.size(), SR);
4953   ADecl->addAttr(NewAttr);
4954   return DG;
4955 }
4956 
4957 Optional<std::pair<FunctionDecl *, Expr *>>
4958 Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG,
4959                                         Expr *VariantRef, SourceRange SR) {
4960   if (!DG || DG.get().isNull())
4961     return None;
4962 
4963   const int VariantId = 1;
4964   // Must be applied only to single decl.
4965   if (!DG.get().isSingleDecl()) {
4966     Diag(SR.getBegin(), diag::err_omp_single_decl_in_declare_simd_variant)
4967         << VariantId << SR;
4968     return None;
4969   }
4970   Decl *ADecl = DG.get().getSingleDecl();
4971   if (auto *FTD = dyn_cast<FunctionTemplateDecl>(ADecl))
4972     ADecl = FTD->getTemplatedDecl();
4973 
4974   // Decl must be a function.
4975   auto *FD = dyn_cast<FunctionDecl>(ADecl);
4976   if (!FD) {
4977     Diag(ADecl->getLocation(), diag::err_omp_function_expected)
4978         << VariantId << SR;
4979     return None;
4980   }
4981 
4982   auto &&HasMultiVersionAttributes = [](const FunctionDecl *FD) {
4983     return FD->hasAttrs() &&
4984            (FD->hasAttr<CPUDispatchAttr>() || FD->hasAttr<CPUSpecificAttr>() ||
4985             FD->hasAttr<TargetAttr>());
4986   };
4987   // OpenMP is not compatible with CPU-specific attributes.
4988   if (HasMultiVersionAttributes(FD)) {
4989     Diag(FD->getLocation(), diag::err_omp_declare_variant_incompat_attributes)
4990         << SR;
4991     return None;
4992   }
4993 
4994   // Allow #pragma omp declare variant only if the function is not used.
4995   if (FD->isUsed(false))
4996     Diag(SR.getBegin(), diag::warn_omp_declare_variant_after_used)
4997         << FD->getLocation();
4998 
4999   // Check if the function was emitted already.
5000   const FunctionDecl *Definition;
5001   if (!FD->isThisDeclarationADefinition() && FD->isDefined(Definition) &&
5002       (LangOpts.EmitAllDecls || Context.DeclMustBeEmitted(Definition)))
5003     Diag(SR.getBegin(), diag::warn_omp_declare_variant_after_emitted)
5004         << FD->getLocation();
5005 
5006   // The VariantRef must point to function.
5007   if (!VariantRef) {
5008     Diag(SR.getBegin(), diag::err_omp_function_expected) << VariantId;
5009     return None;
5010   }
5011 
5012   // Do not check templates, wait until instantiation.
5013   if (VariantRef->isTypeDependent() || VariantRef->isValueDependent() ||
5014       VariantRef->containsUnexpandedParameterPack() ||
5015       VariantRef->isInstantiationDependent() || FD->isDependentContext())
5016     return std::make_pair(FD, VariantRef);
5017 
5018   // Convert VariantRef expression to the type of the original function to
5019   // resolve possible conflicts.
5020   ExprResult VariantRefCast;
5021   if (LangOpts.CPlusPlus) {
5022     QualType FnPtrType;
5023     auto *Method = dyn_cast<CXXMethodDecl>(FD);
5024     if (Method && !Method->isStatic()) {
5025       const Type *ClassType =
5026           Context.getTypeDeclType(Method->getParent()).getTypePtr();
5027       FnPtrType = Context.getMemberPointerType(FD->getType(), ClassType);
5028       ExprResult ER;
5029       {
5030         // Build adrr_of unary op to correctly handle type checks for member
5031         // functions.
5032         Sema::TentativeAnalysisScope Trap(*this);
5033         ER = CreateBuiltinUnaryOp(VariantRef->getBeginLoc(), UO_AddrOf,
5034                                   VariantRef);
5035       }
5036       if (!ER.isUsable()) {
5037         Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected)
5038             << VariantId << VariantRef->getSourceRange();
5039         return None;
5040       }
5041       VariantRef = ER.get();
5042     } else {
5043       FnPtrType = Context.getPointerType(FD->getType());
5044     }
5045     ImplicitConversionSequence ICS =
5046         TryImplicitConversion(VariantRef, FnPtrType.getUnqualifiedType(),
5047                               /*SuppressUserConversions=*/false,
5048                               /*AllowExplicit=*/false,
5049                               /*InOverloadResolution=*/false,
5050                               /*CStyle=*/false,
5051                               /*AllowObjCWritebackConversion=*/false);
5052     if (ICS.isFailure()) {
5053       Diag(VariantRef->getExprLoc(),
5054            diag::err_omp_declare_variant_incompat_types)
5055           << VariantRef->getType() << FnPtrType << VariantRef->getSourceRange();
5056       return None;
5057     }
5058     VariantRefCast = PerformImplicitConversion(
5059         VariantRef, FnPtrType.getUnqualifiedType(), AA_Converting);
5060     if (!VariantRefCast.isUsable())
5061       return None;
5062     // Drop previously built artificial addr_of unary op for member functions.
5063     if (Method && !Method->isStatic()) {
5064       Expr *PossibleAddrOfVariantRef = VariantRefCast.get();
5065       if (auto *UO = dyn_cast<UnaryOperator>(
5066               PossibleAddrOfVariantRef->IgnoreImplicit()))
5067         VariantRefCast = UO->getSubExpr();
5068     }
5069   } else {
5070     VariantRefCast = VariantRef;
5071   }
5072 
5073   ExprResult ER = CheckPlaceholderExpr(VariantRefCast.get());
5074   if (!ER.isUsable() ||
5075       !ER.get()->IgnoreParenImpCasts()->getType()->isFunctionType()) {
5076     Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected)
5077         << VariantId << VariantRef->getSourceRange();
5078     return None;
5079   }
5080 
5081   // The VariantRef must point to function.
5082   auto *DRE = dyn_cast<DeclRefExpr>(ER.get()->IgnoreParenImpCasts());
5083   if (!DRE) {
5084     Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected)
5085         << VariantId << VariantRef->getSourceRange();
5086     return None;
5087   }
5088   auto *NewFD = dyn_cast_or_null<FunctionDecl>(DRE->getDecl());
5089   if (!NewFD) {
5090     Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected)
5091         << VariantId << VariantRef->getSourceRange();
5092     return None;
5093   }
5094 
5095   // Check if variant function is not marked with declare variant directive.
5096   if (NewFD->hasAttrs() && NewFD->hasAttr<OMPDeclareVariantAttr>()) {
5097     Diag(VariantRef->getExprLoc(),
5098          diag::warn_omp_declare_variant_marked_as_declare_variant)
5099         << VariantRef->getSourceRange();
5100     SourceRange SR =
5101         NewFD->specific_attr_begin<OMPDeclareVariantAttr>()->getRange();
5102     Diag(SR.getBegin(), diag::note_omp_marked_declare_variant_here) << SR;
5103     return None;
5104   }
5105 
5106   enum DoesntSupport {
5107     VirtFuncs = 1,
5108     Constructors = 3,
5109     Destructors = 4,
5110     DeletedFuncs = 5,
5111     DefaultedFuncs = 6,
5112     ConstexprFuncs = 7,
5113     ConstevalFuncs = 8,
5114   };
5115   if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(FD)) {
5116     if (CXXFD->isVirtual()) {
5117       Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5118           << VirtFuncs;
5119       return None;
5120     }
5121 
5122     if (isa<CXXConstructorDecl>(FD)) {
5123       Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5124           << Constructors;
5125       return None;
5126     }
5127 
5128     if (isa<CXXDestructorDecl>(FD)) {
5129       Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5130           << Destructors;
5131       return None;
5132     }
5133   }
5134 
5135   if (FD->isDeleted()) {
5136     Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5137         << DeletedFuncs;
5138     return None;
5139   }
5140 
5141   if (FD->isDefaulted()) {
5142     Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5143         << DefaultedFuncs;
5144     return None;
5145   }
5146 
5147   if (FD->isConstexpr()) {
5148     Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support)
5149         << (NewFD->isConsteval() ? ConstevalFuncs : ConstexprFuncs);
5150     return None;
5151   }
5152 
5153   // Check general compatibility.
5154   if (areMultiversionVariantFunctionsCompatible(
5155           FD, NewFD, PDiag(diag::err_omp_declare_variant_noproto),
5156           PartialDiagnosticAt(
5157               SR.getBegin(),
5158               PDiag(diag::note_omp_declare_variant_specified_here) << SR),
5159           PartialDiagnosticAt(
5160               VariantRef->getExprLoc(),
5161               PDiag(diag::err_omp_declare_variant_doesnt_support)),
5162           PartialDiagnosticAt(VariantRef->getExprLoc(),
5163                               PDiag(diag::err_omp_declare_variant_diff)
5164                                   << FD->getLocation()),
5165           /*TemplatesSupported=*/true, /*ConstexprSupported=*/false,
5166           /*CLinkageMayDiffer=*/true))
5167     return None;
5168   return std::make_pair(FD, cast<Expr>(DRE));
5169 }
5170 
5171 void Sema::ActOnOpenMPDeclareVariantDirective(
5172     FunctionDecl *FD, Expr *VariantRef, SourceRange SR,
5173     const Sema::OpenMPDeclareVariantCtsSelectorData &Data) {
5174   if (Data.CtxSet == OMPDeclareVariantAttr::CtxSetUnknown ||
5175       Data.Ctx == OMPDeclareVariantAttr::CtxUnknown)
5176     return;
5177   Expr *Score = nullptr;
5178   OMPDeclareVariantAttr::ScoreType ST = OMPDeclareVariantAttr::ScoreUnknown;
5179   if (Data.CtxScore.isUsable()) {
5180     ST = OMPDeclareVariantAttr::ScoreSpecified;
5181     Score = Data.CtxScore.get();
5182     if (!Score->isTypeDependent() && !Score->isValueDependent() &&
5183         !Score->isInstantiationDependent() &&
5184         !Score->containsUnexpandedParameterPack()) {
5185       llvm::APSInt Result;
5186       ExprResult ICE = VerifyIntegerConstantExpression(Score, &Result);
5187       if (ICE.isInvalid())
5188         return;
5189     }
5190   }
5191   auto *NewAttr = OMPDeclareVariantAttr::CreateImplicit(
5192       Context, VariantRef, Score, Data.CtxSet, ST, Data.Ctx,
5193       Data.ImplVendors.begin(), Data.ImplVendors.size(), SR);
5194   FD->addAttr(NewAttr);
5195 }
5196 
5197 void Sema::markOpenMPDeclareVariantFuncsReferenced(SourceLocation Loc,
5198                                                    FunctionDecl *Func,
5199                                                    bool MightBeOdrUse) {
5200   assert(LangOpts.OpenMP && "Expected OpenMP mode.");
5201 
5202   if (!Func->isDependentContext() && Func->hasAttrs()) {
5203     for (OMPDeclareVariantAttr *A :
5204          Func->specific_attrs<OMPDeclareVariantAttr>()) {
5205       // TODO: add checks for active OpenMP context where possible.
5206       Expr *VariantRef = A->getVariantFuncRef();
5207       auto *DRE = dyn_cast<DeclRefExpr>(VariantRef->IgnoreParenImpCasts());
5208       auto *F = cast<FunctionDecl>(DRE->getDecl());
5209       if (!F->isDefined() && F->isTemplateInstantiation())
5210         InstantiateFunctionDefinition(Loc, F->getFirstDecl());
5211       MarkFunctionReferenced(Loc, F, MightBeOdrUse);
5212     }
5213   }
5214 }
5215 
5216 StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
5217                                               Stmt *AStmt,
5218                                               SourceLocation StartLoc,
5219                                               SourceLocation EndLoc) {
5220   if (!AStmt)
5221     return StmtError();
5222 
5223   auto *CS = cast<CapturedStmt>(AStmt);
5224   // 1.2.2 OpenMP Language Terminology
5225   // Structured block - An executable statement with a single entry at the
5226   // top and a single exit at the bottom.
5227   // The point of exit cannot be a branch out of the structured block.
5228   // longjmp() and throw() must not violate the entry/exit criteria.
5229   CS->getCapturedDecl()->setNothrow();
5230 
5231   setFunctionHasBranchProtectedScope();
5232 
5233   return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
5234                                       DSAStack->isCancelRegion());
5235 }
5236 
5237 namespace {
5238 /// Iteration space of a single for loop.
5239 struct LoopIterationSpace final {
5240   /// True if the condition operator is the strict compare operator (<, > or
5241   /// !=).
5242   bool IsStrictCompare = false;
5243   /// Condition of the loop.
5244   Expr *PreCond = nullptr;
5245   /// This expression calculates the number of iterations in the loop.
5246   /// It is always possible to calculate it before starting the loop.
5247   Expr *NumIterations = nullptr;
5248   /// The loop counter variable.
5249   Expr *CounterVar = nullptr;
5250   /// Private loop counter variable.
5251   Expr *PrivateCounterVar = nullptr;
5252   /// This is initializer for the initial value of #CounterVar.
5253   Expr *CounterInit = nullptr;
5254   /// This is step for the #CounterVar used to generate its update:
5255   /// #CounterVar = #CounterInit + #CounterStep * CurrentIteration.
5256   Expr *CounterStep = nullptr;
5257   /// Should step be subtracted?
5258   bool Subtract = false;
5259   /// Source range of the loop init.
5260   SourceRange InitSrcRange;
5261   /// Source range of the loop condition.
5262   SourceRange CondSrcRange;
5263   /// Source range of the loop increment.
5264   SourceRange IncSrcRange;
5265   /// Minimum value that can have the loop control variable. Used to support
5266   /// non-rectangular loops. Applied only for LCV with the non-iterator types,
5267   /// since only such variables can be used in non-loop invariant expressions.
5268   Expr *MinValue = nullptr;
5269   /// Maximum value that can have the loop control variable. Used to support
5270   /// non-rectangular loops. Applied only for LCV with the non-iterator type,
5271   /// since only such variables can be used in non-loop invariant expressions.
5272   Expr *MaxValue = nullptr;
5273   /// true, if the lower bound depends on the outer loop control var.
5274   bool IsNonRectangularLB = false;
5275   /// true, if the upper bound depends on the outer loop control var.
5276   bool IsNonRectangularUB = false;
5277   /// Index of the loop this loop depends on and forms non-rectangular loop
5278   /// nest.
5279   unsigned LoopDependentIdx = 0;
5280   /// Final condition for the non-rectangular loop nest support. It is used to
5281   /// check that the number of iterations for this particular counter must be
5282   /// finished.
5283   Expr *FinalCondition = nullptr;
5284 };
5285 
5286 /// Helper class for checking canonical form of the OpenMP loops and
5287 /// extracting iteration space of each loop in the loop nest, that will be used
5288 /// for IR generation.
5289 class OpenMPIterationSpaceChecker {
5290   /// Reference to Sema.
5291   Sema &SemaRef;
5292   /// Data-sharing stack.
5293   DSAStackTy &Stack;
5294   /// A location for diagnostics (when there is no some better location).
5295   SourceLocation DefaultLoc;
5296   /// A location for diagnostics (when increment is not compatible).
5297   SourceLocation ConditionLoc;
5298   /// A source location for referring to loop init later.
5299   SourceRange InitSrcRange;
5300   /// A source location for referring to condition later.
5301   SourceRange ConditionSrcRange;
5302   /// A source location for referring to increment later.
5303   SourceRange IncrementSrcRange;
5304   /// Loop variable.
5305   ValueDecl *LCDecl = nullptr;
5306   /// Reference to loop variable.
5307   Expr *LCRef = nullptr;
5308   /// Lower bound (initializer for the var).
5309   Expr *LB = nullptr;
5310   /// Upper bound.
5311   Expr *UB = nullptr;
5312   /// Loop step (increment).
5313   Expr *Step = nullptr;
5314   /// This flag is true when condition is one of:
5315   ///   Var <  UB
5316   ///   Var <= UB
5317   ///   UB  >  Var
5318   ///   UB  >= Var
5319   /// This will have no value when the condition is !=
5320   llvm::Optional<bool> TestIsLessOp;
5321   /// This flag is true when condition is strict ( < or > ).
5322   bool TestIsStrictOp = false;
5323   /// This flag is true when step is subtracted on each iteration.
5324   bool SubtractStep = false;
5325   /// The outer loop counter this loop depends on (if any).
5326   const ValueDecl *DepDecl = nullptr;
5327   /// Contains number of loop (starts from 1) on which loop counter init
5328   /// expression of this loop depends on.
5329   Optional<unsigned> InitDependOnLC;
5330   /// Contains number of loop (starts from 1) on which loop counter condition
5331   /// expression of this loop depends on.
5332   Optional<unsigned> CondDependOnLC;
5333   /// Checks if the provide statement depends on the loop counter.
5334   Optional<unsigned> doesDependOnLoopCounter(const Stmt *S, bool IsInitializer);
5335   /// Original condition required for checking of the exit condition for
5336   /// non-rectangular loop.
5337   Expr *Condition = nullptr;
5338 
5339 public:
5340   OpenMPIterationSpaceChecker(Sema &SemaRef, DSAStackTy &Stack,
5341                               SourceLocation DefaultLoc)
5342       : SemaRef(SemaRef), Stack(Stack), DefaultLoc(DefaultLoc),
5343         ConditionLoc(DefaultLoc) {}
5344   /// Check init-expr for canonical loop form and save loop counter
5345   /// variable - #Var and its initialization value - #LB.
5346   bool checkAndSetInit(Stmt *S, bool EmitDiags = true);
5347   /// Check test-expr for canonical form, save upper-bound (#UB), flags
5348   /// for less/greater and for strict/non-strict comparison.
5349   bool checkAndSetCond(Expr *S);
5350   /// Check incr-expr for canonical loop form and return true if it
5351   /// does not conform, otherwise save loop step (#Step).
5352   bool checkAndSetInc(Expr *S);
5353   /// Return the loop counter variable.
5354   ValueDecl *getLoopDecl() const { return LCDecl; }
5355   /// Return the reference expression to loop counter variable.
5356   Expr *getLoopDeclRefExpr() const { return LCRef; }
5357   /// Source range of the loop init.
5358   SourceRange getInitSrcRange() const { return InitSrcRange; }
5359   /// Source range of the loop condition.
5360   SourceRange getConditionSrcRange() const { return ConditionSrcRange; }
5361   /// Source range of the loop increment.
5362   SourceRange getIncrementSrcRange() const { return IncrementSrcRange; }
5363   /// True if the step should be subtracted.
5364   bool shouldSubtractStep() const { return SubtractStep; }
5365   /// True, if the compare operator is strict (<, > or !=).
5366   bool isStrictTestOp() const { return TestIsStrictOp; }
5367   /// Build the expression to calculate the number of iterations.
5368   Expr *buildNumIterations(
5369       Scope *S, ArrayRef<LoopIterationSpace> ResultIterSpaces, bool LimitedType,
5370       llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const;
5371   /// Build the precondition expression for the loops.
5372   Expr *
5373   buildPreCond(Scope *S, Expr *Cond,
5374                llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const;
5375   /// Build reference expression to the counter be used for codegen.
5376   DeclRefExpr *
5377   buildCounterVar(llvm::MapVector<const Expr *, DeclRefExpr *> &Captures,
5378                   DSAStackTy &DSA) const;
5379   /// Build reference expression to the private counter be used for
5380   /// codegen.
5381   Expr *buildPrivateCounterVar() const;
5382   /// Build initialization of the counter be used for codegen.
5383   Expr *buildCounterInit() const;
5384   /// Build step of the counter be used for codegen.
5385   Expr *buildCounterStep() const;
5386   /// Build loop data with counter value for depend clauses in ordered
5387   /// directives.
5388   Expr *
5389   buildOrderedLoopData(Scope *S, Expr *Counter,
5390                        llvm::MapVector<const Expr *, DeclRefExpr *> &Captures,
5391                        SourceLocation Loc, Expr *Inc = nullptr,
5392                        OverloadedOperatorKind OOK = OO_Amp);
5393   /// Builds the minimum value for the loop counter.
5394   std::pair<Expr *, Expr *> buildMinMaxValues(
5395       Scope *S, llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const;
5396   /// Builds final condition for the non-rectangular loops.
5397   Expr *buildFinalCondition(Scope *S) const;
5398   /// Return true if any expression is dependent.
5399   bool dependent() const;
5400   /// Returns true if the initializer forms non-rectangular loop.
5401   bool doesInitDependOnLC() const { return InitDependOnLC.hasValue(); }
5402   /// Returns true if the condition forms non-rectangular loop.
5403   bool doesCondDependOnLC() const { return CondDependOnLC.hasValue(); }
5404   /// Returns index of the loop we depend on (starting from 1), or 0 otherwise.
5405   unsigned getLoopDependentIdx() const {
5406     return InitDependOnLC.getValueOr(CondDependOnLC.getValueOr(0));
5407   }
5408 
5409 private:
5410   /// Check the right-hand side of an assignment in the increment
5411   /// expression.
5412   bool checkAndSetIncRHS(Expr *RHS);
5413   /// Helper to set loop counter variable and its initializer.
5414   bool setLCDeclAndLB(ValueDecl *NewLCDecl, Expr *NewDeclRefExpr, Expr *NewLB,
5415                       bool EmitDiags);
5416   /// Helper to set upper bound.
5417   bool setUB(Expr *NewUB, llvm::Optional<bool> LessOp, bool StrictOp,
5418              SourceRange SR, SourceLocation SL);
5419   /// Helper to set loop increment.
5420   bool setStep(Expr *NewStep, bool Subtract);
5421 };
5422 
5423 bool OpenMPIterationSpaceChecker::dependent() const {
5424   if (!LCDecl) {
5425     assert(!LB && !UB && !Step);
5426     return false;
5427   }
5428   return LCDecl->getType()->isDependentType() ||
5429          (LB && LB->isValueDependent()) || (UB && UB->isValueDependent()) ||
5430          (Step && Step->isValueDependent());
5431 }
5432 
5433 bool OpenMPIterationSpaceChecker::setLCDeclAndLB(ValueDecl *NewLCDecl,
5434                                                  Expr *NewLCRefExpr,
5435                                                  Expr *NewLB, bool EmitDiags) {
5436   // State consistency checking to ensure correct usage.
5437   assert(LCDecl == nullptr && LB == nullptr && LCRef == nullptr &&
5438          UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp);
5439   if (!NewLCDecl || !NewLB)
5440     return true;
5441   LCDecl = getCanonicalDecl(NewLCDecl);
5442   LCRef = NewLCRefExpr;
5443   if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(NewLB))
5444     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
5445       if ((Ctor->isCopyOrMoveConstructor() ||
5446            Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) &&
5447           CE->getNumArgs() > 0 && CE->getArg(0) != nullptr)
5448         NewLB = CE->getArg(0)->IgnoreParenImpCasts();
5449   LB = NewLB;
5450   if (EmitDiags)
5451     InitDependOnLC = doesDependOnLoopCounter(LB, /*IsInitializer=*/true);
5452   return false;
5453 }
5454 
5455 bool OpenMPIterationSpaceChecker::setUB(Expr *NewUB,
5456                                         llvm::Optional<bool> LessOp,
5457                                         bool StrictOp, SourceRange SR,
5458                                         SourceLocation SL) {
5459   // State consistency checking to ensure correct usage.
5460   assert(LCDecl != nullptr && LB != nullptr && UB == nullptr &&
5461          Step == nullptr && !TestIsLessOp && !TestIsStrictOp);
5462   if (!NewUB)
5463     return true;
5464   UB = NewUB;
5465   if (LessOp)
5466     TestIsLessOp = LessOp;
5467   TestIsStrictOp = StrictOp;
5468   ConditionSrcRange = SR;
5469   ConditionLoc = SL;
5470   CondDependOnLC = doesDependOnLoopCounter(UB, /*IsInitializer=*/false);
5471   return false;
5472 }
5473 
5474 bool OpenMPIterationSpaceChecker::setStep(Expr *NewStep, bool Subtract) {
5475   // State consistency checking to ensure correct usage.
5476   assert(LCDecl != nullptr && LB != nullptr && Step == nullptr);
5477   if (!NewStep)
5478     return true;
5479   if (!NewStep->isValueDependent()) {
5480     // Check that the step is integer expression.
5481     SourceLocation StepLoc = NewStep->getBeginLoc();
5482     ExprResult Val = SemaRef.PerformOpenMPImplicitIntegerConversion(
5483         StepLoc, getExprAsWritten(NewStep));
5484     if (Val.isInvalid())
5485       return true;
5486     NewStep = Val.get();
5487 
5488     // OpenMP [2.6, Canonical Loop Form, Restrictions]
5489     //  If test-expr is of form var relational-op b and relational-op is < or
5490     //  <= then incr-expr must cause var to increase on each iteration of the
5491     //  loop. If test-expr is of form var relational-op b and relational-op is
5492     //  > or >= then incr-expr must cause var to decrease on each iteration of
5493     //  the loop.
5494     //  If test-expr is of form b relational-op var and relational-op is < or
5495     //  <= then incr-expr must cause var to decrease on each iteration of the
5496     //  loop. If test-expr is of form b relational-op var and relational-op is
5497     //  > or >= then incr-expr must cause var to increase on each iteration of
5498     //  the loop.
5499     llvm::APSInt Result;
5500     bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context);
5501     bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation();
5502     bool IsConstNeg =
5503         IsConstant && Result.isSigned() && (Subtract != Result.isNegative());
5504     bool IsConstPos =
5505         IsConstant && Result.isSigned() && (Subtract == Result.isNegative());
5506     bool IsConstZero = IsConstant && !Result.getBoolValue();
5507 
5508     // != with increment is treated as <; != with decrement is treated as >
5509     if (!TestIsLessOp.hasValue())
5510       TestIsLessOp = IsConstPos || (IsUnsigned && !Subtract);
5511     if (UB && (IsConstZero ||
5512                (TestIsLessOp.getValue() ?
5513                   (IsConstNeg || (IsUnsigned && Subtract)) :
5514                   (IsConstPos || (IsUnsigned && !Subtract))))) {
5515       SemaRef.Diag(NewStep->getExprLoc(),
5516                    diag::err_omp_loop_incr_not_compatible)
5517           << LCDecl << TestIsLessOp.getValue() << NewStep->getSourceRange();
5518       SemaRef.Diag(ConditionLoc,
5519                    diag::note_omp_loop_cond_requres_compatible_incr)
5520           << TestIsLessOp.getValue() << ConditionSrcRange;
5521       return true;
5522     }
5523     if (TestIsLessOp.getValue() == Subtract) {
5524       NewStep =
5525           SemaRef.CreateBuiltinUnaryOp(NewStep->getExprLoc(), UO_Minus, NewStep)
5526               .get();
5527       Subtract = !Subtract;
5528     }
5529   }
5530 
5531   Step = NewStep;
5532   SubtractStep = Subtract;
5533   return false;
5534 }
5535 
5536 namespace {
5537 /// Checker for the non-rectangular loops. Checks if the initializer or
5538 /// condition expression references loop counter variable.
5539 class LoopCounterRefChecker final
5540     : public ConstStmtVisitor<LoopCounterRefChecker, bool> {
5541   Sema &SemaRef;
5542   DSAStackTy &Stack;
5543   const ValueDecl *CurLCDecl = nullptr;
5544   const ValueDecl *DepDecl = nullptr;
5545   const ValueDecl *PrevDepDecl = nullptr;
5546   bool IsInitializer = true;
5547   unsigned BaseLoopId = 0;
5548   bool checkDecl(const Expr *E, const ValueDecl *VD) {
5549     if (getCanonicalDecl(VD) == getCanonicalDecl(CurLCDecl)) {
5550       SemaRef.Diag(E->getExprLoc(), diag::err_omp_stmt_depends_on_loop_counter)
5551           << (IsInitializer ? 0 : 1);
5552       return false;
5553     }
5554     const auto &&Data = Stack.isLoopControlVariable(VD);
5555     // OpenMP, 2.9.1 Canonical Loop Form, Restrictions.
5556     // The type of the loop iterator on which we depend may not have a random
5557     // access iterator type.
5558     if (Data.first && VD->getType()->isRecordType()) {
5559       SmallString<128> Name;
5560       llvm::raw_svector_ostream OS(Name);
5561       VD->getNameForDiagnostic(OS, SemaRef.getPrintingPolicy(),
5562                                /*Qualified=*/true);
5563       SemaRef.Diag(E->getExprLoc(),
5564                    diag::err_omp_wrong_dependency_iterator_type)
5565           << OS.str();
5566       SemaRef.Diag(VD->getLocation(), diag::note_previous_decl) << VD;
5567       return false;
5568     }
5569     if (Data.first &&
5570         (DepDecl || (PrevDepDecl &&
5571                      getCanonicalDecl(VD) != getCanonicalDecl(PrevDepDecl)))) {
5572       if (!DepDecl && PrevDepDecl)
5573         DepDecl = PrevDepDecl;
5574       SmallString<128> Name;
5575       llvm::raw_svector_ostream OS(Name);
5576       DepDecl->getNameForDiagnostic(OS, SemaRef.getPrintingPolicy(),
5577                                     /*Qualified=*/true);
5578       SemaRef.Diag(E->getExprLoc(),
5579                    diag::err_omp_invariant_or_linear_dependency)
5580           << OS.str();
5581       return false;
5582     }
5583     if (Data.first) {
5584       DepDecl = VD;
5585       BaseLoopId = Data.first;
5586     }
5587     return Data.first;
5588   }
5589 
5590 public:
5591   bool VisitDeclRefExpr(const DeclRefExpr *E) {
5592     const ValueDecl *VD = E->getDecl();
5593     if (isa<VarDecl>(VD))
5594       return checkDecl(E, VD);
5595     return false;
5596   }
5597   bool VisitMemberExpr(const MemberExpr *E) {
5598     if (isa<CXXThisExpr>(E->getBase()->IgnoreParens())) {
5599       const ValueDecl *VD = E->getMemberDecl();
5600       if (isa<VarDecl>(VD) || isa<FieldDecl>(VD))
5601         return checkDecl(E, VD);
5602     }
5603     return false;
5604   }
5605   bool VisitStmt(const Stmt *S) {
5606     bool Res = false;
5607     for (const Stmt *Child : S->children())
5608       Res = (Child && Visit(Child)) || Res;
5609     return Res;
5610   }
5611   explicit LoopCounterRefChecker(Sema &SemaRef, DSAStackTy &Stack,
5612                                  const ValueDecl *CurLCDecl, bool IsInitializer,
5613                                  const ValueDecl *PrevDepDecl = nullptr)
5614       : SemaRef(SemaRef), Stack(Stack), CurLCDecl(CurLCDecl),
5615         PrevDepDecl(PrevDepDecl), IsInitializer(IsInitializer) {}
5616   unsigned getBaseLoopId() const {
5617     assert(CurLCDecl && "Expected loop dependency.");
5618     return BaseLoopId;
5619   }
5620   const ValueDecl *getDepDecl() const {
5621     assert(CurLCDecl && "Expected loop dependency.");
5622     return DepDecl;
5623   }
5624 };
5625 } // namespace
5626 
5627 Optional<unsigned>
5628 OpenMPIterationSpaceChecker::doesDependOnLoopCounter(const Stmt *S,
5629                                                      bool IsInitializer) {
5630   // Check for the non-rectangular loops.
5631   LoopCounterRefChecker LoopStmtChecker(SemaRef, Stack, LCDecl, IsInitializer,
5632                                         DepDecl);
5633   if (LoopStmtChecker.Visit(S)) {
5634     DepDecl = LoopStmtChecker.getDepDecl();
5635     return LoopStmtChecker.getBaseLoopId();
5636   }
5637   return llvm::None;
5638 }
5639 
5640 bool OpenMPIterationSpaceChecker::checkAndSetInit(Stmt *S, bool EmitDiags) {
5641   // Check init-expr for canonical loop form and save loop counter
5642   // variable - #Var and its initialization value - #LB.
5643   // OpenMP [2.6] Canonical loop form. init-expr may be one of the following:
5644   //   var = lb
5645   //   integer-type var = lb
5646   //   random-access-iterator-type var = lb
5647   //   pointer-type var = lb
5648   //
5649   if (!S) {
5650     if (EmitDiags) {
5651       SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init);
5652     }
5653     return true;
5654   }
5655   if (auto *ExprTemp = dyn_cast<ExprWithCleanups>(S))
5656     if (!ExprTemp->cleanupsHaveSideEffects())
5657       S = ExprTemp->getSubExpr();
5658 
5659   InitSrcRange = S->getSourceRange();
5660   if (Expr *E = dyn_cast<Expr>(S))
5661     S = E->IgnoreParens();
5662   if (auto *BO = dyn_cast<BinaryOperator>(S)) {
5663     if (BO->getOpcode() == BO_Assign) {
5664       Expr *LHS = BO->getLHS()->IgnoreParens();
5665       if (auto *DRE = dyn_cast<DeclRefExpr>(LHS)) {
5666         if (auto *CED = dyn_cast<OMPCapturedExprDecl>(DRE->getDecl()))
5667           if (auto *ME = dyn_cast<MemberExpr>(getExprAsWritten(CED->getInit())))
5668             return setLCDeclAndLB(ME->getMemberDecl(), ME, BO->getRHS(),
5669                                   EmitDiags);
5670         return setLCDeclAndLB(DRE->getDecl(), DRE, BO->getRHS(), EmitDiags);
5671       }
5672       if (auto *ME = dyn_cast<MemberExpr>(LHS)) {
5673         if (ME->isArrow() &&
5674             isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()))
5675           return setLCDeclAndLB(ME->getMemberDecl(), ME, BO->getRHS(),
5676                                 EmitDiags);
5677       }
5678     }
5679   } else if (auto *DS = dyn_cast<DeclStmt>(S)) {
5680     if (DS->isSingleDecl()) {
5681       if (auto *Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) {
5682         if (Var->hasInit() && !Var->getType()->isReferenceType()) {
5683           // Accept non-canonical init form here but emit ext. warning.
5684           if (Var->getInitStyle() != VarDecl::CInit && EmitDiags)
5685             SemaRef.Diag(S->getBeginLoc(),
5686                          diag::ext_omp_loop_not_canonical_init)
5687                 << S->getSourceRange();
5688           return setLCDeclAndLB(
5689               Var,
5690               buildDeclRefExpr(SemaRef, Var,
5691                                Var->getType().getNonReferenceType(),
5692                                DS->getBeginLoc()),
5693               Var->getInit(), EmitDiags);
5694         }
5695       }
5696     }
5697   } else if (auto *CE = dyn_cast<CXXOperatorCallExpr>(S)) {
5698     if (CE->getOperator() == OO_Equal) {
5699       Expr *LHS = CE->getArg(0);
5700       if (auto *DRE = dyn_cast<DeclRefExpr>(LHS)) {
5701         if (auto *CED = dyn_cast<OMPCapturedExprDecl>(DRE->getDecl()))
5702           if (auto *ME = dyn_cast<MemberExpr>(getExprAsWritten(CED->getInit())))
5703             return setLCDeclAndLB(ME->getMemberDecl(), ME, BO->getRHS(),
5704                                   EmitDiags);
5705         return setLCDeclAndLB(DRE->getDecl(), DRE, CE->getArg(1), EmitDiags);
5706       }
5707       if (auto *ME = dyn_cast<MemberExpr>(LHS)) {
5708         if (ME->isArrow() &&
5709             isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()))
5710           return setLCDeclAndLB(ME->getMemberDecl(), ME, BO->getRHS(),
5711                                 EmitDiags);
5712       }
5713     }
5714   }
5715 
5716   if (dependent() || SemaRef.CurContext->isDependentContext())
5717     return false;
5718   if (EmitDiags) {
5719     SemaRef.Diag(S->getBeginLoc(), diag::err_omp_loop_not_canonical_init)
5720         << S->getSourceRange();
5721   }
5722   return true;
5723 }
5724 
5725 /// Ignore parenthesizes, implicit casts, copy constructor and return the
5726 /// variable (which may be the loop variable) if possible.
5727 static const ValueDecl *getInitLCDecl(const Expr *E) {
5728   if (!E)
5729     return nullptr;
5730   E = getExprAsWritten(E);
5731   if (const auto *CE = dyn_cast_or_null<CXXConstructExpr>(E))
5732     if (const CXXConstructorDecl *Ctor = CE->getConstructor())
5733       if ((Ctor->isCopyOrMoveConstructor() ||
5734            Ctor->isConvertingConstructor(/*AllowExplicit=*/false)) &&
5735           CE->getNumArgs() > 0 && CE->getArg(0) != nullptr)
5736         E = CE->getArg(0)->IgnoreParenImpCasts();
5737   if (const auto *DRE = dyn_cast_or_null<DeclRefExpr>(E)) {
5738     if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl()))
5739       return getCanonicalDecl(VD);
5740   }
5741   if (const auto *ME = dyn_cast_or_null<MemberExpr>(E))
5742     if (ME->isArrow() && isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()))
5743       return getCanonicalDecl(ME->getMemberDecl());
5744   return nullptr;
5745 }
5746 
5747 bool OpenMPIterationSpaceChecker::checkAndSetCond(Expr *S) {
5748   // Check test-expr for canonical form, save upper-bound UB, flags for
5749   // less/greater and for strict/non-strict comparison.
5750   // OpenMP [2.9] Canonical loop form. Test-expr may be one of the following:
5751   //   var relational-op b
5752   //   b relational-op var
5753   //
5754   bool IneqCondIsCanonical = SemaRef.getLangOpts().OpenMP >= 50;
5755   if (!S) {
5756     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond)
5757         << (IneqCondIsCanonical ? 1 : 0) << LCDecl;
5758     return true;
5759   }
5760   Condition = S;
5761   S = getExprAsWritten(S);
5762   SourceLocation CondLoc = S->getBeginLoc();
5763   if (auto *BO = dyn_cast<BinaryOperator>(S)) {
5764     if (BO->isRelationalOp()) {
5765       if (getInitLCDecl(BO->getLHS()) == LCDecl)
5766         return setUB(BO->getRHS(),
5767                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE),
5768                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
5769                      BO->getSourceRange(), BO->getOperatorLoc());
5770       if (getInitLCDecl(BO->getRHS()) == LCDecl)
5771         return setUB(BO->getLHS(),
5772                      (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE),
5773                      (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT),
5774                      BO->getSourceRange(), BO->getOperatorLoc());
5775     } else if (IneqCondIsCanonical && BO->getOpcode() == BO_NE)
5776       return setUB(
5777           getInitLCDecl(BO->getLHS()) == LCDecl ? BO->getRHS() : BO->getLHS(),
5778           /*LessOp=*/llvm::None,
5779           /*StrictOp=*/true, BO->getSourceRange(), BO->getOperatorLoc());
5780   } else if (auto *CE = dyn_cast<CXXOperatorCallExpr>(S)) {
5781     if (CE->getNumArgs() == 2) {
5782       auto Op = CE->getOperator();
5783       switch (Op) {
5784       case OO_Greater:
5785       case OO_GreaterEqual:
5786       case OO_Less:
5787       case OO_LessEqual:
5788         if (getInitLCDecl(CE->getArg(0)) == LCDecl)
5789           return setUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual,
5790                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
5791                        CE->getOperatorLoc());
5792         if (getInitLCDecl(CE->getArg(1)) == LCDecl)
5793           return setUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual,
5794                        Op == OO_Less || Op == OO_Greater, CE->getSourceRange(),
5795                        CE->getOperatorLoc());
5796         break;
5797       case OO_ExclaimEqual:
5798         if (IneqCondIsCanonical)
5799           return setUB(getInitLCDecl(CE->getArg(0)) == LCDecl ? CE->getArg(1)
5800                                                               : CE->getArg(0),
5801                        /*LessOp=*/llvm::None,
5802                        /*StrictOp=*/true, CE->getSourceRange(),
5803                        CE->getOperatorLoc());
5804         break;
5805       default:
5806         break;
5807       }
5808     }
5809   }
5810   if (dependent() || SemaRef.CurContext->isDependentContext())
5811     return false;
5812   SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond)
5813       << (IneqCondIsCanonical ? 1 : 0) << S->getSourceRange() << LCDecl;
5814   return true;
5815 }
5816 
5817 bool OpenMPIterationSpaceChecker::checkAndSetIncRHS(Expr *RHS) {
5818   // RHS of canonical loop form increment can be:
5819   //   var + incr
5820   //   incr + var
5821   //   var - incr
5822   //
5823   RHS = RHS->IgnoreParenImpCasts();
5824   if (auto *BO = dyn_cast<BinaryOperator>(RHS)) {
5825     if (BO->isAdditiveOp()) {
5826       bool IsAdd = BO->getOpcode() == BO_Add;
5827       if (getInitLCDecl(BO->getLHS()) == LCDecl)
5828         return setStep(BO->getRHS(), !IsAdd);
5829       if (IsAdd && getInitLCDecl(BO->getRHS()) == LCDecl)
5830         return setStep(BO->getLHS(), /*Subtract=*/false);
5831     }
5832   } else if (auto *CE = dyn_cast<CXXOperatorCallExpr>(RHS)) {
5833     bool IsAdd = CE->getOperator() == OO_Plus;
5834     if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) {
5835       if (getInitLCDecl(CE->getArg(0)) == LCDecl)
5836         return setStep(CE->getArg(1), !IsAdd);
5837       if (IsAdd && getInitLCDecl(CE->getArg(1)) == LCDecl)
5838         return setStep(CE->getArg(0), /*Subtract=*/false);
5839     }
5840   }
5841   if (dependent() || SemaRef.CurContext->isDependentContext())
5842     return false;
5843   SemaRef.Diag(RHS->getBeginLoc(), diag::err_omp_loop_not_canonical_incr)
5844       << RHS->getSourceRange() << LCDecl;
5845   return true;
5846 }
5847 
5848 bool OpenMPIterationSpaceChecker::checkAndSetInc(Expr *S) {
5849   // Check incr-expr for canonical loop form and return true if it
5850   // does not conform.
5851   // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:
5852   //   ++var
5853   //   var++
5854   //   --var
5855   //   var--
5856   //   var += incr
5857   //   var -= incr
5858   //   var = var + incr
5859   //   var = incr + var
5860   //   var = var - incr
5861   //
5862   if (!S) {
5863     SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << LCDecl;
5864     return true;
5865   }
5866   if (auto *ExprTemp = dyn_cast<ExprWithCleanups>(S))
5867     if (!ExprTemp->cleanupsHaveSideEffects())
5868       S = ExprTemp->getSubExpr();
5869 
5870   IncrementSrcRange = S->getSourceRange();
5871   S = S->IgnoreParens();
5872   if (auto *UO = dyn_cast<UnaryOperator>(S)) {
5873     if (UO->isIncrementDecrementOp() &&
5874         getInitLCDecl(UO->getSubExpr()) == LCDecl)
5875       return setStep(SemaRef
5876                          .ActOnIntegerConstant(UO->getBeginLoc(),
5877                                                (UO->isDecrementOp() ? -1 : 1))
5878                          .get(),
5879                      /*Subtract=*/false);
5880   } else if (auto *BO = dyn_cast<BinaryOperator>(S)) {
5881     switch (BO->getOpcode()) {
5882     case BO_AddAssign:
5883     case BO_SubAssign:
5884       if (getInitLCDecl(BO->getLHS()) == LCDecl)
5885         return setStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign);
5886       break;
5887     case BO_Assign:
5888       if (getInitLCDecl(BO->getLHS()) == LCDecl)
5889         return checkAndSetIncRHS(BO->getRHS());
5890       break;
5891     default:
5892       break;
5893     }
5894   } else if (auto *CE = dyn_cast<CXXOperatorCallExpr>(S)) {
5895     switch (CE->getOperator()) {
5896     case OO_PlusPlus:
5897     case OO_MinusMinus:
5898       if (getInitLCDecl(CE->getArg(0)) == LCDecl)
5899         return setStep(SemaRef
5900                            .ActOnIntegerConstant(
5901                                CE->getBeginLoc(),
5902                                ((CE->getOperator() == OO_MinusMinus) ? -1 : 1))
5903                            .get(),
5904                        /*Subtract=*/false);
5905       break;
5906     case OO_PlusEqual:
5907     case OO_MinusEqual:
5908       if (getInitLCDecl(CE->getArg(0)) == LCDecl)
5909         return setStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual);
5910       break;
5911     case OO_Equal:
5912       if (getInitLCDecl(CE->getArg(0)) == LCDecl)
5913         return checkAndSetIncRHS(CE->getArg(1));
5914       break;
5915     default:
5916       break;
5917     }
5918   }
5919   if (dependent() || SemaRef.CurContext->isDependentContext())
5920     return false;
5921   SemaRef.Diag(S->getBeginLoc(), diag::err_omp_loop_not_canonical_incr)
5922       << S->getSourceRange() << LCDecl;
5923   return true;
5924 }
5925 
5926 static ExprResult
5927 tryBuildCapture(Sema &SemaRef, Expr *Capture,
5928                 llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {
5929   if (SemaRef.CurContext->isDependentContext())
5930     return ExprResult(Capture);
5931   if (Capture->isEvaluatable(SemaRef.Context, Expr::SE_AllowSideEffects))
5932     return SemaRef.PerformImplicitConversion(
5933         Capture->IgnoreImpCasts(), Capture->getType(), Sema::AA_Converting,
5934         /*AllowExplicit=*/true);
5935   auto I = Captures.find(Capture);
5936   if (I != Captures.end())
5937     return buildCapture(SemaRef, Capture, I->second);
5938   DeclRefExpr *Ref = nullptr;
5939   ExprResult Res = buildCapture(SemaRef, Capture, Ref);
5940   Captures[Capture] = Ref;
5941   return Res;
5942 }
5943 
5944 /// Build the expression to calculate the number of iterations.
5945 Expr *OpenMPIterationSpaceChecker::buildNumIterations(
5946     Scope *S, ArrayRef<LoopIterationSpace> ResultIterSpaces, bool LimitedType,
5947     llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const {
5948   ExprResult Diff;
5949   QualType VarType = LCDecl->getType().getNonReferenceType();
5950   if (VarType->isIntegerType() || VarType->isPointerType() ||
5951       SemaRef.getLangOpts().CPlusPlus) {
5952     Expr *LBVal = LB;
5953     Expr *UBVal = UB;
5954     // LB = TestIsLessOp.getValue() ? min(LB(MinVal), LB(MaxVal)) :
5955     // max(LB(MinVal), LB(MaxVal))
5956     if (InitDependOnLC) {
5957       const LoopIterationSpace &IS =
5958           ResultIterSpaces[ResultIterSpaces.size() - 1 -
5959                            InitDependOnLC.getValueOr(
5960                                CondDependOnLC.getValueOr(0))];
5961       if (!IS.MinValue || !IS.MaxValue)
5962         return nullptr;
5963       // OuterVar = Min
5964       ExprResult MinValue =
5965           SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, IS.MinValue);
5966       if (!MinValue.isUsable())
5967         return nullptr;
5968 
5969       ExprResult LBMinVal = SemaRef.BuildBinOp(S, DefaultLoc, BO_Assign,
5970                                                IS.CounterVar, MinValue.get());
5971       if (!LBMinVal.isUsable())
5972         return nullptr;
5973       // OuterVar = Min, LBVal
5974       LBMinVal =
5975           SemaRef.BuildBinOp(S, DefaultLoc, BO_Comma, LBMinVal.get(), LBVal);
5976       if (!LBMinVal.isUsable())
5977         return nullptr;
5978       // (OuterVar = Min, LBVal)
5979       LBMinVal = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, LBMinVal.get());
5980       if (!LBMinVal.isUsable())
5981         return nullptr;
5982 
5983       // OuterVar = Max
5984       ExprResult MaxValue =
5985           SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, IS.MaxValue);
5986       if (!MaxValue.isUsable())
5987         return nullptr;
5988 
5989       ExprResult LBMaxVal = SemaRef.BuildBinOp(S, DefaultLoc, BO_Assign,
5990                                                IS.CounterVar, MaxValue.get());
5991       if (!LBMaxVal.isUsable())
5992         return nullptr;
5993       // OuterVar = Max, LBVal
5994       LBMaxVal =
5995           SemaRef.BuildBinOp(S, DefaultLoc, BO_Comma, LBMaxVal.get(), LBVal);
5996       if (!LBMaxVal.isUsable())
5997         return nullptr;
5998       // (OuterVar = Max, LBVal)
5999       LBMaxVal = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, LBMaxVal.get());
6000       if (!LBMaxVal.isUsable())
6001         return nullptr;
6002 
6003       Expr *LBMin = tryBuildCapture(SemaRef, LBMinVal.get(), Captures).get();
6004       Expr *LBMax = tryBuildCapture(SemaRef, LBMaxVal.get(), Captures).get();
6005       if (!LBMin || !LBMax)
6006         return nullptr;
6007       // LB(MinVal) < LB(MaxVal)
6008       ExprResult MinLessMaxRes =
6009           SemaRef.BuildBinOp(S, DefaultLoc, BO_LT, LBMin, LBMax);
6010       if (!MinLessMaxRes.isUsable())
6011         return nullptr;
6012       Expr *MinLessMax =
6013           tryBuildCapture(SemaRef, MinLessMaxRes.get(), Captures).get();
6014       if (!MinLessMax)
6015         return nullptr;
6016       if (TestIsLessOp.getValue()) {
6017         // LB(MinVal) < LB(MaxVal) ? LB(MinVal) : LB(MaxVal) - min(LB(MinVal),
6018         // LB(MaxVal))
6019         ExprResult MinLB = SemaRef.ActOnConditionalOp(DefaultLoc, DefaultLoc,
6020                                                       MinLessMax, LBMin, LBMax);
6021         if (!MinLB.isUsable())
6022           return nullptr;
6023         LBVal = MinLB.get();
6024       } else {
6025         // LB(MinVal) < LB(MaxVal) ? LB(MaxVal) : LB(MinVal) - max(LB(MinVal),
6026         // LB(MaxVal))
6027         ExprResult MaxLB = SemaRef.ActOnConditionalOp(DefaultLoc, DefaultLoc,
6028                                                       MinLessMax, LBMax, LBMin);
6029         if (!MaxLB.isUsable())
6030           return nullptr;
6031         LBVal = MaxLB.get();
6032       }
6033     }
6034     // UB = TestIsLessOp.getValue() ? max(UB(MinVal), UB(MaxVal)) :
6035     // min(UB(MinVal), UB(MaxVal))
6036     if (CondDependOnLC) {
6037       const LoopIterationSpace &IS =
6038           ResultIterSpaces[ResultIterSpaces.size() - 1 -
6039                            InitDependOnLC.getValueOr(
6040                                CondDependOnLC.getValueOr(0))];
6041       if (!IS.MinValue || !IS.MaxValue)
6042         return nullptr;
6043       // OuterVar = Min
6044       ExprResult MinValue =
6045           SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, IS.MinValue);
6046       if (!MinValue.isUsable())
6047         return nullptr;
6048 
6049       ExprResult UBMinVal = SemaRef.BuildBinOp(S, DefaultLoc, BO_Assign,
6050                                                IS.CounterVar, MinValue.get());
6051       if (!UBMinVal.isUsable())
6052         return nullptr;
6053       // OuterVar = Min, UBVal
6054       UBMinVal =
6055           SemaRef.BuildBinOp(S, DefaultLoc, BO_Comma, UBMinVal.get(), UBVal);
6056       if (!UBMinVal.isUsable())
6057         return nullptr;
6058       // (OuterVar = Min, UBVal)
6059       UBMinVal = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, UBMinVal.get());
6060       if (!UBMinVal.isUsable())
6061         return nullptr;
6062 
6063       // OuterVar = Max
6064       ExprResult MaxValue =
6065           SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, IS.MaxValue);
6066       if (!MaxValue.isUsable())
6067         return nullptr;
6068 
6069       ExprResult UBMaxVal = SemaRef.BuildBinOp(S, DefaultLoc, BO_Assign,
6070                                                IS.CounterVar, MaxValue.get());
6071       if (!UBMaxVal.isUsable())
6072         return nullptr;
6073       // OuterVar = Max, UBVal
6074       UBMaxVal =
6075           SemaRef.BuildBinOp(S, DefaultLoc, BO_Comma, UBMaxVal.get(), UBVal);
6076       if (!UBMaxVal.isUsable())
6077         return nullptr;
6078       // (OuterVar = Max, UBVal)
6079       UBMaxVal = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, UBMaxVal.get());
6080       if (!UBMaxVal.isUsable())
6081         return nullptr;
6082 
6083       Expr *UBMin = tryBuildCapture(SemaRef, UBMinVal.get(), Captures).get();
6084       Expr *UBMax = tryBuildCapture(SemaRef, UBMaxVal.get(), Captures).get();
6085       if (!UBMin || !UBMax)
6086         return nullptr;
6087       // UB(MinVal) > UB(MaxVal)
6088       ExprResult MinGreaterMaxRes =
6089           SemaRef.BuildBinOp(S, DefaultLoc, BO_GT, UBMin, UBMax);
6090       if (!MinGreaterMaxRes.isUsable())
6091         return nullptr;
6092       Expr *MinGreaterMax =
6093           tryBuildCapture(SemaRef, MinGreaterMaxRes.get(), Captures).get();
6094       if (!MinGreaterMax)
6095         return nullptr;
6096       if (TestIsLessOp.getValue()) {
6097         // UB(MinVal) > UB(MaxVal) ? UB(MinVal) : UB(MaxVal) - max(UB(MinVal),
6098         // UB(MaxVal))
6099         ExprResult MaxUB = SemaRef.ActOnConditionalOp(
6100             DefaultLoc, DefaultLoc, MinGreaterMax, UBMin, UBMax);
6101         if (!MaxUB.isUsable())
6102           return nullptr;
6103         UBVal = MaxUB.get();
6104       } else {
6105         // UB(MinVal) > UB(MaxVal) ? UB(MaxVal) : UB(MinVal) - min(UB(MinVal),
6106         // UB(MaxVal))
6107         ExprResult MinUB = SemaRef.ActOnConditionalOp(
6108             DefaultLoc, DefaultLoc, MinGreaterMax, UBMax, UBMin);
6109         if (!MinUB.isUsable())
6110           return nullptr;
6111         UBVal = MinUB.get();
6112       }
6113     }
6114     // Upper - Lower
6115     Expr *UBExpr = TestIsLessOp.getValue() ? UBVal : LBVal;
6116     Expr *LBExpr = TestIsLessOp.getValue() ? LBVal : UBVal;
6117     Expr *Upper = tryBuildCapture(SemaRef, UBExpr, Captures).get();
6118     Expr *Lower = tryBuildCapture(SemaRef, LBExpr, Captures).get();
6119     if (!Upper || !Lower)
6120       return nullptr;
6121 
6122     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower);
6123 
6124     if (!Diff.isUsable() && VarType->getAsCXXRecordDecl()) {
6125       // BuildBinOp already emitted error, this one is to point user to upper
6126       // and lower bound, and to tell what is passed to 'operator-'.
6127       SemaRef.Diag(Upper->getBeginLoc(), diag::err_omp_loop_diff_cxx)
6128           << Upper->getSourceRange() << Lower->getSourceRange();
6129       return nullptr;
6130     }
6131   }
6132 
6133   if (!Diff.isUsable())
6134     return nullptr;
6135 
6136   // Upper - Lower [- 1]
6137   if (TestIsStrictOp)
6138     Diff = SemaRef.BuildBinOp(
6139         S, DefaultLoc, BO_Sub, Diff.get(),
6140         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
6141   if (!Diff.isUsable())
6142     return nullptr;
6143 
6144   // Upper - Lower [- 1] + Step
6145   ExprResult NewStep = tryBuildCapture(SemaRef, Step, Captures);
6146   if (!NewStep.isUsable())
6147     return nullptr;
6148   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Diff.get(), NewStep.get());
6149   if (!Diff.isUsable())
6150     return nullptr;
6151 
6152   // Parentheses (for dumping/debugging purposes only).
6153   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
6154   if (!Diff.isUsable())
6155     return nullptr;
6156 
6157   // (Upper - Lower [- 1] + Step) / Step
6158   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), NewStep.get());
6159   if (!Diff.isUsable())
6160     return nullptr;
6161 
6162   // OpenMP runtime requires 32-bit or 64-bit loop variables.
6163   QualType Type = Diff.get()->getType();
6164   ASTContext &C = SemaRef.Context;
6165   bool UseVarType = VarType->hasIntegerRepresentation() &&
6166                     C.getTypeSize(Type) > C.getTypeSize(VarType);
6167   if (!Type->isIntegerType() || UseVarType) {
6168     unsigned NewSize =
6169         UseVarType ? C.getTypeSize(VarType) : C.getTypeSize(Type);
6170     bool IsSigned = UseVarType ? VarType->hasSignedIntegerRepresentation()
6171                                : Type->hasSignedIntegerRepresentation();
6172     Type = C.getIntTypeForBitwidth(NewSize, IsSigned);
6173     if (!SemaRef.Context.hasSameType(Diff.get()->getType(), Type)) {
6174       Diff = SemaRef.PerformImplicitConversion(
6175           Diff.get(), Type, Sema::AA_Converting, /*AllowExplicit=*/true);
6176       if (!Diff.isUsable())
6177         return nullptr;
6178     }
6179   }
6180   if (LimitedType) {
6181     unsigned NewSize = (C.getTypeSize(Type) > 32) ? 64 : 32;
6182     if (NewSize != C.getTypeSize(Type)) {
6183       if (NewSize < C.getTypeSize(Type)) {
6184         assert(NewSize == 64 && "incorrect loop var size");
6185         SemaRef.Diag(DefaultLoc, diag::warn_omp_loop_64_bit_var)
6186             << InitSrcRange << ConditionSrcRange;
6187       }
6188       QualType NewType = C.getIntTypeForBitwidth(
6189           NewSize, Type->hasSignedIntegerRepresentation() ||
6190                        C.getTypeSize(Type) < NewSize);
6191       if (!SemaRef.Context.hasSameType(Diff.get()->getType(), NewType)) {
6192         Diff = SemaRef.PerformImplicitConversion(Diff.get(), NewType,
6193                                                  Sema::AA_Converting, true);
6194         if (!Diff.isUsable())
6195           return nullptr;
6196       }
6197     }
6198   }
6199 
6200   return Diff.get();
6201 }
6202 
6203 std::pair<Expr *, Expr *> OpenMPIterationSpaceChecker::buildMinMaxValues(
6204     Scope *S, llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const {
6205   // Do not build for iterators, they cannot be used in non-rectangular loop
6206   // nests.
6207   if (LCDecl->getType()->isRecordType())
6208     return std::make_pair(nullptr, nullptr);
6209   // If we subtract, the min is in the condition, otherwise the min is in the
6210   // init value.
6211   Expr *MinExpr = nullptr;
6212   Expr *MaxExpr = nullptr;
6213   Expr *LBExpr = TestIsLessOp.getValue() ? LB : UB;
6214   Expr *UBExpr = TestIsLessOp.getValue() ? UB : LB;
6215   bool LBNonRect = TestIsLessOp.getValue() ? InitDependOnLC.hasValue()
6216                                            : CondDependOnLC.hasValue();
6217   bool UBNonRect = TestIsLessOp.getValue() ? CondDependOnLC.hasValue()
6218                                            : InitDependOnLC.hasValue();
6219   Expr *Lower =
6220       LBNonRect ? LBExpr : tryBuildCapture(SemaRef, LBExpr, Captures).get();
6221   Expr *Upper =
6222       UBNonRect ? UBExpr : tryBuildCapture(SemaRef, UBExpr, Captures).get();
6223   if (!Upper || !Lower)
6224     return std::make_pair(nullptr, nullptr);
6225 
6226   if (TestIsLessOp.getValue())
6227     MinExpr = Lower;
6228   else
6229     MaxExpr = Upper;
6230 
6231   // Build minimum/maximum value based on number of iterations.
6232   ExprResult Diff;
6233   QualType VarType = LCDecl->getType().getNonReferenceType();
6234 
6235   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower);
6236   if (!Diff.isUsable())
6237     return std::make_pair(nullptr, nullptr);
6238 
6239   // Upper - Lower [- 1]
6240   if (TestIsStrictOp)
6241     Diff = SemaRef.BuildBinOp(
6242         S, DefaultLoc, BO_Sub, Diff.get(),
6243         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
6244   if (!Diff.isUsable())
6245     return std::make_pair(nullptr, nullptr);
6246 
6247   // Upper - Lower [- 1] + Step
6248   ExprResult NewStep = tryBuildCapture(SemaRef, Step, Captures);
6249   if (!NewStep.isUsable())
6250     return std::make_pair(nullptr, nullptr);
6251 
6252   // Parentheses (for dumping/debugging purposes only).
6253   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
6254   if (!Diff.isUsable())
6255     return std::make_pair(nullptr, nullptr);
6256 
6257   // (Upper - Lower [- 1]) / Step
6258   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), NewStep.get());
6259   if (!Diff.isUsable())
6260     return std::make_pair(nullptr, nullptr);
6261 
6262   // ((Upper - Lower [- 1]) / Step) * Step
6263   // Parentheses (for dumping/debugging purposes only).
6264   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
6265   if (!Diff.isUsable())
6266     return std::make_pair(nullptr, nullptr);
6267 
6268   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Mul, Diff.get(), NewStep.get());
6269   if (!Diff.isUsable())
6270     return std::make_pair(nullptr, nullptr);
6271 
6272   // Convert to the original type or ptrdiff_t, if original type is pointer.
6273   if (!VarType->isAnyPointerType() &&
6274       !SemaRef.Context.hasSameType(Diff.get()->getType(), VarType)) {
6275     Diff = SemaRef.PerformImplicitConversion(
6276         Diff.get(), VarType, Sema::AA_Converting, /*AllowExplicit=*/true);
6277   } else if (VarType->isAnyPointerType() &&
6278              !SemaRef.Context.hasSameType(
6279                  Diff.get()->getType(),
6280                  SemaRef.Context.getUnsignedPointerDiffType())) {
6281     Diff = SemaRef.PerformImplicitConversion(
6282         Diff.get(), SemaRef.Context.getUnsignedPointerDiffType(),
6283         Sema::AA_Converting, /*AllowExplicit=*/true);
6284   }
6285   if (!Diff.isUsable())
6286     return std::make_pair(nullptr, nullptr);
6287 
6288   // Parentheses (for dumping/debugging purposes only).
6289   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
6290   if (!Diff.isUsable())
6291     return std::make_pair(nullptr, nullptr);
6292 
6293   if (TestIsLessOp.getValue()) {
6294     // MinExpr = Lower;
6295     // MaxExpr = Lower + (((Upper - Lower [- 1]) / Step) * Step)
6296     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Lower, Diff.get());
6297     if (!Diff.isUsable())
6298       return std::make_pair(nullptr, nullptr);
6299     Diff = SemaRef.ActOnFinishFullExpr(Diff.get(), /*DiscardedValue*/ false);
6300     if (!Diff.isUsable())
6301       return std::make_pair(nullptr, nullptr);
6302     MaxExpr = Diff.get();
6303   } else {
6304     // MaxExpr = Upper;
6305     // MinExpr = Upper - (((Upper - Lower [- 1]) / Step) * Step)
6306     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Diff.get());
6307     if (!Diff.isUsable())
6308       return std::make_pair(nullptr, nullptr);
6309     Diff = SemaRef.ActOnFinishFullExpr(Diff.get(), /*DiscardedValue*/ false);
6310     if (!Diff.isUsable())
6311       return std::make_pair(nullptr, nullptr);
6312     MinExpr = Diff.get();
6313   }
6314 
6315   return std::make_pair(MinExpr, MaxExpr);
6316 }
6317 
6318 Expr *OpenMPIterationSpaceChecker::buildFinalCondition(Scope *S) const {
6319   if (InitDependOnLC || CondDependOnLC)
6320     return Condition;
6321   return nullptr;
6322 }
6323 
6324 Expr *OpenMPIterationSpaceChecker::buildPreCond(
6325     Scope *S, Expr *Cond,
6326     llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) const {
6327   // Do not build a precondition when the condition/initialization is dependent
6328   // to prevent pessimistic early loop exit.
6329   // TODO: this can be improved by calculating min/max values but not sure that
6330   // it will be very effective.
6331   if (CondDependOnLC || InitDependOnLC)
6332     return SemaRef.PerformImplicitConversion(
6333         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get(),
6334         SemaRef.Context.BoolTy, /*Action=*/Sema::AA_Casting,
6335         /*AllowExplicit=*/true).get();
6336 
6337   // Try to build LB <op> UB, where <op> is <, >, <=, or >=.
6338   Sema::TentativeAnalysisScope Trap(SemaRef);
6339 
6340   ExprResult NewLB = tryBuildCapture(SemaRef, LB, Captures);
6341   ExprResult NewUB = tryBuildCapture(SemaRef, UB, Captures);
6342   if (!NewLB.isUsable() || !NewUB.isUsable())
6343     return nullptr;
6344 
6345   ExprResult CondExpr =
6346       SemaRef.BuildBinOp(S, DefaultLoc,
6347                          TestIsLessOp.getValue() ?
6348                            (TestIsStrictOp ? BO_LT : BO_LE) :
6349                            (TestIsStrictOp ? BO_GT : BO_GE),
6350                          NewLB.get(), NewUB.get());
6351   if (CondExpr.isUsable()) {
6352     if (!SemaRef.Context.hasSameUnqualifiedType(CondExpr.get()->getType(),
6353                                                 SemaRef.Context.BoolTy))
6354       CondExpr = SemaRef.PerformImplicitConversion(
6355           CondExpr.get(), SemaRef.Context.BoolTy, /*Action=*/Sema::AA_Casting,
6356           /*AllowExplicit=*/true);
6357   }
6358 
6359   // Otherwise use original loop condition and evaluate it in runtime.
6360   return CondExpr.isUsable() ? CondExpr.get() : Cond;
6361 }
6362 
6363 /// Build reference expression to the counter be used for codegen.
6364 DeclRefExpr *OpenMPIterationSpaceChecker::buildCounterVar(
6365     llvm::MapVector<const Expr *, DeclRefExpr *> &Captures,
6366     DSAStackTy &DSA) const {
6367   auto *VD = dyn_cast<VarDecl>(LCDecl);
6368   if (!VD) {
6369     VD = SemaRef.isOpenMPCapturedDecl(LCDecl);
6370     DeclRefExpr *Ref = buildDeclRefExpr(
6371         SemaRef, VD, VD->getType().getNonReferenceType(), DefaultLoc);
6372     const DSAStackTy::DSAVarData Data =
6373         DSA.getTopDSA(LCDecl, /*FromParent=*/false);
6374     // If the loop control decl is explicitly marked as private, do not mark it
6375     // as captured again.
6376     if (!isOpenMPPrivate(Data.CKind) || !Data.RefExpr)
6377       Captures.insert(std::make_pair(LCRef, Ref));
6378     return Ref;
6379   }
6380   return cast<DeclRefExpr>(LCRef);
6381 }
6382 
6383 Expr *OpenMPIterationSpaceChecker::buildPrivateCounterVar() const {
6384   if (LCDecl && !LCDecl->isInvalidDecl()) {
6385     QualType Type = LCDecl->getType().getNonReferenceType();
6386     VarDecl *PrivateVar = buildVarDecl(
6387         SemaRef, DefaultLoc, Type, LCDecl->getName(),
6388         LCDecl->hasAttrs() ? &LCDecl->getAttrs() : nullptr,
6389         isa<VarDecl>(LCDecl)
6390             ? buildDeclRefExpr(SemaRef, cast<VarDecl>(LCDecl), Type, DefaultLoc)
6391             : nullptr);
6392     if (PrivateVar->isInvalidDecl())
6393       return nullptr;
6394     return buildDeclRefExpr(SemaRef, PrivateVar, Type, DefaultLoc);
6395   }
6396   return nullptr;
6397 }
6398 
6399 /// Build initialization of the counter to be used for codegen.
6400 Expr *OpenMPIterationSpaceChecker::buildCounterInit() const { return LB; }
6401 
6402 /// Build step of the counter be used for codegen.
6403 Expr *OpenMPIterationSpaceChecker::buildCounterStep() const { return Step; }
6404 
6405 Expr *OpenMPIterationSpaceChecker::buildOrderedLoopData(
6406     Scope *S, Expr *Counter,
6407     llvm::MapVector<const Expr *, DeclRefExpr *> &Captures, SourceLocation Loc,
6408     Expr *Inc, OverloadedOperatorKind OOK) {
6409   Expr *Cnt = SemaRef.DefaultLvalueConversion(Counter).get();
6410   if (!Cnt)
6411     return nullptr;
6412   if (Inc) {
6413     assert((OOK == OO_Plus || OOK == OO_Minus) &&
6414            "Expected only + or - operations for depend clauses.");
6415     BinaryOperatorKind BOK = (OOK == OO_Plus) ? BO_Add : BO_Sub;
6416     Cnt = SemaRef.BuildBinOp(S, Loc, BOK, Cnt, Inc).get();
6417     if (!Cnt)
6418       return nullptr;
6419   }
6420   ExprResult Diff;
6421   QualType VarType = LCDecl->getType().getNonReferenceType();
6422   if (VarType->isIntegerType() || VarType->isPointerType() ||
6423       SemaRef.getLangOpts().CPlusPlus) {
6424     // Upper - Lower
6425     Expr *Upper = TestIsLessOp.getValue()
6426                       ? Cnt
6427                       : tryBuildCapture(SemaRef, UB, Captures).get();
6428     Expr *Lower = TestIsLessOp.getValue()
6429                       ? tryBuildCapture(SemaRef, LB, Captures).get()
6430                       : Cnt;
6431     if (!Upper || !Lower)
6432       return nullptr;
6433 
6434     Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower);
6435 
6436     if (!Diff.isUsable() && VarType->getAsCXXRecordDecl()) {
6437       // BuildBinOp already emitted error, this one is to point user to upper
6438       // and lower bound, and to tell what is passed to 'operator-'.
6439       SemaRef.Diag(Upper->getBeginLoc(), diag::err_omp_loop_diff_cxx)
6440           << Upper->getSourceRange() << Lower->getSourceRange();
6441       return nullptr;
6442     }
6443   }
6444 
6445   if (!Diff.isUsable())
6446     return nullptr;
6447 
6448   // Parentheses (for dumping/debugging purposes only).
6449   Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get());
6450   if (!Diff.isUsable())
6451     return nullptr;
6452 
6453   ExprResult NewStep = tryBuildCapture(SemaRef, Step, Captures);
6454   if (!NewStep.isUsable())
6455     return nullptr;
6456   // (Upper - Lower) / Step
6457   Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), NewStep.get());
6458   if (!Diff.isUsable())
6459     return nullptr;
6460 
6461   return Diff.get();
6462 }
6463 } // namespace
6464 
6465 void Sema::ActOnOpenMPLoopInitialization(SourceLocation ForLoc, Stmt *Init) {
6466   assert(getLangOpts().OpenMP && "OpenMP is not active.");
6467   assert(Init && "Expected loop in canonical form.");
6468   unsigned AssociatedLoops = DSAStack->getAssociatedLoops();
6469   if (AssociatedLoops > 0 &&
6470       isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {
6471     DSAStack->loopStart();
6472     OpenMPIterationSpaceChecker ISC(*this, *DSAStack, ForLoc);
6473     if (!ISC.checkAndSetInit(Init, /*EmitDiags=*/false)) {
6474       if (ValueDecl *D = ISC.getLoopDecl()) {
6475         auto *VD = dyn_cast<VarDecl>(D);
6476         DeclRefExpr *PrivateRef = nullptr;
6477         if (!VD) {
6478           if (VarDecl *Private = isOpenMPCapturedDecl(D)) {
6479             VD = Private;
6480           } else {
6481             PrivateRef = buildCapture(*this, D, ISC.getLoopDeclRefExpr(),
6482                                       /*WithInit=*/false);
6483             VD = cast<VarDecl>(PrivateRef->getDecl());
6484           }
6485         }
6486         DSAStack->addLoopControlVariable(D, VD);
6487         const Decl *LD = DSAStack->getPossiblyLoopCunter();
6488         if (LD != D->getCanonicalDecl()) {
6489           DSAStack->resetPossibleLoopCounter();
6490           if (auto *Var = dyn_cast_or_null<VarDecl>(LD))
6491             MarkDeclarationsReferencedInExpr(
6492                 buildDeclRefExpr(*this, const_cast<VarDecl *>(Var),
6493                                  Var->getType().getNonLValueExprType(Context),
6494                                  ForLoc, /*RefersToCapture=*/true));
6495         }
6496         OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
6497         // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables
6498         // Referenced in a Construct, C/C++]. The loop iteration variable in the
6499         // associated for-loop of a simd construct with just one associated
6500         // for-loop may be listed in a linear clause with a constant-linear-step
6501         // that is the increment of the associated for-loop. The loop iteration
6502         // variable(s) in the associated for-loop(s) of a for or parallel for
6503         // construct may be listed in a private or lastprivate clause.
6504         DSAStackTy::DSAVarData DVar =
6505             DSAStack->getTopDSA(D, /*FromParent=*/false);
6506         // If LoopVarRefExpr is nullptr it means the corresponding loop variable
6507         // is declared in the loop and it is predetermined as a private.
6508         Expr *LoopDeclRefExpr = ISC.getLoopDeclRefExpr();
6509         OpenMPClauseKind PredeterminedCKind =
6510             isOpenMPSimdDirective(DKind)
6511                 ? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : OMPC_linear)
6512                 : OMPC_private;
6513         if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
6514               DVar.CKind != PredeterminedCKind && DVar.RefExpr &&
6515               (LangOpts.OpenMP <= 45 || (DVar.CKind != OMPC_lastprivate &&
6516                                          DVar.CKind != OMPC_private))) ||
6517              ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop ||
6518                DKind == OMPD_master_taskloop ||
6519                DKind == OMPD_parallel_master_taskloop ||
6520                isOpenMPDistributeDirective(DKind)) &&
6521               !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
6522               DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) &&
6523             (DVar.CKind != OMPC_private || DVar.RefExpr)) {
6524           Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa)
6525               << getOpenMPClauseName(DVar.CKind)
6526               << getOpenMPDirectiveName(DKind)
6527               << getOpenMPClauseName(PredeterminedCKind);
6528           if (DVar.RefExpr == nullptr)
6529             DVar.CKind = PredeterminedCKind;
6530           reportOriginalDsa(*this, DSAStack, D, DVar,
6531                             /*IsLoopIterVar=*/true);
6532         } else if (LoopDeclRefExpr) {
6533           // Make the loop iteration variable private (for worksharing
6534           // constructs), linear (for simd directives with the only one
6535           // associated loop) or lastprivate (for simd directives with several
6536           // collapsed or ordered loops).
6537           if (DVar.CKind == OMPC_unknown)
6538             DSAStack->addDSA(D, LoopDeclRefExpr, PredeterminedCKind,
6539                              PrivateRef);
6540         }
6541       }
6542     }
6543     DSAStack->setAssociatedLoops(AssociatedLoops - 1);
6544   }
6545 }
6546 
6547 /// Called on a for stmt to check and extract its iteration space
6548 /// for further processing (such as collapsing).
6549 static bool checkOpenMPIterationSpace(
6550     OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA,
6551     unsigned CurrentNestedLoopCount, unsigned NestedLoopCount,
6552     unsigned TotalNestedLoopCount, Expr *CollapseLoopCountExpr,
6553     Expr *OrderedLoopCountExpr,
6554     Sema::VarsWithInheritedDSAType &VarsWithImplicitDSA,
6555     llvm::MutableArrayRef<LoopIterationSpace> ResultIterSpaces,
6556     llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {
6557   // OpenMP [2.9.1, Canonical Loop Form]
6558   //   for (init-expr; test-expr; incr-expr) structured-block
6559   //   for (range-decl: range-expr) structured-block
6560   auto *For = dyn_cast_or_null<ForStmt>(S);
6561   auto *CXXFor = dyn_cast_or_null<CXXForRangeStmt>(S);
6562   // Ranged for is supported only in OpenMP 5.0.
6563   if (!For && (SemaRef.LangOpts.OpenMP <= 45 || !CXXFor)) {
6564     SemaRef.Diag(S->getBeginLoc(), diag::err_omp_not_for)
6565         << (CollapseLoopCountExpr != nullptr || OrderedLoopCountExpr != nullptr)
6566         << getOpenMPDirectiveName(DKind) << TotalNestedLoopCount
6567         << (CurrentNestedLoopCount > 0) << CurrentNestedLoopCount;
6568     if (TotalNestedLoopCount > 1) {
6569       if (CollapseLoopCountExpr && OrderedLoopCountExpr)
6570         SemaRef.Diag(DSA.getConstructLoc(),
6571                      diag::note_omp_collapse_ordered_expr)
6572             << 2 << CollapseLoopCountExpr->getSourceRange()
6573             << OrderedLoopCountExpr->getSourceRange();
6574       else if (CollapseLoopCountExpr)
6575         SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(),
6576                      diag::note_omp_collapse_ordered_expr)
6577             << 0 << CollapseLoopCountExpr->getSourceRange();
6578       else
6579         SemaRef.Diag(OrderedLoopCountExpr->getExprLoc(),
6580                      diag::note_omp_collapse_ordered_expr)
6581             << 1 << OrderedLoopCountExpr->getSourceRange();
6582     }
6583     return true;
6584   }
6585   assert(((For && For->getBody()) || (CXXFor && CXXFor->getBody())) &&
6586          "No loop body.");
6587 
6588   OpenMPIterationSpaceChecker ISC(SemaRef, DSA,
6589                                   For ? For->getForLoc() : CXXFor->getForLoc());
6590 
6591   // Check init.
6592   Stmt *Init = For ? For->getInit() : CXXFor->getBeginStmt();
6593   if (ISC.checkAndSetInit(Init))
6594     return true;
6595 
6596   bool HasErrors = false;
6597 
6598   // Check loop variable's type.
6599   if (ValueDecl *LCDecl = ISC.getLoopDecl()) {
6600     // OpenMP [2.6, Canonical Loop Form]
6601     // Var is one of the following:
6602     //   A variable of signed or unsigned integer type.
6603     //   For C++, a variable of a random access iterator type.
6604     //   For C, a variable of a pointer type.
6605     QualType VarType = LCDecl->getType().getNonReferenceType();
6606     if (!VarType->isDependentType() && !VarType->isIntegerType() &&
6607         !VarType->isPointerType() &&
6608         !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) {
6609       SemaRef.Diag(Init->getBeginLoc(), diag::err_omp_loop_variable_type)
6610           << SemaRef.getLangOpts().CPlusPlus;
6611       HasErrors = true;
6612     }
6613 
6614     // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in
6615     // a Construct
6616     // The loop iteration variable(s) in the associated for-loop(s) of a for or
6617     // parallel for construct is (are) private.
6618     // The loop iteration variable in the associated for-loop of a simd
6619     // construct with just one associated for-loop is linear with a
6620     // constant-linear-step that is the increment of the associated for-loop.
6621     // Exclude loop var from the list of variables with implicitly defined data
6622     // sharing attributes.
6623     VarsWithImplicitDSA.erase(LCDecl);
6624 
6625     assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars");
6626 
6627     // Check test-expr.
6628     HasErrors |= ISC.checkAndSetCond(For ? For->getCond() : CXXFor->getCond());
6629 
6630     // Check incr-expr.
6631     HasErrors |= ISC.checkAndSetInc(For ? For->getInc() : CXXFor->getInc());
6632   }
6633 
6634   if (ISC.dependent() || SemaRef.CurContext->isDependentContext() || HasErrors)
6635     return HasErrors;
6636 
6637   // Build the loop's iteration space representation.
6638   ResultIterSpaces[CurrentNestedLoopCount].PreCond = ISC.buildPreCond(
6639       DSA.getCurScope(), For ? For->getCond() : CXXFor->getCond(), Captures);
6640   ResultIterSpaces[CurrentNestedLoopCount].NumIterations =
6641       ISC.buildNumIterations(DSA.getCurScope(), ResultIterSpaces,
6642                              (isOpenMPWorksharingDirective(DKind) ||
6643                               isOpenMPTaskLoopDirective(DKind) ||
6644                               isOpenMPDistributeDirective(DKind)),
6645                              Captures);
6646   ResultIterSpaces[CurrentNestedLoopCount].CounterVar =
6647       ISC.buildCounterVar(Captures, DSA);
6648   ResultIterSpaces[CurrentNestedLoopCount].PrivateCounterVar =
6649       ISC.buildPrivateCounterVar();
6650   ResultIterSpaces[CurrentNestedLoopCount].CounterInit = ISC.buildCounterInit();
6651   ResultIterSpaces[CurrentNestedLoopCount].CounterStep = ISC.buildCounterStep();
6652   ResultIterSpaces[CurrentNestedLoopCount].InitSrcRange = ISC.getInitSrcRange();
6653   ResultIterSpaces[CurrentNestedLoopCount].CondSrcRange =
6654       ISC.getConditionSrcRange();
6655   ResultIterSpaces[CurrentNestedLoopCount].IncSrcRange =
6656       ISC.getIncrementSrcRange();
6657   ResultIterSpaces[CurrentNestedLoopCount].Subtract = ISC.shouldSubtractStep();
6658   ResultIterSpaces[CurrentNestedLoopCount].IsStrictCompare =
6659       ISC.isStrictTestOp();
6660   std::tie(ResultIterSpaces[CurrentNestedLoopCount].MinValue,
6661            ResultIterSpaces[CurrentNestedLoopCount].MaxValue) =
6662       ISC.buildMinMaxValues(DSA.getCurScope(), Captures);
6663   ResultIterSpaces[CurrentNestedLoopCount].FinalCondition =
6664       ISC.buildFinalCondition(DSA.getCurScope());
6665   ResultIterSpaces[CurrentNestedLoopCount].IsNonRectangularLB =
6666       ISC.doesInitDependOnLC();
6667   ResultIterSpaces[CurrentNestedLoopCount].IsNonRectangularUB =
6668       ISC.doesCondDependOnLC();
6669   ResultIterSpaces[CurrentNestedLoopCount].LoopDependentIdx =
6670       ISC.getLoopDependentIdx();
6671 
6672   HasErrors |=
6673       (ResultIterSpaces[CurrentNestedLoopCount].PreCond == nullptr ||
6674        ResultIterSpaces[CurrentNestedLoopCount].NumIterations == nullptr ||
6675        ResultIterSpaces[CurrentNestedLoopCount].CounterVar == nullptr ||
6676        ResultIterSpaces[CurrentNestedLoopCount].PrivateCounterVar == nullptr ||
6677        ResultIterSpaces[CurrentNestedLoopCount].CounterInit == nullptr ||
6678        ResultIterSpaces[CurrentNestedLoopCount].CounterStep == nullptr);
6679   if (!HasErrors && DSA.isOrderedRegion()) {
6680     if (DSA.getOrderedRegionParam().second->getNumForLoops()) {
6681       if (CurrentNestedLoopCount <
6682           DSA.getOrderedRegionParam().second->getLoopNumIterations().size()) {
6683         DSA.getOrderedRegionParam().second->setLoopNumIterations(
6684             CurrentNestedLoopCount,
6685             ResultIterSpaces[CurrentNestedLoopCount].NumIterations);
6686         DSA.getOrderedRegionParam().second->setLoopCounter(
6687             CurrentNestedLoopCount,
6688             ResultIterSpaces[CurrentNestedLoopCount].CounterVar);
6689       }
6690     }
6691     for (auto &Pair : DSA.getDoacrossDependClauses()) {
6692       if (CurrentNestedLoopCount >= Pair.first->getNumLoops()) {
6693         // Erroneous case - clause has some problems.
6694         continue;
6695       }
6696       if (Pair.first->getDependencyKind() == OMPC_DEPEND_sink &&
6697           Pair.second.size() <= CurrentNestedLoopCount) {
6698         // Erroneous case - clause has some problems.
6699         Pair.first->setLoopData(CurrentNestedLoopCount, nullptr);
6700         continue;
6701       }
6702       Expr *CntValue;
6703       if (Pair.first->getDependencyKind() == OMPC_DEPEND_source)
6704         CntValue = ISC.buildOrderedLoopData(
6705             DSA.getCurScope(),
6706             ResultIterSpaces[CurrentNestedLoopCount].CounterVar, Captures,
6707             Pair.first->getDependencyLoc());
6708       else
6709         CntValue = ISC.buildOrderedLoopData(
6710             DSA.getCurScope(),
6711             ResultIterSpaces[CurrentNestedLoopCount].CounterVar, Captures,
6712             Pair.first->getDependencyLoc(),
6713             Pair.second[CurrentNestedLoopCount].first,
6714             Pair.second[CurrentNestedLoopCount].second);
6715       Pair.first->setLoopData(CurrentNestedLoopCount, CntValue);
6716     }
6717   }
6718 
6719   return HasErrors;
6720 }
6721 
6722 /// Build 'VarRef = Start.
6723 static ExprResult
6724 buildCounterInit(Sema &SemaRef, Scope *S, SourceLocation Loc, ExprResult VarRef,
6725                  ExprResult Start, bool IsNonRectangularLB,
6726                  llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {
6727   // Build 'VarRef = Start.
6728   ExprResult NewStart = IsNonRectangularLB
6729                             ? Start.get()
6730                             : tryBuildCapture(SemaRef, Start.get(), Captures);
6731   if (!NewStart.isUsable())
6732     return ExprError();
6733   if (!SemaRef.Context.hasSameType(NewStart.get()->getType(),
6734                                    VarRef.get()->getType())) {
6735     NewStart = SemaRef.PerformImplicitConversion(
6736         NewStart.get(), VarRef.get()->getType(), Sema::AA_Converting,
6737         /*AllowExplicit=*/true);
6738     if (!NewStart.isUsable())
6739       return ExprError();
6740   }
6741 
6742   ExprResult Init =
6743       SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), NewStart.get());
6744   return Init;
6745 }
6746 
6747 /// Build 'VarRef = Start + Iter * Step'.
6748 static ExprResult buildCounterUpdate(
6749     Sema &SemaRef, Scope *S, SourceLocation Loc, ExprResult VarRef,
6750     ExprResult Start, ExprResult Iter, ExprResult Step, bool Subtract,
6751     bool IsNonRectangularLB,
6752     llvm::MapVector<const Expr *, DeclRefExpr *> *Captures = nullptr) {
6753   // Add parentheses (for debugging purposes only).
6754   Iter = SemaRef.ActOnParenExpr(Loc, Loc, Iter.get());
6755   if (!VarRef.isUsable() || !Start.isUsable() || !Iter.isUsable() ||
6756       !Step.isUsable())
6757     return ExprError();
6758 
6759   ExprResult NewStep = Step;
6760   if (Captures)
6761     NewStep = tryBuildCapture(SemaRef, Step.get(), *Captures);
6762   if (NewStep.isInvalid())
6763     return ExprError();
6764   ExprResult Update =
6765       SemaRef.BuildBinOp(S, Loc, BO_Mul, Iter.get(), NewStep.get());
6766   if (!Update.isUsable())
6767     return ExprError();
6768 
6769   // Try to build 'VarRef = Start, VarRef (+|-)= Iter * Step' or
6770   // 'VarRef = Start (+|-) Iter * Step'.
6771   if (!Start.isUsable())
6772     return ExprError();
6773   ExprResult NewStart = SemaRef.ActOnParenExpr(Loc, Loc, Start.get());
6774   if (!NewStart.isUsable())
6775     return ExprError();
6776   if (Captures && !IsNonRectangularLB)
6777     NewStart = tryBuildCapture(SemaRef, Start.get(), *Captures);
6778   if (NewStart.isInvalid())
6779     return ExprError();
6780 
6781   // First attempt: try to build 'VarRef = Start, VarRef += Iter * Step'.
6782   ExprResult SavedUpdate = Update;
6783   ExprResult UpdateVal;
6784   if (VarRef.get()->getType()->isOverloadableType() ||
6785       NewStart.get()->getType()->isOverloadableType() ||
6786       Update.get()->getType()->isOverloadableType()) {
6787     Sema::TentativeAnalysisScope Trap(SemaRef);
6788 
6789     Update =
6790         SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), NewStart.get());
6791     if (Update.isUsable()) {
6792       UpdateVal =
6793           SemaRef.BuildBinOp(S, Loc, Subtract ? BO_SubAssign : BO_AddAssign,
6794                              VarRef.get(), SavedUpdate.get());
6795       if (UpdateVal.isUsable()) {
6796         Update = SemaRef.CreateBuiltinBinOp(Loc, BO_Comma, Update.get(),
6797                                             UpdateVal.get());
6798       }
6799     }
6800   }
6801 
6802   // Second attempt: try to build 'VarRef = Start (+|-) Iter * Step'.
6803   if (!Update.isUsable() || !UpdateVal.isUsable()) {
6804     Update = SemaRef.BuildBinOp(S, Loc, Subtract ? BO_Sub : BO_Add,
6805                                 NewStart.get(), SavedUpdate.get());
6806     if (!Update.isUsable())
6807       return ExprError();
6808 
6809     if (!SemaRef.Context.hasSameType(Update.get()->getType(),
6810                                      VarRef.get()->getType())) {
6811       Update = SemaRef.PerformImplicitConversion(
6812           Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true);
6813       if (!Update.isUsable())
6814         return ExprError();
6815     }
6816 
6817     Update = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), Update.get());
6818   }
6819   return Update;
6820 }
6821 
6822 /// Convert integer expression \a E to make it have at least \a Bits
6823 /// bits.
6824 static ExprResult widenIterationCount(unsigned Bits, Expr *E, Sema &SemaRef) {
6825   if (E == nullptr)
6826     return ExprError();
6827   ASTContext &C = SemaRef.Context;
6828   QualType OldType = E->getType();
6829   unsigned HasBits = C.getTypeSize(OldType);
6830   if (HasBits >= Bits)
6831     return ExprResult(E);
6832   // OK to convert to signed, because new type has more bits than old.
6833   QualType NewType = C.getIntTypeForBitwidth(Bits, /* Signed */ true);
6834   return SemaRef.PerformImplicitConversion(E, NewType, Sema::AA_Converting,
6835                                            true);
6836 }
6837 
6838 /// Check if the given expression \a E is a constant integer that fits
6839 /// into \a Bits bits.
6840 static bool fitsInto(unsigned Bits, bool Signed, const Expr *E, Sema &SemaRef) {
6841   if (E == nullptr)
6842     return false;
6843   llvm::APSInt Result;
6844   if (E->isIntegerConstantExpr(Result, SemaRef.Context))
6845     return Signed ? Result.isSignedIntN(Bits) : Result.isIntN(Bits);
6846   return false;
6847 }
6848 
6849 /// Build preinits statement for the given declarations.
6850 static Stmt *buildPreInits(ASTContext &Context,
6851                            MutableArrayRef<Decl *> PreInits) {
6852   if (!PreInits.empty()) {
6853     return new (Context) DeclStmt(
6854         DeclGroupRef::Create(Context, PreInits.begin(), PreInits.size()),
6855         SourceLocation(), SourceLocation());
6856   }
6857   return nullptr;
6858 }
6859 
6860 /// Build preinits statement for the given declarations.
6861 static Stmt *
6862 buildPreInits(ASTContext &Context,
6863               const llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {
6864   if (!Captures.empty()) {
6865     SmallVector<Decl *, 16> PreInits;
6866     for (const auto &Pair : Captures)
6867       PreInits.push_back(Pair.second->getDecl());
6868     return buildPreInits(Context, PreInits);
6869   }
6870   return nullptr;
6871 }
6872 
6873 /// Build postupdate expression for the given list of postupdates expressions.
6874 static Expr *buildPostUpdate(Sema &S, ArrayRef<Expr *> PostUpdates) {
6875   Expr *PostUpdate = nullptr;
6876   if (!PostUpdates.empty()) {
6877     for (Expr *E : PostUpdates) {
6878       Expr *ConvE = S.BuildCStyleCastExpr(
6879                          E->getExprLoc(),
6880                          S.Context.getTrivialTypeSourceInfo(S.Context.VoidTy),
6881                          E->getExprLoc(), E)
6882                         .get();
6883       PostUpdate = PostUpdate
6884                        ? S.CreateBuiltinBinOp(ConvE->getExprLoc(), BO_Comma,
6885                                               PostUpdate, ConvE)
6886                              .get()
6887                        : ConvE;
6888     }
6889   }
6890   return PostUpdate;
6891 }
6892 
6893 /// Called on a for stmt to check itself and nested loops (if any).
6894 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop,
6895 /// number of collapsed loops otherwise.
6896 static unsigned
6897 checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr,
6898                 Expr *OrderedLoopCountExpr, Stmt *AStmt, Sema &SemaRef,
6899                 DSAStackTy &DSA,
6900                 Sema::VarsWithInheritedDSAType &VarsWithImplicitDSA,
6901                 OMPLoopDirective::HelperExprs &Built) {
6902   unsigned NestedLoopCount = 1;
6903   if (CollapseLoopCountExpr) {
6904     // Found 'collapse' clause - calculate collapse number.
6905     Expr::EvalResult Result;
6906     if (!CollapseLoopCountExpr->isValueDependent() &&
6907         CollapseLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext())) {
6908       NestedLoopCount = Result.Val.getInt().getLimitedValue();
6909     } else {
6910       Built.clear(/*Size=*/1);
6911       return 1;
6912     }
6913   }
6914   unsigned OrderedLoopCount = 1;
6915   if (OrderedLoopCountExpr) {
6916     // Found 'ordered' clause - calculate collapse number.
6917     Expr::EvalResult EVResult;
6918     if (!OrderedLoopCountExpr->isValueDependent() &&
6919         OrderedLoopCountExpr->EvaluateAsInt(EVResult,
6920                                             SemaRef.getASTContext())) {
6921       llvm::APSInt Result = EVResult.Val.getInt();
6922       if (Result.getLimitedValue() < NestedLoopCount) {
6923         SemaRef.Diag(OrderedLoopCountExpr->getExprLoc(),
6924                      diag::err_omp_wrong_ordered_loop_count)
6925             << OrderedLoopCountExpr->getSourceRange();
6926         SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(),
6927                      diag::note_collapse_loop_count)
6928             << CollapseLoopCountExpr->getSourceRange();
6929       }
6930       OrderedLoopCount = Result.getLimitedValue();
6931     } else {
6932       Built.clear(/*Size=*/1);
6933       return 1;
6934     }
6935   }
6936   // This is helper routine for loop directives (e.g., 'for', 'simd',
6937   // 'for simd', etc.).
6938   llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
6939   SmallVector<LoopIterationSpace, 4> IterSpaces(
6940       std::max(OrderedLoopCount, NestedLoopCount));
6941   Stmt *CurStmt = AStmt->IgnoreContainers(/* IgnoreCaptured */ true);
6942   for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) {
6943     if (checkOpenMPIterationSpace(
6944             DKind, CurStmt, SemaRef, DSA, Cnt, NestedLoopCount,
6945             std::max(OrderedLoopCount, NestedLoopCount), CollapseLoopCountExpr,
6946             OrderedLoopCountExpr, VarsWithImplicitDSA, IterSpaces, Captures))
6947       return 0;
6948     // Move on to the next nested for loop, or to the loop body.
6949     // OpenMP [2.8.1, simd construct, Restrictions]
6950     // All loops associated with the construct must be perfectly nested; that
6951     // is, there must be no intervening code nor any OpenMP directive between
6952     // any two loops.
6953     if (auto *For = dyn_cast<ForStmt>(CurStmt)) {
6954       CurStmt = For->getBody();
6955     } else {
6956       assert(isa<CXXForRangeStmt>(CurStmt) &&
6957              "Expected canonical for or range-based for loops.");
6958       CurStmt = cast<CXXForRangeStmt>(CurStmt)->getBody();
6959     }
6960     CurStmt = CurStmt->IgnoreContainers();
6961   }
6962   for (unsigned Cnt = NestedLoopCount; Cnt < OrderedLoopCount; ++Cnt) {
6963     if (checkOpenMPIterationSpace(
6964             DKind, CurStmt, SemaRef, DSA, Cnt, NestedLoopCount,
6965             std::max(OrderedLoopCount, NestedLoopCount), CollapseLoopCountExpr,
6966             OrderedLoopCountExpr, VarsWithImplicitDSA, IterSpaces, Captures))
6967       return 0;
6968     if (Cnt > 0 && IterSpaces[Cnt].CounterVar) {
6969       // Handle initialization of captured loop iterator variables.
6970       auto *DRE = cast<DeclRefExpr>(IterSpaces[Cnt].CounterVar);
6971       if (isa<OMPCapturedExprDecl>(DRE->getDecl())) {
6972         Captures[DRE] = DRE;
6973       }
6974     }
6975     // Move on to the next nested for loop, or to the loop body.
6976     // OpenMP [2.8.1, simd construct, Restrictions]
6977     // All loops associated with the construct must be perfectly nested; that
6978     // is, there must be no intervening code nor any OpenMP directive between
6979     // any two loops.
6980     if (auto *For = dyn_cast<ForStmt>(CurStmt)) {
6981       CurStmt = For->getBody();
6982     } else {
6983       assert(isa<CXXForRangeStmt>(CurStmt) &&
6984              "Expected canonical for or range-based for loops.");
6985       CurStmt = cast<CXXForRangeStmt>(CurStmt)->getBody();
6986     }
6987     CurStmt = CurStmt->IgnoreContainers();
6988   }
6989 
6990   Built.clear(/* size */ NestedLoopCount);
6991 
6992   if (SemaRef.CurContext->isDependentContext())
6993     return NestedLoopCount;
6994 
6995   // An example of what is generated for the following code:
6996   //
6997   //   #pragma omp simd collapse(2) ordered(2)
6998   //   for (i = 0; i < NI; ++i)
6999   //     for (k = 0; k < NK; ++k)
7000   //       for (j = J0; j < NJ; j+=2) {
7001   //         <loop body>
7002   //       }
7003   //
7004   // We generate the code below.
7005   // Note: the loop body may be outlined in CodeGen.
7006   // Note: some counters may be C++ classes, operator- is used to find number of
7007   // iterations and operator+= to calculate counter value.
7008   // Note: decltype(NumIterations) must be integer type (in 'omp for', only i32
7009   // or i64 is currently supported).
7010   //
7011   //   #define NumIterations (NI * ((NJ - J0 - 1 + 2) / 2))
7012   //   for (int[32|64]_t IV = 0; IV < NumIterations; ++IV ) {
7013   //     .local.i = IV / ((NJ - J0 - 1 + 2) / 2);
7014   //     .local.j = J0 + (IV % ((NJ - J0 - 1 + 2) / 2)) * 2;
7015   //     // similar updates for vars in clauses (e.g. 'linear')
7016   //     <loop body (using local i and j)>
7017   //   }
7018   //   i = NI; // assign final values of counters
7019   //   j = NJ;
7020   //
7021 
7022   // Last iteration number is (I1 * I2 * ... In) - 1, where I1, I2 ... In are
7023   // the iteration counts of the collapsed for loops.
7024   // Precondition tests if there is at least one iteration (all conditions are
7025   // true).
7026   auto PreCond = ExprResult(IterSpaces[0].PreCond);
7027   Expr *N0 = IterSpaces[0].NumIterations;
7028   ExprResult LastIteration32 =
7029       widenIterationCount(/*Bits=*/32,
7030                           SemaRef
7031                               .PerformImplicitConversion(
7032                                   N0->IgnoreImpCasts(), N0->getType(),
7033                                   Sema::AA_Converting, /*AllowExplicit=*/true)
7034                               .get(),
7035                           SemaRef);
7036   ExprResult LastIteration64 = widenIterationCount(
7037       /*Bits=*/64,
7038       SemaRef
7039           .PerformImplicitConversion(N0->IgnoreImpCasts(), N0->getType(),
7040                                      Sema::AA_Converting,
7041                                      /*AllowExplicit=*/true)
7042           .get(),
7043       SemaRef);
7044 
7045   if (!LastIteration32.isUsable() || !LastIteration64.isUsable())
7046     return NestedLoopCount;
7047 
7048   ASTContext &C = SemaRef.Context;
7049   bool AllCountsNeedLessThan32Bits = C.getTypeSize(N0->getType()) < 32;
7050 
7051   Scope *CurScope = DSA.getCurScope();
7052   for (unsigned Cnt = 1; Cnt < NestedLoopCount; ++Cnt) {
7053     if (PreCond.isUsable()) {
7054       PreCond =
7055           SemaRef.BuildBinOp(CurScope, PreCond.get()->getExprLoc(), BO_LAnd,
7056                              PreCond.get(), IterSpaces[Cnt].PreCond);
7057     }
7058     Expr *N = IterSpaces[Cnt].NumIterations;
7059     SourceLocation Loc = N->getExprLoc();
7060     AllCountsNeedLessThan32Bits &= C.getTypeSize(N->getType()) < 32;
7061     if (LastIteration32.isUsable())
7062       LastIteration32 = SemaRef.BuildBinOp(
7063           CurScope, Loc, BO_Mul, LastIteration32.get(),
7064           SemaRef
7065               .PerformImplicitConversion(N->IgnoreImpCasts(), N->getType(),
7066                                          Sema::AA_Converting,
7067                                          /*AllowExplicit=*/true)
7068               .get());
7069     if (LastIteration64.isUsable())
7070       LastIteration64 = SemaRef.BuildBinOp(
7071           CurScope, Loc, BO_Mul, LastIteration64.get(),
7072           SemaRef
7073               .PerformImplicitConversion(N->IgnoreImpCasts(), N->getType(),
7074                                          Sema::AA_Converting,
7075                                          /*AllowExplicit=*/true)
7076               .get());
7077   }
7078 
7079   // Choose either the 32-bit or 64-bit version.
7080   ExprResult LastIteration = LastIteration64;
7081   if (SemaRef.getLangOpts().OpenMPOptimisticCollapse ||
7082       (LastIteration32.isUsable() &&
7083        C.getTypeSize(LastIteration32.get()->getType()) == 32 &&
7084        (AllCountsNeedLessThan32Bits || NestedLoopCount == 1 ||
7085         fitsInto(
7086             /*Bits=*/32,
7087             LastIteration32.get()->getType()->hasSignedIntegerRepresentation(),
7088             LastIteration64.get(), SemaRef))))
7089     LastIteration = LastIteration32;
7090   QualType VType = LastIteration.get()->getType();
7091   QualType RealVType = VType;
7092   QualType StrideVType = VType;
7093   if (isOpenMPTaskLoopDirective(DKind)) {
7094     VType =
7095         SemaRef.Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/0);
7096     StrideVType =
7097         SemaRef.Context.getIntTypeForBitwidth(/*DestWidth=*/64, /*Signed=*/1);
7098   }
7099 
7100   if (!LastIteration.isUsable())
7101     return 0;
7102 
7103   // Save the number of iterations.
7104   ExprResult NumIterations = LastIteration;
7105   {
7106     LastIteration = SemaRef.BuildBinOp(
7107         CurScope, LastIteration.get()->getExprLoc(), BO_Sub,
7108         LastIteration.get(),
7109         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
7110     if (!LastIteration.isUsable())
7111       return 0;
7112   }
7113 
7114   // Calculate the last iteration number beforehand instead of doing this on
7115   // each iteration. Do not do this if the number of iterations may be kfold-ed.
7116   llvm::APSInt Result;
7117   bool IsConstant =
7118       LastIteration.get()->isIntegerConstantExpr(Result, SemaRef.Context);
7119   ExprResult CalcLastIteration;
7120   if (!IsConstant) {
7121     ExprResult SaveRef =
7122         tryBuildCapture(SemaRef, LastIteration.get(), Captures);
7123     LastIteration = SaveRef;
7124 
7125     // Prepare SaveRef + 1.
7126     NumIterations = SemaRef.BuildBinOp(
7127         CurScope, SaveRef.get()->getExprLoc(), BO_Add, SaveRef.get(),
7128         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get());
7129     if (!NumIterations.isUsable())
7130       return 0;
7131   }
7132 
7133   SourceLocation InitLoc = IterSpaces[0].InitSrcRange.getBegin();
7134 
7135   // Build variables passed into runtime, necessary for worksharing directives.
7136   ExprResult LB, UB, IL, ST, EUB, CombLB, CombUB, PrevLB, PrevUB, CombEUB;
7137   if (isOpenMPWorksharingDirective(DKind) || isOpenMPTaskLoopDirective(DKind) ||
7138       isOpenMPDistributeDirective(DKind)) {
7139     // Lower bound variable, initialized with zero.
7140     VarDecl *LBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.lb");
7141     LB = buildDeclRefExpr(SemaRef, LBDecl, VType, InitLoc);
7142     SemaRef.AddInitializerToDecl(LBDecl,
7143                                  SemaRef.ActOnIntegerConstant(InitLoc, 0).get(),
7144                                  /*DirectInit*/ false);
7145 
7146     // Upper bound variable, initialized with last iteration number.
7147     VarDecl *UBDecl = buildVarDecl(SemaRef, InitLoc, VType, ".omp.ub");
7148     UB = buildDeclRefExpr(SemaRef, UBDecl, VType, InitLoc);
7149     SemaRef.AddInitializerToDecl(UBDecl, LastIteration.get(),
7150                                  /*DirectInit*/ false);
7151 
7152     // A 32-bit variable-flag where runtime returns 1 for the last iteration.
7153     // This will be used to implement clause 'lastprivate'.
7154     QualType Int32Ty = SemaRef.Context.getIntTypeForBitwidth(32, true);
7155     VarDecl *ILDecl = buildVarDecl(SemaRef, InitLoc, Int32Ty, ".omp.is_last");
7156     IL = buildDeclRefExpr(SemaRef, ILDecl, Int32Ty, InitLoc);
7157     SemaRef.AddInitializerToDecl(ILDecl,
7158                                  SemaRef.ActOnIntegerConstant(InitLoc, 0).get(),
7159                                  /*DirectInit*/ false);
7160 
7161     // Stride variable returned by runtime (we initialize it to 1 by default).
7162     VarDecl *STDecl =
7163         buildVarDecl(SemaRef, InitLoc, StrideVType, ".omp.stride");
7164     ST = buildDeclRefExpr(SemaRef, STDecl, StrideVType, InitLoc);
7165     SemaRef.AddInitializerToDecl(STDecl,
7166                                  SemaRef.ActOnIntegerConstant(InitLoc, 1).get(),
7167                                  /*DirectInit*/ false);
7168 
7169     // Build expression: UB = min(UB, LastIteration)
7170     // It is necessary for CodeGen of directives with static scheduling.
7171     ExprResult IsUBGreater = SemaRef.BuildBinOp(CurScope, InitLoc, BO_GT,
7172                                                 UB.get(), LastIteration.get());
7173     ExprResult CondOp = SemaRef.ActOnConditionalOp(
7174         LastIteration.get()->getExprLoc(), InitLoc, IsUBGreater.get(),
7175         LastIteration.get(), UB.get());
7176     EUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, UB.get(),
7177                              CondOp.get());
7178     EUB = SemaRef.ActOnFinishFullExpr(EUB.get(), /*DiscardedValue*/ false);
7179 
7180     // If we have a combined directive that combines 'distribute', 'for' or
7181     // 'simd' we need to be able to access the bounds of the schedule of the
7182     // enclosing region. E.g. in 'distribute parallel for' the bounds obtained
7183     // by scheduling 'distribute' have to be passed to the schedule of 'for'.
7184     if (isOpenMPLoopBoundSharingDirective(DKind)) {
7185       // Lower bound variable, initialized with zero.
7186       VarDecl *CombLBDecl =
7187           buildVarDecl(SemaRef, InitLoc, VType, ".omp.comb.lb");
7188       CombLB = buildDeclRefExpr(SemaRef, CombLBDecl, VType, InitLoc);
7189       SemaRef.AddInitializerToDecl(
7190           CombLBDecl, SemaRef.ActOnIntegerConstant(InitLoc, 0).get(),
7191           /*DirectInit*/ false);
7192 
7193       // Upper bound variable, initialized with last iteration number.
7194       VarDecl *CombUBDecl =
7195           buildVarDecl(SemaRef, InitLoc, VType, ".omp.comb.ub");
7196       CombUB = buildDeclRefExpr(SemaRef, CombUBDecl, VType, InitLoc);
7197       SemaRef.AddInitializerToDecl(CombUBDecl, LastIteration.get(),
7198                                    /*DirectInit*/ false);
7199 
7200       ExprResult CombIsUBGreater = SemaRef.BuildBinOp(
7201           CurScope, InitLoc, BO_GT, CombUB.get(), LastIteration.get());
7202       ExprResult CombCondOp =
7203           SemaRef.ActOnConditionalOp(InitLoc, InitLoc, CombIsUBGreater.get(),
7204                                      LastIteration.get(), CombUB.get());
7205       CombEUB = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, CombUB.get(),
7206                                    CombCondOp.get());
7207       CombEUB =
7208           SemaRef.ActOnFinishFullExpr(CombEUB.get(), /*DiscardedValue*/ false);
7209 
7210       const CapturedDecl *CD = cast<CapturedStmt>(AStmt)->getCapturedDecl();
7211       // We expect to have at least 2 more parameters than the 'parallel'
7212       // directive does - the lower and upper bounds of the previous schedule.
7213       assert(CD->getNumParams() >= 4 &&
7214              "Unexpected number of parameters in loop combined directive");
7215 
7216       // Set the proper type for the bounds given what we learned from the
7217       // enclosed loops.
7218       ImplicitParamDecl *PrevLBDecl = CD->getParam(/*PrevLB=*/2);
7219       ImplicitParamDecl *PrevUBDecl = CD->getParam(/*PrevUB=*/3);
7220 
7221       // Previous lower and upper bounds are obtained from the region
7222       // parameters.
7223       PrevLB =
7224           buildDeclRefExpr(SemaRef, PrevLBDecl, PrevLBDecl->getType(), InitLoc);
7225       PrevUB =
7226           buildDeclRefExpr(SemaRef, PrevUBDecl, PrevUBDecl->getType(), InitLoc);
7227     }
7228   }
7229 
7230   // Build the iteration variable and its initialization before loop.
7231   ExprResult IV;
7232   ExprResult Init, CombInit;
7233   {
7234     VarDecl *IVDecl = buildVarDecl(SemaRef, InitLoc, RealVType, ".omp.iv");
7235     IV = buildDeclRefExpr(SemaRef, IVDecl, RealVType, InitLoc);
7236     Expr *RHS =
7237         (isOpenMPWorksharingDirective(DKind) ||
7238          isOpenMPTaskLoopDirective(DKind) || isOpenMPDistributeDirective(DKind))
7239             ? LB.get()
7240             : SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get();
7241     Init = SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, IV.get(), RHS);
7242     Init = SemaRef.ActOnFinishFullExpr(Init.get(), /*DiscardedValue*/ false);
7243 
7244     if (isOpenMPLoopBoundSharingDirective(DKind)) {
7245       Expr *CombRHS =
7246           (isOpenMPWorksharingDirective(DKind) ||
7247            isOpenMPTaskLoopDirective(DKind) ||
7248            isOpenMPDistributeDirective(DKind))
7249               ? CombLB.get()
7250               : SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get();
7251       CombInit =
7252           SemaRef.BuildBinOp(CurScope, InitLoc, BO_Assign, IV.get(), CombRHS);
7253       CombInit =
7254           SemaRef.ActOnFinishFullExpr(CombInit.get(), /*DiscardedValue*/ false);
7255     }
7256   }
7257 
7258   bool UseStrictCompare =
7259       RealVType->hasUnsignedIntegerRepresentation() &&
7260       llvm::all_of(IterSpaces, [](const LoopIterationSpace &LIS) {
7261         return LIS.IsStrictCompare;
7262       });
7263   // Loop condition (IV < NumIterations) or (IV <= UB or IV < UB + 1 (for
7264   // unsigned IV)) for worksharing loops.
7265   SourceLocation CondLoc = AStmt->getBeginLoc();
7266   Expr *BoundUB = UB.get();
7267   if (UseStrictCompare) {
7268     BoundUB =
7269         SemaRef
7270             .BuildBinOp(CurScope, CondLoc, BO_Add, BoundUB,
7271                         SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get())
7272             .get();
7273     BoundUB =
7274         SemaRef.ActOnFinishFullExpr(BoundUB, /*DiscardedValue*/ false).get();
7275   }
7276   ExprResult Cond =
7277       (isOpenMPWorksharingDirective(DKind) ||
7278        isOpenMPTaskLoopDirective(DKind) || isOpenMPDistributeDirective(DKind))
7279           ? SemaRef.BuildBinOp(CurScope, CondLoc,
7280                                UseStrictCompare ? BO_LT : BO_LE, IV.get(),
7281                                BoundUB)
7282           : SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
7283                                NumIterations.get());
7284   ExprResult CombDistCond;
7285   if (isOpenMPLoopBoundSharingDirective(DKind)) {
7286     CombDistCond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(),
7287                                       NumIterations.get());
7288   }
7289 
7290   ExprResult CombCond;
7291   if (isOpenMPLoopBoundSharingDirective(DKind)) {
7292     Expr *BoundCombUB = CombUB.get();
7293     if (UseStrictCompare) {
7294       BoundCombUB =
7295           SemaRef
7296               .BuildBinOp(
7297                   CurScope, CondLoc, BO_Add, BoundCombUB,
7298                   SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get())
7299               .get();
7300       BoundCombUB =
7301           SemaRef.ActOnFinishFullExpr(BoundCombUB, /*DiscardedValue*/ false)
7302               .get();
7303     }
7304     CombCond =
7305         SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE,
7306                            IV.get(), BoundCombUB);
7307   }
7308   // Loop increment (IV = IV + 1)
7309   SourceLocation IncLoc = AStmt->getBeginLoc();
7310   ExprResult Inc =
7311       SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, IV.get(),
7312                          SemaRef.ActOnIntegerConstant(IncLoc, 1).get());
7313   if (!Inc.isUsable())
7314     return 0;
7315   Inc = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, IV.get(), Inc.get());
7316   Inc = SemaRef.ActOnFinishFullExpr(Inc.get(), /*DiscardedValue*/ false);
7317   if (!Inc.isUsable())
7318     return 0;
7319 
7320   // Increments for worksharing loops (LB = LB + ST; UB = UB + ST).
7321   // Used for directives with static scheduling.
7322   // In combined construct, add combined version that use CombLB and CombUB
7323   // base variables for the update
7324   ExprResult NextLB, NextUB, CombNextLB, CombNextUB;
7325   if (isOpenMPWorksharingDirective(DKind) || isOpenMPTaskLoopDirective(DKind) ||
7326       isOpenMPDistributeDirective(DKind)) {
7327     // LB + ST
7328     NextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, LB.get(), ST.get());
7329     if (!NextLB.isUsable())
7330       return 0;
7331     // LB = LB + ST
7332     NextLB =
7333         SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, LB.get(), NextLB.get());
7334     NextLB =
7335         SemaRef.ActOnFinishFullExpr(NextLB.get(), /*DiscardedValue*/ false);
7336     if (!NextLB.isUsable())
7337       return 0;
7338     // UB + ST
7339     NextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, UB.get(), ST.get());
7340     if (!NextUB.isUsable())
7341       return 0;
7342     // UB = UB + ST
7343     NextUB =
7344         SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, UB.get(), NextUB.get());
7345     NextUB =
7346         SemaRef.ActOnFinishFullExpr(NextUB.get(), /*DiscardedValue*/ false);
7347     if (!NextUB.isUsable())
7348       return 0;
7349     if (isOpenMPLoopBoundSharingDirective(DKind)) {
7350       CombNextLB =
7351           SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, CombLB.get(), ST.get());
7352       if (!NextLB.isUsable())
7353         return 0;
7354       // LB = LB + ST
7355       CombNextLB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombLB.get(),
7356                                       CombNextLB.get());
7357       CombNextLB = SemaRef.ActOnFinishFullExpr(CombNextLB.get(),
7358                                                /*DiscardedValue*/ false);
7359       if (!CombNextLB.isUsable())
7360         return 0;
7361       // UB + ST
7362       CombNextUB =
7363           SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, CombUB.get(), ST.get());
7364       if (!CombNextUB.isUsable())
7365         return 0;
7366       // UB = UB + ST
7367       CombNextUB = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, CombUB.get(),
7368                                       CombNextUB.get());
7369       CombNextUB = SemaRef.ActOnFinishFullExpr(CombNextUB.get(),
7370                                                /*DiscardedValue*/ false);
7371       if (!CombNextUB.isUsable())
7372         return 0;
7373     }
7374   }
7375 
7376   // Create increment expression for distribute loop when combined in a same
7377   // directive with for as IV = IV + ST; ensure upper bound expression based
7378   // on PrevUB instead of NumIterations - used to implement 'for' when found
7379   // in combination with 'distribute', like in 'distribute parallel for'
7380   SourceLocation DistIncLoc = AStmt->getBeginLoc();
7381   ExprResult DistCond, DistInc, PrevEUB, ParForInDistCond;
7382   if (isOpenMPLoopBoundSharingDirective(DKind)) {
7383     DistCond = SemaRef.BuildBinOp(
7384         CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE, IV.get(), BoundUB);
7385     assert(DistCond.isUsable() && "distribute cond expr was not built");
7386 
7387     DistInc =
7388         SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Add, IV.get(), ST.get());
7389     assert(DistInc.isUsable() && "distribute inc expr was not built");
7390     DistInc = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, IV.get(),
7391                                  DistInc.get());
7392     DistInc =
7393         SemaRef.ActOnFinishFullExpr(DistInc.get(), /*DiscardedValue*/ false);
7394     assert(DistInc.isUsable() && "distribute inc expr was not built");
7395 
7396     // Build expression: UB = min(UB, prevUB) for #for in composite or combined
7397     // construct
7398     SourceLocation DistEUBLoc = AStmt->getBeginLoc();
7399     ExprResult IsUBGreater =
7400         SemaRef.BuildBinOp(CurScope, DistEUBLoc, BO_GT, UB.get(), PrevUB.get());
7401     ExprResult CondOp = SemaRef.ActOnConditionalOp(
7402         DistEUBLoc, DistEUBLoc, IsUBGreater.get(), PrevUB.get(), UB.get());
7403     PrevEUB = SemaRef.BuildBinOp(CurScope, DistIncLoc, BO_Assign, UB.get(),
7404                                  CondOp.get());
7405     PrevEUB =
7406         SemaRef.ActOnFinishFullExpr(PrevEUB.get(), /*DiscardedValue*/ false);
7407 
7408     // Build IV <= PrevUB or IV < PrevUB + 1 for unsigned IV to be used in
7409     // parallel for is in combination with a distribute directive with
7410     // schedule(static, 1)
7411     Expr *BoundPrevUB = PrevUB.get();
7412     if (UseStrictCompare) {
7413       BoundPrevUB =
7414           SemaRef
7415               .BuildBinOp(
7416                   CurScope, CondLoc, BO_Add, BoundPrevUB,
7417                   SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get())
7418               .get();
7419       BoundPrevUB =
7420           SemaRef.ActOnFinishFullExpr(BoundPrevUB, /*DiscardedValue*/ false)
7421               .get();
7422     }
7423     ParForInDistCond =
7424         SemaRef.BuildBinOp(CurScope, CondLoc, UseStrictCompare ? BO_LT : BO_LE,
7425                            IV.get(), BoundPrevUB);
7426   }
7427 
7428   // Build updates and final values of the loop counters.
7429   bool HasErrors = false;
7430   Built.Counters.resize(NestedLoopCount);
7431   Built.Inits.resize(NestedLoopCount);
7432   Built.Updates.resize(NestedLoopCount);
7433   Built.Finals.resize(NestedLoopCount);
7434   Built.DependentCounters.resize(NestedLoopCount);
7435   Built.DependentInits.resize(NestedLoopCount);
7436   Built.FinalsConditions.resize(NestedLoopCount);
7437   {
7438     // We implement the following algorithm for obtaining the
7439     // original loop iteration variable values based on the
7440     // value of the collapsed loop iteration variable IV.
7441     //
7442     // Let n+1 be the number of collapsed loops in the nest.
7443     // Iteration variables (I0, I1, .... In)
7444     // Iteration counts (N0, N1, ... Nn)
7445     //
7446     // Acc = IV;
7447     //
7448     // To compute Ik for loop k, 0 <= k <= n, generate:
7449     //    Prod = N(k+1) * N(k+2) * ... * Nn;
7450     //    Ik = Acc / Prod;
7451     //    Acc -= Ik * Prod;
7452     //
7453     ExprResult Acc = IV;
7454     for (unsigned int Cnt = 0; Cnt < NestedLoopCount; ++Cnt) {
7455       LoopIterationSpace &IS = IterSpaces[Cnt];
7456       SourceLocation UpdLoc = IS.IncSrcRange.getBegin();
7457       ExprResult Iter;
7458 
7459       // Compute prod
7460       ExprResult Prod =
7461           SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get();
7462       for (unsigned int K = Cnt+1; K < NestedLoopCount; ++K)
7463         Prod = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Mul, Prod.get(),
7464                                   IterSpaces[K].NumIterations);
7465 
7466       // Iter = Acc / Prod
7467       // If there is at least one more inner loop to avoid
7468       // multiplication by 1.
7469       if (Cnt + 1 < NestedLoopCount)
7470         Iter = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Div,
7471                                   Acc.get(), Prod.get());
7472       else
7473         Iter = Acc;
7474       if (!Iter.isUsable()) {
7475         HasErrors = true;
7476         break;
7477       }
7478 
7479       // Update Acc:
7480       // Acc -= Iter * Prod
7481       // Check if there is at least one more inner loop to avoid
7482       // multiplication by 1.
7483       if (Cnt + 1 < NestedLoopCount)
7484         Prod = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Mul,
7485                                   Iter.get(), Prod.get());
7486       else
7487         Prod = Iter;
7488       Acc = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Sub,
7489                                Acc.get(), Prod.get());
7490 
7491       // Build update: IS.CounterVar(Private) = IS.Start + Iter * IS.Step
7492       auto *VD = cast<VarDecl>(cast<DeclRefExpr>(IS.CounterVar)->getDecl());
7493       DeclRefExpr *CounterVar = buildDeclRefExpr(
7494           SemaRef, VD, IS.CounterVar->getType(), IS.CounterVar->getExprLoc(),
7495           /*RefersToCapture=*/true);
7496       ExprResult Init =
7497           buildCounterInit(SemaRef, CurScope, UpdLoc, CounterVar,
7498                            IS.CounterInit, IS.IsNonRectangularLB, Captures);
7499       if (!Init.isUsable()) {
7500         HasErrors = true;
7501         break;
7502       }
7503       ExprResult Update = buildCounterUpdate(
7504           SemaRef, CurScope, UpdLoc, CounterVar, IS.CounterInit, Iter,
7505           IS.CounterStep, IS.Subtract, IS.IsNonRectangularLB, &Captures);
7506       if (!Update.isUsable()) {
7507         HasErrors = true;
7508         break;
7509       }
7510 
7511       // Build final: IS.CounterVar = IS.Start + IS.NumIters * IS.Step
7512       ExprResult Final =
7513           buildCounterUpdate(SemaRef, CurScope, UpdLoc, CounterVar,
7514                              IS.CounterInit, IS.NumIterations, IS.CounterStep,
7515                              IS.Subtract, IS.IsNonRectangularLB, &Captures);
7516       if (!Final.isUsable()) {
7517         HasErrors = true;
7518         break;
7519       }
7520 
7521       if (!Update.isUsable() || !Final.isUsable()) {
7522         HasErrors = true;
7523         break;
7524       }
7525       // Save results
7526       Built.Counters[Cnt] = IS.CounterVar;
7527       Built.PrivateCounters[Cnt] = IS.PrivateCounterVar;
7528       Built.Inits[Cnt] = Init.get();
7529       Built.Updates[Cnt] = Update.get();
7530       Built.Finals[Cnt] = Final.get();
7531       Built.DependentCounters[Cnt] = nullptr;
7532       Built.DependentInits[Cnt] = nullptr;
7533       Built.FinalsConditions[Cnt] = nullptr;
7534       if (IS.IsNonRectangularLB || IS.IsNonRectangularUB) {
7535         Built.DependentCounters[Cnt] =
7536             Built.Counters[NestedLoopCount - 1 - IS.LoopDependentIdx];
7537         Built.DependentInits[Cnt] =
7538             Built.Inits[NestedLoopCount - 1 - IS.LoopDependentIdx];
7539         Built.FinalsConditions[Cnt] = IS.FinalCondition;
7540       }
7541     }
7542   }
7543 
7544   if (HasErrors)
7545     return 0;
7546 
7547   // Save results
7548   Built.IterationVarRef = IV.get();
7549   Built.LastIteration = LastIteration.get();
7550   Built.NumIterations = NumIterations.get();
7551   Built.CalcLastIteration = SemaRef
7552                                 .ActOnFinishFullExpr(CalcLastIteration.get(),
7553                                                      /*DiscardedValue=*/false)
7554                                 .get();
7555   Built.PreCond = PreCond.get();
7556   Built.PreInits = buildPreInits(C, Captures);
7557   Built.Cond = Cond.get();
7558   Built.Init = Init.get();
7559   Built.Inc = Inc.get();
7560   Built.LB = LB.get();
7561   Built.UB = UB.get();
7562   Built.IL = IL.get();
7563   Built.ST = ST.get();
7564   Built.EUB = EUB.get();
7565   Built.NLB = NextLB.get();
7566   Built.NUB = NextUB.get();
7567   Built.PrevLB = PrevLB.get();
7568   Built.PrevUB = PrevUB.get();
7569   Built.DistInc = DistInc.get();
7570   Built.PrevEUB = PrevEUB.get();
7571   Built.DistCombinedFields.LB = CombLB.get();
7572   Built.DistCombinedFields.UB = CombUB.get();
7573   Built.DistCombinedFields.EUB = CombEUB.get();
7574   Built.DistCombinedFields.Init = CombInit.get();
7575   Built.DistCombinedFields.Cond = CombCond.get();
7576   Built.DistCombinedFields.NLB = CombNextLB.get();
7577   Built.DistCombinedFields.NUB = CombNextUB.get();
7578   Built.DistCombinedFields.DistCond = CombDistCond.get();
7579   Built.DistCombinedFields.ParForInDistCond = ParForInDistCond.get();
7580 
7581   return NestedLoopCount;
7582 }
7583 
7584 static Expr *getCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) {
7585   auto CollapseClauses =
7586       OMPExecutableDirective::getClausesOfKind<OMPCollapseClause>(Clauses);
7587   if (CollapseClauses.begin() != CollapseClauses.end())
7588     return (*CollapseClauses.begin())->getNumForLoops();
7589   return nullptr;
7590 }
7591 
7592 static Expr *getOrderedNumberExpr(ArrayRef<OMPClause *> Clauses) {
7593   auto OrderedClauses =
7594       OMPExecutableDirective::getClausesOfKind<OMPOrderedClause>(Clauses);
7595   if (OrderedClauses.begin() != OrderedClauses.end())
7596     return (*OrderedClauses.begin())->getNumForLoops();
7597   return nullptr;
7598 }
7599 
7600 static bool checkSimdlenSafelenSpecified(Sema &S,
7601                                          const ArrayRef<OMPClause *> Clauses) {
7602   const OMPSafelenClause *Safelen = nullptr;
7603   const OMPSimdlenClause *Simdlen = nullptr;
7604 
7605   for (const OMPClause *Clause : Clauses) {
7606     if (Clause->getClauseKind() == OMPC_safelen)
7607       Safelen = cast<OMPSafelenClause>(Clause);
7608     else if (Clause->getClauseKind() == OMPC_simdlen)
7609       Simdlen = cast<OMPSimdlenClause>(Clause);
7610     if (Safelen && Simdlen)
7611       break;
7612   }
7613 
7614   if (Simdlen && Safelen) {
7615     const Expr *SimdlenLength = Simdlen->getSimdlen();
7616     const Expr *SafelenLength = Safelen->getSafelen();
7617     if (SimdlenLength->isValueDependent() || SimdlenLength->isTypeDependent() ||
7618         SimdlenLength->isInstantiationDependent() ||
7619         SimdlenLength->containsUnexpandedParameterPack())
7620       return false;
7621     if (SafelenLength->isValueDependent() || SafelenLength->isTypeDependent() ||
7622         SafelenLength->isInstantiationDependent() ||
7623         SafelenLength->containsUnexpandedParameterPack())
7624       return false;
7625     Expr::EvalResult SimdlenResult, SafelenResult;
7626     SimdlenLength->EvaluateAsInt(SimdlenResult, S.Context);
7627     SafelenLength->EvaluateAsInt(SafelenResult, S.Context);
7628     llvm::APSInt SimdlenRes = SimdlenResult.Val.getInt();
7629     llvm::APSInt SafelenRes = SafelenResult.Val.getInt();
7630     // OpenMP 4.5 [2.8.1, simd Construct, Restrictions]
7631     // If both simdlen and safelen clauses are specified, the value of the
7632     // simdlen parameter must be less than or equal to the value of the safelen
7633     // parameter.
7634     if (SimdlenRes > SafelenRes) {
7635       S.Diag(SimdlenLength->getExprLoc(),
7636              diag::err_omp_wrong_simdlen_safelen_values)
7637           << SimdlenLength->getSourceRange() << SafelenLength->getSourceRange();
7638       return true;
7639     }
7640   }
7641   return false;
7642 }
7643 
7644 StmtResult
7645 Sema::ActOnOpenMPSimdDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
7646                                SourceLocation StartLoc, SourceLocation EndLoc,
7647                                VarsWithInheritedDSAType &VarsWithImplicitDSA) {
7648   if (!AStmt)
7649     return StmtError();
7650 
7651   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7652   OMPLoopDirective::HelperExprs B;
7653   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
7654   // define the nested loops number.
7655   unsigned NestedLoopCount = checkOpenMPLoop(
7656       OMPD_simd, getCollapseNumberExpr(Clauses), getOrderedNumberExpr(Clauses),
7657       AStmt, *this, *DSAStack, VarsWithImplicitDSA, B);
7658   if (NestedLoopCount == 0)
7659     return StmtError();
7660 
7661   assert((CurContext->isDependentContext() || B.builtAll()) &&
7662          "omp simd loop exprs were not built");
7663 
7664   if (!CurContext->isDependentContext()) {
7665     // Finalize the clauses that need pre-built expressions for CodeGen.
7666     for (OMPClause *C : Clauses) {
7667       if (auto *LC = dyn_cast<OMPLinearClause>(C))
7668         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
7669                                      B.NumIterations, *this, CurScope,
7670                                      DSAStack))
7671           return StmtError();
7672     }
7673   }
7674 
7675   if (checkSimdlenSafelenSpecified(*this, Clauses))
7676     return StmtError();
7677 
7678   setFunctionHasBranchProtectedScope();
7679   return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
7680                                   Clauses, AStmt, B);
7681 }
7682 
7683 StmtResult
7684 Sema::ActOnOpenMPForDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt,
7685                               SourceLocation StartLoc, SourceLocation EndLoc,
7686                               VarsWithInheritedDSAType &VarsWithImplicitDSA) {
7687   if (!AStmt)
7688     return StmtError();
7689 
7690   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7691   OMPLoopDirective::HelperExprs B;
7692   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
7693   // define the nested loops number.
7694   unsigned NestedLoopCount = checkOpenMPLoop(
7695       OMPD_for, getCollapseNumberExpr(Clauses), getOrderedNumberExpr(Clauses),
7696       AStmt, *this, *DSAStack, VarsWithImplicitDSA, B);
7697   if (NestedLoopCount == 0)
7698     return StmtError();
7699 
7700   assert((CurContext->isDependentContext() || B.builtAll()) &&
7701          "omp for loop exprs were not built");
7702 
7703   if (!CurContext->isDependentContext()) {
7704     // Finalize the clauses that need pre-built expressions for CodeGen.
7705     for (OMPClause *C : Clauses) {
7706       if (auto *LC = dyn_cast<OMPLinearClause>(C))
7707         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
7708                                      B.NumIterations, *this, CurScope,
7709                                      DSAStack))
7710           return StmtError();
7711     }
7712   }
7713 
7714   setFunctionHasBranchProtectedScope();
7715   return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
7716                                  Clauses, AStmt, B, DSAStack->isCancelRegion());
7717 }
7718 
7719 StmtResult Sema::ActOnOpenMPForSimdDirective(
7720     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
7721     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
7722   if (!AStmt)
7723     return StmtError();
7724 
7725   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7726   OMPLoopDirective::HelperExprs B;
7727   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
7728   // define the nested loops number.
7729   unsigned NestedLoopCount =
7730       checkOpenMPLoop(OMPD_for_simd, getCollapseNumberExpr(Clauses),
7731                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
7732                       VarsWithImplicitDSA, B);
7733   if (NestedLoopCount == 0)
7734     return StmtError();
7735 
7736   assert((CurContext->isDependentContext() || B.builtAll()) &&
7737          "omp for simd loop exprs were not built");
7738 
7739   if (!CurContext->isDependentContext()) {
7740     // Finalize the clauses that need pre-built expressions for CodeGen.
7741     for (OMPClause *C : Clauses) {
7742       if (auto *LC = dyn_cast<OMPLinearClause>(C))
7743         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
7744                                      B.NumIterations, *this, CurScope,
7745                                      DSAStack))
7746           return StmtError();
7747     }
7748   }
7749 
7750   if (checkSimdlenSafelenSpecified(*this, Clauses))
7751     return StmtError();
7752 
7753   setFunctionHasBranchProtectedScope();
7754   return OMPForSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount,
7755                                      Clauses, AStmt, B);
7756 }
7757 
7758 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses,
7759                                               Stmt *AStmt,
7760                                               SourceLocation StartLoc,
7761                                               SourceLocation EndLoc) {
7762   if (!AStmt)
7763     return StmtError();
7764 
7765   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7766   auto BaseStmt = AStmt;
7767   while (auto *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
7768     BaseStmt = CS->getCapturedStmt();
7769   if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
7770     auto S = C->children();
7771     if (S.begin() == S.end())
7772       return StmtError();
7773     // All associated statements must be '#pragma omp section' except for
7774     // the first one.
7775     for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) {
7776       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
7777         if (SectionStmt)
7778           Diag(SectionStmt->getBeginLoc(),
7779                diag::err_omp_sections_substmt_not_section);
7780         return StmtError();
7781       }
7782       cast<OMPSectionDirective>(SectionStmt)
7783           ->setHasCancel(DSAStack->isCancelRegion());
7784     }
7785   } else {
7786     Diag(AStmt->getBeginLoc(), diag::err_omp_sections_not_compound_stmt);
7787     return StmtError();
7788   }
7789 
7790   setFunctionHasBranchProtectedScope();
7791 
7792   return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
7793                                       DSAStack->isCancelRegion());
7794 }
7795 
7796 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt,
7797                                              SourceLocation StartLoc,
7798                                              SourceLocation EndLoc) {
7799   if (!AStmt)
7800     return StmtError();
7801 
7802   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7803 
7804   setFunctionHasBranchProtectedScope();
7805   DSAStack->setParentCancelRegion(DSAStack->isCancelRegion());
7806 
7807   return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt,
7808                                      DSAStack->isCancelRegion());
7809 }
7810 
7811 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses,
7812                                             Stmt *AStmt,
7813                                             SourceLocation StartLoc,
7814                                             SourceLocation EndLoc) {
7815   if (!AStmt)
7816     return StmtError();
7817 
7818   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7819 
7820   setFunctionHasBranchProtectedScope();
7821 
7822   // OpenMP [2.7.3, single Construct, Restrictions]
7823   // The copyprivate clause must not be used with the nowait clause.
7824   const OMPClause *Nowait = nullptr;
7825   const OMPClause *Copyprivate = nullptr;
7826   for (const OMPClause *Clause : Clauses) {
7827     if (Clause->getClauseKind() == OMPC_nowait)
7828       Nowait = Clause;
7829     else if (Clause->getClauseKind() == OMPC_copyprivate)
7830       Copyprivate = Clause;
7831     if (Copyprivate && Nowait) {
7832       Diag(Copyprivate->getBeginLoc(),
7833            diag::err_omp_single_copyprivate_with_nowait);
7834       Diag(Nowait->getBeginLoc(), diag::note_omp_nowait_clause_here);
7835       return StmtError();
7836     }
7837   }
7838 
7839   return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
7840 }
7841 
7842 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt,
7843                                             SourceLocation StartLoc,
7844                                             SourceLocation EndLoc) {
7845   if (!AStmt)
7846     return StmtError();
7847 
7848   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7849 
7850   setFunctionHasBranchProtectedScope();
7851 
7852   return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt);
7853 }
7854 
7855 StmtResult Sema::ActOnOpenMPCriticalDirective(
7856     const DeclarationNameInfo &DirName, ArrayRef<OMPClause *> Clauses,
7857     Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {
7858   if (!AStmt)
7859     return StmtError();
7860 
7861   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
7862 
7863   bool ErrorFound = false;
7864   llvm::APSInt Hint;
7865   SourceLocation HintLoc;
7866   bool DependentHint = false;
7867   for (const OMPClause *C : Clauses) {
7868     if (C->getClauseKind() == OMPC_hint) {
7869       if (!DirName.getName()) {
7870         Diag(C->getBeginLoc(), diag::err_omp_hint_clause_no_name);
7871         ErrorFound = true;
7872       }
7873       Expr *E = cast<OMPHintClause>(C)->getHint();
7874       if (E->isTypeDependent() || E->isValueDependent() ||
7875           E->isInstantiationDependent()) {
7876         DependentHint = true;
7877       } else {
7878         Hint = E->EvaluateKnownConstInt(Context);
7879         HintLoc = C->getBeginLoc();
7880       }
7881     }
7882   }
7883   if (ErrorFound)
7884     return StmtError();
7885   const auto Pair = DSAStack->getCriticalWithHint(DirName);
7886   if (Pair.first && DirName.getName() && !DependentHint) {
7887     if (llvm::APSInt::compareValues(Hint, Pair.second) != 0) {
7888       Diag(StartLoc, diag::err_omp_critical_with_hint);
7889       if (HintLoc.isValid())
7890         Diag(HintLoc, diag::note_omp_critical_hint_here)
7891             << 0 << Hint.toString(/*Radix=*/10, /*Signed=*/false);
7892       else
7893         Diag(StartLoc, diag::note_omp_critical_no_hint) << 0;
7894       if (const auto *C = Pair.first->getSingleClause<OMPHintClause>()) {
7895         Diag(C->getBeginLoc(), diag::note_omp_critical_hint_here)
7896             << 1
7897             << C->getHint()->EvaluateKnownConstInt(Context).toString(
7898                    /*Radix=*/10, /*Signed=*/false);
7899       } else {
7900         Diag(Pair.first->getBeginLoc(), diag::note_omp_critical_no_hint) << 1;
7901       }
7902     }
7903   }
7904 
7905   setFunctionHasBranchProtectedScope();
7906 
7907   auto *Dir = OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc,
7908                                            Clauses, AStmt);
7909   if (!Pair.first && DirName.getName() && !DependentHint)
7910     DSAStack->addCriticalWithHint(Dir, Hint);
7911   return Dir;
7912 }
7913 
7914 StmtResult Sema::ActOnOpenMPParallelForDirective(
7915     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
7916     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
7917   if (!AStmt)
7918     return StmtError();
7919 
7920   auto *CS = cast<CapturedStmt>(AStmt);
7921   // 1.2.2 OpenMP Language Terminology
7922   // Structured block - An executable statement with a single entry at the
7923   // top and a single exit at the bottom.
7924   // The point of exit cannot be a branch out of the structured block.
7925   // longjmp() and throw() must not violate the entry/exit criteria.
7926   CS->getCapturedDecl()->setNothrow();
7927 
7928   OMPLoopDirective::HelperExprs B;
7929   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
7930   // define the nested loops number.
7931   unsigned NestedLoopCount =
7932       checkOpenMPLoop(OMPD_parallel_for, getCollapseNumberExpr(Clauses),
7933                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
7934                       VarsWithImplicitDSA, B);
7935   if (NestedLoopCount == 0)
7936     return StmtError();
7937 
7938   assert((CurContext->isDependentContext() || B.builtAll()) &&
7939          "omp parallel for loop exprs were not built");
7940 
7941   if (!CurContext->isDependentContext()) {
7942     // Finalize the clauses that need pre-built expressions for CodeGen.
7943     for (OMPClause *C : Clauses) {
7944       if (auto *LC = dyn_cast<OMPLinearClause>(C))
7945         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
7946                                      B.NumIterations, *this, CurScope,
7947                                      DSAStack))
7948           return StmtError();
7949     }
7950   }
7951 
7952   setFunctionHasBranchProtectedScope();
7953   return OMPParallelForDirective::Create(Context, StartLoc, EndLoc,
7954                                          NestedLoopCount, Clauses, AStmt, B,
7955                                          DSAStack->isCancelRegion());
7956 }
7957 
7958 StmtResult Sema::ActOnOpenMPParallelForSimdDirective(
7959     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
7960     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
7961   if (!AStmt)
7962     return StmtError();
7963 
7964   auto *CS = cast<CapturedStmt>(AStmt);
7965   // 1.2.2 OpenMP Language Terminology
7966   // Structured block - An executable statement with a single entry at the
7967   // top and a single exit at the bottom.
7968   // The point of exit cannot be a branch out of the structured block.
7969   // longjmp() and throw() must not violate the entry/exit criteria.
7970   CS->getCapturedDecl()->setNothrow();
7971 
7972   OMPLoopDirective::HelperExprs B;
7973   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
7974   // define the nested loops number.
7975   unsigned NestedLoopCount =
7976       checkOpenMPLoop(OMPD_parallel_for_simd, getCollapseNumberExpr(Clauses),
7977                       getOrderedNumberExpr(Clauses), AStmt, *this, *DSAStack,
7978                       VarsWithImplicitDSA, B);
7979   if (NestedLoopCount == 0)
7980     return StmtError();
7981 
7982   if (!CurContext->isDependentContext()) {
7983     // Finalize the clauses that need pre-built expressions for CodeGen.
7984     for (OMPClause *C : Clauses) {
7985       if (auto *LC = dyn_cast<OMPLinearClause>(C))
7986         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
7987                                      B.NumIterations, *this, CurScope,
7988                                      DSAStack))
7989           return StmtError();
7990     }
7991   }
7992 
7993   if (checkSimdlenSafelenSpecified(*this, Clauses))
7994     return StmtError();
7995 
7996   setFunctionHasBranchProtectedScope();
7997   return OMPParallelForSimdDirective::Create(
7998       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
7999 }
8000 
8001 StmtResult
8002 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses,
8003                                            Stmt *AStmt, SourceLocation StartLoc,
8004                                            SourceLocation EndLoc) {
8005   if (!AStmt)
8006     return StmtError();
8007 
8008   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
8009   auto BaseStmt = AStmt;
8010   while (auto *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt))
8011     BaseStmt = CS->getCapturedStmt();
8012   if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {
8013     auto S = C->children();
8014     if (S.begin() == S.end())
8015       return StmtError();
8016     // All associated statements must be '#pragma omp section' except for
8017     // the first one.
8018     for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) {
8019       if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {
8020         if (SectionStmt)
8021           Diag(SectionStmt->getBeginLoc(),
8022                diag::err_omp_parallel_sections_substmt_not_section);
8023         return StmtError();
8024       }
8025       cast<OMPSectionDirective>(SectionStmt)
8026           ->setHasCancel(DSAStack->isCancelRegion());
8027     }
8028   } else {
8029     Diag(AStmt->getBeginLoc(),
8030          diag::err_omp_parallel_sections_not_compound_stmt);
8031     return StmtError();
8032   }
8033 
8034   setFunctionHasBranchProtectedScope();
8035 
8036   return OMPParallelSectionsDirective::Create(
8037       Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion());
8038 }
8039 
8040 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses,
8041                                           Stmt *AStmt, SourceLocation StartLoc,
8042                                           SourceLocation EndLoc) {
8043   if (!AStmt)
8044     return StmtError();
8045 
8046   auto *CS = cast<CapturedStmt>(AStmt);
8047   // 1.2.2 OpenMP Language Terminology
8048   // Structured block - An executable statement with a single entry at the
8049   // top and a single exit at the bottom.
8050   // The point of exit cannot be a branch out of the structured block.
8051   // longjmp() and throw() must not violate the entry/exit criteria.
8052   CS->getCapturedDecl()->setNothrow();
8053 
8054   setFunctionHasBranchProtectedScope();
8055 
8056   return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
8057                                   DSAStack->isCancelRegion());
8058 }
8059 
8060 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc,
8061                                                SourceLocation EndLoc) {
8062   return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc);
8063 }
8064 
8065 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc,
8066                                              SourceLocation EndLoc) {
8067   return OMPBarrierDirective::Create(Context, StartLoc, EndLoc);
8068 }
8069 
8070 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc,
8071                                               SourceLocation EndLoc) {
8072   return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc);
8073 }
8074 
8075 StmtResult Sema::ActOnOpenMPTaskgroupDirective(ArrayRef<OMPClause *> Clauses,
8076                                                Stmt *AStmt,
8077                                                SourceLocation StartLoc,
8078                                                SourceLocation EndLoc) {
8079   if (!AStmt)
8080     return StmtError();
8081 
8082   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
8083 
8084   setFunctionHasBranchProtectedScope();
8085 
8086   return OMPTaskgroupDirective::Create(Context, StartLoc, EndLoc, Clauses,
8087                                        AStmt,
8088                                        DSAStack->getTaskgroupReductionRef());
8089 }
8090 
8091 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses,
8092                                            SourceLocation StartLoc,
8093                                            SourceLocation EndLoc) {
8094   assert(Clauses.size() <= 1 && "Extra clauses in flush directive");
8095   return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses);
8096 }
8097 
8098 StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses,
8099                                              Stmt *AStmt,
8100                                              SourceLocation StartLoc,
8101                                              SourceLocation EndLoc) {
8102   const OMPClause *DependFound = nullptr;
8103   const OMPClause *DependSourceClause = nullptr;
8104   const OMPClause *DependSinkClause = nullptr;
8105   bool ErrorFound = false;
8106   const OMPThreadsClause *TC = nullptr;
8107   const OMPSIMDClause *SC = nullptr;
8108   for (const OMPClause *C : Clauses) {
8109     if (auto *DC = dyn_cast<OMPDependClause>(C)) {
8110       DependFound = C;
8111       if (DC->getDependencyKind() == OMPC_DEPEND_source) {
8112         if (DependSourceClause) {
8113           Diag(C->getBeginLoc(), diag::err_omp_more_one_clause)
8114               << getOpenMPDirectiveName(OMPD_ordered)
8115               << getOpenMPClauseName(OMPC_depend) << 2;
8116           ErrorFound = true;
8117         } else {
8118           DependSourceClause = C;
8119         }
8120         if (DependSinkClause) {
8121           Diag(C->getBeginLoc(), diag::err_omp_depend_sink_source_not_allowed)
8122               << 0;
8123           ErrorFound = true;
8124         }
8125       } else if (DC->getDependencyKind() == OMPC_DEPEND_sink) {
8126         if (DependSourceClause) {
8127           Diag(C->getBeginLoc(), diag::err_omp_depend_sink_source_not_allowed)
8128               << 1;
8129           ErrorFound = true;
8130         }
8131         DependSinkClause = C;
8132       }
8133     } else if (C->getClauseKind() == OMPC_threads) {
8134       TC = cast<OMPThreadsClause>(C);
8135     } else if (C->getClauseKind() == OMPC_simd) {
8136       SC = cast<OMPSIMDClause>(C);
8137     }
8138   }
8139   if (!ErrorFound && !SC &&
8140       isOpenMPSimdDirective(DSAStack->getParentDirective())) {
8141     // OpenMP [2.8.1,simd Construct, Restrictions]
8142     // An ordered construct with the simd clause is the only OpenMP construct
8143     // that can appear in the simd region.
8144     Diag(StartLoc, diag::err_omp_prohibited_region_simd);
8145     ErrorFound = true;
8146   } else if (DependFound && (TC || SC)) {
8147     Diag(DependFound->getBeginLoc(), diag::err_omp_depend_clause_thread_simd)
8148         << getOpenMPClauseName(TC ? TC->getClauseKind() : SC->getClauseKind());
8149     ErrorFound = true;
8150   } else if (DependFound && !DSAStack->getParentOrderedRegionParam().first) {
8151     Diag(DependFound->getBeginLoc(),
8152          diag::err_omp_ordered_directive_without_param);
8153     ErrorFound = true;
8154   } else if (TC || Clauses.empty()) {
8155     if (const Expr *Param = DSAStack->getParentOrderedRegionParam().first) {
8156       SourceLocation ErrLoc = TC ? TC->getBeginLoc() : StartLoc;
8157       Diag(ErrLoc, diag::err_omp_ordered_directive_with_param)
8158           << (TC != nullptr);
8159       Diag(Param->getBeginLoc(), diag::note_omp_ordered_param);
8160       ErrorFound = true;
8161     }
8162   }
8163   if ((!AStmt && !DependFound) || ErrorFound)
8164     return StmtError();
8165 
8166   if (AStmt) {
8167     assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
8168 
8169     setFunctionHasBranchProtectedScope();
8170   }
8171 
8172   return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
8173 }
8174 
8175 namespace {
8176 /// Helper class for checking expression in 'omp atomic [update]'
8177 /// construct.
8178 class OpenMPAtomicUpdateChecker {
8179   /// Error results for atomic update expressions.
8180   enum ExprAnalysisErrorCode {
8181     /// A statement is not an expression statement.
8182     NotAnExpression,
8183     /// Expression is not builtin binary or unary operation.
8184     NotABinaryOrUnaryExpression,
8185     /// Unary operation is not post-/pre- increment/decrement operation.
8186     NotAnUnaryIncDecExpression,
8187     /// An expression is not of scalar type.
8188     NotAScalarType,
8189     /// A binary operation is not an assignment operation.
8190     NotAnAssignmentOp,
8191     /// RHS part of the binary operation is not a binary expression.
8192     NotABinaryExpression,
8193     /// RHS part is not additive/multiplicative/shift/biwise binary
8194     /// expression.
8195     NotABinaryOperator,
8196     /// RHS binary operation does not have reference to the updated LHS
8197     /// part.
8198     NotAnUpdateExpression,
8199     /// No errors is found.
8200     NoError
8201   };
8202   /// Reference to Sema.
8203   Sema &SemaRef;
8204   /// A location for note diagnostics (when error is found).
8205   SourceLocation NoteLoc;
8206   /// 'x' lvalue part of the source atomic expression.
8207   Expr *X;
8208   /// 'expr' rvalue part of the source atomic expression.
8209   Expr *E;
8210   /// Helper expression of the form
8211   /// 'OpaqueValueExpr(x) binop OpaqueValueExpr(expr)' or
8212   /// 'OpaqueValueExpr(expr) binop OpaqueValueExpr(x)'.
8213   Expr *UpdateExpr;
8214   /// Is 'x' a LHS in a RHS part of full update expression. It is
8215   /// important for non-associative operations.
8216   bool IsXLHSInRHSPart;
8217   BinaryOperatorKind Op;
8218   SourceLocation OpLoc;
8219   /// true if the source expression is a postfix unary operation, false
8220   /// if it is a prefix unary operation.
8221   bool IsPostfixUpdate;
8222 
8223 public:
8224   OpenMPAtomicUpdateChecker(Sema &SemaRef)
8225       : SemaRef(SemaRef), X(nullptr), E(nullptr), UpdateExpr(nullptr),
8226         IsXLHSInRHSPart(false), Op(BO_PtrMemD), IsPostfixUpdate(false) {}
8227   /// Check specified statement that it is suitable for 'atomic update'
8228   /// constructs and extract 'x', 'expr' and Operation from the original
8229   /// expression. If DiagId and NoteId == 0, then only check is performed
8230   /// without error notification.
8231   /// \param DiagId Diagnostic which should be emitted if error is found.
8232   /// \param NoteId Diagnostic note for the main error message.
8233   /// \return true if statement is not an update expression, false otherwise.
8234   bool checkStatement(Stmt *S, unsigned DiagId = 0, unsigned NoteId = 0);
8235   /// Return the 'x' lvalue part of the source atomic expression.
8236   Expr *getX() const { return X; }
8237   /// Return the 'expr' rvalue part of the source atomic expression.
8238   Expr *getExpr() const { return E; }
8239   /// Return the update expression used in calculation of the updated
8240   /// value. Always has form 'OpaqueValueExpr(x) binop OpaqueValueExpr(expr)' or
8241   /// 'OpaqueValueExpr(expr) binop OpaqueValueExpr(x)'.
8242   Expr *getUpdateExpr() const { return UpdateExpr; }
8243   /// Return true if 'x' is LHS in RHS part of full update expression,
8244   /// false otherwise.
8245   bool isXLHSInRHSPart() const { return IsXLHSInRHSPart; }
8246 
8247   /// true if the source expression is a postfix unary operation, false
8248   /// if it is a prefix unary operation.
8249   bool isPostfixUpdate() const { return IsPostfixUpdate; }
8250 
8251 private:
8252   bool checkBinaryOperation(BinaryOperator *AtomicBinOp, unsigned DiagId = 0,
8253                             unsigned NoteId = 0);
8254 };
8255 } // namespace
8256 
8257 bool OpenMPAtomicUpdateChecker::checkBinaryOperation(
8258     BinaryOperator *AtomicBinOp, unsigned DiagId, unsigned NoteId) {
8259   ExprAnalysisErrorCode ErrorFound = NoError;
8260   SourceLocation ErrorLoc, NoteLoc;
8261   SourceRange ErrorRange, NoteRange;
8262   // Allowed constructs are:
8263   //  x = x binop expr;
8264   //  x = expr binop x;
8265   if (AtomicBinOp->getOpcode() == BO_Assign) {
8266     X = AtomicBinOp->getLHS();
8267     if (const auto *AtomicInnerBinOp = dyn_cast<BinaryOperator>(
8268             AtomicBinOp->getRHS()->IgnoreParenImpCasts())) {
8269       if (AtomicInnerBinOp->isMultiplicativeOp() ||
8270           AtomicInnerBinOp->isAdditiveOp() || AtomicInnerBinOp->isShiftOp() ||
8271           AtomicInnerBinOp->isBitwiseOp()) {
8272         Op = AtomicInnerBinOp->getOpcode();
8273         OpLoc = AtomicInnerBinOp->getOperatorLoc();
8274         Expr *LHS = AtomicInnerBinOp->getLHS();
8275         Expr *RHS = AtomicInnerBinOp->getRHS();
8276         llvm::FoldingSetNodeID XId, LHSId, RHSId;
8277         X->IgnoreParenImpCasts()->Profile(XId, SemaRef.getASTContext(),
8278                                           /*Canonical=*/true);
8279         LHS->IgnoreParenImpCasts()->Profile(LHSId, SemaRef.getASTContext(),
8280                                             /*Canonical=*/true);
8281         RHS->IgnoreParenImpCasts()->Profile(RHSId, SemaRef.getASTContext(),
8282                                             /*Canonical=*/true);
8283         if (XId == LHSId) {
8284           E = RHS;
8285           IsXLHSInRHSPart = true;
8286         } else if (XId == RHSId) {
8287           E = LHS;
8288           IsXLHSInRHSPart = false;
8289         } else {
8290           ErrorLoc = AtomicInnerBinOp->getExprLoc();
8291           ErrorRange = AtomicInnerBinOp->getSourceRange();
8292           NoteLoc = X->getExprLoc();
8293           NoteRange = X->getSourceRange();
8294           ErrorFound = NotAnUpdateExpression;
8295         }
8296       } else {
8297         ErrorLoc = AtomicInnerBinOp->getExprLoc();
8298         ErrorRange = AtomicInnerBinOp->getSourceRange();
8299         NoteLoc = AtomicInnerBinOp->getOperatorLoc();
8300         NoteRange = SourceRange(NoteLoc, NoteLoc);
8301         ErrorFound = NotABinaryOperator;
8302       }
8303     } else {
8304       NoteLoc = ErrorLoc = AtomicBinOp->getRHS()->getExprLoc();
8305       NoteRange = ErrorRange = AtomicBinOp->getRHS()->getSourceRange();
8306       ErrorFound = NotABinaryExpression;
8307     }
8308   } else {
8309     ErrorLoc = AtomicBinOp->getExprLoc();
8310     ErrorRange = AtomicBinOp->getSourceRange();
8311     NoteLoc = AtomicBinOp->getOperatorLoc();
8312     NoteRange = SourceRange(NoteLoc, NoteLoc);
8313     ErrorFound = NotAnAssignmentOp;
8314   }
8315   if (ErrorFound != NoError && DiagId != 0 && NoteId != 0) {
8316     SemaRef.Diag(ErrorLoc, DiagId) << ErrorRange;
8317     SemaRef.Diag(NoteLoc, NoteId) << ErrorFound << NoteRange;
8318     return true;
8319   }
8320   if (SemaRef.CurContext->isDependentContext())
8321     E = X = UpdateExpr = nullptr;
8322   return ErrorFound != NoError;
8323 }
8324 
8325 bool OpenMPAtomicUpdateChecker::checkStatement(Stmt *S, unsigned DiagId,
8326                                                unsigned NoteId) {
8327   ExprAnalysisErrorCode ErrorFound = NoError;
8328   SourceLocation ErrorLoc, NoteLoc;
8329   SourceRange ErrorRange, NoteRange;
8330   // Allowed constructs are:
8331   //  x++;
8332   //  x--;
8333   //  ++x;
8334   //  --x;
8335   //  x binop= expr;
8336   //  x = x binop expr;
8337   //  x = expr binop x;
8338   if (auto *AtomicBody = dyn_cast<Expr>(S)) {
8339     AtomicBody = AtomicBody->IgnoreParenImpCasts();
8340     if (AtomicBody->getType()->isScalarType() ||
8341         AtomicBody->isInstantiationDependent()) {
8342       if (const auto *AtomicCompAssignOp = dyn_cast<CompoundAssignOperator>(
8343               AtomicBody->IgnoreParenImpCasts())) {
8344         // Check for Compound Assignment Operation
8345         Op = BinaryOperator::getOpForCompoundAssignment(
8346             AtomicCompAssignOp->getOpcode());
8347         OpLoc = AtomicCompAssignOp->getOperatorLoc();
8348         E = AtomicCompAssignOp->getRHS();
8349         X = AtomicCompAssignOp->getLHS()->IgnoreParens();
8350         IsXLHSInRHSPart = true;
8351       } else if (auto *AtomicBinOp = dyn_cast<BinaryOperator>(
8352                      AtomicBody->IgnoreParenImpCasts())) {
8353         // Check for Binary Operation
8354         if (checkBinaryOperation(AtomicBinOp, DiagId, NoteId))
8355           return true;
8356       } else if (const auto *AtomicUnaryOp = dyn_cast<UnaryOperator>(
8357                      AtomicBody->IgnoreParenImpCasts())) {
8358         // Check for Unary Operation
8359         if (AtomicUnaryOp->isIncrementDecrementOp()) {
8360           IsPostfixUpdate = AtomicUnaryOp->isPostfix();
8361           Op = AtomicUnaryOp->isIncrementOp() ? BO_Add : BO_Sub;
8362           OpLoc = AtomicUnaryOp->getOperatorLoc();
8363           X = AtomicUnaryOp->getSubExpr()->IgnoreParens();
8364           E = SemaRef.ActOnIntegerConstant(OpLoc, /*uint64_t Val=*/1).get();
8365           IsXLHSInRHSPart = true;
8366         } else {
8367           ErrorFound = NotAnUnaryIncDecExpression;
8368           ErrorLoc = AtomicUnaryOp->getExprLoc();
8369           ErrorRange = AtomicUnaryOp->getSourceRange();
8370           NoteLoc = AtomicUnaryOp->getOperatorLoc();
8371           NoteRange = SourceRange(NoteLoc, NoteLoc);
8372         }
8373       } else if (!AtomicBody->isInstantiationDependent()) {
8374         ErrorFound = NotABinaryOrUnaryExpression;
8375         NoteLoc = ErrorLoc = AtomicBody->getExprLoc();
8376         NoteRange = ErrorRange = AtomicBody->getSourceRange();
8377       }
8378     } else {
8379       ErrorFound = NotAScalarType;
8380       NoteLoc = ErrorLoc = AtomicBody->getBeginLoc();
8381       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
8382     }
8383   } else {
8384     ErrorFound = NotAnExpression;
8385     NoteLoc = ErrorLoc = S->getBeginLoc();
8386     NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
8387   }
8388   if (ErrorFound != NoError && DiagId != 0 && NoteId != 0) {
8389     SemaRef.Diag(ErrorLoc, DiagId) << ErrorRange;
8390     SemaRef.Diag(NoteLoc, NoteId) << ErrorFound << NoteRange;
8391     return true;
8392   }
8393   if (SemaRef.CurContext->isDependentContext())
8394     E = X = UpdateExpr = nullptr;
8395   if (ErrorFound == NoError && E && X) {
8396     // Build an update expression of form 'OpaqueValueExpr(x) binop
8397     // OpaqueValueExpr(expr)' or 'OpaqueValueExpr(expr) binop
8398     // OpaqueValueExpr(x)' and then cast it to the type of the 'x' expression.
8399     auto *OVEX = new (SemaRef.getASTContext())
8400         OpaqueValueExpr(X->getExprLoc(), X->getType(), VK_RValue);
8401     auto *OVEExpr = new (SemaRef.getASTContext())
8402         OpaqueValueExpr(E->getExprLoc(), E->getType(), VK_RValue);
8403     ExprResult Update =
8404         SemaRef.CreateBuiltinBinOp(OpLoc, Op, IsXLHSInRHSPart ? OVEX : OVEExpr,
8405                                    IsXLHSInRHSPart ? OVEExpr : OVEX);
8406     if (Update.isInvalid())
8407       return true;
8408     Update = SemaRef.PerformImplicitConversion(Update.get(), X->getType(),
8409                                                Sema::AA_Casting);
8410     if (Update.isInvalid())
8411       return true;
8412     UpdateExpr = Update.get();
8413   }
8414   return ErrorFound != NoError;
8415 }
8416 
8417 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses,
8418                                             Stmt *AStmt,
8419                                             SourceLocation StartLoc,
8420                                             SourceLocation EndLoc) {
8421   if (!AStmt)
8422     return StmtError();
8423 
8424   auto *CS = cast<CapturedStmt>(AStmt);
8425   // 1.2.2 OpenMP Language Terminology
8426   // Structured block - An executable statement with a single entry at the
8427   // top and a single exit at the bottom.
8428   // The point of exit cannot be a branch out of the structured block.
8429   // longjmp() and throw() must not violate the entry/exit criteria.
8430   OpenMPClauseKind AtomicKind = OMPC_unknown;
8431   SourceLocation AtomicKindLoc;
8432   for (const OMPClause *C : Clauses) {
8433     if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write ||
8434         C->getClauseKind() == OMPC_update ||
8435         C->getClauseKind() == OMPC_capture) {
8436       if (AtomicKind != OMPC_unknown) {
8437         Diag(C->getBeginLoc(), diag::err_omp_atomic_several_clauses)
8438             << SourceRange(C->getBeginLoc(), C->getEndLoc());
8439         Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause)
8440             << getOpenMPClauseName(AtomicKind);
8441       } else {
8442         AtomicKind = C->getClauseKind();
8443         AtomicKindLoc = C->getBeginLoc();
8444       }
8445     }
8446   }
8447 
8448   Stmt *Body = CS->getCapturedStmt();
8449   if (auto *EWC = dyn_cast<ExprWithCleanups>(Body))
8450     Body = EWC->getSubExpr();
8451 
8452   Expr *X = nullptr;
8453   Expr *V = nullptr;
8454   Expr *E = nullptr;
8455   Expr *UE = nullptr;
8456   bool IsXLHSInRHSPart = false;
8457   bool IsPostfixUpdate = false;
8458   // OpenMP [2.12.6, atomic Construct]
8459   // In the next expressions:
8460   // * x and v (as applicable) are both l-value expressions with scalar type.
8461   // * During the execution of an atomic region, multiple syntactic
8462   // occurrences of x must designate the same storage location.
8463   // * Neither of v and expr (as applicable) may access the storage location
8464   // designated by x.
8465   // * Neither of x and expr (as applicable) may access the storage location
8466   // designated by v.
8467   // * expr is an expression with scalar type.
8468   // * binop is one of +, *, -, /, &, ^, |, <<, or >>.
8469   // * binop, binop=, ++, and -- are not overloaded operators.
8470   // * The expression x binop expr must be numerically equivalent to x binop
8471   // (expr). This requirement is satisfied if the operators in expr have
8472   // precedence greater than binop, or by using parentheses around expr or
8473   // subexpressions of expr.
8474   // * The expression expr binop x must be numerically equivalent to (expr)
8475   // binop x. This requirement is satisfied if the operators in expr have
8476   // precedence equal to or greater than binop, or by using parentheses around
8477   // expr or subexpressions of expr.
8478   // * For forms that allow multiple occurrences of x, the number of times
8479   // that x is evaluated is unspecified.
8480   if (AtomicKind == OMPC_read) {
8481     enum {
8482       NotAnExpression,
8483       NotAnAssignmentOp,
8484       NotAScalarType,
8485       NotAnLValue,
8486       NoError
8487     } ErrorFound = NoError;
8488     SourceLocation ErrorLoc, NoteLoc;
8489     SourceRange ErrorRange, NoteRange;
8490     // If clause is read:
8491     //  v = x;
8492     if (const auto *AtomicBody = dyn_cast<Expr>(Body)) {
8493       const auto *AtomicBinOp =
8494           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
8495       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
8496         X = AtomicBinOp->getRHS()->IgnoreParenImpCasts();
8497         V = AtomicBinOp->getLHS()->IgnoreParenImpCasts();
8498         if ((X->isInstantiationDependent() || X->getType()->isScalarType()) &&
8499             (V->isInstantiationDependent() || V->getType()->isScalarType())) {
8500           if (!X->isLValue() || !V->isLValue()) {
8501             const Expr *NotLValueExpr = X->isLValue() ? V : X;
8502             ErrorFound = NotAnLValue;
8503             ErrorLoc = AtomicBinOp->getExprLoc();
8504             ErrorRange = AtomicBinOp->getSourceRange();
8505             NoteLoc = NotLValueExpr->getExprLoc();
8506             NoteRange = NotLValueExpr->getSourceRange();
8507           }
8508         } else if (!X->isInstantiationDependent() ||
8509                    !V->isInstantiationDependent()) {
8510           const Expr *NotScalarExpr =
8511               (X->isInstantiationDependent() || X->getType()->isScalarType())
8512                   ? V
8513                   : X;
8514           ErrorFound = NotAScalarType;
8515           ErrorLoc = AtomicBinOp->getExprLoc();
8516           ErrorRange = AtomicBinOp->getSourceRange();
8517           NoteLoc = NotScalarExpr->getExprLoc();
8518           NoteRange = NotScalarExpr->getSourceRange();
8519         }
8520       } else if (!AtomicBody->isInstantiationDependent()) {
8521         ErrorFound = NotAnAssignmentOp;
8522         ErrorLoc = AtomicBody->getExprLoc();
8523         ErrorRange = AtomicBody->getSourceRange();
8524         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
8525                               : AtomicBody->getExprLoc();
8526         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
8527                                 : AtomicBody->getSourceRange();
8528       }
8529     } else {
8530       ErrorFound = NotAnExpression;
8531       NoteLoc = ErrorLoc = Body->getBeginLoc();
8532       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
8533     }
8534     if (ErrorFound != NoError) {
8535       Diag(ErrorLoc, diag::err_omp_atomic_read_not_expression_statement)
8536           << ErrorRange;
8537       Diag(NoteLoc, diag::note_omp_atomic_read_write) << ErrorFound
8538                                                       << NoteRange;
8539       return StmtError();
8540     }
8541     if (CurContext->isDependentContext())
8542       V = X = nullptr;
8543   } else if (AtomicKind == OMPC_write) {
8544     enum {
8545       NotAnExpression,
8546       NotAnAssignmentOp,
8547       NotAScalarType,
8548       NotAnLValue,
8549       NoError
8550     } ErrorFound = NoError;
8551     SourceLocation ErrorLoc, NoteLoc;
8552     SourceRange ErrorRange, NoteRange;
8553     // If clause is write:
8554     //  x = expr;
8555     if (const auto *AtomicBody = dyn_cast<Expr>(Body)) {
8556       const auto *AtomicBinOp =
8557           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
8558       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
8559         X = AtomicBinOp->getLHS();
8560         E = AtomicBinOp->getRHS();
8561         if ((X->isInstantiationDependent() || X->getType()->isScalarType()) &&
8562             (E->isInstantiationDependent() || E->getType()->isScalarType())) {
8563           if (!X->isLValue()) {
8564             ErrorFound = NotAnLValue;
8565             ErrorLoc = AtomicBinOp->getExprLoc();
8566             ErrorRange = AtomicBinOp->getSourceRange();
8567             NoteLoc = X->getExprLoc();
8568             NoteRange = X->getSourceRange();
8569           }
8570         } else if (!X->isInstantiationDependent() ||
8571                    !E->isInstantiationDependent()) {
8572           const Expr *NotScalarExpr =
8573               (X->isInstantiationDependent() || X->getType()->isScalarType())
8574                   ? E
8575                   : X;
8576           ErrorFound = NotAScalarType;
8577           ErrorLoc = AtomicBinOp->getExprLoc();
8578           ErrorRange = AtomicBinOp->getSourceRange();
8579           NoteLoc = NotScalarExpr->getExprLoc();
8580           NoteRange = NotScalarExpr->getSourceRange();
8581         }
8582       } else if (!AtomicBody->isInstantiationDependent()) {
8583         ErrorFound = NotAnAssignmentOp;
8584         ErrorLoc = AtomicBody->getExprLoc();
8585         ErrorRange = AtomicBody->getSourceRange();
8586         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
8587                               : AtomicBody->getExprLoc();
8588         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
8589                                 : AtomicBody->getSourceRange();
8590       }
8591     } else {
8592       ErrorFound = NotAnExpression;
8593       NoteLoc = ErrorLoc = Body->getBeginLoc();
8594       NoteRange = ErrorRange = SourceRange(NoteLoc, NoteLoc);
8595     }
8596     if (ErrorFound != NoError) {
8597       Diag(ErrorLoc, diag::err_omp_atomic_write_not_expression_statement)
8598           << ErrorRange;
8599       Diag(NoteLoc, diag::note_omp_atomic_read_write) << ErrorFound
8600                                                       << NoteRange;
8601       return StmtError();
8602     }
8603     if (CurContext->isDependentContext())
8604       E = X = nullptr;
8605   } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {
8606     // If clause is update:
8607     //  x++;
8608     //  x--;
8609     //  ++x;
8610     //  --x;
8611     //  x binop= expr;
8612     //  x = x binop expr;
8613     //  x = expr binop x;
8614     OpenMPAtomicUpdateChecker Checker(*this);
8615     if (Checker.checkStatement(
8616             Body, (AtomicKind == OMPC_update)
8617                       ? diag::err_omp_atomic_update_not_expression_statement
8618                       : diag::err_omp_atomic_not_expression_statement,
8619             diag::note_omp_atomic_update))
8620       return StmtError();
8621     if (!CurContext->isDependentContext()) {
8622       E = Checker.getExpr();
8623       X = Checker.getX();
8624       UE = Checker.getUpdateExpr();
8625       IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
8626     }
8627   } else if (AtomicKind == OMPC_capture) {
8628     enum {
8629       NotAnAssignmentOp,
8630       NotACompoundStatement,
8631       NotTwoSubstatements,
8632       NotASpecificExpression,
8633       NoError
8634     } ErrorFound = NoError;
8635     SourceLocation ErrorLoc, NoteLoc;
8636     SourceRange ErrorRange, NoteRange;
8637     if (const auto *AtomicBody = dyn_cast<Expr>(Body)) {
8638       // If clause is a capture:
8639       //  v = x++;
8640       //  v = x--;
8641       //  v = ++x;
8642       //  v = --x;
8643       //  v = x binop= expr;
8644       //  v = x = x binop expr;
8645       //  v = x = expr binop x;
8646       const auto *AtomicBinOp =
8647           dyn_cast<BinaryOperator>(AtomicBody->IgnoreParenImpCasts());
8648       if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {
8649         V = AtomicBinOp->getLHS();
8650         Body = AtomicBinOp->getRHS()->IgnoreParenImpCasts();
8651         OpenMPAtomicUpdateChecker Checker(*this);
8652         if (Checker.checkStatement(
8653                 Body, diag::err_omp_atomic_capture_not_expression_statement,
8654                 diag::note_omp_atomic_update))
8655           return StmtError();
8656         E = Checker.getExpr();
8657         X = Checker.getX();
8658         UE = Checker.getUpdateExpr();
8659         IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
8660         IsPostfixUpdate = Checker.isPostfixUpdate();
8661       } else if (!AtomicBody->isInstantiationDependent()) {
8662         ErrorLoc = AtomicBody->getExprLoc();
8663         ErrorRange = AtomicBody->getSourceRange();
8664         NoteLoc = AtomicBinOp ? AtomicBinOp->getOperatorLoc()
8665                               : AtomicBody->getExprLoc();
8666         NoteRange = AtomicBinOp ? AtomicBinOp->getSourceRange()
8667                                 : AtomicBody->getSourceRange();
8668         ErrorFound = NotAnAssignmentOp;
8669       }
8670       if (ErrorFound != NoError) {
8671         Diag(ErrorLoc, diag::err_omp_atomic_capture_not_expression_statement)
8672             << ErrorRange;
8673         Diag(NoteLoc, diag::note_omp_atomic_capture) << ErrorFound << NoteRange;
8674         return StmtError();
8675       }
8676       if (CurContext->isDependentContext())
8677         UE = V = E = X = nullptr;
8678     } else {
8679       // If clause is a capture:
8680       //  { v = x; x = expr; }
8681       //  { v = x; x++; }
8682       //  { v = x; x--; }
8683       //  { v = x; ++x; }
8684       //  { v = x; --x; }
8685       //  { v = x; x binop= expr; }
8686       //  { v = x; x = x binop expr; }
8687       //  { v = x; x = expr binop x; }
8688       //  { x++; v = x; }
8689       //  { x--; v = x; }
8690       //  { ++x; v = x; }
8691       //  { --x; v = x; }
8692       //  { x binop= expr; v = x; }
8693       //  { x = x binop expr; v = x; }
8694       //  { x = expr binop x; v = x; }
8695       if (auto *CS = dyn_cast<CompoundStmt>(Body)) {
8696         // Check that this is { expr1; expr2; }
8697         if (CS->size() == 2) {
8698           Stmt *First = CS->body_front();
8699           Stmt *Second = CS->body_back();
8700           if (auto *EWC = dyn_cast<ExprWithCleanups>(First))
8701             First = EWC->getSubExpr()->IgnoreParenImpCasts();
8702           if (auto *EWC = dyn_cast<ExprWithCleanups>(Second))
8703             Second = EWC->getSubExpr()->IgnoreParenImpCasts();
8704           // Need to find what subexpression is 'v' and what is 'x'.
8705           OpenMPAtomicUpdateChecker Checker(*this);
8706           bool IsUpdateExprFound = !Checker.checkStatement(Second);
8707           BinaryOperator *BinOp = nullptr;
8708           if (IsUpdateExprFound) {
8709             BinOp = dyn_cast<BinaryOperator>(First);
8710             IsUpdateExprFound = BinOp && BinOp->getOpcode() == BO_Assign;
8711           }
8712           if (IsUpdateExprFound && !CurContext->isDependentContext()) {
8713             //  { v = x; x++; }
8714             //  { v = x; x--; }
8715             //  { v = x; ++x; }
8716             //  { v = x; --x; }
8717             //  { v = x; x binop= expr; }
8718             //  { v = x; x = x binop expr; }
8719             //  { v = x; x = expr binop x; }
8720             // Check that the first expression has form v = x.
8721             Expr *PossibleX = BinOp->getRHS()->IgnoreParenImpCasts();
8722             llvm::FoldingSetNodeID XId, PossibleXId;
8723             Checker.getX()->Profile(XId, Context, /*Canonical=*/true);
8724             PossibleX->Profile(PossibleXId, Context, /*Canonical=*/true);
8725             IsUpdateExprFound = XId == PossibleXId;
8726             if (IsUpdateExprFound) {
8727               V = BinOp->getLHS();
8728               X = Checker.getX();
8729               E = Checker.getExpr();
8730               UE = Checker.getUpdateExpr();
8731               IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
8732               IsPostfixUpdate = true;
8733             }
8734           }
8735           if (!IsUpdateExprFound) {
8736             IsUpdateExprFound = !Checker.checkStatement(First);
8737             BinOp = nullptr;
8738             if (IsUpdateExprFound) {
8739               BinOp = dyn_cast<BinaryOperator>(Second);
8740               IsUpdateExprFound = BinOp && BinOp->getOpcode() == BO_Assign;
8741             }
8742             if (IsUpdateExprFound && !CurContext->isDependentContext()) {
8743               //  { x++; v = x; }
8744               //  { x--; v = x; }
8745               //  { ++x; v = x; }
8746               //  { --x; v = x; }
8747               //  { x binop= expr; v = x; }
8748               //  { x = x binop expr; v = x; }
8749               //  { x = expr binop x; v = x; }
8750               // Check that the second expression has form v = x.
8751               Expr *PossibleX = BinOp->getRHS()->IgnoreParenImpCasts();
8752               llvm::FoldingSetNodeID XId, PossibleXId;
8753               Checker.getX()->Profile(XId, Context, /*Canonical=*/true);
8754               PossibleX->Profile(PossibleXId, Context, /*Canonical=*/true);
8755               IsUpdateExprFound = XId == PossibleXId;
8756               if (IsUpdateExprFound) {
8757                 V = BinOp->getLHS();
8758                 X = Checker.getX();
8759                 E = Checker.getExpr();
8760                 UE = Checker.getUpdateExpr();
8761                 IsXLHSInRHSPart = Checker.isXLHSInRHSPart();
8762                 IsPostfixUpdate = false;
8763               }
8764             }
8765           }
8766           if (!IsUpdateExprFound) {
8767             //  { v = x; x = expr; }
8768             auto *FirstExpr = dyn_cast<Expr>(First);
8769             auto *SecondExpr = dyn_cast<Expr>(Second);
8770             if (!FirstExpr || !SecondExpr ||
8771                 !(FirstExpr->isInstantiationDependent() ||
8772                   SecondExpr->isInstantiationDependent())) {
8773               auto *FirstBinOp = dyn_cast<BinaryOperator>(First);
8774               if (!FirstBinOp || FirstBinOp->getOpcode() != BO_Assign) {
8775                 ErrorFound = NotAnAssignmentOp;
8776                 NoteLoc = ErrorLoc = FirstBinOp ? FirstBinOp->getOperatorLoc()
8777                                                 : First->getBeginLoc();
8778                 NoteRange = ErrorRange = FirstBinOp
8779                                              ? FirstBinOp->getSourceRange()
8780                                              : SourceRange(ErrorLoc, ErrorLoc);
8781               } else {
8782                 auto *SecondBinOp = dyn_cast<BinaryOperator>(Second);
8783                 if (!SecondBinOp || SecondBinOp->getOpcode() != BO_Assign) {
8784                   ErrorFound = NotAnAssignmentOp;
8785                   NoteLoc = ErrorLoc = SecondBinOp
8786                                            ? SecondBinOp->getOperatorLoc()
8787                                            : Second->getBeginLoc();
8788                   NoteRange = ErrorRange =
8789                       SecondBinOp ? SecondBinOp->getSourceRange()
8790                                   : SourceRange(ErrorLoc, ErrorLoc);
8791                 } else {
8792                   Expr *PossibleXRHSInFirst =
8793                       FirstBinOp->getRHS()->IgnoreParenImpCasts();
8794                   Expr *PossibleXLHSInSecond =
8795                       SecondBinOp->getLHS()->IgnoreParenImpCasts();
8796                   llvm::FoldingSetNodeID X1Id, X2Id;
8797                   PossibleXRHSInFirst->Profile(X1Id, Context,
8798                                                /*Canonical=*/true);
8799                   PossibleXLHSInSecond->Profile(X2Id, Context,
8800                                                 /*Canonical=*/true);
8801                   IsUpdateExprFound = X1Id == X2Id;
8802                   if (IsUpdateExprFound) {
8803                     V = FirstBinOp->getLHS();
8804                     X = SecondBinOp->getLHS();
8805                     E = SecondBinOp->getRHS();
8806                     UE = nullptr;
8807                     IsXLHSInRHSPart = false;
8808                     IsPostfixUpdate = true;
8809                   } else {
8810                     ErrorFound = NotASpecificExpression;
8811                     ErrorLoc = FirstBinOp->getExprLoc();
8812                     ErrorRange = FirstBinOp->getSourceRange();
8813                     NoteLoc = SecondBinOp->getLHS()->getExprLoc();
8814                     NoteRange = SecondBinOp->getRHS()->getSourceRange();
8815                   }
8816                 }
8817               }
8818             }
8819           }
8820         } else {
8821           NoteLoc = ErrorLoc = Body->getBeginLoc();
8822           NoteRange = ErrorRange =
8823               SourceRange(Body->getBeginLoc(), Body->getBeginLoc());
8824           ErrorFound = NotTwoSubstatements;
8825         }
8826       } else {
8827         NoteLoc = ErrorLoc = Body->getBeginLoc();
8828         NoteRange = ErrorRange =
8829             SourceRange(Body->getBeginLoc(), Body->getBeginLoc());
8830         ErrorFound = NotACompoundStatement;
8831       }
8832       if (ErrorFound != NoError) {
8833         Diag(ErrorLoc, diag::err_omp_atomic_capture_not_compound_statement)
8834             << ErrorRange;
8835         Diag(NoteLoc, diag::note_omp_atomic_capture) << ErrorFound << NoteRange;
8836         return StmtError();
8837       }
8838       if (CurContext->isDependentContext())
8839         UE = V = E = X = nullptr;
8840     }
8841   }
8842 
8843   setFunctionHasBranchProtectedScope();
8844 
8845   return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt,
8846                                     X, V, E, UE, IsXLHSInRHSPart,
8847                                     IsPostfixUpdate);
8848 }
8849 
8850 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses,
8851                                             Stmt *AStmt,
8852                                             SourceLocation StartLoc,
8853                                             SourceLocation EndLoc) {
8854   if (!AStmt)
8855     return StmtError();
8856 
8857   auto *CS = cast<CapturedStmt>(AStmt);
8858   // 1.2.2 OpenMP Language Terminology
8859   // Structured block - An executable statement with a single entry at the
8860   // top and a single exit at the bottom.
8861   // The point of exit cannot be a branch out of the structured block.
8862   // longjmp() and throw() must not violate the entry/exit criteria.
8863   CS->getCapturedDecl()->setNothrow();
8864   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target);
8865        ThisCaptureLevel > 1; --ThisCaptureLevel) {
8866     CS = cast<CapturedStmt>(CS->getCapturedStmt());
8867     // 1.2.2 OpenMP Language Terminology
8868     // Structured block - An executable statement with a single entry at the
8869     // top and a single exit at the bottom.
8870     // The point of exit cannot be a branch out of the structured block.
8871     // longjmp() and throw() must not violate the entry/exit criteria.
8872     CS->getCapturedDecl()->setNothrow();
8873   }
8874 
8875   // OpenMP [2.16, Nesting of Regions]
8876   // If specified, a teams construct must be contained within a target
8877   // construct. That target construct must contain no statements or directives
8878   // outside of the teams construct.
8879   if (DSAStack->hasInnerTeamsRegion()) {
8880     const Stmt *S = CS->IgnoreContainers(/*IgnoreCaptured=*/true);
8881     bool OMPTeamsFound = true;
8882     if (const auto *CS = dyn_cast<CompoundStmt>(S)) {
8883       auto I = CS->body_begin();
8884       while (I != CS->body_end()) {
8885         const auto *OED = dyn_cast<OMPExecutableDirective>(*I);
8886         if (!OED || !isOpenMPTeamsDirective(OED->getDirectiveKind()) ||
8887             OMPTeamsFound) {
8888 
8889           OMPTeamsFound = false;
8890           break;
8891         }
8892         ++I;
8893       }
8894       assert(I != CS->body_end() && "Not found statement");
8895       S = *I;
8896     } else {
8897       const auto *OED = dyn_cast<OMPExecutableDirective>(S);
8898       OMPTeamsFound = OED && isOpenMPTeamsDirective(OED->getDirectiveKind());
8899     }
8900     if (!OMPTeamsFound) {
8901       Diag(StartLoc, diag::err_omp_target_contains_not_only_teams);
8902       Diag(DSAStack->getInnerTeamsRegionLoc(),
8903            diag::note_omp_nested_teams_construct_here);
8904       Diag(S->getBeginLoc(), diag::note_omp_nested_statement_here)
8905           << isa<OMPExecutableDirective>(S);
8906       return StmtError();
8907     }
8908   }
8909 
8910   setFunctionHasBranchProtectedScope();
8911 
8912   return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
8913 }
8914 
8915 StmtResult
8916 Sema::ActOnOpenMPTargetParallelDirective(ArrayRef<OMPClause *> Clauses,
8917                                          Stmt *AStmt, SourceLocation StartLoc,
8918                                          SourceLocation EndLoc) {
8919   if (!AStmt)
8920     return StmtError();
8921 
8922   auto *CS = cast<CapturedStmt>(AStmt);
8923   // 1.2.2 OpenMP Language Terminology
8924   // Structured block - An executable statement with a single entry at the
8925   // top and a single exit at the bottom.
8926   // The point of exit cannot be a branch out of the structured block.
8927   // longjmp() and throw() must not violate the entry/exit criteria.
8928   CS->getCapturedDecl()->setNothrow();
8929   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel);
8930        ThisCaptureLevel > 1; --ThisCaptureLevel) {
8931     CS = cast<CapturedStmt>(CS->getCapturedStmt());
8932     // 1.2.2 OpenMP Language Terminology
8933     // Structured block - An executable statement with a single entry at the
8934     // top and a single exit at the bottom.
8935     // The point of exit cannot be a branch out of the structured block.
8936     // longjmp() and throw() must not violate the entry/exit criteria.
8937     CS->getCapturedDecl()->setNothrow();
8938   }
8939 
8940   setFunctionHasBranchProtectedScope();
8941 
8942   return OMPTargetParallelDirective::Create(Context, StartLoc, EndLoc, Clauses,
8943                                             AStmt);
8944 }
8945 
8946 StmtResult Sema::ActOnOpenMPTargetParallelForDirective(
8947     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
8948     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
8949   if (!AStmt)
8950     return StmtError();
8951 
8952   auto *CS = cast<CapturedStmt>(AStmt);
8953   // 1.2.2 OpenMP Language Terminology
8954   // Structured block - An executable statement with a single entry at the
8955   // top and a single exit at the bottom.
8956   // The point of exit cannot be a branch out of the structured block.
8957   // longjmp() and throw() must not violate the entry/exit criteria.
8958   CS->getCapturedDecl()->setNothrow();
8959   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel_for);
8960        ThisCaptureLevel > 1; --ThisCaptureLevel) {
8961     CS = cast<CapturedStmt>(CS->getCapturedStmt());
8962     // 1.2.2 OpenMP Language Terminology
8963     // Structured block - An executable statement with a single entry at the
8964     // top and a single exit at the bottom.
8965     // The point of exit cannot be a branch out of the structured block.
8966     // longjmp() and throw() must not violate the entry/exit criteria.
8967     CS->getCapturedDecl()->setNothrow();
8968   }
8969 
8970   OMPLoopDirective::HelperExprs B;
8971   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
8972   // define the nested loops number.
8973   unsigned NestedLoopCount =
8974       checkOpenMPLoop(OMPD_target_parallel_for, getCollapseNumberExpr(Clauses),
8975                       getOrderedNumberExpr(Clauses), CS, *this, *DSAStack,
8976                       VarsWithImplicitDSA, B);
8977   if (NestedLoopCount == 0)
8978     return StmtError();
8979 
8980   assert((CurContext->isDependentContext() || B.builtAll()) &&
8981          "omp target parallel for loop exprs were not built");
8982 
8983   if (!CurContext->isDependentContext()) {
8984     // Finalize the clauses that need pre-built expressions for CodeGen.
8985     for (OMPClause *C : Clauses) {
8986       if (auto *LC = dyn_cast<OMPLinearClause>(C))
8987         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
8988                                      B.NumIterations, *this, CurScope,
8989                                      DSAStack))
8990           return StmtError();
8991     }
8992   }
8993 
8994   setFunctionHasBranchProtectedScope();
8995   return OMPTargetParallelForDirective::Create(Context, StartLoc, EndLoc,
8996                                                NestedLoopCount, Clauses, AStmt,
8997                                                B, DSAStack->isCancelRegion());
8998 }
8999 
9000 /// Check for existence of a map clause in the list of clauses.
9001 static bool hasClauses(ArrayRef<OMPClause *> Clauses,
9002                        const OpenMPClauseKind K) {
9003   return llvm::any_of(
9004       Clauses, [K](const OMPClause *C) { return C->getClauseKind() == K; });
9005 }
9006 
9007 template <typename... Params>
9008 static bool hasClauses(ArrayRef<OMPClause *> Clauses, const OpenMPClauseKind K,
9009                        const Params... ClauseTypes) {
9010   return hasClauses(Clauses, K) || hasClauses(Clauses, ClauseTypes...);
9011 }
9012 
9013 StmtResult Sema::ActOnOpenMPTargetDataDirective(ArrayRef<OMPClause *> Clauses,
9014                                                 Stmt *AStmt,
9015                                                 SourceLocation StartLoc,
9016                                                 SourceLocation EndLoc) {
9017   if (!AStmt)
9018     return StmtError();
9019 
9020   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9021 
9022   // OpenMP [2.10.1, Restrictions, p. 97]
9023   // At least one map clause must appear on the directive.
9024   if (!hasClauses(Clauses, OMPC_map, OMPC_use_device_ptr)) {
9025     Diag(StartLoc, diag::err_omp_no_clause_for_directive)
9026         << "'map' or 'use_device_ptr'"
9027         << getOpenMPDirectiveName(OMPD_target_data);
9028     return StmtError();
9029   }
9030 
9031   setFunctionHasBranchProtectedScope();
9032 
9033   return OMPTargetDataDirective::Create(Context, StartLoc, EndLoc, Clauses,
9034                                         AStmt);
9035 }
9036 
9037 StmtResult
9038 Sema::ActOnOpenMPTargetEnterDataDirective(ArrayRef<OMPClause *> Clauses,
9039                                           SourceLocation StartLoc,
9040                                           SourceLocation EndLoc, Stmt *AStmt) {
9041   if (!AStmt)
9042     return StmtError();
9043 
9044   auto *CS = cast<CapturedStmt>(AStmt);
9045   // 1.2.2 OpenMP Language Terminology
9046   // Structured block - An executable statement with a single entry at the
9047   // top and a single exit at the bottom.
9048   // The point of exit cannot be a branch out of the structured block.
9049   // longjmp() and throw() must not violate the entry/exit criteria.
9050   CS->getCapturedDecl()->setNothrow();
9051   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_enter_data);
9052        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9053     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9054     // 1.2.2 OpenMP Language Terminology
9055     // Structured block - An executable statement with a single entry at the
9056     // top and a single exit at the bottom.
9057     // The point of exit cannot be a branch out of the structured block.
9058     // longjmp() and throw() must not violate the entry/exit criteria.
9059     CS->getCapturedDecl()->setNothrow();
9060   }
9061 
9062   // OpenMP [2.10.2, Restrictions, p. 99]
9063   // At least one map clause must appear on the directive.
9064   if (!hasClauses(Clauses, OMPC_map)) {
9065     Diag(StartLoc, diag::err_omp_no_clause_for_directive)
9066         << "'map'" << getOpenMPDirectiveName(OMPD_target_enter_data);
9067     return StmtError();
9068   }
9069 
9070   return OMPTargetEnterDataDirective::Create(Context, StartLoc, EndLoc, Clauses,
9071                                              AStmt);
9072 }
9073 
9074 StmtResult
9075 Sema::ActOnOpenMPTargetExitDataDirective(ArrayRef<OMPClause *> Clauses,
9076                                          SourceLocation StartLoc,
9077                                          SourceLocation EndLoc, Stmt *AStmt) {
9078   if (!AStmt)
9079     return StmtError();
9080 
9081   auto *CS = cast<CapturedStmt>(AStmt);
9082   // 1.2.2 OpenMP Language Terminology
9083   // Structured block - An executable statement with a single entry at the
9084   // top and a single exit at the bottom.
9085   // The point of exit cannot be a branch out of the structured block.
9086   // longjmp() and throw() must not violate the entry/exit criteria.
9087   CS->getCapturedDecl()->setNothrow();
9088   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_exit_data);
9089        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9090     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9091     // 1.2.2 OpenMP Language Terminology
9092     // Structured block - An executable statement with a single entry at the
9093     // top and a single exit at the bottom.
9094     // The point of exit cannot be a branch out of the structured block.
9095     // longjmp() and throw() must not violate the entry/exit criteria.
9096     CS->getCapturedDecl()->setNothrow();
9097   }
9098 
9099   // OpenMP [2.10.3, Restrictions, p. 102]
9100   // At least one map clause must appear on the directive.
9101   if (!hasClauses(Clauses, OMPC_map)) {
9102     Diag(StartLoc, diag::err_omp_no_clause_for_directive)
9103         << "'map'" << getOpenMPDirectiveName(OMPD_target_exit_data);
9104     return StmtError();
9105   }
9106 
9107   return OMPTargetExitDataDirective::Create(Context, StartLoc, EndLoc, Clauses,
9108                                             AStmt);
9109 }
9110 
9111 StmtResult Sema::ActOnOpenMPTargetUpdateDirective(ArrayRef<OMPClause *> Clauses,
9112                                                   SourceLocation StartLoc,
9113                                                   SourceLocation EndLoc,
9114                                                   Stmt *AStmt) {
9115   if (!AStmt)
9116     return StmtError();
9117 
9118   auto *CS = cast<CapturedStmt>(AStmt);
9119   // 1.2.2 OpenMP Language Terminology
9120   // Structured block - An executable statement with a single entry at the
9121   // top and a single exit at the bottom.
9122   // The point of exit cannot be a branch out of the structured block.
9123   // longjmp() and throw() must not violate the entry/exit criteria.
9124   CS->getCapturedDecl()->setNothrow();
9125   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_update);
9126        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9127     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9128     // 1.2.2 OpenMP Language Terminology
9129     // Structured block - An executable statement with a single entry at the
9130     // top and a single exit at the bottom.
9131     // The point of exit cannot be a branch out of the structured block.
9132     // longjmp() and throw() must not violate the entry/exit criteria.
9133     CS->getCapturedDecl()->setNothrow();
9134   }
9135 
9136   if (!hasClauses(Clauses, OMPC_to, OMPC_from)) {
9137     Diag(StartLoc, diag::err_omp_at_least_one_motion_clause_required);
9138     return StmtError();
9139   }
9140   return OMPTargetUpdateDirective::Create(Context, StartLoc, EndLoc, Clauses,
9141                                           AStmt);
9142 }
9143 
9144 StmtResult Sema::ActOnOpenMPTeamsDirective(ArrayRef<OMPClause *> Clauses,
9145                                            Stmt *AStmt, SourceLocation StartLoc,
9146                                            SourceLocation EndLoc) {
9147   if (!AStmt)
9148     return StmtError();
9149 
9150   auto *CS = cast<CapturedStmt>(AStmt);
9151   // 1.2.2 OpenMP Language Terminology
9152   // Structured block - An executable statement with a single entry at the
9153   // top and a single exit at the bottom.
9154   // The point of exit cannot be a branch out of the structured block.
9155   // longjmp() and throw() must not violate the entry/exit criteria.
9156   CS->getCapturedDecl()->setNothrow();
9157 
9158   setFunctionHasBranchProtectedScope();
9159 
9160   DSAStack->setParentTeamsRegionLoc(StartLoc);
9161 
9162   return OMPTeamsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt);
9163 }
9164 
9165 StmtResult
9166 Sema::ActOnOpenMPCancellationPointDirective(SourceLocation StartLoc,
9167                                             SourceLocation EndLoc,
9168                                             OpenMPDirectiveKind CancelRegion) {
9169   if (DSAStack->isParentNowaitRegion()) {
9170     Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 0;
9171     return StmtError();
9172   }
9173   if (DSAStack->isParentOrderedRegion()) {
9174     Diag(StartLoc, diag::err_omp_parent_cancel_region_ordered) << 0;
9175     return StmtError();
9176   }
9177   return OMPCancellationPointDirective::Create(Context, StartLoc, EndLoc,
9178                                                CancelRegion);
9179 }
9180 
9181 StmtResult Sema::ActOnOpenMPCancelDirective(ArrayRef<OMPClause *> Clauses,
9182                                             SourceLocation StartLoc,
9183                                             SourceLocation EndLoc,
9184                                             OpenMPDirectiveKind CancelRegion) {
9185   if (DSAStack->isParentNowaitRegion()) {
9186     Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 1;
9187     return StmtError();
9188   }
9189   if (DSAStack->isParentOrderedRegion()) {
9190     Diag(StartLoc, diag::err_omp_parent_cancel_region_ordered) << 1;
9191     return StmtError();
9192   }
9193   DSAStack->setParentCancelRegion(/*Cancel=*/true);
9194   return OMPCancelDirective::Create(Context, StartLoc, EndLoc, Clauses,
9195                                     CancelRegion);
9196 }
9197 
9198 static bool checkGrainsizeNumTasksClauses(Sema &S,
9199                                           ArrayRef<OMPClause *> Clauses) {
9200   const OMPClause *PrevClause = nullptr;
9201   bool ErrorFound = false;
9202   for (const OMPClause *C : Clauses) {
9203     if (C->getClauseKind() == OMPC_grainsize ||
9204         C->getClauseKind() == OMPC_num_tasks) {
9205       if (!PrevClause)
9206         PrevClause = C;
9207       else if (PrevClause->getClauseKind() != C->getClauseKind()) {
9208         S.Diag(C->getBeginLoc(),
9209                diag::err_omp_grainsize_num_tasks_mutually_exclusive)
9210             << getOpenMPClauseName(C->getClauseKind())
9211             << getOpenMPClauseName(PrevClause->getClauseKind());
9212         S.Diag(PrevClause->getBeginLoc(),
9213                diag::note_omp_previous_grainsize_num_tasks)
9214             << getOpenMPClauseName(PrevClause->getClauseKind());
9215         ErrorFound = true;
9216       }
9217     }
9218   }
9219   return ErrorFound;
9220 }
9221 
9222 static bool checkReductionClauseWithNogroup(Sema &S,
9223                                             ArrayRef<OMPClause *> Clauses) {
9224   const OMPClause *ReductionClause = nullptr;
9225   const OMPClause *NogroupClause = nullptr;
9226   for (const OMPClause *C : Clauses) {
9227     if (C->getClauseKind() == OMPC_reduction) {
9228       ReductionClause = C;
9229       if (NogroupClause)
9230         break;
9231       continue;
9232     }
9233     if (C->getClauseKind() == OMPC_nogroup) {
9234       NogroupClause = C;
9235       if (ReductionClause)
9236         break;
9237       continue;
9238     }
9239   }
9240   if (ReductionClause && NogroupClause) {
9241     S.Diag(ReductionClause->getBeginLoc(), diag::err_omp_reduction_with_nogroup)
9242         << SourceRange(NogroupClause->getBeginLoc(),
9243                        NogroupClause->getEndLoc());
9244     return true;
9245   }
9246   return false;
9247 }
9248 
9249 StmtResult Sema::ActOnOpenMPTaskLoopDirective(
9250     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9251     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9252   if (!AStmt)
9253     return StmtError();
9254 
9255   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9256   OMPLoopDirective::HelperExprs B;
9257   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9258   // define the nested loops number.
9259   unsigned NestedLoopCount =
9260       checkOpenMPLoop(OMPD_taskloop, getCollapseNumberExpr(Clauses),
9261                       /*OrderedLoopCountExpr=*/nullptr, AStmt, *this, *DSAStack,
9262                       VarsWithImplicitDSA, B);
9263   if (NestedLoopCount == 0)
9264     return StmtError();
9265 
9266   assert((CurContext->isDependentContext() || B.builtAll()) &&
9267          "omp for loop exprs were not built");
9268 
9269   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9270   // The grainsize clause and num_tasks clause are mutually exclusive and may
9271   // not appear on the same taskloop directive.
9272   if (checkGrainsizeNumTasksClauses(*this, Clauses))
9273     return StmtError();
9274   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9275   // If a reduction clause is present on the taskloop directive, the nogroup
9276   // clause must not be specified.
9277   if (checkReductionClauseWithNogroup(*this, Clauses))
9278     return StmtError();
9279 
9280   setFunctionHasBranchProtectedScope();
9281   return OMPTaskLoopDirective::Create(Context, StartLoc, EndLoc,
9282                                       NestedLoopCount, Clauses, AStmt, B);
9283 }
9284 
9285 StmtResult Sema::ActOnOpenMPTaskLoopSimdDirective(
9286     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9287     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9288   if (!AStmt)
9289     return StmtError();
9290 
9291   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9292   OMPLoopDirective::HelperExprs B;
9293   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9294   // define the nested loops number.
9295   unsigned NestedLoopCount =
9296       checkOpenMPLoop(OMPD_taskloop_simd, getCollapseNumberExpr(Clauses),
9297                       /*OrderedLoopCountExpr=*/nullptr, AStmt, *this, *DSAStack,
9298                       VarsWithImplicitDSA, B);
9299   if (NestedLoopCount == 0)
9300     return StmtError();
9301 
9302   assert((CurContext->isDependentContext() || B.builtAll()) &&
9303          "omp for loop exprs were not built");
9304 
9305   if (!CurContext->isDependentContext()) {
9306     // Finalize the clauses that need pre-built expressions for CodeGen.
9307     for (OMPClause *C : Clauses) {
9308       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9309         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9310                                      B.NumIterations, *this, CurScope,
9311                                      DSAStack))
9312           return StmtError();
9313     }
9314   }
9315 
9316   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9317   // The grainsize clause and num_tasks clause are mutually exclusive and may
9318   // not appear on the same taskloop directive.
9319   if (checkGrainsizeNumTasksClauses(*this, Clauses))
9320     return StmtError();
9321   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9322   // If a reduction clause is present on the taskloop directive, the nogroup
9323   // clause must not be specified.
9324   if (checkReductionClauseWithNogroup(*this, Clauses))
9325     return StmtError();
9326   if (checkSimdlenSafelenSpecified(*this, Clauses))
9327     return StmtError();
9328 
9329   setFunctionHasBranchProtectedScope();
9330   return OMPTaskLoopSimdDirective::Create(Context, StartLoc, EndLoc,
9331                                           NestedLoopCount, Clauses, AStmt, B);
9332 }
9333 
9334 StmtResult Sema::ActOnOpenMPMasterTaskLoopDirective(
9335     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9336     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9337   if (!AStmt)
9338     return StmtError();
9339 
9340   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9341   OMPLoopDirective::HelperExprs B;
9342   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9343   // define the nested loops number.
9344   unsigned NestedLoopCount =
9345       checkOpenMPLoop(OMPD_master_taskloop, getCollapseNumberExpr(Clauses),
9346                       /*OrderedLoopCountExpr=*/nullptr, AStmt, *this, *DSAStack,
9347                       VarsWithImplicitDSA, B);
9348   if (NestedLoopCount == 0)
9349     return StmtError();
9350 
9351   assert((CurContext->isDependentContext() || B.builtAll()) &&
9352          "omp for loop exprs were not built");
9353 
9354   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9355   // The grainsize clause and num_tasks clause are mutually exclusive and may
9356   // not appear on the same taskloop directive.
9357   if (checkGrainsizeNumTasksClauses(*this, Clauses))
9358     return StmtError();
9359   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9360   // If a reduction clause is present on the taskloop directive, the nogroup
9361   // clause must not be specified.
9362   if (checkReductionClauseWithNogroup(*this, Clauses))
9363     return StmtError();
9364 
9365   setFunctionHasBranchProtectedScope();
9366   return OMPMasterTaskLoopDirective::Create(Context, StartLoc, EndLoc,
9367                                             NestedLoopCount, Clauses, AStmt, B);
9368 }
9369 
9370 StmtResult Sema::ActOnOpenMPMasterTaskLoopSimdDirective(
9371     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9372     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9373   if (!AStmt)
9374     return StmtError();
9375 
9376   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9377   OMPLoopDirective::HelperExprs B;
9378   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9379   // define the nested loops number.
9380   unsigned NestedLoopCount =
9381       checkOpenMPLoop(OMPD_master_taskloop_simd, getCollapseNumberExpr(Clauses),
9382                       /*OrderedLoopCountExpr=*/nullptr, AStmt, *this, *DSAStack,
9383                       VarsWithImplicitDSA, B);
9384   if (NestedLoopCount == 0)
9385     return StmtError();
9386 
9387   assert((CurContext->isDependentContext() || B.builtAll()) &&
9388          "omp for loop exprs were not built");
9389 
9390   if (!CurContext->isDependentContext()) {
9391     // Finalize the clauses that need pre-built expressions for CodeGen.
9392     for (OMPClause *C : Clauses) {
9393       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9394         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9395                                      B.NumIterations, *this, CurScope,
9396                                      DSAStack))
9397           return StmtError();
9398     }
9399   }
9400 
9401   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9402   // The grainsize clause and num_tasks clause are mutually exclusive and may
9403   // not appear on the same taskloop directive.
9404   if (checkGrainsizeNumTasksClauses(*this, Clauses))
9405     return StmtError();
9406   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9407   // If a reduction clause is present on the taskloop directive, the nogroup
9408   // clause must not be specified.
9409   if (checkReductionClauseWithNogroup(*this, Clauses))
9410     return StmtError();
9411   if (checkSimdlenSafelenSpecified(*this, Clauses))
9412     return StmtError();
9413 
9414   setFunctionHasBranchProtectedScope();
9415   return OMPMasterTaskLoopSimdDirective::Create(
9416       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9417 }
9418 
9419 StmtResult Sema::ActOnOpenMPParallelMasterTaskLoopDirective(
9420     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9421     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9422   if (!AStmt)
9423     return StmtError();
9424 
9425   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9426   auto *CS = cast<CapturedStmt>(AStmt);
9427   // 1.2.2 OpenMP Language Terminology
9428   // Structured block - An executable statement with a single entry at the
9429   // top and a single exit at the bottom.
9430   // The point of exit cannot be a branch out of the structured block.
9431   // longjmp() and throw() must not violate the entry/exit criteria.
9432   CS->getCapturedDecl()->setNothrow();
9433   for (int ThisCaptureLevel =
9434            getOpenMPCaptureLevels(OMPD_parallel_master_taskloop);
9435        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9436     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9437     // 1.2.2 OpenMP Language Terminology
9438     // Structured block - An executable statement with a single entry at the
9439     // top and a single exit at the bottom.
9440     // The point of exit cannot be a branch out of the structured block.
9441     // longjmp() and throw() must not violate the entry/exit criteria.
9442     CS->getCapturedDecl()->setNothrow();
9443   }
9444 
9445   OMPLoopDirective::HelperExprs B;
9446   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9447   // define the nested loops number.
9448   unsigned NestedLoopCount = checkOpenMPLoop(
9449       OMPD_parallel_master_taskloop, getCollapseNumberExpr(Clauses),
9450       /*OrderedLoopCountExpr=*/nullptr, CS, *this, *DSAStack,
9451       VarsWithImplicitDSA, B);
9452   if (NestedLoopCount == 0)
9453     return StmtError();
9454 
9455   assert((CurContext->isDependentContext() || B.builtAll()) &&
9456          "omp for loop exprs were not built");
9457 
9458   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9459   // The grainsize clause and num_tasks clause are mutually exclusive and may
9460   // not appear on the same taskloop directive.
9461   if (checkGrainsizeNumTasksClauses(*this, Clauses))
9462     return StmtError();
9463   // OpenMP, [2.9.2 taskloop Construct, Restrictions]
9464   // If a reduction clause is present on the taskloop directive, the nogroup
9465   // clause must not be specified.
9466   if (checkReductionClauseWithNogroup(*this, Clauses))
9467     return StmtError();
9468 
9469   setFunctionHasBranchProtectedScope();
9470   return OMPParallelMasterTaskLoopDirective::Create(
9471       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9472 }
9473 
9474 StmtResult Sema::ActOnOpenMPDistributeDirective(
9475     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9476     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9477   if (!AStmt)
9478     return StmtError();
9479 
9480   assert(isa<CapturedStmt>(AStmt) && "Captured statement expected");
9481   OMPLoopDirective::HelperExprs B;
9482   // In presence of clause 'collapse' with number of loops, it will
9483   // define the nested loops number.
9484   unsigned NestedLoopCount =
9485       checkOpenMPLoop(OMPD_distribute, getCollapseNumberExpr(Clauses),
9486                       nullptr /*ordered not a clause on distribute*/, AStmt,
9487                       *this, *DSAStack, VarsWithImplicitDSA, B);
9488   if (NestedLoopCount == 0)
9489     return StmtError();
9490 
9491   assert((CurContext->isDependentContext() || B.builtAll()) &&
9492          "omp for loop exprs were not built");
9493 
9494   setFunctionHasBranchProtectedScope();
9495   return OMPDistributeDirective::Create(Context, StartLoc, EndLoc,
9496                                         NestedLoopCount, Clauses, AStmt, B);
9497 }
9498 
9499 StmtResult Sema::ActOnOpenMPDistributeParallelForDirective(
9500     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9501     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9502   if (!AStmt)
9503     return StmtError();
9504 
9505   auto *CS = cast<CapturedStmt>(AStmt);
9506   // 1.2.2 OpenMP Language Terminology
9507   // Structured block - An executable statement with a single entry at the
9508   // top and a single exit at the bottom.
9509   // The point of exit cannot be a branch out of the structured block.
9510   // longjmp() and throw() must not violate the entry/exit criteria.
9511   CS->getCapturedDecl()->setNothrow();
9512   for (int ThisCaptureLevel =
9513            getOpenMPCaptureLevels(OMPD_distribute_parallel_for);
9514        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9515     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9516     // 1.2.2 OpenMP Language Terminology
9517     // Structured block - An executable statement with a single entry at the
9518     // top and a single exit at the bottom.
9519     // The point of exit cannot be a branch out of the structured block.
9520     // longjmp() and throw() must not violate the entry/exit criteria.
9521     CS->getCapturedDecl()->setNothrow();
9522   }
9523 
9524   OMPLoopDirective::HelperExprs B;
9525   // In presence of clause 'collapse' with number of loops, it will
9526   // define the nested loops number.
9527   unsigned NestedLoopCount = checkOpenMPLoop(
9528       OMPD_distribute_parallel_for, getCollapseNumberExpr(Clauses),
9529       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
9530       VarsWithImplicitDSA, B);
9531   if (NestedLoopCount == 0)
9532     return StmtError();
9533 
9534   assert((CurContext->isDependentContext() || B.builtAll()) &&
9535          "omp for loop exprs were not built");
9536 
9537   setFunctionHasBranchProtectedScope();
9538   return OMPDistributeParallelForDirective::Create(
9539       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B,
9540       DSAStack->isCancelRegion());
9541 }
9542 
9543 StmtResult Sema::ActOnOpenMPDistributeParallelForSimdDirective(
9544     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9545     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9546   if (!AStmt)
9547     return StmtError();
9548 
9549   auto *CS = cast<CapturedStmt>(AStmt);
9550   // 1.2.2 OpenMP Language Terminology
9551   // Structured block - An executable statement with a single entry at the
9552   // top and a single exit at the bottom.
9553   // The point of exit cannot be a branch out of the structured block.
9554   // longjmp() and throw() must not violate the entry/exit criteria.
9555   CS->getCapturedDecl()->setNothrow();
9556   for (int ThisCaptureLevel =
9557            getOpenMPCaptureLevels(OMPD_distribute_parallel_for_simd);
9558        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9559     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9560     // 1.2.2 OpenMP Language Terminology
9561     // Structured block - An executable statement with a single entry at the
9562     // top and a single exit at the bottom.
9563     // The point of exit cannot be a branch out of the structured block.
9564     // longjmp() and throw() must not violate the entry/exit criteria.
9565     CS->getCapturedDecl()->setNothrow();
9566   }
9567 
9568   OMPLoopDirective::HelperExprs B;
9569   // In presence of clause 'collapse' with number of loops, it will
9570   // define the nested loops number.
9571   unsigned NestedLoopCount = checkOpenMPLoop(
9572       OMPD_distribute_parallel_for_simd, getCollapseNumberExpr(Clauses),
9573       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
9574       VarsWithImplicitDSA, B);
9575   if (NestedLoopCount == 0)
9576     return StmtError();
9577 
9578   assert((CurContext->isDependentContext() || B.builtAll()) &&
9579          "omp for loop exprs were not built");
9580 
9581   if (!CurContext->isDependentContext()) {
9582     // Finalize the clauses that need pre-built expressions for CodeGen.
9583     for (OMPClause *C : Clauses) {
9584       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9585         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9586                                      B.NumIterations, *this, CurScope,
9587                                      DSAStack))
9588           return StmtError();
9589     }
9590   }
9591 
9592   if (checkSimdlenSafelenSpecified(*this, Clauses))
9593     return StmtError();
9594 
9595   setFunctionHasBranchProtectedScope();
9596   return OMPDistributeParallelForSimdDirective::Create(
9597       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9598 }
9599 
9600 StmtResult Sema::ActOnOpenMPDistributeSimdDirective(
9601     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9602     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9603   if (!AStmt)
9604     return StmtError();
9605 
9606   auto *CS = cast<CapturedStmt>(AStmt);
9607   // 1.2.2 OpenMP Language Terminology
9608   // Structured block - An executable statement with a single entry at the
9609   // top and a single exit at the bottom.
9610   // The point of exit cannot be a branch out of the structured block.
9611   // longjmp() and throw() must not violate the entry/exit criteria.
9612   CS->getCapturedDecl()->setNothrow();
9613   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_distribute_simd);
9614        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9615     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9616     // 1.2.2 OpenMP Language Terminology
9617     // Structured block - An executable statement with a single entry at the
9618     // top and a single exit at the bottom.
9619     // The point of exit cannot be a branch out of the structured block.
9620     // longjmp() and throw() must not violate the entry/exit criteria.
9621     CS->getCapturedDecl()->setNothrow();
9622   }
9623 
9624   OMPLoopDirective::HelperExprs B;
9625   // In presence of clause 'collapse' with number of loops, it will
9626   // define the nested loops number.
9627   unsigned NestedLoopCount =
9628       checkOpenMPLoop(OMPD_distribute_simd, getCollapseNumberExpr(Clauses),
9629                       nullptr /*ordered not a clause on distribute*/, CS, *this,
9630                       *DSAStack, VarsWithImplicitDSA, B);
9631   if (NestedLoopCount == 0)
9632     return StmtError();
9633 
9634   assert((CurContext->isDependentContext() || B.builtAll()) &&
9635          "omp for loop exprs were not built");
9636 
9637   if (!CurContext->isDependentContext()) {
9638     // Finalize the clauses that need pre-built expressions for CodeGen.
9639     for (OMPClause *C : Clauses) {
9640       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9641         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9642                                      B.NumIterations, *this, CurScope,
9643                                      DSAStack))
9644           return StmtError();
9645     }
9646   }
9647 
9648   if (checkSimdlenSafelenSpecified(*this, Clauses))
9649     return StmtError();
9650 
9651   setFunctionHasBranchProtectedScope();
9652   return OMPDistributeSimdDirective::Create(Context, StartLoc, EndLoc,
9653                                             NestedLoopCount, Clauses, AStmt, B);
9654 }
9655 
9656 StmtResult Sema::ActOnOpenMPTargetParallelForSimdDirective(
9657     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9658     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9659   if (!AStmt)
9660     return StmtError();
9661 
9662   auto *CS = cast<CapturedStmt>(AStmt);
9663   // 1.2.2 OpenMP Language Terminology
9664   // Structured block - An executable statement with a single entry at the
9665   // top and a single exit at the bottom.
9666   // The point of exit cannot be a branch out of the structured block.
9667   // longjmp() and throw() must not violate the entry/exit criteria.
9668   CS->getCapturedDecl()->setNothrow();
9669   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_parallel_for);
9670        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9671     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9672     // 1.2.2 OpenMP Language Terminology
9673     // Structured block - An executable statement with a single entry at the
9674     // top and a single exit at the bottom.
9675     // The point of exit cannot be a branch out of the structured block.
9676     // longjmp() and throw() must not violate the entry/exit criteria.
9677     CS->getCapturedDecl()->setNothrow();
9678   }
9679 
9680   OMPLoopDirective::HelperExprs B;
9681   // In presence of clause 'collapse' or 'ordered' with number of loops, it will
9682   // define the nested loops number.
9683   unsigned NestedLoopCount = checkOpenMPLoop(
9684       OMPD_target_parallel_for_simd, getCollapseNumberExpr(Clauses),
9685       getOrderedNumberExpr(Clauses), CS, *this, *DSAStack,
9686       VarsWithImplicitDSA, B);
9687   if (NestedLoopCount == 0)
9688     return StmtError();
9689 
9690   assert((CurContext->isDependentContext() || B.builtAll()) &&
9691          "omp target parallel for simd loop exprs were not built");
9692 
9693   if (!CurContext->isDependentContext()) {
9694     // Finalize the clauses that need pre-built expressions for CodeGen.
9695     for (OMPClause *C : Clauses) {
9696       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9697         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9698                                      B.NumIterations, *this, CurScope,
9699                                      DSAStack))
9700           return StmtError();
9701     }
9702   }
9703   if (checkSimdlenSafelenSpecified(*this, Clauses))
9704     return StmtError();
9705 
9706   setFunctionHasBranchProtectedScope();
9707   return OMPTargetParallelForSimdDirective::Create(
9708       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9709 }
9710 
9711 StmtResult Sema::ActOnOpenMPTargetSimdDirective(
9712     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9713     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9714   if (!AStmt)
9715     return StmtError();
9716 
9717   auto *CS = cast<CapturedStmt>(AStmt);
9718   // 1.2.2 OpenMP Language Terminology
9719   // Structured block - An executable statement with a single entry at the
9720   // top and a single exit at the bottom.
9721   // The point of exit cannot be a branch out of the structured block.
9722   // longjmp() and throw() must not violate the entry/exit criteria.
9723   CS->getCapturedDecl()->setNothrow();
9724   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_simd);
9725        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9726     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9727     // 1.2.2 OpenMP Language Terminology
9728     // Structured block - An executable statement with a single entry at the
9729     // top and a single exit at the bottom.
9730     // The point of exit cannot be a branch out of the structured block.
9731     // longjmp() and throw() must not violate the entry/exit criteria.
9732     CS->getCapturedDecl()->setNothrow();
9733   }
9734 
9735   OMPLoopDirective::HelperExprs B;
9736   // In presence of clause 'collapse' with number of loops, it will define the
9737   // nested loops number.
9738   unsigned NestedLoopCount =
9739       checkOpenMPLoop(OMPD_target_simd, getCollapseNumberExpr(Clauses),
9740                       getOrderedNumberExpr(Clauses), CS, *this, *DSAStack,
9741                       VarsWithImplicitDSA, B);
9742   if (NestedLoopCount == 0)
9743     return StmtError();
9744 
9745   assert((CurContext->isDependentContext() || B.builtAll()) &&
9746          "omp target simd loop exprs were not built");
9747 
9748   if (!CurContext->isDependentContext()) {
9749     // Finalize the clauses that need pre-built expressions for CodeGen.
9750     for (OMPClause *C : Clauses) {
9751       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9752         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9753                                      B.NumIterations, *this, CurScope,
9754                                      DSAStack))
9755           return StmtError();
9756     }
9757   }
9758 
9759   if (checkSimdlenSafelenSpecified(*this, Clauses))
9760     return StmtError();
9761 
9762   setFunctionHasBranchProtectedScope();
9763   return OMPTargetSimdDirective::Create(Context, StartLoc, EndLoc,
9764                                         NestedLoopCount, Clauses, AStmt, B);
9765 }
9766 
9767 StmtResult Sema::ActOnOpenMPTeamsDistributeDirective(
9768     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9769     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9770   if (!AStmt)
9771     return StmtError();
9772 
9773   auto *CS = cast<CapturedStmt>(AStmt);
9774   // 1.2.2 OpenMP Language Terminology
9775   // Structured block - An executable statement with a single entry at the
9776   // top and a single exit at the bottom.
9777   // The point of exit cannot be a branch out of the structured block.
9778   // longjmp() and throw() must not violate the entry/exit criteria.
9779   CS->getCapturedDecl()->setNothrow();
9780   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_teams_distribute);
9781        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9782     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9783     // 1.2.2 OpenMP Language Terminology
9784     // Structured block - An executable statement with a single entry at the
9785     // top and a single exit at the bottom.
9786     // The point of exit cannot be a branch out of the structured block.
9787     // longjmp() and throw() must not violate the entry/exit criteria.
9788     CS->getCapturedDecl()->setNothrow();
9789   }
9790 
9791   OMPLoopDirective::HelperExprs B;
9792   // In presence of clause 'collapse' with number of loops, it will
9793   // define the nested loops number.
9794   unsigned NestedLoopCount =
9795       checkOpenMPLoop(OMPD_teams_distribute, getCollapseNumberExpr(Clauses),
9796                       nullptr /*ordered not a clause on distribute*/, CS, *this,
9797                       *DSAStack, VarsWithImplicitDSA, B);
9798   if (NestedLoopCount == 0)
9799     return StmtError();
9800 
9801   assert((CurContext->isDependentContext() || B.builtAll()) &&
9802          "omp teams distribute loop exprs were not built");
9803 
9804   setFunctionHasBranchProtectedScope();
9805 
9806   DSAStack->setParentTeamsRegionLoc(StartLoc);
9807 
9808   return OMPTeamsDistributeDirective::Create(
9809       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9810 }
9811 
9812 StmtResult Sema::ActOnOpenMPTeamsDistributeSimdDirective(
9813     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9814     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9815   if (!AStmt)
9816     return StmtError();
9817 
9818   auto *CS = cast<CapturedStmt>(AStmt);
9819   // 1.2.2 OpenMP Language Terminology
9820   // Structured block - An executable statement with a single entry at the
9821   // top and a single exit at the bottom.
9822   // The point of exit cannot be a branch out of the structured block.
9823   // longjmp() and throw() must not violate the entry/exit criteria.
9824   CS->getCapturedDecl()->setNothrow();
9825   for (int ThisCaptureLevel =
9826            getOpenMPCaptureLevels(OMPD_teams_distribute_simd);
9827        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9828     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9829     // 1.2.2 OpenMP Language Terminology
9830     // Structured block - An executable statement with a single entry at the
9831     // top and a single exit at the bottom.
9832     // The point of exit cannot be a branch out of the structured block.
9833     // longjmp() and throw() must not violate the entry/exit criteria.
9834     CS->getCapturedDecl()->setNothrow();
9835   }
9836 
9837 
9838   OMPLoopDirective::HelperExprs B;
9839   // In presence of clause 'collapse' with number of loops, it will
9840   // define the nested loops number.
9841   unsigned NestedLoopCount = checkOpenMPLoop(
9842       OMPD_teams_distribute_simd, getCollapseNumberExpr(Clauses),
9843       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
9844       VarsWithImplicitDSA, B);
9845 
9846   if (NestedLoopCount == 0)
9847     return StmtError();
9848 
9849   assert((CurContext->isDependentContext() || B.builtAll()) &&
9850          "omp teams distribute simd loop exprs were not built");
9851 
9852   if (!CurContext->isDependentContext()) {
9853     // Finalize the clauses that need pre-built expressions for CodeGen.
9854     for (OMPClause *C : Clauses) {
9855       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9856         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9857                                      B.NumIterations, *this, CurScope,
9858                                      DSAStack))
9859           return StmtError();
9860     }
9861   }
9862 
9863   if (checkSimdlenSafelenSpecified(*this, Clauses))
9864     return StmtError();
9865 
9866   setFunctionHasBranchProtectedScope();
9867 
9868   DSAStack->setParentTeamsRegionLoc(StartLoc);
9869 
9870   return OMPTeamsDistributeSimdDirective::Create(
9871       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9872 }
9873 
9874 StmtResult Sema::ActOnOpenMPTeamsDistributeParallelForSimdDirective(
9875     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9876     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9877   if (!AStmt)
9878     return StmtError();
9879 
9880   auto *CS = cast<CapturedStmt>(AStmt);
9881   // 1.2.2 OpenMP Language Terminology
9882   // Structured block - An executable statement with a single entry at the
9883   // top and a single exit at the bottom.
9884   // The point of exit cannot be a branch out of the structured block.
9885   // longjmp() and throw() must not violate the entry/exit criteria.
9886   CS->getCapturedDecl()->setNothrow();
9887 
9888   for (int ThisCaptureLevel =
9889            getOpenMPCaptureLevels(OMPD_teams_distribute_parallel_for_simd);
9890        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9891     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9892     // 1.2.2 OpenMP Language Terminology
9893     // Structured block - An executable statement with a single entry at the
9894     // top and a single exit at the bottom.
9895     // The point of exit cannot be a branch out of the structured block.
9896     // longjmp() and throw() must not violate the entry/exit criteria.
9897     CS->getCapturedDecl()->setNothrow();
9898   }
9899 
9900   OMPLoopDirective::HelperExprs B;
9901   // In presence of clause 'collapse' with number of loops, it will
9902   // define the nested loops number.
9903   unsigned NestedLoopCount = checkOpenMPLoop(
9904       OMPD_teams_distribute_parallel_for_simd, getCollapseNumberExpr(Clauses),
9905       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
9906       VarsWithImplicitDSA, B);
9907 
9908   if (NestedLoopCount == 0)
9909     return StmtError();
9910 
9911   assert((CurContext->isDependentContext() || B.builtAll()) &&
9912          "omp for loop exprs were not built");
9913 
9914   if (!CurContext->isDependentContext()) {
9915     // Finalize the clauses that need pre-built expressions for CodeGen.
9916     for (OMPClause *C : Clauses) {
9917       if (auto *LC = dyn_cast<OMPLinearClause>(C))
9918         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
9919                                      B.NumIterations, *this, CurScope,
9920                                      DSAStack))
9921           return StmtError();
9922     }
9923   }
9924 
9925   if (checkSimdlenSafelenSpecified(*this, Clauses))
9926     return StmtError();
9927 
9928   setFunctionHasBranchProtectedScope();
9929 
9930   DSAStack->setParentTeamsRegionLoc(StartLoc);
9931 
9932   return OMPTeamsDistributeParallelForSimdDirective::Create(
9933       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
9934 }
9935 
9936 StmtResult Sema::ActOnOpenMPTeamsDistributeParallelForDirective(
9937     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
9938     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
9939   if (!AStmt)
9940     return StmtError();
9941 
9942   auto *CS = cast<CapturedStmt>(AStmt);
9943   // 1.2.2 OpenMP Language Terminology
9944   // Structured block - An executable statement with a single entry at the
9945   // top and a single exit at the bottom.
9946   // The point of exit cannot be a branch out of the structured block.
9947   // longjmp() and throw() must not violate the entry/exit criteria.
9948   CS->getCapturedDecl()->setNothrow();
9949 
9950   for (int ThisCaptureLevel =
9951            getOpenMPCaptureLevels(OMPD_teams_distribute_parallel_for);
9952        ThisCaptureLevel > 1; --ThisCaptureLevel) {
9953     CS = cast<CapturedStmt>(CS->getCapturedStmt());
9954     // 1.2.2 OpenMP Language Terminology
9955     // Structured block - An executable statement with a single entry at the
9956     // top and a single exit at the bottom.
9957     // The point of exit cannot be a branch out of the structured block.
9958     // longjmp() and throw() must not violate the entry/exit criteria.
9959     CS->getCapturedDecl()->setNothrow();
9960   }
9961 
9962   OMPLoopDirective::HelperExprs B;
9963   // In presence of clause 'collapse' with number of loops, it will
9964   // define the nested loops number.
9965   unsigned NestedLoopCount = checkOpenMPLoop(
9966       OMPD_teams_distribute_parallel_for, getCollapseNumberExpr(Clauses),
9967       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
9968       VarsWithImplicitDSA, B);
9969 
9970   if (NestedLoopCount == 0)
9971     return StmtError();
9972 
9973   assert((CurContext->isDependentContext() || B.builtAll()) &&
9974          "omp for loop exprs were not built");
9975 
9976   setFunctionHasBranchProtectedScope();
9977 
9978   DSAStack->setParentTeamsRegionLoc(StartLoc);
9979 
9980   return OMPTeamsDistributeParallelForDirective::Create(
9981       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B,
9982       DSAStack->isCancelRegion());
9983 }
9984 
9985 StmtResult Sema::ActOnOpenMPTargetTeamsDirective(ArrayRef<OMPClause *> Clauses,
9986                                                  Stmt *AStmt,
9987                                                  SourceLocation StartLoc,
9988                                                  SourceLocation EndLoc) {
9989   if (!AStmt)
9990     return StmtError();
9991 
9992   auto *CS = cast<CapturedStmt>(AStmt);
9993   // 1.2.2 OpenMP Language Terminology
9994   // Structured block - An executable statement with a single entry at the
9995   // top and a single exit at the bottom.
9996   // The point of exit cannot be a branch out of the structured block.
9997   // longjmp() and throw() must not violate the entry/exit criteria.
9998   CS->getCapturedDecl()->setNothrow();
9999 
10000   for (int ThisCaptureLevel = getOpenMPCaptureLevels(OMPD_target_teams);
10001        ThisCaptureLevel > 1; --ThisCaptureLevel) {
10002     CS = cast<CapturedStmt>(CS->getCapturedStmt());
10003     // 1.2.2 OpenMP Language Terminology
10004     // Structured block - An executable statement with a single entry at the
10005     // top and a single exit at the bottom.
10006     // The point of exit cannot be a branch out of the structured block.
10007     // longjmp() and throw() must not violate the entry/exit criteria.
10008     CS->getCapturedDecl()->setNothrow();
10009   }
10010   setFunctionHasBranchProtectedScope();
10011 
10012   return OMPTargetTeamsDirective::Create(Context, StartLoc, EndLoc, Clauses,
10013                                          AStmt);
10014 }
10015 
10016 StmtResult Sema::ActOnOpenMPTargetTeamsDistributeDirective(
10017     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
10018     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
10019   if (!AStmt)
10020     return StmtError();
10021 
10022   auto *CS = cast<CapturedStmt>(AStmt);
10023   // 1.2.2 OpenMP Language Terminology
10024   // Structured block - An executable statement with a single entry at the
10025   // top and a single exit at the bottom.
10026   // The point of exit cannot be a branch out of the structured block.
10027   // longjmp() and throw() must not violate the entry/exit criteria.
10028   CS->getCapturedDecl()->setNothrow();
10029   for (int ThisCaptureLevel =
10030            getOpenMPCaptureLevels(OMPD_target_teams_distribute);
10031        ThisCaptureLevel > 1; --ThisCaptureLevel) {
10032     CS = cast<CapturedStmt>(CS->getCapturedStmt());
10033     // 1.2.2 OpenMP Language Terminology
10034     // Structured block - An executable statement with a single entry at the
10035     // top and a single exit at the bottom.
10036     // The point of exit cannot be a branch out of the structured block.
10037     // longjmp() and throw() must not violate the entry/exit criteria.
10038     CS->getCapturedDecl()->setNothrow();
10039   }
10040 
10041   OMPLoopDirective::HelperExprs B;
10042   // In presence of clause 'collapse' with number of loops, it will
10043   // define the nested loops number.
10044   unsigned NestedLoopCount = checkOpenMPLoop(
10045       OMPD_target_teams_distribute, getCollapseNumberExpr(Clauses),
10046       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
10047       VarsWithImplicitDSA, B);
10048   if (NestedLoopCount == 0)
10049     return StmtError();
10050 
10051   assert((CurContext->isDependentContext() || B.builtAll()) &&
10052          "omp target teams distribute loop exprs were not built");
10053 
10054   setFunctionHasBranchProtectedScope();
10055   return OMPTargetTeamsDistributeDirective::Create(
10056       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
10057 }
10058 
10059 StmtResult Sema::ActOnOpenMPTargetTeamsDistributeParallelForDirective(
10060     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
10061     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
10062   if (!AStmt)
10063     return StmtError();
10064 
10065   auto *CS = cast<CapturedStmt>(AStmt);
10066   // 1.2.2 OpenMP Language Terminology
10067   // Structured block - An executable statement with a single entry at the
10068   // top and a single exit at the bottom.
10069   // The point of exit cannot be a branch out of the structured block.
10070   // longjmp() and throw() must not violate the entry/exit criteria.
10071   CS->getCapturedDecl()->setNothrow();
10072   for (int ThisCaptureLevel =
10073            getOpenMPCaptureLevels(OMPD_target_teams_distribute_parallel_for);
10074        ThisCaptureLevel > 1; --ThisCaptureLevel) {
10075     CS = cast<CapturedStmt>(CS->getCapturedStmt());
10076     // 1.2.2 OpenMP Language Terminology
10077     // Structured block - An executable statement with a single entry at the
10078     // top and a single exit at the bottom.
10079     // The point of exit cannot be a branch out of the structured block.
10080     // longjmp() and throw() must not violate the entry/exit criteria.
10081     CS->getCapturedDecl()->setNothrow();
10082   }
10083 
10084   OMPLoopDirective::HelperExprs B;
10085   // In presence of clause 'collapse' with number of loops, it will
10086   // define the nested loops number.
10087   unsigned NestedLoopCount = checkOpenMPLoop(
10088       OMPD_target_teams_distribute_parallel_for, getCollapseNumberExpr(Clauses),
10089       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
10090       VarsWithImplicitDSA, B);
10091   if (NestedLoopCount == 0)
10092     return StmtError();
10093 
10094   assert((CurContext->isDependentContext() || B.builtAll()) &&
10095          "omp target teams distribute parallel for loop exprs were not built");
10096 
10097   if (!CurContext->isDependentContext()) {
10098     // Finalize the clauses that need pre-built expressions for CodeGen.
10099     for (OMPClause *C : Clauses) {
10100       if (auto *LC = dyn_cast<OMPLinearClause>(C))
10101         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
10102                                      B.NumIterations, *this, CurScope,
10103                                      DSAStack))
10104           return StmtError();
10105     }
10106   }
10107 
10108   setFunctionHasBranchProtectedScope();
10109   return OMPTargetTeamsDistributeParallelForDirective::Create(
10110       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B,
10111       DSAStack->isCancelRegion());
10112 }
10113 
10114 StmtResult Sema::ActOnOpenMPTargetTeamsDistributeParallelForSimdDirective(
10115     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
10116     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
10117   if (!AStmt)
10118     return StmtError();
10119 
10120   auto *CS = cast<CapturedStmt>(AStmt);
10121   // 1.2.2 OpenMP Language Terminology
10122   // Structured block - An executable statement with a single entry at the
10123   // top and a single exit at the bottom.
10124   // The point of exit cannot be a branch out of the structured block.
10125   // longjmp() and throw() must not violate the entry/exit criteria.
10126   CS->getCapturedDecl()->setNothrow();
10127   for (int ThisCaptureLevel = getOpenMPCaptureLevels(
10128            OMPD_target_teams_distribute_parallel_for_simd);
10129        ThisCaptureLevel > 1; --ThisCaptureLevel) {
10130     CS = cast<CapturedStmt>(CS->getCapturedStmt());
10131     // 1.2.2 OpenMP Language Terminology
10132     // Structured block - An executable statement with a single entry at the
10133     // top and a single exit at the bottom.
10134     // The point of exit cannot be a branch out of the structured block.
10135     // longjmp() and throw() must not violate the entry/exit criteria.
10136     CS->getCapturedDecl()->setNothrow();
10137   }
10138 
10139   OMPLoopDirective::HelperExprs B;
10140   // In presence of clause 'collapse' with number of loops, it will
10141   // define the nested loops number.
10142   unsigned NestedLoopCount =
10143       checkOpenMPLoop(OMPD_target_teams_distribute_parallel_for_simd,
10144                       getCollapseNumberExpr(Clauses),
10145                       nullptr /*ordered not a clause on distribute*/, CS, *this,
10146                       *DSAStack, VarsWithImplicitDSA, B);
10147   if (NestedLoopCount == 0)
10148     return StmtError();
10149 
10150   assert((CurContext->isDependentContext() || B.builtAll()) &&
10151          "omp target teams distribute parallel for simd loop exprs were not "
10152          "built");
10153 
10154   if (!CurContext->isDependentContext()) {
10155     // Finalize the clauses that need pre-built expressions for CodeGen.
10156     for (OMPClause *C : Clauses) {
10157       if (auto *LC = dyn_cast<OMPLinearClause>(C))
10158         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
10159                                      B.NumIterations, *this, CurScope,
10160                                      DSAStack))
10161           return StmtError();
10162     }
10163   }
10164 
10165   if (checkSimdlenSafelenSpecified(*this, Clauses))
10166     return StmtError();
10167 
10168   setFunctionHasBranchProtectedScope();
10169   return OMPTargetTeamsDistributeParallelForSimdDirective::Create(
10170       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
10171 }
10172 
10173 StmtResult Sema::ActOnOpenMPTargetTeamsDistributeSimdDirective(
10174     ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc,
10175     SourceLocation EndLoc, VarsWithInheritedDSAType &VarsWithImplicitDSA) {
10176   if (!AStmt)
10177     return StmtError();
10178 
10179   auto *CS = cast<CapturedStmt>(AStmt);
10180   // 1.2.2 OpenMP Language Terminology
10181   // Structured block - An executable statement with a single entry at the
10182   // top and a single exit at the bottom.
10183   // The point of exit cannot be a branch out of the structured block.
10184   // longjmp() and throw() must not violate the entry/exit criteria.
10185   CS->getCapturedDecl()->setNothrow();
10186   for (int ThisCaptureLevel =
10187            getOpenMPCaptureLevels(OMPD_target_teams_distribute_simd);
10188        ThisCaptureLevel > 1; --ThisCaptureLevel) {
10189     CS = cast<CapturedStmt>(CS->getCapturedStmt());
10190     // 1.2.2 OpenMP Language Terminology
10191     // Structured block - An executable statement with a single entry at the
10192     // top and a single exit at the bottom.
10193     // The point of exit cannot be a branch out of the structured block.
10194     // longjmp() and throw() must not violate the entry/exit criteria.
10195     CS->getCapturedDecl()->setNothrow();
10196   }
10197 
10198   OMPLoopDirective::HelperExprs B;
10199   // In presence of clause 'collapse' with number of loops, it will
10200   // define the nested loops number.
10201   unsigned NestedLoopCount = checkOpenMPLoop(
10202       OMPD_target_teams_distribute_simd, getCollapseNumberExpr(Clauses),
10203       nullptr /*ordered not a clause on distribute*/, CS, *this, *DSAStack,
10204       VarsWithImplicitDSA, B);
10205   if (NestedLoopCount == 0)
10206     return StmtError();
10207 
10208   assert((CurContext->isDependentContext() || B.builtAll()) &&
10209          "omp target teams distribute simd loop exprs were not built");
10210 
10211   if (!CurContext->isDependentContext()) {
10212     // Finalize the clauses that need pre-built expressions for CodeGen.
10213     for (OMPClause *C : Clauses) {
10214       if (auto *LC = dyn_cast<OMPLinearClause>(C))
10215         if (FinishOpenMPLinearClause(*LC, cast<DeclRefExpr>(B.IterationVarRef),
10216                                      B.NumIterations, *this, CurScope,
10217                                      DSAStack))
10218           return StmtError();
10219     }
10220   }
10221 
10222   if (checkSimdlenSafelenSpecified(*this, Clauses))
10223     return StmtError();
10224 
10225   setFunctionHasBranchProtectedScope();
10226   return OMPTargetTeamsDistributeSimdDirective::Create(
10227       Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B);
10228 }
10229 
10230 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr,
10231                                              SourceLocation StartLoc,
10232                                              SourceLocation LParenLoc,
10233                                              SourceLocation EndLoc) {
10234   OMPClause *Res = nullptr;
10235   switch (Kind) {
10236   case OMPC_final:
10237     Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc);
10238     break;
10239   case OMPC_num_threads:
10240     Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc);
10241     break;
10242   case OMPC_safelen:
10243     Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc);
10244     break;
10245   case OMPC_simdlen:
10246     Res = ActOnOpenMPSimdlenClause(Expr, StartLoc, LParenLoc, EndLoc);
10247     break;
10248   case OMPC_allocator:
10249     Res = ActOnOpenMPAllocatorClause(Expr, StartLoc, LParenLoc, EndLoc);
10250     break;
10251   case OMPC_collapse:
10252     Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc);
10253     break;
10254   case OMPC_ordered:
10255     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Expr);
10256     break;
10257   case OMPC_device:
10258     Res = ActOnOpenMPDeviceClause(Expr, StartLoc, LParenLoc, EndLoc);
10259     break;
10260   case OMPC_num_teams:
10261     Res = ActOnOpenMPNumTeamsClause(Expr, StartLoc, LParenLoc, EndLoc);
10262     break;
10263   case OMPC_thread_limit:
10264     Res = ActOnOpenMPThreadLimitClause(Expr, StartLoc, LParenLoc, EndLoc);
10265     break;
10266   case OMPC_priority:
10267     Res = ActOnOpenMPPriorityClause(Expr, StartLoc, LParenLoc, EndLoc);
10268     break;
10269   case OMPC_grainsize:
10270     Res = ActOnOpenMPGrainsizeClause(Expr, StartLoc, LParenLoc, EndLoc);
10271     break;
10272   case OMPC_num_tasks:
10273     Res = ActOnOpenMPNumTasksClause(Expr, StartLoc, LParenLoc, EndLoc);
10274     break;
10275   case OMPC_hint:
10276     Res = ActOnOpenMPHintClause(Expr, StartLoc, LParenLoc, EndLoc);
10277     break;
10278   case OMPC_if:
10279   case OMPC_default:
10280   case OMPC_proc_bind:
10281   case OMPC_schedule:
10282   case OMPC_private:
10283   case OMPC_firstprivate:
10284   case OMPC_lastprivate:
10285   case OMPC_shared:
10286   case OMPC_reduction:
10287   case OMPC_task_reduction:
10288   case OMPC_in_reduction:
10289   case OMPC_linear:
10290   case OMPC_aligned:
10291   case OMPC_copyin:
10292   case OMPC_copyprivate:
10293   case OMPC_nowait:
10294   case OMPC_untied:
10295   case OMPC_mergeable:
10296   case OMPC_threadprivate:
10297   case OMPC_allocate:
10298   case OMPC_flush:
10299   case OMPC_read:
10300   case OMPC_write:
10301   case OMPC_update:
10302   case OMPC_capture:
10303   case OMPC_seq_cst:
10304   case OMPC_depend:
10305   case OMPC_threads:
10306   case OMPC_simd:
10307   case OMPC_map:
10308   case OMPC_nogroup:
10309   case OMPC_dist_schedule:
10310   case OMPC_defaultmap:
10311   case OMPC_unknown:
10312   case OMPC_uniform:
10313   case OMPC_to:
10314   case OMPC_from:
10315   case OMPC_use_device_ptr:
10316   case OMPC_is_device_ptr:
10317   case OMPC_unified_address:
10318   case OMPC_unified_shared_memory:
10319   case OMPC_reverse_offload:
10320   case OMPC_dynamic_allocators:
10321   case OMPC_atomic_default_mem_order:
10322   case OMPC_device_type:
10323   case OMPC_match:
10324     llvm_unreachable("Clause is not allowed.");
10325   }
10326   return Res;
10327 }
10328 
10329 // An OpenMP directive such as 'target parallel' has two captured regions:
10330 // for the 'target' and 'parallel' respectively.  This function returns
10331 // the region in which to capture expressions associated with a clause.
10332 // A return value of OMPD_unknown signifies that the expression should not
10333 // be captured.
10334 static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
10335     OpenMPDirectiveKind DKind, OpenMPClauseKind CKind,
10336     OpenMPDirectiveKind NameModifier = OMPD_unknown) {
10337   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
10338   switch (CKind) {
10339   case OMPC_if:
10340     switch (DKind) {
10341     case OMPD_target_parallel:
10342     case OMPD_target_parallel_for:
10343     case OMPD_target_parallel_for_simd:
10344       // If this clause applies to the nested 'parallel' region, capture within
10345       // the 'target' region, otherwise do not capture.
10346       if (NameModifier == OMPD_unknown || NameModifier == OMPD_parallel)
10347         CaptureRegion = OMPD_target;
10348       break;
10349     case OMPD_target_teams_distribute_parallel_for:
10350     case OMPD_target_teams_distribute_parallel_for_simd:
10351       // If this clause applies to the nested 'parallel' region, capture within
10352       // the 'teams' region, otherwise do not capture.
10353       if (NameModifier == OMPD_unknown || NameModifier == OMPD_parallel)
10354         CaptureRegion = OMPD_teams;
10355       break;
10356     case OMPD_teams_distribute_parallel_for:
10357     case OMPD_teams_distribute_parallel_for_simd:
10358       CaptureRegion = OMPD_teams;
10359       break;
10360     case OMPD_target_update:
10361     case OMPD_target_enter_data:
10362     case OMPD_target_exit_data:
10363       CaptureRegion = OMPD_task;
10364       break;
10365     case OMPD_parallel_master_taskloop:
10366       if (NameModifier == OMPD_unknown || NameModifier == OMPD_taskloop)
10367         CaptureRegion = OMPD_parallel;
10368       break;
10369     case OMPD_cancel:
10370     case OMPD_parallel:
10371     case OMPD_parallel_sections:
10372     case OMPD_parallel_for:
10373     case OMPD_parallel_for_simd:
10374     case OMPD_target:
10375     case OMPD_target_simd:
10376     case OMPD_target_teams:
10377     case OMPD_target_teams_distribute:
10378     case OMPD_target_teams_distribute_simd:
10379     case OMPD_distribute_parallel_for:
10380     case OMPD_distribute_parallel_for_simd:
10381     case OMPD_task:
10382     case OMPD_taskloop:
10383     case OMPD_taskloop_simd:
10384     case OMPD_master_taskloop:
10385     case OMPD_master_taskloop_simd:
10386     case OMPD_target_data:
10387       // Do not capture if-clause expressions.
10388       break;
10389     case OMPD_threadprivate:
10390     case OMPD_allocate:
10391     case OMPD_taskyield:
10392     case OMPD_barrier:
10393     case OMPD_taskwait:
10394     case OMPD_cancellation_point:
10395     case OMPD_flush:
10396     case OMPD_declare_reduction:
10397     case OMPD_declare_mapper:
10398     case OMPD_declare_simd:
10399     case OMPD_declare_variant:
10400     case OMPD_declare_target:
10401     case OMPD_end_declare_target:
10402     case OMPD_teams:
10403     case OMPD_simd:
10404     case OMPD_for:
10405     case OMPD_for_simd:
10406     case OMPD_sections:
10407     case OMPD_section:
10408     case OMPD_single:
10409     case OMPD_master:
10410     case OMPD_critical:
10411     case OMPD_taskgroup:
10412     case OMPD_distribute:
10413     case OMPD_ordered:
10414     case OMPD_atomic:
10415     case OMPD_distribute_simd:
10416     case OMPD_teams_distribute:
10417     case OMPD_teams_distribute_simd:
10418     case OMPD_requires:
10419       llvm_unreachable("Unexpected OpenMP directive with if-clause");
10420     case OMPD_unknown:
10421       llvm_unreachable("Unknown OpenMP directive");
10422     }
10423     break;
10424   case OMPC_num_threads:
10425     switch (DKind) {
10426     case OMPD_target_parallel:
10427     case OMPD_target_parallel_for:
10428     case OMPD_target_parallel_for_simd:
10429       CaptureRegion = OMPD_target;
10430       break;
10431     case OMPD_teams_distribute_parallel_for:
10432     case OMPD_teams_distribute_parallel_for_simd:
10433     case OMPD_target_teams_distribute_parallel_for:
10434     case OMPD_target_teams_distribute_parallel_for_simd:
10435       CaptureRegion = OMPD_teams;
10436       break;
10437     case OMPD_parallel:
10438     case OMPD_parallel_sections:
10439     case OMPD_parallel_for:
10440     case OMPD_parallel_for_simd:
10441     case OMPD_distribute_parallel_for:
10442     case OMPD_distribute_parallel_for_simd:
10443     case OMPD_parallel_master_taskloop:
10444       // Do not capture num_threads-clause expressions.
10445       break;
10446     case OMPD_target_data:
10447     case OMPD_target_enter_data:
10448     case OMPD_target_exit_data:
10449     case OMPD_target_update:
10450     case OMPD_target:
10451     case OMPD_target_simd:
10452     case OMPD_target_teams:
10453     case OMPD_target_teams_distribute:
10454     case OMPD_target_teams_distribute_simd:
10455     case OMPD_cancel:
10456     case OMPD_task:
10457     case OMPD_taskloop:
10458     case OMPD_taskloop_simd:
10459     case OMPD_master_taskloop:
10460     case OMPD_master_taskloop_simd:
10461     case OMPD_threadprivate:
10462     case OMPD_allocate:
10463     case OMPD_taskyield:
10464     case OMPD_barrier:
10465     case OMPD_taskwait:
10466     case OMPD_cancellation_point:
10467     case OMPD_flush:
10468     case OMPD_declare_reduction:
10469     case OMPD_declare_mapper:
10470     case OMPD_declare_simd:
10471     case OMPD_declare_variant:
10472     case OMPD_declare_target:
10473     case OMPD_end_declare_target:
10474     case OMPD_teams:
10475     case OMPD_simd:
10476     case OMPD_for:
10477     case OMPD_for_simd:
10478     case OMPD_sections:
10479     case OMPD_section:
10480     case OMPD_single:
10481     case OMPD_master:
10482     case OMPD_critical:
10483     case OMPD_taskgroup:
10484     case OMPD_distribute:
10485     case OMPD_ordered:
10486     case OMPD_atomic:
10487     case OMPD_distribute_simd:
10488     case OMPD_teams_distribute:
10489     case OMPD_teams_distribute_simd:
10490     case OMPD_requires:
10491       llvm_unreachable("Unexpected OpenMP directive with num_threads-clause");
10492     case OMPD_unknown:
10493       llvm_unreachable("Unknown OpenMP directive");
10494     }
10495     break;
10496   case OMPC_num_teams:
10497     switch (DKind) {
10498     case OMPD_target_teams:
10499     case OMPD_target_teams_distribute:
10500     case OMPD_target_teams_distribute_simd:
10501     case OMPD_target_teams_distribute_parallel_for:
10502     case OMPD_target_teams_distribute_parallel_for_simd:
10503       CaptureRegion = OMPD_target;
10504       break;
10505     case OMPD_teams_distribute_parallel_for:
10506     case OMPD_teams_distribute_parallel_for_simd:
10507     case OMPD_teams:
10508     case OMPD_teams_distribute:
10509     case OMPD_teams_distribute_simd:
10510       // Do not capture num_teams-clause expressions.
10511       break;
10512     case OMPD_distribute_parallel_for:
10513     case OMPD_distribute_parallel_for_simd:
10514     case OMPD_task:
10515     case OMPD_taskloop:
10516     case OMPD_taskloop_simd:
10517     case OMPD_master_taskloop:
10518     case OMPD_master_taskloop_simd:
10519     case OMPD_parallel_master_taskloop:
10520     case OMPD_target_data:
10521     case OMPD_target_enter_data:
10522     case OMPD_target_exit_data:
10523     case OMPD_target_update:
10524     case OMPD_cancel:
10525     case OMPD_parallel:
10526     case OMPD_parallel_sections:
10527     case OMPD_parallel_for:
10528     case OMPD_parallel_for_simd:
10529     case OMPD_target:
10530     case OMPD_target_simd:
10531     case OMPD_target_parallel:
10532     case OMPD_target_parallel_for:
10533     case OMPD_target_parallel_for_simd:
10534     case OMPD_threadprivate:
10535     case OMPD_allocate:
10536     case OMPD_taskyield:
10537     case OMPD_barrier:
10538     case OMPD_taskwait:
10539     case OMPD_cancellation_point:
10540     case OMPD_flush:
10541     case OMPD_declare_reduction:
10542     case OMPD_declare_mapper:
10543     case OMPD_declare_simd:
10544     case OMPD_declare_variant:
10545     case OMPD_declare_target:
10546     case OMPD_end_declare_target:
10547     case OMPD_simd:
10548     case OMPD_for:
10549     case OMPD_for_simd:
10550     case OMPD_sections:
10551     case OMPD_section:
10552     case OMPD_single:
10553     case OMPD_master:
10554     case OMPD_critical:
10555     case OMPD_taskgroup:
10556     case OMPD_distribute:
10557     case OMPD_ordered:
10558     case OMPD_atomic:
10559     case OMPD_distribute_simd:
10560     case OMPD_requires:
10561       llvm_unreachable("Unexpected OpenMP directive with num_teams-clause");
10562     case OMPD_unknown:
10563       llvm_unreachable("Unknown OpenMP directive");
10564     }
10565     break;
10566   case OMPC_thread_limit:
10567     switch (DKind) {
10568     case OMPD_target_teams:
10569     case OMPD_target_teams_distribute:
10570     case OMPD_target_teams_distribute_simd:
10571     case OMPD_target_teams_distribute_parallel_for:
10572     case OMPD_target_teams_distribute_parallel_for_simd:
10573       CaptureRegion = OMPD_target;
10574       break;
10575     case OMPD_teams_distribute_parallel_for:
10576     case OMPD_teams_distribute_parallel_for_simd:
10577     case OMPD_teams:
10578     case OMPD_teams_distribute:
10579     case OMPD_teams_distribute_simd:
10580       // Do not capture thread_limit-clause expressions.
10581       break;
10582     case OMPD_distribute_parallel_for:
10583     case OMPD_distribute_parallel_for_simd:
10584     case OMPD_task:
10585     case OMPD_taskloop:
10586     case OMPD_taskloop_simd:
10587     case OMPD_master_taskloop:
10588     case OMPD_master_taskloop_simd:
10589     case OMPD_parallel_master_taskloop:
10590     case OMPD_target_data:
10591     case OMPD_target_enter_data:
10592     case OMPD_target_exit_data:
10593     case OMPD_target_update:
10594     case OMPD_cancel:
10595     case OMPD_parallel:
10596     case OMPD_parallel_sections:
10597     case OMPD_parallel_for:
10598     case OMPD_parallel_for_simd:
10599     case OMPD_target:
10600     case OMPD_target_simd:
10601     case OMPD_target_parallel:
10602     case OMPD_target_parallel_for:
10603     case OMPD_target_parallel_for_simd:
10604     case OMPD_threadprivate:
10605     case OMPD_allocate:
10606     case OMPD_taskyield:
10607     case OMPD_barrier:
10608     case OMPD_taskwait:
10609     case OMPD_cancellation_point:
10610     case OMPD_flush:
10611     case OMPD_declare_reduction:
10612     case OMPD_declare_mapper:
10613     case OMPD_declare_simd:
10614     case OMPD_declare_variant:
10615     case OMPD_declare_target:
10616     case OMPD_end_declare_target:
10617     case OMPD_simd:
10618     case OMPD_for:
10619     case OMPD_for_simd:
10620     case OMPD_sections:
10621     case OMPD_section:
10622     case OMPD_single:
10623     case OMPD_master:
10624     case OMPD_critical:
10625     case OMPD_taskgroup:
10626     case OMPD_distribute:
10627     case OMPD_ordered:
10628     case OMPD_atomic:
10629     case OMPD_distribute_simd:
10630     case OMPD_requires:
10631       llvm_unreachable("Unexpected OpenMP directive with thread_limit-clause");
10632     case OMPD_unknown:
10633       llvm_unreachable("Unknown OpenMP directive");
10634     }
10635     break;
10636   case OMPC_schedule:
10637     switch (DKind) {
10638     case OMPD_parallel_for:
10639     case OMPD_parallel_for_simd:
10640     case OMPD_distribute_parallel_for:
10641     case OMPD_distribute_parallel_for_simd:
10642     case OMPD_teams_distribute_parallel_for:
10643     case OMPD_teams_distribute_parallel_for_simd:
10644     case OMPD_target_parallel_for:
10645     case OMPD_target_parallel_for_simd:
10646     case OMPD_target_teams_distribute_parallel_for:
10647     case OMPD_target_teams_distribute_parallel_for_simd:
10648       CaptureRegion = OMPD_parallel;
10649       break;
10650     case OMPD_for:
10651     case OMPD_for_simd:
10652       // Do not capture schedule-clause expressions.
10653       break;
10654     case OMPD_task:
10655     case OMPD_taskloop:
10656     case OMPD_taskloop_simd:
10657     case OMPD_master_taskloop:
10658     case OMPD_master_taskloop_simd:
10659     case OMPD_parallel_master_taskloop:
10660     case OMPD_target_data:
10661     case OMPD_target_enter_data:
10662     case OMPD_target_exit_data:
10663     case OMPD_target_update:
10664     case OMPD_teams:
10665     case OMPD_teams_distribute:
10666     case OMPD_teams_distribute_simd:
10667     case OMPD_target_teams_distribute:
10668     case OMPD_target_teams_distribute_simd:
10669     case OMPD_target:
10670     case OMPD_target_simd:
10671     case OMPD_target_parallel:
10672     case OMPD_cancel:
10673     case OMPD_parallel:
10674     case OMPD_parallel_sections:
10675     case OMPD_threadprivate:
10676     case OMPD_allocate:
10677     case OMPD_taskyield:
10678     case OMPD_barrier:
10679     case OMPD_taskwait:
10680     case OMPD_cancellation_point:
10681     case OMPD_flush:
10682     case OMPD_declare_reduction:
10683     case OMPD_declare_mapper:
10684     case OMPD_declare_simd:
10685     case OMPD_declare_variant:
10686     case OMPD_declare_target:
10687     case OMPD_end_declare_target:
10688     case OMPD_simd:
10689     case OMPD_sections:
10690     case OMPD_section:
10691     case OMPD_single:
10692     case OMPD_master:
10693     case OMPD_critical:
10694     case OMPD_taskgroup:
10695     case OMPD_distribute:
10696     case OMPD_ordered:
10697     case OMPD_atomic:
10698     case OMPD_distribute_simd:
10699     case OMPD_target_teams:
10700     case OMPD_requires:
10701       llvm_unreachable("Unexpected OpenMP directive with schedule clause");
10702     case OMPD_unknown:
10703       llvm_unreachable("Unknown OpenMP directive");
10704     }
10705     break;
10706   case OMPC_dist_schedule:
10707     switch (DKind) {
10708     case OMPD_teams_distribute_parallel_for:
10709     case OMPD_teams_distribute_parallel_for_simd:
10710     case OMPD_teams_distribute:
10711     case OMPD_teams_distribute_simd:
10712     case OMPD_target_teams_distribute_parallel_for:
10713     case OMPD_target_teams_distribute_parallel_for_simd:
10714     case OMPD_target_teams_distribute:
10715     case OMPD_target_teams_distribute_simd:
10716       CaptureRegion = OMPD_teams;
10717       break;
10718     case OMPD_distribute_parallel_for:
10719     case OMPD_distribute_parallel_for_simd:
10720     case OMPD_distribute:
10721     case OMPD_distribute_simd:
10722       // Do not capture thread_limit-clause expressions.
10723       break;
10724     case OMPD_parallel_for:
10725     case OMPD_parallel_for_simd:
10726     case OMPD_target_parallel_for_simd:
10727     case OMPD_target_parallel_for:
10728     case OMPD_task:
10729     case OMPD_taskloop:
10730     case OMPD_taskloop_simd:
10731     case OMPD_master_taskloop:
10732     case OMPD_master_taskloop_simd:
10733     case OMPD_parallel_master_taskloop:
10734     case OMPD_target_data:
10735     case OMPD_target_enter_data:
10736     case OMPD_target_exit_data:
10737     case OMPD_target_update:
10738     case OMPD_teams:
10739     case OMPD_target:
10740     case OMPD_target_simd:
10741     case OMPD_target_parallel:
10742     case OMPD_cancel:
10743     case OMPD_parallel:
10744     case OMPD_parallel_sections:
10745     case OMPD_threadprivate:
10746     case OMPD_allocate:
10747     case OMPD_taskyield:
10748     case OMPD_barrier:
10749     case OMPD_taskwait:
10750     case OMPD_cancellation_point:
10751     case OMPD_flush:
10752     case OMPD_declare_reduction:
10753     case OMPD_declare_mapper:
10754     case OMPD_declare_simd:
10755     case OMPD_declare_variant:
10756     case OMPD_declare_target:
10757     case OMPD_end_declare_target:
10758     case OMPD_simd:
10759     case OMPD_for:
10760     case OMPD_for_simd:
10761     case OMPD_sections:
10762     case OMPD_section:
10763     case OMPD_single:
10764     case OMPD_master:
10765     case OMPD_critical:
10766     case OMPD_taskgroup:
10767     case OMPD_ordered:
10768     case OMPD_atomic:
10769     case OMPD_target_teams:
10770     case OMPD_requires:
10771       llvm_unreachable("Unexpected OpenMP directive with schedule clause");
10772     case OMPD_unknown:
10773       llvm_unreachable("Unknown OpenMP directive");
10774     }
10775     break;
10776   case OMPC_device:
10777     switch (DKind) {
10778     case OMPD_target_update:
10779     case OMPD_target_enter_data:
10780     case OMPD_target_exit_data:
10781     case OMPD_target:
10782     case OMPD_target_simd:
10783     case OMPD_target_teams:
10784     case OMPD_target_parallel:
10785     case OMPD_target_teams_distribute:
10786     case OMPD_target_teams_distribute_simd:
10787     case OMPD_target_parallel_for:
10788     case OMPD_target_parallel_for_simd:
10789     case OMPD_target_teams_distribute_parallel_for:
10790     case OMPD_target_teams_distribute_parallel_for_simd:
10791       CaptureRegion = OMPD_task;
10792       break;
10793     case OMPD_target_data:
10794       // Do not capture device-clause expressions.
10795       break;
10796     case OMPD_teams_distribute_parallel_for:
10797     case OMPD_teams_distribute_parallel_for_simd:
10798     case OMPD_teams:
10799     case OMPD_teams_distribute:
10800     case OMPD_teams_distribute_simd:
10801     case OMPD_distribute_parallel_for:
10802     case OMPD_distribute_parallel_for_simd:
10803     case OMPD_task:
10804     case OMPD_taskloop:
10805     case OMPD_taskloop_simd:
10806     case OMPD_master_taskloop:
10807     case OMPD_master_taskloop_simd:
10808     case OMPD_parallel_master_taskloop:
10809     case OMPD_cancel:
10810     case OMPD_parallel:
10811     case OMPD_parallel_sections:
10812     case OMPD_parallel_for:
10813     case OMPD_parallel_for_simd:
10814     case OMPD_threadprivate:
10815     case OMPD_allocate:
10816     case OMPD_taskyield:
10817     case OMPD_barrier:
10818     case OMPD_taskwait:
10819     case OMPD_cancellation_point:
10820     case OMPD_flush:
10821     case OMPD_declare_reduction:
10822     case OMPD_declare_mapper:
10823     case OMPD_declare_simd:
10824     case OMPD_declare_variant:
10825     case OMPD_declare_target:
10826     case OMPD_end_declare_target:
10827     case OMPD_simd:
10828     case OMPD_for:
10829     case OMPD_for_simd:
10830     case OMPD_sections:
10831     case OMPD_section:
10832     case OMPD_single:
10833     case OMPD_master:
10834     case OMPD_critical:
10835     case OMPD_taskgroup:
10836     case OMPD_distribute:
10837     case OMPD_ordered:
10838     case OMPD_atomic:
10839     case OMPD_distribute_simd:
10840     case OMPD_requires:
10841       llvm_unreachable("Unexpected OpenMP directive with num_teams-clause");
10842     case OMPD_unknown:
10843       llvm_unreachable("Unknown OpenMP directive");
10844     }
10845     break;
10846   case OMPC_grainsize:
10847   case OMPC_num_tasks:
10848   case OMPC_final:
10849   case OMPC_priority:
10850     switch (DKind) {
10851     case OMPD_task:
10852     case OMPD_taskloop:
10853     case OMPD_taskloop_simd:
10854     case OMPD_master_taskloop:
10855     case OMPD_master_taskloop_simd:
10856       break;
10857     case OMPD_parallel_master_taskloop:
10858       CaptureRegion = OMPD_parallel;
10859       break;
10860     case OMPD_target_update:
10861     case OMPD_target_enter_data:
10862     case OMPD_target_exit_data:
10863     case OMPD_target:
10864     case OMPD_target_simd:
10865     case OMPD_target_teams:
10866     case OMPD_target_parallel:
10867     case OMPD_target_teams_distribute:
10868     case OMPD_target_teams_distribute_simd:
10869     case OMPD_target_parallel_for:
10870     case OMPD_target_parallel_for_simd:
10871     case OMPD_target_teams_distribute_parallel_for:
10872     case OMPD_target_teams_distribute_parallel_for_simd:
10873     case OMPD_target_data:
10874     case OMPD_teams_distribute_parallel_for:
10875     case OMPD_teams_distribute_parallel_for_simd:
10876     case OMPD_teams:
10877     case OMPD_teams_distribute:
10878     case OMPD_teams_distribute_simd:
10879     case OMPD_distribute_parallel_for:
10880     case OMPD_distribute_parallel_for_simd:
10881     case OMPD_cancel:
10882     case OMPD_parallel:
10883     case OMPD_parallel_sections:
10884     case OMPD_parallel_for:
10885     case OMPD_parallel_for_simd:
10886     case OMPD_threadprivate:
10887     case OMPD_allocate:
10888     case OMPD_taskyield:
10889     case OMPD_barrier:
10890     case OMPD_taskwait:
10891     case OMPD_cancellation_point:
10892     case OMPD_flush:
10893     case OMPD_declare_reduction:
10894     case OMPD_declare_mapper:
10895     case OMPD_declare_simd:
10896     case OMPD_declare_variant:
10897     case OMPD_declare_target:
10898     case OMPD_end_declare_target:
10899     case OMPD_simd:
10900     case OMPD_for:
10901     case OMPD_for_simd:
10902     case OMPD_sections:
10903     case OMPD_section:
10904     case OMPD_single:
10905     case OMPD_master:
10906     case OMPD_critical:
10907     case OMPD_taskgroup:
10908     case OMPD_distribute:
10909     case OMPD_ordered:
10910     case OMPD_atomic:
10911     case OMPD_distribute_simd:
10912     case OMPD_requires:
10913       llvm_unreachable("Unexpected OpenMP directive with grainsize-clause");
10914     case OMPD_unknown:
10915       llvm_unreachable("Unknown OpenMP directive");
10916     }
10917     break;
10918   case OMPC_firstprivate:
10919   case OMPC_lastprivate:
10920   case OMPC_reduction:
10921   case OMPC_task_reduction:
10922   case OMPC_in_reduction:
10923   case OMPC_linear:
10924   case OMPC_default:
10925   case OMPC_proc_bind:
10926   case OMPC_safelen:
10927   case OMPC_simdlen:
10928   case OMPC_allocator:
10929   case OMPC_collapse:
10930   case OMPC_private:
10931   case OMPC_shared:
10932   case OMPC_aligned:
10933   case OMPC_copyin:
10934   case OMPC_copyprivate:
10935   case OMPC_ordered:
10936   case OMPC_nowait:
10937   case OMPC_untied:
10938   case OMPC_mergeable:
10939   case OMPC_threadprivate:
10940   case OMPC_allocate:
10941   case OMPC_flush:
10942   case OMPC_read:
10943   case OMPC_write:
10944   case OMPC_update:
10945   case OMPC_capture:
10946   case OMPC_seq_cst:
10947   case OMPC_depend:
10948   case OMPC_threads:
10949   case OMPC_simd:
10950   case OMPC_map:
10951   case OMPC_nogroup:
10952   case OMPC_hint:
10953   case OMPC_defaultmap:
10954   case OMPC_unknown:
10955   case OMPC_uniform:
10956   case OMPC_to:
10957   case OMPC_from:
10958   case OMPC_use_device_ptr:
10959   case OMPC_is_device_ptr:
10960   case OMPC_unified_address:
10961   case OMPC_unified_shared_memory:
10962   case OMPC_reverse_offload:
10963   case OMPC_dynamic_allocators:
10964   case OMPC_atomic_default_mem_order:
10965   case OMPC_device_type:
10966   case OMPC_match:
10967     llvm_unreachable("Unexpected OpenMP clause.");
10968   }
10969   return CaptureRegion;
10970 }
10971 
10972 OMPClause *Sema::ActOnOpenMPIfClause(OpenMPDirectiveKind NameModifier,
10973                                      Expr *Condition, SourceLocation StartLoc,
10974                                      SourceLocation LParenLoc,
10975                                      SourceLocation NameModifierLoc,
10976                                      SourceLocation ColonLoc,
10977                                      SourceLocation EndLoc) {
10978   Expr *ValExpr = Condition;
10979   Stmt *HelperValStmt = nullptr;
10980   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
10981   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
10982       !Condition->isInstantiationDependent() &&
10983       !Condition->containsUnexpandedParameterPack()) {
10984     ExprResult Val = CheckBooleanCondition(StartLoc, Condition);
10985     if (Val.isInvalid())
10986       return nullptr;
10987 
10988     ValExpr = Val.get();
10989 
10990     OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
10991     CaptureRegion =
10992         getOpenMPCaptureRegionForClause(DKind, OMPC_if, NameModifier);
10993     if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
10994       ValExpr = MakeFullExpr(ValExpr).get();
10995       llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
10996       ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
10997       HelperValStmt = buildPreInits(Context, Captures);
10998     }
10999   }
11000 
11001   return new (Context)
11002       OMPIfClause(NameModifier, ValExpr, HelperValStmt, CaptureRegion, StartLoc,
11003                   LParenLoc, NameModifierLoc, ColonLoc, EndLoc);
11004 }
11005 
11006 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition,
11007                                         SourceLocation StartLoc,
11008                                         SourceLocation LParenLoc,
11009                                         SourceLocation EndLoc) {
11010   Expr *ValExpr = Condition;
11011   Stmt *HelperValStmt = nullptr;
11012   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
11013   if (!Condition->isValueDependent() && !Condition->isTypeDependent() &&
11014       !Condition->isInstantiationDependent() &&
11015       !Condition->containsUnexpandedParameterPack()) {
11016     ExprResult Val = CheckBooleanCondition(StartLoc, Condition);
11017     if (Val.isInvalid())
11018       return nullptr;
11019 
11020     ValExpr = MakeFullExpr(Val.get()).get();
11021 
11022     OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
11023     CaptureRegion = getOpenMPCaptureRegionForClause(DKind, OMPC_final);
11024     if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
11025       ValExpr = MakeFullExpr(ValExpr).get();
11026       llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
11027       ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
11028       HelperValStmt = buildPreInits(Context, Captures);
11029     }
11030   }
11031 
11032   return new (Context) OMPFinalClause(ValExpr, HelperValStmt, CaptureRegion,
11033                                       StartLoc, LParenLoc, EndLoc);
11034 }
11035 
11036 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc,
11037                                                         Expr *Op) {
11038   if (!Op)
11039     return ExprError();
11040 
11041   class IntConvertDiagnoser : public ICEConvertDiagnoser {
11042   public:
11043     IntConvertDiagnoser()
11044         : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {}
11045     SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
11046                                          QualType T) override {
11047       return S.Diag(Loc, diag::err_omp_not_integral) << T;
11048     }
11049     SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
11050                                              QualType T) override {
11051       return S.Diag(Loc, diag::err_omp_incomplete_type) << T;
11052     }
11053     SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
11054                                                QualType T,
11055                                                QualType ConvTy) override {
11056       return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy;
11057     }
11058     SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
11059                                            QualType ConvTy) override {
11060       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
11061              << ConvTy->isEnumeralType() << ConvTy;
11062     }
11063     SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
11064                                             QualType T) override {
11065       return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T;
11066     }
11067     SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
11068                                         QualType ConvTy) override {
11069       return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here)
11070              << ConvTy->isEnumeralType() << ConvTy;
11071     }
11072     SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType,
11073                                              QualType) override {
11074       llvm_unreachable("conversion functions are permitted");
11075     }
11076   } ConvertDiagnoser;
11077   return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
11078 }
11079 
11080 static bool
11081 isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef, OpenMPClauseKind CKind,
11082                           bool StrictlyPositive, bool BuildCapture = false,
11083                           OpenMPDirectiveKind DKind = OMPD_unknown,
11084                           OpenMPDirectiveKind *CaptureRegion = nullptr,
11085                           Stmt **HelperValStmt = nullptr) {
11086   if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
11087       !ValExpr->isInstantiationDependent()) {
11088     SourceLocation Loc = ValExpr->getExprLoc();
11089     ExprResult Value =
11090         SemaRef.PerformOpenMPImplicitIntegerConversion(Loc, ValExpr);
11091     if (Value.isInvalid())
11092       return false;
11093 
11094     ValExpr = Value.get();
11095     // The expression must evaluate to a non-negative integer value.
11096     llvm::APSInt Result;
11097     if (ValExpr->isIntegerConstantExpr(Result, SemaRef.Context) &&
11098         Result.isSigned() &&
11099         !((!StrictlyPositive && Result.isNonNegative()) ||
11100           (StrictlyPositive && Result.isStrictlyPositive()))) {
11101       SemaRef.Diag(Loc, diag::err_omp_negative_expression_in_clause)
11102           << getOpenMPClauseName(CKind) << (StrictlyPositive ? 1 : 0)
11103           << ValExpr->getSourceRange();
11104       return false;
11105     }
11106     if (!BuildCapture)
11107       return true;
11108     *CaptureRegion = getOpenMPCaptureRegionForClause(DKind, CKind);
11109     if (*CaptureRegion != OMPD_unknown &&
11110         !SemaRef.CurContext->isDependentContext()) {
11111       ValExpr = SemaRef.MakeFullExpr(ValExpr).get();
11112       llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
11113       ValExpr = tryBuildCapture(SemaRef, ValExpr, Captures).get();
11114       *HelperValStmt = buildPreInits(SemaRef.Context, Captures);
11115     }
11116   }
11117   return true;
11118 }
11119 
11120 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
11121                                              SourceLocation StartLoc,
11122                                              SourceLocation LParenLoc,
11123                                              SourceLocation EndLoc) {
11124   Expr *ValExpr = NumThreads;
11125   Stmt *HelperValStmt = nullptr;
11126 
11127   // OpenMP [2.5, Restrictions]
11128   //  The num_threads expression must evaluate to a positive integer value.
11129   if (!isNonNegativeIntegerValue(ValExpr, *this, OMPC_num_threads,
11130                                  /*StrictlyPositive=*/true))
11131     return nullptr;
11132 
11133   OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
11134   OpenMPDirectiveKind CaptureRegion =
11135       getOpenMPCaptureRegionForClause(DKind, OMPC_num_threads);
11136   if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
11137     ValExpr = MakeFullExpr(ValExpr).get();
11138     llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
11139     ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
11140     HelperValStmt = buildPreInits(Context, Captures);
11141   }
11142 
11143   return new (Context) OMPNumThreadsClause(
11144       ValExpr, HelperValStmt, CaptureRegion, StartLoc, LParenLoc, EndLoc);
11145 }
11146 
11147 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E,
11148                                                        OpenMPClauseKind CKind,
11149                                                        bool StrictlyPositive) {
11150   if (!E)
11151     return ExprError();
11152   if (E->isValueDependent() || E->isTypeDependent() ||
11153       E->isInstantiationDependent() || E->containsUnexpandedParameterPack())
11154     return E;
11155   llvm::APSInt Result;
11156   ExprResult ICE = VerifyIntegerConstantExpression(E, &Result);
11157   if (ICE.isInvalid())
11158     return ExprError();
11159   if ((StrictlyPositive && !Result.isStrictlyPositive()) ||
11160       (!StrictlyPositive && !Result.isNonNegative())) {
11161     Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause)
11162         << getOpenMPClauseName(CKind) << (StrictlyPositive ? 1 : 0)
11163         << E->getSourceRange();
11164     return ExprError();
11165   }
11166   if (CKind == OMPC_aligned && !Result.isPowerOf2()) {
11167     Diag(E->getExprLoc(), diag::warn_omp_alignment_not_power_of_two)
11168         << E->getSourceRange();
11169     return ExprError();
11170   }
11171   if (CKind == OMPC_collapse && DSAStack->getAssociatedLoops() == 1)
11172     DSAStack->setAssociatedLoops(Result.getExtValue());
11173   else if (CKind == OMPC_ordered)
11174     DSAStack->setAssociatedLoops(Result.getExtValue());
11175   return ICE;
11176 }
11177 
11178 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc,
11179                                           SourceLocation LParenLoc,
11180                                           SourceLocation EndLoc) {
11181   // OpenMP [2.8.1, simd construct, Description]
11182   // The parameter of the safelen clause must be a constant
11183   // positive integer expression.
11184   ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen);
11185   if (Safelen.isInvalid())
11186     return nullptr;
11187   return new (Context)
11188       OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc);
11189 }
11190 
11191 OMPClause *Sema::ActOnOpenMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
11192                                           SourceLocation LParenLoc,
11193                                           SourceLocation EndLoc) {
11194   // OpenMP [2.8.1, simd construct, Description]
11195   // The parameter of the simdlen clause must be a constant
11196   // positive integer expression.
11197   ExprResult Simdlen = VerifyPositiveIntegerConstantInClause(Len, OMPC_simdlen);
11198   if (Simdlen.isInvalid())
11199     return nullptr;
11200   return new (Context)
11201       OMPSimdlenClause(Simdlen.get(), StartLoc, LParenLoc, EndLoc);
11202 }
11203 
11204 /// Tries to find omp_allocator_handle_t type.
11205 static bool findOMPAllocatorHandleT(Sema &S, SourceLocation Loc,
11206                                     DSAStackTy *Stack) {
11207   QualType OMPAllocatorHandleT = Stack->getOMPAllocatorHandleT();
11208   if (!OMPAllocatorHandleT.isNull())
11209     return true;
11210   // Build the predefined allocator expressions.
11211   bool ErrorFound = false;
11212   for (int I = OMPAllocateDeclAttr::OMPDefaultMemAlloc;
11213        I < OMPAllocateDeclAttr::OMPUserDefinedMemAlloc; ++I) {
11214     auto AllocatorKind = static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(I);
11215     StringRef Allocator =
11216         OMPAllocateDeclAttr::ConvertAllocatorTypeTyToStr(AllocatorKind);
11217     DeclarationName AllocatorName = &S.getASTContext().Idents.get(Allocator);
11218     auto *VD = dyn_cast_or_null<ValueDecl>(
11219         S.LookupSingleName(S.TUScope, AllocatorName, Loc, Sema::LookupAnyName));
11220     if (!VD) {
11221       ErrorFound = true;
11222       break;
11223     }
11224     QualType AllocatorType =
11225         VD->getType().getNonLValueExprType(S.getASTContext());
11226     ExprResult Res = S.BuildDeclRefExpr(VD, AllocatorType, VK_LValue, Loc);
11227     if (!Res.isUsable()) {
11228       ErrorFound = true;
11229       break;
11230     }
11231     if (OMPAllocatorHandleT.isNull())
11232       OMPAllocatorHandleT = AllocatorType;
11233     if (!S.getASTContext().hasSameType(OMPAllocatorHandleT, AllocatorType)) {
11234       ErrorFound = true;
11235       break;
11236     }
11237     Stack->setAllocator(AllocatorKind, Res.get());
11238   }
11239   if (ErrorFound) {
11240     S.Diag(Loc, diag::err_implied_omp_allocator_handle_t_not_found);
11241     return false;
11242   }
11243   OMPAllocatorHandleT.addConst();
11244   Stack->setOMPAllocatorHandleT(OMPAllocatorHandleT);
11245   return true;
11246 }
11247 
11248 OMPClause *Sema::ActOnOpenMPAllocatorClause(Expr *A, SourceLocation StartLoc,
11249                                             SourceLocation LParenLoc,
11250                                             SourceLocation EndLoc) {
11251   // OpenMP [2.11.3, allocate Directive, Description]
11252   // allocator is an expression of omp_allocator_handle_t type.
11253   if (!findOMPAllocatorHandleT(*this, A->getExprLoc(), DSAStack))
11254     return nullptr;
11255 
11256   ExprResult Allocator = DefaultLvalueConversion(A);
11257   if (Allocator.isInvalid())
11258     return nullptr;
11259   Allocator = PerformImplicitConversion(Allocator.get(),
11260                                         DSAStack->getOMPAllocatorHandleT(),
11261                                         Sema::AA_Initializing,
11262                                         /*AllowExplicit=*/true);
11263   if (Allocator.isInvalid())
11264     return nullptr;
11265   return new (Context)
11266       OMPAllocatorClause(Allocator.get(), StartLoc, LParenLoc, EndLoc);
11267 }
11268 
11269 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops,
11270                                            SourceLocation StartLoc,
11271                                            SourceLocation LParenLoc,
11272                                            SourceLocation EndLoc) {
11273   // OpenMP [2.7.1, loop construct, Description]
11274   // OpenMP [2.8.1, simd construct, Description]
11275   // OpenMP [2.9.6, distribute construct, Description]
11276   // The parameter of the collapse clause must be a constant
11277   // positive integer expression.
11278   ExprResult NumForLoopsResult =
11279       VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse);
11280   if (NumForLoopsResult.isInvalid())
11281     return nullptr;
11282   return new (Context)
11283       OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc);
11284 }
11285 
11286 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc,
11287                                           SourceLocation EndLoc,
11288                                           SourceLocation LParenLoc,
11289                                           Expr *NumForLoops) {
11290   // OpenMP [2.7.1, loop construct, Description]
11291   // OpenMP [2.8.1, simd construct, Description]
11292   // OpenMP [2.9.6, distribute construct, Description]
11293   // The parameter of the ordered clause must be a constant
11294   // positive integer expression if any.
11295   if (NumForLoops && LParenLoc.isValid()) {
11296     ExprResult NumForLoopsResult =
11297         VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_ordered);
11298     if (NumForLoopsResult.isInvalid())
11299       return nullptr;
11300     NumForLoops = NumForLoopsResult.get();
11301   } else {
11302     NumForLoops = nullptr;
11303   }
11304   auto *Clause = OMPOrderedClause::Create(
11305       Context, NumForLoops, NumForLoops ? DSAStack->getAssociatedLoops() : 0,
11306       StartLoc, LParenLoc, EndLoc);
11307   DSAStack->setOrderedRegion(/*IsOrdered=*/true, NumForLoops, Clause);
11308   return Clause;
11309 }
11310 
11311 OMPClause *Sema::ActOnOpenMPSimpleClause(
11312     OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc,
11313     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
11314   OMPClause *Res = nullptr;
11315   switch (Kind) {
11316   case OMPC_default:
11317     Res =
11318         ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument),
11319                                  ArgumentLoc, StartLoc, LParenLoc, EndLoc);
11320     break;
11321   case OMPC_proc_bind:
11322     Res = ActOnOpenMPProcBindClause(
11323         static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc,
11324         LParenLoc, EndLoc);
11325     break;
11326   case OMPC_atomic_default_mem_order:
11327     Res = ActOnOpenMPAtomicDefaultMemOrderClause(
11328         static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Argument),
11329         ArgumentLoc, StartLoc, LParenLoc, EndLoc);
11330     break;
11331   case OMPC_if:
11332   case OMPC_final:
11333   case OMPC_num_threads:
11334   case OMPC_safelen:
11335   case OMPC_simdlen:
11336   case OMPC_allocator:
11337   case OMPC_collapse:
11338   case OMPC_schedule:
11339   case OMPC_private:
11340   case OMPC_firstprivate:
11341   case OMPC_lastprivate:
11342   case OMPC_shared:
11343   case OMPC_reduction:
11344   case OMPC_task_reduction:
11345   case OMPC_in_reduction:
11346   case OMPC_linear:
11347   case OMPC_aligned:
11348   case OMPC_copyin:
11349   case OMPC_copyprivate:
11350   case OMPC_ordered:
11351   case OMPC_nowait:
11352   case OMPC_untied:
11353   case OMPC_mergeable:
11354   case OMPC_threadprivate:
11355   case OMPC_allocate:
11356   case OMPC_flush:
11357   case OMPC_read:
11358   case OMPC_write:
11359   case OMPC_update:
11360   case OMPC_capture:
11361   case OMPC_seq_cst:
11362   case OMPC_depend:
11363   case OMPC_device:
11364   case OMPC_threads:
11365   case OMPC_simd:
11366   case OMPC_map:
11367   case OMPC_num_teams:
11368   case OMPC_thread_limit:
11369   case OMPC_priority:
11370   case OMPC_grainsize:
11371   case OMPC_nogroup:
11372   case OMPC_num_tasks:
11373   case OMPC_hint:
11374   case OMPC_dist_schedule:
11375   case OMPC_defaultmap:
11376   case OMPC_unknown:
11377   case OMPC_uniform:
11378   case OMPC_to:
11379   case OMPC_from:
11380   case OMPC_use_device_ptr:
11381   case OMPC_is_device_ptr:
11382   case OMPC_unified_address:
11383   case OMPC_unified_shared_memory:
11384   case OMPC_reverse_offload:
11385   case OMPC_dynamic_allocators:
11386   case OMPC_device_type:
11387   case OMPC_match:
11388     llvm_unreachable("Clause is not allowed.");
11389   }
11390   return Res;
11391 }
11392 
11393 static std::string
11394 getListOfPossibleValues(OpenMPClauseKind K, unsigned First, unsigned Last,
11395                         ArrayRef<unsigned> Exclude = llvm::None) {
11396   SmallString<256> Buffer;
11397   llvm::raw_svector_ostream Out(Buffer);
11398   unsigned Bound = Last >= 2 ? Last - 2 : 0;
11399   unsigned Skipped = Exclude.size();
11400   auto S = Exclude.begin(), E = Exclude.end();
11401   for (unsigned I = First; I < Last; ++I) {
11402     if (std::find(S, E, I) != E) {
11403       --Skipped;
11404       continue;
11405     }
11406     Out << "'" << getOpenMPSimpleClauseTypeName(K, I) << "'";
11407     if (I == Bound - Skipped)
11408       Out << " or ";
11409     else if (I != Bound + 1 - Skipped)
11410       Out << ", ";
11411   }
11412   return Out.str();
11413 }
11414 
11415 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind,
11416                                           SourceLocation KindKwLoc,
11417                                           SourceLocation StartLoc,
11418                                           SourceLocation LParenLoc,
11419                                           SourceLocation EndLoc) {
11420   if (Kind == OMPC_DEFAULT_unknown) {
11421     static_assert(OMPC_DEFAULT_unknown > 0,
11422                   "OMPC_DEFAULT_unknown not greater than 0");
11423     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
11424         << getListOfPossibleValues(OMPC_default, /*First=*/0,
11425                                    /*Last=*/OMPC_DEFAULT_unknown)
11426         << getOpenMPClauseName(OMPC_default);
11427     return nullptr;
11428   }
11429   switch (Kind) {
11430   case OMPC_DEFAULT_none:
11431     DSAStack->setDefaultDSANone(KindKwLoc);
11432     break;
11433   case OMPC_DEFAULT_shared:
11434     DSAStack->setDefaultDSAShared(KindKwLoc);
11435     break;
11436   case OMPC_DEFAULT_unknown:
11437     llvm_unreachable("Clause kind is not allowed.");
11438     break;
11439   }
11440   return new (Context)
11441       OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
11442 }
11443 
11444 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind,
11445                                            SourceLocation KindKwLoc,
11446                                            SourceLocation StartLoc,
11447                                            SourceLocation LParenLoc,
11448                                            SourceLocation EndLoc) {
11449   if (Kind == OMPC_PROC_BIND_unknown) {
11450     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
11451         << getListOfPossibleValues(OMPC_proc_bind, /*First=*/0,
11452                                    /*Last=*/OMPC_PROC_BIND_unknown)
11453         << getOpenMPClauseName(OMPC_proc_bind);
11454     return nullptr;
11455   }
11456   return new (Context)
11457       OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
11458 }
11459 
11460 OMPClause *Sema::ActOnOpenMPAtomicDefaultMemOrderClause(
11461     OpenMPAtomicDefaultMemOrderClauseKind Kind, SourceLocation KindKwLoc,
11462     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
11463   if (Kind == OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown) {
11464     Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
11465         << getListOfPossibleValues(
11466                OMPC_atomic_default_mem_order, /*First=*/0,
11467                /*Last=*/OMPC_ATOMIC_DEFAULT_MEM_ORDER_unknown)
11468         << getOpenMPClauseName(OMPC_atomic_default_mem_order);
11469     return nullptr;
11470   }
11471   return new (Context) OMPAtomicDefaultMemOrderClause(Kind, KindKwLoc, StartLoc,
11472                                                       LParenLoc, EndLoc);
11473 }
11474 
11475 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause(
11476     OpenMPClauseKind Kind, ArrayRef<unsigned> Argument, Expr *Expr,
11477     SourceLocation StartLoc, SourceLocation LParenLoc,
11478     ArrayRef<SourceLocation> ArgumentLoc, SourceLocation DelimLoc,
11479     SourceLocation EndLoc) {
11480   OMPClause *Res = nullptr;
11481   switch (Kind) {
11482   case OMPC_schedule:
11483     enum { Modifier1, Modifier2, ScheduleKind, NumberOfElements };
11484     assert(Argument.size() == NumberOfElements &&
11485            ArgumentLoc.size() == NumberOfElements);
11486     Res = ActOnOpenMPScheduleClause(
11487         static_cast<OpenMPScheduleClauseModifier>(Argument[Modifier1]),
11488         static_cast<OpenMPScheduleClauseModifier>(Argument[Modifier2]),
11489         static_cast<OpenMPScheduleClauseKind>(Argument[ScheduleKind]), Expr,
11490         StartLoc, LParenLoc, ArgumentLoc[Modifier1], ArgumentLoc[Modifier2],
11491         ArgumentLoc[ScheduleKind], DelimLoc, EndLoc);
11492     break;
11493   case OMPC_if:
11494     assert(Argument.size() == 1 && ArgumentLoc.size() == 1);
11495     Res = ActOnOpenMPIfClause(static_cast<OpenMPDirectiveKind>(Argument.back()),
11496                               Expr, StartLoc, LParenLoc, ArgumentLoc.back(),
11497                               DelimLoc, EndLoc);
11498     break;
11499   case OMPC_dist_schedule:
11500     Res = ActOnOpenMPDistScheduleClause(
11501         static_cast<OpenMPDistScheduleClauseKind>(Argument.back()), Expr,
11502         StartLoc, LParenLoc, ArgumentLoc.back(), DelimLoc, EndLoc);
11503     break;
11504   case OMPC_defaultmap:
11505     enum { Modifier, DefaultmapKind };
11506     Res = ActOnOpenMPDefaultmapClause(
11507         static_cast<OpenMPDefaultmapClauseModifier>(Argument[Modifier]),
11508         static_cast<OpenMPDefaultmapClauseKind>(Argument[DefaultmapKind]),
11509         StartLoc, LParenLoc, ArgumentLoc[Modifier], ArgumentLoc[DefaultmapKind],
11510         EndLoc);
11511     break;
11512   case OMPC_final:
11513   case OMPC_num_threads:
11514   case OMPC_safelen:
11515   case OMPC_simdlen:
11516   case OMPC_allocator:
11517   case OMPC_collapse:
11518   case OMPC_default:
11519   case OMPC_proc_bind:
11520   case OMPC_private:
11521   case OMPC_firstprivate:
11522   case OMPC_lastprivate:
11523   case OMPC_shared:
11524   case OMPC_reduction:
11525   case OMPC_task_reduction:
11526   case OMPC_in_reduction:
11527   case OMPC_linear:
11528   case OMPC_aligned:
11529   case OMPC_copyin:
11530   case OMPC_copyprivate:
11531   case OMPC_ordered:
11532   case OMPC_nowait:
11533   case OMPC_untied:
11534   case OMPC_mergeable:
11535   case OMPC_threadprivate:
11536   case OMPC_allocate:
11537   case OMPC_flush:
11538   case OMPC_read:
11539   case OMPC_write:
11540   case OMPC_update:
11541   case OMPC_capture:
11542   case OMPC_seq_cst:
11543   case OMPC_depend:
11544   case OMPC_device:
11545   case OMPC_threads:
11546   case OMPC_simd:
11547   case OMPC_map:
11548   case OMPC_num_teams:
11549   case OMPC_thread_limit:
11550   case OMPC_priority:
11551   case OMPC_grainsize:
11552   case OMPC_nogroup:
11553   case OMPC_num_tasks:
11554   case OMPC_hint:
11555   case OMPC_unknown:
11556   case OMPC_uniform:
11557   case OMPC_to:
11558   case OMPC_from:
11559   case OMPC_use_device_ptr:
11560   case OMPC_is_device_ptr:
11561   case OMPC_unified_address:
11562   case OMPC_unified_shared_memory:
11563   case OMPC_reverse_offload:
11564   case OMPC_dynamic_allocators:
11565   case OMPC_atomic_default_mem_order:
11566   case OMPC_device_type:
11567   case OMPC_match:
11568     llvm_unreachable("Clause is not allowed.");
11569   }
11570   return Res;
11571 }
11572 
11573 static bool checkScheduleModifiers(Sema &S, OpenMPScheduleClauseModifier M1,
11574                                    OpenMPScheduleClauseModifier M2,
11575                                    SourceLocation M1Loc, SourceLocation M2Loc) {
11576   if (M1 == OMPC_SCHEDULE_MODIFIER_unknown && M1Loc.isValid()) {
11577     SmallVector<unsigned, 2> Excluded;
11578     if (M2 != OMPC_SCHEDULE_MODIFIER_unknown)
11579       Excluded.push_back(M2);
11580     if (M2 == OMPC_SCHEDULE_MODIFIER_nonmonotonic)
11581       Excluded.push_back(OMPC_SCHEDULE_MODIFIER_monotonic);
11582     if (M2 == OMPC_SCHEDULE_MODIFIER_monotonic)
11583       Excluded.push_back(OMPC_SCHEDULE_MODIFIER_nonmonotonic);
11584     S.Diag(M1Loc, diag::err_omp_unexpected_clause_value)
11585         << getListOfPossibleValues(OMPC_schedule,
11586                                    /*First=*/OMPC_SCHEDULE_MODIFIER_unknown + 1,
11587                                    /*Last=*/OMPC_SCHEDULE_MODIFIER_last,
11588                                    Excluded)
11589         << getOpenMPClauseName(OMPC_schedule);
11590     return true;
11591   }
11592   return false;
11593 }
11594 
11595 OMPClause *Sema::ActOnOpenMPScheduleClause(
11596     OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
11597     OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
11598     SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
11599     SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
11600   if (checkScheduleModifiers(*this, M1, M2, M1Loc, M2Loc) ||
11601       checkScheduleModifiers(*this, M2, M1, M2Loc, M1Loc))
11602     return nullptr;
11603   // OpenMP, 2.7.1, Loop Construct, Restrictions
11604   // Either the monotonic modifier or the nonmonotonic modifier can be specified
11605   // but not both.
11606   if ((M1 == M2 && M1 != OMPC_SCHEDULE_MODIFIER_unknown) ||
11607       (M1 == OMPC_SCHEDULE_MODIFIER_monotonic &&
11608        M2 == OMPC_SCHEDULE_MODIFIER_nonmonotonic) ||
11609       (M1 == OMPC_SCHEDULE_MODIFIER_nonmonotonic &&
11610        M2 == OMPC_SCHEDULE_MODIFIER_monotonic)) {
11611     Diag(M2Loc, diag::err_omp_unexpected_schedule_modifier)
11612         << getOpenMPSimpleClauseTypeName(OMPC_schedule, M2)
11613         << getOpenMPSimpleClauseTypeName(OMPC_schedule, M1);
11614     return nullptr;
11615   }
11616   if (Kind == OMPC_SCHEDULE_unknown) {
11617     std::string Values;
11618     if (M1Loc.isInvalid() && M2Loc.isInvalid()) {
11619       unsigned Exclude[] = {OMPC_SCHEDULE_unknown};
11620       Values = getListOfPossibleValues(OMPC_schedule, /*First=*/0,
11621                                        /*Last=*/OMPC_SCHEDULE_MODIFIER_last,
11622                                        Exclude);
11623     } else {
11624       Values = getListOfPossibleValues(OMPC_schedule, /*First=*/0,
11625                                        /*Last=*/OMPC_SCHEDULE_unknown);
11626     }
11627     Diag(KindLoc, diag::err_omp_unexpected_clause_value)
11628         << Values << getOpenMPClauseName(OMPC_schedule);
11629     return nullptr;
11630   }
11631   // OpenMP, 2.7.1, Loop Construct, Restrictions
11632   // The nonmonotonic modifier can only be specified with schedule(dynamic) or
11633   // schedule(guided).
11634   if ((M1 == OMPC_SCHEDULE_MODIFIER_nonmonotonic ||
11635        M2 == OMPC_SCHEDULE_MODIFIER_nonmonotonic) &&
11636       Kind != OMPC_SCHEDULE_dynamic && Kind != OMPC_SCHEDULE_guided) {
11637     Diag(M1 == OMPC_SCHEDULE_MODIFIER_nonmonotonic ? M1Loc : M2Loc,
11638          diag::err_omp_schedule_nonmonotonic_static);
11639     return nullptr;
11640   }
11641   Expr *ValExpr = ChunkSize;
11642   Stmt *HelperValStmt = nullptr;
11643   if (ChunkSize) {
11644     if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() &&
11645         !ChunkSize->isInstantiationDependent() &&
11646         !ChunkSize->containsUnexpandedParameterPack()) {
11647       SourceLocation ChunkSizeLoc = ChunkSize->getBeginLoc();
11648       ExprResult Val =
11649           PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize);
11650       if (Val.isInvalid())
11651         return nullptr;
11652 
11653       ValExpr = Val.get();
11654 
11655       // OpenMP [2.7.1, Restrictions]
11656       //  chunk_size must be a loop invariant integer expression with a positive
11657       //  value.
11658       llvm::APSInt Result;
11659       if (ValExpr->isIntegerConstantExpr(Result, Context)) {
11660         if (Result.isSigned() && !Result.isStrictlyPositive()) {
11661           Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause)
11662               << "schedule" << 1 << ChunkSize->getSourceRange();
11663           return nullptr;
11664         }
11665       } else if (getOpenMPCaptureRegionForClause(
11666                      DSAStack->getCurrentDirective(), OMPC_schedule) !=
11667                      OMPD_unknown &&
11668                  !CurContext->isDependentContext()) {
11669         ValExpr = MakeFullExpr(ValExpr).get();
11670         llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
11671         ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
11672         HelperValStmt = buildPreInits(Context, Captures);
11673       }
11674     }
11675   }
11676 
11677   return new (Context)
11678       OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc, Kind,
11679                         ValExpr, HelperValStmt, M1, M1Loc, M2, M2Loc);
11680 }
11681 
11682 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind,
11683                                    SourceLocation StartLoc,
11684                                    SourceLocation EndLoc) {
11685   OMPClause *Res = nullptr;
11686   switch (Kind) {
11687   case OMPC_ordered:
11688     Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc);
11689     break;
11690   case OMPC_nowait:
11691     Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc);
11692     break;
11693   case OMPC_untied:
11694     Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc);
11695     break;
11696   case OMPC_mergeable:
11697     Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc);
11698     break;
11699   case OMPC_read:
11700     Res = ActOnOpenMPReadClause(StartLoc, EndLoc);
11701     break;
11702   case OMPC_write:
11703     Res = ActOnOpenMPWriteClause(StartLoc, EndLoc);
11704     break;
11705   case OMPC_update:
11706     Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc);
11707     break;
11708   case OMPC_capture:
11709     Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc);
11710     break;
11711   case OMPC_seq_cst:
11712     Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc);
11713     break;
11714   case OMPC_threads:
11715     Res = ActOnOpenMPThreadsClause(StartLoc, EndLoc);
11716     break;
11717   case OMPC_simd:
11718     Res = ActOnOpenMPSIMDClause(StartLoc, EndLoc);
11719     break;
11720   case OMPC_nogroup:
11721     Res = ActOnOpenMPNogroupClause(StartLoc, EndLoc);
11722     break;
11723   case OMPC_unified_address:
11724     Res = ActOnOpenMPUnifiedAddressClause(StartLoc, EndLoc);
11725     break;
11726   case OMPC_unified_shared_memory:
11727     Res = ActOnOpenMPUnifiedSharedMemoryClause(StartLoc, EndLoc);
11728     break;
11729   case OMPC_reverse_offload:
11730     Res = ActOnOpenMPReverseOffloadClause(StartLoc, EndLoc);
11731     break;
11732   case OMPC_dynamic_allocators:
11733     Res = ActOnOpenMPDynamicAllocatorsClause(StartLoc, EndLoc);
11734     break;
11735   case OMPC_if:
11736   case OMPC_final:
11737   case OMPC_num_threads:
11738   case OMPC_safelen:
11739   case OMPC_simdlen:
11740   case OMPC_allocator:
11741   case OMPC_collapse:
11742   case OMPC_schedule:
11743   case OMPC_private:
11744   case OMPC_firstprivate:
11745   case OMPC_lastprivate:
11746   case OMPC_shared:
11747   case OMPC_reduction:
11748   case OMPC_task_reduction:
11749   case OMPC_in_reduction:
11750   case OMPC_linear:
11751   case OMPC_aligned:
11752   case OMPC_copyin:
11753   case OMPC_copyprivate:
11754   case OMPC_default:
11755   case OMPC_proc_bind:
11756   case OMPC_threadprivate:
11757   case OMPC_allocate:
11758   case OMPC_flush:
11759   case OMPC_depend:
11760   case OMPC_device:
11761   case OMPC_map:
11762   case OMPC_num_teams:
11763   case OMPC_thread_limit:
11764   case OMPC_priority:
11765   case OMPC_grainsize:
11766   case OMPC_num_tasks:
11767   case OMPC_hint:
11768   case OMPC_dist_schedule:
11769   case OMPC_defaultmap:
11770   case OMPC_unknown:
11771   case OMPC_uniform:
11772   case OMPC_to:
11773   case OMPC_from:
11774   case OMPC_use_device_ptr:
11775   case OMPC_is_device_ptr:
11776   case OMPC_atomic_default_mem_order:
11777   case OMPC_device_type:
11778   case OMPC_match:
11779     llvm_unreachable("Clause is not allowed.");
11780   }
11781   return Res;
11782 }
11783 
11784 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc,
11785                                          SourceLocation EndLoc) {
11786   DSAStack->setNowaitRegion();
11787   return new (Context) OMPNowaitClause(StartLoc, EndLoc);
11788 }
11789 
11790 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc,
11791                                          SourceLocation EndLoc) {
11792   return new (Context) OMPUntiedClause(StartLoc, EndLoc);
11793 }
11794 
11795 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc,
11796                                             SourceLocation EndLoc) {
11797   return new (Context) OMPMergeableClause(StartLoc, EndLoc);
11798 }
11799 
11800 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc,
11801                                        SourceLocation EndLoc) {
11802   return new (Context) OMPReadClause(StartLoc, EndLoc);
11803 }
11804 
11805 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc,
11806                                         SourceLocation EndLoc) {
11807   return new (Context) OMPWriteClause(StartLoc, EndLoc);
11808 }
11809 
11810 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc,
11811                                          SourceLocation EndLoc) {
11812   return new (Context) OMPUpdateClause(StartLoc, EndLoc);
11813 }
11814 
11815 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc,
11816                                           SourceLocation EndLoc) {
11817   return new (Context) OMPCaptureClause(StartLoc, EndLoc);
11818 }
11819 
11820 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc,
11821                                          SourceLocation EndLoc) {
11822   return new (Context) OMPSeqCstClause(StartLoc, EndLoc);
11823 }
11824 
11825 OMPClause *Sema::ActOnOpenMPThreadsClause(SourceLocation StartLoc,
11826                                           SourceLocation EndLoc) {
11827   return new (Context) OMPThreadsClause(StartLoc, EndLoc);
11828 }
11829 
11830 OMPClause *Sema::ActOnOpenMPSIMDClause(SourceLocation StartLoc,
11831                                        SourceLocation EndLoc) {
11832   return new (Context) OMPSIMDClause(StartLoc, EndLoc);
11833 }
11834 
11835 OMPClause *Sema::ActOnOpenMPNogroupClause(SourceLocation StartLoc,
11836                                           SourceLocation EndLoc) {
11837   return new (Context) OMPNogroupClause(StartLoc, EndLoc);
11838 }
11839 
11840 OMPClause *Sema::ActOnOpenMPUnifiedAddressClause(SourceLocation StartLoc,
11841                                                  SourceLocation EndLoc) {
11842   return new (Context) OMPUnifiedAddressClause(StartLoc, EndLoc);
11843 }
11844 
11845 OMPClause *Sema::ActOnOpenMPUnifiedSharedMemoryClause(SourceLocation StartLoc,
11846                                                       SourceLocation EndLoc) {
11847   return new (Context) OMPUnifiedSharedMemoryClause(StartLoc, EndLoc);
11848 }
11849 
11850 OMPClause *Sema::ActOnOpenMPReverseOffloadClause(SourceLocation StartLoc,
11851                                                  SourceLocation EndLoc) {
11852   return new (Context) OMPReverseOffloadClause(StartLoc, EndLoc);
11853 }
11854 
11855 OMPClause *Sema::ActOnOpenMPDynamicAllocatorsClause(SourceLocation StartLoc,
11856                                                     SourceLocation EndLoc) {
11857   return new (Context) OMPDynamicAllocatorsClause(StartLoc, EndLoc);
11858 }
11859 
11860 OMPClause *Sema::ActOnOpenMPVarListClause(
11861     OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr,
11862     const OMPVarListLocTy &Locs, SourceLocation ColonLoc,
11863     CXXScopeSpec &ReductionOrMapperIdScopeSpec,
11864     DeclarationNameInfo &ReductionOrMapperId, OpenMPDependClauseKind DepKind,
11865     OpenMPLinearClauseKind LinKind,
11866     ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
11867     ArrayRef<SourceLocation> MapTypeModifiersLoc, OpenMPMapClauseKind MapType,
11868     bool IsMapTypeImplicit, SourceLocation DepLinMapLoc) {
11869   SourceLocation StartLoc = Locs.StartLoc;
11870   SourceLocation LParenLoc = Locs.LParenLoc;
11871   SourceLocation EndLoc = Locs.EndLoc;
11872   OMPClause *Res = nullptr;
11873   switch (Kind) {
11874   case OMPC_private:
11875     Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc);
11876     break;
11877   case OMPC_firstprivate:
11878     Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
11879     break;
11880   case OMPC_lastprivate:
11881     Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
11882     break;
11883   case OMPC_shared:
11884     Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc);
11885     break;
11886   case OMPC_reduction:
11887     Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
11888                                      EndLoc, ReductionOrMapperIdScopeSpec,
11889                                      ReductionOrMapperId);
11890     break;
11891   case OMPC_task_reduction:
11892     Res = ActOnOpenMPTaskReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
11893                                          EndLoc, ReductionOrMapperIdScopeSpec,
11894                                          ReductionOrMapperId);
11895     break;
11896   case OMPC_in_reduction:
11897     Res = ActOnOpenMPInReductionClause(VarList, StartLoc, LParenLoc, ColonLoc,
11898                                        EndLoc, ReductionOrMapperIdScopeSpec,
11899                                        ReductionOrMapperId);
11900     break;
11901   case OMPC_linear:
11902     Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc,
11903                                   LinKind, DepLinMapLoc, ColonLoc, EndLoc);
11904     break;
11905   case OMPC_aligned:
11906     Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc,
11907                                    ColonLoc, EndLoc);
11908     break;
11909   case OMPC_copyin:
11910     Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
11911     break;
11912   case OMPC_copyprivate:
11913     Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc);
11914     break;
11915   case OMPC_flush:
11916     Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc);
11917     break;
11918   case OMPC_depend:
11919     Res = ActOnOpenMPDependClause(DepKind, DepLinMapLoc, ColonLoc, VarList,
11920                                   StartLoc, LParenLoc, EndLoc);
11921     break;
11922   case OMPC_map:
11923     Res = ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
11924                                ReductionOrMapperIdScopeSpec,
11925                                ReductionOrMapperId, MapType, IsMapTypeImplicit,
11926                                DepLinMapLoc, ColonLoc, VarList, Locs);
11927     break;
11928   case OMPC_to:
11929     Res = ActOnOpenMPToClause(VarList, ReductionOrMapperIdScopeSpec,
11930                               ReductionOrMapperId, Locs);
11931     break;
11932   case OMPC_from:
11933     Res = ActOnOpenMPFromClause(VarList, ReductionOrMapperIdScopeSpec,
11934                                 ReductionOrMapperId, Locs);
11935     break;
11936   case OMPC_use_device_ptr:
11937     Res = ActOnOpenMPUseDevicePtrClause(VarList, Locs);
11938     break;
11939   case OMPC_is_device_ptr:
11940     Res = ActOnOpenMPIsDevicePtrClause(VarList, Locs);
11941     break;
11942   case OMPC_allocate:
11943     Res = ActOnOpenMPAllocateClause(TailExpr, VarList, StartLoc, LParenLoc,
11944                                     ColonLoc, EndLoc);
11945     break;
11946   case OMPC_if:
11947   case OMPC_final:
11948   case OMPC_num_threads:
11949   case OMPC_safelen:
11950   case OMPC_simdlen:
11951   case OMPC_allocator:
11952   case OMPC_collapse:
11953   case OMPC_default:
11954   case OMPC_proc_bind:
11955   case OMPC_schedule:
11956   case OMPC_ordered:
11957   case OMPC_nowait:
11958   case OMPC_untied:
11959   case OMPC_mergeable:
11960   case OMPC_threadprivate:
11961   case OMPC_read:
11962   case OMPC_write:
11963   case OMPC_update:
11964   case OMPC_capture:
11965   case OMPC_seq_cst:
11966   case OMPC_device:
11967   case OMPC_threads:
11968   case OMPC_simd:
11969   case OMPC_num_teams:
11970   case OMPC_thread_limit:
11971   case OMPC_priority:
11972   case OMPC_grainsize:
11973   case OMPC_nogroup:
11974   case OMPC_num_tasks:
11975   case OMPC_hint:
11976   case OMPC_dist_schedule:
11977   case OMPC_defaultmap:
11978   case OMPC_unknown:
11979   case OMPC_uniform:
11980   case OMPC_unified_address:
11981   case OMPC_unified_shared_memory:
11982   case OMPC_reverse_offload:
11983   case OMPC_dynamic_allocators:
11984   case OMPC_atomic_default_mem_order:
11985   case OMPC_device_type:
11986   case OMPC_match:
11987     llvm_unreachable("Clause is not allowed.");
11988   }
11989   return Res;
11990 }
11991 
11992 ExprResult Sema::getOpenMPCapturedExpr(VarDecl *Capture, ExprValueKind VK,
11993                                        ExprObjectKind OK, SourceLocation Loc) {
11994   ExprResult Res = BuildDeclRefExpr(
11995       Capture, Capture->getType().getNonReferenceType(), VK_LValue, Loc);
11996   if (!Res.isUsable())
11997     return ExprError();
11998   if (OK == OK_Ordinary && !getLangOpts().CPlusPlus) {
11999     Res = CreateBuiltinUnaryOp(Loc, UO_Deref, Res.get());
12000     if (!Res.isUsable())
12001       return ExprError();
12002   }
12003   if (VK != VK_LValue && Res.get()->isGLValue()) {
12004     Res = DefaultLvalueConversion(Res.get());
12005     if (!Res.isUsable())
12006       return ExprError();
12007   }
12008   return Res;
12009 }
12010 
12011 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
12012                                           SourceLocation StartLoc,
12013                                           SourceLocation LParenLoc,
12014                                           SourceLocation EndLoc) {
12015   SmallVector<Expr *, 8> Vars;
12016   SmallVector<Expr *, 8> PrivateCopies;
12017   for (Expr *RefExpr : VarList) {
12018     assert(RefExpr && "NULL expr in OpenMP private clause.");
12019     SourceLocation ELoc;
12020     SourceRange ERange;
12021     Expr *SimpleRefExpr = RefExpr;
12022     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
12023     if (Res.second) {
12024       // It will be analyzed later.
12025       Vars.push_back(RefExpr);
12026       PrivateCopies.push_back(nullptr);
12027     }
12028     ValueDecl *D = Res.first;
12029     if (!D)
12030       continue;
12031 
12032     QualType Type = D->getType();
12033     auto *VD = dyn_cast<VarDecl>(D);
12034 
12035     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
12036     //  A variable that appears in a private clause must not have an incomplete
12037     //  type or a reference type.
12038     if (RequireCompleteType(ELoc, Type, diag::err_omp_private_incomplete_type))
12039       continue;
12040     Type = Type.getNonReferenceType();
12041 
12042     // OpenMP 5.0 [2.19.3, List Item Privatization, Restrictions]
12043     // A variable that is privatized must not have a const-qualified type
12044     // unless it is of class type with a mutable member. This restriction does
12045     // not apply to the firstprivate clause.
12046     //
12047     // OpenMP 3.1 [2.9.3.3, private clause, Restrictions]
12048     // A variable that appears in a private clause must not have a
12049     // const-qualified type unless it is of class type with a mutable member.
12050     if (rejectConstNotMutableType(*this, D, Type, OMPC_private, ELoc))
12051       continue;
12052 
12053     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
12054     // in a Construct]
12055     //  Variables with the predetermined data-sharing attributes may not be
12056     //  listed in data-sharing attributes clauses, except for the cases
12057     //  listed below. For these exceptions only, listing a predetermined
12058     //  variable in a data-sharing attribute clause is allowed and overrides
12059     //  the variable's predetermined data-sharing attributes.
12060     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(D, /*FromParent=*/false);
12061     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) {
12062       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
12063                                           << getOpenMPClauseName(OMPC_private);
12064       reportOriginalDsa(*this, DSAStack, D, DVar);
12065       continue;
12066     }
12067 
12068     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
12069     // Variably modified types are not supported for tasks.
12070     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() &&
12071         isOpenMPTaskingDirective(CurrDir)) {
12072       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
12073           << getOpenMPClauseName(OMPC_private) << Type
12074           << getOpenMPDirectiveName(CurrDir);
12075       bool IsDecl =
12076           !VD ||
12077           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
12078       Diag(D->getLocation(),
12079            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
12080           << D;
12081       continue;
12082     }
12083 
12084     // OpenMP 4.5 [2.15.5.1, Restrictions, p.3]
12085     // A list item cannot appear in both a map clause and a data-sharing
12086     // attribute clause on the same construct
12087     //
12088     // OpenMP 5.0 [2.19.7.1, Restrictions, p.7]
12089     // A list item cannot appear in both a map clause and a data-sharing
12090     // attribute clause on the same construct unless the construct is a
12091     // combined construct.
12092     if ((LangOpts.OpenMP <= 45 && isOpenMPTargetExecutionDirective(CurrDir)) ||
12093         CurrDir == OMPD_target) {
12094       OpenMPClauseKind ConflictKind;
12095       if (DSAStack->checkMappableExprComponentListsForDecl(
12096               VD, /*CurrentRegionOnly=*/true,
12097               [&](OMPClauseMappableExprCommon::MappableExprComponentListRef,
12098                   OpenMPClauseKind WhereFoundClauseKind) -> bool {
12099                 ConflictKind = WhereFoundClauseKind;
12100                 return true;
12101               })) {
12102         Diag(ELoc, diag::err_omp_variable_in_given_clause_and_dsa)
12103             << getOpenMPClauseName(OMPC_private)
12104             << getOpenMPClauseName(ConflictKind)
12105             << getOpenMPDirectiveName(CurrDir);
12106         reportOriginalDsa(*this, DSAStack, D, DVar);
12107         continue;
12108       }
12109     }
12110 
12111     // OpenMP [2.9.3.3, Restrictions, C/C++, p.1]
12112     //  A variable of class type (or array thereof) that appears in a private
12113     //  clause requires an accessible, unambiguous default constructor for the
12114     //  class type.
12115     // Generate helper private variable and initialize it with the default
12116     // value. The address of the original variable is replaced by the address of
12117     // the new private variable in CodeGen. This new variable is not added to
12118     // IdResolver, so the code in the OpenMP region uses original variable for
12119     // proper diagnostics.
12120     Type = Type.getUnqualifiedType();
12121     VarDecl *VDPrivate =
12122         buildVarDecl(*this, ELoc, Type, D->getName(),
12123                      D->hasAttrs() ? &D->getAttrs() : nullptr,
12124                      VD ? cast<DeclRefExpr>(SimpleRefExpr) : nullptr);
12125     ActOnUninitializedDecl(VDPrivate);
12126     if (VDPrivate->isInvalidDecl())
12127       continue;
12128     DeclRefExpr *VDPrivateRefExpr = buildDeclRefExpr(
12129         *this, VDPrivate, RefExpr->getType().getUnqualifiedType(), ELoc);
12130 
12131     DeclRefExpr *Ref = nullptr;
12132     if (!VD && !CurContext->isDependentContext())
12133       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/false);
12134     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_private, Ref);
12135     Vars.push_back((VD || CurContext->isDependentContext())
12136                        ? RefExpr->IgnoreParens()
12137                        : Ref);
12138     PrivateCopies.push_back(VDPrivateRefExpr);
12139   }
12140 
12141   if (Vars.empty())
12142     return nullptr;
12143 
12144   return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars,
12145                                   PrivateCopies);
12146 }
12147 
12148 namespace {
12149 class DiagsUninitializedSeveretyRAII {
12150 private:
12151   DiagnosticsEngine &Diags;
12152   SourceLocation SavedLoc;
12153   bool IsIgnored = false;
12154 
12155 public:
12156   DiagsUninitializedSeveretyRAII(DiagnosticsEngine &Diags, SourceLocation Loc,
12157                                  bool IsIgnored)
12158       : Diags(Diags), SavedLoc(Loc), IsIgnored(IsIgnored) {
12159     if (!IsIgnored) {
12160       Diags.setSeverity(/*Diag*/ diag::warn_uninit_self_reference_in_init,
12161                         /*Map*/ diag::Severity::Ignored, Loc);
12162     }
12163   }
12164   ~DiagsUninitializedSeveretyRAII() {
12165     if (!IsIgnored)
12166       Diags.popMappings(SavedLoc);
12167   }
12168 };
12169 }
12170 
12171 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList,
12172                                                SourceLocation StartLoc,
12173                                                SourceLocation LParenLoc,
12174                                                SourceLocation EndLoc) {
12175   SmallVector<Expr *, 8> Vars;
12176   SmallVector<Expr *, 8> PrivateCopies;
12177   SmallVector<Expr *, 8> Inits;
12178   SmallVector<Decl *, 4> ExprCaptures;
12179   bool IsImplicitClause =
12180       StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid();
12181   SourceLocation ImplicitClauseLoc = DSAStack->getConstructLoc();
12182 
12183   for (Expr *RefExpr : VarList) {
12184     assert(RefExpr && "NULL expr in OpenMP firstprivate clause.");
12185     SourceLocation ELoc;
12186     SourceRange ERange;
12187     Expr *SimpleRefExpr = RefExpr;
12188     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
12189     if (Res.second) {
12190       // It will be analyzed later.
12191       Vars.push_back(RefExpr);
12192       PrivateCopies.push_back(nullptr);
12193       Inits.push_back(nullptr);
12194     }
12195     ValueDecl *D = Res.first;
12196     if (!D)
12197       continue;
12198 
12199     ELoc = IsImplicitClause ? ImplicitClauseLoc : ELoc;
12200     QualType Type = D->getType();
12201     auto *VD = dyn_cast<VarDecl>(D);
12202 
12203     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
12204     //  A variable that appears in a private clause must not have an incomplete
12205     //  type or a reference type.
12206     if (RequireCompleteType(ELoc, Type,
12207                             diag::err_omp_firstprivate_incomplete_type))
12208       continue;
12209     Type = Type.getNonReferenceType();
12210 
12211     // OpenMP [2.9.3.4, Restrictions, C/C++, p.1]
12212     //  A variable of class type (or array thereof) that appears in a private
12213     //  clause requires an accessible, unambiguous copy constructor for the
12214     //  class type.
12215     QualType ElemType = Context.getBaseElementType(Type).getNonReferenceType();
12216 
12217     // If an implicit firstprivate variable found it was checked already.
12218     DSAStackTy::DSAVarData TopDVar;
12219     if (!IsImplicitClause) {
12220       DSAStackTy::DSAVarData DVar =
12221           DSAStack->getTopDSA(D, /*FromParent=*/false);
12222       TopDVar = DVar;
12223       OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
12224       bool IsConstant = ElemType.isConstant(Context);
12225       // OpenMP [2.4.13, Data-sharing Attribute Clauses]
12226       //  A list item that specifies a given variable may not appear in more
12227       // than one clause on the same directive, except that a variable may be
12228       //  specified in both firstprivate and lastprivate clauses.
12229       // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
12230       // A list item may appear in a firstprivate or lastprivate clause but not
12231       // both.
12232       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate &&
12233           (isOpenMPDistributeDirective(CurrDir) ||
12234            DVar.CKind != OMPC_lastprivate) &&
12235           DVar.RefExpr) {
12236         Diag(ELoc, diag::err_omp_wrong_dsa)
12237             << getOpenMPClauseName(DVar.CKind)
12238             << getOpenMPClauseName(OMPC_firstprivate);
12239         reportOriginalDsa(*this, DSAStack, D, DVar);
12240         continue;
12241       }
12242 
12243       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
12244       // in a Construct]
12245       //  Variables with the predetermined data-sharing attributes may not be
12246       //  listed in data-sharing attributes clauses, except for the cases
12247       //  listed below. For these exceptions only, listing a predetermined
12248       //  variable in a data-sharing attribute clause is allowed and overrides
12249       //  the variable's predetermined data-sharing attributes.
12250       // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
12251       // in a Construct, C/C++, p.2]
12252       //  Variables with const-qualified type having no mutable member may be
12253       //  listed in a firstprivate clause, even if they are static data members.
12254       if (!(IsConstant || (VD && VD->isStaticDataMember())) && !DVar.RefExpr &&
12255           DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) {
12256         Diag(ELoc, diag::err_omp_wrong_dsa)
12257             << getOpenMPClauseName(DVar.CKind)
12258             << getOpenMPClauseName(OMPC_firstprivate);
12259         reportOriginalDsa(*this, DSAStack, D, DVar);
12260         continue;
12261       }
12262 
12263       // OpenMP [2.9.3.4, Restrictions, p.2]
12264       //  A list item that is private within a parallel region must not appear
12265       //  in a firstprivate clause on a worksharing construct if any of the
12266       //  worksharing regions arising from the worksharing construct ever bind
12267       //  to any of the parallel regions arising from the parallel construct.
12268       // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
12269       // A list item that is private within a teams region must not appear in a
12270       // firstprivate clause on a distribute construct if any of the distribute
12271       // regions arising from the distribute construct ever bind to any of the
12272       // teams regions arising from the teams construct.
12273       // OpenMP 4.5 [2.15.3.4, Restrictions, p.3]
12274       // A list item that appears in a reduction clause of a teams construct
12275       // must not appear in a firstprivate clause on a distribute construct if
12276       // any of the distribute regions arising from the distribute construct
12277       // ever bind to any of the teams regions arising from the teams construct.
12278       if ((isOpenMPWorksharingDirective(CurrDir) ||
12279            isOpenMPDistributeDirective(CurrDir)) &&
12280           !isOpenMPParallelDirective(CurrDir) &&
12281           !isOpenMPTeamsDirective(CurrDir)) {
12282         DVar = DSAStack->getImplicitDSA(D, true);
12283         if (DVar.CKind != OMPC_shared &&
12284             (isOpenMPParallelDirective(DVar.DKind) ||
12285              isOpenMPTeamsDirective(DVar.DKind) ||
12286              DVar.DKind == OMPD_unknown)) {
12287           Diag(ELoc, diag::err_omp_required_access)
12288               << getOpenMPClauseName(OMPC_firstprivate)
12289               << getOpenMPClauseName(OMPC_shared);
12290           reportOriginalDsa(*this, DSAStack, D, DVar);
12291           continue;
12292         }
12293       }
12294       // OpenMP [2.9.3.4, Restrictions, p.3]
12295       //  A list item that appears in a reduction clause of a parallel construct
12296       //  must not appear in a firstprivate clause on a worksharing or task
12297       //  construct if any of the worksharing or task regions arising from the
12298       //  worksharing or task construct ever bind to any of the parallel regions
12299       //  arising from the parallel construct.
12300       // OpenMP [2.9.3.4, Restrictions, p.4]
12301       //  A list item that appears in a reduction clause in worksharing
12302       //  construct must not appear in a firstprivate clause in a task construct
12303       //  encountered during execution of any of the worksharing regions arising
12304       //  from the worksharing construct.
12305       if (isOpenMPTaskingDirective(CurrDir)) {
12306         DVar = DSAStack->hasInnermostDSA(
12307             D, [](OpenMPClauseKind C) { return C == OMPC_reduction; },
12308             [](OpenMPDirectiveKind K) {
12309               return isOpenMPParallelDirective(K) ||
12310                      isOpenMPWorksharingDirective(K) ||
12311                      isOpenMPTeamsDirective(K);
12312             },
12313             /*FromParent=*/true);
12314         if (DVar.CKind == OMPC_reduction &&
12315             (isOpenMPParallelDirective(DVar.DKind) ||
12316              isOpenMPWorksharingDirective(DVar.DKind) ||
12317              isOpenMPTeamsDirective(DVar.DKind))) {
12318           Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate)
12319               << getOpenMPDirectiveName(DVar.DKind);
12320           reportOriginalDsa(*this, DSAStack, D, DVar);
12321           continue;
12322         }
12323       }
12324 
12325       // OpenMP 4.5 [2.15.5.1, Restrictions, p.3]
12326       // A list item cannot appear in both a map clause and a data-sharing
12327       // attribute clause on the same construct
12328       //
12329       // OpenMP 5.0 [2.19.7.1, Restrictions, p.7]
12330       // A list item cannot appear in both a map clause and a data-sharing
12331       // attribute clause on the same construct unless the construct is a
12332       // combined construct.
12333       if ((LangOpts.OpenMP <= 45 &&
12334            isOpenMPTargetExecutionDirective(CurrDir)) ||
12335           CurrDir == OMPD_target) {
12336         OpenMPClauseKind ConflictKind;
12337         if (DSAStack->checkMappableExprComponentListsForDecl(
12338                 VD, /*CurrentRegionOnly=*/true,
12339                 [&ConflictKind](
12340                     OMPClauseMappableExprCommon::MappableExprComponentListRef,
12341                     OpenMPClauseKind WhereFoundClauseKind) {
12342                   ConflictKind = WhereFoundClauseKind;
12343                   return true;
12344                 })) {
12345           Diag(ELoc, diag::err_omp_variable_in_given_clause_and_dsa)
12346               << getOpenMPClauseName(OMPC_firstprivate)
12347               << getOpenMPClauseName(ConflictKind)
12348               << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
12349           reportOriginalDsa(*this, DSAStack, D, DVar);
12350           continue;
12351         }
12352       }
12353     }
12354 
12355     // Variably modified types are not supported for tasks.
12356     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() &&
12357         isOpenMPTaskingDirective(DSAStack->getCurrentDirective())) {
12358       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
12359           << getOpenMPClauseName(OMPC_firstprivate) << Type
12360           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
12361       bool IsDecl =
12362           !VD ||
12363           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
12364       Diag(D->getLocation(),
12365            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
12366           << D;
12367       continue;
12368     }
12369 
12370     Type = Type.getUnqualifiedType();
12371     VarDecl *VDPrivate =
12372         buildVarDecl(*this, ELoc, Type, D->getName(),
12373                      D->hasAttrs() ? &D->getAttrs() : nullptr,
12374                      VD ? cast<DeclRefExpr>(SimpleRefExpr) : nullptr);
12375     // Generate helper private variable and initialize it with the value of the
12376     // original variable. The address of the original variable is replaced by
12377     // the address of the new private variable in the CodeGen. This new variable
12378     // is not added to IdResolver, so the code in the OpenMP region uses
12379     // original variable for proper diagnostics and variable capturing.
12380     Expr *VDInitRefExpr = nullptr;
12381     // For arrays generate initializer for single element and replace it by the
12382     // original array element in CodeGen.
12383     if (Type->isArrayType()) {
12384       VarDecl *VDInit =
12385           buildVarDecl(*this, RefExpr->getExprLoc(), ElemType, D->getName());
12386       VDInitRefExpr = buildDeclRefExpr(*this, VDInit, ElemType, ELoc);
12387       Expr *Init = DefaultLvalueConversion(VDInitRefExpr).get();
12388       ElemType = ElemType.getUnqualifiedType();
12389       VarDecl *VDInitTemp = buildVarDecl(*this, RefExpr->getExprLoc(), ElemType,
12390                                          ".firstprivate.temp");
12391       InitializedEntity Entity =
12392           InitializedEntity::InitializeVariable(VDInitTemp);
12393       InitializationKind Kind = InitializationKind::CreateCopy(ELoc, ELoc);
12394 
12395       InitializationSequence InitSeq(*this, Entity, Kind, Init);
12396       ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Init);
12397       if (Result.isInvalid())
12398         VDPrivate->setInvalidDecl();
12399       else
12400         VDPrivate->setInit(Result.getAs<Expr>());
12401       // Remove temp variable declaration.
12402       Context.Deallocate(VDInitTemp);
12403     } else {
12404       VarDecl *VDInit = buildVarDecl(*this, RefExpr->getExprLoc(), Type,
12405                                      ".firstprivate.temp");
12406       VDInitRefExpr = buildDeclRefExpr(*this, VDInit, RefExpr->getType(),
12407                                        RefExpr->getExprLoc());
12408       AddInitializerToDecl(VDPrivate,
12409                            DefaultLvalueConversion(VDInitRefExpr).get(),
12410                            /*DirectInit=*/false);
12411     }
12412     if (VDPrivate->isInvalidDecl()) {
12413       if (IsImplicitClause) {
12414         Diag(RefExpr->getExprLoc(),
12415              diag::note_omp_task_predetermined_firstprivate_here);
12416       }
12417       continue;
12418     }
12419     CurContext->addDecl(VDPrivate);
12420     DeclRefExpr *VDPrivateRefExpr = buildDeclRefExpr(
12421         *this, VDPrivate, RefExpr->getType().getUnqualifiedType(),
12422         RefExpr->getExprLoc());
12423     DeclRefExpr *Ref = nullptr;
12424     if (!VD && !CurContext->isDependentContext()) {
12425       if (TopDVar.CKind == OMPC_lastprivate) {
12426         Ref = TopDVar.PrivateCopy;
12427       } else {
12428         Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/true);
12429         if (!isOpenMPCapturedDecl(D))
12430           ExprCaptures.push_back(Ref->getDecl());
12431       }
12432     }
12433     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_firstprivate, Ref);
12434     Vars.push_back((VD || CurContext->isDependentContext())
12435                        ? RefExpr->IgnoreParens()
12436                        : Ref);
12437     PrivateCopies.push_back(VDPrivateRefExpr);
12438     Inits.push_back(VDInitRefExpr);
12439   }
12440 
12441   if (Vars.empty())
12442     return nullptr;
12443 
12444   return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
12445                                        Vars, PrivateCopies, Inits,
12446                                        buildPreInits(Context, ExprCaptures));
12447 }
12448 
12449 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList,
12450                                               SourceLocation StartLoc,
12451                                               SourceLocation LParenLoc,
12452                                               SourceLocation EndLoc) {
12453   SmallVector<Expr *, 8> Vars;
12454   SmallVector<Expr *, 8> SrcExprs;
12455   SmallVector<Expr *, 8> DstExprs;
12456   SmallVector<Expr *, 8> AssignmentOps;
12457   SmallVector<Decl *, 4> ExprCaptures;
12458   SmallVector<Expr *, 4> ExprPostUpdates;
12459   for (Expr *RefExpr : VarList) {
12460     assert(RefExpr && "NULL expr in OpenMP lastprivate clause.");
12461     SourceLocation ELoc;
12462     SourceRange ERange;
12463     Expr *SimpleRefExpr = RefExpr;
12464     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
12465     if (Res.second) {
12466       // It will be analyzed later.
12467       Vars.push_back(RefExpr);
12468       SrcExprs.push_back(nullptr);
12469       DstExprs.push_back(nullptr);
12470       AssignmentOps.push_back(nullptr);
12471     }
12472     ValueDecl *D = Res.first;
12473     if (!D)
12474       continue;
12475 
12476     QualType Type = D->getType();
12477     auto *VD = dyn_cast<VarDecl>(D);
12478 
12479     // OpenMP [2.14.3.5, Restrictions, C/C++, p.2]
12480     //  A variable that appears in a lastprivate clause must not have an
12481     //  incomplete type or a reference type.
12482     if (RequireCompleteType(ELoc, Type,
12483                             diag::err_omp_lastprivate_incomplete_type))
12484       continue;
12485     Type = Type.getNonReferenceType();
12486 
12487     // OpenMP 5.0 [2.19.3, List Item Privatization, Restrictions]
12488     // A variable that is privatized must not have a const-qualified type
12489     // unless it is of class type with a mutable member. This restriction does
12490     // not apply to the firstprivate clause.
12491     //
12492     // OpenMP 3.1 [2.9.3.5, lastprivate clause, Restrictions]
12493     // A variable that appears in a lastprivate clause must not have a
12494     // const-qualified type unless it is of class type with a mutable member.
12495     if (rejectConstNotMutableType(*this, D, Type, OMPC_lastprivate, ELoc))
12496       continue;
12497 
12498     OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective();
12499     // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
12500     // in a Construct]
12501     //  Variables with the predetermined data-sharing attributes may not be
12502     //  listed in data-sharing attributes clauses, except for the cases
12503     //  listed below.
12504     // OpenMP 4.5 [2.10.8, Distribute Construct, p.3]
12505     // A list item may appear in a firstprivate or lastprivate clause but not
12506     // both.
12507     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(D, /*FromParent=*/false);
12508     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate &&
12509         (isOpenMPDistributeDirective(CurrDir) ||
12510          DVar.CKind != OMPC_firstprivate) &&
12511         (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) {
12512       Diag(ELoc, diag::err_omp_wrong_dsa)
12513           << getOpenMPClauseName(DVar.CKind)
12514           << getOpenMPClauseName(OMPC_lastprivate);
12515       reportOriginalDsa(*this, DSAStack, D, DVar);
12516       continue;
12517     }
12518 
12519     // OpenMP [2.14.3.5, Restrictions, p.2]
12520     // A list item that is private within a parallel region, or that appears in
12521     // the reduction clause of a parallel construct, must not appear in a
12522     // lastprivate clause on a worksharing construct if any of the corresponding
12523     // worksharing regions ever binds to any of the corresponding parallel
12524     // regions.
12525     DSAStackTy::DSAVarData TopDVar = DVar;
12526     if (isOpenMPWorksharingDirective(CurrDir) &&
12527         !isOpenMPParallelDirective(CurrDir) &&
12528         !isOpenMPTeamsDirective(CurrDir)) {
12529       DVar = DSAStack->getImplicitDSA(D, true);
12530       if (DVar.CKind != OMPC_shared) {
12531         Diag(ELoc, diag::err_omp_required_access)
12532             << getOpenMPClauseName(OMPC_lastprivate)
12533             << getOpenMPClauseName(OMPC_shared);
12534         reportOriginalDsa(*this, DSAStack, D, DVar);
12535         continue;
12536       }
12537     }
12538 
12539     // OpenMP [2.14.3.5, Restrictions, C++, p.1,2]
12540     //  A variable of class type (or array thereof) that appears in a
12541     //  lastprivate clause requires an accessible, unambiguous default
12542     //  constructor for the class type, unless the list item is also specified
12543     //  in a firstprivate clause.
12544     //  A variable of class type (or array thereof) that appears in a
12545     //  lastprivate clause requires an accessible, unambiguous copy assignment
12546     //  operator for the class type.
12547     Type = Context.getBaseElementType(Type).getNonReferenceType();
12548     VarDecl *SrcVD = buildVarDecl(*this, ERange.getBegin(),
12549                                   Type.getUnqualifiedType(), ".lastprivate.src",
12550                                   D->hasAttrs() ? &D->getAttrs() : nullptr);
12551     DeclRefExpr *PseudoSrcExpr =
12552         buildDeclRefExpr(*this, SrcVD, Type.getUnqualifiedType(), ELoc);
12553     VarDecl *DstVD =
12554         buildVarDecl(*this, ERange.getBegin(), Type, ".lastprivate.dst",
12555                      D->hasAttrs() ? &D->getAttrs() : nullptr);
12556     DeclRefExpr *PseudoDstExpr = buildDeclRefExpr(*this, DstVD, Type, ELoc);
12557     // For arrays generate assignment operation for single element and replace
12558     // it by the original array element in CodeGen.
12559     ExprResult AssignmentOp = BuildBinOp(/*S=*/nullptr, ELoc, BO_Assign,
12560                                          PseudoDstExpr, PseudoSrcExpr);
12561     if (AssignmentOp.isInvalid())
12562       continue;
12563     AssignmentOp =
12564         ActOnFinishFullExpr(AssignmentOp.get(), ELoc, /*DiscardedValue*/ false);
12565     if (AssignmentOp.isInvalid())
12566       continue;
12567 
12568     DeclRefExpr *Ref = nullptr;
12569     if (!VD && !CurContext->isDependentContext()) {
12570       if (TopDVar.CKind == OMPC_firstprivate) {
12571         Ref = TopDVar.PrivateCopy;
12572       } else {
12573         Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/false);
12574         if (!isOpenMPCapturedDecl(D))
12575           ExprCaptures.push_back(Ref->getDecl());
12576       }
12577       if (TopDVar.CKind == OMPC_firstprivate ||
12578           (!isOpenMPCapturedDecl(D) &&
12579            Ref->getDecl()->hasAttr<OMPCaptureNoInitAttr>())) {
12580         ExprResult RefRes = DefaultLvalueConversion(Ref);
12581         if (!RefRes.isUsable())
12582           continue;
12583         ExprResult PostUpdateRes =
12584             BuildBinOp(DSAStack->getCurScope(), ELoc, BO_Assign, SimpleRefExpr,
12585                        RefRes.get());
12586         if (!PostUpdateRes.isUsable())
12587           continue;
12588         ExprPostUpdates.push_back(
12589             IgnoredValueConversions(PostUpdateRes.get()).get());
12590       }
12591     }
12592     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_lastprivate, Ref);
12593     Vars.push_back((VD || CurContext->isDependentContext())
12594                        ? RefExpr->IgnoreParens()
12595                        : Ref);
12596     SrcExprs.push_back(PseudoSrcExpr);
12597     DstExprs.push_back(PseudoDstExpr);
12598     AssignmentOps.push_back(AssignmentOp.get());
12599   }
12600 
12601   if (Vars.empty())
12602     return nullptr;
12603 
12604   return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
12605                                       Vars, SrcExprs, DstExprs, AssignmentOps,
12606                                       buildPreInits(Context, ExprCaptures),
12607                                       buildPostUpdate(*this, ExprPostUpdates));
12608 }
12609 
12610 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList,
12611                                          SourceLocation StartLoc,
12612                                          SourceLocation LParenLoc,
12613                                          SourceLocation EndLoc) {
12614   SmallVector<Expr *, 8> Vars;
12615   for (Expr *RefExpr : VarList) {
12616     assert(RefExpr && "NULL expr in OpenMP lastprivate clause.");
12617     SourceLocation ELoc;
12618     SourceRange ERange;
12619     Expr *SimpleRefExpr = RefExpr;
12620     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
12621     if (Res.second) {
12622       // It will be analyzed later.
12623       Vars.push_back(RefExpr);
12624     }
12625     ValueDecl *D = Res.first;
12626     if (!D)
12627       continue;
12628 
12629     auto *VD = dyn_cast<VarDecl>(D);
12630     // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
12631     // in a Construct]
12632     //  Variables with the predetermined data-sharing attributes may not be
12633     //  listed in data-sharing attributes clauses, except for the cases
12634     //  listed below. For these exceptions only, listing a predetermined
12635     //  variable in a data-sharing attribute clause is allowed and overrides
12636     //  the variable's predetermined data-sharing attributes.
12637     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(D, /*FromParent=*/false);
12638     if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared &&
12639         DVar.RefExpr) {
12640       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
12641                                           << getOpenMPClauseName(OMPC_shared);
12642       reportOriginalDsa(*this, DSAStack, D, DVar);
12643       continue;
12644     }
12645 
12646     DeclRefExpr *Ref = nullptr;
12647     if (!VD && isOpenMPCapturedDecl(D) && !CurContext->isDependentContext())
12648       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/true);
12649     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_shared, Ref);
12650     Vars.push_back((VD || !Ref || CurContext->isDependentContext())
12651                        ? RefExpr->IgnoreParens()
12652                        : Ref);
12653   }
12654 
12655   if (Vars.empty())
12656     return nullptr;
12657 
12658   return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
12659 }
12660 
12661 namespace {
12662 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> {
12663   DSAStackTy *Stack;
12664 
12665 public:
12666   bool VisitDeclRefExpr(DeclRefExpr *E) {
12667     if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) {
12668       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, /*FromParent=*/false);
12669       if (DVar.CKind == OMPC_shared && !DVar.RefExpr)
12670         return false;
12671       if (DVar.CKind != OMPC_unknown)
12672         return true;
12673       DSAStackTy::DSAVarData DVarPrivate = Stack->hasDSA(
12674           VD, isOpenMPPrivate, [](OpenMPDirectiveKind) { return true; },
12675           /*FromParent=*/true);
12676       return DVarPrivate.CKind != OMPC_unknown;
12677     }
12678     return false;
12679   }
12680   bool VisitStmt(Stmt *S) {
12681     for (Stmt *Child : S->children()) {
12682       if (Child && Visit(Child))
12683         return true;
12684     }
12685     return false;
12686   }
12687   explicit DSARefChecker(DSAStackTy *S) : Stack(S) {}
12688 };
12689 } // namespace
12690 
12691 namespace {
12692 // Transform MemberExpression for specified FieldDecl of current class to
12693 // DeclRefExpr to specified OMPCapturedExprDecl.
12694 class TransformExprToCaptures : public TreeTransform<TransformExprToCaptures> {
12695   typedef TreeTransform<TransformExprToCaptures> BaseTransform;
12696   ValueDecl *Field = nullptr;
12697   DeclRefExpr *CapturedExpr = nullptr;
12698 
12699 public:
12700   TransformExprToCaptures(Sema &SemaRef, ValueDecl *FieldDecl)
12701       : BaseTransform(SemaRef), Field(FieldDecl), CapturedExpr(nullptr) {}
12702 
12703   ExprResult TransformMemberExpr(MemberExpr *E) {
12704     if (isa<CXXThisExpr>(E->getBase()->IgnoreParenImpCasts()) &&
12705         E->getMemberDecl() == Field) {
12706       CapturedExpr = buildCapture(SemaRef, Field, E, /*WithInit=*/false);
12707       return CapturedExpr;
12708     }
12709     return BaseTransform::TransformMemberExpr(E);
12710   }
12711   DeclRefExpr *getCapturedExpr() { return CapturedExpr; }
12712 };
12713 } // namespace
12714 
12715 template <typename T, typename U>
12716 static T filterLookupForUDReductionAndMapper(
12717     SmallVectorImpl<U> &Lookups, const llvm::function_ref<T(ValueDecl *)> Gen) {
12718   for (U &Set : Lookups) {
12719     for (auto *D : Set) {
12720       if (T Res = Gen(cast<ValueDecl>(D)))
12721         return Res;
12722     }
12723   }
12724   return T();
12725 }
12726 
12727 static NamedDecl *findAcceptableDecl(Sema &SemaRef, NamedDecl *D) {
12728   assert(!LookupResult::isVisible(SemaRef, D) && "not in slow case");
12729 
12730   for (auto RD : D->redecls()) {
12731     // Don't bother with extra checks if we already know this one isn't visible.
12732     if (RD == D)
12733       continue;
12734 
12735     auto ND = cast<NamedDecl>(RD);
12736     if (LookupResult::isVisible(SemaRef, ND))
12737       return ND;
12738   }
12739 
12740   return nullptr;
12741 }
12742 
12743 static void
12744 argumentDependentLookup(Sema &SemaRef, const DeclarationNameInfo &Id,
12745                         SourceLocation Loc, QualType Ty,
12746                         SmallVectorImpl<UnresolvedSet<8>> &Lookups) {
12747   // Find all of the associated namespaces and classes based on the
12748   // arguments we have.
12749   Sema::AssociatedNamespaceSet AssociatedNamespaces;
12750   Sema::AssociatedClassSet AssociatedClasses;
12751   OpaqueValueExpr OVE(Loc, Ty, VK_LValue);
12752   SemaRef.FindAssociatedClassesAndNamespaces(Loc, &OVE, AssociatedNamespaces,
12753                                              AssociatedClasses);
12754 
12755   // C++ [basic.lookup.argdep]p3:
12756   //   Let X be the lookup set produced by unqualified lookup (3.4.1)
12757   //   and let Y be the lookup set produced by argument dependent
12758   //   lookup (defined as follows). If X contains [...] then Y is
12759   //   empty. Otherwise Y is the set of declarations found in the
12760   //   namespaces associated with the argument types as described
12761   //   below. The set of declarations found by the lookup of the name
12762   //   is the union of X and Y.
12763   //
12764   // Here, we compute Y and add its members to the overloaded
12765   // candidate set.
12766   for (auto *NS : AssociatedNamespaces) {
12767     //   When considering an associated namespace, the lookup is the
12768     //   same as the lookup performed when the associated namespace is
12769     //   used as a qualifier (3.4.3.2) except that:
12770     //
12771     //     -- Any using-directives in the associated namespace are
12772     //        ignored.
12773     //
12774     //     -- Any namespace-scope friend functions declared in
12775     //        associated classes are visible within their respective
12776     //        namespaces even if they are not visible during an ordinary
12777     //        lookup (11.4).
12778     DeclContext::lookup_result R = NS->lookup(Id.getName());
12779     for (auto *D : R) {
12780       auto *Underlying = D;
12781       if (auto *USD = dyn_cast<UsingShadowDecl>(D))
12782         Underlying = USD->getTargetDecl();
12783 
12784       if (!isa<OMPDeclareReductionDecl>(Underlying) &&
12785           !isa<OMPDeclareMapperDecl>(Underlying))
12786         continue;
12787 
12788       if (!SemaRef.isVisible(D)) {
12789         D = findAcceptableDecl(SemaRef, D);
12790         if (!D)
12791           continue;
12792         if (auto *USD = dyn_cast<UsingShadowDecl>(D))
12793           Underlying = USD->getTargetDecl();
12794       }
12795       Lookups.emplace_back();
12796       Lookups.back().addDecl(Underlying);
12797     }
12798   }
12799 }
12800 
12801 static ExprResult
12802 buildDeclareReductionRef(Sema &SemaRef, SourceLocation Loc, SourceRange Range,
12803                          Scope *S, CXXScopeSpec &ReductionIdScopeSpec,
12804                          const DeclarationNameInfo &ReductionId, QualType Ty,
12805                          CXXCastPath &BasePath, Expr *UnresolvedReduction) {
12806   if (ReductionIdScopeSpec.isInvalid())
12807     return ExprError();
12808   SmallVector<UnresolvedSet<8>, 4> Lookups;
12809   if (S) {
12810     LookupResult Lookup(SemaRef, ReductionId, Sema::LookupOMPReductionName);
12811     Lookup.suppressDiagnostics();
12812     while (S && SemaRef.LookupParsedName(Lookup, S, &ReductionIdScopeSpec)) {
12813       NamedDecl *D = Lookup.getRepresentativeDecl();
12814       do {
12815         S = S->getParent();
12816       } while (S && !S->isDeclScope(D));
12817       if (S)
12818         S = S->getParent();
12819       Lookups.emplace_back();
12820       Lookups.back().append(Lookup.begin(), Lookup.end());
12821       Lookup.clear();
12822     }
12823   } else if (auto *ULE =
12824                  cast_or_null<UnresolvedLookupExpr>(UnresolvedReduction)) {
12825     Lookups.push_back(UnresolvedSet<8>());
12826     Decl *PrevD = nullptr;
12827     for (NamedDecl *D : ULE->decls()) {
12828       if (D == PrevD)
12829         Lookups.push_back(UnresolvedSet<8>());
12830       else if (auto *DRD = dyn_cast<OMPDeclareReductionDecl>(D))
12831         Lookups.back().addDecl(DRD);
12832       PrevD = D;
12833     }
12834   }
12835   if (SemaRef.CurContext->isDependentContext() || Ty->isDependentType() ||
12836       Ty->isInstantiationDependentType() ||
12837       Ty->containsUnexpandedParameterPack() ||
12838       filterLookupForUDReductionAndMapper<bool>(Lookups, [](ValueDecl *D) {
12839         return !D->isInvalidDecl() &&
12840                (D->getType()->isDependentType() ||
12841                 D->getType()->isInstantiationDependentType() ||
12842                 D->getType()->containsUnexpandedParameterPack());
12843       })) {
12844     UnresolvedSet<8> ResSet;
12845     for (const UnresolvedSet<8> &Set : Lookups) {
12846       if (Set.empty())
12847         continue;
12848       ResSet.append(Set.begin(), Set.end());
12849       // The last item marks the end of all declarations at the specified scope.
12850       ResSet.addDecl(Set[Set.size() - 1]);
12851     }
12852     return UnresolvedLookupExpr::Create(
12853         SemaRef.Context, /*NamingClass=*/nullptr,
12854         ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), ReductionId,
12855         /*ADL=*/true, /*Overloaded=*/true, ResSet.begin(), ResSet.end());
12856   }
12857   // Lookup inside the classes.
12858   // C++ [over.match.oper]p3:
12859   //   For a unary operator @ with an operand of a type whose
12860   //   cv-unqualified version is T1, and for a binary operator @ with
12861   //   a left operand of a type whose cv-unqualified version is T1 and
12862   //   a right operand of a type whose cv-unqualified version is T2,
12863   //   three sets of candidate functions, designated member
12864   //   candidates, non-member candidates and built-in candidates, are
12865   //   constructed as follows:
12866   //     -- If T1 is a complete class type or a class currently being
12867   //        defined, the set of member candidates is the result of the
12868   //        qualified lookup of T1::operator@ (13.3.1.1.1); otherwise,
12869   //        the set of member candidates is empty.
12870   LookupResult Lookup(SemaRef, ReductionId, Sema::LookupOMPReductionName);
12871   Lookup.suppressDiagnostics();
12872   if (const auto *TyRec = Ty->getAs<RecordType>()) {
12873     // Complete the type if it can be completed.
12874     // If the type is neither complete nor being defined, bail out now.
12875     if (SemaRef.isCompleteType(Loc, Ty) || TyRec->isBeingDefined() ||
12876         TyRec->getDecl()->getDefinition()) {
12877       Lookup.clear();
12878       SemaRef.LookupQualifiedName(Lookup, TyRec->getDecl());
12879       if (Lookup.empty()) {
12880         Lookups.emplace_back();
12881         Lookups.back().append(Lookup.begin(), Lookup.end());
12882       }
12883     }
12884   }
12885   // Perform ADL.
12886   if (SemaRef.getLangOpts().CPlusPlus)
12887     argumentDependentLookup(SemaRef, ReductionId, Loc, Ty, Lookups);
12888   if (auto *VD = filterLookupForUDReductionAndMapper<ValueDecl *>(
12889           Lookups, [&SemaRef, Ty](ValueDecl *D) -> ValueDecl * {
12890             if (!D->isInvalidDecl() &&
12891                 SemaRef.Context.hasSameType(D->getType(), Ty))
12892               return D;
12893             return nullptr;
12894           }))
12895     return SemaRef.BuildDeclRefExpr(VD, VD->getType().getNonReferenceType(),
12896                                     VK_LValue, Loc);
12897   if (SemaRef.getLangOpts().CPlusPlus) {
12898     if (auto *VD = filterLookupForUDReductionAndMapper<ValueDecl *>(
12899             Lookups, [&SemaRef, Ty, Loc](ValueDecl *D) -> ValueDecl * {
12900               if (!D->isInvalidDecl() &&
12901                   SemaRef.IsDerivedFrom(Loc, Ty, D->getType()) &&
12902                   !Ty.isMoreQualifiedThan(D->getType()))
12903                 return D;
12904               return nullptr;
12905             })) {
12906       CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
12907                          /*DetectVirtual=*/false);
12908       if (SemaRef.IsDerivedFrom(Loc, Ty, VD->getType(), Paths)) {
12909         if (!Paths.isAmbiguous(SemaRef.Context.getCanonicalType(
12910                 VD->getType().getUnqualifiedType()))) {
12911           if (SemaRef.CheckBaseClassAccess(
12912                   Loc, VD->getType(), Ty, Paths.front(),
12913                   /*DiagID=*/0) != Sema::AR_inaccessible) {
12914             SemaRef.BuildBasePathArray(Paths, BasePath);
12915             return SemaRef.BuildDeclRefExpr(
12916                 VD, VD->getType().getNonReferenceType(), VK_LValue, Loc);
12917           }
12918         }
12919       }
12920     }
12921   }
12922   if (ReductionIdScopeSpec.isSet()) {
12923     SemaRef.Diag(Loc, diag::err_omp_not_resolved_reduction_identifier) << Range;
12924     return ExprError();
12925   }
12926   return ExprEmpty();
12927 }
12928 
12929 namespace {
12930 /// Data for the reduction-based clauses.
12931 struct ReductionData {
12932   /// List of original reduction items.
12933   SmallVector<Expr *, 8> Vars;
12934   /// List of private copies of the reduction items.
12935   SmallVector<Expr *, 8> Privates;
12936   /// LHS expressions for the reduction_op expressions.
12937   SmallVector<Expr *, 8> LHSs;
12938   /// RHS expressions for the reduction_op expressions.
12939   SmallVector<Expr *, 8> RHSs;
12940   /// Reduction operation expression.
12941   SmallVector<Expr *, 8> ReductionOps;
12942   /// Taskgroup descriptors for the corresponding reduction items in
12943   /// in_reduction clauses.
12944   SmallVector<Expr *, 8> TaskgroupDescriptors;
12945   /// List of captures for clause.
12946   SmallVector<Decl *, 4> ExprCaptures;
12947   /// List of postupdate expressions.
12948   SmallVector<Expr *, 4> ExprPostUpdates;
12949   ReductionData() = delete;
12950   /// Reserves required memory for the reduction data.
12951   ReductionData(unsigned Size) {
12952     Vars.reserve(Size);
12953     Privates.reserve(Size);
12954     LHSs.reserve(Size);
12955     RHSs.reserve(Size);
12956     ReductionOps.reserve(Size);
12957     TaskgroupDescriptors.reserve(Size);
12958     ExprCaptures.reserve(Size);
12959     ExprPostUpdates.reserve(Size);
12960   }
12961   /// Stores reduction item and reduction operation only (required for dependent
12962   /// reduction item).
12963   void push(Expr *Item, Expr *ReductionOp) {
12964     Vars.emplace_back(Item);
12965     Privates.emplace_back(nullptr);
12966     LHSs.emplace_back(nullptr);
12967     RHSs.emplace_back(nullptr);
12968     ReductionOps.emplace_back(ReductionOp);
12969     TaskgroupDescriptors.emplace_back(nullptr);
12970   }
12971   /// Stores reduction data.
12972   void push(Expr *Item, Expr *Private, Expr *LHS, Expr *RHS, Expr *ReductionOp,
12973             Expr *TaskgroupDescriptor) {
12974     Vars.emplace_back(Item);
12975     Privates.emplace_back(Private);
12976     LHSs.emplace_back(LHS);
12977     RHSs.emplace_back(RHS);
12978     ReductionOps.emplace_back(ReductionOp);
12979     TaskgroupDescriptors.emplace_back(TaskgroupDescriptor);
12980   }
12981 };
12982 } // namespace
12983 
12984 static bool checkOMPArraySectionConstantForReduction(
12985     ASTContext &Context, const OMPArraySectionExpr *OASE, bool &SingleElement,
12986     SmallVectorImpl<llvm::APSInt> &ArraySizes) {
12987   const Expr *Length = OASE->getLength();
12988   if (Length == nullptr) {
12989     // For array sections of the form [1:] or [:], we would need to analyze
12990     // the lower bound...
12991     if (OASE->getColonLoc().isValid())
12992       return false;
12993 
12994     // This is an array subscript which has implicit length 1!
12995     SingleElement = true;
12996     ArraySizes.push_back(llvm::APSInt::get(1));
12997   } else {
12998     Expr::EvalResult Result;
12999     if (!Length->EvaluateAsInt(Result, Context))
13000       return false;
13001 
13002     llvm::APSInt ConstantLengthValue = Result.Val.getInt();
13003     SingleElement = (ConstantLengthValue.getSExtValue() == 1);
13004     ArraySizes.push_back(ConstantLengthValue);
13005   }
13006 
13007   // Get the base of this array section and walk up from there.
13008   const Expr *Base = OASE->getBase()->IgnoreParenImpCasts();
13009 
13010   // We require length = 1 for all array sections except the right-most to
13011   // guarantee that the memory region is contiguous and has no holes in it.
13012   while (const auto *TempOASE = dyn_cast<OMPArraySectionExpr>(Base)) {
13013     Length = TempOASE->getLength();
13014     if (Length == nullptr) {
13015       // For array sections of the form [1:] or [:], we would need to analyze
13016       // the lower bound...
13017       if (OASE->getColonLoc().isValid())
13018         return false;
13019 
13020       // This is an array subscript which has implicit length 1!
13021       ArraySizes.push_back(llvm::APSInt::get(1));
13022     } else {
13023       Expr::EvalResult Result;
13024       if (!Length->EvaluateAsInt(Result, Context))
13025         return false;
13026 
13027       llvm::APSInt ConstantLengthValue = Result.Val.getInt();
13028       if (ConstantLengthValue.getSExtValue() != 1)
13029         return false;
13030 
13031       ArraySizes.push_back(ConstantLengthValue);
13032     }
13033     Base = TempOASE->getBase()->IgnoreParenImpCasts();
13034   }
13035 
13036   // If we have a single element, we don't need to add the implicit lengths.
13037   if (!SingleElement) {
13038     while (const auto *TempASE = dyn_cast<ArraySubscriptExpr>(Base)) {
13039       // Has implicit length 1!
13040       ArraySizes.push_back(llvm::APSInt::get(1));
13041       Base = TempASE->getBase()->IgnoreParenImpCasts();
13042     }
13043   }
13044 
13045   // This array section can be privatized as a single value or as a constant
13046   // sized array.
13047   return true;
13048 }
13049 
13050 static bool actOnOMPReductionKindClause(
13051     Sema &S, DSAStackTy *Stack, OpenMPClauseKind ClauseKind,
13052     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
13053     SourceLocation ColonLoc, SourceLocation EndLoc,
13054     CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId,
13055     ArrayRef<Expr *> UnresolvedReductions, ReductionData &RD) {
13056   DeclarationName DN = ReductionId.getName();
13057   OverloadedOperatorKind OOK = DN.getCXXOverloadedOperator();
13058   BinaryOperatorKind BOK = BO_Comma;
13059 
13060   ASTContext &Context = S.Context;
13061   // OpenMP [2.14.3.6, reduction clause]
13062   // C
13063   // reduction-identifier is either an identifier or one of the following
13064   // operators: +, -, *,  &, |, ^, && and ||
13065   // C++
13066   // reduction-identifier is either an id-expression or one of the following
13067   // operators: +, -, *, &, |, ^, && and ||
13068   switch (OOK) {
13069   case OO_Plus:
13070   case OO_Minus:
13071     BOK = BO_Add;
13072     break;
13073   case OO_Star:
13074     BOK = BO_Mul;
13075     break;
13076   case OO_Amp:
13077     BOK = BO_And;
13078     break;
13079   case OO_Pipe:
13080     BOK = BO_Or;
13081     break;
13082   case OO_Caret:
13083     BOK = BO_Xor;
13084     break;
13085   case OO_AmpAmp:
13086     BOK = BO_LAnd;
13087     break;
13088   case OO_PipePipe:
13089     BOK = BO_LOr;
13090     break;
13091   case OO_New:
13092   case OO_Delete:
13093   case OO_Array_New:
13094   case OO_Array_Delete:
13095   case OO_Slash:
13096   case OO_Percent:
13097   case OO_Tilde:
13098   case OO_Exclaim:
13099   case OO_Equal:
13100   case OO_Less:
13101   case OO_Greater:
13102   case OO_LessEqual:
13103   case OO_GreaterEqual:
13104   case OO_PlusEqual:
13105   case OO_MinusEqual:
13106   case OO_StarEqual:
13107   case OO_SlashEqual:
13108   case OO_PercentEqual:
13109   case OO_CaretEqual:
13110   case OO_AmpEqual:
13111   case OO_PipeEqual:
13112   case OO_LessLess:
13113   case OO_GreaterGreater:
13114   case OO_LessLessEqual:
13115   case OO_GreaterGreaterEqual:
13116   case OO_EqualEqual:
13117   case OO_ExclaimEqual:
13118   case OO_Spaceship:
13119   case OO_PlusPlus:
13120   case OO_MinusMinus:
13121   case OO_Comma:
13122   case OO_ArrowStar:
13123   case OO_Arrow:
13124   case OO_Call:
13125   case OO_Subscript:
13126   case OO_Conditional:
13127   case OO_Coawait:
13128   case NUM_OVERLOADED_OPERATORS:
13129     llvm_unreachable("Unexpected reduction identifier");
13130   case OO_None:
13131     if (IdentifierInfo *II = DN.getAsIdentifierInfo()) {
13132       if (II->isStr("max"))
13133         BOK = BO_GT;
13134       else if (II->isStr("min"))
13135         BOK = BO_LT;
13136     }
13137     break;
13138   }
13139   SourceRange ReductionIdRange;
13140   if (ReductionIdScopeSpec.isValid())
13141     ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc());
13142   else
13143     ReductionIdRange.setBegin(ReductionId.getBeginLoc());
13144   ReductionIdRange.setEnd(ReductionId.getEndLoc());
13145 
13146   auto IR = UnresolvedReductions.begin(), ER = UnresolvedReductions.end();
13147   bool FirstIter = true;
13148   for (Expr *RefExpr : VarList) {
13149     assert(RefExpr && "nullptr expr in OpenMP reduction clause.");
13150     // OpenMP [2.1, C/C++]
13151     //  A list item is a variable or array section, subject to the restrictions
13152     //  specified in Section 2.4 on page 42 and in each of the sections
13153     // describing clauses and directives for which a list appears.
13154     // OpenMP  [2.14.3.3, Restrictions, p.1]
13155     //  A variable that is part of another variable (as an array or
13156     //  structure element) cannot appear in a private clause.
13157     if (!FirstIter && IR != ER)
13158       ++IR;
13159     FirstIter = false;
13160     SourceLocation ELoc;
13161     SourceRange ERange;
13162     Expr *SimpleRefExpr = RefExpr;
13163     auto Res = getPrivateItem(S, SimpleRefExpr, ELoc, ERange,
13164                               /*AllowArraySection=*/true);
13165     if (Res.second) {
13166       // Try to find 'declare reduction' corresponding construct before using
13167       // builtin/overloaded operators.
13168       QualType Type = Context.DependentTy;
13169       CXXCastPath BasePath;
13170       ExprResult DeclareReductionRef = buildDeclareReductionRef(
13171           S, ELoc, ERange, Stack->getCurScope(), ReductionIdScopeSpec,
13172           ReductionId, Type, BasePath, IR == ER ? nullptr : *IR);
13173       Expr *ReductionOp = nullptr;
13174       if (S.CurContext->isDependentContext() &&
13175           (DeclareReductionRef.isUnset() ||
13176            isa<UnresolvedLookupExpr>(DeclareReductionRef.get())))
13177         ReductionOp = DeclareReductionRef.get();
13178       // It will be analyzed later.
13179       RD.push(RefExpr, ReductionOp);
13180     }
13181     ValueDecl *D = Res.first;
13182     if (!D)
13183       continue;
13184 
13185     Expr *TaskgroupDescriptor = nullptr;
13186     QualType Type;
13187     auto *ASE = dyn_cast<ArraySubscriptExpr>(RefExpr->IgnoreParens());
13188     auto *OASE = dyn_cast<OMPArraySectionExpr>(RefExpr->IgnoreParens());
13189     if (ASE) {
13190       Type = ASE->getType().getNonReferenceType();
13191     } else if (OASE) {
13192       QualType BaseType =
13193           OMPArraySectionExpr::getBaseOriginalType(OASE->getBase());
13194       if (const auto *ATy = BaseType->getAsArrayTypeUnsafe())
13195         Type = ATy->getElementType();
13196       else
13197         Type = BaseType->getPointeeType();
13198       Type = Type.getNonReferenceType();
13199     } else {
13200       Type = Context.getBaseElementType(D->getType().getNonReferenceType());
13201     }
13202     auto *VD = dyn_cast<VarDecl>(D);
13203 
13204     // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
13205     //  A variable that appears in a private clause must not have an incomplete
13206     //  type or a reference type.
13207     if (S.RequireCompleteType(ELoc, D->getType(),
13208                               diag::err_omp_reduction_incomplete_type))
13209       continue;
13210     // OpenMP [2.14.3.6, reduction clause, Restrictions]
13211     // A list item that appears in a reduction clause must not be
13212     // const-qualified.
13213     if (rejectConstNotMutableType(S, D, Type, ClauseKind, ELoc,
13214                                   /*AcceptIfMutable*/ false, ASE || OASE))
13215       continue;
13216 
13217     OpenMPDirectiveKind CurrDir = Stack->getCurrentDirective();
13218     // OpenMP [2.9.3.6, Restrictions, C/C++, p.4]
13219     //  If a list-item is a reference type then it must bind to the same object
13220     //  for all threads of the team.
13221     if (!ASE && !OASE) {
13222       if (VD) {
13223         VarDecl *VDDef = VD->getDefinition();
13224         if (VD->getType()->isReferenceType() && VDDef && VDDef->hasInit()) {
13225           DSARefChecker Check(Stack);
13226           if (Check.Visit(VDDef->getInit())) {
13227             S.Diag(ELoc, diag::err_omp_reduction_ref_type_arg)
13228                 << getOpenMPClauseName(ClauseKind) << ERange;
13229             S.Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef;
13230             continue;
13231           }
13232         }
13233       }
13234 
13235       // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced
13236       // in a Construct]
13237       //  Variables with the predetermined data-sharing attributes may not be
13238       //  listed in data-sharing attributes clauses, except for the cases
13239       //  listed below. For these exceptions only, listing a predetermined
13240       //  variable in a data-sharing attribute clause is allowed and overrides
13241       //  the variable's predetermined data-sharing attributes.
13242       // OpenMP [2.14.3.6, Restrictions, p.3]
13243       //  Any number of reduction clauses can be specified on the directive,
13244       //  but a list item can appear only once in the reduction clauses for that
13245       //  directive.
13246       DSAStackTy::DSAVarData DVar = Stack->getTopDSA(D, /*FromParent=*/false);
13247       if (DVar.CKind == OMPC_reduction) {
13248         S.Diag(ELoc, diag::err_omp_once_referenced)
13249             << getOpenMPClauseName(ClauseKind);
13250         if (DVar.RefExpr)
13251           S.Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced);
13252         continue;
13253       }
13254       if (DVar.CKind != OMPC_unknown) {
13255         S.Diag(ELoc, diag::err_omp_wrong_dsa)
13256             << getOpenMPClauseName(DVar.CKind)
13257             << getOpenMPClauseName(OMPC_reduction);
13258         reportOriginalDsa(S, Stack, D, DVar);
13259         continue;
13260       }
13261 
13262       // OpenMP [2.14.3.6, Restrictions, p.1]
13263       //  A list item that appears in a reduction clause of a worksharing
13264       //  construct must be shared in the parallel regions to which any of the
13265       //  worksharing regions arising from the worksharing construct bind.
13266       if (isOpenMPWorksharingDirective(CurrDir) &&
13267           !isOpenMPParallelDirective(CurrDir) &&
13268           !isOpenMPTeamsDirective(CurrDir)) {
13269         DVar = Stack->getImplicitDSA(D, true);
13270         if (DVar.CKind != OMPC_shared) {
13271           S.Diag(ELoc, diag::err_omp_required_access)
13272               << getOpenMPClauseName(OMPC_reduction)
13273               << getOpenMPClauseName(OMPC_shared);
13274           reportOriginalDsa(S, Stack, D, DVar);
13275           continue;
13276         }
13277       }
13278     }
13279 
13280     // Try to find 'declare reduction' corresponding construct before using
13281     // builtin/overloaded operators.
13282     CXXCastPath BasePath;
13283     ExprResult DeclareReductionRef = buildDeclareReductionRef(
13284         S, ELoc, ERange, Stack->getCurScope(), ReductionIdScopeSpec,
13285         ReductionId, Type, BasePath, IR == ER ? nullptr : *IR);
13286     if (DeclareReductionRef.isInvalid())
13287       continue;
13288     if (S.CurContext->isDependentContext() &&
13289         (DeclareReductionRef.isUnset() ||
13290          isa<UnresolvedLookupExpr>(DeclareReductionRef.get()))) {
13291       RD.push(RefExpr, DeclareReductionRef.get());
13292       continue;
13293     }
13294     if (BOK == BO_Comma && DeclareReductionRef.isUnset()) {
13295       // Not allowed reduction identifier is found.
13296       S.Diag(ReductionId.getBeginLoc(),
13297              diag::err_omp_unknown_reduction_identifier)
13298           << Type << ReductionIdRange;
13299       continue;
13300     }
13301 
13302     // OpenMP [2.14.3.6, reduction clause, Restrictions]
13303     // The type of a list item that appears in a reduction clause must be valid
13304     // for the reduction-identifier. For a max or min reduction in C, the type
13305     // of the list item must be an allowed arithmetic data type: char, int,
13306     // float, double, or _Bool, possibly modified with long, short, signed, or
13307     // unsigned. For a max or min reduction in C++, the type of the list item
13308     // must be an allowed arithmetic data type: char, wchar_t, int, float,
13309     // double, or bool, possibly modified with long, short, signed, or unsigned.
13310     if (DeclareReductionRef.isUnset()) {
13311       if ((BOK == BO_GT || BOK == BO_LT) &&
13312           !(Type->isScalarType() ||
13313             (S.getLangOpts().CPlusPlus && Type->isArithmeticType()))) {
13314         S.Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg)
13315             << getOpenMPClauseName(ClauseKind) << S.getLangOpts().CPlusPlus;
13316         if (!ASE && !OASE) {
13317           bool IsDecl = !VD || VD->isThisDeclarationADefinition(Context) ==
13318                                    VarDecl::DeclarationOnly;
13319           S.Diag(D->getLocation(),
13320                  IsDecl ? diag::note_previous_decl : diag::note_defined_here)
13321               << D;
13322         }
13323         continue;
13324       }
13325       if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) &&
13326           !S.getLangOpts().CPlusPlus && Type->isFloatingType()) {
13327         S.Diag(ELoc, diag::err_omp_clause_floating_type_arg)
13328             << getOpenMPClauseName(ClauseKind);
13329         if (!ASE && !OASE) {
13330           bool IsDecl = !VD || VD->isThisDeclarationADefinition(Context) ==
13331                                    VarDecl::DeclarationOnly;
13332           S.Diag(D->getLocation(),
13333                  IsDecl ? diag::note_previous_decl : diag::note_defined_here)
13334               << D;
13335         }
13336         continue;
13337       }
13338     }
13339 
13340     Type = Type.getNonLValueExprType(Context).getUnqualifiedType();
13341     VarDecl *LHSVD = buildVarDecl(S, ELoc, Type, ".reduction.lhs",
13342                                   D->hasAttrs() ? &D->getAttrs() : nullptr);
13343     VarDecl *RHSVD = buildVarDecl(S, ELoc, Type, D->getName(),
13344                                   D->hasAttrs() ? &D->getAttrs() : nullptr);
13345     QualType PrivateTy = Type;
13346 
13347     // Try if we can determine constant lengths for all array sections and avoid
13348     // the VLA.
13349     bool ConstantLengthOASE = false;
13350     if (OASE) {
13351       bool SingleElement;
13352       llvm::SmallVector<llvm::APSInt, 4> ArraySizes;
13353       ConstantLengthOASE = checkOMPArraySectionConstantForReduction(
13354           Context, OASE, SingleElement, ArraySizes);
13355 
13356       // If we don't have a single element, we must emit a constant array type.
13357       if (ConstantLengthOASE && !SingleElement) {
13358         for (llvm::APSInt &Size : ArraySizes)
13359           PrivateTy = Context.getConstantArrayType(PrivateTy, Size, nullptr,
13360                                                    ArrayType::Normal,
13361                                                    /*IndexTypeQuals=*/0);
13362       }
13363     }
13364 
13365     if ((OASE && !ConstantLengthOASE) ||
13366         (!OASE && !ASE &&
13367          D->getType().getNonReferenceType()->isVariablyModifiedType())) {
13368       if (!Context.getTargetInfo().isVLASupported()) {
13369         if (isOpenMPTargetExecutionDirective(Stack->getCurrentDirective())) {
13370           S.Diag(ELoc, diag::err_omp_reduction_vla_unsupported) << !!OASE;
13371           S.Diag(ELoc, diag::note_vla_unsupported);
13372         } else {
13373           S.targetDiag(ELoc, diag::err_omp_reduction_vla_unsupported) << !!OASE;
13374           S.targetDiag(ELoc, diag::note_vla_unsupported);
13375         }
13376         continue;
13377       }
13378       // For arrays/array sections only:
13379       // Create pseudo array type for private copy. The size for this array will
13380       // be generated during codegen.
13381       // For array subscripts or single variables Private Ty is the same as Type
13382       // (type of the variable or single array element).
13383       PrivateTy = Context.getVariableArrayType(
13384           Type,
13385           new (Context) OpaqueValueExpr(ELoc, Context.getSizeType(), VK_RValue),
13386           ArrayType::Normal, /*IndexTypeQuals=*/0, SourceRange());
13387     } else if (!ASE && !OASE &&
13388                Context.getAsArrayType(D->getType().getNonReferenceType())) {
13389       PrivateTy = D->getType().getNonReferenceType();
13390     }
13391     // Private copy.
13392     VarDecl *PrivateVD =
13393         buildVarDecl(S, ELoc, PrivateTy, D->getName(),
13394                      D->hasAttrs() ? &D->getAttrs() : nullptr,
13395                      VD ? cast<DeclRefExpr>(SimpleRefExpr) : nullptr);
13396     // Add initializer for private variable.
13397     Expr *Init = nullptr;
13398     DeclRefExpr *LHSDRE = buildDeclRefExpr(S, LHSVD, Type, ELoc);
13399     DeclRefExpr *RHSDRE = buildDeclRefExpr(S, RHSVD, Type, ELoc);
13400     if (DeclareReductionRef.isUsable()) {
13401       auto *DRDRef = DeclareReductionRef.getAs<DeclRefExpr>();
13402       auto *DRD = cast<OMPDeclareReductionDecl>(DRDRef->getDecl());
13403       if (DRD->getInitializer()) {
13404         Init = DRDRef;
13405         RHSVD->setInit(DRDRef);
13406         RHSVD->setInitStyle(VarDecl::CallInit);
13407       }
13408     } else {
13409       switch (BOK) {
13410       case BO_Add:
13411       case BO_Xor:
13412       case BO_Or:
13413       case BO_LOr:
13414         // '+', '-', '^', '|', '||' reduction ops - initializer is '0'.
13415         if (Type->isScalarType() || Type->isAnyComplexType())
13416           Init = S.ActOnIntegerConstant(ELoc, /*Val=*/0).get();
13417         break;
13418       case BO_Mul:
13419       case BO_LAnd:
13420         if (Type->isScalarType() || Type->isAnyComplexType()) {
13421           // '*' and '&&' reduction ops - initializer is '1'.
13422           Init = S.ActOnIntegerConstant(ELoc, /*Val=*/1).get();
13423         }
13424         break;
13425       case BO_And: {
13426         // '&' reduction op - initializer is '~0'.
13427         QualType OrigType = Type;
13428         if (auto *ComplexTy = OrigType->getAs<ComplexType>())
13429           Type = ComplexTy->getElementType();
13430         if (Type->isRealFloatingType()) {
13431           llvm::APFloat InitValue =
13432               llvm::APFloat::getAllOnesValue(Context.getTypeSize(Type),
13433                                              /*isIEEE=*/true);
13434           Init = FloatingLiteral::Create(Context, InitValue, /*isexact=*/true,
13435                                          Type, ELoc);
13436         } else if (Type->isScalarType()) {
13437           uint64_t Size = Context.getTypeSize(Type);
13438           QualType IntTy = Context.getIntTypeForBitwidth(Size, /*Signed=*/0);
13439           llvm::APInt InitValue = llvm::APInt::getAllOnesValue(Size);
13440           Init = IntegerLiteral::Create(Context, InitValue, IntTy, ELoc);
13441         }
13442         if (Init && OrigType->isAnyComplexType()) {
13443           // Init = 0xFFFF + 0xFFFFi;
13444           auto *Im = new (Context) ImaginaryLiteral(Init, OrigType);
13445           Init = S.CreateBuiltinBinOp(ELoc, BO_Add, Init, Im).get();
13446         }
13447         Type = OrigType;
13448         break;
13449       }
13450       case BO_LT:
13451       case BO_GT: {
13452         // 'min' reduction op - initializer is 'Largest representable number in
13453         // the reduction list item type'.
13454         // 'max' reduction op - initializer is 'Least representable number in
13455         // the reduction list item type'.
13456         if (Type->isIntegerType() || Type->isPointerType()) {
13457           bool IsSigned = Type->hasSignedIntegerRepresentation();
13458           uint64_t Size = Context.getTypeSize(Type);
13459           QualType IntTy =
13460               Context.getIntTypeForBitwidth(Size, /*Signed=*/IsSigned);
13461           llvm::APInt InitValue =
13462               (BOK != BO_LT) ? IsSigned ? llvm::APInt::getSignedMinValue(Size)
13463                                         : llvm::APInt::getMinValue(Size)
13464                              : IsSigned ? llvm::APInt::getSignedMaxValue(Size)
13465                                         : llvm::APInt::getMaxValue(Size);
13466           Init = IntegerLiteral::Create(Context, InitValue, IntTy, ELoc);
13467           if (Type->isPointerType()) {
13468             // Cast to pointer type.
13469             ExprResult CastExpr = S.BuildCStyleCastExpr(
13470                 ELoc, Context.getTrivialTypeSourceInfo(Type, ELoc), ELoc, Init);
13471             if (CastExpr.isInvalid())
13472               continue;
13473             Init = CastExpr.get();
13474           }
13475         } else if (Type->isRealFloatingType()) {
13476           llvm::APFloat InitValue = llvm::APFloat::getLargest(
13477               Context.getFloatTypeSemantics(Type), BOK != BO_LT);
13478           Init = FloatingLiteral::Create(Context, InitValue, /*isexact=*/true,
13479                                          Type, ELoc);
13480         }
13481         break;
13482       }
13483       case BO_PtrMemD:
13484       case BO_PtrMemI:
13485       case BO_MulAssign:
13486       case BO_Div:
13487       case BO_Rem:
13488       case BO_Sub:
13489       case BO_Shl:
13490       case BO_Shr:
13491       case BO_LE:
13492       case BO_GE:
13493       case BO_EQ:
13494       case BO_NE:
13495       case BO_Cmp:
13496       case BO_AndAssign:
13497       case BO_XorAssign:
13498       case BO_OrAssign:
13499       case BO_Assign:
13500       case BO_AddAssign:
13501       case BO_SubAssign:
13502       case BO_DivAssign:
13503       case BO_RemAssign:
13504       case BO_ShlAssign:
13505       case BO_ShrAssign:
13506       case BO_Comma:
13507         llvm_unreachable("Unexpected reduction operation");
13508       }
13509     }
13510     if (Init && DeclareReductionRef.isUnset())
13511       S.AddInitializerToDecl(RHSVD, Init, /*DirectInit=*/false);
13512     else if (!Init)
13513       S.ActOnUninitializedDecl(RHSVD);
13514     if (RHSVD->isInvalidDecl())
13515       continue;
13516     if (!RHSVD->hasInit() &&
13517         (DeclareReductionRef.isUnset() || !S.LangOpts.CPlusPlus)) {
13518       S.Diag(ELoc, diag::err_omp_reduction_id_not_compatible)
13519           << Type << ReductionIdRange;
13520       bool IsDecl = !VD || VD->isThisDeclarationADefinition(Context) ==
13521                                VarDecl::DeclarationOnly;
13522       S.Diag(D->getLocation(),
13523              IsDecl ? diag::note_previous_decl : diag::note_defined_here)
13524           << D;
13525       continue;
13526     }
13527     // Store initializer for single element in private copy. Will be used during
13528     // codegen.
13529     PrivateVD->setInit(RHSVD->getInit());
13530     PrivateVD->setInitStyle(RHSVD->getInitStyle());
13531     DeclRefExpr *PrivateDRE = buildDeclRefExpr(S, PrivateVD, PrivateTy, ELoc);
13532     ExprResult ReductionOp;
13533     if (DeclareReductionRef.isUsable()) {
13534       QualType RedTy = DeclareReductionRef.get()->getType();
13535       QualType PtrRedTy = Context.getPointerType(RedTy);
13536       ExprResult LHS = S.CreateBuiltinUnaryOp(ELoc, UO_AddrOf, LHSDRE);
13537       ExprResult RHS = S.CreateBuiltinUnaryOp(ELoc, UO_AddrOf, RHSDRE);
13538       if (!BasePath.empty()) {
13539         LHS = S.DefaultLvalueConversion(LHS.get());
13540         RHS = S.DefaultLvalueConversion(RHS.get());
13541         LHS = ImplicitCastExpr::Create(Context, PtrRedTy,
13542                                        CK_UncheckedDerivedToBase, LHS.get(),
13543                                        &BasePath, LHS.get()->getValueKind());
13544         RHS = ImplicitCastExpr::Create(Context, PtrRedTy,
13545                                        CK_UncheckedDerivedToBase, RHS.get(),
13546                                        &BasePath, RHS.get()->getValueKind());
13547       }
13548       FunctionProtoType::ExtProtoInfo EPI;
13549       QualType Params[] = {PtrRedTy, PtrRedTy};
13550       QualType FnTy = Context.getFunctionType(Context.VoidTy, Params, EPI);
13551       auto *OVE = new (Context) OpaqueValueExpr(
13552           ELoc, Context.getPointerType(FnTy), VK_RValue, OK_Ordinary,
13553           S.DefaultLvalueConversion(DeclareReductionRef.get()).get());
13554       Expr *Args[] = {LHS.get(), RHS.get()};
13555       ReductionOp =
13556           CallExpr::Create(Context, OVE, Args, Context.VoidTy, VK_RValue, ELoc);
13557     } else {
13558       ReductionOp = S.BuildBinOp(
13559           Stack->getCurScope(), ReductionId.getBeginLoc(), BOK, LHSDRE, RHSDRE);
13560       if (ReductionOp.isUsable()) {
13561         if (BOK != BO_LT && BOK != BO_GT) {
13562           ReductionOp =
13563               S.BuildBinOp(Stack->getCurScope(), ReductionId.getBeginLoc(),
13564                            BO_Assign, LHSDRE, ReductionOp.get());
13565         } else {
13566           auto *ConditionalOp = new (Context)
13567               ConditionalOperator(ReductionOp.get(), ELoc, LHSDRE, ELoc, RHSDRE,
13568                                   Type, VK_LValue, OK_Ordinary);
13569           ReductionOp =
13570               S.BuildBinOp(Stack->getCurScope(), ReductionId.getBeginLoc(),
13571                            BO_Assign, LHSDRE, ConditionalOp);
13572         }
13573         if (ReductionOp.isUsable())
13574           ReductionOp = S.ActOnFinishFullExpr(ReductionOp.get(),
13575                                               /*DiscardedValue*/ false);
13576       }
13577       if (!ReductionOp.isUsable())
13578         continue;
13579     }
13580 
13581     // OpenMP [2.15.4.6, Restrictions, p.2]
13582     // A list item that appears in an in_reduction clause of a task construct
13583     // must appear in a task_reduction clause of a construct associated with a
13584     // taskgroup region that includes the participating task in its taskgroup
13585     // set. The construct associated with the innermost region that meets this
13586     // condition must specify the same reduction-identifier as the in_reduction
13587     // clause.
13588     if (ClauseKind == OMPC_in_reduction) {
13589       SourceRange ParentSR;
13590       BinaryOperatorKind ParentBOK;
13591       const Expr *ParentReductionOp;
13592       Expr *ParentBOKTD, *ParentReductionOpTD;
13593       DSAStackTy::DSAVarData ParentBOKDSA =
13594           Stack->getTopMostTaskgroupReductionData(D, ParentSR, ParentBOK,
13595                                                   ParentBOKTD);
13596       DSAStackTy::DSAVarData ParentReductionOpDSA =
13597           Stack->getTopMostTaskgroupReductionData(
13598               D, ParentSR, ParentReductionOp, ParentReductionOpTD);
13599       bool IsParentBOK = ParentBOKDSA.DKind != OMPD_unknown;
13600       bool IsParentReductionOp = ParentReductionOpDSA.DKind != OMPD_unknown;
13601       if (!IsParentBOK && !IsParentReductionOp) {
13602         S.Diag(ELoc, diag::err_omp_in_reduction_not_task_reduction);
13603         continue;
13604       }
13605       if ((DeclareReductionRef.isUnset() && IsParentReductionOp) ||
13606           (DeclareReductionRef.isUsable() && IsParentBOK) || BOK != ParentBOK ||
13607           IsParentReductionOp) {
13608         bool EmitError = true;
13609         if (IsParentReductionOp && DeclareReductionRef.isUsable()) {
13610           llvm::FoldingSetNodeID RedId, ParentRedId;
13611           ParentReductionOp->Profile(ParentRedId, Context, /*Canonical=*/true);
13612           DeclareReductionRef.get()->Profile(RedId, Context,
13613                                              /*Canonical=*/true);
13614           EmitError = RedId != ParentRedId;
13615         }
13616         if (EmitError) {
13617           S.Diag(ReductionId.getBeginLoc(),
13618                  diag::err_omp_reduction_identifier_mismatch)
13619               << ReductionIdRange << RefExpr->getSourceRange();
13620           S.Diag(ParentSR.getBegin(),
13621                  diag::note_omp_previous_reduction_identifier)
13622               << ParentSR
13623               << (IsParentBOK ? ParentBOKDSA.RefExpr
13624                               : ParentReductionOpDSA.RefExpr)
13625                      ->getSourceRange();
13626           continue;
13627         }
13628       }
13629       TaskgroupDescriptor = IsParentBOK ? ParentBOKTD : ParentReductionOpTD;
13630       assert(TaskgroupDescriptor && "Taskgroup descriptor must be defined.");
13631     }
13632 
13633     DeclRefExpr *Ref = nullptr;
13634     Expr *VarsExpr = RefExpr->IgnoreParens();
13635     if (!VD && !S.CurContext->isDependentContext()) {
13636       if (ASE || OASE) {
13637         TransformExprToCaptures RebuildToCapture(S, D);
13638         VarsExpr =
13639             RebuildToCapture.TransformExpr(RefExpr->IgnoreParens()).get();
13640         Ref = RebuildToCapture.getCapturedExpr();
13641       } else {
13642         VarsExpr = Ref = buildCapture(S, D, SimpleRefExpr, /*WithInit=*/false);
13643       }
13644       if (!S.isOpenMPCapturedDecl(D)) {
13645         RD.ExprCaptures.emplace_back(Ref->getDecl());
13646         if (Ref->getDecl()->hasAttr<OMPCaptureNoInitAttr>()) {
13647           ExprResult RefRes = S.DefaultLvalueConversion(Ref);
13648           if (!RefRes.isUsable())
13649             continue;
13650           ExprResult PostUpdateRes =
13651               S.BuildBinOp(Stack->getCurScope(), ELoc, BO_Assign, SimpleRefExpr,
13652                            RefRes.get());
13653           if (!PostUpdateRes.isUsable())
13654             continue;
13655           if (isOpenMPTaskingDirective(Stack->getCurrentDirective()) ||
13656               Stack->getCurrentDirective() == OMPD_taskgroup) {
13657             S.Diag(RefExpr->getExprLoc(),
13658                    diag::err_omp_reduction_non_addressable_expression)
13659                 << RefExpr->getSourceRange();
13660             continue;
13661           }
13662           RD.ExprPostUpdates.emplace_back(
13663               S.IgnoredValueConversions(PostUpdateRes.get()).get());
13664         }
13665       }
13666     }
13667     // All reduction items are still marked as reduction (to do not increase
13668     // code base size).
13669     Stack->addDSA(D, RefExpr->IgnoreParens(), OMPC_reduction, Ref);
13670     if (CurrDir == OMPD_taskgroup) {
13671       if (DeclareReductionRef.isUsable())
13672         Stack->addTaskgroupReductionData(D, ReductionIdRange,
13673                                          DeclareReductionRef.get());
13674       else
13675         Stack->addTaskgroupReductionData(D, ReductionIdRange, BOK);
13676     }
13677     RD.push(VarsExpr, PrivateDRE, LHSDRE, RHSDRE, ReductionOp.get(),
13678             TaskgroupDescriptor);
13679   }
13680   return RD.Vars.empty();
13681 }
13682 
13683 OMPClause *Sema::ActOnOpenMPReductionClause(
13684     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
13685     SourceLocation ColonLoc, SourceLocation EndLoc,
13686     CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId,
13687     ArrayRef<Expr *> UnresolvedReductions) {
13688   ReductionData RD(VarList.size());
13689   if (actOnOMPReductionKindClause(*this, DSAStack, OMPC_reduction, VarList,
13690                                   StartLoc, LParenLoc, ColonLoc, EndLoc,
13691                                   ReductionIdScopeSpec, ReductionId,
13692                                   UnresolvedReductions, RD))
13693     return nullptr;
13694 
13695   return OMPReductionClause::Create(
13696       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, RD.Vars,
13697       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId,
13698       RD.Privates, RD.LHSs, RD.RHSs, RD.ReductionOps,
13699       buildPreInits(Context, RD.ExprCaptures),
13700       buildPostUpdate(*this, RD.ExprPostUpdates));
13701 }
13702 
13703 OMPClause *Sema::ActOnOpenMPTaskReductionClause(
13704     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
13705     SourceLocation ColonLoc, SourceLocation EndLoc,
13706     CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId,
13707     ArrayRef<Expr *> UnresolvedReductions) {
13708   ReductionData RD(VarList.size());
13709   if (actOnOMPReductionKindClause(*this, DSAStack, OMPC_task_reduction, VarList,
13710                                   StartLoc, LParenLoc, ColonLoc, EndLoc,
13711                                   ReductionIdScopeSpec, ReductionId,
13712                                   UnresolvedReductions, RD))
13713     return nullptr;
13714 
13715   return OMPTaskReductionClause::Create(
13716       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, RD.Vars,
13717       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId,
13718       RD.Privates, RD.LHSs, RD.RHSs, RD.ReductionOps,
13719       buildPreInits(Context, RD.ExprCaptures),
13720       buildPostUpdate(*this, RD.ExprPostUpdates));
13721 }
13722 
13723 OMPClause *Sema::ActOnOpenMPInReductionClause(
13724     ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc,
13725     SourceLocation ColonLoc, SourceLocation EndLoc,
13726     CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId,
13727     ArrayRef<Expr *> UnresolvedReductions) {
13728   ReductionData RD(VarList.size());
13729   if (actOnOMPReductionKindClause(*this, DSAStack, OMPC_in_reduction, VarList,
13730                                   StartLoc, LParenLoc, ColonLoc, EndLoc,
13731                                   ReductionIdScopeSpec, ReductionId,
13732                                   UnresolvedReductions, RD))
13733     return nullptr;
13734 
13735   return OMPInReductionClause::Create(
13736       Context, StartLoc, LParenLoc, ColonLoc, EndLoc, RD.Vars,
13737       ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId,
13738       RD.Privates, RD.LHSs, RD.RHSs, RD.ReductionOps, RD.TaskgroupDescriptors,
13739       buildPreInits(Context, RD.ExprCaptures),
13740       buildPostUpdate(*this, RD.ExprPostUpdates));
13741 }
13742 
13743 bool Sema::CheckOpenMPLinearModifier(OpenMPLinearClauseKind LinKind,
13744                                      SourceLocation LinLoc) {
13745   if ((!LangOpts.CPlusPlus && LinKind != OMPC_LINEAR_val) ||
13746       LinKind == OMPC_LINEAR_unknown) {
13747     Diag(LinLoc, diag::err_omp_wrong_linear_modifier) << LangOpts.CPlusPlus;
13748     return true;
13749   }
13750   return false;
13751 }
13752 
13753 bool Sema::CheckOpenMPLinearDecl(const ValueDecl *D, SourceLocation ELoc,
13754                                  OpenMPLinearClauseKind LinKind,
13755                                  QualType Type) {
13756   const auto *VD = dyn_cast_or_null<VarDecl>(D);
13757   // A variable must not have an incomplete type or a reference type.
13758   if (RequireCompleteType(ELoc, Type, diag::err_omp_linear_incomplete_type))
13759     return true;
13760   if ((LinKind == OMPC_LINEAR_uval || LinKind == OMPC_LINEAR_ref) &&
13761       !Type->isReferenceType()) {
13762     Diag(ELoc, diag::err_omp_wrong_linear_modifier_non_reference)
13763         << Type << getOpenMPSimpleClauseTypeName(OMPC_linear, LinKind);
13764     return true;
13765   }
13766   Type = Type.getNonReferenceType();
13767 
13768   // OpenMP 5.0 [2.19.3, List Item Privatization, Restrictions]
13769   // A variable that is privatized must not have a const-qualified type
13770   // unless it is of class type with a mutable member. This restriction does
13771   // not apply to the firstprivate clause.
13772   if (rejectConstNotMutableType(*this, D, Type, OMPC_linear, ELoc))
13773     return true;
13774 
13775   // A list item must be of integral or pointer type.
13776   Type = Type.getUnqualifiedType().getCanonicalType();
13777   const auto *Ty = Type.getTypePtrOrNull();
13778   if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) &&
13779               !Ty->isPointerType())) {
13780     Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << Type;
13781     if (D) {
13782       bool IsDecl =
13783           !VD ||
13784           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
13785       Diag(D->getLocation(),
13786            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
13787           << D;
13788     }
13789     return true;
13790   }
13791   return false;
13792 }
13793 
13794 OMPClause *Sema::ActOnOpenMPLinearClause(
13795     ArrayRef<Expr *> VarList, Expr *Step, SourceLocation StartLoc,
13796     SourceLocation LParenLoc, OpenMPLinearClauseKind LinKind,
13797     SourceLocation LinLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {
13798   SmallVector<Expr *, 8> Vars;
13799   SmallVector<Expr *, 8> Privates;
13800   SmallVector<Expr *, 8> Inits;
13801   SmallVector<Decl *, 4> ExprCaptures;
13802   SmallVector<Expr *, 4> ExprPostUpdates;
13803   if (CheckOpenMPLinearModifier(LinKind, LinLoc))
13804     LinKind = OMPC_LINEAR_val;
13805   for (Expr *RefExpr : VarList) {
13806     assert(RefExpr && "NULL expr in OpenMP linear clause.");
13807     SourceLocation ELoc;
13808     SourceRange ERange;
13809     Expr *SimpleRefExpr = RefExpr;
13810     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
13811     if (Res.second) {
13812       // It will be analyzed later.
13813       Vars.push_back(RefExpr);
13814       Privates.push_back(nullptr);
13815       Inits.push_back(nullptr);
13816     }
13817     ValueDecl *D = Res.first;
13818     if (!D)
13819       continue;
13820 
13821     QualType Type = D->getType();
13822     auto *VD = dyn_cast<VarDecl>(D);
13823 
13824     // OpenMP [2.14.3.7, linear clause]
13825     //  A list-item cannot appear in more than one linear clause.
13826     //  A list-item that appears in a linear clause cannot appear in any
13827     //  other data-sharing attribute clause.
13828     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(D, /*FromParent=*/false);
13829     if (DVar.RefExpr) {
13830       Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind)
13831                                           << getOpenMPClauseName(OMPC_linear);
13832       reportOriginalDsa(*this, DSAStack, D, DVar);
13833       continue;
13834     }
13835 
13836     if (CheckOpenMPLinearDecl(D, ELoc, LinKind, Type))
13837       continue;
13838     Type = Type.getNonReferenceType().getUnqualifiedType().getCanonicalType();
13839 
13840     // Build private copy of original var.
13841     VarDecl *Private =
13842         buildVarDecl(*this, ELoc, Type, D->getName(),
13843                      D->hasAttrs() ? &D->getAttrs() : nullptr,
13844                      VD ? cast<DeclRefExpr>(SimpleRefExpr) : nullptr);
13845     DeclRefExpr *PrivateRef = buildDeclRefExpr(*this, Private, Type, ELoc);
13846     // Build var to save initial value.
13847     VarDecl *Init = buildVarDecl(*this, ELoc, Type, ".linear.start");
13848     Expr *InitExpr;
13849     DeclRefExpr *Ref = nullptr;
13850     if (!VD && !CurContext->isDependentContext()) {
13851       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/false);
13852       if (!isOpenMPCapturedDecl(D)) {
13853         ExprCaptures.push_back(Ref->getDecl());
13854         if (Ref->getDecl()->hasAttr<OMPCaptureNoInitAttr>()) {
13855           ExprResult RefRes = DefaultLvalueConversion(Ref);
13856           if (!RefRes.isUsable())
13857             continue;
13858           ExprResult PostUpdateRes =
13859               BuildBinOp(DSAStack->getCurScope(), ELoc, BO_Assign,
13860                          SimpleRefExpr, RefRes.get());
13861           if (!PostUpdateRes.isUsable())
13862             continue;
13863           ExprPostUpdates.push_back(
13864               IgnoredValueConversions(PostUpdateRes.get()).get());
13865         }
13866       }
13867     }
13868     if (LinKind == OMPC_LINEAR_uval)
13869       InitExpr = VD ? VD->getInit() : SimpleRefExpr;
13870     else
13871       InitExpr = VD ? SimpleRefExpr : Ref;
13872     AddInitializerToDecl(Init, DefaultLvalueConversion(InitExpr).get(),
13873                          /*DirectInit=*/false);
13874     DeclRefExpr *InitRef = buildDeclRefExpr(*this, Init, Type, ELoc);
13875 
13876     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_linear, Ref);
13877     Vars.push_back((VD || CurContext->isDependentContext())
13878                        ? RefExpr->IgnoreParens()
13879                        : Ref);
13880     Privates.push_back(PrivateRef);
13881     Inits.push_back(InitRef);
13882   }
13883 
13884   if (Vars.empty())
13885     return nullptr;
13886 
13887   Expr *StepExpr = Step;
13888   Expr *CalcStepExpr = nullptr;
13889   if (Step && !Step->isValueDependent() && !Step->isTypeDependent() &&
13890       !Step->isInstantiationDependent() &&
13891       !Step->containsUnexpandedParameterPack()) {
13892     SourceLocation StepLoc = Step->getBeginLoc();
13893     ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step);
13894     if (Val.isInvalid())
13895       return nullptr;
13896     StepExpr = Val.get();
13897 
13898     // Build var to save the step value.
13899     VarDecl *SaveVar =
13900         buildVarDecl(*this, StepLoc, StepExpr->getType(), ".linear.step");
13901     ExprResult SaveRef =
13902         buildDeclRefExpr(*this, SaveVar, StepExpr->getType(), StepLoc);
13903     ExprResult CalcStep =
13904         BuildBinOp(CurScope, StepLoc, BO_Assign, SaveRef.get(), StepExpr);
13905     CalcStep = ActOnFinishFullExpr(CalcStep.get(), /*DiscardedValue*/ false);
13906 
13907     // Warn about zero linear step (it would be probably better specified as
13908     // making corresponding variables 'const').
13909     llvm::APSInt Result;
13910     bool IsConstant = StepExpr->isIntegerConstantExpr(Result, Context);
13911     if (IsConstant && !Result.isNegative() && !Result.isStrictlyPositive())
13912       Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0]
13913                                                      << (Vars.size() > 1);
13914     if (!IsConstant && CalcStep.isUsable()) {
13915       // Calculate the step beforehand instead of doing this on each iteration.
13916       // (This is not used if the number of iterations may be kfold-ed).
13917       CalcStepExpr = CalcStep.get();
13918     }
13919   }
13920 
13921   return OMPLinearClause::Create(Context, StartLoc, LParenLoc, LinKind, LinLoc,
13922                                  ColonLoc, EndLoc, Vars, Privates, Inits,
13923                                  StepExpr, CalcStepExpr,
13924                                  buildPreInits(Context, ExprCaptures),
13925                                  buildPostUpdate(*this, ExprPostUpdates));
13926 }
13927 
13928 static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV,
13929                                      Expr *NumIterations, Sema &SemaRef,
13930                                      Scope *S, DSAStackTy *Stack) {
13931   // Walk the vars and build update/final expressions for the CodeGen.
13932   SmallVector<Expr *, 8> Updates;
13933   SmallVector<Expr *, 8> Finals;
13934   SmallVector<Expr *, 8> UsedExprs;
13935   Expr *Step = Clause.getStep();
13936   Expr *CalcStep = Clause.getCalcStep();
13937   // OpenMP [2.14.3.7, linear clause]
13938   // If linear-step is not specified it is assumed to be 1.
13939   if (!Step)
13940     Step = SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get();
13941   else if (CalcStep)
13942     Step = cast<BinaryOperator>(CalcStep)->getLHS();
13943   bool HasErrors = false;
13944   auto CurInit = Clause.inits().begin();
13945   auto CurPrivate = Clause.privates().begin();
13946   OpenMPLinearClauseKind LinKind = Clause.getModifier();
13947   for (Expr *RefExpr : Clause.varlists()) {
13948     SourceLocation ELoc;
13949     SourceRange ERange;
13950     Expr *SimpleRefExpr = RefExpr;
13951     auto Res = getPrivateItem(SemaRef, SimpleRefExpr, ELoc, ERange);
13952     ValueDecl *D = Res.first;
13953     if (Res.second || !D) {
13954       Updates.push_back(nullptr);
13955       Finals.push_back(nullptr);
13956       HasErrors = true;
13957       continue;
13958     }
13959     auto &&Info = Stack->isLoopControlVariable(D);
13960     // OpenMP [2.15.11, distribute simd Construct]
13961     // A list item may not appear in a linear clause, unless it is the loop
13962     // iteration variable.
13963     if (isOpenMPDistributeDirective(Stack->getCurrentDirective()) &&
13964         isOpenMPSimdDirective(Stack->getCurrentDirective()) && !Info.first) {
13965       SemaRef.Diag(ELoc,
13966                    diag::err_omp_linear_distribute_var_non_loop_iteration);
13967       Updates.push_back(nullptr);
13968       Finals.push_back(nullptr);
13969       HasErrors = true;
13970       continue;
13971     }
13972     Expr *InitExpr = *CurInit;
13973 
13974     // Build privatized reference to the current linear var.
13975     auto *DE = cast<DeclRefExpr>(SimpleRefExpr);
13976     Expr *CapturedRef;
13977     if (LinKind == OMPC_LINEAR_uval)
13978       CapturedRef = cast<VarDecl>(DE->getDecl())->getInit();
13979     else
13980       CapturedRef =
13981           buildDeclRefExpr(SemaRef, cast<VarDecl>(DE->getDecl()),
13982                            DE->getType().getUnqualifiedType(), DE->getExprLoc(),
13983                            /*RefersToCapture=*/true);
13984 
13985     // Build update: Var = InitExpr + IV * Step
13986     ExprResult Update;
13987     if (!Info.first)
13988       Update = buildCounterUpdate(
13989           SemaRef, S, RefExpr->getExprLoc(), *CurPrivate, InitExpr, IV, Step,
13990           /*Subtract=*/false, /*IsNonRectangularLB=*/false);
13991     else
13992       Update = *CurPrivate;
13993     Update = SemaRef.ActOnFinishFullExpr(Update.get(), DE->getBeginLoc(),
13994                                          /*DiscardedValue*/ false);
13995 
13996     // Build final: Var = InitExpr + NumIterations * Step
13997     ExprResult Final;
13998     if (!Info.first)
13999       Final =
14000           buildCounterUpdate(SemaRef, S, RefExpr->getExprLoc(), CapturedRef,
14001                              InitExpr, NumIterations, Step, /*Subtract=*/false,
14002                              /*IsNonRectangularLB=*/false);
14003     else
14004       Final = *CurPrivate;
14005     Final = SemaRef.ActOnFinishFullExpr(Final.get(), DE->getBeginLoc(),
14006                                         /*DiscardedValue*/ false);
14007 
14008     if (!Update.isUsable() || !Final.isUsable()) {
14009       Updates.push_back(nullptr);
14010       Finals.push_back(nullptr);
14011       UsedExprs.push_back(nullptr);
14012       HasErrors = true;
14013     } else {
14014       Updates.push_back(Update.get());
14015       Finals.push_back(Final.get());
14016       if (!Info.first)
14017         UsedExprs.push_back(SimpleRefExpr);
14018     }
14019     ++CurInit;
14020     ++CurPrivate;
14021   }
14022   if (Expr *S = Clause.getStep())
14023     UsedExprs.push_back(S);
14024   // Fill the remaining part with the nullptr.
14025   UsedExprs.append(Clause.varlist_size() + 1 - UsedExprs.size(), nullptr);
14026   Clause.setUpdates(Updates);
14027   Clause.setFinals(Finals);
14028   Clause.setUsedExprs(UsedExprs);
14029   return HasErrors;
14030 }
14031 
14032 OMPClause *Sema::ActOnOpenMPAlignedClause(
14033     ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc,
14034     SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {
14035   SmallVector<Expr *, 8> Vars;
14036   for (Expr *RefExpr : VarList) {
14037     assert(RefExpr && "NULL expr in OpenMP linear clause.");
14038     SourceLocation ELoc;
14039     SourceRange ERange;
14040     Expr *SimpleRefExpr = RefExpr;
14041     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
14042     if (Res.second) {
14043       // It will be analyzed later.
14044       Vars.push_back(RefExpr);
14045     }
14046     ValueDecl *D = Res.first;
14047     if (!D)
14048       continue;
14049 
14050     QualType QType = D->getType();
14051     auto *VD = dyn_cast<VarDecl>(D);
14052 
14053     // OpenMP  [2.8.1, simd construct, Restrictions]
14054     // The type of list items appearing in the aligned clause must be
14055     // array, pointer, reference to array, or reference to pointer.
14056     QType = QType.getNonReferenceType().getUnqualifiedType().getCanonicalType();
14057     const Type *Ty = QType.getTypePtrOrNull();
14058     if (!Ty || (!Ty->isArrayType() && !Ty->isPointerType())) {
14059       Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr)
14060           << QType << getLangOpts().CPlusPlus << ERange;
14061       bool IsDecl =
14062           !VD ||
14063           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
14064       Diag(D->getLocation(),
14065            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
14066           << D;
14067       continue;
14068     }
14069 
14070     // OpenMP  [2.8.1, simd construct, Restrictions]
14071     // A list-item cannot appear in more than one aligned clause.
14072     if (const Expr *PrevRef = DSAStack->addUniqueAligned(D, SimpleRefExpr)) {
14073       Diag(ELoc, diag::err_omp_aligned_twice) << 0 << ERange;
14074       Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa)
14075           << getOpenMPClauseName(OMPC_aligned);
14076       continue;
14077     }
14078 
14079     DeclRefExpr *Ref = nullptr;
14080     if (!VD && isOpenMPCapturedDecl(D))
14081       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/true);
14082     Vars.push_back(DefaultFunctionArrayConversion(
14083                        (VD || !Ref) ? RefExpr->IgnoreParens() : Ref)
14084                        .get());
14085   }
14086 
14087   // OpenMP [2.8.1, simd construct, Description]
14088   // The parameter of the aligned clause, alignment, must be a constant
14089   // positive integer expression.
14090   // If no optional parameter is specified, implementation-defined default
14091   // alignments for SIMD instructions on the target platforms are assumed.
14092   if (Alignment != nullptr) {
14093     ExprResult AlignResult =
14094         VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned);
14095     if (AlignResult.isInvalid())
14096       return nullptr;
14097     Alignment = AlignResult.get();
14098   }
14099   if (Vars.empty())
14100     return nullptr;
14101 
14102   return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc,
14103                                   EndLoc, Vars, Alignment);
14104 }
14105 
14106 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList,
14107                                          SourceLocation StartLoc,
14108                                          SourceLocation LParenLoc,
14109                                          SourceLocation EndLoc) {
14110   SmallVector<Expr *, 8> Vars;
14111   SmallVector<Expr *, 8> SrcExprs;
14112   SmallVector<Expr *, 8> DstExprs;
14113   SmallVector<Expr *, 8> AssignmentOps;
14114   for (Expr *RefExpr : VarList) {
14115     assert(RefExpr && "NULL expr in OpenMP copyin clause.");
14116     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
14117       // It will be analyzed later.
14118       Vars.push_back(RefExpr);
14119       SrcExprs.push_back(nullptr);
14120       DstExprs.push_back(nullptr);
14121       AssignmentOps.push_back(nullptr);
14122       continue;
14123     }
14124 
14125     SourceLocation ELoc = RefExpr->getExprLoc();
14126     // OpenMP [2.1, C/C++]
14127     //  A list item is a variable name.
14128     // OpenMP  [2.14.4.1, Restrictions, p.1]
14129     //  A list item that appears in a copyin clause must be threadprivate.
14130     auto *DE = dyn_cast<DeclRefExpr>(RefExpr);
14131     if (!DE || !isa<VarDecl>(DE->getDecl())) {
14132       Diag(ELoc, diag::err_omp_expected_var_name_member_expr)
14133           << 0 << RefExpr->getSourceRange();
14134       continue;
14135     }
14136 
14137     Decl *D = DE->getDecl();
14138     auto *VD = cast<VarDecl>(D);
14139 
14140     QualType Type = VD->getType();
14141     if (Type->isDependentType() || Type->isInstantiationDependentType()) {
14142       // It will be analyzed later.
14143       Vars.push_back(DE);
14144       SrcExprs.push_back(nullptr);
14145       DstExprs.push_back(nullptr);
14146       AssignmentOps.push_back(nullptr);
14147       continue;
14148     }
14149 
14150     // OpenMP [2.14.4.1, Restrictions, C/C++, p.1]
14151     //  A list item that appears in a copyin clause must be threadprivate.
14152     if (!DSAStack->isThreadPrivate(VD)) {
14153       Diag(ELoc, diag::err_omp_required_access)
14154           << getOpenMPClauseName(OMPC_copyin)
14155           << getOpenMPDirectiveName(OMPD_threadprivate);
14156       continue;
14157     }
14158 
14159     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
14160     //  A variable of class type (or array thereof) that appears in a
14161     //  copyin clause requires an accessible, unambiguous copy assignment
14162     //  operator for the class type.
14163     QualType ElemType = Context.getBaseElementType(Type).getNonReferenceType();
14164     VarDecl *SrcVD =
14165         buildVarDecl(*this, DE->getBeginLoc(), ElemType.getUnqualifiedType(),
14166                      ".copyin.src", VD->hasAttrs() ? &VD->getAttrs() : nullptr);
14167     DeclRefExpr *PseudoSrcExpr = buildDeclRefExpr(
14168         *this, SrcVD, ElemType.getUnqualifiedType(), DE->getExprLoc());
14169     VarDecl *DstVD =
14170         buildVarDecl(*this, DE->getBeginLoc(), ElemType, ".copyin.dst",
14171                      VD->hasAttrs() ? &VD->getAttrs() : nullptr);
14172     DeclRefExpr *PseudoDstExpr =
14173         buildDeclRefExpr(*this, DstVD, ElemType, DE->getExprLoc());
14174     // For arrays generate assignment operation for single element and replace
14175     // it by the original array element in CodeGen.
14176     ExprResult AssignmentOp =
14177         BuildBinOp(/*S=*/nullptr, DE->getExprLoc(), BO_Assign, PseudoDstExpr,
14178                    PseudoSrcExpr);
14179     if (AssignmentOp.isInvalid())
14180       continue;
14181     AssignmentOp = ActOnFinishFullExpr(AssignmentOp.get(), DE->getExprLoc(),
14182                                        /*DiscardedValue*/ false);
14183     if (AssignmentOp.isInvalid())
14184       continue;
14185 
14186     DSAStack->addDSA(VD, DE, OMPC_copyin);
14187     Vars.push_back(DE);
14188     SrcExprs.push_back(PseudoSrcExpr);
14189     DstExprs.push_back(PseudoDstExpr);
14190     AssignmentOps.push_back(AssignmentOp.get());
14191   }
14192 
14193   if (Vars.empty())
14194     return nullptr;
14195 
14196   return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars,
14197                                  SrcExprs, DstExprs, AssignmentOps);
14198 }
14199 
14200 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList,
14201                                               SourceLocation StartLoc,
14202                                               SourceLocation LParenLoc,
14203                                               SourceLocation EndLoc) {
14204   SmallVector<Expr *, 8> Vars;
14205   SmallVector<Expr *, 8> SrcExprs;
14206   SmallVector<Expr *, 8> DstExprs;
14207   SmallVector<Expr *, 8> AssignmentOps;
14208   for (Expr *RefExpr : VarList) {
14209     assert(RefExpr && "NULL expr in OpenMP linear clause.");
14210     SourceLocation ELoc;
14211     SourceRange ERange;
14212     Expr *SimpleRefExpr = RefExpr;
14213     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
14214     if (Res.second) {
14215       // It will be analyzed later.
14216       Vars.push_back(RefExpr);
14217       SrcExprs.push_back(nullptr);
14218       DstExprs.push_back(nullptr);
14219       AssignmentOps.push_back(nullptr);
14220     }
14221     ValueDecl *D = Res.first;
14222     if (!D)
14223       continue;
14224 
14225     QualType Type = D->getType();
14226     auto *VD = dyn_cast<VarDecl>(D);
14227 
14228     // OpenMP [2.14.4.2, Restrictions, p.2]
14229     //  A list item that appears in a copyprivate clause may not appear in a
14230     //  private or firstprivate clause on the single construct.
14231     if (!VD || !DSAStack->isThreadPrivate(VD)) {
14232       DSAStackTy::DSAVarData DVar =
14233           DSAStack->getTopDSA(D, /*FromParent=*/false);
14234       if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_copyprivate &&
14235           DVar.RefExpr) {
14236         Diag(ELoc, diag::err_omp_wrong_dsa)
14237             << getOpenMPClauseName(DVar.CKind)
14238             << getOpenMPClauseName(OMPC_copyprivate);
14239         reportOriginalDsa(*this, DSAStack, D, DVar);
14240         continue;
14241       }
14242 
14243       // OpenMP [2.11.4.2, Restrictions, p.1]
14244       //  All list items that appear in a copyprivate clause must be either
14245       //  threadprivate or private in the enclosing context.
14246       if (DVar.CKind == OMPC_unknown) {
14247         DVar = DSAStack->getImplicitDSA(D, false);
14248         if (DVar.CKind == OMPC_shared) {
14249           Diag(ELoc, diag::err_omp_required_access)
14250               << getOpenMPClauseName(OMPC_copyprivate)
14251               << "threadprivate or private in the enclosing context";
14252           reportOriginalDsa(*this, DSAStack, D, DVar);
14253           continue;
14254         }
14255       }
14256     }
14257 
14258     // Variably modified types are not supported.
14259     if (!Type->isAnyPointerType() && Type->isVariablyModifiedType()) {
14260       Diag(ELoc, diag::err_omp_variably_modified_type_not_supported)
14261           << getOpenMPClauseName(OMPC_copyprivate) << Type
14262           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
14263       bool IsDecl =
14264           !VD ||
14265           VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
14266       Diag(D->getLocation(),
14267            IsDecl ? diag::note_previous_decl : diag::note_defined_here)
14268           << D;
14269       continue;
14270     }
14271 
14272     // OpenMP [2.14.4.1, Restrictions, C/C++, p.2]
14273     //  A variable of class type (or array thereof) that appears in a
14274     //  copyin clause requires an accessible, unambiguous copy assignment
14275     //  operator for the class type.
14276     Type = Context.getBaseElementType(Type.getNonReferenceType())
14277                .getUnqualifiedType();
14278     VarDecl *SrcVD =
14279         buildVarDecl(*this, RefExpr->getBeginLoc(), Type, ".copyprivate.src",
14280                      D->hasAttrs() ? &D->getAttrs() : nullptr);
14281     DeclRefExpr *PseudoSrcExpr = buildDeclRefExpr(*this, SrcVD, Type, ELoc);
14282     VarDecl *DstVD =
14283         buildVarDecl(*this, RefExpr->getBeginLoc(), Type, ".copyprivate.dst",
14284                      D->hasAttrs() ? &D->getAttrs() : nullptr);
14285     DeclRefExpr *PseudoDstExpr = buildDeclRefExpr(*this, DstVD, Type, ELoc);
14286     ExprResult AssignmentOp = BuildBinOp(
14287         DSAStack->getCurScope(), ELoc, BO_Assign, PseudoDstExpr, PseudoSrcExpr);
14288     if (AssignmentOp.isInvalid())
14289       continue;
14290     AssignmentOp =
14291         ActOnFinishFullExpr(AssignmentOp.get(), ELoc, /*DiscardedValue*/ false);
14292     if (AssignmentOp.isInvalid())
14293       continue;
14294 
14295     // No need to mark vars as copyprivate, they are already threadprivate or
14296     // implicitly private.
14297     assert(VD || isOpenMPCapturedDecl(D));
14298     Vars.push_back(
14299         VD ? RefExpr->IgnoreParens()
14300            : buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/false));
14301     SrcExprs.push_back(PseudoSrcExpr);
14302     DstExprs.push_back(PseudoDstExpr);
14303     AssignmentOps.push_back(AssignmentOp.get());
14304   }
14305 
14306   if (Vars.empty())
14307     return nullptr;
14308 
14309   return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc,
14310                                       Vars, SrcExprs, DstExprs, AssignmentOps);
14311 }
14312 
14313 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList,
14314                                         SourceLocation StartLoc,
14315                                         SourceLocation LParenLoc,
14316                                         SourceLocation EndLoc) {
14317   if (VarList.empty())
14318     return nullptr;
14319 
14320   return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList);
14321 }
14322 
14323 OMPClause *
14324 Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
14325                               SourceLocation DepLoc, SourceLocation ColonLoc,
14326                               ArrayRef<Expr *> VarList, SourceLocation StartLoc,
14327                               SourceLocation LParenLoc, SourceLocation EndLoc) {
14328   if (DSAStack->getCurrentDirective() == OMPD_ordered &&
14329       DepKind != OMPC_DEPEND_source && DepKind != OMPC_DEPEND_sink) {
14330     Diag(DepLoc, diag::err_omp_unexpected_clause_value)
14331         << "'source' or 'sink'" << getOpenMPClauseName(OMPC_depend);
14332     return nullptr;
14333   }
14334   if (DSAStack->getCurrentDirective() != OMPD_ordered &&
14335       (DepKind == OMPC_DEPEND_unknown || DepKind == OMPC_DEPEND_source ||
14336        DepKind == OMPC_DEPEND_sink)) {
14337     unsigned Except[] = {OMPC_DEPEND_source, OMPC_DEPEND_sink};
14338     Diag(DepLoc, diag::err_omp_unexpected_clause_value)
14339         << getListOfPossibleValues(OMPC_depend, /*First=*/0,
14340                                    /*Last=*/OMPC_DEPEND_unknown, Except)
14341         << getOpenMPClauseName(OMPC_depend);
14342     return nullptr;
14343   }
14344   SmallVector<Expr *, 8> Vars;
14345   DSAStackTy::OperatorOffsetTy OpsOffs;
14346   llvm::APSInt DepCounter(/*BitWidth=*/32);
14347   llvm::APSInt TotalDepCount(/*BitWidth=*/32);
14348   if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {
14349     if (const Expr *OrderedCountExpr =
14350             DSAStack->getParentOrderedRegionParam().first) {
14351       TotalDepCount = OrderedCountExpr->EvaluateKnownConstInt(Context);
14352       TotalDepCount.setIsUnsigned(/*Val=*/true);
14353     }
14354   }
14355   for (Expr *RefExpr : VarList) {
14356     assert(RefExpr && "NULL expr in OpenMP shared clause.");
14357     if (isa<DependentScopeDeclRefExpr>(RefExpr)) {
14358       // It will be analyzed later.
14359       Vars.push_back(RefExpr);
14360       continue;
14361     }
14362 
14363     SourceLocation ELoc = RefExpr->getExprLoc();
14364     Expr *SimpleExpr = RefExpr->IgnoreParenCasts();
14365     if (DepKind == OMPC_DEPEND_sink) {
14366       if (DSAStack->getParentOrderedRegionParam().first &&
14367           DepCounter >= TotalDepCount) {
14368         Diag(ELoc, diag::err_omp_depend_sink_unexpected_expr);
14369         continue;
14370       }
14371       ++DepCounter;
14372       // OpenMP  [2.13.9, Summary]
14373       // depend(dependence-type : vec), where dependence-type is:
14374       // 'sink' and where vec is the iteration vector, which has the form:
14375       //  x1 [+- d1], x2 [+- d2 ], . . . , xn [+- dn]
14376       // where n is the value specified by the ordered clause in the loop
14377       // directive, xi denotes the loop iteration variable of the i-th nested
14378       // loop associated with the loop directive, and di is a constant
14379       // non-negative integer.
14380       if (CurContext->isDependentContext()) {
14381         // It will be analyzed later.
14382         Vars.push_back(RefExpr);
14383         continue;
14384       }
14385       SimpleExpr = SimpleExpr->IgnoreImplicit();
14386       OverloadedOperatorKind OOK = OO_None;
14387       SourceLocation OOLoc;
14388       Expr *LHS = SimpleExpr;
14389       Expr *RHS = nullptr;
14390       if (auto *BO = dyn_cast<BinaryOperator>(SimpleExpr)) {
14391         OOK = BinaryOperator::getOverloadedOperator(BO->getOpcode());
14392         OOLoc = BO->getOperatorLoc();
14393         LHS = BO->getLHS()->IgnoreParenImpCasts();
14394         RHS = BO->getRHS()->IgnoreParenImpCasts();
14395       } else if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(SimpleExpr)) {
14396         OOK = OCE->getOperator();
14397         OOLoc = OCE->getOperatorLoc();
14398         LHS = OCE->getArg(/*Arg=*/0)->IgnoreParenImpCasts();
14399         RHS = OCE->getArg(/*Arg=*/1)->IgnoreParenImpCasts();
14400       } else if (auto *MCE = dyn_cast<CXXMemberCallExpr>(SimpleExpr)) {
14401         OOK = MCE->getMethodDecl()
14402                   ->getNameInfo()
14403                   .getName()
14404                   .getCXXOverloadedOperator();
14405         OOLoc = MCE->getCallee()->getExprLoc();
14406         LHS = MCE->getImplicitObjectArgument()->IgnoreParenImpCasts();
14407         RHS = MCE->getArg(/*Arg=*/0)->IgnoreParenImpCasts();
14408       }
14409       SourceLocation ELoc;
14410       SourceRange ERange;
14411       auto Res = getPrivateItem(*this, LHS, ELoc, ERange);
14412       if (Res.second) {
14413         // It will be analyzed later.
14414         Vars.push_back(RefExpr);
14415       }
14416       ValueDecl *D = Res.first;
14417       if (!D)
14418         continue;
14419 
14420       if (OOK != OO_Plus && OOK != OO_Minus && (RHS || OOK != OO_None)) {
14421         Diag(OOLoc, diag::err_omp_depend_sink_expected_plus_minus);
14422         continue;
14423       }
14424       if (RHS) {
14425         ExprResult RHSRes = VerifyPositiveIntegerConstantInClause(
14426             RHS, OMPC_depend, /*StrictlyPositive=*/false);
14427         if (RHSRes.isInvalid())
14428           continue;
14429       }
14430       if (!CurContext->isDependentContext() &&
14431           DSAStack->getParentOrderedRegionParam().first &&
14432           DepCounter != DSAStack->isParentLoopControlVariable(D).first) {
14433         const ValueDecl *VD =
14434             DSAStack->getParentLoopControlVariable(DepCounter.getZExtValue());
14435         if (VD)
14436           Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration)
14437               << 1 << VD;
14438         else
14439           Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration) << 0;
14440         continue;
14441       }
14442       OpsOffs.emplace_back(RHS, OOK);
14443     } else {
14444       auto *ASE = dyn_cast<ArraySubscriptExpr>(SimpleExpr);
14445       if (!RefExpr->IgnoreParenImpCasts()->isLValue() ||
14446           (ASE &&
14447            !ASE->getBase()->getType().getNonReferenceType()->isPointerType() &&
14448            !ASE->getBase()->getType().getNonReferenceType()->isArrayType())) {
14449         Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
14450             << RefExpr->getSourceRange();
14451         continue;
14452       }
14453 
14454       ExprResult Res;
14455       {
14456         Sema::TentativeAnalysisScope Trap(*this);
14457         Res = CreateBuiltinUnaryOp(ELoc, UO_AddrOf,
14458                                    RefExpr->IgnoreParenImpCasts());
14459       }
14460       if (!Res.isUsable() && !isa<OMPArraySectionExpr>(SimpleExpr)) {
14461         Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item)
14462             << RefExpr->getSourceRange();
14463         continue;
14464       }
14465     }
14466     Vars.push_back(RefExpr->IgnoreParenImpCasts());
14467   }
14468 
14469   if (!CurContext->isDependentContext() && DepKind == OMPC_DEPEND_sink &&
14470       TotalDepCount > VarList.size() &&
14471       DSAStack->getParentOrderedRegionParam().first &&
14472       DSAStack->getParentLoopControlVariable(VarList.size() + 1)) {
14473     Diag(EndLoc, diag::err_omp_depend_sink_expected_loop_iteration)
14474         << 1 << DSAStack->getParentLoopControlVariable(VarList.size() + 1);
14475   }
14476   if (DepKind != OMPC_DEPEND_source && DepKind != OMPC_DEPEND_sink &&
14477       Vars.empty())
14478     return nullptr;
14479 
14480   auto *C = OMPDependClause::Create(Context, StartLoc, LParenLoc, EndLoc,
14481                                     DepKind, DepLoc, ColonLoc, Vars,
14482                                     TotalDepCount.getZExtValue());
14483   if ((DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) &&
14484       DSAStack->isParentOrderedRegion())
14485     DSAStack->addDoacrossDependClause(C, OpsOffs);
14486   return C;
14487 }
14488 
14489 OMPClause *Sema::ActOnOpenMPDeviceClause(Expr *Device, SourceLocation StartLoc,
14490                                          SourceLocation LParenLoc,
14491                                          SourceLocation EndLoc) {
14492   Expr *ValExpr = Device;
14493   Stmt *HelperValStmt = nullptr;
14494 
14495   // OpenMP [2.9.1, Restrictions]
14496   // The device expression must evaluate to a non-negative integer value.
14497   if (!isNonNegativeIntegerValue(ValExpr, *this, OMPC_device,
14498                                  /*StrictlyPositive=*/false))
14499     return nullptr;
14500 
14501   OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
14502   OpenMPDirectiveKind CaptureRegion =
14503       getOpenMPCaptureRegionForClause(DKind, OMPC_device);
14504   if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
14505     ValExpr = MakeFullExpr(ValExpr).get();
14506     llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
14507     ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
14508     HelperValStmt = buildPreInits(Context, Captures);
14509   }
14510 
14511   return new (Context) OMPDeviceClause(ValExpr, HelperValStmt, CaptureRegion,
14512                                        StartLoc, LParenLoc, EndLoc);
14513 }
14514 
14515 static bool checkTypeMappable(SourceLocation SL, SourceRange SR, Sema &SemaRef,
14516                               DSAStackTy *Stack, QualType QTy,
14517                               bool FullCheck = true) {
14518   NamedDecl *ND;
14519   if (QTy->isIncompleteType(&ND)) {
14520     SemaRef.Diag(SL, diag::err_incomplete_type) << QTy << SR;
14521     return false;
14522   }
14523   if (FullCheck && !SemaRef.CurContext->isDependentContext() &&
14524       !QTy.isTrivialType(SemaRef.Context))
14525     SemaRef.Diag(SL, diag::warn_omp_non_trivial_type_mapped) << QTy << SR;
14526   return true;
14527 }
14528 
14529 /// Return true if it can be proven that the provided array expression
14530 /// (array section or array subscript) does NOT specify the whole size of the
14531 /// array whose base type is \a BaseQTy.
14532 static bool checkArrayExpressionDoesNotReferToWholeSize(Sema &SemaRef,
14533                                                         const Expr *E,
14534                                                         QualType BaseQTy) {
14535   const auto *OASE = dyn_cast<OMPArraySectionExpr>(E);
14536 
14537   // If this is an array subscript, it refers to the whole size if the size of
14538   // the dimension is constant and equals 1. Also, an array section assumes the
14539   // format of an array subscript if no colon is used.
14540   if (isa<ArraySubscriptExpr>(E) || (OASE && OASE->getColonLoc().isInvalid())) {
14541     if (const auto *ATy = dyn_cast<ConstantArrayType>(BaseQTy.getTypePtr()))
14542       return ATy->getSize().getSExtValue() != 1;
14543     // Size can't be evaluated statically.
14544     return false;
14545   }
14546 
14547   assert(OASE && "Expecting array section if not an array subscript.");
14548   const Expr *LowerBound = OASE->getLowerBound();
14549   const Expr *Length = OASE->getLength();
14550 
14551   // If there is a lower bound that does not evaluates to zero, we are not
14552   // covering the whole dimension.
14553   if (LowerBound) {
14554     Expr::EvalResult Result;
14555     if (!LowerBound->EvaluateAsInt(Result, SemaRef.getASTContext()))
14556       return false; // Can't get the integer value as a constant.
14557 
14558     llvm::APSInt ConstLowerBound = Result.Val.getInt();
14559     if (ConstLowerBound.getSExtValue())
14560       return true;
14561   }
14562 
14563   // If we don't have a length we covering the whole dimension.
14564   if (!Length)
14565     return false;
14566 
14567   // If the base is a pointer, we don't have a way to get the size of the
14568   // pointee.
14569   if (BaseQTy->isPointerType())
14570     return false;
14571 
14572   // We can only check if the length is the same as the size of the dimension
14573   // if we have a constant array.
14574   const auto *CATy = dyn_cast<ConstantArrayType>(BaseQTy.getTypePtr());
14575   if (!CATy)
14576     return false;
14577 
14578   Expr::EvalResult Result;
14579   if (!Length->EvaluateAsInt(Result, SemaRef.getASTContext()))
14580     return false; // Can't get the integer value as a constant.
14581 
14582   llvm::APSInt ConstLength = Result.Val.getInt();
14583   return CATy->getSize().getSExtValue() != ConstLength.getSExtValue();
14584 }
14585 
14586 // Return true if it can be proven that the provided array expression (array
14587 // section or array subscript) does NOT specify a single element of the array
14588 // whose base type is \a BaseQTy.
14589 static bool checkArrayExpressionDoesNotReferToUnitySize(Sema &SemaRef,
14590                                                         const Expr *E,
14591                                                         QualType BaseQTy) {
14592   const auto *OASE = dyn_cast<OMPArraySectionExpr>(E);
14593 
14594   // An array subscript always refer to a single element. Also, an array section
14595   // assumes the format of an array subscript if no colon is used.
14596   if (isa<ArraySubscriptExpr>(E) || (OASE && OASE->getColonLoc().isInvalid()))
14597     return false;
14598 
14599   assert(OASE && "Expecting array section if not an array subscript.");
14600   const Expr *Length = OASE->getLength();
14601 
14602   // If we don't have a length we have to check if the array has unitary size
14603   // for this dimension. Also, we should always expect a length if the base type
14604   // is pointer.
14605   if (!Length) {
14606     if (const auto *ATy = dyn_cast<ConstantArrayType>(BaseQTy.getTypePtr()))
14607       return ATy->getSize().getSExtValue() != 1;
14608     // We cannot assume anything.
14609     return false;
14610   }
14611 
14612   // Check if the length evaluates to 1.
14613   Expr::EvalResult Result;
14614   if (!Length->EvaluateAsInt(Result, SemaRef.getASTContext()))
14615     return false; // Can't get the integer value as a constant.
14616 
14617   llvm::APSInt ConstLength = Result.Val.getInt();
14618   return ConstLength.getSExtValue() != 1;
14619 }
14620 
14621 // Return the expression of the base of the mappable expression or null if it
14622 // cannot be determined and do all the necessary checks to see if the expression
14623 // is valid as a standalone mappable expression. In the process, record all the
14624 // components of the expression.
14625 static const Expr *checkMapClauseExpressionBase(
14626     Sema &SemaRef, Expr *E,
14627     OMPClauseMappableExprCommon::MappableExprComponentList &CurComponents,
14628     OpenMPClauseKind CKind, bool NoDiagnose) {
14629   SourceLocation ELoc = E->getExprLoc();
14630   SourceRange ERange = E->getSourceRange();
14631 
14632   // The base of elements of list in a map clause have to be either:
14633   //  - a reference to variable or field.
14634   //  - a member expression.
14635   //  - an array expression.
14636   //
14637   // E.g. if we have the expression 'r.S.Arr[:12]', we want to retrieve the
14638   // reference to 'r'.
14639   //
14640   // If we have:
14641   //
14642   // struct SS {
14643   //   Bla S;
14644   //   foo() {
14645   //     #pragma omp target map (S.Arr[:12]);
14646   //   }
14647   // }
14648   //
14649   // We want to retrieve the member expression 'this->S';
14650 
14651   const Expr *RelevantExpr = nullptr;
14652 
14653   // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.2]
14654   //  If a list item is an array section, it must specify contiguous storage.
14655   //
14656   // For this restriction it is sufficient that we make sure only references
14657   // to variables or fields and array expressions, and that no array sections
14658   // exist except in the rightmost expression (unless they cover the whole
14659   // dimension of the array). E.g. these would be invalid:
14660   //
14661   //   r.ArrS[3:5].Arr[6:7]
14662   //
14663   //   r.ArrS[3:5].x
14664   //
14665   // but these would be valid:
14666   //   r.ArrS[3].Arr[6:7]
14667   //
14668   //   r.ArrS[3].x
14669 
14670   bool AllowUnitySizeArraySection = true;
14671   bool AllowWholeSizeArraySection = true;
14672 
14673   while (!RelevantExpr) {
14674     E = E->IgnoreParenImpCasts();
14675 
14676     if (auto *CurE = dyn_cast<DeclRefExpr>(E)) {
14677       if (!isa<VarDecl>(CurE->getDecl()))
14678         return nullptr;
14679 
14680       RelevantExpr = CurE;
14681 
14682       // If we got a reference to a declaration, we should not expect any array
14683       // section before that.
14684       AllowUnitySizeArraySection = false;
14685       AllowWholeSizeArraySection = false;
14686 
14687       // Record the component.
14688       CurComponents.emplace_back(CurE, CurE->getDecl());
14689     } else if (auto *CurE = dyn_cast<MemberExpr>(E)) {
14690       Expr *BaseE = CurE->getBase()->IgnoreParenImpCasts();
14691 
14692       if (isa<CXXThisExpr>(BaseE))
14693         // We found a base expression: this->Val.
14694         RelevantExpr = CurE;
14695       else
14696         E = BaseE;
14697 
14698       if (!isa<FieldDecl>(CurE->getMemberDecl())) {
14699         if (!NoDiagnose) {
14700           SemaRef.Diag(ELoc, diag::err_omp_expected_access_to_data_field)
14701               << CurE->getSourceRange();
14702           return nullptr;
14703         }
14704         if (RelevantExpr)
14705           return nullptr;
14706         continue;
14707       }
14708 
14709       auto *FD = cast<FieldDecl>(CurE->getMemberDecl());
14710 
14711       // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C/C++, p.3]
14712       //  A bit-field cannot appear in a map clause.
14713       //
14714       if (FD->isBitField()) {
14715         if (!NoDiagnose) {
14716           SemaRef.Diag(ELoc, diag::err_omp_bit_fields_forbidden_in_clause)
14717               << CurE->getSourceRange() << getOpenMPClauseName(CKind);
14718           return nullptr;
14719         }
14720         if (RelevantExpr)
14721           return nullptr;
14722         continue;
14723       }
14724 
14725       // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1]
14726       //  If the type of a list item is a reference to a type T then the type
14727       //  will be considered to be T for all purposes of this clause.
14728       QualType CurType = BaseE->getType().getNonReferenceType();
14729 
14730       // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C/C++, p.2]
14731       //  A list item cannot be a variable that is a member of a structure with
14732       //  a union type.
14733       //
14734       if (CurType->isUnionType()) {
14735         if (!NoDiagnose) {
14736           SemaRef.Diag(ELoc, diag::err_omp_union_type_not_allowed)
14737               << CurE->getSourceRange();
14738           return nullptr;
14739         }
14740         continue;
14741       }
14742 
14743       // If we got a member expression, we should not expect any array section
14744       // before that:
14745       //
14746       // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.7]
14747       //  If a list item is an element of a structure, only the rightmost symbol
14748       //  of the variable reference can be an array section.
14749       //
14750       AllowUnitySizeArraySection = false;
14751       AllowWholeSizeArraySection = false;
14752 
14753       // Record the component.
14754       CurComponents.emplace_back(CurE, FD);
14755     } else if (auto *CurE = dyn_cast<ArraySubscriptExpr>(E)) {
14756       E = CurE->getBase()->IgnoreParenImpCasts();
14757 
14758       if (!E->getType()->isAnyPointerType() && !E->getType()->isArrayType()) {
14759         if (!NoDiagnose) {
14760           SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name)
14761               << 0 << CurE->getSourceRange();
14762           return nullptr;
14763         }
14764         continue;
14765       }
14766 
14767       // If we got an array subscript that express the whole dimension we
14768       // can have any array expressions before. If it only expressing part of
14769       // the dimension, we can only have unitary-size array expressions.
14770       if (checkArrayExpressionDoesNotReferToWholeSize(SemaRef, CurE,
14771                                                       E->getType()))
14772         AllowWholeSizeArraySection = false;
14773 
14774       if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {
14775         Expr::EvalResult Result;
14776         if (CurE->getIdx()->EvaluateAsInt(Result, SemaRef.getASTContext())) {
14777           if (!Result.Val.getInt().isNullValue()) {
14778             SemaRef.Diag(CurE->getIdx()->getExprLoc(),
14779                          diag::err_omp_invalid_map_this_expr);
14780             SemaRef.Diag(CurE->getIdx()->getExprLoc(),
14781                          diag::note_omp_invalid_subscript_on_this_ptr_map);
14782           }
14783         }
14784         RelevantExpr = TE;
14785       }
14786 
14787       // Record the component - we don't have any declaration associated.
14788       CurComponents.emplace_back(CurE, nullptr);
14789     } else if (auto *CurE = dyn_cast<OMPArraySectionExpr>(E)) {
14790       assert(!NoDiagnose && "Array sections cannot be implicitly mapped.");
14791       E = CurE->getBase()->IgnoreParenImpCasts();
14792 
14793       QualType CurType =
14794           OMPArraySectionExpr::getBaseOriginalType(E).getCanonicalType();
14795 
14796       // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1]
14797       //  If the type of a list item is a reference to a type T then the type
14798       //  will be considered to be T for all purposes of this clause.
14799       if (CurType->isReferenceType())
14800         CurType = CurType->getPointeeType();
14801 
14802       bool IsPointer = CurType->isAnyPointerType();
14803 
14804       if (!IsPointer && !CurType->isArrayType()) {
14805         SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name)
14806             << 0 << CurE->getSourceRange();
14807         return nullptr;
14808       }
14809 
14810       bool NotWhole =
14811           checkArrayExpressionDoesNotReferToWholeSize(SemaRef, CurE, CurType);
14812       bool NotUnity =
14813           checkArrayExpressionDoesNotReferToUnitySize(SemaRef, CurE, CurType);
14814 
14815       if (AllowWholeSizeArraySection) {
14816         // Any array section is currently allowed. Allowing a whole size array
14817         // section implies allowing a unity array section as well.
14818         //
14819         // If this array section refers to the whole dimension we can still
14820         // accept other array sections before this one, except if the base is a
14821         // pointer. Otherwise, only unitary sections are accepted.
14822         if (NotWhole || IsPointer)
14823           AllowWholeSizeArraySection = false;
14824       } else if (AllowUnitySizeArraySection && NotUnity) {
14825         // A unity or whole array section is not allowed and that is not
14826         // compatible with the properties of the current array section.
14827         SemaRef.Diag(
14828             ELoc, diag::err_array_section_does_not_specify_contiguous_storage)
14829             << CurE->getSourceRange();
14830         return nullptr;
14831       }
14832 
14833       if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {
14834         Expr::EvalResult ResultR;
14835         Expr::EvalResult ResultL;
14836         if (CurE->getLength()->EvaluateAsInt(ResultR,
14837                                              SemaRef.getASTContext())) {
14838           if (!ResultR.Val.getInt().isOneValue()) {
14839             SemaRef.Diag(CurE->getLength()->getExprLoc(),
14840                          diag::err_omp_invalid_map_this_expr);
14841             SemaRef.Diag(CurE->getLength()->getExprLoc(),
14842                          diag::note_omp_invalid_length_on_this_ptr_mapping);
14843           }
14844         }
14845         if (CurE->getLowerBound() && CurE->getLowerBound()->EvaluateAsInt(
14846                                         ResultL, SemaRef.getASTContext())) {
14847           if (!ResultL.Val.getInt().isNullValue()) {
14848             SemaRef.Diag(CurE->getLowerBound()->getExprLoc(),
14849                          diag::err_omp_invalid_map_this_expr);
14850             SemaRef.Diag(CurE->getLowerBound()->getExprLoc(),
14851                          diag::note_omp_invalid_lower_bound_on_this_ptr_mapping);
14852           }
14853         }
14854         RelevantExpr = TE;
14855       }
14856 
14857       // Record the component - we don't have any declaration associated.
14858       CurComponents.emplace_back(CurE, nullptr);
14859     } else {
14860       if (!NoDiagnose) {
14861         // If nothing else worked, this is not a valid map clause expression.
14862         SemaRef.Diag(
14863             ELoc, diag::err_omp_expected_named_var_member_or_array_expression)
14864             << ERange;
14865       }
14866       return nullptr;
14867     }
14868   }
14869 
14870   return RelevantExpr;
14871 }
14872 
14873 // Return true if expression E associated with value VD has conflicts with other
14874 // map information.
14875 static bool checkMapConflicts(
14876     Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E,
14877     bool CurrentRegionOnly,
14878     OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents,
14879     OpenMPClauseKind CKind) {
14880   assert(VD && E);
14881   SourceLocation ELoc = E->getExprLoc();
14882   SourceRange ERange = E->getSourceRange();
14883 
14884   // In order to easily check the conflicts we need to match each component of
14885   // the expression under test with the components of the expressions that are
14886   // already in the stack.
14887 
14888   assert(!CurComponents.empty() && "Map clause expression with no components!");
14889   assert(CurComponents.back().getAssociatedDeclaration() == VD &&
14890          "Map clause expression with unexpected base!");
14891 
14892   // Variables to help detecting enclosing problems in data environment nests.
14893   bool IsEnclosedByDataEnvironmentExpr = false;
14894   const Expr *EnclosingExpr = nullptr;
14895 
14896   bool FoundError = DSAS->checkMappableExprComponentListsForDecl(
14897       VD, CurrentRegionOnly,
14898       [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc,
14899        ERange, CKind, &EnclosingExpr,
14900        CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef
14901                           StackComponents,
14902                       OpenMPClauseKind) {
14903         assert(!StackComponents.empty() &&
14904                "Map clause expression with no components!");
14905         assert(StackComponents.back().getAssociatedDeclaration() == VD &&
14906                "Map clause expression with unexpected base!");
14907         (void)VD;
14908 
14909         // The whole expression in the stack.
14910         const Expr *RE = StackComponents.front().getAssociatedExpression();
14911 
14912         // Expressions must start from the same base. Here we detect at which
14913         // point both expressions diverge from each other and see if we can
14914         // detect if the memory referred to both expressions is contiguous and
14915         // do not overlap.
14916         auto CI = CurComponents.rbegin();
14917         auto CE = CurComponents.rend();
14918         auto SI = StackComponents.rbegin();
14919         auto SE = StackComponents.rend();
14920         for (; CI != CE && SI != SE; ++CI, ++SI) {
14921 
14922           // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.3]
14923           //  At most one list item can be an array item derived from a given
14924           //  variable in map clauses of the same construct.
14925           if (CurrentRegionOnly &&
14926               (isa<ArraySubscriptExpr>(CI->getAssociatedExpression()) ||
14927                isa<OMPArraySectionExpr>(CI->getAssociatedExpression())) &&
14928               (isa<ArraySubscriptExpr>(SI->getAssociatedExpression()) ||
14929                isa<OMPArraySectionExpr>(SI->getAssociatedExpression()))) {
14930             SemaRef.Diag(CI->getAssociatedExpression()->getExprLoc(),
14931                          diag::err_omp_multiple_array_items_in_map_clause)
14932                 << CI->getAssociatedExpression()->getSourceRange();
14933             SemaRef.Diag(SI->getAssociatedExpression()->getExprLoc(),
14934                          diag::note_used_here)
14935                 << SI->getAssociatedExpression()->getSourceRange();
14936             return true;
14937           }
14938 
14939           // Do both expressions have the same kind?
14940           if (CI->getAssociatedExpression()->getStmtClass() !=
14941               SI->getAssociatedExpression()->getStmtClass())
14942             break;
14943 
14944           // Are we dealing with different variables/fields?
14945           if (CI->getAssociatedDeclaration() != SI->getAssociatedDeclaration())
14946             break;
14947         }
14948         // Check if the extra components of the expressions in the enclosing
14949         // data environment are redundant for the current base declaration.
14950         // If they are, the maps completely overlap, which is legal.
14951         for (; SI != SE; ++SI) {
14952           QualType Type;
14953           if (const auto *ASE =
14954                   dyn_cast<ArraySubscriptExpr>(SI->getAssociatedExpression())) {
14955             Type = ASE->getBase()->IgnoreParenImpCasts()->getType();
14956           } else if (const auto *OASE = dyn_cast<OMPArraySectionExpr>(
14957                          SI->getAssociatedExpression())) {
14958             const Expr *E = OASE->getBase()->IgnoreParenImpCasts();
14959             Type =
14960                 OMPArraySectionExpr::getBaseOriginalType(E).getCanonicalType();
14961           }
14962           if (Type.isNull() || Type->isAnyPointerType() ||
14963               checkArrayExpressionDoesNotReferToWholeSize(
14964                   SemaRef, SI->getAssociatedExpression(), Type))
14965             break;
14966         }
14967 
14968         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]
14969         //  List items of map clauses in the same construct must not share
14970         //  original storage.
14971         //
14972         // If the expressions are exactly the same or one is a subset of the
14973         // other, it means they are sharing storage.
14974         if (CI == CE && SI == SE) {
14975           if (CurrentRegionOnly) {
14976             if (CKind == OMPC_map) {
14977               SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange;
14978             } else {
14979               assert(CKind == OMPC_to || CKind == OMPC_from);
14980               SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update)
14981                   << ERange;
14982             }
14983             SemaRef.Diag(RE->getExprLoc(), diag::note_used_here)
14984                 << RE->getSourceRange();
14985             return true;
14986           }
14987           // If we find the same expression in the enclosing data environment,
14988           // that is legal.
14989           IsEnclosedByDataEnvironmentExpr = true;
14990           return false;
14991         }
14992 
14993         QualType DerivedType =
14994             std::prev(CI)->getAssociatedDeclaration()->getType();
14995         SourceLocation DerivedLoc =
14996             std::prev(CI)->getAssociatedExpression()->getExprLoc();
14997 
14998         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1]
14999         //  If the type of a list item is a reference to a type T then the type
15000         //  will be considered to be T for all purposes of this clause.
15001         DerivedType = DerivedType.getNonReferenceType();
15002 
15003         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C/C++, p.1]
15004         //  A variable for which the type is pointer and an array section
15005         //  derived from that variable must not appear as list items of map
15006         //  clauses of the same construct.
15007         //
15008         // Also, cover one of the cases in:
15009         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.5]
15010         //  If any part of the original storage of a list item has corresponding
15011         //  storage in the device data environment, all of the original storage
15012         //  must have corresponding storage in the device data environment.
15013         //
15014         if (DerivedType->isAnyPointerType()) {
15015           if (CI == CE || SI == SE) {
15016             SemaRef.Diag(
15017                 DerivedLoc,
15018                 diag::err_omp_pointer_mapped_along_with_derived_section)
15019                 << DerivedLoc;
15020             SemaRef.Diag(RE->getExprLoc(), diag::note_used_here)
15021                 << RE->getSourceRange();
15022             return true;
15023           }
15024           if (CI->getAssociatedExpression()->getStmtClass() !=
15025                          SI->getAssociatedExpression()->getStmtClass() ||
15026                      CI->getAssociatedDeclaration()->getCanonicalDecl() ==
15027                          SI->getAssociatedDeclaration()->getCanonicalDecl()) {
15028             assert(CI != CE && SI != SE);
15029             SemaRef.Diag(DerivedLoc, diag::err_omp_same_pointer_dereferenced)
15030                 << DerivedLoc;
15031             SemaRef.Diag(RE->getExprLoc(), diag::note_used_here)
15032                 << RE->getSourceRange();
15033             return true;
15034           }
15035         }
15036 
15037         // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]
15038         //  List items of map clauses in the same construct must not share
15039         //  original storage.
15040         //
15041         // An expression is a subset of the other.
15042         if (CurrentRegionOnly && (CI == CE || SI == SE)) {
15043           if (CKind == OMPC_map) {
15044             if (CI != CE || SI != SE) {
15045               // Allow constructs like this: map(s, s.ptr[0:1]), where s.ptr is
15046               // a pointer.
15047               auto Begin =
15048                   CI != CE ? CurComponents.begin() : StackComponents.begin();
15049               auto End = CI != CE ? CurComponents.end() : StackComponents.end();
15050               auto It = Begin;
15051               while (It != End && !It->getAssociatedDeclaration())
15052                 std::advance(It, 1);
15053               assert(It != End &&
15054                      "Expected at least one component with the declaration.");
15055               if (It != Begin && It->getAssociatedDeclaration()
15056                                      ->getType()
15057                                      .getCanonicalType()
15058                                      ->isAnyPointerType()) {
15059                 IsEnclosedByDataEnvironmentExpr = false;
15060                 EnclosingExpr = nullptr;
15061                 return false;
15062               }
15063             }
15064             SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange;
15065           } else {
15066             assert(CKind == OMPC_to || CKind == OMPC_from);
15067             SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update)
15068                 << ERange;
15069           }
15070           SemaRef.Diag(RE->getExprLoc(), diag::note_used_here)
15071               << RE->getSourceRange();
15072           return true;
15073         }
15074 
15075         // The current expression uses the same base as other expression in the
15076         // data environment but does not contain it completely.
15077         if (!CurrentRegionOnly && SI != SE)
15078           EnclosingExpr = RE;
15079 
15080         // The current expression is a subset of the expression in the data
15081         // environment.
15082         IsEnclosedByDataEnvironmentExpr |=
15083             (!CurrentRegionOnly && CI != CE && SI == SE);
15084 
15085         return false;
15086       });
15087 
15088   if (CurrentRegionOnly)
15089     return FoundError;
15090 
15091   // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.5]
15092   //  If any part of the original storage of a list item has corresponding
15093   //  storage in the device data environment, all of the original storage must
15094   //  have corresponding storage in the device data environment.
15095   // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.6]
15096   //  If a list item is an element of a structure, and a different element of
15097   //  the structure has a corresponding list item in the device data environment
15098   //  prior to a task encountering the construct associated with the map clause,
15099   //  then the list item must also have a corresponding list item in the device
15100   //  data environment prior to the task encountering the construct.
15101   //
15102   if (EnclosingExpr && !IsEnclosedByDataEnvironmentExpr) {
15103     SemaRef.Diag(ELoc,
15104                  diag::err_omp_original_storage_is_shared_and_does_not_contain)
15105         << ERange;
15106     SemaRef.Diag(EnclosingExpr->getExprLoc(), diag::note_used_here)
15107         << EnclosingExpr->getSourceRange();
15108     return true;
15109   }
15110 
15111   return FoundError;
15112 }
15113 
15114 // Look up the user-defined mapper given the mapper name and mapped type, and
15115 // build a reference to it.
15116 static ExprResult buildUserDefinedMapperRef(Sema &SemaRef, Scope *S,
15117                                             CXXScopeSpec &MapperIdScopeSpec,
15118                                             const DeclarationNameInfo &MapperId,
15119                                             QualType Type,
15120                                             Expr *UnresolvedMapper) {
15121   if (MapperIdScopeSpec.isInvalid())
15122     return ExprError();
15123   // Get the actual type for the array type.
15124   if (Type->isArrayType()) {
15125     assert(Type->getAsArrayTypeUnsafe() && "Expect to get a valid array type");
15126     Type = Type->getAsArrayTypeUnsafe()->getElementType().getCanonicalType();
15127   }
15128   // Find all user-defined mappers with the given MapperId.
15129   SmallVector<UnresolvedSet<8>, 4> Lookups;
15130   LookupResult Lookup(SemaRef, MapperId, Sema::LookupOMPMapperName);
15131   Lookup.suppressDiagnostics();
15132   if (S) {
15133     while (S && SemaRef.LookupParsedName(Lookup, S, &MapperIdScopeSpec)) {
15134       NamedDecl *D = Lookup.getRepresentativeDecl();
15135       while (S && !S->isDeclScope(D))
15136         S = S->getParent();
15137       if (S)
15138         S = S->getParent();
15139       Lookups.emplace_back();
15140       Lookups.back().append(Lookup.begin(), Lookup.end());
15141       Lookup.clear();
15142     }
15143   } else if (auto *ULE = cast_or_null<UnresolvedLookupExpr>(UnresolvedMapper)) {
15144     // Extract the user-defined mappers with the given MapperId.
15145     Lookups.push_back(UnresolvedSet<8>());
15146     for (NamedDecl *D : ULE->decls()) {
15147       auto *DMD = cast<OMPDeclareMapperDecl>(D);
15148       assert(DMD && "Expect valid OMPDeclareMapperDecl during instantiation.");
15149       Lookups.back().addDecl(DMD);
15150     }
15151   }
15152   // Defer the lookup for dependent types. The results will be passed through
15153   // UnresolvedMapper on instantiation.
15154   if (SemaRef.CurContext->isDependentContext() || Type->isDependentType() ||
15155       Type->isInstantiationDependentType() ||
15156       Type->containsUnexpandedParameterPack() ||
15157       filterLookupForUDReductionAndMapper<bool>(Lookups, [](ValueDecl *D) {
15158         return !D->isInvalidDecl() &&
15159                (D->getType()->isDependentType() ||
15160                 D->getType()->isInstantiationDependentType() ||
15161                 D->getType()->containsUnexpandedParameterPack());
15162       })) {
15163     UnresolvedSet<8> URS;
15164     for (const UnresolvedSet<8> &Set : Lookups) {
15165       if (Set.empty())
15166         continue;
15167       URS.append(Set.begin(), Set.end());
15168     }
15169     return UnresolvedLookupExpr::Create(
15170         SemaRef.Context, /*NamingClass=*/nullptr,
15171         MapperIdScopeSpec.getWithLocInContext(SemaRef.Context), MapperId,
15172         /*ADL=*/false, /*Overloaded=*/true, URS.begin(), URS.end());
15173   }
15174   SourceLocation Loc = MapperId.getLoc();
15175   // [OpenMP 5.0], 2.19.7.3 declare mapper Directive, Restrictions
15176   //  The type must be of struct, union or class type in C and C++
15177   if (!Type->isStructureOrClassType() && !Type->isUnionType() &&
15178       (MapperIdScopeSpec.isSet() || MapperId.getAsString() != "default")) {
15179     SemaRef.Diag(Loc, diag::err_omp_mapper_wrong_type);
15180     return ExprError();
15181   }
15182   // Perform argument dependent lookup.
15183   if (SemaRef.getLangOpts().CPlusPlus && !MapperIdScopeSpec.isSet())
15184     argumentDependentLookup(SemaRef, MapperId, Loc, Type, Lookups);
15185   // Return the first user-defined mapper with the desired type.
15186   if (auto *VD = filterLookupForUDReductionAndMapper<ValueDecl *>(
15187           Lookups, [&SemaRef, Type](ValueDecl *D) -> ValueDecl * {
15188             if (!D->isInvalidDecl() &&
15189                 SemaRef.Context.hasSameType(D->getType(), Type))
15190               return D;
15191             return nullptr;
15192           }))
15193     return SemaRef.BuildDeclRefExpr(VD, Type, VK_LValue, Loc);
15194   // Find the first user-defined mapper with a type derived from the desired
15195   // type.
15196   if (auto *VD = filterLookupForUDReductionAndMapper<ValueDecl *>(
15197           Lookups, [&SemaRef, Type, Loc](ValueDecl *D) -> ValueDecl * {
15198             if (!D->isInvalidDecl() &&
15199                 SemaRef.IsDerivedFrom(Loc, Type, D->getType()) &&
15200                 !Type.isMoreQualifiedThan(D->getType()))
15201               return D;
15202             return nullptr;
15203           })) {
15204     CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
15205                        /*DetectVirtual=*/false);
15206     if (SemaRef.IsDerivedFrom(Loc, Type, VD->getType(), Paths)) {
15207       if (!Paths.isAmbiguous(SemaRef.Context.getCanonicalType(
15208               VD->getType().getUnqualifiedType()))) {
15209         if (SemaRef.CheckBaseClassAccess(
15210                 Loc, VD->getType(), Type, Paths.front(),
15211                 /*DiagID=*/0) != Sema::AR_inaccessible) {
15212           return SemaRef.BuildDeclRefExpr(VD, Type, VK_LValue, Loc);
15213         }
15214       }
15215     }
15216   }
15217   // Report error if a mapper is specified, but cannot be found.
15218   if (MapperIdScopeSpec.isSet() || MapperId.getAsString() != "default") {
15219     SemaRef.Diag(Loc, diag::err_omp_invalid_mapper)
15220         << Type << MapperId.getName();
15221     return ExprError();
15222   }
15223   return ExprEmpty();
15224 }
15225 
15226 namespace {
15227 // Utility struct that gathers all the related lists associated with a mappable
15228 // expression.
15229 struct MappableVarListInfo {
15230   // The list of expressions.
15231   ArrayRef<Expr *> VarList;
15232   // The list of processed expressions.
15233   SmallVector<Expr *, 16> ProcessedVarList;
15234   // The mappble components for each expression.
15235   OMPClauseMappableExprCommon::MappableExprComponentLists VarComponents;
15236   // The base declaration of the variable.
15237   SmallVector<ValueDecl *, 16> VarBaseDeclarations;
15238   // The reference to the user-defined mapper associated with every expression.
15239   SmallVector<Expr *, 16> UDMapperList;
15240 
15241   MappableVarListInfo(ArrayRef<Expr *> VarList) : VarList(VarList) {
15242     // We have a list of components and base declarations for each entry in the
15243     // variable list.
15244     VarComponents.reserve(VarList.size());
15245     VarBaseDeclarations.reserve(VarList.size());
15246   }
15247 };
15248 }
15249 
15250 // Check the validity of the provided variable list for the provided clause kind
15251 // \a CKind. In the check process the valid expressions, mappable expression
15252 // components, variables, and user-defined mappers are extracted and used to
15253 // fill \a ProcessedVarList, \a VarComponents, \a VarBaseDeclarations, and \a
15254 // UDMapperList in MVLI. \a MapType, \a IsMapTypeImplicit, \a MapperIdScopeSpec,
15255 // and \a MapperId are expected to be valid if the clause kind is 'map'.
15256 static void checkMappableExpressionList(
15257     Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind,
15258     MappableVarListInfo &MVLI, SourceLocation StartLoc,
15259     CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId,
15260     ArrayRef<Expr *> UnresolvedMappers,
15261     OpenMPMapClauseKind MapType = OMPC_MAP_unknown,
15262     bool IsMapTypeImplicit = false) {
15263   // We only expect mappable expressions in 'to', 'from', and 'map' clauses.
15264   assert((CKind == OMPC_map || CKind == OMPC_to || CKind == OMPC_from) &&
15265          "Unexpected clause kind with mappable expressions!");
15266 
15267   // If the identifier of user-defined mapper is not specified, it is "default".
15268   // We do not change the actual name in this clause to distinguish whether a
15269   // mapper is specified explicitly, i.e., it is not explicitly specified when
15270   // MapperId.getName() is empty.
15271   if (!MapperId.getName() || MapperId.getName().isEmpty()) {
15272     auto &DeclNames = SemaRef.getASTContext().DeclarationNames;
15273     MapperId.setName(DeclNames.getIdentifier(
15274         &SemaRef.getASTContext().Idents.get("default")));
15275   }
15276 
15277   // Iterators to find the current unresolved mapper expression.
15278   auto UMIt = UnresolvedMappers.begin(), UMEnd = UnresolvedMappers.end();
15279   bool UpdateUMIt = false;
15280   Expr *UnresolvedMapper = nullptr;
15281 
15282   // Keep track of the mappable components and base declarations in this clause.
15283   // Each entry in the list is going to have a list of components associated. We
15284   // record each set of the components so that we can build the clause later on.
15285   // In the end we should have the same amount of declarations and component
15286   // lists.
15287 
15288   for (Expr *RE : MVLI.VarList) {
15289     assert(RE && "Null expr in omp to/from/map clause");
15290     SourceLocation ELoc = RE->getExprLoc();
15291 
15292     // Find the current unresolved mapper expression.
15293     if (UpdateUMIt && UMIt != UMEnd) {
15294       UMIt++;
15295       assert(
15296           UMIt != UMEnd &&
15297           "Expect the size of UnresolvedMappers to match with that of VarList");
15298     }
15299     UpdateUMIt = true;
15300     if (UMIt != UMEnd)
15301       UnresolvedMapper = *UMIt;
15302 
15303     const Expr *VE = RE->IgnoreParenLValueCasts();
15304 
15305     if (VE->isValueDependent() || VE->isTypeDependent() ||
15306         VE->isInstantiationDependent() ||
15307         VE->containsUnexpandedParameterPack()) {
15308       // Try to find the associated user-defined mapper.
15309       ExprResult ER = buildUserDefinedMapperRef(
15310           SemaRef, DSAS->getCurScope(), MapperIdScopeSpec, MapperId,
15311           VE->getType().getCanonicalType(), UnresolvedMapper);
15312       if (ER.isInvalid())
15313         continue;
15314       MVLI.UDMapperList.push_back(ER.get());
15315       // We can only analyze this information once the missing information is
15316       // resolved.
15317       MVLI.ProcessedVarList.push_back(RE);
15318       continue;
15319     }
15320 
15321     Expr *SimpleExpr = RE->IgnoreParenCasts();
15322 
15323     if (!RE->IgnoreParenImpCasts()->isLValue()) {
15324       SemaRef.Diag(ELoc,
15325                    diag::err_omp_expected_named_var_member_or_array_expression)
15326           << RE->getSourceRange();
15327       continue;
15328     }
15329 
15330     OMPClauseMappableExprCommon::MappableExprComponentList CurComponents;
15331     ValueDecl *CurDeclaration = nullptr;
15332 
15333     // Obtain the array or member expression bases if required. Also, fill the
15334     // components array with all the components identified in the process.
15335     const Expr *BE = checkMapClauseExpressionBase(
15336         SemaRef, SimpleExpr, CurComponents, CKind, /*NoDiagnose=*/false);
15337     if (!BE)
15338       continue;
15339 
15340     assert(!CurComponents.empty() &&
15341            "Invalid mappable expression information.");
15342 
15343     if (const auto *TE = dyn_cast<CXXThisExpr>(BE)) {
15344       // Add store "this" pointer to class in DSAStackTy for future checking
15345       DSAS->addMappedClassesQualTypes(TE->getType());
15346       // Try to find the associated user-defined mapper.
15347       ExprResult ER = buildUserDefinedMapperRef(
15348           SemaRef, DSAS->getCurScope(), MapperIdScopeSpec, MapperId,
15349           VE->getType().getCanonicalType(), UnresolvedMapper);
15350       if (ER.isInvalid())
15351         continue;
15352       MVLI.UDMapperList.push_back(ER.get());
15353       // Skip restriction checking for variable or field declarations
15354       MVLI.ProcessedVarList.push_back(RE);
15355       MVLI.VarComponents.resize(MVLI.VarComponents.size() + 1);
15356       MVLI.VarComponents.back().append(CurComponents.begin(),
15357                                        CurComponents.end());
15358       MVLI.VarBaseDeclarations.push_back(nullptr);
15359       continue;
15360     }
15361 
15362     // For the following checks, we rely on the base declaration which is
15363     // expected to be associated with the last component. The declaration is
15364     // expected to be a variable or a field (if 'this' is being mapped).
15365     CurDeclaration = CurComponents.back().getAssociatedDeclaration();
15366     assert(CurDeclaration && "Null decl on map clause.");
15367     assert(
15368         CurDeclaration->isCanonicalDecl() &&
15369         "Expecting components to have associated only canonical declarations.");
15370 
15371     auto *VD = dyn_cast<VarDecl>(CurDeclaration);
15372     const auto *FD = dyn_cast<FieldDecl>(CurDeclaration);
15373 
15374     assert((VD || FD) && "Only variables or fields are expected here!");
15375     (void)FD;
15376 
15377     // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.10]
15378     // threadprivate variables cannot appear in a map clause.
15379     // OpenMP 4.5 [2.10.5, target update Construct]
15380     // threadprivate variables cannot appear in a from clause.
15381     if (VD && DSAS->isThreadPrivate(VD)) {
15382       DSAStackTy::DSAVarData DVar = DSAS->getTopDSA(VD, /*FromParent=*/false);
15383       SemaRef.Diag(ELoc, diag::err_omp_threadprivate_in_clause)
15384           << getOpenMPClauseName(CKind);
15385       reportOriginalDsa(SemaRef, DSAS, VD, DVar);
15386       continue;
15387     }
15388 
15389     // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.9]
15390     //  A list item cannot appear in both a map clause and a data-sharing
15391     //  attribute clause on the same construct.
15392 
15393     // Check conflicts with other map clause expressions. We check the conflicts
15394     // with the current construct separately from the enclosing data
15395     // environment, because the restrictions are different. We only have to
15396     // check conflicts across regions for the map clauses.
15397     if (checkMapConflicts(SemaRef, DSAS, CurDeclaration, SimpleExpr,
15398                           /*CurrentRegionOnly=*/true, CurComponents, CKind))
15399       break;
15400     if (CKind == OMPC_map &&
15401         checkMapConflicts(SemaRef, DSAS, CurDeclaration, SimpleExpr,
15402                           /*CurrentRegionOnly=*/false, CurComponents, CKind))
15403       break;
15404 
15405     // OpenMP 4.5 [2.10.5, target update Construct]
15406     // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C++, p.1]
15407     //  If the type of a list item is a reference to a type T then the type will
15408     //  be considered to be T for all purposes of this clause.
15409     auto I = llvm::find_if(
15410         CurComponents,
15411         [](const OMPClauseMappableExprCommon::MappableComponent &MC) {
15412           return MC.getAssociatedDeclaration();
15413         });
15414     assert(I != CurComponents.end() && "Null decl on map clause.");
15415     QualType Type =
15416         I->getAssociatedDeclaration()->getType().getNonReferenceType();
15417 
15418     // OpenMP 4.5 [2.10.5, target update Construct, Restrictions, p.4]
15419     // A list item in a to or from clause must have a mappable type.
15420     // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.9]
15421     //  A list item must have a mappable type.
15422     if (!checkTypeMappable(VE->getExprLoc(), VE->getSourceRange(), SemaRef,
15423                            DSAS, Type))
15424       continue;
15425 
15426     if (CKind == OMPC_map) {
15427       // target enter data
15428       // OpenMP [2.10.2, Restrictions, p. 99]
15429       // A map-type must be specified in all map clauses and must be either
15430       // to or alloc.
15431       OpenMPDirectiveKind DKind = DSAS->getCurrentDirective();
15432       if (DKind == OMPD_target_enter_data &&
15433           !(MapType == OMPC_MAP_to || MapType == OMPC_MAP_alloc)) {
15434         SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive)
15435             << (IsMapTypeImplicit ? 1 : 0)
15436             << getOpenMPSimpleClauseTypeName(OMPC_map, MapType)
15437             << getOpenMPDirectiveName(DKind);
15438         continue;
15439       }
15440 
15441       // target exit_data
15442       // OpenMP [2.10.3, Restrictions, p. 102]
15443       // A map-type must be specified in all map clauses and must be either
15444       // from, release, or delete.
15445       if (DKind == OMPD_target_exit_data &&
15446           !(MapType == OMPC_MAP_from || MapType == OMPC_MAP_release ||
15447             MapType == OMPC_MAP_delete)) {
15448         SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive)
15449             << (IsMapTypeImplicit ? 1 : 0)
15450             << getOpenMPSimpleClauseTypeName(OMPC_map, MapType)
15451             << getOpenMPDirectiveName(DKind);
15452         continue;
15453       }
15454 
15455       // OpenMP 4.5 [2.15.5.1, Restrictions, p.3]
15456       // A list item cannot appear in both a map clause and a data-sharing
15457       // attribute clause on the same construct
15458       //
15459       // OpenMP 5.0 [2.19.7.1, Restrictions, p.7]
15460       // A list item cannot appear in both a map clause and a data-sharing
15461       // attribute clause on the same construct unless the construct is a
15462       // combined construct.
15463       if (VD && ((SemaRef.LangOpts.OpenMP <= 45 &&
15464                   isOpenMPTargetExecutionDirective(DKind)) ||
15465                  DKind == OMPD_target)) {
15466         DSAStackTy::DSAVarData DVar = DSAS->getTopDSA(VD, /*FromParent=*/false);
15467         if (isOpenMPPrivate(DVar.CKind)) {
15468           SemaRef.Diag(ELoc, diag::err_omp_variable_in_given_clause_and_dsa)
15469               << getOpenMPClauseName(DVar.CKind)
15470               << getOpenMPClauseName(OMPC_map)
15471               << getOpenMPDirectiveName(DSAS->getCurrentDirective());
15472           reportOriginalDsa(SemaRef, DSAS, CurDeclaration, DVar);
15473           continue;
15474         }
15475       }
15476     }
15477 
15478     // Try to find the associated user-defined mapper.
15479     ExprResult ER = buildUserDefinedMapperRef(
15480         SemaRef, DSAS->getCurScope(), MapperIdScopeSpec, MapperId,
15481         Type.getCanonicalType(), UnresolvedMapper);
15482     if (ER.isInvalid())
15483       continue;
15484     MVLI.UDMapperList.push_back(ER.get());
15485 
15486     // Save the current expression.
15487     MVLI.ProcessedVarList.push_back(RE);
15488 
15489     // Store the components in the stack so that they can be used to check
15490     // against other clauses later on.
15491     DSAS->addMappableExpressionComponents(CurDeclaration, CurComponents,
15492                                           /*WhereFoundClauseKind=*/OMPC_map);
15493 
15494     // Save the components and declaration to create the clause. For purposes of
15495     // the clause creation, any component list that has has base 'this' uses
15496     // null as base declaration.
15497     MVLI.VarComponents.resize(MVLI.VarComponents.size() + 1);
15498     MVLI.VarComponents.back().append(CurComponents.begin(),
15499                                      CurComponents.end());
15500     MVLI.VarBaseDeclarations.push_back(isa<MemberExpr>(BE) ? nullptr
15501                                                            : CurDeclaration);
15502   }
15503 }
15504 
15505 OMPClause *Sema::ActOnOpenMPMapClause(
15506     ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
15507     ArrayRef<SourceLocation> MapTypeModifiersLoc,
15508     CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId,
15509     OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, SourceLocation MapLoc,
15510     SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
15511     const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
15512   OpenMPMapModifierKind Modifiers[] = {OMPC_MAP_MODIFIER_unknown,
15513                                        OMPC_MAP_MODIFIER_unknown,
15514                                        OMPC_MAP_MODIFIER_unknown};
15515   SourceLocation ModifiersLoc[OMPMapClause::NumberOfModifiers];
15516 
15517   // Process map-type-modifiers, flag errors for duplicate modifiers.
15518   unsigned Count = 0;
15519   for (unsigned I = 0, E = MapTypeModifiers.size(); I < E; ++I) {
15520     if (MapTypeModifiers[I] != OMPC_MAP_MODIFIER_unknown &&
15521         llvm::find(Modifiers, MapTypeModifiers[I]) != std::end(Modifiers)) {
15522       Diag(MapTypeModifiersLoc[I], diag::err_omp_duplicate_map_type_modifier);
15523       continue;
15524     }
15525     assert(Count < OMPMapClause::NumberOfModifiers &&
15526            "Modifiers exceed the allowed number of map type modifiers");
15527     Modifiers[Count] = MapTypeModifiers[I];
15528     ModifiersLoc[Count] = MapTypeModifiersLoc[I];
15529     ++Count;
15530   }
15531 
15532   MappableVarListInfo MVLI(VarList);
15533   checkMappableExpressionList(*this, DSAStack, OMPC_map, MVLI, Locs.StartLoc,
15534                               MapperIdScopeSpec, MapperId, UnresolvedMappers,
15535                               MapType, IsMapTypeImplicit);
15536 
15537   // We need to produce a map clause even if we don't have variables so that
15538   // other diagnostics related with non-existing map clauses are accurate.
15539   return OMPMapClause::Create(Context, Locs, MVLI.ProcessedVarList,
15540                               MVLI.VarBaseDeclarations, MVLI.VarComponents,
15541                               MVLI.UDMapperList, Modifiers, ModifiersLoc,
15542                               MapperIdScopeSpec.getWithLocInContext(Context),
15543                               MapperId, MapType, IsMapTypeImplicit, MapLoc);
15544 }
15545 
15546 QualType Sema::ActOnOpenMPDeclareReductionType(SourceLocation TyLoc,
15547                                                TypeResult ParsedType) {
15548   assert(ParsedType.isUsable());
15549 
15550   QualType ReductionType = GetTypeFromParser(ParsedType.get());
15551   if (ReductionType.isNull())
15552     return QualType();
15553 
15554   // [OpenMP 4.0], 2.15 declare reduction Directive, Restrictions, C\C++
15555   // A type name in a declare reduction directive cannot be a function type, an
15556   // array type, a reference type, or a type qualified with const, volatile or
15557   // restrict.
15558   if (ReductionType.hasQualifiers()) {
15559     Diag(TyLoc, diag::err_omp_reduction_wrong_type) << 0;
15560     return QualType();
15561   }
15562 
15563   if (ReductionType->isFunctionType()) {
15564     Diag(TyLoc, diag::err_omp_reduction_wrong_type) << 1;
15565     return QualType();
15566   }
15567   if (ReductionType->isReferenceType()) {
15568     Diag(TyLoc, diag::err_omp_reduction_wrong_type) << 2;
15569     return QualType();
15570   }
15571   if (ReductionType->isArrayType()) {
15572     Diag(TyLoc, diag::err_omp_reduction_wrong_type) << 3;
15573     return QualType();
15574   }
15575   return ReductionType;
15576 }
15577 
15578 Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareReductionDirectiveStart(
15579     Scope *S, DeclContext *DC, DeclarationName Name,
15580     ArrayRef<std::pair<QualType, SourceLocation>> ReductionTypes,
15581     AccessSpecifier AS, Decl *PrevDeclInScope) {
15582   SmallVector<Decl *, 8> Decls;
15583   Decls.reserve(ReductionTypes.size());
15584 
15585   LookupResult Lookup(*this, Name, SourceLocation(), LookupOMPReductionName,
15586                       forRedeclarationInCurContext());
15587   // [OpenMP 4.0], 2.15 declare reduction Directive, Restrictions
15588   // A reduction-identifier may not be re-declared in the current scope for the
15589   // same type or for a type that is compatible according to the base language
15590   // rules.
15591   llvm::DenseMap<QualType, SourceLocation> PreviousRedeclTypes;
15592   OMPDeclareReductionDecl *PrevDRD = nullptr;
15593   bool InCompoundScope = true;
15594   if (S != nullptr) {
15595     // Find previous declaration with the same name not referenced in other
15596     // declarations.
15597     FunctionScopeInfo *ParentFn = getEnclosingFunction();
15598     InCompoundScope =
15599         (ParentFn != nullptr) && !ParentFn->CompoundScopes.empty();
15600     LookupName(Lookup, S);
15601     FilterLookupForScope(Lookup, DC, S, /*ConsiderLinkage=*/false,
15602                          /*AllowInlineNamespace=*/false);
15603     llvm::DenseMap<OMPDeclareReductionDecl *, bool> UsedAsPrevious;
15604     LookupResult::Filter Filter = Lookup.makeFilter();
15605     while (Filter.hasNext()) {
15606       auto *PrevDecl = cast<OMPDeclareReductionDecl>(Filter.next());
15607       if (InCompoundScope) {
15608         auto I = UsedAsPrevious.find(PrevDecl);
15609         if (I == UsedAsPrevious.end())
15610           UsedAsPrevious[PrevDecl] = false;
15611         if (OMPDeclareReductionDecl *D = PrevDecl->getPrevDeclInScope())
15612           UsedAsPrevious[D] = true;
15613       }
15614       PreviousRedeclTypes[PrevDecl->getType().getCanonicalType()] =
15615           PrevDecl->getLocation();
15616     }
15617     Filter.done();
15618     if (InCompoundScope) {
15619       for (const auto &PrevData : UsedAsPrevious) {
15620         if (!PrevData.second) {
15621           PrevDRD = PrevData.first;
15622           break;
15623         }
15624       }
15625     }
15626   } else if (PrevDeclInScope != nullptr) {
15627     auto *PrevDRDInScope = PrevDRD =
15628         cast<OMPDeclareReductionDecl>(PrevDeclInScope);
15629     do {
15630       PreviousRedeclTypes[PrevDRDInScope->getType().getCanonicalType()] =
15631           PrevDRDInScope->getLocation();
15632       PrevDRDInScope = PrevDRDInScope->getPrevDeclInScope();
15633     } while (PrevDRDInScope != nullptr);
15634   }
15635   for (const auto &TyData : ReductionTypes) {
15636     const auto I = PreviousRedeclTypes.find(TyData.first.getCanonicalType());
15637     bool Invalid = false;
15638     if (I != PreviousRedeclTypes.end()) {
15639       Diag(TyData.second, diag::err_omp_declare_reduction_redefinition)
15640           << TyData.first;
15641       Diag(I->second, diag::note_previous_definition);
15642       Invalid = true;
15643     }
15644     PreviousRedeclTypes[TyData.first.getCanonicalType()] = TyData.second;
15645     auto *DRD = OMPDeclareReductionDecl::Create(Context, DC, TyData.second,
15646                                                 Name, TyData.first, PrevDRD);
15647     DC->addDecl(DRD);
15648     DRD->setAccess(AS);
15649     Decls.push_back(DRD);
15650     if (Invalid)
15651       DRD->setInvalidDecl();
15652     else
15653       PrevDRD = DRD;
15654   }
15655 
15656   return DeclGroupPtrTy::make(
15657       DeclGroupRef::Create(Context, Decls.begin(), Decls.size()));
15658 }
15659 
15660 void Sema::ActOnOpenMPDeclareReductionCombinerStart(Scope *S, Decl *D) {
15661   auto *DRD = cast<OMPDeclareReductionDecl>(D);
15662 
15663   // Enter new function scope.
15664   PushFunctionScope();
15665   setFunctionHasBranchProtectedScope();
15666   getCurFunction()->setHasOMPDeclareReductionCombiner();
15667 
15668   if (S != nullptr)
15669     PushDeclContext(S, DRD);
15670   else
15671     CurContext = DRD;
15672 
15673   PushExpressionEvaluationContext(
15674       ExpressionEvaluationContext::PotentiallyEvaluated);
15675 
15676   QualType ReductionType = DRD->getType();
15677   // Create 'T* omp_parm;T omp_in;'. All references to 'omp_in' will
15678   // be replaced by '*omp_parm' during codegen. This required because 'omp_in'
15679   // uses semantics of argument handles by value, but it should be passed by
15680   // reference. C lang does not support references, so pass all parameters as
15681   // pointers.
15682   // Create 'T omp_in;' variable.
15683   VarDecl *OmpInParm =
15684       buildVarDecl(*this, D->getLocation(), ReductionType, "omp_in");
15685   // Create 'T* omp_parm;T omp_out;'. All references to 'omp_out' will
15686   // be replaced by '*omp_parm' during codegen. This required because 'omp_out'
15687   // uses semantics of argument handles by value, but it should be passed by
15688   // reference. C lang does not support references, so pass all parameters as
15689   // pointers.
15690   // Create 'T omp_out;' variable.
15691   VarDecl *OmpOutParm =
15692       buildVarDecl(*this, D->getLocation(), ReductionType, "omp_out");
15693   if (S != nullptr) {
15694     PushOnScopeChains(OmpInParm, S);
15695     PushOnScopeChains(OmpOutParm, S);
15696   } else {
15697     DRD->addDecl(OmpInParm);
15698     DRD->addDecl(OmpOutParm);
15699   }
15700   Expr *InE =
15701       ::buildDeclRefExpr(*this, OmpInParm, ReductionType, D->getLocation());
15702   Expr *OutE =
15703       ::buildDeclRefExpr(*this, OmpOutParm, ReductionType, D->getLocation());
15704   DRD->setCombinerData(InE, OutE);
15705 }
15706 
15707 void Sema::ActOnOpenMPDeclareReductionCombinerEnd(Decl *D, Expr *Combiner) {
15708   auto *DRD = cast<OMPDeclareReductionDecl>(D);
15709   DiscardCleanupsInEvaluationContext();
15710   PopExpressionEvaluationContext();
15711 
15712   PopDeclContext();
15713   PopFunctionScopeInfo();
15714 
15715   if (Combiner != nullptr)
15716     DRD->setCombiner(Combiner);
15717   else
15718     DRD->setInvalidDecl();
15719 }
15720 
15721 VarDecl *Sema::ActOnOpenMPDeclareReductionInitializerStart(Scope *S, Decl *D) {
15722   auto *DRD = cast<OMPDeclareReductionDecl>(D);
15723 
15724   // Enter new function scope.
15725   PushFunctionScope();
15726   setFunctionHasBranchProtectedScope();
15727 
15728   if (S != nullptr)
15729     PushDeclContext(S, DRD);
15730   else
15731     CurContext = DRD;
15732 
15733   PushExpressionEvaluationContext(
15734       ExpressionEvaluationContext::PotentiallyEvaluated);
15735 
15736   QualType ReductionType = DRD->getType();
15737   // Create 'T* omp_parm;T omp_priv;'. All references to 'omp_priv' will
15738   // be replaced by '*omp_parm' during codegen. This required because 'omp_priv'
15739   // uses semantics of argument handles by value, but it should be passed by
15740   // reference. C lang does not support references, so pass all parameters as
15741   // pointers.
15742   // Create 'T omp_priv;' variable.
15743   VarDecl *OmpPrivParm =
15744       buildVarDecl(*this, D->getLocation(), ReductionType, "omp_priv");
15745   // Create 'T* omp_parm;T omp_orig;'. All references to 'omp_orig' will
15746   // be replaced by '*omp_parm' during codegen. This required because 'omp_orig'
15747   // uses semantics of argument handles by value, but it should be passed by
15748   // reference. C lang does not support references, so pass all parameters as
15749   // pointers.
15750   // Create 'T omp_orig;' variable.
15751   VarDecl *OmpOrigParm =
15752       buildVarDecl(*this, D->getLocation(), ReductionType, "omp_orig");
15753   if (S != nullptr) {
15754     PushOnScopeChains(OmpPrivParm, S);
15755     PushOnScopeChains(OmpOrigParm, S);
15756   } else {
15757     DRD->addDecl(OmpPrivParm);
15758     DRD->addDecl(OmpOrigParm);
15759   }
15760   Expr *OrigE =
15761       ::buildDeclRefExpr(*this, OmpOrigParm, ReductionType, D->getLocation());
15762   Expr *PrivE =
15763       ::buildDeclRefExpr(*this, OmpPrivParm, ReductionType, D->getLocation());
15764   DRD->setInitializerData(OrigE, PrivE);
15765   return OmpPrivParm;
15766 }
15767 
15768 void Sema::ActOnOpenMPDeclareReductionInitializerEnd(Decl *D, Expr *Initializer,
15769                                                      VarDecl *OmpPrivParm) {
15770   auto *DRD = cast<OMPDeclareReductionDecl>(D);
15771   DiscardCleanupsInEvaluationContext();
15772   PopExpressionEvaluationContext();
15773 
15774   PopDeclContext();
15775   PopFunctionScopeInfo();
15776 
15777   if (Initializer != nullptr) {
15778     DRD->setInitializer(Initializer, OMPDeclareReductionDecl::CallInit);
15779   } else if (OmpPrivParm->hasInit()) {
15780     DRD->setInitializer(OmpPrivParm->getInit(),
15781                         OmpPrivParm->isDirectInit()
15782                             ? OMPDeclareReductionDecl::DirectInit
15783                             : OMPDeclareReductionDecl::CopyInit);
15784   } else {
15785     DRD->setInvalidDecl();
15786   }
15787 }
15788 
15789 Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareReductionDirectiveEnd(
15790     Scope *S, DeclGroupPtrTy DeclReductions, bool IsValid) {
15791   for (Decl *D : DeclReductions.get()) {
15792     if (IsValid) {
15793       if (S)
15794         PushOnScopeChains(cast<OMPDeclareReductionDecl>(D), S,
15795                           /*AddToContext=*/false);
15796     } else {
15797       D->setInvalidDecl();
15798     }
15799   }
15800   return DeclReductions;
15801 }
15802 
15803 TypeResult Sema::ActOnOpenMPDeclareMapperVarDecl(Scope *S, Declarator &D) {
15804   TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
15805   QualType T = TInfo->getType();
15806   if (D.isInvalidType())
15807     return true;
15808 
15809   if (getLangOpts().CPlusPlus) {
15810     // Check that there are no default arguments (C++ only).
15811     CheckExtraCXXDefaultArguments(D);
15812   }
15813 
15814   return CreateParsedType(T, TInfo);
15815 }
15816 
15817 QualType Sema::ActOnOpenMPDeclareMapperType(SourceLocation TyLoc,
15818                                             TypeResult ParsedType) {
15819   assert(ParsedType.isUsable() && "Expect usable parsed mapper type");
15820 
15821   QualType MapperType = GetTypeFromParser(ParsedType.get());
15822   assert(!MapperType.isNull() && "Expect valid mapper type");
15823 
15824   // [OpenMP 5.0], 2.19.7.3 declare mapper Directive, Restrictions
15825   //  The type must be of struct, union or class type in C and C++
15826   if (!MapperType->isStructureOrClassType() && !MapperType->isUnionType()) {
15827     Diag(TyLoc, diag::err_omp_mapper_wrong_type);
15828     return QualType();
15829   }
15830   return MapperType;
15831 }
15832 
15833 OMPDeclareMapperDecl *Sema::ActOnOpenMPDeclareMapperDirectiveStart(
15834     Scope *S, DeclContext *DC, DeclarationName Name, QualType MapperType,
15835     SourceLocation StartLoc, DeclarationName VN, AccessSpecifier AS,
15836     Decl *PrevDeclInScope) {
15837   LookupResult Lookup(*this, Name, SourceLocation(), LookupOMPMapperName,
15838                       forRedeclarationInCurContext());
15839   // [OpenMP 5.0], 2.19.7.3 declare mapper Directive, Restrictions
15840   //  A mapper-identifier may not be redeclared in the current scope for the
15841   //  same type or for a type that is compatible according to the base language
15842   //  rules.
15843   llvm::DenseMap<QualType, SourceLocation> PreviousRedeclTypes;
15844   OMPDeclareMapperDecl *PrevDMD = nullptr;
15845   bool InCompoundScope = true;
15846   if (S != nullptr) {
15847     // Find previous declaration with the same name not referenced in other
15848     // declarations.
15849     FunctionScopeInfo *ParentFn = getEnclosingFunction();
15850     InCompoundScope =
15851         (ParentFn != nullptr) && !ParentFn->CompoundScopes.empty();
15852     LookupName(Lookup, S);
15853     FilterLookupForScope(Lookup, DC, S, /*ConsiderLinkage=*/false,
15854                          /*AllowInlineNamespace=*/false);
15855     llvm::DenseMap<OMPDeclareMapperDecl *, bool> UsedAsPrevious;
15856     LookupResult::Filter Filter = Lookup.makeFilter();
15857     while (Filter.hasNext()) {
15858       auto *PrevDecl = cast<OMPDeclareMapperDecl>(Filter.next());
15859       if (InCompoundScope) {
15860         auto I = UsedAsPrevious.find(PrevDecl);
15861         if (I == UsedAsPrevious.end())
15862           UsedAsPrevious[PrevDecl] = false;
15863         if (OMPDeclareMapperDecl *D = PrevDecl->getPrevDeclInScope())
15864           UsedAsPrevious[D] = true;
15865       }
15866       PreviousRedeclTypes[PrevDecl->getType().getCanonicalType()] =
15867           PrevDecl->getLocation();
15868     }
15869     Filter.done();
15870     if (InCompoundScope) {
15871       for (const auto &PrevData : UsedAsPrevious) {
15872         if (!PrevData.second) {
15873           PrevDMD = PrevData.first;
15874           break;
15875         }
15876       }
15877     }
15878   } else if (PrevDeclInScope) {
15879     auto *PrevDMDInScope = PrevDMD =
15880         cast<OMPDeclareMapperDecl>(PrevDeclInScope);
15881     do {
15882       PreviousRedeclTypes[PrevDMDInScope->getType().getCanonicalType()] =
15883           PrevDMDInScope->getLocation();
15884       PrevDMDInScope = PrevDMDInScope->getPrevDeclInScope();
15885     } while (PrevDMDInScope != nullptr);
15886   }
15887   const auto I = PreviousRedeclTypes.find(MapperType.getCanonicalType());
15888   bool Invalid = false;
15889   if (I != PreviousRedeclTypes.end()) {
15890     Diag(StartLoc, diag::err_omp_declare_mapper_redefinition)
15891         << MapperType << Name;
15892     Diag(I->second, diag::note_previous_definition);
15893     Invalid = true;
15894   }
15895   auto *DMD = OMPDeclareMapperDecl::Create(Context, DC, StartLoc, Name,
15896                                            MapperType, VN, PrevDMD);
15897   DC->addDecl(DMD);
15898   DMD->setAccess(AS);
15899   if (Invalid)
15900     DMD->setInvalidDecl();
15901 
15902   // Enter new function scope.
15903   PushFunctionScope();
15904   setFunctionHasBranchProtectedScope();
15905 
15906   CurContext = DMD;
15907 
15908   return DMD;
15909 }
15910 
15911 void Sema::ActOnOpenMPDeclareMapperDirectiveVarDecl(OMPDeclareMapperDecl *DMD,
15912                                                     Scope *S,
15913                                                     QualType MapperType,
15914                                                     SourceLocation StartLoc,
15915                                                     DeclarationName VN) {
15916   VarDecl *VD = buildVarDecl(*this, StartLoc, MapperType, VN.getAsString());
15917   if (S)
15918     PushOnScopeChains(VD, S);
15919   else
15920     DMD->addDecl(VD);
15921   Expr *MapperVarRefExpr = buildDeclRefExpr(*this, VD, MapperType, StartLoc);
15922   DMD->setMapperVarRef(MapperVarRefExpr);
15923 }
15924 
15925 Sema::DeclGroupPtrTy
15926 Sema::ActOnOpenMPDeclareMapperDirectiveEnd(OMPDeclareMapperDecl *D, Scope *S,
15927                                            ArrayRef<OMPClause *> ClauseList) {
15928   PopDeclContext();
15929   PopFunctionScopeInfo();
15930 
15931   if (D) {
15932     if (S)
15933       PushOnScopeChains(D, S, /*AddToContext=*/false);
15934     D->CreateClauses(Context, ClauseList);
15935   }
15936 
15937   return DeclGroupPtrTy::make(DeclGroupRef(D));
15938 }
15939 
15940 OMPClause *Sema::ActOnOpenMPNumTeamsClause(Expr *NumTeams,
15941                                            SourceLocation StartLoc,
15942                                            SourceLocation LParenLoc,
15943                                            SourceLocation EndLoc) {
15944   Expr *ValExpr = NumTeams;
15945   Stmt *HelperValStmt = nullptr;
15946 
15947   // OpenMP [teams Constrcut, Restrictions]
15948   // The num_teams expression must evaluate to a positive integer value.
15949   if (!isNonNegativeIntegerValue(ValExpr, *this, OMPC_num_teams,
15950                                  /*StrictlyPositive=*/true))
15951     return nullptr;
15952 
15953   OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
15954   OpenMPDirectiveKind CaptureRegion =
15955       getOpenMPCaptureRegionForClause(DKind, OMPC_num_teams);
15956   if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
15957     ValExpr = MakeFullExpr(ValExpr).get();
15958     llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
15959     ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
15960     HelperValStmt = buildPreInits(Context, Captures);
15961   }
15962 
15963   return new (Context) OMPNumTeamsClause(ValExpr, HelperValStmt, CaptureRegion,
15964                                          StartLoc, LParenLoc, EndLoc);
15965 }
15966 
15967 OMPClause *Sema::ActOnOpenMPThreadLimitClause(Expr *ThreadLimit,
15968                                               SourceLocation StartLoc,
15969                                               SourceLocation LParenLoc,
15970                                               SourceLocation EndLoc) {
15971   Expr *ValExpr = ThreadLimit;
15972   Stmt *HelperValStmt = nullptr;
15973 
15974   // OpenMP [teams Constrcut, Restrictions]
15975   // The thread_limit expression must evaluate to a positive integer value.
15976   if (!isNonNegativeIntegerValue(ValExpr, *this, OMPC_thread_limit,
15977                                  /*StrictlyPositive=*/true))
15978     return nullptr;
15979 
15980   OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
15981   OpenMPDirectiveKind CaptureRegion =
15982       getOpenMPCaptureRegionForClause(DKind, OMPC_thread_limit);
15983   if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
15984     ValExpr = MakeFullExpr(ValExpr).get();
15985     llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
15986     ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
15987     HelperValStmt = buildPreInits(Context, Captures);
15988   }
15989 
15990   return new (Context) OMPThreadLimitClause(
15991       ValExpr, HelperValStmt, CaptureRegion, StartLoc, LParenLoc, EndLoc);
15992 }
15993 
15994 OMPClause *Sema::ActOnOpenMPPriorityClause(Expr *Priority,
15995                                            SourceLocation StartLoc,
15996                                            SourceLocation LParenLoc,
15997                                            SourceLocation EndLoc) {
15998   Expr *ValExpr = Priority;
15999   Stmt *HelperValStmt = nullptr;
16000   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
16001 
16002   // OpenMP [2.9.1, task Constrcut]
16003   // The priority-value is a non-negative numerical scalar expression.
16004   if (!isNonNegativeIntegerValue(
16005           ValExpr, *this, OMPC_priority,
16006           /*StrictlyPositive=*/false, /*BuildCapture=*/true,
16007           DSAStack->getCurrentDirective(), &CaptureRegion, &HelperValStmt))
16008     return nullptr;
16009 
16010   return new (Context) OMPPriorityClause(ValExpr, HelperValStmt, CaptureRegion,
16011                                          StartLoc, LParenLoc, EndLoc);
16012 }
16013 
16014 OMPClause *Sema::ActOnOpenMPGrainsizeClause(Expr *Grainsize,
16015                                             SourceLocation StartLoc,
16016                                             SourceLocation LParenLoc,
16017                                             SourceLocation EndLoc) {
16018   Expr *ValExpr = Grainsize;
16019   Stmt *HelperValStmt = nullptr;
16020   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
16021 
16022   // OpenMP [2.9.2, taskloop Constrcut]
16023   // The parameter of the grainsize clause must be a positive integer
16024   // expression.
16025   if (!isNonNegativeIntegerValue(
16026           ValExpr, *this, OMPC_grainsize,
16027           /*StrictlyPositive=*/true, /*BuildCapture=*/true,
16028           DSAStack->getCurrentDirective(), &CaptureRegion, &HelperValStmt))
16029     return nullptr;
16030 
16031   return new (Context) OMPGrainsizeClause(ValExpr, HelperValStmt, CaptureRegion,
16032                                           StartLoc, LParenLoc, EndLoc);
16033 }
16034 
16035 OMPClause *Sema::ActOnOpenMPNumTasksClause(Expr *NumTasks,
16036                                            SourceLocation StartLoc,
16037                                            SourceLocation LParenLoc,
16038                                            SourceLocation EndLoc) {
16039   Expr *ValExpr = NumTasks;
16040   Stmt *HelperValStmt = nullptr;
16041   OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
16042 
16043   // OpenMP [2.9.2, taskloop Constrcut]
16044   // The parameter of the num_tasks clause must be a positive integer
16045   // expression.
16046   if (!isNonNegativeIntegerValue(
16047           ValExpr, *this, OMPC_num_tasks,
16048           /*StrictlyPositive=*/true, /*BuildCapture=*/true,
16049           DSAStack->getCurrentDirective(), &CaptureRegion, &HelperValStmt))
16050     return nullptr;
16051 
16052   return new (Context) OMPNumTasksClause(ValExpr, HelperValStmt, CaptureRegion,
16053                                          StartLoc, LParenLoc, EndLoc);
16054 }
16055 
16056 OMPClause *Sema::ActOnOpenMPHintClause(Expr *Hint, SourceLocation StartLoc,
16057                                        SourceLocation LParenLoc,
16058                                        SourceLocation EndLoc) {
16059   // OpenMP [2.13.2, critical construct, Description]
16060   // ... where hint-expression is an integer constant expression that evaluates
16061   // to a valid lock hint.
16062   ExprResult HintExpr = VerifyPositiveIntegerConstantInClause(Hint, OMPC_hint);
16063   if (HintExpr.isInvalid())
16064     return nullptr;
16065   return new (Context)
16066       OMPHintClause(HintExpr.get(), StartLoc, LParenLoc, EndLoc);
16067 }
16068 
16069 OMPClause *Sema::ActOnOpenMPDistScheduleClause(
16070     OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
16071     SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc,
16072     SourceLocation EndLoc) {
16073   if (Kind == OMPC_DIST_SCHEDULE_unknown) {
16074     std::string Values;
16075     Values += "'";
16076     Values += getOpenMPSimpleClauseTypeName(OMPC_dist_schedule, 0);
16077     Values += "'";
16078     Diag(KindLoc, diag::err_omp_unexpected_clause_value)
16079         << Values << getOpenMPClauseName(OMPC_dist_schedule);
16080     return nullptr;
16081   }
16082   Expr *ValExpr = ChunkSize;
16083   Stmt *HelperValStmt = nullptr;
16084   if (ChunkSize) {
16085     if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() &&
16086         !ChunkSize->isInstantiationDependent() &&
16087         !ChunkSize->containsUnexpandedParameterPack()) {
16088       SourceLocation ChunkSizeLoc = ChunkSize->getBeginLoc();
16089       ExprResult Val =
16090           PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize);
16091       if (Val.isInvalid())
16092         return nullptr;
16093 
16094       ValExpr = Val.get();
16095 
16096       // OpenMP [2.7.1, Restrictions]
16097       //  chunk_size must be a loop invariant integer expression with a positive
16098       //  value.
16099       llvm::APSInt Result;
16100       if (ValExpr->isIntegerConstantExpr(Result, Context)) {
16101         if (Result.isSigned() && !Result.isStrictlyPositive()) {
16102           Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause)
16103               << "dist_schedule" << ChunkSize->getSourceRange();
16104           return nullptr;
16105         }
16106       } else if (getOpenMPCaptureRegionForClause(
16107                      DSAStack->getCurrentDirective(), OMPC_dist_schedule) !=
16108                      OMPD_unknown &&
16109                  !CurContext->isDependentContext()) {
16110         ValExpr = MakeFullExpr(ValExpr).get();
16111         llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
16112         ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
16113         HelperValStmt = buildPreInits(Context, Captures);
16114       }
16115     }
16116   }
16117 
16118   return new (Context)
16119       OMPDistScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc,
16120                             Kind, ValExpr, HelperValStmt);
16121 }
16122 
16123 OMPClause *Sema::ActOnOpenMPDefaultmapClause(
16124     OpenMPDefaultmapClauseModifier M, OpenMPDefaultmapClauseKind Kind,
16125     SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc,
16126     SourceLocation KindLoc, SourceLocation EndLoc) {
16127   // OpenMP 4.5 only supports 'defaultmap(tofrom: scalar)'
16128   if (M != OMPC_DEFAULTMAP_MODIFIER_tofrom || Kind != OMPC_DEFAULTMAP_scalar) {
16129     std::string Value;
16130     SourceLocation Loc;
16131     Value += "'";
16132     if (M != OMPC_DEFAULTMAP_MODIFIER_tofrom) {
16133       Value += getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
16134                                              OMPC_DEFAULTMAP_MODIFIER_tofrom);
16135       Loc = MLoc;
16136     } else {
16137       Value += getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
16138                                              OMPC_DEFAULTMAP_scalar);
16139       Loc = KindLoc;
16140     }
16141     Value += "'";
16142     Diag(Loc, diag::err_omp_unexpected_clause_value)
16143         << Value << getOpenMPClauseName(OMPC_defaultmap);
16144     return nullptr;
16145   }
16146   DSAStack->setDefaultDMAToFromScalar(StartLoc);
16147 
16148   return new (Context)
16149       OMPDefaultmapClause(StartLoc, LParenLoc, MLoc, KindLoc, EndLoc, Kind, M);
16150 }
16151 
16152 bool Sema::ActOnStartOpenMPDeclareTargetDirective(SourceLocation Loc) {
16153   DeclContext *CurLexicalContext = getCurLexicalContext();
16154   if (!CurLexicalContext->isFileContext() &&
16155       !CurLexicalContext->isExternCContext() &&
16156       !CurLexicalContext->isExternCXXContext() &&
16157       !isa<CXXRecordDecl>(CurLexicalContext) &&
16158       !isa<ClassTemplateDecl>(CurLexicalContext) &&
16159       !isa<ClassTemplatePartialSpecializationDecl>(CurLexicalContext) &&
16160       !isa<ClassTemplateSpecializationDecl>(CurLexicalContext)) {
16161     Diag(Loc, diag::err_omp_region_not_file_context);
16162     return false;
16163   }
16164   ++DeclareTargetNestingLevel;
16165   return true;
16166 }
16167 
16168 void Sema::ActOnFinishOpenMPDeclareTargetDirective() {
16169   assert(DeclareTargetNestingLevel > 0 &&
16170          "Unexpected ActOnFinishOpenMPDeclareTargetDirective");
16171   --DeclareTargetNestingLevel;
16172 }
16173 
16174 NamedDecl *
16175 Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec,
16176                                     const DeclarationNameInfo &Id,
16177                                     NamedDeclSetType &SameDirectiveDecls) {
16178   LookupResult Lookup(*this, Id, LookupOrdinaryName);
16179   LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
16180 
16181   if (Lookup.isAmbiguous())
16182     return nullptr;
16183   Lookup.suppressDiagnostics();
16184 
16185   if (!Lookup.isSingleResult()) {
16186     VarOrFuncDeclFilterCCC CCC(*this);
16187     if (TypoCorrection Corrected =
16188             CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC,
16189                         CTK_ErrorRecovery)) {
16190       diagnoseTypo(Corrected, PDiag(diag::err_undeclared_var_use_suggest)
16191                                   << Id.getName());
16192       checkDeclIsAllowedInOpenMPTarget(nullptr, Corrected.getCorrectionDecl());
16193       return nullptr;
16194     }
16195 
16196     Diag(Id.getLoc(), diag::err_undeclared_var_use) << Id.getName();
16197     return nullptr;
16198   }
16199 
16200   NamedDecl *ND = Lookup.getAsSingle<NamedDecl>();
16201   if (!isa<VarDecl>(ND) && !isa<FunctionDecl>(ND) &&
16202       !isa<FunctionTemplateDecl>(ND)) {
16203     Diag(Id.getLoc(), diag::err_omp_invalid_target_decl) << Id.getName();
16204     return nullptr;
16205   }
16206   if (!SameDirectiveDecls.insert(cast<NamedDecl>(ND->getCanonicalDecl())))
16207     Diag(Id.getLoc(), diag::err_omp_declare_target_multiple) << Id.getName();
16208   return ND;
16209 }
16210 
16211 void Sema::ActOnOpenMPDeclareTargetName(
16212     NamedDecl *ND, SourceLocation Loc, OMPDeclareTargetDeclAttr::MapTypeTy MT,
16213     OMPDeclareTargetDeclAttr::DevTypeTy DT) {
16214   assert((isa<VarDecl>(ND) || isa<FunctionDecl>(ND) ||
16215           isa<FunctionTemplateDecl>(ND)) &&
16216          "Expected variable, function or function template.");
16217 
16218   // Diagnose marking after use as it may lead to incorrect diagnosis and
16219   // codegen.
16220   if (LangOpts.OpenMP >= 50 &&
16221       (ND->isUsed(/*CheckUsedAttr=*/false) || ND->isReferenced()))
16222     Diag(Loc, diag::warn_omp_declare_target_after_first_use);
16223 
16224   Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
16225       OMPDeclareTargetDeclAttr::getDeviceType(cast<ValueDecl>(ND));
16226   if (DevTy.hasValue() && *DevTy != DT) {
16227     Diag(Loc, diag::err_omp_device_type_mismatch)
16228         << OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(DT)
16229         << OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(*DevTy);
16230     return;
16231   }
16232   Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
16233       OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(cast<ValueDecl>(ND));
16234   if (!Res) {
16235     auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(Context, MT, DT,
16236                                                        SourceRange(Loc, Loc));
16237     ND->addAttr(A);
16238     if (ASTMutationListener *ML = Context.getASTMutationListener())
16239       ML->DeclarationMarkedOpenMPDeclareTarget(ND, A);
16240     checkDeclIsAllowedInOpenMPTarget(nullptr, ND, Loc);
16241   } else if (*Res != MT) {
16242     Diag(Loc, diag::err_omp_declare_target_to_and_link) << ND;
16243   }
16244 }
16245 
16246 static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR,
16247                                      Sema &SemaRef, Decl *D) {
16248   if (!D || !isa<VarDecl>(D))
16249     return;
16250   auto *VD = cast<VarDecl>(D);
16251   Optional<OMPDeclareTargetDeclAttr::MapTypeTy> MapTy =
16252       OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
16253   if (SemaRef.LangOpts.OpenMP >= 50 &&
16254       (SemaRef.getCurLambda(/*IgnoreNonLambdaCapturingScope=*/true) ||
16255        SemaRef.getCurBlock() || SemaRef.getCurCapturedRegion()) &&
16256       VD->hasGlobalStorage()) {
16257     llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> MapTy =
16258         OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
16259     if (!MapTy || *MapTy != OMPDeclareTargetDeclAttr::MT_To) {
16260       // OpenMP 5.0, 2.12.7 declare target Directive, Restrictions
16261       // If a lambda declaration and definition appears between a
16262       // declare target directive and the matching end declare target
16263       // directive, all variables that are captured by the lambda
16264       // expression must also appear in a to clause.
16265       SemaRef.Diag(VD->getLocation(),
16266                    diag::err_omp_lambda_capture_in_declare_target_not_to);
16267       SemaRef.Diag(SL, diag::note_var_explicitly_captured_here)
16268           << VD << 0 << SR;
16269       return;
16270     }
16271   }
16272   if (MapTy.hasValue())
16273     return;
16274   SemaRef.Diag(VD->getLocation(), diag::warn_omp_not_in_target_context);
16275   SemaRef.Diag(SL, diag::note_used_here) << SR;
16276 }
16277 
16278 static bool checkValueDeclInTarget(SourceLocation SL, SourceRange SR,
16279                                    Sema &SemaRef, DSAStackTy *Stack,
16280                                    ValueDecl *VD) {
16281   return OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD) ||
16282          checkTypeMappable(SL, SR, SemaRef, Stack, VD->getType(),
16283                            /*FullCheck=*/false);
16284 }
16285 
16286 void Sema::checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D,
16287                                             SourceLocation IdLoc) {
16288   if (!D || D->isInvalidDecl())
16289     return;
16290   SourceRange SR = E ? E->getSourceRange() : D->getSourceRange();
16291   SourceLocation SL = E ? E->getBeginLoc() : D->getLocation();
16292   if (auto *VD = dyn_cast<VarDecl>(D)) {
16293     // Only global variables can be marked as declare target.
16294     if (!VD->isFileVarDecl() && !VD->isStaticLocal() &&
16295         !VD->isStaticDataMember())
16296       return;
16297     // 2.10.6: threadprivate variable cannot appear in a declare target
16298     // directive.
16299     if (DSAStack->isThreadPrivate(VD)) {
16300       Diag(SL, diag::err_omp_threadprivate_in_target);
16301       reportOriginalDsa(*this, DSAStack, VD, DSAStack->getTopDSA(VD, false));
16302       return;
16303     }
16304   }
16305   if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
16306     D = FTD->getTemplatedDecl();
16307   if (auto *FD = dyn_cast<FunctionDecl>(D)) {
16308     llvm::Optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
16309         OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(FD);
16310     if (IdLoc.isValid() && Res && *Res == OMPDeclareTargetDeclAttr::MT_Link) {
16311       Diag(IdLoc, diag::err_omp_function_in_link_clause);
16312       Diag(FD->getLocation(), diag::note_defined_here) << FD;
16313       return;
16314     }
16315     // Mark the function as must be emitted for the device.
16316     Optional<OMPDeclareTargetDeclAttr::DevTypeTy> DevTy =
16317         OMPDeclareTargetDeclAttr::getDeviceType(FD);
16318     if (LangOpts.OpenMPIsDevice && Res.hasValue() && IdLoc.isValid() &&
16319         *DevTy != OMPDeclareTargetDeclAttr::DT_Host)
16320       checkOpenMPDeviceFunction(IdLoc, FD, /*CheckForDelayedContext=*/false);
16321     if (!LangOpts.OpenMPIsDevice && Res.hasValue() && IdLoc.isValid() &&
16322         *DevTy != OMPDeclareTargetDeclAttr::DT_NoHost)
16323       checkOpenMPHostFunction(IdLoc, FD, /*CheckCaller=*/false);
16324   }
16325   if (auto *VD = dyn_cast<ValueDecl>(D)) {
16326     // Problem if any with var declared with incomplete type will be reported
16327     // as normal, so no need to check it here.
16328     if ((E || !VD->getType()->isIncompleteType()) &&
16329         !checkValueDeclInTarget(SL, SR, *this, DSAStack, VD))
16330       return;
16331     if (!E && !OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD)) {
16332       // Checking declaration inside declare target region.
16333       if (isa<VarDecl>(D) || isa<FunctionDecl>(D) ||
16334           isa<FunctionTemplateDecl>(D)) {
16335         auto *A = OMPDeclareTargetDeclAttr::CreateImplicit(
16336             Context, OMPDeclareTargetDeclAttr::MT_To,
16337             OMPDeclareTargetDeclAttr::DT_Any, SourceRange(IdLoc, IdLoc));
16338         D->addAttr(A);
16339         if (ASTMutationListener *ML = Context.getASTMutationListener())
16340           ML->DeclarationMarkedOpenMPDeclareTarget(D, A);
16341       }
16342       return;
16343     }
16344   }
16345   if (!E)
16346     return;
16347   checkDeclInTargetContext(E->getExprLoc(), E->getSourceRange(), *this, D);
16348 }
16349 
16350 OMPClause *Sema::ActOnOpenMPToClause(ArrayRef<Expr *> VarList,
16351                                      CXXScopeSpec &MapperIdScopeSpec,
16352                                      DeclarationNameInfo &MapperId,
16353                                      const OMPVarListLocTy &Locs,
16354                                      ArrayRef<Expr *> UnresolvedMappers) {
16355   MappableVarListInfo MVLI(VarList);
16356   checkMappableExpressionList(*this, DSAStack, OMPC_to, MVLI, Locs.StartLoc,
16357                               MapperIdScopeSpec, MapperId, UnresolvedMappers);
16358   if (MVLI.ProcessedVarList.empty())
16359     return nullptr;
16360 
16361   return OMPToClause::Create(
16362       Context, Locs, MVLI.ProcessedVarList, MVLI.VarBaseDeclarations,
16363       MVLI.VarComponents, MVLI.UDMapperList,
16364       MapperIdScopeSpec.getWithLocInContext(Context), MapperId);
16365 }
16366 
16367 OMPClause *Sema::ActOnOpenMPFromClause(ArrayRef<Expr *> VarList,
16368                                        CXXScopeSpec &MapperIdScopeSpec,
16369                                        DeclarationNameInfo &MapperId,
16370                                        const OMPVarListLocTy &Locs,
16371                                        ArrayRef<Expr *> UnresolvedMappers) {
16372   MappableVarListInfo MVLI(VarList);
16373   checkMappableExpressionList(*this, DSAStack, OMPC_from, MVLI, Locs.StartLoc,
16374                               MapperIdScopeSpec, MapperId, UnresolvedMappers);
16375   if (MVLI.ProcessedVarList.empty())
16376     return nullptr;
16377 
16378   return OMPFromClause::Create(
16379       Context, Locs, MVLI.ProcessedVarList, MVLI.VarBaseDeclarations,
16380       MVLI.VarComponents, MVLI.UDMapperList,
16381       MapperIdScopeSpec.getWithLocInContext(Context), MapperId);
16382 }
16383 
16384 OMPClause *Sema::ActOnOpenMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
16385                                                const OMPVarListLocTy &Locs) {
16386   MappableVarListInfo MVLI(VarList);
16387   SmallVector<Expr *, 8> PrivateCopies;
16388   SmallVector<Expr *, 8> Inits;
16389 
16390   for (Expr *RefExpr : VarList) {
16391     assert(RefExpr && "NULL expr in OpenMP use_device_ptr clause.");
16392     SourceLocation ELoc;
16393     SourceRange ERange;
16394     Expr *SimpleRefExpr = RefExpr;
16395     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
16396     if (Res.second) {
16397       // It will be analyzed later.
16398       MVLI.ProcessedVarList.push_back(RefExpr);
16399       PrivateCopies.push_back(nullptr);
16400       Inits.push_back(nullptr);
16401     }
16402     ValueDecl *D = Res.first;
16403     if (!D)
16404       continue;
16405 
16406     QualType Type = D->getType();
16407     Type = Type.getNonReferenceType().getUnqualifiedType();
16408 
16409     auto *VD = dyn_cast<VarDecl>(D);
16410 
16411     // Item should be a pointer or reference to pointer.
16412     if (!Type->isPointerType()) {
16413       Diag(ELoc, diag::err_omp_usedeviceptr_not_a_pointer)
16414           << 0 << RefExpr->getSourceRange();
16415       continue;
16416     }
16417 
16418     // Build the private variable and the expression that refers to it.
16419     auto VDPrivate =
16420         buildVarDecl(*this, ELoc, Type, D->getName(),
16421                      D->hasAttrs() ? &D->getAttrs() : nullptr,
16422                      VD ? cast<DeclRefExpr>(SimpleRefExpr) : nullptr);
16423     if (VDPrivate->isInvalidDecl())
16424       continue;
16425 
16426     CurContext->addDecl(VDPrivate);
16427     DeclRefExpr *VDPrivateRefExpr = buildDeclRefExpr(
16428         *this, VDPrivate, RefExpr->getType().getUnqualifiedType(), ELoc);
16429 
16430     // Add temporary variable to initialize the private copy of the pointer.
16431     VarDecl *VDInit =
16432         buildVarDecl(*this, RefExpr->getExprLoc(), Type, ".devptr.temp");
16433     DeclRefExpr *VDInitRefExpr = buildDeclRefExpr(
16434         *this, VDInit, RefExpr->getType(), RefExpr->getExprLoc());
16435     AddInitializerToDecl(VDPrivate,
16436                          DefaultLvalueConversion(VDInitRefExpr).get(),
16437                          /*DirectInit=*/false);
16438 
16439     // If required, build a capture to implement the privatization initialized
16440     // with the current list item value.
16441     DeclRefExpr *Ref = nullptr;
16442     if (!VD)
16443       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/true);
16444     MVLI.ProcessedVarList.push_back(VD ? RefExpr->IgnoreParens() : Ref);
16445     PrivateCopies.push_back(VDPrivateRefExpr);
16446     Inits.push_back(VDInitRefExpr);
16447 
16448     // We need to add a data sharing attribute for this variable to make sure it
16449     // is correctly captured. A variable that shows up in a use_device_ptr has
16450     // similar properties of a first private variable.
16451     DSAStack->addDSA(D, RefExpr->IgnoreParens(), OMPC_firstprivate, Ref);
16452 
16453     // Create a mappable component for the list item. List items in this clause
16454     // only need a component.
16455     MVLI.VarBaseDeclarations.push_back(D);
16456     MVLI.VarComponents.resize(MVLI.VarComponents.size() + 1);
16457     MVLI.VarComponents.back().push_back(
16458         OMPClauseMappableExprCommon::MappableComponent(SimpleRefExpr, D));
16459   }
16460 
16461   if (MVLI.ProcessedVarList.empty())
16462     return nullptr;
16463 
16464   return OMPUseDevicePtrClause::Create(
16465       Context, Locs, MVLI.ProcessedVarList, PrivateCopies, Inits,
16466       MVLI.VarBaseDeclarations, MVLI.VarComponents);
16467 }
16468 
16469 OMPClause *Sema::ActOnOpenMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
16470                                               const OMPVarListLocTy &Locs) {
16471   MappableVarListInfo MVLI(VarList);
16472   for (Expr *RefExpr : VarList) {
16473     assert(RefExpr && "NULL expr in OpenMP is_device_ptr clause.");
16474     SourceLocation ELoc;
16475     SourceRange ERange;
16476     Expr *SimpleRefExpr = RefExpr;
16477     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
16478     if (Res.second) {
16479       // It will be analyzed later.
16480       MVLI.ProcessedVarList.push_back(RefExpr);
16481     }
16482     ValueDecl *D = Res.first;
16483     if (!D)
16484       continue;
16485 
16486     QualType Type = D->getType();
16487     // item should be a pointer or array or reference to pointer or array
16488     if (!Type.getNonReferenceType()->isPointerType() &&
16489         !Type.getNonReferenceType()->isArrayType()) {
16490       Diag(ELoc, diag::err_omp_argument_type_isdeviceptr)
16491           << 0 << RefExpr->getSourceRange();
16492       continue;
16493     }
16494 
16495     // Check if the declaration in the clause does not show up in any data
16496     // sharing attribute.
16497     DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(D, /*FromParent=*/false);
16498     if (isOpenMPPrivate(DVar.CKind)) {
16499       Diag(ELoc, diag::err_omp_variable_in_given_clause_and_dsa)
16500           << getOpenMPClauseName(DVar.CKind)
16501           << getOpenMPClauseName(OMPC_is_device_ptr)
16502           << getOpenMPDirectiveName(DSAStack->getCurrentDirective());
16503       reportOriginalDsa(*this, DSAStack, D, DVar);
16504       continue;
16505     }
16506 
16507     const Expr *ConflictExpr;
16508     if (DSAStack->checkMappableExprComponentListsForDecl(
16509             D, /*CurrentRegionOnly=*/true,
16510             [&ConflictExpr](
16511                 OMPClauseMappableExprCommon::MappableExprComponentListRef R,
16512                 OpenMPClauseKind) -> bool {
16513               ConflictExpr = R.front().getAssociatedExpression();
16514               return true;
16515             })) {
16516       Diag(ELoc, diag::err_omp_map_shared_storage) << RefExpr->getSourceRange();
16517       Diag(ConflictExpr->getExprLoc(), diag::note_used_here)
16518           << ConflictExpr->getSourceRange();
16519       continue;
16520     }
16521 
16522     // Store the components in the stack so that they can be used to check
16523     // against other clauses later on.
16524     OMPClauseMappableExprCommon::MappableComponent MC(SimpleRefExpr, D);
16525     DSAStack->addMappableExpressionComponents(
16526         D, MC, /*WhereFoundClauseKind=*/OMPC_is_device_ptr);
16527 
16528     // Record the expression we've just processed.
16529     MVLI.ProcessedVarList.push_back(SimpleRefExpr);
16530 
16531     // Create a mappable component for the list item. List items in this clause
16532     // only need a component. We use a null declaration to signal fields in
16533     // 'this'.
16534     assert((isa<DeclRefExpr>(SimpleRefExpr) ||
16535             isa<CXXThisExpr>(cast<MemberExpr>(SimpleRefExpr)->getBase())) &&
16536            "Unexpected device pointer expression!");
16537     MVLI.VarBaseDeclarations.push_back(
16538         isa<DeclRefExpr>(SimpleRefExpr) ? D : nullptr);
16539     MVLI.VarComponents.resize(MVLI.VarComponents.size() + 1);
16540     MVLI.VarComponents.back().push_back(MC);
16541   }
16542 
16543   if (MVLI.ProcessedVarList.empty())
16544     return nullptr;
16545 
16546   return OMPIsDevicePtrClause::Create(Context, Locs, MVLI.ProcessedVarList,
16547                                       MVLI.VarBaseDeclarations,
16548                                       MVLI.VarComponents);
16549 }
16550 
16551 OMPClause *Sema::ActOnOpenMPAllocateClause(
16552     Expr *Allocator, ArrayRef<Expr *> VarList, SourceLocation StartLoc,
16553     SourceLocation ColonLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
16554   if (Allocator) {
16555     // OpenMP [2.11.4 allocate Clause, Description]
16556     // allocator is an expression of omp_allocator_handle_t type.
16557     if (!findOMPAllocatorHandleT(*this, Allocator->getExprLoc(), DSAStack))
16558       return nullptr;
16559 
16560     ExprResult AllocatorRes = DefaultLvalueConversion(Allocator);
16561     if (AllocatorRes.isInvalid())
16562       return nullptr;
16563     AllocatorRes = PerformImplicitConversion(AllocatorRes.get(),
16564                                              DSAStack->getOMPAllocatorHandleT(),
16565                                              Sema::AA_Initializing,
16566                                              /*AllowExplicit=*/true);
16567     if (AllocatorRes.isInvalid())
16568       return nullptr;
16569     Allocator = AllocatorRes.get();
16570   } else {
16571     // OpenMP 5.0, 2.11.4 allocate Clause, Restrictions.
16572     // allocate clauses that appear on a target construct or on constructs in a
16573     // target region must specify an allocator expression unless a requires
16574     // directive with the dynamic_allocators clause is present in the same
16575     // compilation unit.
16576     if (LangOpts.OpenMPIsDevice &&
16577         !DSAStack->hasRequiresDeclWithClause<OMPDynamicAllocatorsClause>())
16578       targetDiag(StartLoc, diag::err_expected_allocator_expression);
16579   }
16580   // Analyze and build list of variables.
16581   SmallVector<Expr *, 8> Vars;
16582   for (Expr *RefExpr : VarList) {
16583     assert(RefExpr && "NULL expr in OpenMP private clause.");
16584     SourceLocation ELoc;
16585     SourceRange ERange;
16586     Expr *SimpleRefExpr = RefExpr;
16587     auto Res = getPrivateItem(*this, SimpleRefExpr, ELoc, ERange);
16588     if (Res.second) {
16589       // It will be analyzed later.
16590       Vars.push_back(RefExpr);
16591     }
16592     ValueDecl *D = Res.first;
16593     if (!D)
16594       continue;
16595 
16596     auto *VD = dyn_cast<VarDecl>(D);
16597     DeclRefExpr *Ref = nullptr;
16598     if (!VD && !CurContext->isDependentContext())
16599       Ref = buildCapture(*this, D, SimpleRefExpr, /*WithInit=*/false);
16600     Vars.push_back((VD || CurContext->isDependentContext())
16601                        ? RefExpr->IgnoreParens()
16602                        : Ref);
16603   }
16604 
16605   if (Vars.empty())
16606     return nullptr;
16607 
16608   return OMPAllocateClause::Create(Context, StartLoc, LParenLoc, Allocator,
16609                                    ColonLoc, EndLoc, Vars);
16610 }
16611