xref: /llvm-project/clang/lib/Sema/TreeTransform.h (revision abc8812df02599fc413d9ed77b992f8236ed2af9)
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
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 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/ExprConcepts.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenACC.h"
31 #include "clang/AST/StmtOpenMP.h"
32 #include "clang/AST/StmtSYCL.h"
33 #include "clang/Basic/DiagnosticParse.h"
34 #include "clang/Basic/OpenMPKinds.h"
35 #include "clang/Sema/Designator.h"
36 #include "clang/Sema/EnterExpressionEvaluationContext.h"
37 #include "clang/Sema/Lookup.h"
38 #include "clang/Sema/Ownership.h"
39 #include "clang/Sema/ParsedTemplate.h"
40 #include "clang/Sema/ScopeInfo.h"
41 #include "clang/Sema/SemaDiagnostic.h"
42 #include "clang/Sema/SemaInternal.h"
43 #include "clang/Sema/SemaObjC.h"
44 #include "clang/Sema/SemaOpenACC.h"
45 #include "clang/Sema/SemaOpenMP.h"
46 #include "clang/Sema/SemaPseudoObject.h"
47 #include "clang/Sema/SemaSYCL.h"
48 #include "llvm/ADT/ArrayRef.h"
49 #include "llvm/Support/ErrorHandling.h"
50 #include <algorithm>
51 #include <optional>
52 
53 using namespace llvm::omp;
54 
55 namespace clang {
56 using namespace sema;
57 
58 /// A semantic tree transformation that allows one to transform one
59 /// abstract syntax tree into another.
60 ///
61 /// A new tree transformation is defined by creating a new subclass \c X of
62 /// \c TreeTransform<X> and then overriding certain operations to provide
63 /// behavior specific to that transformation. For example, template
64 /// instantiation is implemented as a tree transformation where the
65 /// transformation of TemplateTypeParmType nodes involves substituting the
66 /// template arguments for their corresponding template parameters; a similar
67 /// transformation is performed for non-type template parameters and
68 /// template template parameters.
69 ///
70 /// This tree-transformation template uses static polymorphism to allow
71 /// subclasses to customize any of its operations. Thus, a subclass can
72 /// override any of the transformation or rebuild operators by providing an
73 /// operation with the same signature as the default implementation. The
74 /// overriding function should not be virtual.
75 ///
76 /// Semantic tree transformations are split into two stages, either of which
77 /// can be replaced by a subclass. The "transform" step transforms an AST node
78 /// or the parts of an AST node using the various transformation functions,
79 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
80 /// node of the appropriate kind from the pieces. The default transformation
81 /// routines recursively transform the operands to composite AST nodes (e.g.,
82 /// the pointee type of a PointerType node) and, if any of those operand nodes
83 /// were changed by the transformation, invokes the rebuild operation to create
84 /// a new AST node.
85 ///
86 /// Subclasses can customize the transformation at various levels. The
87 /// most coarse-grained transformations involve replacing TransformType(),
88 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
89 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
90 /// new implementations.
91 ///
92 /// For more fine-grained transformations, subclasses can replace any of the
93 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
94 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
95 /// replacing TransformTemplateTypeParmType() allows template instantiation
96 /// to substitute template arguments for their corresponding template
97 /// parameters. Additionally, subclasses can override the \c RebuildXXX
98 /// functions to control how AST nodes are rebuilt when their operands change.
99 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
100 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
101 /// be able to use more efficient rebuild steps.
102 ///
103 /// There are a handful of other functions that can be overridden, allowing one
104 /// to avoid traversing nodes that don't need any transformation
105 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
106 /// operands have not changed (\c AlwaysRebuild()), and customize the
107 /// default locations and entity names used for type-checking
108 /// (\c getBaseLocation(), \c getBaseEntity()).
109 template<typename Derived>
110 class TreeTransform {
111   /// Private RAII object that helps us forget and then re-remember
112   /// the template argument corresponding to a partially-substituted parameter
113   /// pack.
114   class ForgetPartiallySubstitutedPackRAII {
115     Derived &Self;
116     TemplateArgument Old;
117     // Set the pack expansion index to -1 to avoid pack substitution and
118     // indicate that parameter packs should be instantiated as themselves.
119     Sema::ArgumentPackSubstitutionIndexRAII ResetPackSubstIndex;
120 
121   public:
122     ForgetPartiallySubstitutedPackRAII(Derived &Self)
123         : Self(Self), ResetPackSubstIndex(Self.getSema(), -1) {
124       Old = Self.ForgetPartiallySubstitutedPack();
125     }
126 
127     ~ForgetPartiallySubstitutedPackRAII() {
128       Self.RememberPartiallySubstitutedPack(Old);
129     }
130   };
131 
132 protected:
133   Sema &SemaRef;
134 
135   /// The set of local declarations that have been transformed, for
136   /// cases where we are forced to build new declarations within the transformer
137   /// rather than in the subclass (e.g., lambda closure types).
138   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
139 
140 public:
141   /// Initializes a new tree transformer.
142   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
143 
144   /// Retrieves a reference to the derived class.
145   Derived &getDerived() { return static_cast<Derived&>(*this); }
146 
147   /// Retrieves a reference to the derived class.
148   const Derived &getDerived() const {
149     return static_cast<const Derived&>(*this);
150   }
151 
152   static inline ExprResult Owned(Expr *E) { return E; }
153   static inline StmtResult Owned(Stmt *S) { return S; }
154 
155   /// Retrieves a reference to the semantic analysis object used for
156   /// this tree transform.
157   Sema &getSema() const { return SemaRef; }
158 
159   /// Whether the transformation should always rebuild AST nodes, even
160   /// if none of the children have changed.
161   ///
162   /// Subclasses may override this function to specify when the transformation
163   /// should rebuild all AST nodes.
164   ///
165   /// We must always rebuild all AST nodes when performing variadic template
166   /// pack expansion, in order to avoid violating the AST invariant that each
167   /// statement node appears at most once in its containing declaration.
168   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
169 
170   /// Whether the transformation is forming an expression or statement that
171   /// replaces the original. In this case, we'll reuse mangling numbers from
172   /// existing lambdas.
173   bool ReplacingOriginal() { return false; }
174 
175   /// Wether CXXConstructExpr can be skipped when they are implicit.
176   /// They will be reconstructed when used if needed.
177   /// This is useful when the user that cause rebuilding of the
178   /// CXXConstructExpr is outside of the expression at which the TreeTransform
179   /// started.
180   bool AllowSkippingCXXConstructExpr() { return true; }
181 
182   /// Returns the location of the entity being transformed, if that
183   /// information was not available elsewhere in the AST.
184   ///
185   /// By default, returns no source-location information. Subclasses can
186   /// provide an alternative implementation that provides better location
187   /// information.
188   SourceLocation getBaseLocation() { return SourceLocation(); }
189 
190   /// Returns the name of the entity being transformed, if that
191   /// information was not available elsewhere in the AST.
192   ///
193   /// By default, returns an empty name. Subclasses can provide an alternative
194   /// implementation with a more precise name.
195   DeclarationName getBaseEntity() { return DeclarationName(); }
196 
197   /// Sets the "base" location and entity when that
198   /// information is known based on another transformation.
199   ///
200   /// By default, the source location and entity are ignored. Subclasses can
201   /// override this function to provide a customized implementation.
202   void setBase(SourceLocation Loc, DeclarationName Entity) { }
203 
204   /// RAII object that temporarily sets the base location and entity
205   /// used for reporting diagnostics in types.
206   class TemporaryBase {
207     TreeTransform &Self;
208     SourceLocation OldLocation;
209     DeclarationName OldEntity;
210 
211   public:
212     TemporaryBase(TreeTransform &Self, SourceLocation Location,
213                   DeclarationName Entity) : Self(Self) {
214       OldLocation = Self.getDerived().getBaseLocation();
215       OldEntity = Self.getDerived().getBaseEntity();
216 
217       if (Location.isValid())
218         Self.getDerived().setBase(Location, Entity);
219     }
220 
221     ~TemporaryBase() {
222       Self.getDerived().setBase(OldLocation, OldEntity);
223     }
224   };
225 
226   /// Determine whether the given type \p T has already been
227   /// transformed.
228   ///
229   /// Subclasses can provide an alternative implementation of this routine
230   /// to short-circuit evaluation when it is known that a given type will
231   /// not change. For example, template instantiation need not traverse
232   /// non-dependent types.
233   bool AlreadyTransformed(QualType T) {
234     return T.isNull();
235   }
236 
237   /// Transform a template parameter depth level.
238   ///
239   /// During a transformation that transforms template parameters, this maps
240   /// an old template parameter depth to a new depth.
241   unsigned TransformTemplateDepth(unsigned Depth) {
242     return Depth;
243   }
244 
245   /// Determine whether the given call argument should be dropped, e.g.,
246   /// because it is a default argument.
247   ///
248   /// Subclasses can provide an alternative implementation of this routine to
249   /// determine which kinds of call arguments get dropped. By default,
250   /// CXXDefaultArgument nodes are dropped (prior to transformation).
251   bool DropCallArgument(Expr *E) {
252     return E->isDefaultArgument();
253   }
254 
255   /// Determine whether we should expand a pack expansion with the
256   /// given set of parameter packs into separate arguments by repeatedly
257   /// transforming the pattern.
258   ///
259   /// By default, the transformer never tries to expand pack expansions.
260   /// Subclasses can override this routine to provide different behavior.
261   ///
262   /// \param EllipsisLoc The location of the ellipsis that identifies the
263   /// pack expansion.
264   ///
265   /// \param PatternRange The source range that covers the entire pattern of
266   /// the pack expansion.
267   ///
268   /// \param Unexpanded The set of unexpanded parameter packs within the
269   /// pattern.
270   ///
271   /// \param ShouldExpand Will be set to \c true if the transformer should
272   /// expand the corresponding pack expansions into separate arguments. When
273   /// set, \c NumExpansions must also be set.
274   ///
275   /// \param RetainExpansion Whether the caller should add an unexpanded
276   /// pack expansion after all of the expanded arguments. This is used
277   /// when extending explicitly-specified template argument packs per
278   /// C++0x [temp.arg.explicit]p9.
279   ///
280   /// \param NumExpansions The number of separate arguments that will be in
281   /// the expanded form of the corresponding pack expansion. This is both an
282   /// input and an output parameter, which can be set by the caller if the
283   /// number of expansions is known a priori (e.g., due to a prior substitution)
284   /// and will be set by the callee when the number of expansions is known.
285   /// The callee must set this value when \c ShouldExpand is \c true; it may
286   /// set this value in other cases.
287   ///
288   /// \returns true if an error occurred (e.g., because the parameter packs
289   /// are to be instantiated with arguments of different lengths), false
290   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
291   /// must be set.
292   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
293                                SourceRange PatternRange,
294                                ArrayRef<UnexpandedParameterPack> Unexpanded,
295                                bool &ShouldExpand, bool &RetainExpansion,
296                                std::optional<unsigned> &NumExpansions) {
297     ShouldExpand = false;
298     return false;
299   }
300 
301   /// "Forget" about the partially-substituted pack template argument,
302   /// when performing an instantiation that must preserve the parameter pack
303   /// use.
304   ///
305   /// This routine is meant to be overridden by the template instantiator.
306   TemplateArgument ForgetPartiallySubstitutedPack() {
307     return TemplateArgument();
308   }
309 
310   /// "Remember" the partially-substituted pack template argument
311   /// after performing an instantiation that must preserve the parameter pack
312   /// use.
313   ///
314   /// This routine is meant to be overridden by the template instantiator.
315   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
316 
317   /// Note to the derived class when a function parameter pack is
318   /// being expanded.
319   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
320 
321   /// Transforms the given type into another type.
322   ///
323   /// By default, this routine transforms a type by creating a
324   /// TypeSourceInfo for it and delegating to the appropriate
325   /// function.  This is expensive, but we don't mind, because
326   /// this method is deprecated anyway;  all users should be
327   /// switched to storing TypeSourceInfos.
328   ///
329   /// \returns the transformed type.
330   QualType TransformType(QualType T);
331 
332   /// Transforms the given type-with-location into a new
333   /// type-with-location.
334   ///
335   /// By default, this routine transforms a type by delegating to the
336   /// appropriate TransformXXXType to build a new type.  Subclasses
337   /// may override this function (to take over all type
338   /// transformations) or some set of the TransformXXXType functions
339   /// to alter the transformation.
340   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
341 
342   /// Transform the given type-with-location into a new
343   /// type, collecting location information in the given builder
344   /// as necessary.
345   ///
346   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
347 
348   /// Transform a type that is permitted to produce a
349   /// DeducedTemplateSpecializationType.
350   ///
351   /// This is used in the (relatively rare) contexts where it is acceptable
352   /// for transformation to produce a class template type with deduced
353   /// template arguments.
354   /// @{
355   QualType TransformTypeWithDeducedTST(QualType T);
356   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
357   /// @}
358 
359   /// The reason why the value of a statement is not discarded, if any.
360   enum StmtDiscardKind {
361     SDK_Discarded,
362     SDK_NotDiscarded,
363     SDK_StmtExprResult,
364   };
365 
366   /// Transform the given statement.
367   ///
368   /// By default, this routine transforms a statement by delegating to the
369   /// appropriate TransformXXXStmt function to transform a specific kind of
370   /// statement or the TransformExpr() function to transform an expression.
371   /// Subclasses may override this function to transform statements using some
372   /// other mechanism.
373   ///
374   /// \returns the transformed statement.
375   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
376 
377   /// Transform the given statement.
378   ///
379   /// By default, this routine transforms a statement by delegating to the
380   /// appropriate TransformOMPXXXClause function to transform a specific kind
381   /// of clause. Subclasses may override this function to transform statements
382   /// using some other mechanism.
383   ///
384   /// \returns the transformed OpenMP clause.
385   OMPClause *TransformOMPClause(OMPClause *S);
386 
387   /// Transform the given attribute.
388   ///
389   /// By default, this routine transforms a statement by delegating to the
390   /// appropriate TransformXXXAttr function to transform a specific kind
391   /// of attribute. Subclasses may override this function to transform
392   /// attributed statements/types using some other mechanism.
393   ///
394   /// \returns the transformed attribute
395   const Attr *TransformAttr(const Attr *S);
396 
397   // Transform the given statement attribute.
398   //
399   // Delegates to the appropriate TransformXXXAttr function to transform a
400   // specific kind of statement attribute. Unlike the non-statement taking
401   // version of this, this implements all attributes, not just pragmas.
402   const Attr *TransformStmtAttr(const Stmt *OrigS, const Stmt *InstS,
403                                 const Attr *A);
404 
405   // Transform the specified attribute.
406   //
407   // Subclasses should override the transformation of attributes with a pragma
408   // spelling to transform expressions stored within the attribute.
409   //
410   // \returns the transformed attribute.
411 #define ATTR(X)                                                                \
412   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
413 #include "clang/Basic/AttrList.inc"
414 
415   // Transform the specified attribute.
416   //
417   // Subclasses should override the transformation of attributes to do
418   // transformation and checking of statement attributes. By default, this
419   // delegates to the non-statement taking version.
420   //
421   // \returns the transformed attribute.
422 #define ATTR(X)                                                                \
423   const X##Attr *TransformStmt##X##Attr(const Stmt *, const Stmt *,            \
424                                         const X##Attr *A) {                    \
425     return getDerived().Transform##X##Attr(A);                                 \
426   }
427 #include "clang/Basic/AttrList.inc"
428 
429   /// Transform the given expression.
430   ///
431   /// By default, this routine transforms an expression by delegating to the
432   /// appropriate TransformXXXExpr function to build a new expression.
433   /// Subclasses may override this function to transform expressions using some
434   /// other mechanism.
435   ///
436   /// \returns the transformed expression.
437   ExprResult TransformExpr(Expr *E);
438 
439   /// Transform the given initializer.
440   ///
441   /// By default, this routine transforms an initializer by stripping off the
442   /// semantic nodes added by initialization, then passing the result to
443   /// TransformExpr or TransformExprs.
444   ///
445   /// \returns the transformed initializer.
446   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
447 
448   /// Transform the given list of expressions.
449   ///
450   /// This routine transforms a list of expressions by invoking
451   /// \c TransformExpr() for each subexpression. However, it also provides
452   /// support for variadic templates by expanding any pack expansions (if the
453   /// derived class permits such expansion) along the way. When pack expansions
454   /// are present, the number of outputs may not equal the number of inputs.
455   ///
456   /// \param Inputs The set of expressions to be transformed.
457   ///
458   /// \param NumInputs The number of expressions in \c Inputs.
459   ///
460   /// \param IsCall If \c true, then this transform is being performed on
461   /// function-call arguments, and any arguments that should be dropped, will
462   /// be.
463   ///
464   /// \param Outputs The transformed input expressions will be added to this
465   /// vector.
466   ///
467   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
468   /// due to transformation.
469   ///
470   /// \returns true if an error occurred, false otherwise.
471   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
472                       SmallVectorImpl<Expr *> &Outputs,
473                       bool *ArgChanged = nullptr);
474 
475   /// Transform the given declaration, which is referenced from a type
476   /// or expression.
477   ///
478   /// By default, acts as the identity function on declarations, unless the
479   /// transformer has had to transform the declaration itself. Subclasses
480   /// may override this function to provide alternate behavior.
481   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
482     llvm::DenseMap<Decl *, Decl *>::iterator Known
483       = TransformedLocalDecls.find(D);
484     if (Known != TransformedLocalDecls.end())
485       return Known->second;
486 
487     return D;
488   }
489 
490   /// Transform the specified condition.
491   ///
492   /// By default, this transforms the variable and expression and rebuilds
493   /// the condition.
494   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
495                                            Expr *Expr,
496                                            Sema::ConditionKind Kind);
497 
498   /// Transform the attributes associated with the given declaration and
499   /// place them on the new declaration.
500   ///
501   /// By default, this operation does nothing. Subclasses may override this
502   /// behavior to transform attributes.
503   void transformAttrs(Decl *Old, Decl *New) { }
504 
505   /// Note that a local declaration has been transformed by this
506   /// transformer.
507   ///
508   /// Local declarations are typically transformed via a call to
509   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
510   /// the transformer itself has to transform the declarations. This routine
511   /// can be overridden by a subclass that keeps track of such mappings.
512   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
513     assert(New.size() == 1 &&
514            "must override transformedLocalDecl if performing pack expansion");
515     TransformedLocalDecls[Old] = New.front();
516   }
517 
518   /// Transform the definition of the given declaration.
519   ///
520   /// By default, invokes TransformDecl() to transform the declaration.
521   /// Subclasses may override this function to provide alternate behavior.
522   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
523     return getDerived().TransformDecl(Loc, D);
524   }
525 
526   /// Transform the given declaration, which was the first part of a
527   /// nested-name-specifier in a member access expression.
528   ///
529   /// This specific declaration transformation only applies to the first
530   /// identifier in a nested-name-specifier of a member access expression, e.g.,
531   /// the \c T in \c x->T::member
532   ///
533   /// By default, invokes TransformDecl() to transform the declaration.
534   /// Subclasses may override this function to provide alternate behavior.
535   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
536     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
537   }
538 
539   /// Transform the set of declarations in an OverloadExpr.
540   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
541                                   LookupResult &R);
542 
543   /// Transform the given nested-name-specifier with source-location
544   /// information.
545   ///
546   /// By default, transforms all of the types and declarations within the
547   /// nested-name-specifier. Subclasses may override this function to provide
548   /// alternate behavior.
549   NestedNameSpecifierLoc
550   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
551                                   QualType ObjectType = QualType(),
552                                   NamedDecl *FirstQualifierInScope = nullptr);
553 
554   /// Transform the given declaration name.
555   ///
556   /// By default, transforms the types of conversion function, constructor,
557   /// and destructor names and then (if needed) rebuilds the declaration name.
558   /// Identifiers and selectors are returned unmodified. Subclasses may
559   /// override this function to provide alternate behavior.
560   DeclarationNameInfo
561   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
562 
563   bool TransformRequiresExprRequirements(
564       ArrayRef<concepts::Requirement *> Reqs,
565       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
566   concepts::TypeRequirement *
567   TransformTypeRequirement(concepts::TypeRequirement *Req);
568   concepts::ExprRequirement *
569   TransformExprRequirement(concepts::ExprRequirement *Req);
570   concepts::NestedRequirement *
571   TransformNestedRequirement(concepts::NestedRequirement *Req);
572 
573   /// Transform the given template name.
574   ///
575   /// \param SS The nested-name-specifier that qualifies the template
576   /// name. This nested-name-specifier must already have been transformed.
577   ///
578   /// \param Name The template name to transform.
579   ///
580   /// \param NameLoc The source location of the template name.
581   ///
582   /// \param ObjectType If we're translating a template name within a member
583   /// access expression, this is the type of the object whose member template
584   /// is being referenced.
585   ///
586   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
587   /// also refers to a name within the current (lexical) scope, this is the
588   /// declaration it refers to.
589   ///
590   /// By default, transforms the template name by transforming the declarations
591   /// and nested-name-specifiers that occur within the template name.
592   /// Subclasses may override this function to provide alternate behavior.
593   TemplateName
594   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
595                         SourceLocation NameLoc,
596                         QualType ObjectType = QualType(),
597                         NamedDecl *FirstQualifierInScope = nullptr,
598                         bool AllowInjectedClassName = false);
599 
600   /// Transform the given template argument.
601   ///
602   /// By default, this operation transforms the type, expression, or
603   /// declaration stored within the template argument and constructs a
604   /// new template argument from the transformed result. Subclasses may
605   /// override this function to provide alternate behavior.
606   ///
607   /// Returns true if there was an error.
608   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
609                                  TemplateArgumentLoc &Output,
610                                  bool Uneval = false);
611 
612   /// Transform the given set of template arguments.
613   ///
614   /// By default, this operation transforms all of the template arguments
615   /// in the input set using \c TransformTemplateArgument(), and appends
616   /// the transformed arguments to the output list.
617   ///
618   /// Note that this overload of \c TransformTemplateArguments() is merely
619   /// a convenience function. Subclasses that wish to override this behavior
620   /// should override the iterator-based member template version.
621   ///
622   /// \param Inputs The set of template arguments to be transformed.
623   ///
624   /// \param NumInputs The number of template arguments in \p Inputs.
625   ///
626   /// \param Outputs The set of transformed template arguments output by this
627   /// routine.
628   ///
629   /// Returns true if an error occurred.
630   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
631                                   unsigned NumInputs,
632                                   TemplateArgumentListInfo &Outputs,
633                                   bool Uneval = false) {
634     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
635                                       Uneval);
636   }
637 
638   /// Transform the given set of template arguments.
639   ///
640   /// By default, this operation transforms all of the template arguments
641   /// in the input set using \c TransformTemplateArgument(), and appends
642   /// the transformed arguments to the output list.
643   ///
644   /// \param First An iterator to the first template argument.
645   ///
646   /// \param Last An iterator one step past the last template argument.
647   ///
648   /// \param Outputs The set of transformed template arguments output by this
649   /// routine.
650   ///
651   /// Returns true if an error occurred.
652   template<typename InputIterator>
653   bool TransformTemplateArguments(InputIterator First,
654                                   InputIterator Last,
655                                   TemplateArgumentListInfo &Outputs,
656                                   bool Uneval = false);
657 
658   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
659   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
660                                  TemplateArgumentLoc &ArgLoc);
661 
662   /// Fakes up a TypeSourceInfo for a type.
663   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
664     return SemaRef.Context.getTrivialTypeSourceInfo(T,
665                        getDerived().getBaseLocation());
666   }
667 
668 #define ABSTRACT_TYPELOC(CLASS, PARENT)
669 #define TYPELOC(CLASS, PARENT)                                   \
670   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
671 #include "clang/AST/TypeLocNodes.def"
672 
673   QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
674                                          TemplateTypeParmTypeLoc TL,
675                                          bool SuppressObjCLifetime);
676   QualType
677   TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
678                                          SubstTemplateTypeParmPackTypeLoc TL,
679                                          bool SuppressObjCLifetime);
680 
681   template<typename Fn>
682   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
683                                       FunctionProtoTypeLoc TL,
684                                       CXXRecordDecl *ThisContext,
685                                       Qualifiers ThisTypeQuals,
686                                       Fn TransformExceptionSpec);
687 
688   bool TransformExceptionSpec(SourceLocation Loc,
689                               FunctionProtoType::ExceptionSpecInfo &ESI,
690                               SmallVectorImpl<QualType> &Exceptions,
691                               bool &Changed);
692 
693   StmtResult TransformSEHHandler(Stmt *Handler);
694 
695   QualType
696   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
697                                       TemplateSpecializationTypeLoc TL,
698                                       TemplateName Template);
699 
700   QualType
701   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
702                                       DependentTemplateSpecializationTypeLoc TL,
703                                                TemplateName Template,
704                                                CXXScopeSpec &SS);
705 
706   QualType TransformDependentTemplateSpecializationType(
707       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
708       NestedNameSpecifierLoc QualifierLoc);
709 
710   /// Transforms the parameters of a function type into the
711   /// given vectors.
712   ///
713   /// The result vectors should be kept in sync; null entries in the
714   /// variables vector are acceptable.
715   ///
716   /// LastParamTransformed, if non-null, will be set to the index of the last
717   /// parameter on which transfromation was started. In the event of an error,
718   /// this will contain the parameter which failed to instantiate.
719   ///
720   /// Return true on error.
721   bool TransformFunctionTypeParams(
722       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
723       const QualType *ParamTypes,
724       const FunctionProtoType::ExtParameterInfo *ParamInfos,
725       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
726       Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed);
727 
728   bool TransformFunctionTypeParams(
729       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
730       const QualType *ParamTypes,
731       const FunctionProtoType::ExtParameterInfo *ParamInfos,
732       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
733       Sema::ExtParameterInfoBuilder &PInfos) {
734     return getDerived().TransformFunctionTypeParams(
735         Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr);
736   }
737 
738   /// Transforms the parameters of a requires expresison into the given vectors.
739   ///
740   /// The result vectors should be kept in sync; null entries in the
741   /// variables vector are acceptable.
742   ///
743   /// Returns an unset ExprResult on success.  Returns an ExprResult the 'not
744   /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of
745   /// which are cases where transformation shouldn't continue.
746   ExprResult TransformRequiresTypeParams(
747       SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
748       RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
749       SmallVectorImpl<QualType> &PTypes,
750       SmallVectorImpl<ParmVarDecl *> &TransParams,
751       Sema::ExtParameterInfoBuilder &PInfos) {
752     if (getDerived().TransformFunctionTypeParams(
753             KWLoc, Params, /*ParamTypes=*/nullptr,
754             /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos))
755       return ExprError();
756 
757     return ExprResult{};
758   }
759 
760   /// Transforms a single function-type parameter.  Return null
761   /// on error.
762   ///
763   /// \param indexAdjustment - A number to add to the parameter's
764   ///   scope index;  can be negative
765   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
766                                           int indexAdjustment,
767                                           std::optional<unsigned> NumExpansions,
768                                           bool ExpectParameterPack);
769 
770   /// Transform the body of a lambda-expression.
771   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
772   /// Alternative implementation of TransformLambdaBody that skips transforming
773   /// the body.
774   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
775 
776   CXXRecordDecl::LambdaDependencyKind
777   ComputeLambdaDependency(LambdaScopeInfo *LSI) {
778     return static_cast<CXXRecordDecl::LambdaDependencyKind>(
779         LSI->Lambda->getLambdaDependencyKind());
780   }
781 
782   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
783 
784   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
785   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
786 
787   TemplateParameterList *TransformTemplateParameterList(
788         TemplateParameterList *TPL) {
789     return TPL;
790   }
791 
792   ExprResult TransformAddressOfOperand(Expr *E);
793 
794   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
795                                                 bool IsAddressOfOperand,
796                                                 TypeSourceInfo **RecoveryTSI);
797 
798   ExprResult TransformParenDependentScopeDeclRefExpr(
799       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
800       TypeSourceInfo **RecoveryTSI);
801 
802   ExprResult TransformUnresolvedLookupExpr(UnresolvedLookupExpr *E,
803                                            bool IsAddressOfOperand);
804 
805   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
806 
807   StmtResult TransformOMPInformationalDirective(OMPExecutableDirective *S);
808 
809 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
810 // amount of stack usage with clang.
811 #define STMT(Node, Parent)                        \
812   LLVM_ATTRIBUTE_NOINLINE \
813   StmtResult Transform##Node(Node *S);
814 #define VALUESTMT(Node, Parent)                   \
815   LLVM_ATTRIBUTE_NOINLINE \
816   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
817 #define EXPR(Node, Parent)                        \
818   LLVM_ATTRIBUTE_NOINLINE \
819   ExprResult Transform##Node(Node *E);
820 #define ABSTRACT_STMT(Stmt)
821 #include "clang/AST/StmtNodes.inc"
822 
823 #define GEN_CLANG_CLAUSE_CLASS
824 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
825   LLVM_ATTRIBUTE_NOINLINE                                                      \
826   OMPClause *Transform##Class(Class *S);
827 #include "llvm/Frontend/OpenMP/OMP.inc"
828 
829   /// Build a new qualified type given its unqualified type and type location.
830   ///
831   /// By default, this routine adds type qualifiers only to types that can
832   /// have qualifiers, and silently suppresses those qualifiers that are not
833   /// permitted. Subclasses may override this routine to provide different
834   /// behavior.
835   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
836 
837   /// Build a new pointer type given its pointee type.
838   ///
839   /// By default, performs semantic analysis when building the pointer type.
840   /// Subclasses may override this routine to provide different behavior.
841   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
842 
843   /// Build a new block pointer type given its pointee type.
844   ///
845   /// By default, performs semantic analysis when building the block pointer
846   /// type. Subclasses may override this routine to provide different behavior.
847   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
848 
849   /// Build a new reference type given the type it references.
850   ///
851   /// By default, performs semantic analysis when building the
852   /// reference type. Subclasses may override this routine to provide
853   /// different behavior.
854   ///
855   /// \param LValue whether the type was written with an lvalue sigil
856   /// or an rvalue sigil.
857   QualType RebuildReferenceType(QualType ReferentType,
858                                 bool LValue,
859                                 SourceLocation Sigil);
860 
861   /// Build a new member pointer type given the pointee type and the
862   /// class type it refers into.
863   ///
864   /// By default, performs semantic analysis when building the member pointer
865   /// type. Subclasses may override this routine to provide different behavior.
866   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
867                                     SourceLocation Sigil);
868 
869   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
870                                     SourceLocation ProtocolLAngleLoc,
871                                     ArrayRef<ObjCProtocolDecl *> Protocols,
872                                     ArrayRef<SourceLocation> ProtocolLocs,
873                                     SourceLocation ProtocolRAngleLoc);
874 
875   /// Build an Objective-C object type.
876   ///
877   /// By default, performs semantic analysis when building the object type.
878   /// Subclasses may override this routine to provide different behavior.
879   QualType RebuildObjCObjectType(QualType BaseType,
880                                  SourceLocation Loc,
881                                  SourceLocation TypeArgsLAngleLoc,
882                                  ArrayRef<TypeSourceInfo *> TypeArgs,
883                                  SourceLocation TypeArgsRAngleLoc,
884                                  SourceLocation ProtocolLAngleLoc,
885                                  ArrayRef<ObjCProtocolDecl *> Protocols,
886                                  ArrayRef<SourceLocation> ProtocolLocs,
887                                  SourceLocation ProtocolRAngleLoc);
888 
889   /// Build a new Objective-C object pointer type given the pointee type.
890   ///
891   /// By default, directly builds the pointer type, with no additional semantic
892   /// analysis.
893   QualType RebuildObjCObjectPointerType(QualType PointeeType,
894                                         SourceLocation Star);
895 
896   /// Build a new array type given the element type, size
897   /// modifier, size of the array (if known), size expression, and index type
898   /// qualifiers.
899   ///
900   /// By default, performs semantic analysis when building the array type.
901   /// Subclasses may override this routine to provide different behavior.
902   /// Also by default, all of the other Rebuild*Array
903   QualType RebuildArrayType(QualType ElementType, ArraySizeModifier SizeMod,
904                             const llvm::APInt *Size, Expr *SizeExpr,
905                             unsigned IndexTypeQuals, SourceRange BracketsRange);
906 
907   /// Build a new constant array type given the element type, size
908   /// modifier, (known) size of the array, and index type qualifiers.
909   ///
910   /// By default, performs semantic analysis when building the array type.
911   /// Subclasses may override this routine to provide different behavior.
912   QualType RebuildConstantArrayType(QualType ElementType,
913                                     ArraySizeModifier SizeMod,
914                                     const llvm::APInt &Size, Expr *SizeExpr,
915                                     unsigned IndexTypeQuals,
916                                     SourceRange BracketsRange);
917 
918   /// Build a new incomplete array type given the element type, size
919   /// modifier, and index type qualifiers.
920   ///
921   /// By default, performs semantic analysis when building the array type.
922   /// Subclasses may override this routine to provide different behavior.
923   QualType RebuildIncompleteArrayType(QualType ElementType,
924                                       ArraySizeModifier SizeMod,
925                                       unsigned IndexTypeQuals,
926                                       SourceRange BracketsRange);
927 
928   /// Build a new variable-length array type given the element type,
929   /// size modifier, size expression, and index type qualifiers.
930   ///
931   /// By default, performs semantic analysis when building the array type.
932   /// Subclasses may override this routine to provide different behavior.
933   QualType RebuildVariableArrayType(QualType ElementType,
934                                     ArraySizeModifier SizeMod, Expr *SizeExpr,
935                                     unsigned IndexTypeQuals,
936                                     SourceRange BracketsRange);
937 
938   /// Build a new dependent-sized array type given the element type,
939   /// size modifier, size expression, and index type qualifiers.
940   ///
941   /// By default, performs semantic analysis when building the array type.
942   /// Subclasses may override this routine to provide different behavior.
943   QualType RebuildDependentSizedArrayType(QualType ElementType,
944                                           ArraySizeModifier SizeMod,
945                                           Expr *SizeExpr,
946                                           unsigned IndexTypeQuals,
947                                           SourceRange BracketsRange);
948 
949   /// Build a new vector type given the element type and
950   /// number of elements.
951   ///
952   /// By default, performs semantic analysis when building the vector type.
953   /// Subclasses may override this routine to provide different behavior.
954   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
955                              VectorKind VecKind);
956 
957   /// Build a new potentially dependently-sized extended vector type
958   /// given the element type and number of elements.
959   ///
960   /// By default, performs semantic analysis when building the vector type.
961   /// Subclasses may override this routine to provide different behavior.
962   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
963                                       SourceLocation AttributeLoc, VectorKind);
964 
965   /// Build a new extended vector type given the element type and
966   /// number of elements.
967   ///
968   /// By default, performs semantic analysis when building the vector type.
969   /// Subclasses may override this routine to provide different behavior.
970   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
971                                 SourceLocation AttributeLoc);
972 
973   /// Build a new potentially dependently-sized extended vector type
974   /// given the element type and number of elements.
975   ///
976   /// By default, performs semantic analysis when building the vector type.
977   /// Subclasses may override this routine to provide different behavior.
978   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
979                                               Expr *SizeExpr,
980                                               SourceLocation AttributeLoc);
981 
982   /// Build a new matrix type given the element type and dimensions.
983   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
984                                      unsigned NumColumns);
985 
986   /// Build a new matrix type given the type and dependently-defined
987   /// dimensions.
988   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
989                                            Expr *ColumnExpr,
990                                            SourceLocation AttributeLoc);
991 
992   /// Build a new DependentAddressSpaceType or return the pointee
993   /// type variable with the correct address space (retrieved from
994   /// AddrSpaceExpr) applied to it. The former will be returned in cases
995   /// where the address space remains dependent.
996   ///
997   /// By default, performs semantic analysis when building the type with address
998   /// space applied. Subclasses may override this routine to provide different
999   /// behavior.
1000   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
1001                                             Expr *AddrSpaceExpr,
1002                                             SourceLocation AttributeLoc);
1003 
1004   /// Build a new function type.
1005   ///
1006   /// By default, performs semantic analysis when building the function type.
1007   /// Subclasses may override this routine to provide different behavior.
1008   QualType RebuildFunctionProtoType(QualType T,
1009                                     MutableArrayRef<QualType> ParamTypes,
1010                                     const FunctionProtoType::ExtProtoInfo &EPI);
1011 
1012   /// Build a new unprototyped function type.
1013   QualType RebuildFunctionNoProtoType(QualType ResultType);
1014 
1015   /// Rebuild an unresolved typename type, given the decl that
1016   /// the UnresolvedUsingTypenameDecl was transformed to.
1017   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
1018 
1019   /// Build a new type found via an alias.
1020   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
1021     return SemaRef.Context.getUsingType(Found, Underlying);
1022   }
1023 
1024   /// Build a new typedef type.
1025   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
1026     return SemaRef.Context.getTypeDeclType(Typedef);
1027   }
1028 
1029   /// Build a new MacroDefined type.
1030   QualType RebuildMacroQualifiedType(QualType T,
1031                                      const IdentifierInfo *MacroII) {
1032     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
1033   }
1034 
1035   /// Build a new class/struct/union type.
1036   QualType RebuildRecordType(RecordDecl *Record) {
1037     return SemaRef.Context.getTypeDeclType(Record);
1038   }
1039 
1040   /// Build a new Enum type.
1041   QualType RebuildEnumType(EnumDecl *Enum) {
1042     return SemaRef.Context.getTypeDeclType(Enum);
1043   }
1044 
1045   /// Build a new typeof(expr) type.
1046   ///
1047   /// By default, performs semantic analysis when building the typeof type.
1048   /// Subclasses may override this routine to provide different behavior.
1049   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc,
1050                                  TypeOfKind Kind);
1051 
1052   /// Build a new typeof(type) type.
1053   ///
1054   /// By default, builds a new TypeOfType with the given underlying type.
1055   QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind);
1056 
1057   /// Build a new unary transform type.
1058   QualType RebuildUnaryTransformType(QualType BaseType,
1059                                      UnaryTransformType::UTTKind UKind,
1060                                      SourceLocation Loc);
1061 
1062   /// Build a new C++11 decltype type.
1063   ///
1064   /// By default, performs semantic analysis when building the decltype type.
1065   /// Subclasses may override this routine to provide different behavior.
1066   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
1067 
1068   QualType RebuildPackIndexingType(QualType Pattern, Expr *IndexExpr,
1069                                    SourceLocation Loc,
1070                                    SourceLocation EllipsisLoc,
1071                                    bool FullySubstituted,
1072                                    ArrayRef<QualType> Expansions = {});
1073 
1074   /// Build a new C++11 auto type.
1075   ///
1076   /// By default, builds a new AutoType with the given deduced type.
1077   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
1078                            ConceptDecl *TypeConstraintConcept,
1079                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
1080     // Note, IsDependent is always false here: we implicitly convert an 'auto'
1081     // which has been deduced to a dependent type into an undeduced 'auto', so
1082     // that we'll retry deduction after the transformation.
1083     return SemaRef.Context.getAutoType(Deduced, Keyword,
1084                                        /*IsDependent*/ false, /*IsPack=*/false,
1085                                        TypeConstraintConcept,
1086                                        TypeConstraintArgs);
1087   }
1088 
1089   /// By default, builds a new DeducedTemplateSpecializationType with the given
1090   /// deduced type.
1091   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1092       QualType Deduced) {
1093     return SemaRef.Context.getDeducedTemplateSpecializationType(
1094         Template, Deduced, /*IsDependent*/ false);
1095   }
1096 
1097   /// Build a new template specialization type.
1098   ///
1099   /// By default, performs semantic analysis when building the template
1100   /// specialization type. Subclasses may override this routine to provide
1101   /// different behavior.
1102   QualType RebuildTemplateSpecializationType(TemplateName Template,
1103                                              SourceLocation TemplateLoc,
1104                                              TemplateArgumentListInfo &Args);
1105 
1106   /// Build a new parenthesized type.
1107   ///
1108   /// By default, builds a new ParenType type from the inner type.
1109   /// Subclasses may override this routine to provide different behavior.
1110   QualType RebuildParenType(QualType InnerType) {
1111     return SemaRef.BuildParenType(InnerType);
1112   }
1113 
1114   /// Build a new qualified name type.
1115   ///
1116   /// By default, builds a new ElaboratedType type from the keyword,
1117   /// the nested-name-specifier and the named type.
1118   /// Subclasses may override this routine to provide different behavior.
1119   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1120                                  ElaboratedTypeKeyword Keyword,
1121                                  NestedNameSpecifierLoc QualifierLoc,
1122                                  QualType Named) {
1123     return SemaRef.Context.getElaboratedType(Keyword,
1124                                          QualifierLoc.getNestedNameSpecifier(),
1125                                              Named);
1126   }
1127 
1128   /// Build a new typename type that refers to a template-id.
1129   ///
1130   /// By default, builds a new DependentNameType type from the
1131   /// nested-name-specifier and the given type. Subclasses may override
1132   /// this routine to provide different behavior.
1133   QualType RebuildDependentTemplateSpecializationType(
1134                                           ElaboratedTypeKeyword Keyword,
1135                                           NestedNameSpecifierLoc QualifierLoc,
1136                                           SourceLocation TemplateKWLoc,
1137                                           const IdentifierInfo *Name,
1138                                           SourceLocation NameLoc,
1139                                           TemplateArgumentListInfo &Args,
1140                                           bool AllowInjectedClassName) {
1141     // Rebuild the template name.
1142     // TODO: avoid TemplateName abstraction
1143     CXXScopeSpec SS;
1144     SS.Adopt(QualifierLoc);
1145     TemplateName InstName = getDerived().RebuildTemplateName(
1146         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1147         AllowInjectedClassName);
1148 
1149     if (InstName.isNull())
1150       return QualType();
1151 
1152     // If it's still dependent, make a dependent specialization.
1153     if (InstName.getAsDependentTemplateName())
1154       return SemaRef.Context.getDependentTemplateSpecializationType(
1155           Keyword, QualifierLoc.getNestedNameSpecifier(), Name,
1156           Args.arguments());
1157 
1158     // Otherwise, make an elaborated type wrapping a non-dependent
1159     // specialization.
1160     QualType T =
1161         getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1162     if (T.isNull())
1163       return QualType();
1164     return SemaRef.Context.getElaboratedType(
1165         Keyword, QualifierLoc.getNestedNameSpecifier(), T);
1166   }
1167 
1168   /// Build a new typename type that refers to an identifier.
1169   ///
1170   /// By default, performs semantic analysis when building the typename type
1171   /// (or elaborated type). Subclasses may override this routine to provide
1172   /// different behavior.
1173   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1174                                     SourceLocation KeywordLoc,
1175                                     NestedNameSpecifierLoc QualifierLoc,
1176                                     const IdentifierInfo *Id,
1177                                     SourceLocation IdLoc,
1178                                     bool DeducedTSTContext) {
1179     CXXScopeSpec SS;
1180     SS.Adopt(QualifierLoc);
1181 
1182     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1183       // If the name is still dependent, just build a new dependent name type.
1184       if (!SemaRef.computeDeclContext(SS))
1185         return SemaRef.Context.getDependentNameType(Keyword,
1186                                           QualifierLoc.getNestedNameSpecifier(),
1187                                                     Id);
1188     }
1189 
1190     if (Keyword == ElaboratedTypeKeyword::None ||
1191         Keyword == ElaboratedTypeKeyword::Typename) {
1192       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1193                                        *Id, IdLoc, DeducedTSTContext);
1194     }
1195 
1196     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1197 
1198     // We had a dependent elaborated-type-specifier that has been transformed
1199     // into a non-dependent elaborated-type-specifier. Find the tag we're
1200     // referring to.
1201     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1202     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1203     if (!DC)
1204       return QualType();
1205 
1206     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1207       return QualType();
1208 
1209     TagDecl *Tag = nullptr;
1210     SemaRef.LookupQualifiedName(Result, DC);
1211     switch (Result.getResultKind()) {
1212       case LookupResult::NotFound:
1213       case LookupResult::NotFoundInCurrentInstantiation:
1214         break;
1215 
1216       case LookupResult::Found:
1217         Tag = Result.getAsSingle<TagDecl>();
1218         break;
1219 
1220       case LookupResult::FoundOverloaded:
1221       case LookupResult::FoundUnresolvedValue:
1222         llvm_unreachable("Tag lookup cannot find non-tags");
1223 
1224       case LookupResult::Ambiguous:
1225         // Let the LookupResult structure handle ambiguities.
1226         return QualType();
1227     }
1228 
1229     if (!Tag) {
1230       // Check where the name exists but isn't a tag type and use that to emit
1231       // better diagnostics.
1232       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1233       SemaRef.LookupQualifiedName(Result, DC);
1234       switch (Result.getResultKind()) {
1235         case LookupResult::Found:
1236         case LookupResult::FoundOverloaded:
1237         case LookupResult::FoundUnresolvedValue: {
1238           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1239           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1240           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag)
1241               << SomeDecl << NTK << llvm::to_underlying(Kind);
1242           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1243           break;
1244         }
1245         default:
1246           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1247               << llvm::to_underlying(Kind) << Id << DC
1248               << QualifierLoc.getSourceRange();
1249           break;
1250       }
1251       return QualType();
1252     }
1253 
1254     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1255                                               IdLoc, Id)) {
1256       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1257       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1258       return QualType();
1259     }
1260 
1261     // Build the elaborated-type-specifier type.
1262     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1263     return SemaRef.Context.getElaboratedType(Keyword,
1264                                          QualifierLoc.getNestedNameSpecifier(),
1265                                              T);
1266   }
1267 
1268   /// Build a new pack expansion type.
1269   ///
1270   /// By default, builds a new PackExpansionType type from the given pattern.
1271   /// Subclasses may override this routine to provide different behavior.
1272   QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange,
1273                                     SourceLocation EllipsisLoc,
1274                                     std::optional<unsigned> NumExpansions) {
1275     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1276                                         NumExpansions);
1277   }
1278 
1279   /// Build a new atomic type given its value type.
1280   ///
1281   /// By default, performs semantic analysis when building the atomic type.
1282   /// Subclasses may override this routine to provide different behavior.
1283   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1284 
1285   /// Build a new pipe type given its value type.
1286   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1287                            bool isReadPipe);
1288 
1289   /// Build a bit-precise int given its value type.
1290   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1291                              SourceLocation Loc);
1292 
1293   /// Build a dependent bit-precise int given its value type.
1294   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1295                                       SourceLocation Loc);
1296 
1297   /// Build a new template name given a nested name specifier, a flag
1298   /// indicating whether the "template" keyword was provided, and the template
1299   /// that the template name refers to.
1300   ///
1301   /// By default, builds the new template name directly. Subclasses may override
1302   /// this routine to provide different behavior.
1303   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1304                                    bool TemplateKW,
1305                                    TemplateDecl *Template);
1306 
1307   /// Build a new template name given a nested name specifier and the
1308   /// name that is referred to as a template.
1309   ///
1310   /// By default, performs semantic analysis to determine whether the name can
1311   /// be resolved to a specific template, then builds the appropriate kind of
1312   /// template name. Subclasses may override this routine to provide different
1313   /// behavior.
1314   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1315                                    SourceLocation TemplateKWLoc,
1316                                    const IdentifierInfo &Name,
1317                                    SourceLocation NameLoc, QualType ObjectType,
1318                                    NamedDecl *FirstQualifierInScope,
1319                                    bool AllowInjectedClassName);
1320 
1321   /// Build a new template name given a nested name specifier and the
1322   /// overloaded operator name that is referred to as a template.
1323   ///
1324   /// By default, performs semantic analysis to determine whether the name can
1325   /// be resolved to a specific template, then builds the appropriate kind of
1326   /// template name. Subclasses may override this routine to provide different
1327   /// behavior.
1328   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1329                                    SourceLocation TemplateKWLoc,
1330                                    OverloadedOperatorKind Operator,
1331                                    SourceLocation NameLoc, QualType ObjectType,
1332                                    bool AllowInjectedClassName);
1333 
1334   /// Build a new template name given a template template parameter pack
1335   /// and the
1336   ///
1337   /// By default, performs semantic analysis to determine whether the name can
1338   /// be resolved to a specific template, then builds the appropriate kind of
1339   /// template name. Subclasses may override this routine to provide different
1340   /// behavior.
1341   TemplateName RebuildTemplateName(const TemplateArgument &ArgPack,
1342                                    Decl *AssociatedDecl, unsigned Index,
1343                                    bool Final) {
1344     return getSema().Context.getSubstTemplateTemplateParmPack(
1345         ArgPack, AssociatedDecl, Index, Final);
1346   }
1347 
1348   /// Build a new compound statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1353                                        MultiStmtArg Statements,
1354                                        SourceLocation RBraceLoc,
1355                                        bool IsStmtExpr) {
1356     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1357                                        IsStmtExpr);
1358   }
1359 
1360   /// Build a new case statement.
1361   ///
1362   /// By default, performs semantic analysis to build the new statement.
1363   /// Subclasses may override this routine to provide different behavior.
1364   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1365                                    Expr *LHS,
1366                                    SourceLocation EllipsisLoc,
1367                                    Expr *RHS,
1368                                    SourceLocation ColonLoc) {
1369     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1370                                    ColonLoc);
1371   }
1372 
1373   /// Attach the body to a new case statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1378     getSema().ActOnCaseStmtBody(S, Body);
1379     return S;
1380   }
1381 
1382   /// Build a new default statement.
1383   ///
1384   /// By default, performs semantic analysis to build the new statement.
1385   /// Subclasses may override this routine to provide different behavior.
1386   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1387                                       SourceLocation ColonLoc,
1388                                       Stmt *SubStmt) {
1389     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1390                                       /*CurScope=*/nullptr);
1391   }
1392 
1393   /// Build a new label statement.
1394   ///
1395   /// By default, performs semantic analysis to build the new statement.
1396   /// Subclasses may override this routine to provide different behavior.
1397   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1398                               SourceLocation ColonLoc, Stmt *SubStmt) {
1399     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1400   }
1401 
1402   /// Build a new attributed statement.
1403   ///
1404   /// By default, performs semantic analysis to build the new statement.
1405   /// Subclasses may override this routine to provide different behavior.
1406   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1407                                    ArrayRef<const Attr *> Attrs,
1408                                    Stmt *SubStmt) {
1409     if (SemaRef.CheckRebuiltStmtAttributes(Attrs))
1410       return StmtError();
1411     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1412   }
1413 
1414   /// Build a new "if" statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1419                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1420                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1421                            SourceLocation ElseLoc, Stmt *Else) {
1422     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1423                                  Then, ElseLoc, Else);
1424   }
1425 
1426   /// Start building a new switch statement.
1427   ///
1428   /// By default, performs semantic analysis to build the new statement.
1429   /// Subclasses may override this routine to provide different behavior.
1430   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1431                                     SourceLocation LParenLoc, Stmt *Init,
1432                                     Sema::ConditionResult Cond,
1433                                     SourceLocation RParenLoc) {
1434     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1435                                             RParenLoc);
1436   }
1437 
1438   /// Attach the body to the switch statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1443                                    Stmt *Switch, Stmt *Body) {
1444     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1445   }
1446 
1447   /// Build a new while statement.
1448   ///
1449   /// By default, performs semantic analysis to build the new statement.
1450   /// Subclasses may override this routine to provide different behavior.
1451   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1452                               Sema::ConditionResult Cond,
1453                               SourceLocation RParenLoc, Stmt *Body) {
1454     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1455   }
1456 
1457   /// Build a new do-while statement.
1458   ///
1459   /// By default, performs semantic analysis to build the new statement.
1460   /// Subclasses may override this routine to provide different behavior.
1461   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1462                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1463                            Expr *Cond, SourceLocation RParenLoc) {
1464     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1465                                  Cond, RParenLoc);
1466   }
1467 
1468   /// Build a new for statement.
1469   ///
1470   /// By default, performs semantic analysis to build the new statement.
1471   /// Subclasses may override this routine to provide different behavior.
1472   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1473                             Stmt *Init, Sema::ConditionResult Cond,
1474                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1475                             Stmt *Body) {
1476     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1477                                   Inc, RParenLoc, Body);
1478   }
1479 
1480   /// Build a new goto statement.
1481   ///
1482   /// By default, performs semantic analysis to build the new statement.
1483   /// Subclasses may override this routine to provide different behavior.
1484   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1485                              LabelDecl *Label) {
1486     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1487   }
1488 
1489   /// Build a new indirect goto statement.
1490   ///
1491   /// By default, performs semantic analysis to build the new statement.
1492   /// Subclasses may override this routine to provide different behavior.
1493   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1494                                      SourceLocation StarLoc,
1495                                      Expr *Target) {
1496     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1497   }
1498 
1499   /// Build a new return statement.
1500   ///
1501   /// By default, performs semantic analysis to build the new statement.
1502   /// Subclasses may override this routine to provide different behavior.
1503   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1504     return getSema().BuildReturnStmt(ReturnLoc, Result);
1505   }
1506 
1507   /// Build a new declaration statement.
1508   ///
1509   /// By default, performs semantic analysis to build the new statement.
1510   /// Subclasses may override this routine to provide different behavior.
1511   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1512                              SourceLocation StartLoc, SourceLocation EndLoc) {
1513     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1514     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1515   }
1516 
1517   /// Build a new inline asm statement.
1518   ///
1519   /// By default, performs semantic analysis to build the new statement.
1520   /// Subclasses may override this routine to provide different behavior.
1521   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1522                                bool IsVolatile, unsigned NumOutputs,
1523                                unsigned NumInputs, IdentifierInfo **Names,
1524                                MultiExprArg Constraints, MultiExprArg Exprs,
1525                                Expr *AsmString, MultiExprArg Clobbers,
1526                                unsigned NumLabels,
1527                                SourceLocation RParenLoc) {
1528     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1529                                      NumInputs, Names, Constraints, Exprs,
1530                                      AsmString, Clobbers, NumLabels, RParenLoc);
1531   }
1532 
1533   /// Build a new MS style inline asm statement.
1534   ///
1535   /// By default, performs semantic analysis to build the new statement.
1536   /// Subclasses may override this routine to provide different behavior.
1537   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1538                               ArrayRef<Token> AsmToks,
1539                               StringRef AsmString,
1540                               unsigned NumOutputs, unsigned NumInputs,
1541                               ArrayRef<StringRef> Constraints,
1542                               ArrayRef<StringRef> Clobbers,
1543                               ArrayRef<Expr*> Exprs,
1544                               SourceLocation EndLoc) {
1545     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1546                                     NumOutputs, NumInputs,
1547                                     Constraints, Clobbers, Exprs, EndLoc);
1548   }
1549 
1550   /// Build a new co_return statement.
1551   ///
1552   /// By default, performs semantic analysis to build the new statement.
1553   /// Subclasses may override this routine to provide different behavior.
1554   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1555                                  bool IsImplicit) {
1556     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1557   }
1558 
1559   /// Build a new co_await expression.
1560   ///
1561   /// By default, performs semantic analysis to build the new expression.
1562   /// Subclasses may override this routine to provide different behavior.
1563   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand,
1564                                 UnresolvedLookupExpr *OpCoawaitLookup,
1565                                 bool IsImplicit) {
1566     // This function rebuilds a coawait-expr given its operator.
1567     // For an explicit coawait-expr, the rebuild involves the full set
1568     // of transformations performed by BuildUnresolvedCoawaitExpr(),
1569     // including calling await_transform().
1570     // For an implicit coawait-expr, we need to rebuild the "operator
1571     // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr().
1572     // This mirrors how the implicit CoawaitExpr is originally created
1573     // in Sema::ActOnCoroutineBodyStart().
1574     if (IsImplicit) {
1575       ExprResult Suspend = getSema().BuildOperatorCoawaitCall(
1576           CoawaitLoc, Operand, OpCoawaitLookup);
1577       if (Suspend.isInvalid())
1578         return ExprError();
1579       return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand,
1580                                                 Suspend.get(), true);
1581     }
1582 
1583     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand,
1584                                                 OpCoawaitLookup);
1585   }
1586 
1587   /// Build a new co_await expression.
1588   ///
1589   /// By default, performs semantic analysis to build the new expression.
1590   /// Subclasses may override this routine to provide different behavior.
1591   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1592                                          Expr *Result,
1593                                          UnresolvedLookupExpr *Lookup) {
1594     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1595   }
1596 
1597   /// Build a new co_yield expression.
1598   ///
1599   /// By default, performs semantic analysis to build the new expression.
1600   /// Subclasses may override this routine to provide different behavior.
1601   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1602     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1603   }
1604 
1605   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1606     return getSema().BuildCoroutineBodyStmt(Args);
1607   }
1608 
1609   /// Build a new Objective-C \@try statement.
1610   ///
1611   /// By default, performs semantic analysis to build the new statement.
1612   /// Subclasses may override this routine to provide different behavior.
1613   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1614                                         Stmt *TryBody,
1615                                         MultiStmtArg CatchStmts,
1616                                         Stmt *Finally) {
1617     return getSema().ObjC().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1618                                                Finally);
1619   }
1620 
1621   /// Rebuild an Objective-C exception declaration.
1622   ///
1623   /// By default, performs semantic analysis to build the new declaration.
1624   /// Subclasses may override this routine to provide different behavior.
1625   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1626                                     TypeSourceInfo *TInfo, QualType T) {
1627     return getSema().ObjC().BuildObjCExceptionDecl(
1628         TInfo, T, ExceptionDecl->getInnerLocStart(),
1629         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
1630   }
1631 
1632   /// Build a new Objective-C \@catch statement.
1633   ///
1634   /// By default, performs semantic analysis to build the new statement.
1635   /// Subclasses may override this routine to provide different behavior.
1636   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1637                                           SourceLocation RParenLoc,
1638                                           VarDecl *Var,
1639                                           Stmt *Body) {
1640     return getSema().ObjC().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, Var, Body);
1641   }
1642 
1643   /// Build a new Objective-C \@finally statement.
1644   ///
1645   /// By default, performs semantic analysis to build the new statement.
1646   /// Subclasses may override this routine to provide different behavior.
1647   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1648                                             Stmt *Body) {
1649     return getSema().ObjC().ActOnObjCAtFinallyStmt(AtLoc, Body);
1650   }
1651 
1652   /// Build a new Objective-C \@throw statement.
1653   ///
1654   /// By default, performs semantic analysis to build the new statement.
1655   /// Subclasses may override this routine to provide different behavior.
1656   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1657                                           Expr *Operand) {
1658     return getSema().ObjC().BuildObjCAtThrowStmt(AtLoc, Operand);
1659   }
1660 
1661   /// Build a new OpenMP Canonical loop.
1662   ///
1663   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1664   /// OMPCanonicalLoop.
1665   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1666     return getSema().OpenMP().ActOnOpenMPCanonicalLoop(LoopStmt);
1667   }
1668 
1669   /// Build a new OpenMP executable directive.
1670   ///
1671   /// By default, performs semantic analysis to build the new statement.
1672   /// Subclasses may override this routine to provide different behavior.
1673   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1674                                            DeclarationNameInfo DirName,
1675                                            OpenMPDirectiveKind CancelRegion,
1676                                            ArrayRef<OMPClause *> Clauses,
1677                                            Stmt *AStmt, SourceLocation StartLoc,
1678                                            SourceLocation EndLoc) {
1679 
1680     return getSema().OpenMP().ActOnOpenMPExecutableDirective(
1681         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1682   }
1683 
1684   /// Build a new OpenMP informational directive.
1685   StmtResult RebuildOMPInformationalDirective(OpenMPDirectiveKind Kind,
1686                                               DeclarationNameInfo DirName,
1687                                               ArrayRef<OMPClause *> Clauses,
1688                                               Stmt *AStmt,
1689                                               SourceLocation StartLoc,
1690                                               SourceLocation EndLoc) {
1691 
1692     return getSema().OpenMP().ActOnOpenMPInformationalDirective(
1693         Kind, DirName, Clauses, AStmt, StartLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'if' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1701                                 Expr *Condition, SourceLocation StartLoc,
1702                                 SourceLocation LParenLoc,
1703                                 SourceLocation NameModifierLoc,
1704                                 SourceLocation ColonLoc,
1705                                 SourceLocation EndLoc) {
1706     return getSema().OpenMP().ActOnOpenMPIfClause(
1707         NameModifier, Condition, StartLoc, LParenLoc, NameModifierLoc, ColonLoc,
1708         EndLoc);
1709   }
1710 
1711   /// Build a new OpenMP 'final' clause.
1712   ///
1713   /// By default, performs semantic analysis to build the new OpenMP clause.
1714   /// Subclasses may override this routine to provide different behavior.
1715   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1716                                    SourceLocation LParenLoc,
1717                                    SourceLocation EndLoc) {
1718     return getSema().OpenMP().ActOnOpenMPFinalClause(Condition, StartLoc,
1719                                                      LParenLoc, EndLoc);
1720   }
1721 
1722   /// Build a new OpenMP 'num_threads' clause.
1723   ///
1724   /// By default, performs semantic analysis to build the new OpenMP clause.
1725   /// Subclasses may override this routine to provide different behavior.
1726   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1727                                         SourceLocation StartLoc,
1728                                         SourceLocation LParenLoc,
1729                                         SourceLocation EndLoc) {
1730     return getSema().OpenMP().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1731                                                           LParenLoc, EndLoc);
1732   }
1733 
1734   /// Build a new OpenMP 'safelen' clause.
1735   ///
1736   /// By default, performs semantic analysis to build the new OpenMP clause.
1737   /// Subclasses may override this routine to provide different behavior.
1738   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1739                                      SourceLocation LParenLoc,
1740                                      SourceLocation EndLoc) {
1741     return getSema().OpenMP().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc,
1742                                                        EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'simdlen' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
1749   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1750                                      SourceLocation LParenLoc,
1751                                      SourceLocation EndLoc) {
1752     return getSema().OpenMP().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc,
1753                                                        EndLoc);
1754   }
1755 
1756   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1757                                    SourceLocation StartLoc,
1758                                    SourceLocation LParenLoc,
1759                                    SourceLocation EndLoc) {
1760     return getSema().OpenMP().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc,
1761                                                      EndLoc);
1762   }
1763 
1764   /// Build a new OpenMP 'permutation' clause.
1765   OMPClause *RebuildOMPPermutationClause(ArrayRef<Expr *> PermExprs,
1766                                          SourceLocation StartLoc,
1767                                          SourceLocation LParenLoc,
1768                                          SourceLocation EndLoc) {
1769     return getSema().OpenMP().ActOnOpenMPPermutationClause(PermExprs, StartLoc,
1770                                                            LParenLoc, EndLoc);
1771   }
1772 
1773   /// Build a new OpenMP 'full' clause.
1774   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1775                                   SourceLocation EndLoc) {
1776     return getSema().OpenMP().ActOnOpenMPFullClause(StartLoc, EndLoc);
1777   }
1778 
1779   /// Build a new OpenMP 'partial' clause.
1780   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1781                                      SourceLocation LParenLoc,
1782                                      SourceLocation EndLoc) {
1783     return getSema().OpenMP().ActOnOpenMPPartialClause(Factor, StartLoc,
1784                                                        LParenLoc, EndLoc);
1785   }
1786 
1787   /// Build a new OpenMP 'allocator' clause.
1788   ///
1789   /// By default, performs semantic analysis to build the new OpenMP clause.
1790   /// Subclasses may override this routine to provide different behavior.
1791   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1792                                        SourceLocation LParenLoc,
1793                                        SourceLocation EndLoc) {
1794     return getSema().OpenMP().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc,
1795                                                          EndLoc);
1796   }
1797 
1798   /// Build a new OpenMP 'collapse' clause.
1799   ///
1800   /// By default, performs semantic analysis to build the new OpenMP clause.
1801   /// Subclasses may override this routine to provide different behavior.
1802   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1803                                       SourceLocation LParenLoc,
1804                                       SourceLocation EndLoc) {
1805     return getSema().OpenMP().ActOnOpenMPCollapseClause(Num, StartLoc,
1806                                                         LParenLoc, EndLoc);
1807   }
1808 
1809   /// Build a new OpenMP 'default' clause.
1810   ///
1811   /// By default, performs semantic analysis to build the new OpenMP clause.
1812   /// Subclasses may override this routine to provide different behavior.
1813   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1814                                      SourceLocation StartLoc,
1815                                      SourceLocation LParenLoc,
1816                                      SourceLocation EndLoc) {
1817     return getSema().OpenMP().ActOnOpenMPDefaultClause(
1818         Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1819   }
1820 
1821   /// Build a new OpenMP 'proc_bind' clause.
1822   ///
1823   /// By default, performs semantic analysis to build the new OpenMP clause.
1824   /// Subclasses may override this routine to provide different behavior.
1825   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1826                                       SourceLocation KindKwLoc,
1827                                       SourceLocation StartLoc,
1828                                       SourceLocation LParenLoc,
1829                                       SourceLocation EndLoc) {
1830     return getSema().OpenMP().ActOnOpenMPProcBindClause(
1831         Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
1832   }
1833 
1834   /// Build a new OpenMP 'schedule' clause.
1835   ///
1836   /// By default, performs semantic analysis to build the new OpenMP clause.
1837   /// Subclasses may override this routine to provide different behavior.
1838   OMPClause *RebuildOMPScheduleClause(
1839       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1840       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1841       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1842       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1843     return getSema().OpenMP().ActOnOpenMPScheduleClause(
1844         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1845         CommaLoc, EndLoc);
1846   }
1847 
1848   /// Build a new OpenMP 'ordered' clause.
1849   ///
1850   /// By default, performs semantic analysis to build the new OpenMP clause.
1851   /// Subclasses may override this routine to provide different behavior.
1852   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1853                                      SourceLocation EndLoc,
1854                                      SourceLocation LParenLoc, Expr *Num) {
1855     return getSema().OpenMP().ActOnOpenMPOrderedClause(StartLoc, EndLoc,
1856                                                        LParenLoc, Num);
1857   }
1858 
1859   /// Build a new OpenMP 'private' clause.
1860   ///
1861   /// By default, performs semantic analysis to build the new OpenMP clause.
1862   /// Subclasses may override this routine to provide different behavior.
1863   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1864                                      SourceLocation StartLoc,
1865                                      SourceLocation LParenLoc,
1866                                      SourceLocation EndLoc) {
1867     return getSema().OpenMP().ActOnOpenMPPrivateClause(VarList, StartLoc,
1868                                                        LParenLoc, EndLoc);
1869   }
1870 
1871   /// Build a new OpenMP 'firstprivate' clause.
1872   ///
1873   /// By default, performs semantic analysis to build the new OpenMP clause.
1874   /// Subclasses may override this routine to provide different behavior.
1875   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1876                                           SourceLocation StartLoc,
1877                                           SourceLocation LParenLoc,
1878                                           SourceLocation EndLoc) {
1879     return getSema().OpenMP().ActOnOpenMPFirstprivateClause(VarList, StartLoc,
1880                                                             LParenLoc, EndLoc);
1881   }
1882 
1883   /// Build a new OpenMP 'lastprivate' clause.
1884   ///
1885   /// By default, performs semantic analysis to build the new OpenMP clause.
1886   /// Subclasses may override this routine to provide different behavior.
1887   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1888                                          OpenMPLastprivateModifier LPKind,
1889                                          SourceLocation LPKindLoc,
1890                                          SourceLocation ColonLoc,
1891                                          SourceLocation StartLoc,
1892                                          SourceLocation LParenLoc,
1893                                          SourceLocation EndLoc) {
1894     return getSema().OpenMP().ActOnOpenMPLastprivateClause(
1895         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1896   }
1897 
1898   /// Build a new OpenMP 'shared' clause.
1899   ///
1900   /// By default, performs semantic analysis to build the new OpenMP clause.
1901   /// Subclasses may override this routine to provide different behavior.
1902   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1903                                     SourceLocation StartLoc,
1904                                     SourceLocation LParenLoc,
1905                                     SourceLocation EndLoc) {
1906     return getSema().OpenMP().ActOnOpenMPSharedClause(VarList, StartLoc,
1907                                                       LParenLoc, EndLoc);
1908   }
1909 
1910   /// Build a new OpenMP 'reduction' clause.
1911   ///
1912   /// By default, performs semantic analysis to build the new statement.
1913   /// Subclasses may override this routine to provide different behavior.
1914   OMPClause *RebuildOMPReductionClause(
1915       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1916       SourceLocation StartLoc, SourceLocation LParenLoc,
1917       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1918       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1919       const DeclarationNameInfo &ReductionId,
1920       ArrayRef<Expr *> UnresolvedReductions) {
1921     return getSema().OpenMP().ActOnOpenMPReductionClause(
1922         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1923         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1924   }
1925 
1926   /// Build a new OpenMP 'task_reduction' clause.
1927   ///
1928   /// By default, performs semantic analysis to build the new statement.
1929   /// Subclasses may override this routine to provide different behavior.
1930   OMPClause *RebuildOMPTaskReductionClause(
1931       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1932       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1933       CXXScopeSpec &ReductionIdScopeSpec,
1934       const DeclarationNameInfo &ReductionId,
1935       ArrayRef<Expr *> UnresolvedReductions) {
1936     return getSema().OpenMP().ActOnOpenMPTaskReductionClause(
1937         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1938         ReductionId, UnresolvedReductions);
1939   }
1940 
1941   /// Build a new OpenMP 'in_reduction' clause.
1942   ///
1943   /// By default, performs semantic analysis to build the new statement.
1944   /// Subclasses may override this routine to provide different behavior.
1945   OMPClause *
1946   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1947                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1948                               SourceLocation EndLoc,
1949                               CXXScopeSpec &ReductionIdScopeSpec,
1950                               const DeclarationNameInfo &ReductionId,
1951                               ArrayRef<Expr *> UnresolvedReductions) {
1952     return getSema().OpenMP().ActOnOpenMPInReductionClause(
1953         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1954         ReductionId, UnresolvedReductions);
1955   }
1956 
1957   /// Build a new OpenMP 'linear' clause.
1958   ///
1959   /// By default, performs semantic analysis to build the new OpenMP clause.
1960   /// Subclasses may override this routine to provide different behavior.
1961   OMPClause *RebuildOMPLinearClause(
1962       ArrayRef<Expr *> VarList, Expr *Step, SourceLocation StartLoc,
1963       SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier,
1964       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1965       SourceLocation StepModifierLoc, SourceLocation EndLoc) {
1966     return getSema().OpenMP().ActOnOpenMPLinearClause(
1967         VarList, Step, StartLoc, LParenLoc, Modifier, ModifierLoc, ColonLoc,
1968         StepModifierLoc, EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'aligned' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new OpenMP clause.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1976                                      SourceLocation StartLoc,
1977                                      SourceLocation LParenLoc,
1978                                      SourceLocation ColonLoc,
1979                                      SourceLocation EndLoc) {
1980     return getSema().OpenMP().ActOnOpenMPAlignedClause(
1981         VarList, Alignment, StartLoc, LParenLoc, ColonLoc, EndLoc);
1982   }
1983 
1984   /// Build a new OpenMP 'copyin' clause.
1985   ///
1986   /// By default, performs semantic analysis to build the new OpenMP clause.
1987   /// Subclasses may override this routine to provide different behavior.
1988   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1989                                     SourceLocation StartLoc,
1990                                     SourceLocation LParenLoc,
1991                                     SourceLocation EndLoc) {
1992     return getSema().OpenMP().ActOnOpenMPCopyinClause(VarList, StartLoc,
1993                                                       LParenLoc, EndLoc);
1994   }
1995 
1996   /// Build a new OpenMP 'copyprivate' clause.
1997   ///
1998   /// By default, performs semantic analysis to build the new OpenMP clause.
1999   /// Subclasses may override this routine to provide different behavior.
2000   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
2001                                          SourceLocation StartLoc,
2002                                          SourceLocation LParenLoc,
2003                                          SourceLocation EndLoc) {
2004     return getSema().OpenMP().ActOnOpenMPCopyprivateClause(VarList, StartLoc,
2005                                                            LParenLoc, EndLoc);
2006   }
2007 
2008   /// Build a new OpenMP 'flush' pseudo clause.
2009   ///
2010   /// By default, performs semantic analysis to build the new OpenMP clause.
2011   /// Subclasses may override this routine to provide different behavior.
2012   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
2013                                    SourceLocation StartLoc,
2014                                    SourceLocation LParenLoc,
2015                                    SourceLocation EndLoc) {
2016     return getSema().OpenMP().ActOnOpenMPFlushClause(VarList, StartLoc,
2017                                                      LParenLoc, EndLoc);
2018   }
2019 
2020   /// Build a new OpenMP 'depobj' pseudo clause.
2021   ///
2022   /// By default, performs semantic analysis to build the new OpenMP clause.
2023   /// Subclasses may override this routine to provide different behavior.
2024   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
2025                                     SourceLocation LParenLoc,
2026                                     SourceLocation EndLoc) {
2027     return getSema().OpenMP().ActOnOpenMPDepobjClause(Depobj, StartLoc,
2028                                                       LParenLoc, EndLoc);
2029   }
2030 
2031   /// Build a new OpenMP 'depend' pseudo clause.
2032   ///
2033   /// By default, performs semantic analysis to build the new OpenMP clause.
2034   /// Subclasses may override this routine to provide different behavior.
2035   OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data,
2036                                     Expr *DepModifier, ArrayRef<Expr *> VarList,
2037                                     SourceLocation StartLoc,
2038                                     SourceLocation LParenLoc,
2039                                     SourceLocation EndLoc) {
2040     return getSema().OpenMP().ActOnOpenMPDependClause(
2041         Data, DepModifier, VarList, StartLoc, LParenLoc, EndLoc);
2042   }
2043 
2044   /// Build a new OpenMP 'device' clause.
2045   ///
2046   /// By default, performs semantic analysis to build the new statement.
2047   /// Subclasses may override this routine to provide different behavior.
2048   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
2049                                     Expr *Device, SourceLocation StartLoc,
2050                                     SourceLocation LParenLoc,
2051                                     SourceLocation ModifierLoc,
2052                                     SourceLocation EndLoc) {
2053     return getSema().OpenMP().ActOnOpenMPDeviceClause(
2054         Modifier, Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2055   }
2056 
2057   /// Build a new OpenMP 'map' clause.
2058   ///
2059   /// By default, performs semantic analysis to build the new OpenMP clause.
2060   /// Subclasses may override this routine to provide different behavior.
2061   OMPClause *RebuildOMPMapClause(
2062       Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
2063       ArrayRef<SourceLocation> MapTypeModifiersLoc,
2064       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
2065       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
2066       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
2067       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
2068     return getSema().OpenMP().ActOnOpenMPMapClause(
2069         IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
2070         MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
2071         ColonLoc, VarList, Locs,
2072         /*NoDiagnose=*/false, UnresolvedMappers);
2073   }
2074 
2075   /// Build a new OpenMP 'allocate' clause.
2076   ///
2077   /// By default, performs semantic analysis to build the new OpenMP clause.
2078   /// Subclasses may override this routine to provide different behavior.
2079   OMPClause *
2080   RebuildOMPAllocateClause(Expr *Allocate, Expr *Alignment,
2081                            OpenMPAllocateClauseModifier FirstModifier,
2082                            SourceLocation FirstModifierLoc,
2083                            OpenMPAllocateClauseModifier SecondModifier,
2084                            SourceLocation SecondModifierLoc,
2085                            ArrayRef<Expr *> VarList, SourceLocation StartLoc,
2086                            SourceLocation LParenLoc, SourceLocation ColonLoc,
2087                            SourceLocation EndLoc) {
2088     return getSema().OpenMP().ActOnOpenMPAllocateClause(
2089         Allocate, Alignment, FirstModifier, FirstModifierLoc, SecondModifier,
2090         SecondModifierLoc, VarList, StartLoc, LParenLoc, ColonLoc, EndLoc);
2091   }
2092 
2093   /// Build a new OpenMP 'num_teams' clause.
2094   ///
2095   /// By default, performs semantic analysis to build the new statement.
2096   /// Subclasses may override this routine to provide different behavior.
2097   OMPClause *RebuildOMPNumTeamsClause(ArrayRef<Expr *> VarList,
2098                                       SourceLocation StartLoc,
2099                                       SourceLocation LParenLoc,
2100                                       SourceLocation EndLoc) {
2101     return getSema().OpenMP().ActOnOpenMPNumTeamsClause(VarList, StartLoc,
2102                                                         LParenLoc, EndLoc);
2103   }
2104 
2105   /// Build a new OpenMP 'thread_limit' clause.
2106   ///
2107   /// By default, performs semantic analysis to build the new statement.
2108   /// Subclasses may override this routine to provide different behavior.
2109   OMPClause *RebuildOMPThreadLimitClause(ArrayRef<Expr *> VarList,
2110                                          SourceLocation StartLoc,
2111                                          SourceLocation LParenLoc,
2112                                          SourceLocation EndLoc) {
2113     return getSema().OpenMP().ActOnOpenMPThreadLimitClause(VarList, StartLoc,
2114                                                            LParenLoc, EndLoc);
2115   }
2116 
2117   /// Build a new OpenMP 'priority' clause.
2118   ///
2119   /// By default, performs semantic analysis to build the new statement.
2120   /// Subclasses may override this routine to provide different behavior.
2121   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
2122                                       SourceLocation LParenLoc,
2123                                       SourceLocation EndLoc) {
2124     return getSema().OpenMP().ActOnOpenMPPriorityClause(Priority, StartLoc,
2125                                                         LParenLoc, EndLoc);
2126   }
2127 
2128   /// Build a new OpenMP 'grainsize' clause.
2129   ///
2130   /// By default, performs semantic analysis to build the new statement.
2131   /// Subclasses may override this routine to provide different behavior.
2132   OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
2133                                        Expr *Device, SourceLocation StartLoc,
2134                                        SourceLocation LParenLoc,
2135                                        SourceLocation ModifierLoc,
2136                                        SourceLocation EndLoc) {
2137     return getSema().OpenMP().ActOnOpenMPGrainsizeClause(
2138         Modifier, Device, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2139   }
2140 
2141   /// Build a new OpenMP 'num_tasks' clause.
2142   ///
2143   /// By default, performs semantic analysis to build the new statement.
2144   /// Subclasses may override this routine to provide different behavior.
2145   OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
2146                                       Expr *NumTasks, SourceLocation StartLoc,
2147                                       SourceLocation LParenLoc,
2148                                       SourceLocation ModifierLoc,
2149                                       SourceLocation EndLoc) {
2150     return getSema().OpenMP().ActOnOpenMPNumTasksClause(
2151         Modifier, NumTasks, StartLoc, LParenLoc, ModifierLoc, EndLoc);
2152   }
2153 
2154   /// Build a new OpenMP 'hint' clause.
2155   ///
2156   /// By default, performs semantic analysis to build the new statement.
2157   /// Subclasses may override this routine to provide different behavior.
2158   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2159                                   SourceLocation LParenLoc,
2160                                   SourceLocation EndLoc) {
2161     return getSema().OpenMP().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc,
2162                                                     EndLoc);
2163   }
2164 
2165   /// Build a new OpenMP 'detach' clause.
2166   ///
2167   /// By default, performs semantic analysis to build the new statement.
2168   /// Subclasses may override this routine to provide different behavior.
2169   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2170                                     SourceLocation LParenLoc,
2171                                     SourceLocation EndLoc) {
2172     return getSema().OpenMP().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc,
2173                                                       EndLoc);
2174   }
2175 
2176   /// Build a new OpenMP 'dist_schedule' clause.
2177   ///
2178   /// By default, performs semantic analysis to build the new OpenMP clause.
2179   /// Subclasses may override this routine to provide different behavior.
2180   OMPClause *
2181   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2182                                Expr *ChunkSize, SourceLocation StartLoc,
2183                                SourceLocation LParenLoc, SourceLocation KindLoc,
2184                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2185     return getSema().OpenMP().ActOnOpenMPDistScheduleClause(
2186         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2187   }
2188 
2189   /// Build a new OpenMP 'to' clause.
2190   ///
2191   /// By default, performs semantic analysis to build the new statement.
2192   /// Subclasses may override this routine to provide different behavior.
2193   OMPClause *
2194   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2195                      ArrayRef<SourceLocation> MotionModifiersLoc,
2196                      CXXScopeSpec &MapperIdScopeSpec,
2197                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2198                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2199                      ArrayRef<Expr *> UnresolvedMappers) {
2200     return getSema().OpenMP().ActOnOpenMPToClause(
2201         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2202         ColonLoc, VarList, Locs, UnresolvedMappers);
2203   }
2204 
2205   /// Build a new OpenMP 'from' clause.
2206   ///
2207   /// By default, performs semantic analysis to build the new statement.
2208   /// Subclasses may override this routine to provide different behavior.
2209   OMPClause *
2210   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2211                        ArrayRef<SourceLocation> MotionModifiersLoc,
2212                        CXXScopeSpec &MapperIdScopeSpec,
2213                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2214                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2215                        ArrayRef<Expr *> UnresolvedMappers) {
2216     return getSema().OpenMP().ActOnOpenMPFromClause(
2217         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2218         ColonLoc, VarList, Locs, UnresolvedMappers);
2219   }
2220 
2221   /// Build a new OpenMP 'use_device_ptr' clause.
2222   ///
2223   /// By default, performs semantic analysis to build the new OpenMP clause.
2224   /// Subclasses may override this routine to provide different behavior.
2225   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2226                                           const OMPVarListLocTy &Locs) {
2227     return getSema().OpenMP().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2228   }
2229 
2230   /// Build a new OpenMP 'use_device_addr' clause.
2231   ///
2232   /// By default, performs semantic analysis to build the new OpenMP clause.
2233   /// Subclasses may override this routine to provide different behavior.
2234   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2235                                            const OMPVarListLocTy &Locs) {
2236     return getSema().OpenMP().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2237   }
2238 
2239   /// Build a new OpenMP 'is_device_ptr' clause.
2240   ///
2241   /// By default, performs semantic analysis to build the new OpenMP clause.
2242   /// Subclasses may override this routine to provide different behavior.
2243   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2244                                          const OMPVarListLocTy &Locs) {
2245     return getSema().OpenMP().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2246   }
2247 
2248   /// Build a new OpenMP 'has_device_addr' clause.
2249   ///
2250   /// By default, performs semantic analysis to build the new OpenMP clause.
2251   /// Subclasses may override this routine to provide different behavior.
2252   OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2253                                            const OMPVarListLocTy &Locs) {
2254     return getSema().OpenMP().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2255   }
2256 
2257   /// Build a new OpenMP 'defaultmap' clause.
2258   ///
2259   /// By default, performs semantic analysis to build the new OpenMP clause.
2260   /// Subclasses may override this routine to provide different behavior.
2261   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2262                                         OpenMPDefaultmapClauseKind Kind,
2263                                         SourceLocation StartLoc,
2264                                         SourceLocation LParenLoc,
2265                                         SourceLocation MLoc,
2266                                         SourceLocation KindLoc,
2267                                         SourceLocation EndLoc) {
2268     return getSema().OpenMP().ActOnOpenMPDefaultmapClause(
2269         M, Kind, StartLoc, LParenLoc, MLoc, KindLoc, EndLoc);
2270   }
2271 
2272   /// Build a new OpenMP 'nontemporal' clause.
2273   ///
2274   /// By default, performs semantic analysis to build the new OpenMP clause.
2275   /// Subclasses may override this routine to provide different behavior.
2276   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2277                                          SourceLocation StartLoc,
2278                                          SourceLocation LParenLoc,
2279                                          SourceLocation EndLoc) {
2280     return getSema().OpenMP().ActOnOpenMPNontemporalClause(VarList, StartLoc,
2281                                                            LParenLoc, EndLoc);
2282   }
2283 
2284   /// Build a new OpenMP 'inclusive' clause.
2285   ///
2286   /// By default, performs semantic analysis to build the new OpenMP clause.
2287   /// Subclasses may override this routine to provide different behavior.
2288   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2289                                        SourceLocation StartLoc,
2290                                        SourceLocation LParenLoc,
2291                                        SourceLocation EndLoc) {
2292     return getSema().OpenMP().ActOnOpenMPInclusiveClause(VarList, StartLoc,
2293                                                          LParenLoc, EndLoc);
2294   }
2295 
2296   /// Build a new OpenMP 'exclusive' clause.
2297   ///
2298   /// By default, performs semantic analysis to build the new OpenMP clause.
2299   /// Subclasses may override this routine to provide different behavior.
2300   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2301                                        SourceLocation StartLoc,
2302                                        SourceLocation LParenLoc,
2303                                        SourceLocation EndLoc) {
2304     return getSema().OpenMP().ActOnOpenMPExclusiveClause(VarList, StartLoc,
2305                                                          LParenLoc, EndLoc);
2306   }
2307 
2308   /// Build a new OpenMP 'uses_allocators' clause.
2309   ///
2310   /// By default, performs semantic analysis to build the new OpenMP clause.
2311   /// Subclasses may override this routine to provide different behavior.
2312   OMPClause *RebuildOMPUsesAllocatorsClause(
2313       ArrayRef<SemaOpenMP::UsesAllocatorsData> Data, SourceLocation StartLoc,
2314       SourceLocation LParenLoc, SourceLocation EndLoc) {
2315     return getSema().OpenMP().ActOnOpenMPUsesAllocatorClause(
2316         StartLoc, LParenLoc, EndLoc, Data);
2317   }
2318 
2319   /// Build a new OpenMP 'affinity' clause.
2320   ///
2321   /// By default, performs semantic analysis to build the new OpenMP clause.
2322   /// Subclasses may override this routine to provide different behavior.
2323   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2324                                       SourceLocation LParenLoc,
2325                                       SourceLocation ColonLoc,
2326                                       SourceLocation EndLoc, Expr *Modifier,
2327                                       ArrayRef<Expr *> Locators) {
2328     return getSema().OpenMP().ActOnOpenMPAffinityClause(
2329         StartLoc, LParenLoc, ColonLoc, EndLoc, Modifier, Locators);
2330   }
2331 
2332   /// Build a new OpenMP 'order' clause.
2333   ///
2334   /// By default, performs semantic analysis to build the new OpenMP clause.
2335   /// Subclasses may override this routine to provide different behavior.
2336   OMPClause *RebuildOMPOrderClause(
2337       OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc,
2338       SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc,
2339       OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) {
2340     return getSema().OpenMP().ActOnOpenMPOrderClause(
2341         Modifier, Kind, StartLoc, LParenLoc, ModifierKwLoc, KindKwLoc, EndLoc);
2342   }
2343 
2344   /// Build a new OpenMP 'init' clause.
2345   ///
2346   /// By default, performs semantic analysis to build the new OpenMP clause.
2347   /// Subclasses may override this routine to provide different behavior.
2348   OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
2349                                   SourceLocation StartLoc,
2350                                   SourceLocation LParenLoc,
2351                                   SourceLocation VarLoc,
2352                                   SourceLocation EndLoc) {
2353     return getSema().OpenMP().ActOnOpenMPInitClause(
2354         InteropVar, InteropInfo, StartLoc, LParenLoc, VarLoc, EndLoc);
2355   }
2356 
2357   /// Build a new OpenMP 'use' clause.
2358   ///
2359   /// By default, performs semantic analysis to build the new OpenMP clause.
2360   /// Subclasses may override this routine to provide different behavior.
2361   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2362                                  SourceLocation LParenLoc,
2363                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2364     return getSema().OpenMP().ActOnOpenMPUseClause(InteropVar, StartLoc,
2365                                                    LParenLoc, VarLoc, EndLoc);
2366   }
2367 
2368   /// Build a new OpenMP 'destroy' clause.
2369   ///
2370   /// By default, performs semantic analysis to build the new OpenMP clause.
2371   /// Subclasses may override this routine to provide different behavior.
2372   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2373                                      SourceLocation LParenLoc,
2374                                      SourceLocation VarLoc,
2375                                      SourceLocation EndLoc) {
2376     return getSema().OpenMP().ActOnOpenMPDestroyClause(
2377         InteropVar, StartLoc, LParenLoc, VarLoc, EndLoc);
2378   }
2379 
2380   /// Build a new OpenMP 'novariants' clause.
2381   ///
2382   /// By default, performs semantic analysis to build the new OpenMP clause.
2383   /// Subclasses may override this routine to provide different behavior.
2384   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2385                                         SourceLocation StartLoc,
2386                                         SourceLocation LParenLoc,
2387                                         SourceLocation EndLoc) {
2388     return getSema().OpenMP().ActOnOpenMPNovariantsClause(Condition, StartLoc,
2389                                                           LParenLoc, EndLoc);
2390   }
2391 
2392   /// Build a new OpenMP 'nocontext' clause.
2393   ///
2394   /// By default, performs semantic analysis to build the new OpenMP clause.
2395   /// Subclasses may override this routine to provide different behavior.
2396   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2397                                        SourceLocation LParenLoc,
2398                                        SourceLocation EndLoc) {
2399     return getSema().OpenMP().ActOnOpenMPNocontextClause(Condition, StartLoc,
2400                                                          LParenLoc, EndLoc);
2401   }
2402 
2403   /// Build a new OpenMP 'filter' clause.
2404   ///
2405   /// By default, performs semantic analysis to build the new OpenMP clause.
2406   /// Subclasses may override this routine to provide different behavior.
2407   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2408                                     SourceLocation LParenLoc,
2409                                     SourceLocation EndLoc) {
2410     return getSema().OpenMP().ActOnOpenMPFilterClause(ThreadID, StartLoc,
2411                                                       LParenLoc, EndLoc);
2412   }
2413 
2414   /// Build a new OpenMP 'bind' clause.
2415   ///
2416   /// By default, performs semantic analysis to build the new OpenMP clause.
2417   /// Subclasses may override this routine to provide different behavior.
2418   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2419                                   SourceLocation KindLoc,
2420                                   SourceLocation StartLoc,
2421                                   SourceLocation LParenLoc,
2422                                   SourceLocation EndLoc) {
2423     return getSema().OpenMP().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc,
2424                                                     LParenLoc, EndLoc);
2425   }
2426 
2427   /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause.
2428   ///
2429   /// By default, performs semantic analysis to build the new OpenMP clause.
2430   /// Subclasses may override this routine to provide different behavior.
2431   OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
2432                                            SourceLocation LParenLoc,
2433                                            SourceLocation EndLoc) {
2434     return getSema().OpenMP().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc,
2435                                                              LParenLoc, EndLoc);
2436   }
2437 
2438   /// Build a new OpenMP 'ompx_attribute' clause.
2439   ///
2440   /// By default, performs semantic analysis to build the new OpenMP clause.
2441   /// Subclasses may override this routine to provide different behavior.
2442   OMPClause *RebuildOMPXAttributeClause(ArrayRef<const Attr *> Attrs,
2443                                         SourceLocation StartLoc,
2444                                         SourceLocation LParenLoc,
2445                                         SourceLocation EndLoc) {
2446     return getSema().OpenMP().ActOnOpenMPXAttributeClause(Attrs, StartLoc,
2447                                                           LParenLoc, EndLoc);
2448   }
2449 
2450   /// Build a new OpenMP 'ompx_bare' clause.
2451   ///
2452   /// By default, performs semantic analysis to build the new OpenMP clause.
2453   /// Subclasses may override this routine to provide different behavior.
2454   OMPClause *RebuildOMPXBareClause(SourceLocation StartLoc,
2455                                    SourceLocation EndLoc) {
2456     return getSema().OpenMP().ActOnOpenMPXBareClause(StartLoc, EndLoc);
2457   }
2458 
2459   /// Build a new OpenMP 'align' clause.
2460   ///
2461   /// By default, performs semantic analysis to build the new OpenMP clause.
2462   /// Subclasses may override this routine to provide different behavior.
2463   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2464                                    SourceLocation LParenLoc,
2465                                    SourceLocation EndLoc) {
2466     return getSema().OpenMP().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc,
2467                                                      EndLoc);
2468   }
2469 
2470   /// Build a new OpenMP 'at' clause.
2471   ///
2472   /// By default, performs semantic analysis to build the new OpenMP clause.
2473   /// Subclasses may override this routine to provide different behavior.
2474   OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc,
2475                                 SourceLocation StartLoc,
2476                                 SourceLocation LParenLoc,
2477                                 SourceLocation EndLoc) {
2478     return getSema().OpenMP().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc,
2479                                                   LParenLoc, EndLoc);
2480   }
2481 
2482   /// Build a new OpenMP 'severity' clause.
2483   ///
2484   /// By default, performs semantic analysis to build the new OpenMP clause.
2485   /// Subclasses may override this routine to provide different behavior.
2486   OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,
2487                                       SourceLocation KwLoc,
2488                                       SourceLocation StartLoc,
2489                                       SourceLocation LParenLoc,
2490                                       SourceLocation EndLoc) {
2491     return getSema().OpenMP().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc,
2492                                                         LParenLoc, EndLoc);
2493   }
2494 
2495   /// Build a new OpenMP 'message' clause.
2496   ///
2497   /// By default, performs semantic analysis to build the new OpenMP clause.
2498   /// Subclasses may override this routine to provide different behavior.
2499   OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc,
2500                                      SourceLocation LParenLoc,
2501                                      SourceLocation EndLoc) {
2502     return getSema().OpenMP().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc,
2503                                                        EndLoc);
2504   }
2505 
2506   /// Build a new OpenMP 'doacross' clause.
2507   ///
2508   /// By default, performs semantic analysis to build the new OpenMP clause.
2509   /// Subclasses may override this routine to provide different behavior.
2510   OMPClause *
2511   RebuildOMPDoacrossClause(OpenMPDoacrossClauseModifier DepType,
2512                            SourceLocation DepLoc, SourceLocation ColonLoc,
2513                            ArrayRef<Expr *> VarList, SourceLocation StartLoc,
2514                            SourceLocation LParenLoc, SourceLocation EndLoc) {
2515     return getSema().OpenMP().ActOnOpenMPDoacrossClause(
2516         DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
2517   }
2518 
2519   /// Build a new OpenMP 'holds' clause.
2520   OMPClause *RebuildOMPHoldsClause(Expr *A, SourceLocation StartLoc,
2521                                    SourceLocation LParenLoc,
2522                                    SourceLocation EndLoc) {
2523     return getSema().OpenMP().ActOnOpenMPHoldsClause(A, StartLoc, LParenLoc,
2524                                                      EndLoc);
2525   }
2526 
2527   /// Rebuild the operand to an Objective-C \@synchronized statement.
2528   ///
2529   /// By default, performs semantic analysis to build the new statement.
2530   /// Subclasses may override this routine to provide different behavior.
2531   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2532                                               Expr *object) {
2533     return getSema().ObjC().ActOnObjCAtSynchronizedOperand(atLoc, object);
2534   }
2535 
2536   /// Build a new Objective-C \@synchronized statement.
2537   ///
2538   /// By default, performs semantic analysis to build the new statement.
2539   /// Subclasses may override this routine to provide different behavior.
2540   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2541                                            Expr *Object, Stmt *Body) {
2542     return getSema().ObjC().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2543   }
2544 
2545   /// Build a new Objective-C \@autoreleasepool statement.
2546   ///
2547   /// By default, performs semantic analysis to build the new statement.
2548   /// Subclasses may override this routine to provide different behavior.
2549   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2550                                             Stmt *Body) {
2551     return getSema().ObjC().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2552   }
2553 
2554   /// Build a new Objective-C fast enumeration statement.
2555   ///
2556   /// By default, performs semantic analysis to build the new statement.
2557   /// Subclasses may override this routine to provide different behavior.
2558   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2559                                           Stmt *Element,
2560                                           Expr *Collection,
2561                                           SourceLocation RParenLoc,
2562                                           Stmt *Body) {
2563     StmtResult ForEachStmt = getSema().ObjC().ActOnObjCForCollectionStmt(
2564         ForLoc, Element, Collection, RParenLoc);
2565     if (ForEachStmt.isInvalid())
2566       return StmtError();
2567 
2568     return getSema().ObjC().FinishObjCForCollectionStmt(ForEachStmt.get(),
2569                                                         Body);
2570   }
2571 
2572   /// Build a new C++ exception declaration.
2573   ///
2574   /// By default, performs semantic analysis to build the new decaration.
2575   /// Subclasses may override this routine to provide different behavior.
2576   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2577                                 TypeSourceInfo *Declarator,
2578                                 SourceLocation StartLoc,
2579                                 SourceLocation IdLoc,
2580                                 IdentifierInfo *Id) {
2581     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2582                                                        StartLoc, IdLoc, Id);
2583     if (Var)
2584       getSema().CurContext->addDecl(Var);
2585     return Var;
2586   }
2587 
2588   /// Build a new C++ catch statement.
2589   ///
2590   /// By default, performs semantic analysis to build the new statement.
2591   /// Subclasses may override this routine to provide different behavior.
2592   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2593                                  VarDecl *ExceptionDecl,
2594                                  Stmt *Handler) {
2595     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2596                                                       Handler));
2597   }
2598 
2599   /// Build a new C++ try statement.
2600   ///
2601   /// By default, performs semantic analysis to build the new statement.
2602   /// Subclasses may override this routine to provide different behavior.
2603   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2604                                ArrayRef<Stmt *> Handlers) {
2605     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2606   }
2607 
2608   /// Build a new C++0x range-based for statement.
2609   ///
2610   /// By default, performs semantic analysis to build the new statement.
2611   /// Subclasses may override this routine to provide different behavior.
2612   StmtResult RebuildCXXForRangeStmt(
2613       SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *Init,
2614       SourceLocation ColonLoc, Stmt *Range, Stmt *Begin, Stmt *End, Expr *Cond,
2615       Expr *Inc, Stmt *LoopVar, SourceLocation RParenLoc,
2616       ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps) {
2617     // If we've just learned that the range is actually an Objective-C
2618     // collection, treat this as an Objective-C fast enumeration loop.
2619     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2620       if (RangeStmt->isSingleDecl()) {
2621         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2622           if (RangeVar->isInvalidDecl())
2623             return StmtError();
2624 
2625           Expr *RangeExpr = RangeVar->getInit();
2626           if (!RangeExpr->isTypeDependent() &&
2627               RangeExpr->getType()->isObjCObjectPointerType()) {
2628             // FIXME: Support init-statements in Objective-C++20 ranged for
2629             // statement.
2630             if (Init) {
2631               return SemaRef.Diag(Init->getBeginLoc(),
2632                                   diag::err_objc_for_range_init_stmt)
2633                          << Init->getSourceRange();
2634             }
2635             return getSema().ObjC().ActOnObjCForCollectionStmt(
2636                 ForLoc, LoopVar, RangeExpr, RParenLoc);
2637           }
2638         }
2639       }
2640     }
2641 
2642     return getSema().BuildCXXForRangeStmt(
2643         ForLoc, CoawaitLoc, Init, ColonLoc, Range, Begin, End, Cond, Inc,
2644         LoopVar, RParenLoc, Sema::BFRK_Rebuild, LifetimeExtendTemps);
2645   }
2646 
2647   /// Build a new C++0x range-based for statement.
2648   ///
2649   /// By default, performs semantic analysis to build the new statement.
2650   /// Subclasses may override this routine to provide different behavior.
2651   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2652                                           bool IsIfExists,
2653                                           NestedNameSpecifierLoc QualifierLoc,
2654                                           DeclarationNameInfo NameInfo,
2655                                           Stmt *Nested) {
2656     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2657                                                 QualifierLoc, NameInfo, Nested);
2658   }
2659 
2660   /// Attach body to a C++0x range-based for statement.
2661   ///
2662   /// By default, performs semantic analysis to finish the new statement.
2663   /// Subclasses may override this routine to provide different behavior.
2664   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2665     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2666   }
2667 
2668   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2669                                Stmt *TryBlock, Stmt *Handler) {
2670     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2671   }
2672 
2673   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2674                                   Stmt *Block) {
2675     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2676   }
2677 
2678   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2679     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2680   }
2681 
2682   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2683                                              SourceLocation LParen,
2684                                              SourceLocation RParen,
2685                                              TypeSourceInfo *TSI) {
2686     return getSema().SYCL().BuildUniqueStableNameExpr(OpLoc, LParen, RParen,
2687                                                       TSI);
2688   }
2689 
2690   /// Build a new predefined expression.
2691   ///
2692   /// By default, performs semantic analysis to build the new expression.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK) {
2695     return getSema().BuildPredefinedExpr(Loc, IK);
2696   }
2697 
2698   /// Build a new expression that references a declaration.
2699   ///
2700   /// By default, performs semantic analysis to build the new expression.
2701   /// Subclasses may override this routine to provide different behavior.
2702   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2703                                         LookupResult &R,
2704                                         bool RequiresADL) {
2705     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2706   }
2707 
2708 
2709   /// Build a new expression that references a declaration.
2710   ///
2711   /// By default, performs semantic analysis to build the new expression.
2712   /// Subclasses may override this routine to provide different behavior.
2713   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2714                                 ValueDecl *VD,
2715                                 const DeclarationNameInfo &NameInfo,
2716                                 NamedDecl *Found,
2717                                 TemplateArgumentListInfo *TemplateArgs) {
2718     CXXScopeSpec SS;
2719     SS.Adopt(QualifierLoc);
2720     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2721                                               TemplateArgs);
2722   }
2723 
2724   /// Build a new expression in parentheses.
2725   ///
2726   /// By default, performs semantic analysis to build the new expression.
2727   /// Subclasses may override this routine to provide different behavior.
2728   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2729                                     SourceLocation RParen) {
2730     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2731   }
2732 
2733   /// Build a new pseudo-destructor expression.
2734   ///
2735   /// By default, performs semantic analysis to build the new expression.
2736   /// Subclasses may override this routine to provide different behavior.
2737   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2738                                             SourceLocation OperatorLoc,
2739                                             bool isArrow,
2740                                             CXXScopeSpec &SS,
2741                                             TypeSourceInfo *ScopeType,
2742                                             SourceLocation CCLoc,
2743                                             SourceLocation TildeLoc,
2744                                         PseudoDestructorTypeStorage Destroyed);
2745 
2746   /// Build a new unary operator expression.
2747   ///
2748   /// By default, performs semantic analysis to build the new expression.
2749   /// Subclasses may override this routine to provide different behavior.
2750   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2751                                         UnaryOperatorKind Opc,
2752                                         Expr *SubExpr) {
2753     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2754   }
2755 
2756   /// Build a new builtin offsetof expression.
2757   ///
2758   /// By default, performs semantic analysis to build the new expression.
2759   /// Subclasses may override this routine to provide different behavior.
2760   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2761                                  TypeSourceInfo *Type,
2762                                  ArrayRef<Sema::OffsetOfComponent> Components,
2763                                  SourceLocation RParenLoc) {
2764     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2765                                           RParenLoc);
2766   }
2767 
2768   /// Build a new sizeof, alignof or vec_step expression with a
2769   /// type argument.
2770   ///
2771   /// By default, performs semantic analysis to build the new expression.
2772   /// Subclasses may override this routine to provide different behavior.
2773   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2774                                          SourceLocation OpLoc,
2775                                          UnaryExprOrTypeTrait ExprKind,
2776                                          SourceRange R) {
2777     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2778   }
2779 
2780   /// Build a new sizeof, alignof or vec step expression with an
2781   /// expression argument.
2782   ///
2783   /// By default, performs semantic analysis to build the new expression.
2784   /// Subclasses may override this routine to provide different behavior.
2785   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2786                                          UnaryExprOrTypeTrait ExprKind,
2787                                          SourceRange R) {
2788     ExprResult Result
2789       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2790     if (Result.isInvalid())
2791       return ExprError();
2792 
2793     return Result;
2794   }
2795 
2796   /// Build a new array subscript expression.
2797   ///
2798   /// By default, performs semantic analysis to build the new expression.
2799   /// Subclasses may override this routine to provide different behavior.
2800   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2801                                              SourceLocation LBracketLoc,
2802                                              Expr *RHS,
2803                                              SourceLocation RBracketLoc) {
2804     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2805                                              LBracketLoc, RHS,
2806                                              RBracketLoc);
2807   }
2808 
2809   /// Build a new matrix subscript expression.
2810   ///
2811   /// By default, performs semantic analysis to build the new expression.
2812   /// Subclasses may override this routine to provide different behavior.
2813   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2814                                         Expr *ColumnIdx,
2815                                         SourceLocation RBracketLoc) {
2816     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2817                                                       RBracketLoc);
2818   }
2819 
2820   /// Build a new array section expression.
2821   ///
2822   /// By default, performs semantic analysis to build the new expression.
2823   /// Subclasses may override this routine to provide different behavior.
2824   ExprResult RebuildArraySectionExpr(bool IsOMPArraySection, Expr *Base,
2825                                      SourceLocation LBracketLoc,
2826                                      Expr *LowerBound,
2827                                      SourceLocation ColonLocFirst,
2828                                      SourceLocation ColonLocSecond,
2829                                      Expr *Length, Expr *Stride,
2830                                      SourceLocation RBracketLoc) {
2831     if (IsOMPArraySection)
2832       return getSema().OpenMP().ActOnOMPArraySectionExpr(
2833           Base, LBracketLoc, LowerBound, ColonLocFirst, ColonLocSecond, Length,
2834           Stride, RBracketLoc);
2835 
2836     assert(Stride == nullptr && !ColonLocSecond.isValid() &&
2837            "Stride/second colon not allowed for OpenACC");
2838 
2839     return getSema().OpenACC().ActOnArraySectionExpr(
2840         Base, LBracketLoc, LowerBound, ColonLocFirst, Length, RBracketLoc);
2841   }
2842 
2843   /// Build a new array shaping expression.
2844   ///
2845   /// By default, performs semantic analysis to build the new expression.
2846   /// Subclasses may override this routine to provide different behavior.
2847   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2848                                         SourceLocation RParenLoc,
2849                                         ArrayRef<Expr *> Dims,
2850                                         ArrayRef<SourceRange> BracketsRanges) {
2851     return getSema().OpenMP().ActOnOMPArrayShapingExpr(
2852         Base, LParenLoc, RParenLoc, Dims, BracketsRanges);
2853   }
2854 
2855   /// Build a new iterator expression.
2856   ///
2857   /// By default, performs semantic analysis to build the new expression.
2858   /// Subclasses may override this routine to provide different behavior.
2859   ExprResult
2860   RebuildOMPIteratorExpr(SourceLocation IteratorKwLoc, SourceLocation LLoc,
2861                          SourceLocation RLoc,
2862                          ArrayRef<SemaOpenMP::OMPIteratorData> Data) {
2863     return getSema().OpenMP().ActOnOMPIteratorExpr(
2864         /*Scope=*/nullptr, IteratorKwLoc, LLoc, RLoc, Data);
2865   }
2866 
2867   /// Build a new call expression.
2868   ///
2869   /// By default, performs semantic analysis to build the new expression.
2870   /// Subclasses may override this routine to provide different behavior.
2871   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2872                                    MultiExprArg Args,
2873                                    SourceLocation RParenLoc,
2874                                    Expr *ExecConfig = nullptr) {
2875     return getSema().ActOnCallExpr(
2876         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2877   }
2878 
2879   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2880                                      MultiExprArg Args,
2881                                      SourceLocation RParenLoc) {
2882     return getSema().ActOnArraySubscriptExpr(
2883         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2884   }
2885 
2886   /// Build a new member access expression.
2887   ///
2888   /// By default, performs semantic analysis to build the new expression.
2889   /// Subclasses may override this routine to provide different behavior.
2890   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2891                                bool isArrow,
2892                                NestedNameSpecifierLoc QualifierLoc,
2893                                SourceLocation TemplateKWLoc,
2894                                const DeclarationNameInfo &MemberNameInfo,
2895                                ValueDecl *Member,
2896                                NamedDecl *FoundDecl,
2897                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2898                                NamedDecl *FirstQualifierInScope) {
2899     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2900                                                                       isArrow);
2901     if (!Member->getDeclName()) {
2902       // We have a reference to an unnamed field.  This is always the
2903       // base of an anonymous struct/union member access, i.e. the
2904       // field is always of record type.
2905       assert(Member->getType()->isRecordType() &&
2906              "unnamed member not of record type?");
2907 
2908       BaseResult =
2909         getSema().PerformObjectMemberConversion(BaseResult.get(),
2910                                                 QualifierLoc.getNestedNameSpecifier(),
2911                                                 FoundDecl, Member);
2912       if (BaseResult.isInvalid())
2913         return ExprError();
2914       Base = BaseResult.get();
2915 
2916       // `TranformMaterializeTemporaryExpr()` removes materialized temporaries
2917       // from the AST, so we need to re-insert them if needed (since
2918       // `BuildFieldRefereneExpr()` doesn't do this).
2919       if (!isArrow && Base->isPRValue()) {
2920         BaseResult = getSema().TemporaryMaterializationConversion(Base);
2921         if (BaseResult.isInvalid())
2922           return ExprError();
2923         Base = BaseResult.get();
2924       }
2925 
2926       CXXScopeSpec EmptySS;
2927       return getSema().BuildFieldReferenceExpr(
2928           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2929           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()),
2930           MemberNameInfo);
2931     }
2932 
2933     CXXScopeSpec SS;
2934     SS.Adopt(QualifierLoc);
2935 
2936     Base = BaseResult.get();
2937     if (Base->containsErrors())
2938       return ExprError();
2939 
2940     QualType BaseType = Base->getType();
2941 
2942     if (isArrow && !BaseType->isPointerType())
2943       return ExprError();
2944 
2945     // FIXME: this involves duplicating earlier analysis in a lot of
2946     // cases; we should avoid this when possible.
2947     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2948     R.addDecl(FoundDecl);
2949     R.resolveKind();
2950 
2951     if (getSema().isUnevaluatedContext() && Base->isImplicitCXXThis() &&
2952         isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(Member)) {
2953       if (auto *ThisClass = cast<CXXThisExpr>(Base)
2954                                 ->getType()
2955                                 ->getPointeeType()
2956                                 ->getAsCXXRecordDecl()) {
2957         auto *Class = cast<CXXRecordDecl>(Member->getDeclContext());
2958         // In unevaluated contexts, an expression supposed to be a member access
2959         // might reference a member in an unrelated class.
2960         if (!ThisClass->Equals(Class) && !ThisClass->isDerivedFrom(Class))
2961           return getSema().BuildDeclRefExpr(Member, Member->getType(),
2962                                             VK_LValue, Member->getLocation());
2963       }
2964     }
2965 
2966     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2967                                               SS, TemplateKWLoc,
2968                                               FirstQualifierInScope,
2969                                               R, ExplicitTemplateArgs,
2970                                               /*S*/nullptr);
2971   }
2972 
2973   /// Build a new binary operator expression.
2974   ///
2975   /// By default, performs semantic analysis to build the new expression.
2976   /// Subclasses may override this routine to provide different behavior.
2977   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2978                                          BinaryOperatorKind Opc,
2979                                          Expr *LHS, Expr *RHS) {
2980     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2981   }
2982 
2983   /// Build a new rewritten operator expression.
2984   ///
2985   /// By default, performs semantic analysis to build the new expression.
2986   /// Subclasses may override this routine to provide different behavior.
2987   ExprResult RebuildCXXRewrittenBinaryOperator(
2988       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2989       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2990     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2991                                            RHS, /*RequiresADL*/false);
2992   }
2993 
2994   /// Build a new conditional operator expression.
2995   ///
2996   /// By default, performs semantic analysis to build the new expression.
2997   /// Subclasses may override this routine to provide different behavior.
2998   ExprResult RebuildConditionalOperator(Expr *Cond,
2999                                         SourceLocation QuestionLoc,
3000                                         Expr *LHS,
3001                                         SourceLocation ColonLoc,
3002                                         Expr *RHS) {
3003     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
3004                                         LHS, RHS);
3005   }
3006 
3007   /// Build a new C-style cast expression.
3008   ///
3009   /// By default, performs semantic analysis to build the new expression.
3010   /// Subclasses may override this routine to provide different behavior.
3011   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
3012                                          TypeSourceInfo *TInfo,
3013                                          SourceLocation RParenLoc,
3014                                          Expr *SubExpr) {
3015     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
3016                                          SubExpr);
3017   }
3018 
3019   /// Build a new compound literal expression.
3020   ///
3021   /// By default, performs semantic analysis to build the new expression.
3022   /// Subclasses may override this routine to provide different behavior.
3023   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
3024                                               TypeSourceInfo *TInfo,
3025                                               SourceLocation RParenLoc,
3026                                               Expr *Init) {
3027     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
3028                                               Init);
3029   }
3030 
3031   /// Build a new extended vector element access expression.
3032   ///
3033   /// By default, performs semantic analysis to build the new expression.
3034   /// Subclasses may override this routine to provide different behavior.
3035   ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
3036                                          bool IsArrow,
3037                                          SourceLocation AccessorLoc,
3038                                          IdentifierInfo &Accessor) {
3039 
3040     CXXScopeSpec SS;
3041     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
3042     return getSema().BuildMemberReferenceExpr(
3043         Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
3044         /*FirstQualifierInScope*/ nullptr, NameInfo,
3045         /* TemplateArgs */ nullptr,
3046         /*S*/ nullptr);
3047   }
3048 
3049   /// Build a new initializer list expression.
3050   ///
3051   /// By default, performs semantic analysis to build the new expression.
3052   /// Subclasses may override this routine to provide different behavior.
3053   ExprResult RebuildInitList(SourceLocation LBraceLoc,
3054                              MultiExprArg Inits,
3055                              SourceLocation RBraceLoc) {
3056     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
3057   }
3058 
3059   /// Build a new designated initializer expression.
3060   ///
3061   /// By default, performs semantic analysis to build the new expression.
3062   /// Subclasses may override this routine to provide different behavior.
3063   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
3064                                              MultiExprArg ArrayExprs,
3065                                              SourceLocation EqualOrColonLoc,
3066                                              bool GNUSyntax,
3067                                              Expr *Init) {
3068     ExprResult Result
3069       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
3070                                            Init);
3071     if (Result.isInvalid())
3072       return ExprError();
3073 
3074     return Result;
3075   }
3076 
3077   /// Build a new value-initialized expression.
3078   ///
3079   /// By default, builds the implicit value initialization without performing
3080   /// any semantic analysis. Subclasses may override this routine to provide
3081   /// different behavior.
3082   ExprResult RebuildImplicitValueInitExpr(QualType T) {
3083     return new (SemaRef.Context) ImplicitValueInitExpr(T);
3084   }
3085 
3086   /// Build a new \c va_arg expression.
3087   ///
3088   /// By default, performs semantic analysis to build the new expression.
3089   /// Subclasses may override this routine to provide different behavior.
3090   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
3091                                     Expr *SubExpr, TypeSourceInfo *TInfo,
3092                                     SourceLocation RParenLoc) {
3093     return getSema().BuildVAArgExpr(BuiltinLoc,
3094                                     SubExpr, TInfo,
3095                                     RParenLoc);
3096   }
3097 
3098   /// Build a new expression list in parentheses.
3099   ///
3100   /// By default, performs semantic analysis to build the new expression.
3101   /// Subclasses may override this routine to provide different behavior.
3102   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
3103                                   MultiExprArg SubExprs,
3104                                   SourceLocation RParenLoc) {
3105     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
3106   }
3107 
3108   /// Build a new address-of-label expression.
3109   ///
3110   /// By default, performs semantic analysis, using the name of the label
3111   /// rather than attempting to map the label statement itself.
3112   /// Subclasses may override this routine to provide different behavior.
3113   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
3114                                   SourceLocation LabelLoc, LabelDecl *Label) {
3115     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
3116   }
3117 
3118   /// Build a new GNU statement expression.
3119   ///
3120   /// By default, performs semantic analysis to build the new expression.
3121   /// Subclasses may override this routine to provide different behavior.
3122   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
3123                              SourceLocation RParenLoc, unsigned TemplateDepth) {
3124     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
3125                                    TemplateDepth);
3126   }
3127 
3128   /// Build a new __builtin_choose_expr expression.
3129   ///
3130   /// By default, performs semantic analysis to build the new expression.
3131   /// Subclasses may override this routine to provide different behavior.
3132   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
3133                                      Expr *Cond, Expr *LHS, Expr *RHS,
3134                                      SourceLocation RParenLoc) {
3135     return SemaRef.ActOnChooseExpr(BuiltinLoc,
3136                                    Cond, LHS, RHS,
3137                                    RParenLoc);
3138   }
3139 
3140   /// Build a new generic selection expression with an expression predicate.
3141   ///
3142   /// By default, performs semantic analysis to build the new expression.
3143   /// Subclasses may override this routine to provide different behavior.
3144   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3145                                          SourceLocation DefaultLoc,
3146                                          SourceLocation RParenLoc,
3147                                          Expr *ControllingExpr,
3148                                          ArrayRef<TypeSourceInfo *> Types,
3149                                          ArrayRef<Expr *> Exprs) {
3150     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3151                                                 /*PredicateIsExpr=*/true,
3152                                                 ControllingExpr, Types, Exprs);
3153   }
3154 
3155   /// Build a new generic selection expression with a type predicate.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
3159   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3160                                          SourceLocation DefaultLoc,
3161                                          SourceLocation RParenLoc,
3162                                          TypeSourceInfo *ControllingType,
3163                                          ArrayRef<TypeSourceInfo *> Types,
3164                                          ArrayRef<Expr *> Exprs) {
3165     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3166                                                 /*PredicateIsExpr=*/false,
3167                                                 ControllingType, Types, Exprs);
3168   }
3169 
3170   /// Build a new overloaded operator call expression.
3171   ///
3172   /// By default, performs semantic analysis to build the new expression.
3173   /// The semantic analysis provides the behavior of template instantiation,
3174   /// copying with transformations that turn what looks like an overloaded
3175   /// operator call into a use of a builtin operator, performing
3176   /// argument-dependent lookup, etc. Subclasses may override this routine to
3177   /// provide different behavior.
3178   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3179                                         SourceLocation OpLoc,
3180                                         SourceLocation CalleeLoc,
3181                                         bool RequiresADL,
3182                                         const UnresolvedSetImpl &Functions,
3183                                         Expr *First, Expr *Second);
3184 
3185   /// Build a new C++ "named" cast expression, such as static_cast or
3186   /// reinterpret_cast.
3187   ///
3188   /// By default, this routine dispatches to one of the more-specific routines
3189   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
3190   /// Subclasses may override this routine to provide different behavior.
3191   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
3192                                            Stmt::StmtClass Class,
3193                                            SourceLocation LAngleLoc,
3194                                            TypeSourceInfo *TInfo,
3195                                            SourceLocation RAngleLoc,
3196                                            SourceLocation LParenLoc,
3197                                            Expr *SubExpr,
3198                                            SourceLocation RParenLoc) {
3199     switch (Class) {
3200     case Stmt::CXXStaticCastExprClass:
3201       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3202                                                    RAngleLoc, LParenLoc,
3203                                                    SubExpr, RParenLoc);
3204 
3205     case Stmt::CXXDynamicCastExprClass:
3206       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3207                                                     RAngleLoc, LParenLoc,
3208                                                     SubExpr, RParenLoc);
3209 
3210     case Stmt::CXXReinterpretCastExprClass:
3211       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3212                                                         RAngleLoc, LParenLoc,
3213                                                         SubExpr,
3214                                                         RParenLoc);
3215 
3216     case Stmt::CXXConstCastExprClass:
3217       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3218                                                    RAngleLoc, LParenLoc,
3219                                                    SubExpr, RParenLoc);
3220 
3221     case Stmt::CXXAddrspaceCastExprClass:
3222       return getDerived().RebuildCXXAddrspaceCastExpr(
3223           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3224 
3225     default:
3226       llvm_unreachable("Invalid C++ named cast");
3227     }
3228   }
3229 
3230   /// Build a new C++ static_cast expression.
3231   ///
3232   /// By default, performs semantic analysis to build the new expression.
3233   /// Subclasses may override this routine to provide different behavior.
3234   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
3235                                             SourceLocation LAngleLoc,
3236                                             TypeSourceInfo *TInfo,
3237                                             SourceLocation RAngleLoc,
3238                                             SourceLocation LParenLoc,
3239                                             Expr *SubExpr,
3240                                             SourceLocation RParenLoc) {
3241     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
3242                                        TInfo, SubExpr,
3243                                        SourceRange(LAngleLoc, RAngleLoc),
3244                                        SourceRange(LParenLoc, RParenLoc));
3245   }
3246 
3247   /// Build a new C++ dynamic_cast expression.
3248   ///
3249   /// By default, performs semantic analysis to build the new expression.
3250   /// Subclasses may override this routine to provide different behavior.
3251   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
3252                                              SourceLocation LAngleLoc,
3253                                              TypeSourceInfo *TInfo,
3254                                              SourceLocation RAngleLoc,
3255                                              SourceLocation LParenLoc,
3256                                              Expr *SubExpr,
3257                                              SourceLocation RParenLoc) {
3258     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
3259                                        TInfo, SubExpr,
3260                                        SourceRange(LAngleLoc, RAngleLoc),
3261                                        SourceRange(LParenLoc, RParenLoc));
3262   }
3263 
3264   /// Build a new C++ reinterpret_cast expression.
3265   ///
3266   /// By default, performs semantic analysis to build the new expression.
3267   /// Subclasses may override this routine to provide different behavior.
3268   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
3269                                                  SourceLocation LAngleLoc,
3270                                                  TypeSourceInfo *TInfo,
3271                                                  SourceLocation RAngleLoc,
3272                                                  SourceLocation LParenLoc,
3273                                                  Expr *SubExpr,
3274                                                  SourceLocation RParenLoc) {
3275     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
3276                                        TInfo, SubExpr,
3277                                        SourceRange(LAngleLoc, RAngleLoc),
3278                                        SourceRange(LParenLoc, RParenLoc));
3279   }
3280 
3281   /// Build a new C++ const_cast expression.
3282   ///
3283   /// By default, performs semantic analysis to build the new expression.
3284   /// Subclasses may override this routine to provide different behavior.
3285   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3286                                            SourceLocation LAngleLoc,
3287                                            TypeSourceInfo *TInfo,
3288                                            SourceLocation RAngleLoc,
3289                                            SourceLocation LParenLoc,
3290                                            Expr *SubExpr,
3291                                            SourceLocation RParenLoc) {
3292     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3293                                        TInfo, SubExpr,
3294                                        SourceRange(LAngleLoc, RAngleLoc),
3295                                        SourceRange(LParenLoc, RParenLoc));
3296   }
3297 
3298   ExprResult
3299   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3300                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3301                               SourceLocation LParenLoc, Expr *SubExpr,
3302                               SourceLocation RParenLoc) {
3303     return getSema().BuildCXXNamedCast(
3304         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3305         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3306   }
3307 
3308   /// Build a new C++ functional-style cast expression.
3309   ///
3310   /// By default, performs semantic analysis to build the new expression.
3311   /// Subclasses may override this routine to provide different behavior.
3312   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3313                                           SourceLocation LParenLoc,
3314                                           Expr *Sub,
3315                                           SourceLocation RParenLoc,
3316                                           bool ListInitialization) {
3317     // If Sub is a ParenListExpr, then Sub is the syntatic form of a
3318     // CXXParenListInitExpr. Pass its expanded arguments so that the
3319     // CXXParenListInitExpr can be rebuilt.
3320     if (auto *PLE = dyn_cast<ParenListExpr>(Sub))
3321       return getSema().BuildCXXTypeConstructExpr(
3322           TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3323           RParenLoc, ListInitialization);
3324     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3325                                                MultiExprArg(&Sub, 1), RParenLoc,
3326                                                ListInitialization);
3327   }
3328 
3329   /// Build a new C++ __builtin_bit_cast expression.
3330   ///
3331   /// By default, performs semantic analysis to build the new expression.
3332   /// Subclasses may override this routine to provide different behavior.
3333   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3334                                        TypeSourceInfo *TSI, Expr *Sub,
3335                                        SourceLocation RParenLoc) {
3336     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3337   }
3338 
3339   /// Build a new C++ typeid(type) expression.
3340   ///
3341   /// By default, performs semantic analysis to build the new expression.
3342   /// Subclasses may override this routine to provide different behavior.
3343   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3344                                         SourceLocation TypeidLoc,
3345                                         TypeSourceInfo *Operand,
3346                                         SourceLocation RParenLoc) {
3347     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3348                                     RParenLoc);
3349   }
3350 
3351 
3352   /// Build a new C++ typeid(expr) expression.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
3356   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3357                                         SourceLocation TypeidLoc,
3358                                         Expr *Operand,
3359                                         SourceLocation RParenLoc) {
3360     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3361                                     RParenLoc);
3362   }
3363 
3364   /// Build a new C++ __uuidof(type) expression.
3365   ///
3366   /// By default, performs semantic analysis to build the new expression.
3367   /// Subclasses may override this routine to provide different behavior.
3368   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3369                                   TypeSourceInfo *Operand,
3370                                   SourceLocation RParenLoc) {
3371     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3372   }
3373 
3374   /// Build a new C++ __uuidof(expr) expression.
3375   ///
3376   /// By default, performs semantic analysis to build the new expression.
3377   /// Subclasses may override this routine to provide different behavior.
3378   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3379                                   Expr *Operand, SourceLocation RParenLoc) {
3380     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3381   }
3382 
3383   /// Build a new C++ "this" expression.
3384   ///
3385   /// By default, performs semantic analysis to build a new "this" expression.
3386   /// Subclasses may override this routine to provide different behavior.
3387   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3388                                 QualType ThisType,
3389                                 bool isImplicit) {
3390     if (getSema().CheckCXXThisType(ThisLoc, ThisType))
3391       return ExprError();
3392     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3393   }
3394 
3395   /// Build a new C++ throw expression.
3396   ///
3397   /// By default, performs semantic analysis to build the new expression.
3398   /// Subclasses may override this routine to provide different behavior.
3399   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3400                                  bool IsThrownVariableInScope) {
3401     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3402   }
3403 
3404   /// Build a new C++ default-argument expression.
3405   ///
3406   /// By default, builds a new default-argument expression, which does not
3407   /// require any semantic analysis. Subclasses may override this routine to
3408   /// provide different behavior.
3409   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3410                                       Expr *RewrittenExpr) {
3411     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3412                                      RewrittenExpr, getSema().CurContext);
3413   }
3414 
3415   /// Build a new C++11 default-initialization expression.
3416   ///
3417   /// By default, builds a new default field initialization expression, which
3418   /// does not require any semantic analysis. Subclasses may override this
3419   /// routine to provide different behavior.
3420   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3421                                        FieldDecl *Field) {
3422     return getSema().BuildCXXDefaultInitExpr(Loc, Field);
3423   }
3424 
3425   /// Build a new C++ zero-initialization expression.
3426   ///
3427   /// By default, performs semantic analysis to build the new expression.
3428   /// Subclasses may override this routine to provide different behavior.
3429   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3430                                            SourceLocation LParenLoc,
3431                                            SourceLocation RParenLoc) {
3432     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, {}, RParenLoc,
3433                                                /*ListInitialization=*/false);
3434   }
3435 
3436   /// Build a new C++ "new" expression.
3437   ///
3438   /// By default, performs semantic analysis to build the new expression.
3439   /// Subclasses may override this routine to provide different behavior.
3440   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal,
3441                                SourceLocation PlacementLParen,
3442                                MultiExprArg PlacementArgs,
3443                                SourceLocation PlacementRParen,
3444                                SourceRange TypeIdParens, QualType AllocatedType,
3445                                TypeSourceInfo *AllocatedTypeInfo,
3446                                std::optional<Expr *> ArraySize,
3447                                SourceRange DirectInitRange, Expr *Initializer) {
3448     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3449                                  PlacementLParen,
3450                                  PlacementArgs,
3451                                  PlacementRParen,
3452                                  TypeIdParens,
3453                                  AllocatedType,
3454                                  AllocatedTypeInfo,
3455                                  ArraySize,
3456                                  DirectInitRange,
3457                                  Initializer);
3458   }
3459 
3460   /// Build a new C++ "delete" expression.
3461   ///
3462   /// By default, performs semantic analysis to build the new expression.
3463   /// Subclasses may override this routine to provide different behavior.
3464   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3465                                         bool IsGlobalDelete,
3466                                         bool IsArrayForm,
3467                                         Expr *Operand) {
3468     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3469                                     Operand);
3470   }
3471 
3472   /// Build a new type trait expression.
3473   ///
3474   /// By default, performs semantic analysis to build the new expression.
3475   /// Subclasses may override this routine to provide different behavior.
3476   ExprResult RebuildTypeTrait(TypeTrait Trait,
3477                               SourceLocation StartLoc,
3478                               ArrayRef<TypeSourceInfo *> Args,
3479                               SourceLocation RParenLoc) {
3480     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3481   }
3482 
3483   /// Build a new array type trait expression.
3484   ///
3485   /// By default, performs semantic analysis to build the new expression.
3486   /// Subclasses may override this routine to provide different behavior.
3487   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3488                                    SourceLocation StartLoc,
3489                                    TypeSourceInfo *TSInfo,
3490                                    Expr *DimExpr,
3491                                    SourceLocation RParenLoc) {
3492     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3493   }
3494 
3495   /// Build a new expression trait expression.
3496   ///
3497   /// By default, performs semantic analysis to build the new expression.
3498   /// Subclasses may override this routine to provide different behavior.
3499   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3500                                    SourceLocation StartLoc,
3501                                    Expr *Queried,
3502                                    SourceLocation RParenLoc) {
3503     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3504   }
3505 
3506   /// Build a new (previously unresolved) declaration reference
3507   /// expression.
3508   ///
3509   /// By default, performs semantic analysis to build the new expression.
3510   /// Subclasses may override this routine to provide different behavior.
3511   ExprResult RebuildDependentScopeDeclRefExpr(
3512                                           NestedNameSpecifierLoc QualifierLoc,
3513                                           SourceLocation TemplateKWLoc,
3514                                        const DeclarationNameInfo &NameInfo,
3515                               const TemplateArgumentListInfo *TemplateArgs,
3516                                           bool IsAddressOfOperand,
3517                                           TypeSourceInfo **RecoveryTSI) {
3518     CXXScopeSpec SS;
3519     SS.Adopt(QualifierLoc);
3520 
3521     if (TemplateArgs || TemplateKWLoc.isValid())
3522       return getSema().BuildQualifiedTemplateIdExpr(
3523           SS, TemplateKWLoc, NameInfo, TemplateArgs, IsAddressOfOperand);
3524 
3525     return getSema().BuildQualifiedDeclarationNameExpr(
3526         SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
3527   }
3528 
3529   /// Build a new template-id expression.
3530   ///
3531   /// By default, performs semantic analysis to build the new expression.
3532   /// Subclasses may override this routine to provide different behavior.
3533   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3534                                    SourceLocation TemplateKWLoc,
3535                                    LookupResult &R,
3536                                    bool RequiresADL,
3537                               const TemplateArgumentListInfo *TemplateArgs) {
3538     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3539                                          TemplateArgs);
3540   }
3541 
3542   /// Build a new object-construction expression.
3543   ///
3544   /// By default, performs semantic analysis to build the new expression.
3545   /// Subclasses may override this routine to provide different behavior.
3546   ExprResult RebuildCXXConstructExpr(
3547       QualType T, SourceLocation Loc, CXXConstructorDecl *Constructor,
3548       bool IsElidable, MultiExprArg Args, bool HadMultipleCandidates,
3549       bool ListInitialization, bool StdInitListInitialization,
3550       bool RequiresZeroInit, CXXConstructionKind ConstructKind,
3551       SourceRange ParenRange) {
3552     // Reconstruct the constructor we originally found, which might be
3553     // different if this is a call to an inherited constructor.
3554     CXXConstructorDecl *FoundCtor = Constructor;
3555     if (Constructor->isInheritingConstructor())
3556       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3557 
3558     SmallVector<Expr *, 8> ConvertedArgs;
3559     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3560                                           ConvertedArgs))
3561       return ExprError();
3562 
3563     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3564                                            IsElidable,
3565                                            ConvertedArgs,
3566                                            HadMultipleCandidates,
3567                                            ListInitialization,
3568                                            StdInitListInitialization,
3569                                            RequiresZeroInit, ConstructKind,
3570                                            ParenRange);
3571   }
3572 
3573   /// Build a new implicit construction via inherited constructor
3574   /// expression.
3575   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3576                                              CXXConstructorDecl *Constructor,
3577                                              bool ConstructsVBase,
3578                                              bool InheritedFromVBase) {
3579     return new (getSema().Context) CXXInheritedCtorInitExpr(
3580         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3581   }
3582 
3583   /// Build a new object-construction expression.
3584   ///
3585   /// By default, performs semantic analysis to build the new expression.
3586   /// Subclasses may override this routine to provide different behavior.
3587   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3588                                            SourceLocation LParenOrBraceLoc,
3589                                            MultiExprArg Args,
3590                                            SourceLocation RParenOrBraceLoc,
3591                                            bool ListInitialization) {
3592     return getSema().BuildCXXTypeConstructExpr(
3593         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3594   }
3595 
3596   /// Build a new object-construction expression.
3597   ///
3598   /// By default, performs semantic analysis to build the new expression.
3599   /// Subclasses may override this routine to provide different behavior.
3600   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3601                                                SourceLocation LParenLoc,
3602                                                MultiExprArg Args,
3603                                                SourceLocation RParenLoc,
3604                                                bool ListInitialization) {
3605     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3606                                                RParenLoc, ListInitialization);
3607   }
3608 
3609   /// Build a new member reference expression.
3610   ///
3611   /// By default, performs semantic analysis to build the new expression.
3612   /// Subclasses may override this routine to provide different behavior.
3613   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3614                                                 QualType BaseType,
3615                                                 bool IsArrow,
3616                                                 SourceLocation OperatorLoc,
3617                                           NestedNameSpecifierLoc QualifierLoc,
3618                                                 SourceLocation TemplateKWLoc,
3619                                             NamedDecl *FirstQualifierInScope,
3620                                    const DeclarationNameInfo &MemberNameInfo,
3621                               const TemplateArgumentListInfo *TemplateArgs) {
3622     CXXScopeSpec SS;
3623     SS.Adopt(QualifierLoc);
3624 
3625     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3626                                             OperatorLoc, IsArrow,
3627                                             SS, TemplateKWLoc,
3628                                             FirstQualifierInScope,
3629                                             MemberNameInfo,
3630                                             TemplateArgs, /*S*/nullptr);
3631   }
3632 
3633   /// Build a new member reference expression.
3634   ///
3635   /// By default, performs semantic analysis to build the new expression.
3636   /// Subclasses may override this routine to provide different behavior.
3637   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3638                                          SourceLocation OperatorLoc,
3639                                          bool IsArrow,
3640                                          NestedNameSpecifierLoc QualifierLoc,
3641                                          SourceLocation TemplateKWLoc,
3642                                          NamedDecl *FirstQualifierInScope,
3643                                          LookupResult &R,
3644                                 const TemplateArgumentListInfo *TemplateArgs) {
3645     CXXScopeSpec SS;
3646     SS.Adopt(QualifierLoc);
3647 
3648     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3649                                             OperatorLoc, IsArrow,
3650                                             SS, TemplateKWLoc,
3651                                             FirstQualifierInScope,
3652                                             R, TemplateArgs, /*S*/nullptr);
3653   }
3654 
3655   /// Build a new noexcept expression.
3656   ///
3657   /// By default, performs semantic analysis to build the new expression.
3658   /// Subclasses may override this routine to provide different behavior.
3659   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3660     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3661   }
3662 
3663   /// Build a new expression to compute the length of a parameter pack.
3664   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
3665                                    SourceLocation PackLoc,
3666                                    SourceLocation RParenLoc,
3667                                    std::optional<unsigned> Length,
3668                                    ArrayRef<TemplateArgument> PartialArgs) {
3669     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3670                                   RParenLoc, Length, PartialArgs);
3671   }
3672 
3673   ExprResult RebuildPackIndexingExpr(SourceLocation EllipsisLoc,
3674                                      SourceLocation RSquareLoc,
3675                                      Expr *PackIdExpression, Expr *IndexExpr,
3676                                      ArrayRef<Expr *> ExpandedExprs,
3677                                      bool FullySubstituted = false) {
3678     return getSema().BuildPackIndexingExpr(PackIdExpression, EllipsisLoc,
3679                                            IndexExpr, RSquareLoc, ExpandedExprs,
3680                                            FullySubstituted);
3681   }
3682 
3683   ExprResult RebuildResolvedUnexpandedPackExpr(SourceLocation BeginLoc,
3684                                                QualType T,
3685                                                ArrayRef<Expr *> Exprs) {
3686     return ResolvedUnexpandedPackExpr::Create(SemaRef.Context, BeginLoc, T,
3687                                               Exprs);
3688   }
3689 
3690   /// Build a new expression representing a call to a source location
3691   ///  builtin.
3692   ///
3693   /// By default, performs semantic analysis to build the new expression.
3694   /// Subclasses may override this routine to provide different behavior.
3695   ExprResult RebuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
3696                                   SourceLocation BuiltinLoc,
3697                                   SourceLocation RPLoc,
3698                                   DeclContext *ParentContext) {
3699     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3700                                         ParentContext);
3701   }
3702 
3703   /// Build a new Objective-C boxed expression.
3704   ///
3705   /// By default, performs semantic analysis to build the new expression.
3706   /// Subclasses may override this routine to provide different behavior.
3707   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3708       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3709       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3710       TemplateArgumentListInfo *TALI) {
3711     CXXScopeSpec SS;
3712     SS.Adopt(NNS);
3713     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3714                                                          ConceptNameInfo,
3715                                                          FoundDecl,
3716                                                          NamedConcept, TALI);
3717     if (Result.isInvalid())
3718       return ExprError();
3719     return Result;
3720   }
3721 
3722   /// \brief Build a new requires expression.
3723   ///
3724   /// By default, performs semantic analysis to build the new expression.
3725   /// Subclasses may override this routine to provide different behavior.
3726   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3727                                  RequiresExprBodyDecl *Body,
3728                                  SourceLocation LParenLoc,
3729                                  ArrayRef<ParmVarDecl *> LocalParameters,
3730                                  SourceLocation RParenLoc,
3731                                  ArrayRef<concepts::Requirement *> Requirements,
3732                                  SourceLocation ClosingBraceLoc) {
3733     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, LParenLoc,
3734                                 LocalParameters, RParenLoc, Requirements,
3735                                 ClosingBraceLoc);
3736   }
3737 
3738   concepts::TypeRequirement *
3739   RebuildTypeRequirement(
3740       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3741     return SemaRef.BuildTypeRequirement(SubstDiag);
3742   }
3743 
3744   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3745     return SemaRef.BuildTypeRequirement(T);
3746   }
3747 
3748   concepts::ExprRequirement *
3749   RebuildExprRequirement(
3750       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3751       SourceLocation NoexceptLoc,
3752       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3753     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3754                                         std::move(Ret));
3755   }
3756 
3757   concepts::ExprRequirement *
3758   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3759                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3760     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3761                                         std::move(Ret));
3762   }
3763 
3764   concepts::NestedRequirement *
3765   RebuildNestedRequirement(StringRef InvalidConstraintEntity,
3766                            const ASTConstraintSatisfaction &Satisfaction) {
3767     return SemaRef.BuildNestedRequirement(InvalidConstraintEntity,
3768                                           Satisfaction);
3769   }
3770 
3771   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3772     return SemaRef.BuildNestedRequirement(Constraint);
3773   }
3774 
3775   /// \brief Build a new Objective-C boxed expression.
3776   ///
3777   /// By default, performs semantic analysis to build the new expression.
3778   /// Subclasses may override this routine to provide different behavior.
3779   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3780     return getSema().ObjC().BuildObjCBoxedExpr(SR, ValueExpr);
3781   }
3782 
3783   /// Build a new Objective-C array literal.
3784   ///
3785   /// By default, performs semantic analysis to build the new expression.
3786   /// Subclasses may override this routine to provide different behavior.
3787   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3788                                      Expr **Elements, unsigned NumElements) {
3789     return getSema().ObjC().BuildObjCArrayLiteral(
3790         Range, MultiExprArg(Elements, NumElements));
3791   }
3792 
3793   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3794                                          Expr *Base, Expr *Key,
3795                                          ObjCMethodDecl *getterMethod,
3796                                          ObjCMethodDecl *setterMethod) {
3797     return getSema().ObjC().BuildObjCSubscriptExpression(
3798         RB, Base, Key, getterMethod, setterMethod);
3799   }
3800 
3801   /// Build a new Objective-C dictionary literal.
3802   ///
3803   /// By default, performs semantic analysis to build the new expression.
3804   /// Subclasses may override this routine to provide different behavior.
3805   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3806                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3807     return getSema().ObjC().BuildObjCDictionaryLiteral(Range, Elements);
3808   }
3809 
3810   /// Build a new Objective-C \@encode expression.
3811   ///
3812   /// By default, performs semantic analysis to build the new expression.
3813   /// Subclasses may override this routine to provide different behavior.
3814   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3815                                          TypeSourceInfo *EncodeTypeInfo,
3816                                          SourceLocation RParenLoc) {
3817     return SemaRef.ObjC().BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo,
3818                                                     RParenLoc);
3819   }
3820 
3821   /// Build a new Objective-C class message.
3822   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3823                                           Selector Sel,
3824                                           ArrayRef<SourceLocation> SelectorLocs,
3825                                           ObjCMethodDecl *Method,
3826                                           SourceLocation LBracLoc,
3827                                           MultiExprArg Args,
3828                                           SourceLocation RBracLoc) {
3829     return SemaRef.ObjC().BuildClassMessage(
3830         ReceiverTypeInfo, ReceiverTypeInfo->getType(),
3831         /*SuperLoc=*/SourceLocation(), Sel, Method, LBracLoc, SelectorLocs,
3832         RBracLoc, Args);
3833   }
3834 
3835   /// Build a new Objective-C instance message.
3836   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3837                                           Selector Sel,
3838                                           ArrayRef<SourceLocation> SelectorLocs,
3839                                           ObjCMethodDecl *Method,
3840                                           SourceLocation LBracLoc,
3841                                           MultiExprArg Args,
3842                                           SourceLocation RBracLoc) {
3843     return SemaRef.ObjC().BuildInstanceMessage(Receiver, Receiver->getType(),
3844                                                /*SuperLoc=*/SourceLocation(),
3845                                                Sel, Method, LBracLoc,
3846                                                SelectorLocs, RBracLoc, Args);
3847   }
3848 
3849   /// Build a new Objective-C instance/class message to 'super'.
3850   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3851                                     Selector Sel,
3852                                     ArrayRef<SourceLocation> SelectorLocs,
3853                                     QualType SuperType,
3854                                     ObjCMethodDecl *Method,
3855                                     SourceLocation LBracLoc,
3856                                     MultiExprArg Args,
3857                                     SourceLocation RBracLoc) {
3858     return Method->isInstanceMethod()
3859                ? SemaRef.ObjC().BuildInstanceMessage(
3860                      nullptr, SuperType, SuperLoc, Sel, Method, LBracLoc,
3861                      SelectorLocs, RBracLoc, Args)
3862                : SemaRef.ObjC().BuildClassMessage(nullptr, SuperType, SuperLoc,
3863                                                   Sel, Method, LBracLoc,
3864                                                   SelectorLocs, RBracLoc, Args);
3865   }
3866 
3867   /// Build a new Objective-C ivar reference expression.
3868   ///
3869   /// By default, performs semantic analysis to build the new expression.
3870   /// Subclasses may override this routine to provide different behavior.
3871   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3872                                           SourceLocation IvarLoc,
3873                                           bool IsArrow, bool IsFreeIvar) {
3874     CXXScopeSpec SS;
3875     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3876     ExprResult Result = getSema().BuildMemberReferenceExpr(
3877         BaseArg, BaseArg->getType(),
3878         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3879         /*FirstQualifierInScope=*/nullptr, NameInfo,
3880         /*TemplateArgs=*/nullptr,
3881         /*S=*/nullptr);
3882     if (IsFreeIvar && Result.isUsable())
3883       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3884     return Result;
3885   }
3886 
3887   /// Build a new Objective-C property reference expression.
3888   ///
3889   /// By default, performs semantic analysis to build the new expression.
3890   /// Subclasses may override this routine to provide different behavior.
3891   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3892                                         ObjCPropertyDecl *Property,
3893                                         SourceLocation PropertyLoc) {
3894     CXXScopeSpec SS;
3895     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3896     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3897                                               /*FIXME:*/PropertyLoc,
3898                                               /*IsArrow=*/false,
3899                                               SS, SourceLocation(),
3900                                               /*FirstQualifierInScope=*/nullptr,
3901                                               NameInfo,
3902                                               /*TemplateArgs=*/nullptr,
3903                                               /*S=*/nullptr);
3904   }
3905 
3906   /// Build a new Objective-C property reference expression.
3907   ///
3908   /// By default, performs semantic analysis to build the new expression.
3909   /// Subclasses may override this routine to provide different behavior.
3910   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3911                                         ObjCMethodDecl *Getter,
3912                                         ObjCMethodDecl *Setter,
3913                                         SourceLocation PropertyLoc) {
3914     // Since these expressions can only be value-dependent, we do not
3915     // need to perform semantic analysis again.
3916     return Owned(
3917       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3918                                                   VK_LValue, OK_ObjCProperty,
3919                                                   PropertyLoc, Base));
3920   }
3921 
3922   /// Build a new Objective-C "isa" expression.
3923   ///
3924   /// By default, performs semantic analysis to build the new expression.
3925   /// Subclasses may override this routine to provide different behavior.
3926   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3927                                 SourceLocation OpLoc, bool IsArrow) {
3928     CXXScopeSpec SS;
3929     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3930     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3931                                               OpLoc, IsArrow,
3932                                               SS, SourceLocation(),
3933                                               /*FirstQualifierInScope=*/nullptr,
3934                                               NameInfo,
3935                                               /*TemplateArgs=*/nullptr,
3936                                               /*S=*/nullptr);
3937   }
3938 
3939   /// Build a new shuffle vector expression.
3940   ///
3941   /// By default, performs semantic analysis to build the new expression.
3942   /// Subclasses may override this routine to provide different behavior.
3943   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3944                                       MultiExprArg SubExprs,
3945                                       SourceLocation RParenLoc) {
3946     // Find the declaration for __builtin_shufflevector
3947     const IdentifierInfo &Name
3948       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3949     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3950     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3951     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3952 
3953     // Build a reference to the __builtin_shufflevector builtin
3954     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3955     Expr *Callee = new (SemaRef.Context)
3956         DeclRefExpr(SemaRef.Context, Builtin, false,
3957                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3958     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3959     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3960                                        CK_BuiltinFnToFnPtr).get();
3961 
3962     // Build the CallExpr
3963     ExprResult TheCall = CallExpr::Create(
3964         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3965         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3966         FPOptionsOverride());
3967 
3968     // Type-check the __builtin_shufflevector expression.
3969     return SemaRef.BuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3970   }
3971 
3972   /// Build a new convert vector expression.
3973   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3974                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3975                                       SourceLocation RParenLoc) {
3976     return SemaRef.ConvertVectorExpr(SrcExpr, DstTInfo, BuiltinLoc, RParenLoc);
3977   }
3978 
3979   /// Build a new template argument pack expansion.
3980   ///
3981   /// By default, performs semantic analysis to build a new pack expansion
3982   /// for a template argument. Subclasses may override this routine to provide
3983   /// different behavior.
3984   TemplateArgumentLoc
3985   RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc,
3986                        std::optional<unsigned> NumExpansions) {
3987     switch (Pattern.getArgument().getKind()) {
3988     case TemplateArgument::Expression: {
3989       ExprResult Result
3990         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3991                                        EllipsisLoc, NumExpansions);
3992       if (Result.isInvalid())
3993         return TemplateArgumentLoc();
3994 
3995       return TemplateArgumentLoc(Result.get(), Result.get());
3996     }
3997 
3998     case TemplateArgument::Template:
3999       return TemplateArgumentLoc(
4000           SemaRef.Context,
4001           TemplateArgument(Pattern.getArgument().getAsTemplate(),
4002                            NumExpansions),
4003           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
4004           EllipsisLoc);
4005 
4006     case TemplateArgument::Null:
4007     case TemplateArgument::Integral:
4008     case TemplateArgument::Declaration:
4009     case TemplateArgument::StructuralValue:
4010     case TemplateArgument::Pack:
4011     case TemplateArgument::TemplateExpansion:
4012     case TemplateArgument::NullPtr:
4013       llvm_unreachable("Pack expansion pattern has no parameter packs");
4014 
4015     case TemplateArgument::Type:
4016       if (TypeSourceInfo *Expansion
4017             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
4018                                            EllipsisLoc,
4019                                            NumExpansions))
4020         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
4021                                    Expansion);
4022       break;
4023     }
4024 
4025     return TemplateArgumentLoc();
4026   }
4027 
4028   /// Build a new expression pack expansion.
4029   ///
4030   /// By default, performs semantic analysis to build a new pack expansion
4031   /// for an expression. Subclasses may override this routine to provide
4032   /// different behavior.
4033   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
4034                                   std::optional<unsigned> NumExpansions) {
4035     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
4036   }
4037 
4038   /// Build a new C++1z fold-expression.
4039   ///
4040   /// By default, performs semantic analysis in order to build a new fold
4041   /// expression.
4042   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
4043                                 SourceLocation LParenLoc, Expr *LHS,
4044                                 BinaryOperatorKind Operator,
4045                                 SourceLocation EllipsisLoc, Expr *RHS,
4046                                 SourceLocation RParenLoc,
4047                                 std::optional<unsigned> NumExpansions) {
4048     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
4049                                       EllipsisLoc, RHS, RParenLoc,
4050                                       NumExpansions);
4051   }
4052 
4053   ExprResult RebuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
4054                                LambdaScopeInfo *LSI) {
4055     for (ParmVarDecl *PVD : LSI->CallOperator->parameters()) {
4056       if (Expr *Init = PVD->getInit())
4057         LSI->ContainsUnexpandedParameterPack |=
4058             Init->containsUnexpandedParameterPack();
4059       else if (PVD->hasUninstantiatedDefaultArg())
4060         LSI->ContainsUnexpandedParameterPack |=
4061             PVD->getUninstantiatedDefaultArg()
4062                 ->containsUnexpandedParameterPack();
4063     }
4064     return getSema().BuildLambdaExpr(StartLoc, EndLoc, LSI);
4065   }
4066 
4067   /// Build an empty C++1z fold-expression with the given operator.
4068   ///
4069   /// By default, produces the fallback value for the fold-expression, or
4070   /// produce an error if there is no fallback value.
4071   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
4072                                      BinaryOperatorKind Operator) {
4073     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
4074   }
4075 
4076   /// Build a new atomic operation expression.
4077   ///
4078   /// By default, performs semantic analysis to build the new expression.
4079   /// Subclasses may override this routine to provide different behavior.
4080   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
4081                                AtomicExpr::AtomicOp Op,
4082                                SourceLocation RParenLoc) {
4083     // Use this for all of the locations, since we don't know the difference
4084     // between the call and the expr at this point.
4085     SourceRange Range{BuiltinLoc, RParenLoc};
4086     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
4087                                      Sema::AtomicArgumentOrder::AST);
4088   }
4089 
4090   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
4091                                  ArrayRef<Expr *> SubExprs, QualType Type) {
4092     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
4093   }
4094 
4095   StmtResult RebuildOpenACCComputeConstruct(OpenACCDirectiveKind K,
4096                                             SourceLocation BeginLoc,
4097                                             SourceLocation DirLoc,
4098                                             SourceLocation EndLoc,
4099                                             ArrayRef<OpenACCClause *> Clauses,
4100                                             StmtResult StrBlock) {
4101     return getSema().OpenACC().ActOnEndStmtDirective(
4102         K, BeginLoc, DirLoc, SourceLocation{}, SourceLocation{}, {},
4103         SourceLocation{}, EndLoc, Clauses, StrBlock);
4104   }
4105 
4106   StmtResult RebuildOpenACCLoopConstruct(SourceLocation BeginLoc,
4107                                          SourceLocation DirLoc,
4108                                          SourceLocation EndLoc,
4109                                          ArrayRef<OpenACCClause *> Clauses,
4110                                          StmtResult Loop) {
4111     return getSema().OpenACC().ActOnEndStmtDirective(
4112         OpenACCDirectiveKind::Loop, BeginLoc, DirLoc, SourceLocation{},
4113         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, Loop);
4114   }
4115 
4116   StmtResult RebuildOpenACCCombinedConstruct(OpenACCDirectiveKind K,
4117                                              SourceLocation BeginLoc,
4118                                              SourceLocation DirLoc,
4119                                              SourceLocation EndLoc,
4120                                              ArrayRef<OpenACCClause *> Clauses,
4121                                              StmtResult Loop) {
4122     return getSema().OpenACC().ActOnEndStmtDirective(
4123         K, BeginLoc, DirLoc, SourceLocation{}, SourceLocation{}, {},
4124         SourceLocation{}, EndLoc, Clauses, Loop);
4125   }
4126 
4127   StmtResult RebuildOpenACCDataConstruct(SourceLocation BeginLoc,
4128                                          SourceLocation DirLoc,
4129                                          SourceLocation EndLoc,
4130                                          ArrayRef<OpenACCClause *> Clauses,
4131                                          StmtResult StrBlock) {
4132     return getSema().OpenACC().ActOnEndStmtDirective(
4133         OpenACCDirectiveKind::Data, BeginLoc, DirLoc, SourceLocation{},
4134         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, StrBlock);
4135   }
4136 
4137   StmtResult
4138   RebuildOpenACCEnterDataConstruct(SourceLocation BeginLoc,
4139                                    SourceLocation DirLoc, SourceLocation EndLoc,
4140                                    ArrayRef<OpenACCClause *> Clauses) {
4141     return getSema().OpenACC().ActOnEndStmtDirective(
4142         OpenACCDirectiveKind::EnterData, BeginLoc, DirLoc, SourceLocation{},
4143         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4144   }
4145 
4146   StmtResult
4147   RebuildOpenACCExitDataConstruct(SourceLocation BeginLoc,
4148                                   SourceLocation DirLoc, SourceLocation EndLoc,
4149                                   ArrayRef<OpenACCClause *> Clauses) {
4150     return getSema().OpenACC().ActOnEndStmtDirective(
4151         OpenACCDirectiveKind::ExitData, BeginLoc, DirLoc, SourceLocation{},
4152         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4153   }
4154 
4155   StmtResult RebuildOpenACCHostDataConstruct(SourceLocation BeginLoc,
4156                                              SourceLocation DirLoc,
4157                                              SourceLocation EndLoc,
4158                                              ArrayRef<OpenACCClause *> Clauses,
4159                                              StmtResult StrBlock) {
4160     return getSema().OpenACC().ActOnEndStmtDirective(
4161         OpenACCDirectiveKind::HostData, BeginLoc, DirLoc, SourceLocation{},
4162         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, StrBlock);
4163   }
4164 
4165   StmtResult RebuildOpenACCInitConstruct(SourceLocation BeginLoc,
4166                                          SourceLocation DirLoc,
4167                                          SourceLocation EndLoc,
4168                                          ArrayRef<OpenACCClause *> Clauses) {
4169     return getSema().OpenACC().ActOnEndStmtDirective(
4170         OpenACCDirectiveKind::Init, BeginLoc, DirLoc, SourceLocation{},
4171         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4172   }
4173 
4174   StmtResult
4175   RebuildOpenACCShutdownConstruct(SourceLocation BeginLoc,
4176                                   SourceLocation DirLoc, SourceLocation EndLoc,
4177                                   ArrayRef<OpenACCClause *> Clauses) {
4178     return getSema().OpenACC().ActOnEndStmtDirective(
4179         OpenACCDirectiveKind::Shutdown, BeginLoc, DirLoc, SourceLocation{},
4180         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4181   }
4182 
4183   StmtResult RebuildOpenACCSetConstruct(SourceLocation BeginLoc,
4184                                         SourceLocation DirLoc,
4185                                         SourceLocation EndLoc,
4186                                         ArrayRef<OpenACCClause *> Clauses) {
4187     return getSema().OpenACC().ActOnEndStmtDirective(
4188         OpenACCDirectiveKind::Set, BeginLoc, DirLoc, SourceLocation{},
4189         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4190   }
4191 
4192   StmtResult RebuildOpenACCUpdateConstruct(SourceLocation BeginLoc,
4193                                            SourceLocation DirLoc,
4194                                            SourceLocation EndLoc,
4195                                            ArrayRef<OpenACCClause *> Clauses) {
4196     return getSema().OpenACC().ActOnEndStmtDirective(
4197         OpenACCDirectiveKind::Update, BeginLoc, DirLoc, SourceLocation{},
4198         SourceLocation{}, {}, SourceLocation{}, EndLoc, Clauses, {});
4199   }
4200 
4201   StmtResult RebuildOpenACCWaitConstruct(
4202       SourceLocation BeginLoc, SourceLocation DirLoc, SourceLocation LParenLoc,
4203       Expr *DevNumExpr, SourceLocation QueuesLoc, ArrayRef<Expr *> QueueIdExprs,
4204       SourceLocation RParenLoc, SourceLocation EndLoc,
4205       ArrayRef<OpenACCClause *> Clauses) {
4206     llvm::SmallVector<Expr *> Exprs;
4207     Exprs.push_back(DevNumExpr);
4208     Exprs.insert(Exprs.end(), QueueIdExprs.begin(), QueueIdExprs.end());
4209     return getSema().OpenACC().ActOnEndStmtDirective(
4210         OpenACCDirectiveKind::Wait, BeginLoc, DirLoc, LParenLoc, QueuesLoc,
4211         Exprs, RParenLoc, EndLoc, Clauses, {});
4212   }
4213 
4214   ExprResult RebuildOpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc) {
4215     return getSema().OpenACC().ActOnOpenACCAsteriskSizeExpr(AsteriskLoc);
4216   }
4217 
4218 private:
4219   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
4220                                      QualType ObjectType,
4221                                      NamedDecl *FirstQualifierInScope,
4222                                      CXXScopeSpec &SS);
4223 
4224   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4225                                              QualType ObjectType,
4226                                              NamedDecl *FirstQualifierInScope,
4227                                              CXXScopeSpec &SS);
4228 
4229   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
4230                                             NamedDecl *FirstQualifierInScope,
4231                                             CXXScopeSpec &SS);
4232 
4233   QualType TransformDependentNameType(TypeLocBuilder &TLB,
4234                                       DependentNameTypeLoc TL,
4235                                       bool DeducibleTSTContext);
4236 
4237   llvm::SmallVector<OpenACCClause *>
4238   TransformOpenACCClauseList(OpenACCDirectiveKind DirKind,
4239                              ArrayRef<const OpenACCClause *> OldClauses);
4240 
4241   OpenACCClause *
4242   TransformOpenACCClause(ArrayRef<const OpenACCClause *> ExistingClauses,
4243                          OpenACCDirectiveKind DirKind,
4244                          const OpenACCClause *OldClause);
4245 };
4246 
4247 template <typename Derived>
4248 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
4249   if (!S)
4250     return S;
4251 
4252   switch (S->getStmtClass()) {
4253   case Stmt::NoStmtClass: break;
4254 
4255   // Transform individual statement nodes
4256   // Pass SDK into statements that can produce a value
4257 #define STMT(Node, Parent)                                              \
4258   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
4259 #define VALUESTMT(Node, Parent)                                         \
4260   case Stmt::Node##Class:                                               \
4261     return getDerived().Transform##Node(cast<Node>(S), SDK);
4262 #define ABSTRACT_STMT(Node)
4263 #define EXPR(Node, Parent)
4264 #include "clang/AST/StmtNodes.inc"
4265 
4266   // Transform expressions by calling TransformExpr.
4267 #define STMT(Node, Parent)
4268 #define ABSTRACT_STMT(Stmt)
4269 #define EXPR(Node, Parent) case Stmt::Node##Class:
4270 #include "clang/AST/StmtNodes.inc"
4271     {
4272       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
4273 
4274       if (SDK == SDK_StmtExprResult)
4275         E = getSema().ActOnStmtExprResult(E);
4276       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
4277     }
4278   }
4279 
4280   return S;
4281 }
4282 
4283 template<typename Derived>
4284 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
4285   if (!S)
4286     return S;
4287 
4288   switch (S->getClauseKind()) {
4289   default: break;
4290   // Transform individual clause nodes
4291 #define GEN_CLANG_CLAUSE_CLASS
4292 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
4293   case Enum:                                                                   \
4294     return getDerived().Transform##Class(cast<Class>(S));
4295 #include "llvm/Frontend/OpenMP/OMP.inc"
4296   }
4297 
4298   return S;
4299 }
4300 
4301 
4302 template<typename Derived>
4303 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
4304   if (!E)
4305     return E;
4306 
4307   switch (E->getStmtClass()) {
4308     case Stmt::NoStmtClass: break;
4309 #define STMT(Node, Parent) case Stmt::Node##Class: break;
4310 #define ABSTRACT_STMT(Stmt)
4311 #define EXPR(Node, Parent)                                              \
4312     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
4313 #include "clang/AST/StmtNodes.inc"
4314   }
4315 
4316   return E;
4317 }
4318 
4319 template<typename Derived>
4320 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
4321                                                         bool NotCopyInit) {
4322   // Initializers are instantiated like expressions, except that various outer
4323   // layers are stripped.
4324   if (!Init)
4325     return Init;
4326 
4327   if (auto *FE = dyn_cast<FullExpr>(Init))
4328     Init = FE->getSubExpr();
4329 
4330   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
4331     OpaqueValueExpr *OVE = AIL->getCommonExpr();
4332     Init = OVE->getSourceExpr();
4333   }
4334 
4335   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
4336     Init = MTE->getSubExpr();
4337 
4338   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
4339     Init = Binder->getSubExpr();
4340 
4341   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
4342     Init = ICE->getSubExprAsWritten();
4343 
4344   if (CXXStdInitializerListExpr *ILE =
4345           dyn_cast<CXXStdInitializerListExpr>(Init))
4346     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4347 
4348   // If this is copy-initialization, we only need to reconstruct
4349   // InitListExprs. Other forms of copy-initialization will be a no-op if
4350   // the initializer is already the right type.
4351   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
4352   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
4353     return getDerived().TransformExpr(Init);
4354 
4355   // Revert value-initialization back to empty parens.
4356   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
4357     SourceRange Parens = VIE->getSourceRange();
4358     return getDerived().RebuildParenListExpr(Parens.getBegin(), {},
4359                                              Parens.getEnd());
4360   }
4361 
4362   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
4363   if (isa<ImplicitValueInitExpr>(Init))
4364     return getDerived().RebuildParenListExpr(SourceLocation(), {},
4365                                              SourceLocation());
4366 
4367   // Revert initialization by constructor back to a parenthesized or braced list
4368   // of expressions. Any other form of initializer can just be reused directly.
4369   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4370     return getDerived().TransformExpr(Init);
4371 
4372   // If the initialization implicitly converted an initializer list to a
4373   // std::initializer_list object, unwrap the std::initializer_list too.
4374   if (Construct && Construct->isStdInitListInitialization())
4375     return TransformInitializer(Construct->getArg(0), NotCopyInit);
4376 
4377   // Enter a list-init context if this was list initialization.
4378   EnterExpressionEvaluationContext Context(
4379       getSema(), EnterExpressionEvaluationContext::InitList,
4380       Construct->isListInitialization());
4381 
4382   getSema().currentEvaluationContext().InLifetimeExtendingContext =
4383       getSema().parentEvaluationContext().InLifetimeExtendingContext;
4384   getSema().currentEvaluationContext().RebuildDefaultArgOrDefaultInit =
4385       getSema().parentEvaluationContext().RebuildDefaultArgOrDefaultInit;
4386   SmallVector<Expr*, 8> NewArgs;
4387   bool ArgChanged = false;
4388   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
4389                                   /*IsCall*/true, NewArgs, &ArgChanged))
4390     return ExprError();
4391 
4392   // If this was list initialization, revert to syntactic list form.
4393   if (Construct->isListInitialization())
4394     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
4395                                         Construct->getEndLoc());
4396 
4397   // Build a ParenListExpr to represent anything else.
4398   SourceRange Parens = Construct->getParenOrBraceRange();
4399   if (Parens.isInvalid()) {
4400     // This was a variable declaration's initialization for which no initializer
4401     // was specified.
4402     assert(NewArgs.empty() &&
4403            "no parens or braces but have direct init with arguments?");
4404     return ExprEmpty();
4405   }
4406   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
4407                                            Parens.getEnd());
4408 }
4409 
4410 template<typename Derived>
4411 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
4412                                             unsigned NumInputs,
4413                                             bool IsCall,
4414                                       SmallVectorImpl<Expr *> &Outputs,
4415                                             bool *ArgChanged) {
4416   for (unsigned I = 0; I != NumInputs; ++I) {
4417     // If requested, drop call arguments that need to be dropped.
4418     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4419       if (ArgChanged)
4420         *ArgChanged = true;
4421 
4422       break;
4423     }
4424 
4425     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
4426       Expr *Pattern = Expansion->getPattern();
4427 
4428       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4429       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4430       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4431 
4432       // Determine whether the set of unexpanded parameter packs can and should
4433       // be expanded.
4434       bool Expand = true;
4435       bool RetainExpansion = false;
4436       std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4437       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4438       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4439                                                Pattern->getSourceRange(),
4440                                                Unexpanded,
4441                                                Expand, RetainExpansion,
4442                                                NumExpansions))
4443         return true;
4444 
4445       if (!Expand) {
4446         // The transform has determined that we should perform a simple
4447         // transformation on the pack expansion, producing another pack
4448         // expansion.
4449         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4450         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4451         if (OutPattern.isInvalid())
4452           return true;
4453 
4454         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4455                                                 Expansion->getEllipsisLoc(),
4456                                                            NumExpansions);
4457         if (Out.isInvalid())
4458           return true;
4459 
4460         if (ArgChanged)
4461           *ArgChanged = true;
4462         Outputs.push_back(Out.get());
4463         continue;
4464       }
4465 
4466       // Record right away that the argument was changed.  This needs
4467       // to happen even if the array expands to nothing.
4468       if (ArgChanged) *ArgChanged = true;
4469 
4470       // The transform has determined that we should perform an elementwise
4471       // expansion of the pattern. Do so.
4472       for (unsigned I = 0; I != *NumExpansions; ++I) {
4473         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4474         ExprResult Out = getDerived().TransformExpr(Pattern);
4475         if (Out.isInvalid())
4476           return true;
4477 
4478         if (Out.get()->containsUnexpandedParameterPack()) {
4479           Out = getDerived().RebuildPackExpansion(
4480               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4481           if (Out.isInvalid())
4482             return true;
4483         }
4484 
4485         Outputs.push_back(Out.get());
4486       }
4487 
4488       // If we're supposed to retain a pack expansion, do so by temporarily
4489       // forgetting the partially-substituted parameter pack.
4490       if (RetainExpansion) {
4491         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4492 
4493         ExprResult Out = getDerived().TransformExpr(Pattern);
4494         if (Out.isInvalid())
4495           return true;
4496 
4497         Out = getDerived().RebuildPackExpansion(
4498             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4499         if (Out.isInvalid())
4500           return true;
4501 
4502         Outputs.push_back(Out.get());
4503       }
4504 
4505       continue;
4506     }
4507 
4508     ExprResult Result =
4509       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4510              : getDerived().TransformExpr(Inputs[I]);
4511     if (Result.isInvalid())
4512       return true;
4513 
4514     if (Result.get() != Inputs[I] && ArgChanged)
4515       *ArgChanged = true;
4516 
4517     Outputs.push_back(Result.get());
4518   }
4519 
4520   return false;
4521 }
4522 
4523 template <typename Derived>
4524 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4525     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4526   if (Var) {
4527     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4528         getDerived().TransformDefinition(Var->getLocation(), Var));
4529 
4530     if (!ConditionVar)
4531       return Sema::ConditionError();
4532 
4533     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4534   }
4535 
4536   if (Expr) {
4537     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4538 
4539     if (CondExpr.isInvalid())
4540       return Sema::ConditionError();
4541 
4542     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4543                                     /*MissingOK=*/true);
4544   }
4545 
4546   return Sema::ConditionResult();
4547 }
4548 
4549 template <typename Derived>
4550 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4551     NestedNameSpecifierLoc NNS, QualType ObjectType,
4552     NamedDecl *FirstQualifierInScope) {
4553   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4554 
4555   auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) {
4556     for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4557          Qualifier = Qualifier.getPrefix())
4558       Qualifiers.push_back(Qualifier);
4559   };
4560   insertNNS(NNS);
4561 
4562   CXXScopeSpec SS;
4563   while (!Qualifiers.empty()) {
4564     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4565     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4566 
4567     switch (QNNS->getKind()) {
4568     case NestedNameSpecifier::Identifier: {
4569       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4570                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4571                                       ObjectType);
4572       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4573                                               SS, FirstQualifierInScope, false))
4574         return NestedNameSpecifierLoc();
4575       break;
4576     }
4577 
4578     case NestedNameSpecifier::Namespace: {
4579       NamespaceDecl *NS =
4580           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4581               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4582       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4583       break;
4584     }
4585 
4586     case NestedNameSpecifier::NamespaceAlias: {
4587       NamespaceAliasDecl *Alias =
4588           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4589               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4590       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4591                 Q.getLocalEndLoc());
4592       break;
4593     }
4594 
4595     case NestedNameSpecifier::Global:
4596       // There is no meaningful transformation that one could perform on the
4597       // global scope.
4598       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4599       break;
4600 
4601     case NestedNameSpecifier::Super: {
4602       CXXRecordDecl *RD =
4603           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4604               SourceLocation(), QNNS->getAsRecordDecl()));
4605       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4606       break;
4607     }
4608 
4609     case NestedNameSpecifier::TypeSpecWithTemplate:
4610     case NestedNameSpecifier::TypeSpec: {
4611       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4612                                               FirstQualifierInScope, SS);
4613 
4614       if (!TL)
4615         return NestedNameSpecifierLoc();
4616 
4617       QualType T = TL.getType();
4618       if (T->isDependentType() || T->isRecordType() ||
4619           (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) {
4620         if (T->isEnumeralType())
4621           SemaRef.Diag(TL.getBeginLoc(),
4622                        diag::warn_cxx98_compat_enum_nested_name_spec);
4623 
4624         if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) {
4625           SS.Adopt(ETL.getQualifierLoc());
4626           TL = ETL.getNamedTypeLoc();
4627         }
4628 
4629         SS.Extend(SemaRef.Context, TL.getTemplateKeywordLoc(), TL,
4630                   Q.getLocalEndLoc());
4631         break;
4632       }
4633       // If the nested-name-specifier is an invalid type def, don't emit an
4634       // error because a previous error should have already been emitted.
4635       TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>();
4636       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4637         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4638             << T << SS.getRange();
4639       }
4640       return NestedNameSpecifierLoc();
4641     }
4642     }
4643 
4644     // The qualifier-in-scope and object type only apply to the leftmost entity.
4645     FirstQualifierInScope = nullptr;
4646     ObjectType = QualType();
4647   }
4648 
4649   // Don't rebuild the nested-name-specifier if we don't have to.
4650   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4651       !getDerived().AlwaysRebuild())
4652     return NNS;
4653 
4654   // If we can re-use the source-location data from the original
4655   // nested-name-specifier, do so.
4656   if (SS.location_size() == NNS.getDataLength() &&
4657       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4658     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4659 
4660   // Allocate new nested-name-specifier location information.
4661   return SS.getWithLocInContext(SemaRef.Context);
4662 }
4663 
4664 template<typename Derived>
4665 DeclarationNameInfo
4666 TreeTransform<Derived>
4667 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4668   DeclarationName Name = NameInfo.getName();
4669   if (!Name)
4670     return DeclarationNameInfo();
4671 
4672   switch (Name.getNameKind()) {
4673   case DeclarationName::Identifier:
4674   case DeclarationName::ObjCZeroArgSelector:
4675   case DeclarationName::ObjCOneArgSelector:
4676   case DeclarationName::ObjCMultiArgSelector:
4677   case DeclarationName::CXXOperatorName:
4678   case DeclarationName::CXXLiteralOperatorName:
4679   case DeclarationName::CXXUsingDirective:
4680     return NameInfo;
4681 
4682   case DeclarationName::CXXDeductionGuideName: {
4683     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4684     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4685         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4686     if (!NewTemplate)
4687       return DeclarationNameInfo();
4688 
4689     DeclarationNameInfo NewNameInfo(NameInfo);
4690     NewNameInfo.setName(
4691         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4692     return NewNameInfo;
4693   }
4694 
4695   case DeclarationName::CXXConstructorName:
4696   case DeclarationName::CXXDestructorName:
4697   case DeclarationName::CXXConversionFunctionName: {
4698     TypeSourceInfo *NewTInfo;
4699     CanQualType NewCanTy;
4700     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4701       NewTInfo = getDerived().TransformType(OldTInfo);
4702       if (!NewTInfo)
4703         return DeclarationNameInfo();
4704       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4705     }
4706     else {
4707       NewTInfo = nullptr;
4708       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4709       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4710       if (NewT.isNull())
4711         return DeclarationNameInfo();
4712       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4713     }
4714 
4715     DeclarationName NewName
4716       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4717                                                            NewCanTy);
4718     DeclarationNameInfo NewNameInfo(NameInfo);
4719     NewNameInfo.setName(NewName);
4720     NewNameInfo.setNamedTypeInfo(NewTInfo);
4721     return NewNameInfo;
4722   }
4723   }
4724 
4725   llvm_unreachable("Unknown name kind.");
4726 }
4727 
4728 template<typename Derived>
4729 TemplateName
4730 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4731                                               TemplateName Name,
4732                                               SourceLocation NameLoc,
4733                                               QualType ObjectType,
4734                                               NamedDecl *FirstQualifierInScope,
4735                                               bool AllowInjectedClassName) {
4736   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4737     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4738     assert(Template && "qualified template name must refer to a template");
4739 
4740     TemplateDecl *TransTemplate
4741       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4742                                                               Template));
4743     if (!TransTemplate)
4744       return TemplateName();
4745 
4746     if (!getDerived().AlwaysRebuild() &&
4747         SS.getScopeRep() == QTN->getQualifier() &&
4748         TransTemplate == Template)
4749       return Name;
4750 
4751     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4752                                             TransTemplate);
4753   }
4754 
4755   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4756     if (SS.getScopeRep()) {
4757       // These apply to the scope specifier, not the template.
4758       ObjectType = QualType();
4759       FirstQualifierInScope = nullptr;
4760     }
4761 
4762     if (!getDerived().AlwaysRebuild() &&
4763         SS.getScopeRep() == DTN->getQualifier() &&
4764         ObjectType.isNull())
4765       return Name;
4766 
4767     // FIXME: Preserve the location of the "template" keyword.
4768     SourceLocation TemplateKWLoc = NameLoc;
4769 
4770     if (DTN->isIdentifier()) {
4771       return getDerived().RebuildTemplateName(SS,
4772                                               TemplateKWLoc,
4773                                               *DTN->getIdentifier(),
4774                                               NameLoc,
4775                                               ObjectType,
4776                                               FirstQualifierInScope,
4777                                               AllowInjectedClassName);
4778     }
4779 
4780     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4781                                             DTN->getOperator(), NameLoc,
4782                                             ObjectType, AllowInjectedClassName);
4783   }
4784 
4785   // FIXME: Try to preserve more of the TemplateName.
4786   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4787     TemplateDecl *TransTemplate
4788       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4789                                                               Template));
4790     if (!TransTemplate)
4791       return TemplateName();
4792 
4793     return getDerived().RebuildTemplateName(SS, /*TemplateKeyword=*/false,
4794                                             TransTemplate);
4795   }
4796 
4797   if (SubstTemplateTemplateParmPackStorage *SubstPack
4798       = Name.getAsSubstTemplateTemplateParmPack()) {
4799     return getDerived().RebuildTemplateName(
4800         SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4801         SubstPack->getIndex(), SubstPack->getFinal());
4802   }
4803 
4804   // These should be getting filtered out before they reach the AST.
4805   llvm_unreachable("overloaded function decl survived to here");
4806 }
4807 
4808 template<typename Derived>
4809 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4810                                          const TemplateArgument &Arg,
4811                                          TemplateArgumentLoc &Output) {
4812   Output = getSema().getTrivialTemplateArgumentLoc(
4813       Arg, QualType(), getDerived().getBaseLocation());
4814 }
4815 
4816 template <typename Derived>
4817 bool TreeTransform<Derived>::TransformTemplateArgument(
4818     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4819     bool Uneval) {
4820   const TemplateArgument &Arg = Input.getArgument();
4821   switch (Arg.getKind()) {
4822   case TemplateArgument::Null:
4823   case TemplateArgument::Pack:
4824     llvm_unreachable("Unexpected TemplateArgument");
4825 
4826   case TemplateArgument::Integral:
4827   case TemplateArgument::NullPtr:
4828   case TemplateArgument::Declaration:
4829   case TemplateArgument::StructuralValue: {
4830     // Transform a resolved template argument straight to a resolved template
4831     // argument. We get here when substituting into an already-substituted
4832     // template type argument during concept satisfaction checking.
4833     QualType T = Arg.getNonTypeTemplateArgumentType();
4834     QualType NewT = getDerived().TransformType(T);
4835     if (NewT.isNull())
4836       return true;
4837 
4838     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4839                        ? Arg.getAsDecl()
4840                        : nullptr;
4841     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4842                               getDerived().getBaseLocation(), D))
4843                         : nullptr;
4844     if (D && !NewD)
4845       return true;
4846 
4847     if (NewT == T && D == NewD)
4848       Output = Input;
4849     else if (Arg.getKind() == TemplateArgument::Integral)
4850       Output = TemplateArgumentLoc(
4851           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4852           TemplateArgumentLocInfo());
4853     else if (Arg.getKind() == TemplateArgument::NullPtr)
4854       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4855                                    TemplateArgumentLocInfo());
4856     else if (Arg.getKind() == TemplateArgument::Declaration)
4857       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4858                                    TemplateArgumentLocInfo());
4859     else if (Arg.getKind() == TemplateArgument::StructuralValue)
4860       Output = TemplateArgumentLoc(
4861           TemplateArgument(getSema().Context, NewT, Arg.getAsStructuralValue()),
4862           TemplateArgumentLocInfo());
4863     else
4864       llvm_unreachable("unexpected template argument kind");
4865 
4866     return false;
4867   }
4868 
4869   case TemplateArgument::Type: {
4870     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4871     if (!DI)
4872       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4873 
4874     DI = getDerived().TransformType(DI);
4875     if (!DI)
4876       return true;
4877 
4878     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4879     return false;
4880   }
4881 
4882   case TemplateArgument::Template: {
4883     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4884     if (QualifierLoc) {
4885       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4886       if (!QualifierLoc)
4887         return true;
4888     }
4889 
4890     CXXScopeSpec SS;
4891     SS.Adopt(QualifierLoc);
4892     TemplateName Template = getDerived().TransformTemplateName(
4893         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4894     if (Template.isNull())
4895       return true;
4896 
4897     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4898                                  QualifierLoc, Input.getTemplateNameLoc());
4899     return false;
4900   }
4901 
4902   case TemplateArgument::TemplateExpansion:
4903     llvm_unreachable("Caller should expand pack expansions");
4904 
4905   case TemplateArgument::Expression: {
4906     // Template argument expressions are constant expressions.
4907     EnterExpressionEvaluationContext Unevaluated(
4908         getSema(),
4909         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4910                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4911         Sema::ReuseLambdaContextDecl, /*ExprContext=*/
4912         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4913 
4914     Expr *InputExpr = Input.getSourceExpression();
4915     if (!InputExpr)
4916       InputExpr = Input.getArgument().getAsExpr();
4917 
4918     ExprResult E = getDerived().TransformExpr(InputExpr);
4919     E = SemaRef.ActOnConstantExpression(E);
4920     if (E.isInvalid())
4921       return true;
4922     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4923     return false;
4924   }
4925   }
4926 
4927   // Work around bogus GCC warning
4928   return true;
4929 }
4930 
4931 /// Iterator adaptor that invents template argument location information
4932 /// for each of the template arguments in its underlying iterator.
4933 template<typename Derived, typename InputIterator>
4934 class TemplateArgumentLocInventIterator {
4935   TreeTransform<Derived> &Self;
4936   InputIterator Iter;
4937 
4938 public:
4939   typedef TemplateArgumentLoc value_type;
4940   typedef TemplateArgumentLoc reference;
4941   typedef typename std::iterator_traits<InputIterator>::difference_type
4942     difference_type;
4943   typedef std::input_iterator_tag iterator_category;
4944 
4945   class pointer {
4946     TemplateArgumentLoc Arg;
4947 
4948   public:
4949     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4950 
4951     const TemplateArgumentLoc *operator->() const { return &Arg; }
4952   };
4953 
4954   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4955                                              InputIterator Iter)
4956     : Self(Self), Iter(Iter) { }
4957 
4958   TemplateArgumentLocInventIterator &operator++() {
4959     ++Iter;
4960     return *this;
4961   }
4962 
4963   TemplateArgumentLocInventIterator operator++(int) {
4964     TemplateArgumentLocInventIterator Old(*this);
4965     ++(*this);
4966     return Old;
4967   }
4968 
4969   reference operator*() const {
4970     TemplateArgumentLoc Result;
4971     Self.InventTemplateArgumentLoc(*Iter, Result);
4972     return Result;
4973   }
4974 
4975   pointer operator->() const { return pointer(**this); }
4976 
4977   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4978                          const TemplateArgumentLocInventIterator &Y) {
4979     return X.Iter == Y.Iter;
4980   }
4981 
4982   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4983                          const TemplateArgumentLocInventIterator &Y) {
4984     return X.Iter != Y.Iter;
4985   }
4986 };
4987 
4988 template<typename Derived>
4989 template<typename InputIterator>
4990 bool TreeTransform<Derived>::TransformTemplateArguments(
4991     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4992     bool Uneval) {
4993   for (; First != Last; ++First) {
4994     TemplateArgumentLoc Out;
4995     TemplateArgumentLoc In = *First;
4996 
4997     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4998       // Unpack argument packs, which we translate them into separate
4999       // arguments.
5000       // FIXME: We could do much better if we could guarantee that the
5001       // TemplateArgumentLocInfo for the pack expansion would be usable for
5002       // all of the template arguments in the argument pack.
5003       typedef TemplateArgumentLocInventIterator<Derived,
5004                                                 TemplateArgument::pack_iterator>
5005         PackLocIterator;
5006       if (TransformTemplateArguments(PackLocIterator(*this,
5007                                                  In.getArgument().pack_begin()),
5008                                      PackLocIterator(*this,
5009                                                    In.getArgument().pack_end()),
5010                                      Outputs, Uneval))
5011         return true;
5012 
5013       continue;
5014     }
5015 
5016     if (In.getArgument().isPackExpansion()) {
5017       // We have a pack expansion, for which we will be substituting into
5018       // the pattern.
5019       SourceLocation Ellipsis;
5020       std::optional<unsigned> OrigNumExpansions;
5021       TemplateArgumentLoc Pattern
5022         = getSema().getTemplateArgumentPackExpansionPattern(
5023               In, Ellipsis, OrigNumExpansions);
5024 
5025       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5026       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5027       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5028 
5029       // Determine whether the set of unexpanded parameter packs can and should
5030       // be expanded.
5031       bool Expand = true;
5032       bool RetainExpansion = false;
5033       std::optional<unsigned> NumExpansions = OrigNumExpansions;
5034       if (getDerived().TryExpandParameterPacks(Ellipsis,
5035                                                Pattern.getSourceRange(),
5036                                                Unexpanded,
5037                                                Expand,
5038                                                RetainExpansion,
5039                                                NumExpansions))
5040         return true;
5041 
5042       if (!Expand) {
5043         // The transform has determined that we should perform a simple
5044         // transformation on the pack expansion, producing another pack
5045         // expansion.
5046         TemplateArgumentLoc OutPattern;
5047         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5048         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
5049           return true;
5050 
5051         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
5052                                                 NumExpansions);
5053         if (Out.getArgument().isNull())
5054           return true;
5055 
5056         Outputs.addArgument(Out);
5057         continue;
5058       }
5059 
5060       // The transform has determined that we should perform an elementwise
5061       // expansion of the pattern. Do so.
5062       for (unsigned I = 0; I != *NumExpansions; ++I) {
5063         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5064 
5065         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5066           return true;
5067 
5068         if (Out.getArgument().containsUnexpandedParameterPack()) {
5069           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5070                                                   OrigNumExpansions);
5071           if (Out.getArgument().isNull())
5072             return true;
5073         }
5074 
5075         Outputs.addArgument(Out);
5076       }
5077 
5078       // If we're supposed to retain a pack expansion, do so by temporarily
5079       // forgetting the partially-substituted parameter pack.
5080       if (RetainExpansion) {
5081         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5082 
5083         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
5084           return true;
5085 
5086         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
5087                                                 OrigNumExpansions);
5088         if (Out.getArgument().isNull())
5089           return true;
5090 
5091         Outputs.addArgument(Out);
5092       }
5093 
5094       continue;
5095     }
5096 
5097     // The simple case:
5098     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
5099       return true;
5100 
5101     Outputs.addArgument(Out);
5102   }
5103 
5104   return false;
5105 
5106 }
5107 
5108 //===----------------------------------------------------------------------===//
5109 // Type transformation
5110 //===----------------------------------------------------------------------===//
5111 
5112 template<typename Derived>
5113 QualType TreeTransform<Derived>::TransformType(QualType T) {
5114   if (getDerived().AlreadyTransformed(T))
5115     return T;
5116 
5117   // Temporary workaround.  All of these transformations should
5118   // eventually turn into transformations on TypeLocs.
5119   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
5120                                                 getDerived().getBaseLocation());
5121 
5122   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
5123 
5124   if (!NewDI)
5125     return QualType();
5126 
5127   return NewDI->getType();
5128 }
5129 
5130 template<typename Derived>
5131 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
5132   // Refine the base location to the type's location.
5133   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
5134                        getDerived().getBaseEntity());
5135   if (getDerived().AlreadyTransformed(DI->getType()))
5136     return DI;
5137 
5138   TypeLocBuilder TLB;
5139 
5140   TypeLoc TL = DI->getTypeLoc();
5141   TLB.reserve(TL.getFullDataSize());
5142 
5143   QualType Result = getDerived().TransformType(TLB, TL);
5144   if (Result.isNull())
5145     return nullptr;
5146 
5147   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5148 }
5149 
5150 template<typename Derived>
5151 QualType
5152 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
5153   switch (T.getTypeLocClass()) {
5154 #define ABSTRACT_TYPELOC(CLASS, PARENT)
5155 #define TYPELOC(CLASS, PARENT)                                                 \
5156   case TypeLoc::CLASS:                                                         \
5157     return getDerived().Transform##CLASS##Type(TLB,                            \
5158                                                T.castAs<CLASS##TypeLoc>());
5159 #include "clang/AST/TypeLocNodes.def"
5160   }
5161 
5162   llvm_unreachable("unhandled type loc!");
5163 }
5164 
5165 template<typename Derived>
5166 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
5167   if (!isa<DependentNameType>(T))
5168     return TransformType(T);
5169 
5170   if (getDerived().AlreadyTransformed(T))
5171     return T;
5172   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
5173                                                 getDerived().getBaseLocation());
5174   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
5175   return NewDI ? NewDI->getType() : QualType();
5176 }
5177 
5178 template<typename Derived>
5179 TypeSourceInfo *
5180 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
5181   if (!isa<DependentNameType>(DI->getType()))
5182     return TransformType(DI);
5183 
5184   // Refine the base location to the type's location.
5185   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
5186                        getDerived().getBaseEntity());
5187   if (getDerived().AlreadyTransformed(DI->getType()))
5188     return DI;
5189 
5190   TypeLocBuilder TLB;
5191 
5192   TypeLoc TL = DI->getTypeLoc();
5193   TLB.reserve(TL.getFullDataSize());
5194 
5195   auto QTL = TL.getAs<QualifiedTypeLoc>();
5196   if (QTL)
5197     TL = QTL.getUnqualifiedLoc();
5198 
5199   auto DNTL = TL.castAs<DependentNameTypeLoc>();
5200 
5201   QualType Result = getDerived().TransformDependentNameType(
5202       TLB, DNTL, /*DeducedTSTContext*/true);
5203   if (Result.isNull())
5204     return nullptr;
5205 
5206   if (QTL) {
5207     Result = getDerived().RebuildQualifiedType(Result, QTL);
5208     if (Result.isNull())
5209       return nullptr;
5210     TLB.TypeWasModifiedSafely(Result);
5211   }
5212 
5213   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5214 }
5215 
5216 template<typename Derived>
5217 QualType
5218 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
5219                                                QualifiedTypeLoc T) {
5220   QualType Result;
5221   TypeLoc UnqualTL = T.getUnqualifiedLoc();
5222   auto SuppressObjCLifetime =
5223       T.getType().getLocalQualifiers().hasObjCLifetime();
5224   if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) {
5225     Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
5226                                                         SuppressObjCLifetime);
5227   } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) {
5228     Result = getDerived().TransformSubstTemplateTypeParmPackType(
5229         TLB, STTP, SuppressObjCLifetime);
5230   } else {
5231     Result = getDerived().TransformType(TLB, UnqualTL);
5232   }
5233 
5234   if (Result.isNull())
5235     return QualType();
5236 
5237   Result = getDerived().RebuildQualifiedType(Result, T);
5238 
5239   if (Result.isNull())
5240     return QualType();
5241 
5242   // RebuildQualifiedType might have updated the type, but not in a way
5243   // that invalidates the TypeLoc. (There's no location information for
5244   // qualifiers.)
5245   TLB.TypeWasModifiedSafely(Result);
5246 
5247   return Result;
5248 }
5249 
5250 template <typename Derived>
5251 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
5252                                                       QualifiedTypeLoc TL) {
5253 
5254   SourceLocation Loc = TL.getBeginLoc();
5255   Qualifiers Quals = TL.getType().getLocalQualifiers();
5256 
5257   if ((T.getAddressSpace() != LangAS::Default &&
5258        Quals.getAddressSpace() != LangAS::Default) &&
5259       T.getAddressSpace() != Quals.getAddressSpace()) {
5260     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
5261         << TL.getType() << T;
5262     return QualType();
5263   }
5264 
5265   // C++ [dcl.fct]p7:
5266   //   [When] adding cv-qualifications on top of the function type [...] the
5267   //   cv-qualifiers are ignored.
5268   if (T->isFunctionType()) {
5269     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
5270                                                      Quals.getAddressSpace());
5271     return T;
5272   }
5273 
5274   // C++ [dcl.ref]p1:
5275   //   when the cv-qualifiers are introduced through the use of a typedef-name
5276   //   or decltype-specifier [...] the cv-qualifiers are ignored.
5277   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
5278   // applied to a reference type.
5279   if (T->isReferenceType()) {
5280     // The only qualifier that applies to a reference type is restrict.
5281     if (!Quals.hasRestrict())
5282       return T;
5283     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
5284   }
5285 
5286   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
5287   // resulting type.
5288   if (Quals.hasObjCLifetime()) {
5289     if (!T->isObjCLifetimeType() && !T->isDependentType())
5290       Quals.removeObjCLifetime();
5291     else if (T.getObjCLifetime()) {
5292       // Objective-C ARC:
5293       //   A lifetime qualifier applied to a substituted template parameter
5294       //   overrides the lifetime qualifier from the template argument.
5295       const AutoType *AutoTy;
5296       if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
5297         // 'auto' types behave the same way as template parameters.
5298         QualType Deduced = AutoTy->getDeducedType();
5299         Qualifiers Qs = Deduced.getQualifiers();
5300         Qs.removeObjCLifetime();
5301         Deduced =
5302             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
5303         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
5304                                         AutoTy->isDependentType(),
5305                                         /*isPack=*/false,
5306                                         AutoTy->getTypeConstraintConcept(),
5307                                         AutoTy->getTypeConstraintArguments());
5308       } else {
5309         // Otherwise, complain about the addition of a qualifier to an
5310         // already-qualified type.
5311         // FIXME: Why is this check not in Sema::BuildQualifiedType?
5312         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
5313         Quals.removeObjCLifetime();
5314       }
5315     }
5316   }
5317 
5318   return SemaRef.BuildQualifiedType(T, Loc, Quals);
5319 }
5320 
5321 template<typename Derived>
5322 TypeLoc
5323 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
5324                                                    QualType ObjectType,
5325                                                    NamedDecl *UnqualLookup,
5326                                                    CXXScopeSpec &SS) {
5327   if (getDerived().AlreadyTransformed(TL.getType()))
5328     return TL;
5329 
5330   TypeSourceInfo *TSI =
5331       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
5332   if (TSI)
5333     return TSI->getTypeLoc();
5334   return TypeLoc();
5335 }
5336 
5337 template<typename Derived>
5338 TypeSourceInfo *
5339 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5340                                                    QualType ObjectType,
5341                                                    NamedDecl *UnqualLookup,
5342                                                    CXXScopeSpec &SS) {
5343   if (getDerived().AlreadyTransformed(TSInfo->getType()))
5344     return TSInfo;
5345 
5346   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5347                                    UnqualLookup, SS);
5348 }
5349 
5350 template <typename Derived>
5351 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5352     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5353     CXXScopeSpec &SS) {
5354   QualType T = TL.getType();
5355   assert(!getDerived().AlreadyTransformed(T));
5356 
5357   TypeLocBuilder TLB;
5358   QualType Result;
5359 
5360   if (isa<TemplateSpecializationType>(T)) {
5361     TemplateSpecializationTypeLoc SpecTL =
5362         TL.castAs<TemplateSpecializationTypeLoc>();
5363 
5364     TemplateName Template = getDerived().TransformTemplateName(
5365         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5366         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
5367     if (Template.isNull())
5368       return nullptr;
5369 
5370     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5371                                                               Template);
5372   } else if (isa<DependentTemplateSpecializationType>(T)) {
5373     DependentTemplateSpecializationTypeLoc SpecTL =
5374         TL.castAs<DependentTemplateSpecializationTypeLoc>();
5375 
5376     TemplateName Template
5377       = getDerived().RebuildTemplateName(SS,
5378                                          SpecTL.getTemplateKeywordLoc(),
5379                                          *SpecTL.getTypePtr()->getIdentifier(),
5380                                          SpecTL.getTemplateNameLoc(),
5381                                          ObjectType, UnqualLookup,
5382                                          /*AllowInjectedClassName*/true);
5383     if (Template.isNull())
5384       return nullptr;
5385 
5386     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5387                                                                        SpecTL,
5388                                                                        Template,
5389                                                                        SS);
5390   } else {
5391     // Nothing special needs to be done for these.
5392     Result = getDerived().TransformType(TLB, TL);
5393   }
5394 
5395   if (Result.isNull())
5396     return nullptr;
5397 
5398   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5399 }
5400 
5401 template <class TyLoc> static inline
5402 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
5403   TyLoc NewT = TLB.push<TyLoc>(T.getType());
5404   NewT.setNameLoc(T.getNameLoc());
5405   return T.getType();
5406 }
5407 
5408 template<typename Derived>
5409 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5410                                                       BuiltinTypeLoc T) {
5411   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
5412   NewT.setBuiltinLoc(T.getBuiltinLoc());
5413   if (T.needsExtraLocalData())
5414     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
5415   return T.getType();
5416 }
5417 
5418 template<typename Derived>
5419 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5420                                                       ComplexTypeLoc T) {
5421   // FIXME: recurse?
5422   return TransformTypeSpecType(TLB, T);
5423 }
5424 
5425 template <typename Derived>
5426 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5427                                                        AdjustedTypeLoc TL) {
5428   // Adjustments applied during transformation are handled elsewhere.
5429   return getDerived().TransformType(TLB, TL.getOriginalLoc());
5430 }
5431 
5432 template<typename Derived>
5433 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5434                                                       DecayedTypeLoc TL) {
5435   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5436   if (OriginalType.isNull())
5437     return QualType();
5438 
5439   QualType Result = TL.getType();
5440   if (getDerived().AlwaysRebuild() ||
5441       OriginalType != TL.getOriginalLoc().getType())
5442     Result = SemaRef.Context.getDecayedType(OriginalType);
5443   TLB.push<DecayedTypeLoc>(Result);
5444   // Nothing to set for DecayedTypeLoc.
5445   return Result;
5446 }
5447 
5448 template <typename Derived>
5449 QualType
5450 TreeTransform<Derived>::TransformArrayParameterType(TypeLocBuilder &TLB,
5451                                                     ArrayParameterTypeLoc TL) {
5452   QualType OriginalType = getDerived().TransformType(TLB, TL.getElementLoc());
5453   if (OriginalType.isNull())
5454     return QualType();
5455 
5456   QualType Result = TL.getType();
5457   if (getDerived().AlwaysRebuild() ||
5458       OriginalType != TL.getElementLoc().getType())
5459     Result = SemaRef.Context.getArrayParameterType(OriginalType);
5460   TLB.push<ArrayParameterTypeLoc>(Result);
5461   // Nothing to set for ArrayParameterTypeLoc.
5462   return Result;
5463 }
5464 
5465 template<typename Derived>
5466 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5467                                                       PointerTypeLoc TL) {
5468   QualType PointeeType
5469     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5470   if (PointeeType.isNull())
5471     return QualType();
5472 
5473   QualType Result = TL.getType();
5474   if (PointeeType->getAs<ObjCObjectType>()) {
5475     // A dependent pointer type 'T *' has is being transformed such
5476     // that an Objective-C class type is being replaced for 'T'. The
5477     // resulting pointer type is an ObjCObjectPointerType, not a
5478     // PointerType.
5479     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5480 
5481     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5482     NewT.setStarLoc(TL.getStarLoc());
5483     return Result;
5484   }
5485 
5486   if (getDerived().AlwaysRebuild() ||
5487       PointeeType != TL.getPointeeLoc().getType()) {
5488     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5489     if (Result.isNull())
5490       return QualType();
5491   }
5492 
5493   // Objective-C ARC can add lifetime qualifiers to the type that we're
5494   // pointing to.
5495   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5496 
5497   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5498   NewT.setSigilLoc(TL.getSigilLoc());
5499   return Result;
5500 }
5501 
5502 template<typename Derived>
5503 QualType
5504 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5505                                                   BlockPointerTypeLoc TL) {
5506   QualType PointeeType
5507     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5508   if (PointeeType.isNull())
5509     return QualType();
5510 
5511   QualType Result = TL.getType();
5512   if (getDerived().AlwaysRebuild() ||
5513       PointeeType != TL.getPointeeLoc().getType()) {
5514     Result = getDerived().RebuildBlockPointerType(PointeeType,
5515                                                   TL.getSigilLoc());
5516     if (Result.isNull())
5517       return QualType();
5518   }
5519 
5520   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5521   NewT.setSigilLoc(TL.getSigilLoc());
5522   return Result;
5523 }
5524 
5525 /// Transforms a reference type.  Note that somewhat paradoxically we
5526 /// don't care whether the type itself is an l-value type or an r-value
5527 /// type;  we only care if the type was *written* as an l-value type
5528 /// or an r-value type.
5529 template<typename Derived>
5530 QualType
5531 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5532                                                ReferenceTypeLoc TL) {
5533   const ReferenceType *T = TL.getTypePtr();
5534 
5535   // Note that this works with the pointee-as-written.
5536   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5537   if (PointeeType.isNull())
5538     return QualType();
5539 
5540   QualType Result = TL.getType();
5541   if (getDerived().AlwaysRebuild() ||
5542       PointeeType != T->getPointeeTypeAsWritten()) {
5543     Result = getDerived().RebuildReferenceType(PointeeType,
5544                                                T->isSpelledAsLValue(),
5545                                                TL.getSigilLoc());
5546     if (Result.isNull())
5547       return QualType();
5548   }
5549 
5550   // Objective-C ARC can add lifetime qualifiers to the type that we're
5551   // referring to.
5552   TLB.TypeWasModifiedSafely(
5553       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5554 
5555   // r-value references can be rebuilt as l-value references.
5556   ReferenceTypeLoc NewTL;
5557   if (isa<LValueReferenceType>(Result))
5558     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5559   else
5560     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5561   NewTL.setSigilLoc(TL.getSigilLoc());
5562 
5563   return Result;
5564 }
5565 
5566 template<typename Derived>
5567 QualType
5568 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5569                                                  LValueReferenceTypeLoc TL) {
5570   return TransformReferenceType(TLB, TL);
5571 }
5572 
5573 template<typename Derived>
5574 QualType
5575 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5576                                                  RValueReferenceTypeLoc TL) {
5577   return TransformReferenceType(TLB, TL);
5578 }
5579 
5580 template<typename Derived>
5581 QualType
5582 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5583                                                    MemberPointerTypeLoc TL) {
5584   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5585   if (PointeeType.isNull())
5586     return QualType();
5587 
5588   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5589   TypeSourceInfo *NewClsTInfo = nullptr;
5590   if (OldClsTInfo) {
5591     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5592     if (!NewClsTInfo)
5593       return QualType();
5594   }
5595 
5596   const MemberPointerType *T = TL.getTypePtr();
5597   QualType OldClsType = QualType(T->getClass(), 0);
5598   QualType NewClsType;
5599   if (NewClsTInfo)
5600     NewClsType = NewClsTInfo->getType();
5601   else {
5602     NewClsType = getDerived().TransformType(OldClsType);
5603     if (NewClsType.isNull())
5604       return QualType();
5605   }
5606 
5607   QualType Result = TL.getType();
5608   if (getDerived().AlwaysRebuild() ||
5609       PointeeType != T->getPointeeType() ||
5610       NewClsType != OldClsType) {
5611     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5612                                                    TL.getStarLoc());
5613     if (Result.isNull())
5614       return QualType();
5615   }
5616 
5617   // If we had to adjust the pointee type when building a member pointer, make
5618   // sure to push TypeLoc info for it.
5619   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5620   if (MPT && PointeeType != MPT->getPointeeType()) {
5621     assert(isa<AdjustedType>(MPT->getPointeeType()));
5622     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5623   }
5624 
5625   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5626   NewTL.setSigilLoc(TL.getSigilLoc());
5627   NewTL.setClassTInfo(NewClsTInfo);
5628 
5629   return Result;
5630 }
5631 
5632 template<typename Derived>
5633 QualType
5634 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5635                                                    ConstantArrayTypeLoc TL) {
5636   const ConstantArrayType *T = TL.getTypePtr();
5637   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5638   if (ElementType.isNull())
5639     return QualType();
5640 
5641   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5642   Expr *OldSize = TL.getSizeExpr();
5643   if (!OldSize)
5644     OldSize = const_cast<Expr*>(T->getSizeExpr());
5645   Expr *NewSize = nullptr;
5646   if (OldSize) {
5647     EnterExpressionEvaluationContext Unevaluated(
5648         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5649     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5650     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5651   }
5652 
5653   QualType Result = TL.getType();
5654   if (getDerived().AlwaysRebuild() ||
5655       ElementType != T->getElementType() ||
5656       (T->getSizeExpr() && NewSize != OldSize)) {
5657     Result = getDerived().RebuildConstantArrayType(ElementType,
5658                                                    T->getSizeModifier(),
5659                                                    T->getSize(), NewSize,
5660                                              T->getIndexTypeCVRQualifiers(),
5661                                                    TL.getBracketsRange());
5662     if (Result.isNull())
5663       return QualType();
5664   }
5665 
5666   // We might have either a ConstantArrayType or a VariableArrayType now:
5667   // a ConstantArrayType is allowed to have an element type which is a
5668   // VariableArrayType if the type is dependent.  Fortunately, all array
5669   // types have the same location layout.
5670   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5671   NewTL.setLBracketLoc(TL.getLBracketLoc());
5672   NewTL.setRBracketLoc(TL.getRBracketLoc());
5673   NewTL.setSizeExpr(NewSize);
5674 
5675   return Result;
5676 }
5677 
5678 template<typename Derived>
5679 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5680                                               TypeLocBuilder &TLB,
5681                                               IncompleteArrayTypeLoc TL) {
5682   const IncompleteArrayType *T = TL.getTypePtr();
5683   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5684   if (ElementType.isNull())
5685     return QualType();
5686 
5687   QualType Result = TL.getType();
5688   if (getDerived().AlwaysRebuild() ||
5689       ElementType != T->getElementType()) {
5690     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5691                                                      T->getSizeModifier(),
5692                                            T->getIndexTypeCVRQualifiers(),
5693                                                      TL.getBracketsRange());
5694     if (Result.isNull())
5695       return QualType();
5696   }
5697 
5698   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5699   NewTL.setLBracketLoc(TL.getLBracketLoc());
5700   NewTL.setRBracketLoc(TL.getRBracketLoc());
5701   NewTL.setSizeExpr(nullptr);
5702 
5703   return Result;
5704 }
5705 
5706 template<typename Derived>
5707 QualType
5708 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5709                                                    VariableArrayTypeLoc TL) {
5710   const VariableArrayType *T = TL.getTypePtr();
5711   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5712   if (ElementType.isNull())
5713     return QualType();
5714 
5715   ExprResult SizeResult;
5716   {
5717     EnterExpressionEvaluationContext Context(
5718         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5719     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5720   }
5721   if (SizeResult.isInvalid())
5722     return QualType();
5723   SizeResult =
5724       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5725   if (SizeResult.isInvalid())
5726     return QualType();
5727 
5728   Expr *Size = SizeResult.get();
5729 
5730   QualType Result = TL.getType();
5731   if (getDerived().AlwaysRebuild() ||
5732       ElementType != T->getElementType() ||
5733       Size != T->getSizeExpr()) {
5734     Result = getDerived().RebuildVariableArrayType(ElementType,
5735                                                    T->getSizeModifier(),
5736                                                    Size,
5737                                              T->getIndexTypeCVRQualifiers(),
5738                                                    TL.getBracketsRange());
5739     if (Result.isNull())
5740       return QualType();
5741   }
5742 
5743   // We might have constant size array now, but fortunately it has the same
5744   // location layout.
5745   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5746   NewTL.setLBracketLoc(TL.getLBracketLoc());
5747   NewTL.setRBracketLoc(TL.getRBracketLoc());
5748   NewTL.setSizeExpr(Size);
5749 
5750   return Result;
5751 }
5752 
5753 template<typename Derived>
5754 QualType
5755 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5756                                              DependentSizedArrayTypeLoc TL) {
5757   const DependentSizedArrayType *T = TL.getTypePtr();
5758   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5759   if (ElementType.isNull())
5760     return QualType();
5761 
5762   // Array bounds are constant expressions.
5763   EnterExpressionEvaluationContext Unevaluated(
5764       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5765 
5766   // If we have a VLA then it won't be a constant.
5767   SemaRef.ExprEvalContexts.back().InConditionallyConstantEvaluateContext = true;
5768 
5769   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5770   Expr *origSize = TL.getSizeExpr();
5771   if (!origSize) origSize = T->getSizeExpr();
5772 
5773   ExprResult sizeResult
5774     = getDerived().TransformExpr(origSize);
5775   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5776   if (sizeResult.isInvalid())
5777     return QualType();
5778 
5779   Expr *size = sizeResult.get();
5780 
5781   QualType Result = TL.getType();
5782   if (getDerived().AlwaysRebuild() ||
5783       ElementType != T->getElementType() ||
5784       size != origSize) {
5785     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5786                                                          T->getSizeModifier(),
5787                                                          size,
5788                                                 T->getIndexTypeCVRQualifiers(),
5789                                                         TL.getBracketsRange());
5790     if (Result.isNull())
5791       return QualType();
5792   }
5793 
5794   // We might have any sort of array type now, but fortunately they
5795   // all have the same location layout.
5796   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5797   NewTL.setLBracketLoc(TL.getLBracketLoc());
5798   NewTL.setRBracketLoc(TL.getRBracketLoc());
5799   NewTL.setSizeExpr(size);
5800 
5801   return Result;
5802 }
5803 
5804 template <typename Derived>
5805 QualType TreeTransform<Derived>::TransformDependentVectorType(
5806     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5807   const DependentVectorType *T = TL.getTypePtr();
5808   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5809   if (ElementType.isNull())
5810     return QualType();
5811 
5812   EnterExpressionEvaluationContext Unevaluated(
5813       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5814 
5815   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5816   Size = SemaRef.ActOnConstantExpression(Size);
5817   if (Size.isInvalid())
5818     return QualType();
5819 
5820   QualType Result = TL.getType();
5821   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5822       Size.get() != T->getSizeExpr()) {
5823     Result = getDerived().RebuildDependentVectorType(
5824         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5825     if (Result.isNull())
5826       return QualType();
5827   }
5828 
5829   // Result might be dependent or not.
5830   if (isa<DependentVectorType>(Result)) {
5831     DependentVectorTypeLoc NewTL =
5832         TLB.push<DependentVectorTypeLoc>(Result);
5833     NewTL.setNameLoc(TL.getNameLoc());
5834   } else {
5835     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5836     NewTL.setNameLoc(TL.getNameLoc());
5837   }
5838 
5839   return Result;
5840 }
5841 
5842 template<typename Derived>
5843 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5844                                       TypeLocBuilder &TLB,
5845                                       DependentSizedExtVectorTypeLoc TL) {
5846   const DependentSizedExtVectorType *T = TL.getTypePtr();
5847 
5848   // FIXME: ext vector locs should be nested
5849   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5850   if (ElementType.isNull())
5851     return QualType();
5852 
5853   // Vector sizes are constant expressions.
5854   EnterExpressionEvaluationContext Unevaluated(
5855       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5856 
5857   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5858   Size = SemaRef.ActOnConstantExpression(Size);
5859   if (Size.isInvalid())
5860     return QualType();
5861 
5862   QualType Result = TL.getType();
5863   if (getDerived().AlwaysRebuild() ||
5864       ElementType != T->getElementType() ||
5865       Size.get() != T->getSizeExpr()) {
5866     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5867                                                              Size.get(),
5868                                                          T->getAttributeLoc());
5869     if (Result.isNull())
5870       return QualType();
5871   }
5872 
5873   // Result might be dependent or not.
5874   if (isa<DependentSizedExtVectorType>(Result)) {
5875     DependentSizedExtVectorTypeLoc NewTL
5876       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5877     NewTL.setNameLoc(TL.getNameLoc());
5878   } else {
5879     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5880     NewTL.setNameLoc(TL.getNameLoc());
5881   }
5882 
5883   return Result;
5884 }
5885 
5886 template <typename Derived>
5887 QualType
5888 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5889                                                     ConstantMatrixTypeLoc TL) {
5890   const ConstantMatrixType *T = TL.getTypePtr();
5891   QualType ElementType = getDerived().TransformType(T->getElementType());
5892   if (ElementType.isNull())
5893     return QualType();
5894 
5895   QualType Result = TL.getType();
5896   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5897     Result = getDerived().RebuildConstantMatrixType(
5898         ElementType, T->getNumRows(), T->getNumColumns());
5899     if (Result.isNull())
5900       return QualType();
5901   }
5902 
5903   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5904   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5905   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5906   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5907   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5908 
5909   return Result;
5910 }
5911 
5912 template <typename Derived>
5913 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5914     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5915   const DependentSizedMatrixType *T = TL.getTypePtr();
5916 
5917   QualType ElementType = getDerived().TransformType(T->getElementType());
5918   if (ElementType.isNull()) {
5919     return QualType();
5920   }
5921 
5922   // Matrix dimensions are constant expressions.
5923   EnterExpressionEvaluationContext Unevaluated(
5924       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5925 
5926   Expr *origRows = TL.getAttrRowOperand();
5927   if (!origRows)
5928     origRows = T->getRowExpr();
5929   Expr *origColumns = TL.getAttrColumnOperand();
5930   if (!origColumns)
5931     origColumns = T->getColumnExpr();
5932 
5933   ExprResult rowResult = getDerived().TransformExpr(origRows);
5934   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5935   if (rowResult.isInvalid())
5936     return QualType();
5937 
5938   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5939   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5940   if (columnResult.isInvalid())
5941     return QualType();
5942 
5943   Expr *rows = rowResult.get();
5944   Expr *columns = columnResult.get();
5945 
5946   QualType Result = TL.getType();
5947   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5948       rows != origRows || columns != origColumns) {
5949     Result = getDerived().RebuildDependentSizedMatrixType(
5950         ElementType, rows, columns, T->getAttributeLoc());
5951 
5952     if (Result.isNull())
5953       return QualType();
5954   }
5955 
5956   // We might have any sort of matrix type now, but fortunately they
5957   // all have the same location layout.
5958   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5959   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5960   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5961   NewTL.setAttrRowOperand(rows);
5962   NewTL.setAttrColumnOperand(columns);
5963   return Result;
5964 }
5965 
5966 template <typename Derived>
5967 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5968     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5969   const DependentAddressSpaceType *T = TL.getTypePtr();
5970 
5971   QualType pointeeType =
5972       getDerived().TransformType(TLB, TL.getPointeeTypeLoc());
5973 
5974   if (pointeeType.isNull())
5975     return QualType();
5976 
5977   // Address spaces are constant expressions.
5978   EnterExpressionEvaluationContext Unevaluated(
5979       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5980 
5981   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5982   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5983   if (AddrSpace.isInvalid())
5984     return QualType();
5985 
5986   QualType Result = TL.getType();
5987   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5988       AddrSpace.get() != T->getAddrSpaceExpr()) {
5989     Result = getDerived().RebuildDependentAddressSpaceType(
5990         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5991     if (Result.isNull())
5992       return QualType();
5993   }
5994 
5995   // Result might be dependent or not.
5996   if (isa<DependentAddressSpaceType>(Result)) {
5997     DependentAddressSpaceTypeLoc NewTL =
5998         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5999 
6000     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
6001     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
6002     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
6003 
6004   } else {
6005     TLB.TypeWasModifiedSafely(Result);
6006   }
6007 
6008   return Result;
6009 }
6010 
6011 template <typename Derived>
6012 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
6013                                                      VectorTypeLoc TL) {
6014   const VectorType *T = TL.getTypePtr();
6015   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6016   if (ElementType.isNull())
6017     return QualType();
6018 
6019   QualType Result = TL.getType();
6020   if (getDerived().AlwaysRebuild() ||
6021       ElementType != T->getElementType()) {
6022     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
6023                                             T->getVectorKind());
6024     if (Result.isNull())
6025       return QualType();
6026   }
6027 
6028   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
6029   NewTL.setNameLoc(TL.getNameLoc());
6030 
6031   return Result;
6032 }
6033 
6034 template<typename Derived>
6035 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
6036                                                         ExtVectorTypeLoc TL) {
6037   const VectorType *T = TL.getTypePtr();
6038   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
6039   if (ElementType.isNull())
6040     return QualType();
6041 
6042   QualType Result = TL.getType();
6043   if (getDerived().AlwaysRebuild() ||
6044       ElementType != T->getElementType()) {
6045     Result = getDerived().RebuildExtVectorType(ElementType,
6046                                                T->getNumElements(),
6047                                                /*FIXME*/ SourceLocation());
6048     if (Result.isNull())
6049       return QualType();
6050   }
6051 
6052   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
6053   NewTL.setNameLoc(TL.getNameLoc());
6054 
6055   return Result;
6056 }
6057 
6058 template <typename Derived>
6059 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
6060     ParmVarDecl *OldParm, int indexAdjustment,
6061     std::optional<unsigned> NumExpansions, bool ExpectParameterPack) {
6062   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
6063   TypeSourceInfo *NewDI = nullptr;
6064 
6065   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
6066     // If we're substituting into a pack expansion type and we know the
6067     // length we want to expand to, just substitute for the pattern.
6068     TypeLoc OldTL = OldDI->getTypeLoc();
6069     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
6070 
6071     TypeLocBuilder TLB;
6072     TypeLoc NewTL = OldDI->getTypeLoc();
6073     TLB.reserve(NewTL.getFullDataSize());
6074 
6075     QualType Result = getDerived().TransformType(TLB,
6076                                                OldExpansionTL.getPatternLoc());
6077     if (Result.isNull())
6078       return nullptr;
6079 
6080     Result = RebuildPackExpansionType(Result,
6081                                 OldExpansionTL.getPatternLoc().getSourceRange(),
6082                                       OldExpansionTL.getEllipsisLoc(),
6083                                       NumExpansions);
6084     if (Result.isNull())
6085       return nullptr;
6086 
6087     PackExpansionTypeLoc NewExpansionTL
6088       = TLB.push<PackExpansionTypeLoc>(Result);
6089     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
6090     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
6091   } else
6092     NewDI = getDerived().TransformType(OldDI);
6093   if (!NewDI)
6094     return nullptr;
6095 
6096   if (NewDI == OldDI && indexAdjustment == 0)
6097     return OldParm;
6098 
6099   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
6100                                              OldParm->getDeclContext(),
6101                                              OldParm->getInnerLocStart(),
6102                                              OldParm->getLocation(),
6103                                              OldParm->getIdentifier(),
6104                                              NewDI->getType(),
6105                                              NewDI,
6106                                              OldParm->getStorageClass(),
6107                                              /* DefArg */ nullptr);
6108   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
6109                         OldParm->getFunctionScopeIndex() + indexAdjustment);
6110   transformedLocalDecl(OldParm, {newParm});
6111   return newParm;
6112 }
6113 
6114 template <typename Derived>
6115 bool TreeTransform<Derived>::TransformFunctionTypeParams(
6116     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
6117     const QualType *ParamTypes,
6118     const FunctionProtoType::ExtParameterInfo *ParamInfos,
6119     SmallVectorImpl<QualType> &OutParamTypes,
6120     SmallVectorImpl<ParmVarDecl *> *PVars,
6121     Sema::ExtParameterInfoBuilder &PInfos,
6122     unsigned *LastParamTransformed) {
6123   int indexAdjustment = 0;
6124 
6125   unsigned NumParams = Params.size();
6126   for (unsigned i = 0; i != NumParams; ++i) {
6127     if (LastParamTransformed)
6128       *LastParamTransformed = i;
6129     if (ParmVarDecl *OldParm = Params[i]) {
6130       assert(OldParm->getFunctionScopeIndex() == i);
6131 
6132       std::optional<unsigned> NumExpansions;
6133       ParmVarDecl *NewParm = nullptr;
6134       if (OldParm->isParameterPack()) {
6135         // We have a function parameter pack that may need to be expanded.
6136         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6137 
6138         // Find the parameter packs that could be expanded.
6139         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
6140         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
6141         TypeLoc Pattern = ExpansionTL.getPatternLoc();
6142         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
6143 
6144         // Determine whether we should expand the parameter packs.
6145         bool ShouldExpand = false;
6146         bool RetainExpansion = false;
6147         std::optional<unsigned> OrigNumExpansions;
6148         if (Unexpanded.size() > 0) {
6149           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
6150           NumExpansions = OrigNumExpansions;
6151           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
6152                                                    Pattern.getSourceRange(),
6153                                                    Unexpanded,
6154                                                    ShouldExpand,
6155                                                    RetainExpansion,
6156                                                    NumExpansions)) {
6157             return true;
6158           }
6159         } else {
6160 #ifndef NDEBUG
6161           const AutoType *AT =
6162               Pattern.getType().getTypePtr()->getContainedAutoType();
6163           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
6164                  "Could not find parameter packs or undeduced auto type!");
6165 #endif
6166         }
6167 
6168         if (ShouldExpand) {
6169           // Expand the function parameter pack into multiple, separate
6170           // parameters.
6171           getDerived().ExpandingFunctionParameterPack(OldParm);
6172           for (unsigned I = 0; I != *NumExpansions; ++I) {
6173             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6174             ParmVarDecl *NewParm
6175               = getDerived().TransformFunctionTypeParam(OldParm,
6176                                                         indexAdjustment++,
6177                                                         OrigNumExpansions,
6178                                                 /*ExpectParameterPack=*/false);
6179             if (!NewParm)
6180               return true;
6181 
6182             if (ParamInfos)
6183               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6184             OutParamTypes.push_back(NewParm->getType());
6185             if (PVars)
6186               PVars->push_back(NewParm);
6187           }
6188 
6189           // If we're supposed to retain a pack expansion, do so by temporarily
6190           // forgetting the partially-substituted parameter pack.
6191           if (RetainExpansion) {
6192             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6193             ParmVarDecl *NewParm
6194               = getDerived().TransformFunctionTypeParam(OldParm,
6195                                                         indexAdjustment++,
6196                                                         OrigNumExpansions,
6197                                                 /*ExpectParameterPack=*/false);
6198             if (!NewParm)
6199               return true;
6200 
6201             if (ParamInfos)
6202               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6203             OutParamTypes.push_back(NewParm->getType());
6204             if (PVars)
6205               PVars->push_back(NewParm);
6206           }
6207 
6208           // The next parameter should have the same adjustment as the
6209           // last thing we pushed, but we post-incremented indexAdjustment
6210           // on every push.  Also, if we push nothing, the adjustment should
6211           // go down by one.
6212           indexAdjustment--;
6213 
6214           // We're done with the pack expansion.
6215           continue;
6216         }
6217 
6218         // We'll substitute the parameter now without expanding the pack
6219         // expansion.
6220         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6221         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
6222                                                           indexAdjustment,
6223                                                           NumExpansions,
6224                                                   /*ExpectParameterPack=*/true);
6225         assert(NewParm->isParameterPack() &&
6226                "Parameter pack no longer a parameter pack after "
6227                "transformation.");
6228       } else {
6229         NewParm = getDerived().TransformFunctionTypeParam(
6230             OldParm, indexAdjustment, std::nullopt,
6231             /*ExpectParameterPack=*/false);
6232       }
6233 
6234       if (!NewParm)
6235         return true;
6236 
6237       if (ParamInfos)
6238         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6239       OutParamTypes.push_back(NewParm->getType());
6240       if (PVars)
6241         PVars->push_back(NewParm);
6242       continue;
6243     }
6244 
6245     // Deal with the possibility that we don't have a parameter
6246     // declaration for this parameter.
6247     assert(ParamTypes);
6248     QualType OldType = ParamTypes[i];
6249     bool IsPackExpansion = false;
6250     std::optional<unsigned> NumExpansions;
6251     QualType NewType;
6252     if (const PackExpansionType *Expansion
6253                                        = dyn_cast<PackExpansionType>(OldType)) {
6254       // We have a function parameter pack that may need to be expanded.
6255       QualType Pattern = Expansion->getPattern();
6256       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6257       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
6258 
6259       // Determine whether we should expand the parameter packs.
6260       bool ShouldExpand = false;
6261       bool RetainExpansion = false;
6262       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
6263                                                Unexpanded,
6264                                                ShouldExpand,
6265                                                RetainExpansion,
6266                                                NumExpansions)) {
6267         return true;
6268       }
6269 
6270       if (ShouldExpand) {
6271         // Expand the function parameter pack into multiple, separate
6272         // parameters.
6273         for (unsigned I = 0; I != *NumExpansions; ++I) {
6274           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6275           QualType NewType = getDerived().TransformType(Pattern);
6276           if (NewType.isNull())
6277             return true;
6278 
6279           if (NewType->containsUnexpandedParameterPack()) {
6280             NewType = getSema().getASTContext().getPackExpansionType(
6281                 NewType, std::nullopt);
6282 
6283             if (NewType.isNull())
6284               return true;
6285           }
6286 
6287           if (ParamInfos)
6288             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6289           OutParamTypes.push_back(NewType);
6290           if (PVars)
6291             PVars->push_back(nullptr);
6292         }
6293 
6294         // We're done with the pack expansion.
6295         continue;
6296       }
6297 
6298       // If we're supposed to retain a pack expansion, do so by temporarily
6299       // forgetting the partially-substituted parameter pack.
6300       if (RetainExpansion) {
6301         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6302         QualType NewType = getDerived().TransformType(Pattern);
6303         if (NewType.isNull())
6304           return true;
6305 
6306         if (ParamInfos)
6307           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6308         OutParamTypes.push_back(NewType);
6309         if (PVars)
6310           PVars->push_back(nullptr);
6311       }
6312 
6313       // We'll substitute the parameter now without expanding the pack
6314       // expansion.
6315       OldType = Expansion->getPattern();
6316       IsPackExpansion = true;
6317       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6318       NewType = getDerived().TransformType(OldType);
6319     } else {
6320       NewType = getDerived().TransformType(OldType);
6321     }
6322 
6323     if (NewType.isNull())
6324       return true;
6325 
6326     if (IsPackExpansion)
6327       NewType = getSema().Context.getPackExpansionType(NewType,
6328                                                        NumExpansions);
6329 
6330     if (ParamInfos)
6331       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6332     OutParamTypes.push_back(NewType);
6333     if (PVars)
6334       PVars->push_back(nullptr);
6335   }
6336 
6337 #ifndef NDEBUG
6338   if (PVars) {
6339     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
6340       if (ParmVarDecl *parm = (*PVars)[i])
6341         assert(parm->getFunctionScopeIndex() == i);
6342   }
6343 #endif
6344 
6345   return false;
6346 }
6347 
6348 template<typename Derived>
6349 QualType
6350 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
6351                                                    FunctionProtoTypeLoc TL) {
6352   SmallVector<QualType, 4> ExceptionStorage;
6353   return getDerived().TransformFunctionProtoType(
6354       TLB, TL, nullptr, Qualifiers(),
6355       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
6356         return getDerived().TransformExceptionSpec(TL.getBeginLoc(), ESI,
6357                                                    ExceptionStorage, Changed);
6358       });
6359 }
6360 
6361 template<typename Derived> template<typename Fn>
6362 QualType TreeTransform<Derived>::TransformFunctionProtoType(
6363     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
6364     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6365 
6366   // Transform the parameters and return type.
6367   //
6368   // We are required to instantiate the params and return type in source order.
6369   // When the function has a trailing return type, we instantiate the
6370   // parameters before the return type,  since the return type can then refer
6371   // to the parameters themselves (via decltype, sizeof, etc.).
6372   //
6373   SmallVector<QualType, 4> ParamTypes;
6374   SmallVector<ParmVarDecl*, 4> ParamDecls;
6375   Sema::ExtParameterInfoBuilder ExtParamInfos;
6376   const FunctionProtoType *T = TL.getTypePtr();
6377 
6378   QualType ResultType;
6379 
6380   if (T->hasTrailingReturn()) {
6381     if (getDerived().TransformFunctionTypeParams(
6382             TL.getBeginLoc(), TL.getParams(),
6383             TL.getTypePtr()->param_type_begin(),
6384             T->getExtParameterInfosOrNull(),
6385             ParamTypes, &ParamDecls, ExtParamInfos))
6386       return QualType();
6387 
6388     {
6389       // C++11 [expr.prim.general]p3:
6390       //   If a declaration declares a member function or member function
6391       //   template of a class X, the expression this is a prvalue of type
6392       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6393       //   and the end of the function-definition, member-declarator, or
6394       //   declarator.
6395       auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.getCurLexicalContext());
6396       Sema::CXXThisScopeRAII ThisScope(
6397           SemaRef, !ThisContext && RD ? RD : ThisContext, ThisTypeQuals);
6398 
6399       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6400       if (ResultType.isNull())
6401         return QualType();
6402     }
6403   }
6404   else {
6405     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6406     if (ResultType.isNull())
6407       return QualType();
6408 
6409     if (getDerived().TransformFunctionTypeParams(
6410             TL.getBeginLoc(), TL.getParams(),
6411             TL.getTypePtr()->param_type_begin(),
6412             T->getExtParameterInfosOrNull(),
6413             ParamTypes, &ParamDecls, ExtParamInfos))
6414       return QualType();
6415   }
6416 
6417   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
6418 
6419   bool EPIChanged = false;
6420   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
6421     return QualType();
6422 
6423   // Handle extended parameter information.
6424   if (auto NewExtParamInfos =
6425         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
6426     if (!EPI.ExtParameterInfos ||
6427         llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) !=
6428             llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) {
6429       EPIChanged = true;
6430     }
6431     EPI.ExtParameterInfos = NewExtParamInfos;
6432   } else if (EPI.ExtParameterInfos) {
6433     EPIChanged = true;
6434     EPI.ExtParameterInfos = nullptr;
6435   }
6436 
6437   // Transform any function effects with unevaluated conditions.
6438   // Hold this set in a local for the rest of this function, since EPI
6439   // may need to hold a FunctionEffectsRef pointing into it.
6440   std::optional<FunctionEffectSet> NewFX;
6441   if (ArrayRef FXConds = EPI.FunctionEffects.conditions(); !FXConds.empty()) {
6442     NewFX.emplace();
6443     EnterExpressionEvaluationContext Unevaluated(
6444         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6445 
6446     for (const FunctionEffectWithCondition &PrevEC : EPI.FunctionEffects) {
6447       FunctionEffectWithCondition NewEC = PrevEC;
6448       if (Expr *CondExpr = PrevEC.Cond.getCondition()) {
6449         ExprResult NewExpr = getDerived().TransformExpr(CondExpr);
6450         if (NewExpr.isInvalid())
6451           return QualType();
6452         std::optional<FunctionEffectMode> Mode =
6453             SemaRef.ActOnEffectExpression(NewExpr.get(), PrevEC.Effect.name());
6454         if (!Mode)
6455           return QualType();
6456 
6457         // The condition expression has been transformed, and re-evaluated.
6458         // It may or may not have become constant.
6459         switch (*Mode) {
6460         case FunctionEffectMode::True:
6461           NewEC.Cond = {};
6462           break;
6463         case FunctionEffectMode::False:
6464           NewEC.Effect = FunctionEffect(PrevEC.Effect.oppositeKind());
6465           NewEC.Cond = {};
6466           break;
6467         case FunctionEffectMode::Dependent:
6468           NewEC.Cond = EffectConditionExpr(NewExpr.get());
6469           break;
6470         case FunctionEffectMode::None:
6471           llvm_unreachable(
6472               "FunctionEffectMode::None shouldn't be possible here");
6473         }
6474       }
6475       if (!SemaRef.diagnoseConflictingFunctionEffect(*NewFX, NewEC,
6476                                                      TL.getBeginLoc())) {
6477         FunctionEffectSet::Conflicts Errs;
6478         NewFX->insert(NewEC, Errs);
6479         assert(Errs.empty());
6480       }
6481     }
6482     EPI.FunctionEffects = *NewFX;
6483     EPIChanged = true;
6484   }
6485 
6486   QualType Result = TL.getType();
6487   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
6488       T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) {
6489     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6490     if (Result.isNull())
6491       return QualType();
6492   }
6493 
6494   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
6495   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6496   NewTL.setLParenLoc(TL.getLParenLoc());
6497   NewTL.setRParenLoc(TL.getRParenLoc());
6498   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
6499   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6500   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
6501     NewTL.setParam(i, ParamDecls[i]);
6502 
6503   return Result;
6504 }
6505 
6506 template<typename Derived>
6507 bool TreeTransform<Derived>::TransformExceptionSpec(
6508     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
6509     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
6510   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
6511 
6512   // Instantiate a dynamic noexcept expression, if any.
6513   if (isComputedNoexcept(ESI.Type)) {
6514     // Update this scrope because ContextDecl in Sema will be used in
6515     // TransformExpr.
6516     auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.SourceTemplate);
6517     Sema::CXXThisScopeRAII ThisScope(
6518         SemaRef, Method ? Method->getParent() : nullptr,
6519         Method ? Method->getMethodQualifiers() : Qualifiers{},
6520         Method != nullptr);
6521     EnterExpressionEvaluationContext Unevaluated(
6522         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6523     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
6524     if (NoexceptExpr.isInvalid())
6525       return true;
6526 
6527     ExceptionSpecificationType EST = ESI.Type;
6528     NoexceptExpr =
6529         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
6530     if (NoexceptExpr.isInvalid())
6531       return true;
6532 
6533     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6534       Changed = true;
6535     ESI.NoexceptExpr = NoexceptExpr.get();
6536     ESI.Type = EST;
6537   }
6538 
6539   if (ESI.Type != EST_Dynamic)
6540     return false;
6541 
6542   // Instantiate a dynamic exception specification's type.
6543   for (QualType T : ESI.Exceptions) {
6544     if (const PackExpansionType *PackExpansion =
6545             T->getAs<PackExpansionType>()) {
6546       Changed = true;
6547 
6548       // We have a pack expansion. Instantiate it.
6549       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6550       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6551                                               Unexpanded);
6552       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6553 
6554       // Determine whether the set of unexpanded parameter packs can and
6555       // should
6556       // be expanded.
6557       bool Expand = false;
6558       bool RetainExpansion = false;
6559       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6560       // FIXME: Track the location of the ellipsis (and track source location
6561       // information for the types in the exception specification in general).
6562       if (getDerived().TryExpandParameterPacks(
6563               Loc, SourceRange(), Unexpanded, Expand,
6564               RetainExpansion, NumExpansions))
6565         return true;
6566 
6567       if (!Expand) {
6568         // We can't expand this pack expansion into separate arguments yet;
6569         // just substitute into the pattern and create a new pack expansion
6570         // type.
6571         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6572         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6573         if (U.isNull())
6574           return true;
6575 
6576         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6577         Exceptions.push_back(U);
6578         continue;
6579       }
6580 
6581       // Substitute into the pack expansion pattern for each slice of the
6582       // pack.
6583       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6584         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6585 
6586         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6587         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6588           return true;
6589 
6590         Exceptions.push_back(U);
6591       }
6592     } else {
6593       QualType U = getDerived().TransformType(T);
6594       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6595         return true;
6596       if (T != U)
6597         Changed = true;
6598 
6599       Exceptions.push_back(U);
6600     }
6601   }
6602 
6603   ESI.Exceptions = Exceptions;
6604   if (ESI.Exceptions.empty())
6605     ESI.Type = EST_DynamicNone;
6606   return false;
6607 }
6608 
6609 template<typename Derived>
6610 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6611                                                  TypeLocBuilder &TLB,
6612                                                  FunctionNoProtoTypeLoc TL) {
6613   const FunctionNoProtoType *T = TL.getTypePtr();
6614   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6615   if (ResultType.isNull())
6616     return QualType();
6617 
6618   QualType Result = TL.getType();
6619   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6620     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6621 
6622   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6623   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6624   NewTL.setLParenLoc(TL.getLParenLoc());
6625   NewTL.setRParenLoc(TL.getRParenLoc());
6626   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6627 
6628   return Result;
6629 }
6630 
6631 template <typename Derived>
6632 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6633     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6634   const UnresolvedUsingType *T = TL.getTypePtr();
6635   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6636   if (!D)
6637     return QualType();
6638 
6639   QualType Result = TL.getType();
6640   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6641     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6642     if (Result.isNull())
6643       return QualType();
6644   }
6645 
6646   // We might get an arbitrary type spec type back.  We should at
6647   // least always get a type spec type, though.
6648   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6649   NewTL.setNameLoc(TL.getNameLoc());
6650 
6651   return Result;
6652 }
6653 
6654 template <typename Derived>
6655 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6656                                                     UsingTypeLoc TL) {
6657   const UsingType *T = TL.getTypePtr();
6658 
6659   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6660       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6661   if (!Found)
6662     return QualType();
6663 
6664   QualType Underlying = getDerived().TransformType(T->desugar());
6665   if (Underlying.isNull())
6666     return QualType();
6667 
6668   QualType Result = TL.getType();
6669   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6670       Underlying != T->getUnderlyingType()) {
6671     Result = getDerived().RebuildUsingType(Found, Underlying);
6672     if (Result.isNull())
6673       return QualType();
6674   }
6675 
6676   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6677   return Result;
6678 }
6679 
6680 template<typename Derived>
6681 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6682                                                       TypedefTypeLoc TL) {
6683   const TypedefType *T = TL.getTypePtr();
6684   TypedefNameDecl *Typedef
6685     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6686                                                                T->getDecl()));
6687   if (!Typedef)
6688     return QualType();
6689 
6690   QualType Result = TL.getType();
6691   if (getDerived().AlwaysRebuild() ||
6692       Typedef != T->getDecl()) {
6693     Result = getDerived().RebuildTypedefType(Typedef);
6694     if (Result.isNull())
6695       return QualType();
6696   }
6697 
6698   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6699   NewTL.setNameLoc(TL.getNameLoc());
6700 
6701   return Result;
6702 }
6703 
6704 template<typename Derived>
6705 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6706                                                       TypeOfExprTypeLoc TL) {
6707   // typeof expressions are not potentially evaluated contexts
6708   EnterExpressionEvaluationContext Unevaluated(
6709       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6710       Sema::ReuseLambdaContextDecl);
6711 
6712   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6713   if (E.isInvalid())
6714     return QualType();
6715 
6716   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6717   if (E.isInvalid())
6718     return QualType();
6719 
6720   QualType Result = TL.getType();
6721   TypeOfKind Kind = Result->castAs<TypeOfExprType>()->getKind();
6722   if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) {
6723     Result =
6724         getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind);
6725     if (Result.isNull())
6726       return QualType();
6727   }
6728 
6729   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6730   NewTL.setTypeofLoc(TL.getTypeofLoc());
6731   NewTL.setLParenLoc(TL.getLParenLoc());
6732   NewTL.setRParenLoc(TL.getRParenLoc());
6733 
6734   return Result;
6735 }
6736 
6737 template<typename Derived>
6738 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6739                                                      TypeOfTypeLoc TL) {
6740   TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6741   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6742   if (!New_Under_TI)
6743     return QualType();
6744 
6745   QualType Result = TL.getType();
6746   TypeOfKind Kind = Result->castAs<TypeOfType>()->getKind();
6747   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6748     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6749     if (Result.isNull())
6750       return QualType();
6751   }
6752 
6753   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6754   NewTL.setTypeofLoc(TL.getTypeofLoc());
6755   NewTL.setLParenLoc(TL.getLParenLoc());
6756   NewTL.setRParenLoc(TL.getRParenLoc());
6757   NewTL.setUnmodifiedTInfo(New_Under_TI);
6758 
6759   return Result;
6760 }
6761 
6762 template<typename Derived>
6763 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6764                                                        DecltypeTypeLoc TL) {
6765   const DecltypeType *T = TL.getTypePtr();
6766 
6767   // decltype expressions are not potentially evaluated contexts
6768   EnterExpressionEvaluationContext Unevaluated(
6769       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6770       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6771 
6772   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6773   if (E.isInvalid())
6774     return QualType();
6775 
6776   E = getSema().ActOnDecltypeExpression(E.get());
6777   if (E.isInvalid())
6778     return QualType();
6779 
6780   QualType Result = TL.getType();
6781   if (getDerived().AlwaysRebuild() ||
6782       E.get() != T->getUnderlyingExpr()) {
6783     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6784     if (Result.isNull())
6785       return QualType();
6786   }
6787   else E.get();
6788 
6789   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6790   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6791   NewTL.setRParenLoc(TL.getRParenLoc());
6792   return Result;
6793 }
6794 
6795 template <typename Derived>
6796 QualType
6797 TreeTransform<Derived>::TransformPackIndexingType(TypeLocBuilder &TLB,
6798                                                   PackIndexingTypeLoc TL) {
6799   // Transform the index
6800   ExprResult IndexExpr;
6801   {
6802     EnterExpressionEvaluationContext ConstantContext(
6803         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6804 
6805     IndexExpr = getDerived().TransformExpr(TL.getIndexExpr());
6806     if (IndexExpr.isInvalid())
6807       return QualType();
6808   }
6809   QualType Pattern = TL.getPattern();
6810 
6811   const PackIndexingType *PIT = TL.getTypePtr();
6812   SmallVector<QualType, 5> SubtitutedTypes;
6813   llvm::ArrayRef<QualType> Types = PIT->getExpansions();
6814 
6815   bool NotYetExpanded = Types.empty();
6816   bool FullySubstituted = true;
6817 
6818   if (Types.empty() && !PIT->expandsToEmptyPack())
6819     Types = llvm::ArrayRef<QualType>(&Pattern, 1);
6820 
6821   for (QualType T : Types) {
6822     if (!T->containsUnexpandedParameterPack()) {
6823       QualType Transformed = getDerived().TransformType(T);
6824       if (Transformed.isNull())
6825         return QualType();
6826       SubtitutedTypes.push_back(Transformed);
6827       continue;
6828     }
6829 
6830     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6831     getSema().collectUnexpandedParameterPacks(T, Unexpanded);
6832     assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6833     // Determine whether the set of unexpanded parameter packs can and should
6834     // be expanded.
6835     bool ShouldExpand = true;
6836     bool RetainExpansion = false;
6837     std::optional<unsigned> OrigNumExpansions;
6838     std::optional<unsigned> NumExpansions = OrigNumExpansions;
6839     if (getDerived().TryExpandParameterPacks(TL.getEllipsisLoc(), SourceRange(),
6840                                              Unexpanded, ShouldExpand,
6841                                              RetainExpansion, NumExpansions))
6842       return QualType();
6843     if (!ShouldExpand) {
6844       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6845       // FIXME: should we keep TypeLoc for individual expansions in
6846       // PackIndexingTypeLoc?
6847       TypeSourceInfo *TI =
6848           SemaRef.getASTContext().getTrivialTypeSourceInfo(T, TL.getBeginLoc());
6849       QualType Pack = getDerived().TransformType(TLB, TI->getTypeLoc());
6850       if (Pack.isNull())
6851         return QualType();
6852       if (NotYetExpanded) {
6853         FullySubstituted = false;
6854         QualType Out = getDerived().RebuildPackIndexingType(
6855             Pack, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6856             FullySubstituted);
6857         if (Out.isNull())
6858           return QualType();
6859 
6860         PackIndexingTypeLoc Loc = TLB.push<PackIndexingTypeLoc>(Out);
6861         Loc.setEllipsisLoc(TL.getEllipsisLoc());
6862         return Out;
6863       }
6864       SubtitutedTypes.push_back(Pack);
6865       continue;
6866     }
6867     for (unsigned I = 0; I != *NumExpansions; ++I) {
6868       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6869       QualType Out = getDerived().TransformType(T);
6870       if (Out.isNull())
6871         return QualType();
6872       SubtitutedTypes.push_back(Out);
6873       FullySubstituted &= !Out->containsUnexpandedParameterPack();
6874     }
6875     // If we're supposed to retain a pack expansion, do so by temporarily
6876     // forgetting the partially-substituted parameter pack.
6877     if (RetainExpansion) {
6878       FullySubstituted = false;
6879       ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6880       QualType Out = getDerived().TransformType(T);
6881       if (Out.isNull())
6882         return QualType();
6883       SubtitutedTypes.push_back(Out);
6884     }
6885   }
6886 
6887   // A pack indexing type can appear in a larger pack expansion,
6888   // e.g. `Pack...[pack_of_indexes]...`
6889   // so we need to temporarily disable substitution of pack elements
6890   Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6891   QualType Result = getDerived().TransformType(TLB, TL.getPatternLoc());
6892 
6893   QualType Out = getDerived().RebuildPackIndexingType(
6894       Result, IndexExpr.get(), SourceLocation(), TL.getEllipsisLoc(),
6895       FullySubstituted, SubtitutedTypes);
6896   if (Out.isNull())
6897     return Out;
6898 
6899   PackIndexingTypeLoc Loc = TLB.push<PackIndexingTypeLoc>(Out);
6900   Loc.setEllipsisLoc(TL.getEllipsisLoc());
6901   return Out;
6902 }
6903 
6904 template<typename Derived>
6905 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6906                                                             TypeLocBuilder &TLB,
6907                                                      UnaryTransformTypeLoc TL) {
6908   QualType Result = TL.getType();
6909   if (Result->isDependentType()) {
6910     const UnaryTransformType *T = TL.getTypePtr();
6911 
6912     TypeSourceInfo *NewBaseTSI =
6913         getDerived().TransformType(TL.getUnderlyingTInfo());
6914     if (!NewBaseTSI)
6915       return QualType();
6916     QualType NewBase = NewBaseTSI->getType();
6917 
6918     Result = getDerived().RebuildUnaryTransformType(NewBase,
6919                                                     T->getUTTKind(),
6920                                                     TL.getKWLoc());
6921     if (Result.isNull())
6922       return QualType();
6923   }
6924 
6925   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6926   NewTL.setKWLoc(TL.getKWLoc());
6927   NewTL.setParensRange(TL.getParensRange());
6928   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6929   return Result;
6930 }
6931 
6932 template<typename Derived>
6933 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6934     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6935   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6936 
6937   CXXScopeSpec SS;
6938   TemplateName TemplateName = getDerived().TransformTemplateName(
6939       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6940   if (TemplateName.isNull())
6941     return QualType();
6942 
6943   QualType OldDeduced = T->getDeducedType();
6944   QualType NewDeduced;
6945   if (!OldDeduced.isNull()) {
6946     NewDeduced = getDerived().TransformType(OldDeduced);
6947     if (NewDeduced.isNull())
6948       return QualType();
6949   }
6950 
6951   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6952       TemplateName, NewDeduced);
6953   if (Result.isNull())
6954     return QualType();
6955 
6956   DeducedTemplateSpecializationTypeLoc NewTL =
6957       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6958   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6959 
6960   return Result;
6961 }
6962 
6963 template<typename Derived>
6964 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6965                                                      RecordTypeLoc TL) {
6966   const RecordType *T = TL.getTypePtr();
6967   RecordDecl *Record
6968     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6969                                                           T->getDecl()));
6970   if (!Record)
6971     return QualType();
6972 
6973   QualType Result = TL.getType();
6974   if (getDerived().AlwaysRebuild() ||
6975       Record != T->getDecl()) {
6976     Result = getDerived().RebuildRecordType(Record);
6977     if (Result.isNull())
6978       return QualType();
6979   }
6980 
6981   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6982   NewTL.setNameLoc(TL.getNameLoc());
6983 
6984   return Result;
6985 }
6986 
6987 template<typename Derived>
6988 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6989                                                    EnumTypeLoc TL) {
6990   const EnumType *T = TL.getTypePtr();
6991   EnumDecl *Enum
6992     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6993                                                         T->getDecl()));
6994   if (!Enum)
6995     return QualType();
6996 
6997   QualType Result = TL.getType();
6998   if (getDerived().AlwaysRebuild() ||
6999       Enum != T->getDecl()) {
7000     Result = getDerived().RebuildEnumType(Enum);
7001     if (Result.isNull())
7002       return QualType();
7003   }
7004 
7005   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
7006   NewTL.setNameLoc(TL.getNameLoc());
7007 
7008   return Result;
7009 }
7010 
7011 template<typename Derived>
7012 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
7013                                          TypeLocBuilder &TLB,
7014                                          InjectedClassNameTypeLoc TL) {
7015   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
7016                                        TL.getTypePtr()->getDecl());
7017   if (!D) return QualType();
7018 
7019   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
7020   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
7021   return T;
7022 }
7023 
7024 template<typename Derived>
7025 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
7026                                                 TypeLocBuilder &TLB,
7027                                                 TemplateTypeParmTypeLoc TL) {
7028   return getDerived().TransformTemplateTypeParmType(
7029       TLB, TL,
7030       /*SuppressObjCLifetime=*/false);
7031 }
7032 
7033 template <typename Derived>
7034 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
7035     TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) {
7036   return TransformTypeSpecType(TLB, TL);
7037 }
7038 
7039 template<typename Derived>
7040 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
7041                                          TypeLocBuilder &TLB,
7042                                          SubstTemplateTypeParmTypeLoc TL) {
7043   const SubstTemplateTypeParmType *T = TL.getTypePtr();
7044 
7045   Decl *NewReplaced =
7046       getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
7047 
7048   // Substitute into the replacement type, which itself might involve something
7049   // that needs to be transformed. This only tends to occur with default
7050   // template arguments of template template parameters.
7051   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
7052   QualType Replacement = getDerived().TransformType(T->getReplacementType());
7053   if (Replacement.isNull())
7054     return QualType();
7055 
7056   QualType Result = SemaRef.Context.getSubstTemplateTypeParmType(
7057       Replacement, NewReplaced, T->getIndex(), T->getPackIndex());
7058 
7059   // Propagate type-source information.
7060   SubstTemplateTypeParmTypeLoc NewTL
7061     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
7062   NewTL.setNameLoc(TL.getNameLoc());
7063   return Result;
7064 
7065 }
7066 
7067 template<typename Derived>
7068 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
7069                                           TypeLocBuilder &TLB,
7070                                           SubstTemplateTypeParmPackTypeLoc TL) {
7071   return getDerived().TransformSubstTemplateTypeParmPackType(
7072       TLB, TL, /*SuppressObjCLifetime=*/false);
7073 }
7074 
7075 template <typename Derived>
7076 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
7077     TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) {
7078   return TransformTypeSpecType(TLB, TL);
7079 }
7080 
7081 template<typename Derived>
7082 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
7083                                                         TypeLocBuilder &TLB,
7084                                            TemplateSpecializationTypeLoc TL) {
7085   const TemplateSpecializationType *T = TL.getTypePtr();
7086 
7087   // The nested-name-specifier never matters in a TemplateSpecializationType,
7088   // because we can't have a dependent nested-name-specifier anyway.
7089   CXXScopeSpec SS;
7090   TemplateName Template
7091     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
7092                                          TL.getTemplateNameLoc());
7093   if (Template.isNull())
7094     return QualType();
7095 
7096   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
7097 }
7098 
7099 template<typename Derived>
7100 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
7101                                                      AtomicTypeLoc TL) {
7102   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
7103   if (ValueType.isNull())
7104     return QualType();
7105 
7106   QualType Result = TL.getType();
7107   if (getDerived().AlwaysRebuild() ||
7108       ValueType != TL.getValueLoc().getType()) {
7109     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
7110     if (Result.isNull())
7111       return QualType();
7112   }
7113 
7114   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
7115   NewTL.setKWLoc(TL.getKWLoc());
7116   NewTL.setLParenLoc(TL.getLParenLoc());
7117   NewTL.setRParenLoc(TL.getRParenLoc());
7118 
7119   return Result;
7120 }
7121 
7122 template <typename Derived>
7123 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
7124                                                    PipeTypeLoc TL) {
7125   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
7126   if (ValueType.isNull())
7127     return QualType();
7128 
7129   QualType Result = TL.getType();
7130   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
7131     const PipeType *PT = Result->castAs<PipeType>();
7132     bool isReadPipe = PT->isReadOnly();
7133     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
7134     if (Result.isNull())
7135       return QualType();
7136   }
7137 
7138   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
7139   NewTL.setKWLoc(TL.getKWLoc());
7140 
7141   return Result;
7142 }
7143 
7144 template <typename Derived>
7145 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
7146                                                      BitIntTypeLoc TL) {
7147   const BitIntType *EIT = TL.getTypePtr();
7148   QualType Result = TL.getType();
7149 
7150   if (getDerived().AlwaysRebuild()) {
7151     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
7152                                             EIT->getNumBits(), TL.getNameLoc());
7153     if (Result.isNull())
7154       return QualType();
7155   }
7156 
7157   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
7158   NewTL.setNameLoc(TL.getNameLoc());
7159   return Result;
7160 }
7161 
7162 template <typename Derived>
7163 QualType TreeTransform<Derived>::TransformDependentBitIntType(
7164     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
7165   const DependentBitIntType *EIT = TL.getTypePtr();
7166 
7167   EnterExpressionEvaluationContext Unevaluated(
7168       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7169   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
7170   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
7171 
7172   if (BitsExpr.isInvalid())
7173     return QualType();
7174 
7175   QualType Result = TL.getType();
7176 
7177   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
7178     Result = getDerived().RebuildDependentBitIntType(
7179         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
7180 
7181     if (Result.isNull())
7182       return QualType();
7183   }
7184 
7185   if (isa<DependentBitIntType>(Result)) {
7186     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
7187     NewTL.setNameLoc(TL.getNameLoc());
7188   } else {
7189     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
7190     NewTL.setNameLoc(TL.getNameLoc());
7191   }
7192   return Result;
7193 }
7194 
7195   /// Simple iterator that traverses the template arguments in a
7196   /// container that provides a \c getArgLoc() member function.
7197   ///
7198   /// This iterator is intended to be used with the iterator form of
7199   /// \c TreeTransform<Derived>::TransformTemplateArguments().
7200   template<typename ArgLocContainer>
7201   class TemplateArgumentLocContainerIterator {
7202     ArgLocContainer *Container;
7203     unsigned Index;
7204 
7205   public:
7206     typedef TemplateArgumentLoc value_type;
7207     typedef TemplateArgumentLoc reference;
7208     typedef int difference_type;
7209     typedef std::input_iterator_tag iterator_category;
7210 
7211     class pointer {
7212       TemplateArgumentLoc Arg;
7213 
7214     public:
7215       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
7216 
7217       const TemplateArgumentLoc *operator->() const {
7218         return &Arg;
7219       }
7220     };
7221 
7222 
7223     TemplateArgumentLocContainerIterator() {}
7224 
7225     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
7226                                  unsigned Index)
7227       : Container(&Container), Index(Index) { }
7228 
7229     TemplateArgumentLocContainerIterator &operator++() {
7230       ++Index;
7231       return *this;
7232     }
7233 
7234     TemplateArgumentLocContainerIterator operator++(int) {
7235       TemplateArgumentLocContainerIterator Old(*this);
7236       ++(*this);
7237       return Old;
7238     }
7239 
7240     TemplateArgumentLoc operator*() const {
7241       return Container->getArgLoc(Index);
7242     }
7243 
7244     pointer operator->() const {
7245       return pointer(Container->getArgLoc(Index));
7246     }
7247 
7248     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
7249                            const TemplateArgumentLocContainerIterator &Y) {
7250       return X.Container == Y.Container && X.Index == Y.Index;
7251     }
7252 
7253     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
7254                            const TemplateArgumentLocContainerIterator &Y) {
7255       return !(X == Y);
7256     }
7257   };
7258 
7259 template<typename Derived>
7260 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
7261                                                    AutoTypeLoc TL) {
7262   const AutoType *T = TL.getTypePtr();
7263   QualType OldDeduced = T->getDeducedType();
7264   QualType NewDeduced;
7265   if (!OldDeduced.isNull()) {
7266     NewDeduced = getDerived().TransformType(OldDeduced);
7267     if (NewDeduced.isNull())
7268       return QualType();
7269   }
7270 
7271   ConceptDecl *NewCD = nullptr;
7272   TemplateArgumentListInfo NewTemplateArgs;
7273   NestedNameSpecifierLoc NewNestedNameSpec;
7274   if (T->isConstrained()) {
7275     assert(TL.getConceptReference());
7276     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
7277         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
7278 
7279     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7280     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7281     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
7282     if (getDerived().TransformTemplateArguments(
7283             ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()),
7284             NewTemplateArgs))
7285       return QualType();
7286 
7287     if (TL.getNestedNameSpecifierLoc()) {
7288       NewNestedNameSpec
7289         = getDerived().TransformNestedNameSpecifierLoc(
7290             TL.getNestedNameSpecifierLoc());
7291       if (!NewNestedNameSpec)
7292         return QualType();
7293     }
7294   }
7295 
7296   QualType Result = TL.getType();
7297   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
7298       T->isDependentType() || T->isConstrained()) {
7299     // FIXME: Maybe don't rebuild if all template arguments are the same.
7300     llvm::SmallVector<TemplateArgument, 4> NewArgList;
7301     NewArgList.reserve(NewTemplateArgs.size());
7302     for (const auto &ArgLoc : NewTemplateArgs.arguments())
7303       NewArgList.push_back(ArgLoc.getArgument());
7304     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
7305                                           NewArgList);
7306     if (Result.isNull())
7307       return QualType();
7308   }
7309 
7310   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
7311   NewTL.setNameLoc(TL.getNameLoc());
7312   NewTL.setRParenLoc(TL.getRParenLoc());
7313   NewTL.setConceptReference(nullptr);
7314 
7315   if (T->isConstrained()) {
7316     DeclarationNameInfo DNI = DeclarationNameInfo(
7317         TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(),
7318         TL.getConceptNameLoc(),
7319         TL.getTypePtr()->getTypeConstraintConcept()->getDeclName());
7320     auto *CR = ConceptReference::Create(
7321         SemaRef.Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI,
7322         TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(),
7323         ASTTemplateArgumentListInfo::Create(SemaRef.Context, NewTemplateArgs));
7324     NewTL.setConceptReference(CR);
7325   }
7326 
7327   return Result;
7328 }
7329 
7330 template <typename Derived>
7331 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
7332                                                         TypeLocBuilder &TLB,
7333                                            TemplateSpecializationTypeLoc TL,
7334                                                       TemplateName Template) {
7335   TemplateArgumentListInfo NewTemplateArgs;
7336   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7337   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7338   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
7339     ArgIterator;
7340   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7341                                               ArgIterator(TL, TL.getNumArgs()),
7342                                               NewTemplateArgs))
7343     return QualType();
7344 
7345   // This needs to be rebuilt if either the arguments changed, or if the
7346   // original template changed. If the template changed, and even if the
7347   // arguments didn't change, these arguments might not correspond to their
7348   // respective parameters, therefore needing conversions.
7349   QualType Result =
7350     getDerived().RebuildTemplateSpecializationType(Template,
7351                                                    TL.getTemplateNameLoc(),
7352                                                    NewTemplateArgs);
7353 
7354   if (!Result.isNull()) {
7355     // Specializations of template template parameters are represented as
7356     // TemplateSpecializationTypes, and substitution of type alias templates
7357     // within a dependent context can transform them into
7358     // DependentTemplateSpecializationTypes.
7359     if (isa<DependentTemplateSpecializationType>(Result)) {
7360       DependentTemplateSpecializationTypeLoc NewTL
7361         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7362       NewTL.setElaboratedKeywordLoc(SourceLocation());
7363       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
7364       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7365       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7366       NewTL.setLAngleLoc(TL.getLAngleLoc());
7367       NewTL.setRAngleLoc(TL.getRAngleLoc());
7368       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7369         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7370       return Result;
7371     }
7372 
7373     TemplateSpecializationTypeLoc NewTL
7374       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7375     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7376     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7377     NewTL.setLAngleLoc(TL.getLAngleLoc());
7378     NewTL.setRAngleLoc(TL.getRAngleLoc());
7379     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7380       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7381   }
7382 
7383   return Result;
7384 }
7385 
7386 template <typename Derived>
7387 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
7388                                      TypeLocBuilder &TLB,
7389                                      DependentTemplateSpecializationTypeLoc TL,
7390                                      TemplateName Template,
7391                                      CXXScopeSpec &SS) {
7392   TemplateArgumentListInfo NewTemplateArgs;
7393   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7394   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7395   typedef TemplateArgumentLocContainerIterator<
7396             DependentTemplateSpecializationTypeLoc> ArgIterator;
7397   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7398                                               ArgIterator(TL, TL.getNumArgs()),
7399                                               NewTemplateArgs))
7400     return QualType();
7401 
7402   // FIXME: maybe don't rebuild if all the template arguments are the same.
7403 
7404   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
7405     QualType Result = getSema().Context.getDependentTemplateSpecializationType(
7406         TL.getTypePtr()->getKeyword(), DTN->getQualifier(),
7407         DTN->getIdentifier(), NewTemplateArgs.arguments());
7408 
7409     DependentTemplateSpecializationTypeLoc NewTL
7410       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7411     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7412     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
7413     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7414     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7415     NewTL.setLAngleLoc(TL.getLAngleLoc());
7416     NewTL.setRAngleLoc(TL.getRAngleLoc());
7417     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7418       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7419     return Result;
7420   }
7421 
7422   QualType Result
7423     = getDerived().RebuildTemplateSpecializationType(Template,
7424                                                      TL.getTemplateNameLoc(),
7425                                                      NewTemplateArgs);
7426 
7427   if (!Result.isNull()) {
7428     /// FIXME: Wrap this in an elaborated-type-specifier?
7429     TemplateSpecializationTypeLoc NewTL
7430       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7431     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7432     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7433     NewTL.setLAngleLoc(TL.getLAngleLoc());
7434     NewTL.setRAngleLoc(TL.getRAngleLoc());
7435     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7436       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7437   }
7438 
7439   return Result;
7440 }
7441 
7442 template<typename Derived>
7443 QualType
7444 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
7445                                                 ElaboratedTypeLoc TL) {
7446   const ElaboratedType *T = TL.getTypePtr();
7447 
7448   NestedNameSpecifierLoc QualifierLoc;
7449   // NOTE: the qualifier in an ElaboratedType is optional.
7450   if (TL.getQualifierLoc()) {
7451     QualifierLoc
7452       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7453     if (!QualifierLoc)
7454       return QualType();
7455   }
7456 
7457   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
7458   if (NamedT.isNull())
7459     return QualType();
7460 
7461   // C++0x [dcl.type.elab]p2:
7462   //   If the identifier resolves to a typedef-name or the simple-template-id
7463   //   resolves to an alias template specialization, the
7464   //   elaborated-type-specifier is ill-formed.
7465   if (T->getKeyword() != ElaboratedTypeKeyword::None &&
7466       T->getKeyword() != ElaboratedTypeKeyword::Typename) {
7467     if (const TemplateSpecializationType *TST =
7468           NamedT->getAs<TemplateSpecializationType>()) {
7469       TemplateName Template = TST->getTemplateName();
7470       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
7471               Template.getAsTemplateDecl())) {
7472         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
7473                      diag::err_tag_reference_non_tag)
7474             << TAT << Sema::NTK_TypeAliasTemplate
7475             << llvm::to_underlying(
7476                    ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()));
7477         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
7478       }
7479     }
7480   }
7481 
7482   QualType Result = TL.getType();
7483   if (getDerived().AlwaysRebuild() ||
7484       QualifierLoc != TL.getQualifierLoc() ||
7485       NamedT != T->getNamedType()) {
7486     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
7487                                                 T->getKeyword(),
7488                                                 QualifierLoc, NamedT);
7489     if (Result.isNull())
7490       return QualType();
7491   }
7492 
7493   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7494   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7495   NewTL.setQualifierLoc(QualifierLoc);
7496   return Result;
7497 }
7498 
7499 template <typename Derived>
7500 QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB,
7501                                                          AttributedTypeLoc TL) {
7502   const AttributedType *oldType = TL.getTypePtr();
7503   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
7504   if (modifiedType.isNull())
7505     return QualType();
7506 
7507   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
7508   const Attr *oldAttr = TL.getAttr();
7509   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
7510   if (oldAttr && !newAttr)
7511     return QualType();
7512 
7513   QualType result = TL.getType();
7514 
7515   // FIXME: dependent operand expressions?
7516   if (getDerived().AlwaysRebuild() ||
7517       modifiedType != oldType->getModifiedType()) {
7518     // If the equivalent type is equal to the modified type, we don't want to
7519     // transform it as well because:
7520     //
7521     //   1. The transformation would yield the same result and is therefore
7522     //      superfluous, and
7523     //
7524     //   2. Transforming the same type twice can cause problems, e.g. if it
7525     //      is a FunctionProtoType, we may end up instantiating the function
7526     //      parameters twice, which causes an assertion since the parameters
7527     //      are already bound to their counterparts in the template for this
7528     //      instantiation.
7529     //
7530     QualType equivalentType = modifiedType;
7531     if (TL.getModifiedLoc().getType() != TL.getEquivalentTypeLoc().getType()) {
7532       TypeLocBuilder AuxiliaryTLB;
7533       AuxiliaryTLB.reserve(TL.getFullDataSize());
7534       equivalentType =
7535           getDerived().TransformType(AuxiliaryTLB, TL.getEquivalentTypeLoc());
7536       if (equivalentType.isNull())
7537         return QualType();
7538     }
7539 
7540     // Check whether we can add nullability; it is only represented as
7541     // type sugar, and therefore cannot be diagnosed in any other way.
7542     if (auto nullability = oldType->getImmediateNullability()) {
7543       if (!modifiedType->canHaveNullability()) {
7544         SemaRef.Diag((TL.getAttr() ? TL.getAttr()->getLocation()
7545                                    : TL.getModifiedLoc().getBeginLoc()),
7546                      diag::err_nullability_nonpointer)
7547             << DiagNullabilityKind(*nullability, false) << modifiedType;
7548         return QualType();
7549       }
7550     }
7551 
7552     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
7553                                                modifiedType,
7554                                                equivalentType,
7555                                                TL.getAttr());
7556   }
7557 
7558   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7559   newTL.setAttr(newAttr);
7560   return result;
7561 }
7562 
7563 template <typename Derived>
7564 QualType TreeTransform<Derived>::TransformCountAttributedType(
7565     TypeLocBuilder &TLB, CountAttributedTypeLoc TL) {
7566   const CountAttributedType *OldTy = TL.getTypePtr();
7567   QualType InnerTy = getDerived().TransformType(TLB, TL.getInnerLoc());
7568   if (InnerTy.isNull())
7569     return QualType();
7570 
7571   Expr *OldCount = TL.getCountExpr();
7572   Expr *NewCount = nullptr;
7573   if (OldCount) {
7574     ExprResult CountResult = getDerived().TransformExpr(OldCount);
7575     if (CountResult.isInvalid())
7576       return QualType();
7577     NewCount = CountResult.get();
7578   }
7579 
7580   QualType Result = TL.getType();
7581   if (getDerived().AlwaysRebuild() || InnerTy != OldTy->desugar() ||
7582       OldCount != NewCount) {
7583     // Currently, CountAttributedType can only wrap incomplete array types.
7584     Result = SemaRef.BuildCountAttributedArrayOrPointerType(
7585         InnerTy, NewCount, OldTy->isCountInBytes(), OldTy->isOrNull());
7586   }
7587 
7588   TLB.push<CountAttributedTypeLoc>(Result);
7589   return Result;
7590 }
7591 
7592 template <typename Derived>
7593 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7594     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7595   // The BTFTagAttributedType is available for C only.
7596   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
7597 }
7598 
7599 template <typename Derived>
7600 QualType TreeTransform<Derived>::TransformHLSLAttributedResourceType(
7601     TypeLocBuilder &TLB, HLSLAttributedResourceTypeLoc TL) {
7602 
7603   const HLSLAttributedResourceType *oldType = TL.getTypePtr();
7604 
7605   QualType WrappedTy = getDerived().TransformType(TLB, TL.getWrappedLoc());
7606   if (WrappedTy.isNull())
7607     return QualType();
7608 
7609   QualType ContainedTy = QualType();
7610   QualType OldContainedTy = oldType->getContainedType();
7611   if (!OldContainedTy.isNull()) {
7612     TypeSourceInfo *oldContainedTSI = TL.getContainedTypeSourceInfo();
7613     if (!oldContainedTSI)
7614       oldContainedTSI = getSema().getASTContext().getTrivialTypeSourceInfo(
7615           OldContainedTy, SourceLocation());
7616     TypeSourceInfo *ContainedTSI = getDerived().TransformType(oldContainedTSI);
7617     if (!ContainedTSI)
7618       return QualType();
7619     ContainedTy = ContainedTSI->getType();
7620   }
7621 
7622   QualType Result = TL.getType();
7623   if (getDerived().AlwaysRebuild() || WrappedTy != oldType->getWrappedType() ||
7624       ContainedTy != oldType->getContainedType()) {
7625     Result = SemaRef.Context.getHLSLAttributedResourceType(
7626         WrappedTy, ContainedTy, oldType->getAttrs());
7627   }
7628 
7629   TLB.push<HLSLAttributedResourceTypeLoc>(Result);
7630   return Result;
7631 }
7632 
7633 template<typename Derived>
7634 QualType
7635 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7636                                            ParenTypeLoc TL) {
7637   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7638   if (Inner.isNull())
7639     return QualType();
7640 
7641   QualType Result = TL.getType();
7642   if (getDerived().AlwaysRebuild() ||
7643       Inner != TL.getInnerLoc().getType()) {
7644     Result = getDerived().RebuildParenType(Inner);
7645     if (Result.isNull())
7646       return QualType();
7647   }
7648 
7649   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
7650   NewTL.setLParenLoc(TL.getLParenLoc());
7651   NewTL.setRParenLoc(TL.getRParenLoc());
7652   return Result;
7653 }
7654 
7655 template <typename Derived>
7656 QualType
7657 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7658                                                     MacroQualifiedTypeLoc TL) {
7659   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7660   if (Inner.isNull())
7661     return QualType();
7662 
7663   QualType Result = TL.getType();
7664   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7665     Result =
7666         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7667     if (Result.isNull())
7668       return QualType();
7669   }
7670 
7671   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
7672   NewTL.setExpansionLoc(TL.getExpansionLoc());
7673   return Result;
7674 }
7675 
7676 template<typename Derived>
7677 QualType TreeTransform<Derived>::TransformDependentNameType(
7678     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7679   return TransformDependentNameType(TLB, TL, false);
7680 }
7681 
7682 template<typename Derived>
7683 QualType TreeTransform<Derived>::TransformDependentNameType(
7684     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
7685   const DependentNameType *T = TL.getTypePtr();
7686 
7687   NestedNameSpecifierLoc QualifierLoc
7688     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7689   if (!QualifierLoc)
7690     return QualType();
7691 
7692   QualType Result
7693     = getDerived().RebuildDependentNameType(T->getKeyword(),
7694                                             TL.getElaboratedKeywordLoc(),
7695                                             QualifierLoc,
7696                                             T->getIdentifier(),
7697                                             TL.getNameLoc(),
7698                                             DeducedTSTContext);
7699   if (Result.isNull())
7700     return QualType();
7701 
7702   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
7703     QualType NamedT = ElabT->getNamedType();
7704     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7705 
7706     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7707     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7708     NewTL.setQualifierLoc(QualifierLoc);
7709   } else {
7710     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
7711     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7712     NewTL.setQualifierLoc(QualifierLoc);
7713     NewTL.setNameLoc(TL.getNameLoc());
7714   }
7715   return Result;
7716 }
7717 
7718 template<typename Derived>
7719 QualType TreeTransform<Derived>::
7720           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7721                                  DependentTemplateSpecializationTypeLoc TL) {
7722   NestedNameSpecifierLoc QualifierLoc;
7723   if (TL.getQualifierLoc()) {
7724     QualifierLoc
7725       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7726     if (!QualifierLoc)
7727       return QualType();
7728   }
7729 
7730   return getDerived()
7731            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7732 }
7733 
7734 template<typename Derived>
7735 QualType TreeTransform<Derived>::
7736 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7737                                    DependentTemplateSpecializationTypeLoc TL,
7738                                        NestedNameSpecifierLoc QualifierLoc) {
7739   const DependentTemplateSpecializationType *T = TL.getTypePtr();
7740 
7741   TemplateArgumentListInfo NewTemplateArgs;
7742   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7743   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7744 
7745   typedef TemplateArgumentLocContainerIterator<
7746   DependentTemplateSpecializationTypeLoc> ArgIterator;
7747   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7748                                               ArgIterator(TL, TL.getNumArgs()),
7749                                               NewTemplateArgs))
7750     return QualType();
7751 
7752   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7753       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7754       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7755       /*AllowInjectedClassName*/ false);
7756   if (Result.isNull())
7757     return QualType();
7758 
7759   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7760     QualType NamedT = ElabT->getNamedType();
7761 
7762     // Copy information relevant to the template specialization.
7763     TemplateSpecializationTypeLoc NamedTL
7764       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7765     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7766     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7767     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7768     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7769     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7770       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7771 
7772     // Copy information relevant to the elaborated type.
7773     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7774     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7775     NewTL.setQualifierLoc(QualifierLoc);
7776   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7777     DependentTemplateSpecializationTypeLoc SpecTL
7778       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7779     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7780     SpecTL.setQualifierLoc(QualifierLoc);
7781     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7782     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7783     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7784     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7785     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7786       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7787   } else {
7788     TemplateSpecializationTypeLoc SpecTL
7789       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7790     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7791     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7792     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7793     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7794     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7795       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7796   }
7797   return Result;
7798 }
7799 
7800 template<typename Derived>
7801 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7802                                                       PackExpansionTypeLoc TL) {
7803   QualType Pattern
7804     = getDerived().TransformType(TLB, TL.getPatternLoc());
7805   if (Pattern.isNull())
7806     return QualType();
7807 
7808   QualType Result = TL.getType();
7809   if (getDerived().AlwaysRebuild() ||
7810       Pattern != TL.getPatternLoc().getType()) {
7811     Result = getDerived().RebuildPackExpansionType(Pattern,
7812                                            TL.getPatternLoc().getSourceRange(),
7813                                                    TL.getEllipsisLoc(),
7814                                            TL.getTypePtr()->getNumExpansions());
7815     if (Result.isNull())
7816       return QualType();
7817   }
7818 
7819   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7820   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7821   return Result;
7822 }
7823 
7824 template<typename Derived>
7825 QualType
7826 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7827                                                    ObjCInterfaceTypeLoc TL) {
7828   // ObjCInterfaceType is never dependent.
7829   TLB.pushFullCopy(TL);
7830   return TL.getType();
7831 }
7832 
7833 template<typename Derived>
7834 QualType
7835 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7836                                                    ObjCTypeParamTypeLoc TL) {
7837   const ObjCTypeParamType *T = TL.getTypePtr();
7838   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7839       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7840   if (!OTP)
7841     return QualType();
7842 
7843   QualType Result = TL.getType();
7844   if (getDerived().AlwaysRebuild() ||
7845       OTP != T->getDecl()) {
7846     Result = getDerived().RebuildObjCTypeParamType(
7847         OTP, TL.getProtocolLAngleLoc(),
7848         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7849         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7850     if (Result.isNull())
7851       return QualType();
7852   }
7853 
7854   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7855   if (TL.getNumProtocols()) {
7856     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7857     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7858       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7859     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7860   }
7861   return Result;
7862 }
7863 
7864 template<typename Derived>
7865 QualType
7866 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7867                                                 ObjCObjectTypeLoc TL) {
7868   // Transform base type.
7869   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7870   if (BaseType.isNull())
7871     return QualType();
7872 
7873   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7874 
7875   // Transform type arguments.
7876   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7877   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7878     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7879     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7880     QualType TypeArg = TypeArgInfo->getType();
7881     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7882       AnyChanged = true;
7883 
7884       // We have a pack expansion. Instantiate it.
7885       const auto *PackExpansion = PackExpansionLoc.getType()
7886                                     ->castAs<PackExpansionType>();
7887       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7888       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7889                                               Unexpanded);
7890       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7891 
7892       // Determine whether the set of unexpanded parameter packs can
7893       // and should be expanded.
7894       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7895       bool Expand = false;
7896       bool RetainExpansion = false;
7897       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7898       if (getDerived().TryExpandParameterPacks(
7899             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7900             Unexpanded, Expand, RetainExpansion, NumExpansions))
7901         return QualType();
7902 
7903       if (!Expand) {
7904         // We can't expand this pack expansion into separate arguments yet;
7905         // just substitute into the pattern and create a new pack expansion
7906         // type.
7907         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7908 
7909         TypeLocBuilder TypeArgBuilder;
7910         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7911         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7912                                                              PatternLoc);
7913         if (NewPatternType.isNull())
7914           return QualType();
7915 
7916         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7917                                       NewPatternType, NumExpansions);
7918         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7919         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7920         NewTypeArgInfos.push_back(
7921           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7922         continue;
7923       }
7924 
7925       // Substitute into the pack expansion pattern for each slice of the
7926       // pack.
7927       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7928         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7929 
7930         TypeLocBuilder TypeArgBuilder;
7931         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7932 
7933         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7934                                                          PatternLoc);
7935         if (NewTypeArg.isNull())
7936           return QualType();
7937 
7938         NewTypeArgInfos.push_back(
7939           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7940       }
7941 
7942       continue;
7943     }
7944 
7945     TypeLocBuilder TypeArgBuilder;
7946     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7947     QualType NewTypeArg =
7948         getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7949     if (NewTypeArg.isNull())
7950       return QualType();
7951 
7952     // If nothing changed, just keep the old TypeSourceInfo.
7953     if (NewTypeArg == TypeArg) {
7954       NewTypeArgInfos.push_back(TypeArgInfo);
7955       continue;
7956     }
7957 
7958     NewTypeArgInfos.push_back(
7959       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7960     AnyChanged = true;
7961   }
7962 
7963   QualType Result = TL.getType();
7964   if (getDerived().AlwaysRebuild() || AnyChanged) {
7965     // Rebuild the type.
7966     Result = getDerived().RebuildObjCObjectType(
7967         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7968         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7969         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7970         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7971 
7972     if (Result.isNull())
7973       return QualType();
7974   }
7975 
7976   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7977   NewT.setHasBaseTypeAsWritten(true);
7978   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7979   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7980     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7981   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7982   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7983   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7984     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7985   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7986   return Result;
7987 }
7988 
7989 template<typename Derived>
7990 QualType
7991 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7992                                                ObjCObjectPointerTypeLoc TL) {
7993   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7994   if (PointeeType.isNull())
7995     return QualType();
7996 
7997   QualType Result = TL.getType();
7998   if (getDerived().AlwaysRebuild() ||
7999       PointeeType != TL.getPointeeLoc().getType()) {
8000     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
8001                                                        TL.getStarLoc());
8002     if (Result.isNull())
8003       return QualType();
8004   }
8005 
8006   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
8007   NewT.setStarLoc(TL.getStarLoc());
8008   return Result;
8009 }
8010 
8011 //===----------------------------------------------------------------------===//
8012 // Statement transformation
8013 //===----------------------------------------------------------------------===//
8014 template<typename Derived>
8015 StmtResult
8016 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
8017   return S;
8018 }
8019 
8020 template<typename Derived>
8021 StmtResult
8022 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
8023   return getDerived().TransformCompoundStmt(S, false);
8024 }
8025 
8026 template<typename Derived>
8027 StmtResult
8028 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
8029                                               bool IsStmtExpr) {
8030   Sema::CompoundScopeRAII CompoundScope(getSema());
8031   Sema::FPFeaturesStateRAII FPSave(getSema());
8032   if (S->hasStoredFPFeatures())
8033     getSema().resetFPOptions(
8034         S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts()));
8035 
8036   const Stmt *ExprResult = S->getStmtExprResult();
8037   bool SubStmtInvalid = false;
8038   bool SubStmtChanged = false;
8039   SmallVector<Stmt*, 8> Statements;
8040   for (auto *B : S->body()) {
8041     StmtResult Result = getDerived().TransformStmt(
8042         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
8043 
8044     if (Result.isInvalid()) {
8045       // Immediately fail if this was a DeclStmt, since it's very
8046       // likely that this will cause problems for future statements.
8047       if (isa<DeclStmt>(B))
8048         return StmtError();
8049 
8050       // Otherwise, just keep processing substatements and fail later.
8051       SubStmtInvalid = true;
8052       continue;
8053     }
8054 
8055     SubStmtChanged = SubStmtChanged || Result.get() != B;
8056     Statements.push_back(Result.getAs<Stmt>());
8057   }
8058 
8059   if (SubStmtInvalid)
8060     return StmtError();
8061 
8062   if (!getDerived().AlwaysRebuild() &&
8063       !SubStmtChanged)
8064     return S;
8065 
8066   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
8067                                           Statements,
8068                                           S->getRBracLoc(),
8069                                           IsStmtExpr);
8070 }
8071 
8072 template<typename Derived>
8073 StmtResult
8074 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
8075   ExprResult LHS, RHS;
8076   {
8077     EnterExpressionEvaluationContext Unevaluated(
8078         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
8079 
8080     // Transform the left-hand case value.
8081     LHS = getDerived().TransformExpr(S->getLHS());
8082     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
8083     if (LHS.isInvalid())
8084       return StmtError();
8085 
8086     // Transform the right-hand case value (for the GNU case-range extension).
8087     RHS = getDerived().TransformExpr(S->getRHS());
8088     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
8089     if (RHS.isInvalid())
8090       return StmtError();
8091   }
8092 
8093   // Build the case statement.
8094   // Case statements are always rebuilt so that they will attached to their
8095   // transformed switch statement.
8096   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
8097                                                        LHS.get(),
8098                                                        S->getEllipsisLoc(),
8099                                                        RHS.get(),
8100                                                        S->getColonLoc());
8101   if (Case.isInvalid())
8102     return StmtError();
8103 
8104   // Transform the statement following the case
8105   StmtResult SubStmt =
8106       getDerived().TransformStmt(S->getSubStmt());
8107   if (SubStmt.isInvalid())
8108     return StmtError();
8109 
8110   // Attach the body to the case statement
8111   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
8112 }
8113 
8114 template <typename Derived>
8115 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
8116   // Transform the statement following the default case
8117   StmtResult SubStmt =
8118       getDerived().TransformStmt(S->getSubStmt());
8119   if (SubStmt.isInvalid())
8120     return StmtError();
8121 
8122   // Default statements are always rebuilt
8123   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
8124                                          SubStmt.get());
8125 }
8126 
8127 template<typename Derived>
8128 StmtResult
8129 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
8130   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8131   if (SubStmt.isInvalid())
8132     return StmtError();
8133 
8134   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
8135                                         S->getDecl());
8136   if (!LD)
8137     return StmtError();
8138 
8139   // If we're transforming "in-place" (we're not creating new local
8140   // declarations), assume we're replacing the old label statement
8141   // and clear out the reference to it.
8142   if (LD == S->getDecl())
8143     S->getDecl()->setStmt(nullptr);
8144 
8145   // FIXME: Pass the real colon location in.
8146   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
8147                                        cast<LabelDecl>(LD), SourceLocation(),
8148                                        SubStmt.get());
8149 }
8150 
8151 template <typename Derived>
8152 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
8153   if (!R)
8154     return R;
8155 
8156   switch (R->getKind()) {
8157 // Transform attributes by calling TransformXXXAttr.
8158 #define ATTR(X)                                                                \
8159   case attr::X:                                                                \
8160     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
8161 #include "clang/Basic/AttrList.inc"
8162   }
8163   return R;
8164 }
8165 
8166 template <typename Derived>
8167 const Attr *TreeTransform<Derived>::TransformStmtAttr(const Stmt *OrigS,
8168                                                       const Stmt *InstS,
8169                                                       const Attr *R) {
8170   if (!R)
8171     return R;
8172 
8173   switch (R->getKind()) {
8174 // Transform attributes by calling TransformStmtXXXAttr.
8175 #define ATTR(X)                                                                \
8176   case attr::X:                                                                \
8177     return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R));
8178 #include "clang/Basic/AttrList.inc"
8179   }
8180   return TransformAttr(R);
8181 }
8182 
8183 template <typename Derived>
8184 StmtResult
8185 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
8186                                                 StmtDiscardKind SDK) {
8187   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
8188   if (SubStmt.isInvalid())
8189     return StmtError();
8190 
8191   bool AttrsChanged = false;
8192   SmallVector<const Attr *, 1> Attrs;
8193 
8194   // Visit attributes and keep track if any are transformed.
8195   for (const auto *I : S->getAttrs()) {
8196     const Attr *R =
8197         getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.get(), I);
8198     AttrsChanged |= (I != R);
8199     if (R)
8200       Attrs.push_back(R);
8201   }
8202 
8203   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
8204     return S;
8205 
8206   // If transforming the attributes failed for all of the attributes in the
8207   // statement, don't make an AttributedStmt without attributes.
8208   if (Attrs.empty())
8209     return SubStmt;
8210 
8211   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
8212                                             SubStmt.get());
8213 }
8214 
8215 template<typename Derived>
8216 StmtResult
8217 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
8218   // Transform the initialization statement
8219   StmtResult Init = getDerived().TransformStmt(S->getInit());
8220   if (Init.isInvalid())
8221     return StmtError();
8222 
8223   Sema::ConditionResult Cond;
8224   if (!S->isConsteval()) {
8225     // Transform the condition
8226     Cond = getDerived().TransformCondition(
8227         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
8228         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
8229                          : Sema::ConditionKind::Boolean);
8230     if (Cond.isInvalid())
8231       return StmtError();
8232   }
8233 
8234   // If this is a constexpr if, determine which arm we should instantiate.
8235   std::optional<bool> ConstexprConditionValue;
8236   if (S->isConstexpr())
8237     ConstexprConditionValue = Cond.getKnownValue();
8238 
8239   // Transform the "then" branch.
8240   StmtResult Then;
8241   if (!ConstexprConditionValue || *ConstexprConditionValue) {
8242     EnterExpressionEvaluationContext Ctx(
8243         getSema(), Sema::ExpressionEvaluationContext::ImmediateFunctionContext,
8244         nullptr, Sema::ExpressionEvaluationContextRecord::EK_Other,
8245         S->isNonNegatedConsteval());
8246 
8247     Then = getDerived().TransformStmt(S->getThen());
8248     if (Then.isInvalid())
8249       return StmtError();
8250   } else {
8251     // Discarded branch is replaced with empty CompoundStmt so we can keep
8252     // proper source location for start and end of original branch, so
8253     // subsequent transformations like CoverageMapping work properly
8254     Then = new (getSema().Context)
8255         CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc());
8256   }
8257 
8258   // Transform the "else" branch.
8259   StmtResult Else;
8260   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
8261     EnterExpressionEvaluationContext Ctx(
8262         getSema(), Sema::ExpressionEvaluationContext::ImmediateFunctionContext,
8263         nullptr, Sema::ExpressionEvaluationContextRecord::EK_Other,
8264         S->isNegatedConsteval());
8265 
8266     Else = getDerived().TransformStmt(S->getElse());
8267     if (Else.isInvalid())
8268       return StmtError();
8269   } else if (S->getElse() && ConstexprConditionValue &&
8270              *ConstexprConditionValue) {
8271     // Same thing here as with <then> branch, we are discarding it, we can't
8272     // replace it with NULL nor NullStmt as we need to keep for source location
8273     // range, for CoverageMapping
8274     Else = new (getSema().Context)
8275         CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc());
8276   }
8277 
8278   if (!getDerived().AlwaysRebuild() &&
8279       Init.get() == S->getInit() &&
8280       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8281       Then.get() == S->getThen() &&
8282       Else.get() == S->getElse())
8283     return S;
8284 
8285   return getDerived().RebuildIfStmt(
8286       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
8287       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
8288 }
8289 
8290 template<typename Derived>
8291 StmtResult
8292 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
8293   // Transform the initialization statement
8294   StmtResult Init = getDerived().TransformStmt(S->getInit());
8295   if (Init.isInvalid())
8296     return StmtError();
8297 
8298   // Transform the condition.
8299   Sema::ConditionResult Cond = getDerived().TransformCondition(
8300       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
8301       Sema::ConditionKind::Switch);
8302   if (Cond.isInvalid())
8303     return StmtError();
8304 
8305   // Rebuild the switch statement.
8306   StmtResult Switch =
8307       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
8308                                           Init.get(), Cond, S->getRParenLoc());
8309   if (Switch.isInvalid())
8310     return StmtError();
8311 
8312   // Transform the body of the switch statement.
8313   StmtResult Body = getDerived().TransformStmt(S->getBody());
8314   if (Body.isInvalid())
8315     return StmtError();
8316 
8317   // Complete the switch statement.
8318   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
8319                                             Body.get());
8320 }
8321 
8322 template<typename Derived>
8323 StmtResult
8324 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
8325   // Transform the condition
8326   Sema::ConditionResult Cond = getDerived().TransformCondition(
8327       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
8328       Sema::ConditionKind::Boolean);
8329   if (Cond.isInvalid())
8330     return StmtError();
8331 
8332   // OpenACC Restricts a while-loop inside of certain construct/clause
8333   // combinations, so diagnose that here in OpenACC mode.
8334   SemaOpenACC::LoopInConstructRAII LCR{SemaRef.OpenACC()};
8335   SemaRef.OpenACC().ActOnWhileStmt(S->getBeginLoc());
8336 
8337   // Transform the body
8338   StmtResult Body = getDerived().TransformStmt(S->getBody());
8339   if (Body.isInvalid())
8340     return StmtError();
8341 
8342   if (!getDerived().AlwaysRebuild() &&
8343       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8344       Body.get() == S->getBody())
8345     return Owned(S);
8346 
8347   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
8348                                        Cond, S->getRParenLoc(), Body.get());
8349 }
8350 
8351 template<typename Derived>
8352 StmtResult
8353 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
8354   // OpenACC Restricts a do-loop inside of certain construct/clause
8355   // combinations, so diagnose that here in OpenACC mode.
8356   SemaOpenACC::LoopInConstructRAII LCR{SemaRef.OpenACC()};
8357   SemaRef.OpenACC().ActOnDoStmt(S->getBeginLoc());
8358 
8359   // Transform the body
8360   StmtResult Body = getDerived().TransformStmt(S->getBody());
8361   if (Body.isInvalid())
8362     return StmtError();
8363 
8364   // Transform the condition
8365   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8366   if (Cond.isInvalid())
8367     return StmtError();
8368 
8369   if (!getDerived().AlwaysRebuild() &&
8370       Cond.get() == S->getCond() &&
8371       Body.get() == S->getBody())
8372     return S;
8373 
8374   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
8375                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
8376                                     S->getRParenLoc());
8377 }
8378 
8379 template<typename Derived>
8380 StmtResult
8381 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
8382   if (getSema().getLangOpts().OpenMP)
8383     getSema().OpenMP().startOpenMPLoop();
8384 
8385   // Transform the initialization statement
8386   StmtResult Init = getDerived().TransformStmt(S->getInit());
8387   if (Init.isInvalid())
8388     return StmtError();
8389 
8390   // In OpenMP loop region loop control variable must be captured and be
8391   // private. Perform analysis of first part (if any).
8392   if (getSema().getLangOpts().OpenMP && Init.isUsable())
8393     getSema().OpenMP().ActOnOpenMPLoopInitialization(S->getForLoc(),
8394                                                      Init.get());
8395 
8396   // Transform the condition
8397   Sema::ConditionResult Cond = getDerived().TransformCondition(
8398       S->getForLoc(), S->getConditionVariable(), S->getCond(),
8399       Sema::ConditionKind::Boolean);
8400   if (Cond.isInvalid())
8401     return StmtError();
8402 
8403   // Transform the increment
8404   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8405   if (Inc.isInvalid())
8406     return StmtError();
8407 
8408   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
8409   if (S->getInc() && !FullInc.get())
8410     return StmtError();
8411 
8412   // OpenACC Restricts a for-loop inside of certain construct/clause
8413   // combinations, so diagnose that here in OpenACC mode.
8414   SemaOpenACC::LoopInConstructRAII LCR{SemaRef.OpenACC()};
8415   SemaRef.OpenACC().ActOnForStmtBegin(
8416       S->getBeginLoc(), S->getInit(), Init.get(), S->getCond(),
8417       Cond.get().second, S->getInc(), Inc.get());
8418 
8419   // Transform the body
8420   StmtResult Body = getDerived().TransformStmt(S->getBody());
8421   if (Body.isInvalid())
8422     return StmtError();
8423 
8424   SemaRef.OpenACC().ActOnForStmtEnd(S->getBeginLoc(), Body);
8425 
8426   if (!getDerived().AlwaysRebuild() &&
8427       Init.get() == S->getInit() &&
8428       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
8429       Inc.get() == S->getInc() &&
8430       Body.get() == S->getBody())
8431     return S;
8432 
8433   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
8434                                      Init.get(), Cond, FullInc,
8435                                      S->getRParenLoc(), Body.get());
8436 }
8437 
8438 template<typename Derived>
8439 StmtResult
8440 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
8441   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
8442                                         S->getLabel());
8443   if (!LD)
8444     return StmtError();
8445 
8446   // Goto statements must always be rebuilt, to resolve the label.
8447   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
8448                                       cast<LabelDecl>(LD));
8449 }
8450 
8451 template<typename Derived>
8452 StmtResult
8453 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
8454   ExprResult Target = getDerived().TransformExpr(S->getTarget());
8455   if (Target.isInvalid())
8456     return StmtError();
8457   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
8458 
8459   if (!getDerived().AlwaysRebuild() &&
8460       Target.get() == S->getTarget())
8461     return S;
8462 
8463   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
8464                                               Target.get());
8465 }
8466 
8467 template<typename Derived>
8468 StmtResult
8469 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
8470   return S;
8471 }
8472 
8473 template<typename Derived>
8474 StmtResult
8475 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
8476   return S;
8477 }
8478 
8479 template<typename Derived>
8480 StmtResult
8481 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
8482   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
8483                                                         /*NotCopyInit*/false);
8484   if (Result.isInvalid())
8485     return StmtError();
8486 
8487   // FIXME: We always rebuild the return statement because there is no way
8488   // to tell whether the return type of the function has changed.
8489   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
8490 }
8491 
8492 template<typename Derived>
8493 StmtResult
8494 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
8495   bool DeclChanged = false;
8496   SmallVector<Decl *, 4> Decls;
8497   LambdaScopeInfo *LSI = getSema().getCurLambda();
8498   for (auto *D : S->decls()) {
8499     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
8500     if (!Transformed)
8501       return StmtError();
8502 
8503     if (Transformed != D)
8504       DeclChanged = true;
8505 
8506     if (LSI) {
8507       if (auto *TD = dyn_cast<TypeDecl>(Transformed))
8508         LSI->ContainsUnexpandedParameterPack |=
8509             getSema()
8510                 .getASTContext()
8511                 .getTypeDeclType(TD)
8512                 .getSingleStepDesugaredType(getSema().getASTContext())
8513                 ->containsUnexpandedParameterPack();
8514 
8515       if (auto *VD = dyn_cast<VarDecl>(Transformed))
8516         LSI->ContainsUnexpandedParameterPack |=
8517             VD->getType()->containsUnexpandedParameterPack();
8518     }
8519 
8520     Decls.push_back(Transformed);
8521   }
8522 
8523   if (!getDerived().AlwaysRebuild() && !DeclChanged)
8524     return S;
8525 
8526   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
8527 }
8528 
8529 template<typename Derived>
8530 StmtResult
8531 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
8532 
8533   SmallVector<Expr*, 8> Constraints;
8534   SmallVector<Expr*, 8> Exprs;
8535   SmallVector<IdentifierInfo *, 4> Names;
8536 
8537   ExprResult AsmString;
8538   SmallVector<Expr*, 8> Clobbers;
8539 
8540   bool ExprsChanged = false;
8541 
8542   // Go through the outputs.
8543   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
8544     Names.push_back(S->getOutputIdentifier(I));
8545 
8546     // No need to transform the constraint literal.
8547     Constraints.push_back(S->getOutputConstraintLiteral(I));
8548 
8549     // Transform the output expr.
8550     Expr *OutputExpr = S->getOutputExpr(I);
8551     ExprResult Result = getDerived().TransformExpr(OutputExpr);
8552     if (Result.isInvalid())
8553       return StmtError();
8554 
8555     ExprsChanged |= Result.get() != OutputExpr;
8556 
8557     Exprs.push_back(Result.get());
8558   }
8559 
8560   // Go through the inputs.
8561   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
8562     Names.push_back(S->getInputIdentifier(I));
8563 
8564     // No need to transform the constraint literal.
8565     Constraints.push_back(S->getInputConstraintLiteral(I));
8566 
8567     // Transform the input expr.
8568     Expr *InputExpr = S->getInputExpr(I);
8569     ExprResult Result = getDerived().TransformExpr(InputExpr);
8570     if (Result.isInvalid())
8571       return StmtError();
8572 
8573     ExprsChanged |= Result.get() != InputExpr;
8574 
8575     Exprs.push_back(Result.get());
8576   }
8577 
8578   // Go through the Labels.
8579   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
8580     Names.push_back(S->getLabelIdentifier(I));
8581 
8582     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
8583     if (Result.isInvalid())
8584       return StmtError();
8585     ExprsChanged |= Result.get() != S->getLabelExpr(I);
8586     Exprs.push_back(Result.get());
8587   }
8588   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
8589     return S;
8590 
8591   // Go through the clobbers.
8592   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
8593     Clobbers.push_back(S->getClobberStringLiteral(I));
8594 
8595   // No need to transform the asm string literal.
8596   AsmString = S->getAsmString();
8597   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
8598                                         S->isVolatile(), S->getNumOutputs(),
8599                                         S->getNumInputs(), Names.data(),
8600                                         Constraints, Exprs, AsmString.get(),
8601                                         Clobbers, S->getNumLabels(),
8602                                         S->getRParenLoc());
8603 }
8604 
8605 template<typename Derived>
8606 StmtResult
8607 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
8608   ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks());
8609 
8610   bool HadError = false, HadChange = false;
8611 
8612   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
8613   SmallVector<Expr*, 8> TransformedExprs;
8614   TransformedExprs.reserve(SrcExprs.size());
8615   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
8616     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
8617     if (!Result.isUsable()) {
8618       HadError = true;
8619     } else {
8620       HadChange |= (Result.get() != SrcExprs[i]);
8621       TransformedExprs.push_back(Result.get());
8622     }
8623   }
8624 
8625   if (HadError) return StmtError();
8626   if (!HadChange && !getDerived().AlwaysRebuild())
8627     return Owned(S);
8628 
8629   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
8630                                        AsmToks, S->getAsmString(),
8631                                        S->getNumOutputs(), S->getNumInputs(),
8632                                        S->getAllConstraints(), S->getClobbers(),
8633                                        TransformedExprs, S->getEndLoc());
8634 }
8635 
8636 // C++ Coroutines
8637 template<typename Derived>
8638 StmtResult
8639 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
8640   auto *ScopeInfo = SemaRef.getCurFunction();
8641   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
8642   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
8643          ScopeInfo->NeedsCoroutineSuspends &&
8644          ScopeInfo->CoroutineSuspends.first == nullptr &&
8645          ScopeInfo->CoroutineSuspends.second == nullptr &&
8646          "expected clean scope info");
8647 
8648   // Set that we have (possibly-invalid) suspend points before we do anything
8649   // that may fail.
8650   ScopeInfo->setNeedsCoroutineSuspends(false);
8651 
8652   // We re-build the coroutine promise object (and the coroutine parameters its
8653   // type and constructor depend on) based on the types used in our current
8654   // function. We must do so, and set it on the current FunctionScopeInfo,
8655   // before attempting to transform the other parts of the coroutine body
8656   // statement, such as the implicit suspend statements (because those
8657   // statements reference the FunctionScopeInfo::CoroutinePromise).
8658   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
8659     return StmtError();
8660   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
8661   if (!Promise)
8662     return StmtError();
8663   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
8664   ScopeInfo->CoroutinePromise = Promise;
8665 
8666   // Transform the implicit coroutine statements constructed using dependent
8667   // types during the previous parse: initial and final suspensions, the return
8668   // object, and others. We also transform the coroutine function's body.
8669   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
8670   if (InitSuspend.isInvalid())
8671     return StmtError();
8672   StmtResult FinalSuspend =
8673       getDerived().TransformStmt(S->getFinalSuspendStmt());
8674   if (FinalSuspend.isInvalid() ||
8675       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
8676     return StmtError();
8677   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
8678   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
8679 
8680   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
8681   if (BodyRes.isInvalid())
8682     return StmtError();
8683 
8684   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
8685   if (Builder.isInvalid())
8686     return StmtError();
8687 
8688   Expr *ReturnObject = S->getReturnValueInit();
8689   assert(ReturnObject && "the return object is expected to be valid");
8690   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8691                                                      /*NoCopyInit*/ false);
8692   if (Res.isInvalid())
8693     return StmtError();
8694   Builder.ReturnValue = Res.get();
8695 
8696   // If during the previous parse the coroutine still had a dependent promise
8697   // statement, we may need to build some implicit coroutine statements
8698   // (such as exception and fallthrough handlers) for the first time.
8699   if (S->hasDependentPromiseType()) {
8700     // We can only build these statements, however, if the current promise type
8701     // is not dependent.
8702     if (!Promise->getType()->isDependentType()) {
8703       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8704              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8705              "these nodes should not have been built yet");
8706       if (!Builder.buildDependentStatements())
8707         return StmtError();
8708     }
8709   } else {
8710     if (auto *OnFallthrough = S->getFallthroughHandler()) {
8711       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8712       if (Res.isInvalid())
8713         return StmtError();
8714       Builder.OnFallthrough = Res.get();
8715     }
8716 
8717     if (auto *OnException = S->getExceptionHandler()) {
8718       StmtResult Res = getDerived().TransformStmt(OnException);
8719       if (Res.isInvalid())
8720         return StmtError();
8721       Builder.OnException = Res.get();
8722     }
8723 
8724     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8725       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8726       if (Res.isInvalid())
8727         return StmtError();
8728       Builder.ReturnStmtOnAllocFailure = Res.get();
8729     }
8730 
8731     // Transform any additional statements we may have already built
8732     assert(S->getAllocate() && S->getDeallocate() &&
8733            "allocation and deallocation calls must already be built");
8734     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8735     if (AllocRes.isInvalid())
8736       return StmtError();
8737     Builder.Allocate = AllocRes.get();
8738 
8739     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8740     if (DeallocRes.isInvalid())
8741       return StmtError();
8742     Builder.Deallocate = DeallocRes.get();
8743 
8744     if (auto *ResultDecl = S->getResultDecl()) {
8745       StmtResult Res = getDerived().TransformStmt(ResultDecl);
8746       if (Res.isInvalid())
8747         return StmtError();
8748       Builder.ResultDecl = Res.get();
8749     }
8750 
8751     if (auto *ReturnStmt = S->getReturnStmt()) {
8752       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8753       if (Res.isInvalid())
8754         return StmtError();
8755       Builder.ReturnStmt = Res.get();
8756     }
8757   }
8758 
8759   return getDerived().RebuildCoroutineBodyStmt(Builder);
8760 }
8761 
8762 template<typename Derived>
8763 StmtResult
8764 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8765   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
8766                                                         /*NotCopyInit*/false);
8767   if (Result.isInvalid())
8768     return StmtError();
8769 
8770   // Always rebuild; we don't know if this needs to be injected into a new
8771   // context or if the promise type has changed.
8772   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
8773                                           S->isImplicit());
8774 }
8775 
8776 template <typename Derived>
8777 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
8778   ExprResult Operand = getDerived().TransformInitializer(E->getOperand(),
8779                                                          /*NotCopyInit*/ false);
8780   if (Operand.isInvalid())
8781     return ExprError();
8782 
8783   // Rebuild the common-expr from the operand rather than transforming it
8784   // separately.
8785 
8786   // FIXME: getCurScope() should not be used during template instantiation.
8787   // We should pick up the set of unqualified lookup results for operator
8788   // co_await during the initial parse.
8789   ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8790       getSema().getCurScope(), E->getKeywordLoc());
8791 
8792   // Always rebuild; we don't know if this needs to be injected into a new
8793   // context or if the promise type has changed.
8794   return getDerived().RebuildCoawaitExpr(
8795       E->getKeywordLoc(), Operand.get(),
8796       cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit());
8797 }
8798 
8799 template <typename Derived>
8800 ExprResult
8801 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
8802   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
8803                                                         /*NotCopyInit*/ false);
8804   if (OperandResult.isInvalid())
8805     return ExprError();
8806 
8807   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8808           E->getOperatorCoawaitLookup());
8809 
8810   if (LookupResult.isInvalid())
8811     return ExprError();
8812 
8813   // Always rebuild; we don't know if this needs to be injected into a new
8814   // context or if the promise type has changed.
8815   return getDerived().RebuildDependentCoawaitExpr(
8816       E->getKeywordLoc(), OperandResult.get(),
8817       cast<UnresolvedLookupExpr>(LookupResult.get()));
8818 }
8819 
8820 template<typename Derived>
8821 ExprResult
8822 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
8823   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
8824                                                         /*NotCopyInit*/false);
8825   if (Result.isInvalid())
8826     return ExprError();
8827 
8828   // Always rebuild; we don't know if this needs to be injected into a new
8829   // context or if the promise type has changed.
8830   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
8831 }
8832 
8833 // Objective-C Statements.
8834 
8835 template<typename Derived>
8836 StmtResult
8837 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8838   // Transform the body of the @try.
8839   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8840   if (TryBody.isInvalid())
8841     return StmtError();
8842 
8843   // Transform the @catch statements (if present).
8844   bool AnyCatchChanged = false;
8845   SmallVector<Stmt*, 8> CatchStmts;
8846   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8847     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8848     if (Catch.isInvalid())
8849       return StmtError();
8850     if (Catch.get() != S->getCatchStmt(I))
8851       AnyCatchChanged = true;
8852     CatchStmts.push_back(Catch.get());
8853   }
8854 
8855   // Transform the @finally statement (if present).
8856   StmtResult Finally;
8857   if (S->getFinallyStmt()) {
8858     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8859     if (Finally.isInvalid())
8860       return StmtError();
8861   }
8862 
8863   // If nothing changed, just retain this statement.
8864   if (!getDerived().AlwaysRebuild() &&
8865       TryBody.get() == S->getTryBody() &&
8866       !AnyCatchChanged &&
8867       Finally.get() == S->getFinallyStmt())
8868     return S;
8869 
8870   // Build a new statement.
8871   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8872                                            CatchStmts, Finally.get());
8873 }
8874 
8875 template<typename Derived>
8876 StmtResult
8877 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8878   // Transform the @catch parameter, if there is one.
8879   VarDecl *Var = nullptr;
8880   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8881     TypeSourceInfo *TSInfo = nullptr;
8882     if (FromVar->getTypeSourceInfo()) {
8883       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8884       if (!TSInfo)
8885         return StmtError();
8886     }
8887 
8888     QualType T;
8889     if (TSInfo)
8890       T = TSInfo->getType();
8891     else {
8892       T = getDerived().TransformType(FromVar->getType());
8893       if (T.isNull())
8894         return StmtError();
8895     }
8896 
8897     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8898     if (!Var)
8899       return StmtError();
8900   }
8901 
8902   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8903   if (Body.isInvalid())
8904     return StmtError();
8905 
8906   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8907                                              S->getRParenLoc(),
8908                                              Var, Body.get());
8909 }
8910 
8911 template<typename Derived>
8912 StmtResult
8913 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8914   // Transform the body.
8915   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8916   if (Body.isInvalid())
8917     return StmtError();
8918 
8919   // If nothing changed, just retain this statement.
8920   if (!getDerived().AlwaysRebuild() &&
8921       Body.get() == S->getFinallyBody())
8922     return S;
8923 
8924   // Build a new statement.
8925   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8926                                                Body.get());
8927 }
8928 
8929 template<typename Derived>
8930 StmtResult
8931 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8932   ExprResult Operand;
8933   if (S->getThrowExpr()) {
8934     Operand = getDerived().TransformExpr(S->getThrowExpr());
8935     if (Operand.isInvalid())
8936       return StmtError();
8937   }
8938 
8939   if (!getDerived().AlwaysRebuild() &&
8940       Operand.get() == S->getThrowExpr())
8941     return S;
8942 
8943   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8944 }
8945 
8946 template<typename Derived>
8947 StmtResult
8948 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8949                                                   ObjCAtSynchronizedStmt *S) {
8950   // Transform the object we are locking.
8951   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8952   if (Object.isInvalid())
8953     return StmtError();
8954   Object =
8955     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8956                                                   Object.get());
8957   if (Object.isInvalid())
8958     return StmtError();
8959 
8960   // Transform the body.
8961   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8962   if (Body.isInvalid())
8963     return StmtError();
8964 
8965   // If nothing change, just retain the current statement.
8966   if (!getDerived().AlwaysRebuild() &&
8967       Object.get() == S->getSynchExpr() &&
8968       Body.get() == S->getSynchBody())
8969     return S;
8970 
8971   // Build a new statement.
8972   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8973                                                     Object.get(), Body.get());
8974 }
8975 
8976 template<typename Derived>
8977 StmtResult
8978 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8979                                               ObjCAutoreleasePoolStmt *S) {
8980   // Transform the body.
8981   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8982   if (Body.isInvalid())
8983     return StmtError();
8984 
8985   // If nothing changed, just retain this statement.
8986   if (!getDerived().AlwaysRebuild() &&
8987       Body.get() == S->getSubStmt())
8988     return S;
8989 
8990   // Build a new statement.
8991   return getDerived().RebuildObjCAutoreleasePoolStmt(
8992                         S->getAtLoc(), Body.get());
8993 }
8994 
8995 template<typename Derived>
8996 StmtResult
8997 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8998                                                   ObjCForCollectionStmt *S) {
8999   // Transform the element statement.
9000   StmtResult Element =
9001       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
9002   if (Element.isInvalid())
9003     return StmtError();
9004 
9005   // Transform the collection expression.
9006   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
9007   if (Collection.isInvalid())
9008     return StmtError();
9009 
9010   // Transform the body.
9011   StmtResult Body = getDerived().TransformStmt(S->getBody());
9012   if (Body.isInvalid())
9013     return StmtError();
9014 
9015   // If nothing changed, just retain this statement.
9016   if (!getDerived().AlwaysRebuild() &&
9017       Element.get() == S->getElement() &&
9018       Collection.get() == S->getCollection() &&
9019       Body.get() == S->getBody())
9020     return S;
9021 
9022   // Build a new statement.
9023   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
9024                                                    Element.get(),
9025                                                    Collection.get(),
9026                                                    S->getRParenLoc(),
9027                                                    Body.get());
9028 }
9029 
9030 template <typename Derived>
9031 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
9032   // Transform the exception declaration, if any.
9033   VarDecl *Var = nullptr;
9034   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
9035     TypeSourceInfo *T =
9036         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
9037     if (!T)
9038       return StmtError();
9039 
9040     Var = getDerived().RebuildExceptionDecl(
9041         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
9042         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
9043     if (!Var || Var->isInvalidDecl())
9044       return StmtError();
9045   }
9046 
9047   // Transform the actual exception handler.
9048   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
9049   if (Handler.isInvalid())
9050     return StmtError();
9051 
9052   if (!getDerived().AlwaysRebuild() && !Var &&
9053       Handler.get() == S->getHandlerBlock())
9054     return S;
9055 
9056   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
9057 }
9058 
9059 template <typename Derived>
9060 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
9061   // Transform the try block itself.
9062   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9063   if (TryBlock.isInvalid())
9064     return StmtError();
9065 
9066   // Transform the handlers.
9067   bool HandlerChanged = false;
9068   SmallVector<Stmt *, 8> Handlers;
9069   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
9070     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
9071     if (Handler.isInvalid())
9072       return StmtError();
9073 
9074     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
9075     Handlers.push_back(Handler.getAs<Stmt>());
9076   }
9077 
9078   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9079       !HandlerChanged)
9080     return S;
9081 
9082   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
9083                                         Handlers);
9084 }
9085 
9086 template<typename Derived>
9087 StmtResult
9088 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
9089   EnterExpressionEvaluationContext ForRangeInitContext(
9090       getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated,
9091       /*LambdaContextDecl=*/nullptr,
9092       Sema::ExpressionEvaluationContextRecord::EK_Other,
9093       getSema().getLangOpts().CPlusPlus23);
9094 
9095   // P2718R0 - Lifetime extension in range-based for loops.
9096   if (getSema().getLangOpts().CPlusPlus23) {
9097     auto &LastRecord = getSema().currentEvaluationContext();
9098     LastRecord.InLifetimeExtendingContext = true;
9099     LastRecord.RebuildDefaultArgOrDefaultInit = true;
9100   }
9101   StmtResult Init =
9102       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
9103   if (Init.isInvalid())
9104     return StmtError();
9105 
9106   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
9107   if (Range.isInvalid())
9108     return StmtError();
9109 
9110   // Before c++23, ForRangeLifetimeExtendTemps should be empty.
9111   assert(getSema().getLangOpts().CPlusPlus23 ||
9112          getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps.empty());
9113   auto ForRangeLifetimeExtendTemps =
9114       getSema().ExprEvalContexts.back().ForRangeLifetimeExtendTemps;
9115 
9116   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
9117   if (Begin.isInvalid())
9118     return StmtError();
9119   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
9120   if (End.isInvalid())
9121     return StmtError();
9122 
9123   ExprResult Cond = getDerived().TransformExpr(S->getCond());
9124   if (Cond.isInvalid())
9125     return StmtError();
9126   if (Cond.get())
9127     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
9128   if (Cond.isInvalid())
9129     return StmtError();
9130   if (Cond.get())
9131     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
9132 
9133   ExprResult Inc = getDerived().TransformExpr(S->getInc());
9134   if (Inc.isInvalid())
9135     return StmtError();
9136   if (Inc.get())
9137     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
9138 
9139   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
9140   if (LoopVar.isInvalid())
9141     return StmtError();
9142 
9143   StmtResult NewStmt = S;
9144   if (getDerived().AlwaysRebuild() ||
9145       Init.get() != S->getInit() ||
9146       Range.get() != S->getRangeStmt() ||
9147       Begin.get() != S->getBeginStmt() ||
9148       End.get() != S->getEndStmt() ||
9149       Cond.get() != S->getCond() ||
9150       Inc.get() != S->getInc() ||
9151       LoopVar.get() != S->getLoopVarStmt()) {
9152     NewStmt = getDerived().RebuildCXXForRangeStmt(
9153         S->getForLoc(), S->getCoawaitLoc(), Init.get(), S->getColonLoc(),
9154         Range.get(), Begin.get(), End.get(), Cond.get(), Inc.get(),
9155         LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9156     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
9157       // Might not have attached any initializer to the loop variable.
9158       getSema().ActOnInitializerError(
9159           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
9160       return StmtError();
9161     }
9162   }
9163 
9164   // OpenACC Restricts a while-loop inside of certain construct/clause
9165   // combinations, so diagnose that here in OpenACC mode.
9166   SemaOpenACC::LoopInConstructRAII LCR{SemaRef.OpenACC()};
9167   SemaRef.OpenACC().ActOnRangeForStmtBegin(S->getBeginLoc(), S, NewStmt.get());
9168 
9169   StmtResult Body = getDerived().TransformStmt(S->getBody());
9170   if (Body.isInvalid())
9171     return StmtError();
9172 
9173   SemaRef.OpenACC().ActOnForStmtEnd(S->getBeginLoc(), Body);
9174 
9175   // Body has changed but we didn't rebuild the for-range statement. Rebuild
9176   // it now so we have a new statement to attach the body to.
9177   if (Body.get() != S->getBody() && NewStmt.get() == S) {
9178     NewStmt = getDerived().RebuildCXXForRangeStmt(
9179         S->getForLoc(), S->getCoawaitLoc(), Init.get(), S->getColonLoc(),
9180         Range.get(), Begin.get(), End.get(), Cond.get(), Inc.get(),
9181         LoopVar.get(), S->getRParenLoc(), ForRangeLifetimeExtendTemps);
9182     if (NewStmt.isInvalid())
9183       return StmtError();
9184   }
9185 
9186   if (NewStmt.get() == S)
9187     return S;
9188 
9189   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
9190 }
9191 
9192 template<typename Derived>
9193 StmtResult
9194 TreeTransform<Derived>::TransformMSDependentExistsStmt(
9195                                                     MSDependentExistsStmt *S) {
9196   // Transform the nested-name-specifier, if any.
9197   NestedNameSpecifierLoc QualifierLoc;
9198   if (S->getQualifierLoc()) {
9199     QualifierLoc
9200       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
9201     if (!QualifierLoc)
9202       return StmtError();
9203   }
9204 
9205   // Transform the declaration name.
9206   DeclarationNameInfo NameInfo = S->getNameInfo();
9207   if (NameInfo.getName()) {
9208     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9209     if (!NameInfo.getName())
9210       return StmtError();
9211   }
9212 
9213   // Check whether anything changed.
9214   if (!getDerived().AlwaysRebuild() &&
9215       QualifierLoc == S->getQualifierLoc() &&
9216       NameInfo.getName() == S->getNameInfo().getName())
9217     return S;
9218 
9219   // Determine whether this name exists, if we can.
9220   CXXScopeSpec SS;
9221   SS.Adopt(QualifierLoc);
9222   bool Dependent = false;
9223   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
9224   case Sema::IER_Exists:
9225     if (S->isIfExists())
9226       break;
9227 
9228     return new (getSema().Context) NullStmt(S->getKeywordLoc());
9229 
9230   case Sema::IER_DoesNotExist:
9231     if (S->isIfNotExists())
9232       break;
9233 
9234     return new (getSema().Context) NullStmt(S->getKeywordLoc());
9235 
9236   case Sema::IER_Dependent:
9237     Dependent = true;
9238     break;
9239 
9240   case Sema::IER_Error:
9241     return StmtError();
9242   }
9243 
9244   // We need to continue with the instantiation, so do so now.
9245   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
9246   if (SubStmt.isInvalid())
9247     return StmtError();
9248 
9249   // If we have resolved the name, just transform to the substatement.
9250   if (!Dependent)
9251     return SubStmt;
9252 
9253   // The name is still dependent, so build a dependent expression again.
9254   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
9255                                                    S->isIfExists(),
9256                                                    QualifierLoc,
9257                                                    NameInfo,
9258                                                    SubStmt.get());
9259 }
9260 
9261 template<typename Derived>
9262 ExprResult
9263 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
9264   NestedNameSpecifierLoc QualifierLoc;
9265   if (E->getQualifierLoc()) {
9266     QualifierLoc
9267     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9268     if (!QualifierLoc)
9269       return ExprError();
9270   }
9271 
9272   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
9273     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
9274   if (!PD)
9275     return ExprError();
9276 
9277   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
9278   if (Base.isInvalid())
9279     return ExprError();
9280 
9281   return new (SemaRef.getASTContext())
9282       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
9283                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
9284                         QualifierLoc, E->getMemberLoc());
9285 }
9286 
9287 template <typename Derived>
9288 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
9289     MSPropertySubscriptExpr *E) {
9290   auto BaseRes = getDerived().TransformExpr(E->getBase());
9291   if (BaseRes.isInvalid())
9292     return ExprError();
9293   auto IdxRes = getDerived().TransformExpr(E->getIdx());
9294   if (IdxRes.isInvalid())
9295     return ExprError();
9296 
9297   if (!getDerived().AlwaysRebuild() &&
9298       BaseRes.get() == E->getBase() &&
9299       IdxRes.get() == E->getIdx())
9300     return E;
9301 
9302   return getDerived().RebuildArraySubscriptExpr(
9303       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
9304 }
9305 
9306 template <typename Derived>
9307 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
9308   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
9309   if (TryBlock.isInvalid())
9310     return StmtError();
9311 
9312   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
9313   if (Handler.isInvalid())
9314     return StmtError();
9315 
9316   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
9317       Handler.get() == S->getHandler())
9318     return S;
9319 
9320   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
9321                                         TryBlock.get(), Handler.get());
9322 }
9323 
9324 template <typename Derived>
9325 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
9326   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
9327   if (Block.isInvalid())
9328     return StmtError();
9329 
9330   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
9331 }
9332 
9333 template <typename Derived>
9334 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
9335   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
9336   if (FilterExpr.isInvalid())
9337     return StmtError();
9338 
9339   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
9340   if (Block.isInvalid())
9341     return StmtError();
9342 
9343   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
9344                                            Block.get());
9345 }
9346 
9347 template <typename Derived>
9348 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
9349   if (isa<SEHFinallyStmt>(Handler))
9350     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
9351   else
9352     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
9353 }
9354 
9355 template<typename Derived>
9356 StmtResult
9357 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
9358   return S;
9359 }
9360 
9361 //===----------------------------------------------------------------------===//
9362 // OpenMP directive transformation
9363 //===----------------------------------------------------------------------===//
9364 
9365 template <typename Derived>
9366 StmtResult
9367 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
9368   // OMPCanonicalLoops are eliminated during transformation, since they will be
9369   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
9370   // after transformation.
9371   return getDerived().TransformStmt(L->getLoopStmt());
9372 }
9373 
9374 template <typename Derived>
9375 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
9376     OMPExecutableDirective *D) {
9377 
9378   // Transform the clauses
9379   llvm::SmallVector<OMPClause *, 16> TClauses;
9380   ArrayRef<OMPClause *> Clauses = D->clauses();
9381   TClauses.reserve(Clauses.size());
9382   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
9383        I != E; ++I) {
9384     if (*I) {
9385       getDerived().getSema().OpenMP().StartOpenMPClause((*I)->getClauseKind());
9386       OMPClause *Clause = getDerived().TransformOMPClause(*I);
9387       getDerived().getSema().OpenMP().EndOpenMPClause();
9388       if (Clause)
9389         TClauses.push_back(Clause);
9390     } else {
9391       TClauses.push_back(nullptr);
9392     }
9393   }
9394   StmtResult AssociatedStmt;
9395   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
9396     getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9397         D->getDirectiveKind(),
9398         /*CurScope=*/nullptr);
9399     StmtResult Body;
9400     {
9401       Sema::CompoundScopeRAII CompoundScope(getSema());
9402       Stmt *CS;
9403       if (D->getDirectiveKind() == OMPD_atomic ||
9404           D->getDirectiveKind() == OMPD_critical ||
9405           D->getDirectiveKind() == OMPD_section ||
9406           D->getDirectiveKind() == OMPD_master)
9407         CS = D->getAssociatedStmt();
9408       else
9409         CS = D->getRawStmt();
9410       Body = getDerived().TransformStmt(CS);
9411       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
9412           getSema().getLangOpts().OpenMPIRBuilder)
9413         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
9414     }
9415     AssociatedStmt =
9416         getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9417     if (AssociatedStmt.isInvalid()) {
9418       return StmtError();
9419     }
9420   }
9421   if (TClauses.size() != Clauses.size()) {
9422     return StmtError();
9423   }
9424 
9425   // Transform directive name for 'omp critical' directive.
9426   DeclarationNameInfo DirName;
9427   if (D->getDirectiveKind() == OMPD_critical) {
9428     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
9429     DirName = getDerived().TransformDeclarationNameInfo(DirName);
9430   }
9431   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
9432   if (D->getDirectiveKind() == OMPD_cancellation_point) {
9433     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
9434   } else if (D->getDirectiveKind() == OMPD_cancel) {
9435     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
9436   }
9437 
9438   return getDerived().RebuildOMPExecutableDirective(
9439       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
9440       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
9441 }
9442 
9443 /// This is mostly the same as above, but allows 'informational' class
9444 /// directives when rebuilding the stmt.  It still takes an
9445 /// OMPExecutableDirective-type argument because we're reusing that as the
9446 /// superclass for the 'assume' directive at present, instead of defining a
9447 /// mostly-identical OMPInformationalDirective parent class.
9448 template <typename Derived>
9449 StmtResult TreeTransform<Derived>::TransformOMPInformationalDirective(
9450     OMPExecutableDirective *D) {
9451 
9452   // Transform the clauses
9453   llvm::SmallVector<OMPClause *, 16> TClauses;
9454   ArrayRef<OMPClause *> Clauses = D->clauses();
9455   TClauses.reserve(Clauses.size());
9456   for (OMPClause *C : Clauses) {
9457     if (C) {
9458       getDerived().getSema().OpenMP().StartOpenMPClause(C->getClauseKind());
9459       OMPClause *Clause = getDerived().TransformOMPClause(C);
9460       getDerived().getSema().OpenMP().EndOpenMPClause();
9461       if (Clause)
9462         TClauses.push_back(Clause);
9463     } else {
9464       TClauses.push_back(nullptr);
9465     }
9466   }
9467   StmtResult AssociatedStmt;
9468   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
9469     getDerived().getSema().OpenMP().ActOnOpenMPRegionStart(
9470         D->getDirectiveKind(),
9471         /*CurScope=*/nullptr);
9472     StmtResult Body;
9473     {
9474       Sema::CompoundScopeRAII CompoundScope(getSema());
9475       assert(D->getDirectiveKind() == OMPD_assume &&
9476              "Unexpected informational directive");
9477       Stmt *CS = D->getAssociatedStmt();
9478       Body = getDerived().TransformStmt(CS);
9479     }
9480     AssociatedStmt =
9481         getDerived().getSema().OpenMP().ActOnOpenMPRegionEnd(Body, TClauses);
9482     if (AssociatedStmt.isInvalid())
9483       return StmtError();
9484   }
9485   if (TClauses.size() != Clauses.size())
9486     return StmtError();
9487 
9488   DeclarationNameInfo DirName;
9489 
9490   return getDerived().RebuildOMPInformationalDirective(
9491       D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.get(),
9492       D->getBeginLoc(), D->getEndLoc());
9493 }
9494 
9495 template <typename Derived>
9496 StmtResult
9497 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
9498   // TODO: Fix This
9499   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
9500       << getOpenMPDirectiveName(D->getDirectiveKind());
9501   return StmtError();
9502 }
9503 
9504 template <typename Derived>
9505 StmtResult
9506 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
9507   DeclarationNameInfo DirName;
9508   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9509       OMPD_parallel, DirName, nullptr, D->getBeginLoc());
9510   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9511   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9512   return Res;
9513 }
9514 
9515 template <typename Derived>
9516 StmtResult
9517 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
9518   DeclarationNameInfo DirName;
9519   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9520       OMPD_simd, DirName, nullptr, D->getBeginLoc());
9521   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9522   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9523   return Res;
9524 }
9525 
9526 template <typename Derived>
9527 StmtResult
9528 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
9529   DeclarationNameInfo DirName;
9530   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9531       D->getDirectiveKind(), DirName, nullptr, D->getBeginLoc());
9532   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9533   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9534   return Res;
9535 }
9536 
9537 template <typename Derived>
9538 StmtResult
9539 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
9540   DeclarationNameInfo DirName;
9541   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9542       D->getDirectiveKind(), DirName, nullptr, D->getBeginLoc());
9543   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9544   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9545   return Res;
9546 }
9547 
9548 template <typename Derived>
9549 StmtResult
9550 TreeTransform<Derived>::TransformOMPReverseDirective(OMPReverseDirective *D) {
9551   DeclarationNameInfo DirName;
9552   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9553       D->getDirectiveKind(), DirName, nullptr, D->getBeginLoc());
9554   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9555   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9556   return Res;
9557 }
9558 
9559 template <typename Derived>
9560 StmtResult TreeTransform<Derived>::TransformOMPInterchangeDirective(
9561     OMPInterchangeDirective *D) {
9562   DeclarationNameInfo DirName;
9563   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9564       D->getDirectiveKind(), DirName, nullptr, D->getBeginLoc());
9565   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9566   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9567   return Res;
9568 }
9569 
9570 template <typename Derived>
9571 StmtResult
9572 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
9573   DeclarationNameInfo DirName;
9574   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9575       OMPD_for, DirName, nullptr, D->getBeginLoc());
9576   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9577   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9578   return Res;
9579 }
9580 
9581 template <typename Derived>
9582 StmtResult
9583 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
9584   DeclarationNameInfo DirName;
9585   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9586       OMPD_for_simd, DirName, nullptr, D->getBeginLoc());
9587   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9588   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9589   return Res;
9590 }
9591 
9592 template <typename Derived>
9593 StmtResult
9594 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
9595   DeclarationNameInfo DirName;
9596   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9597       OMPD_sections, DirName, nullptr, D->getBeginLoc());
9598   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9599   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9600   return Res;
9601 }
9602 
9603 template <typename Derived>
9604 StmtResult
9605 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
9606   DeclarationNameInfo DirName;
9607   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9608       OMPD_section, DirName, nullptr, D->getBeginLoc());
9609   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9610   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9611   return Res;
9612 }
9613 
9614 template <typename Derived>
9615 StmtResult
9616 TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *D) {
9617   DeclarationNameInfo DirName;
9618   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9619       OMPD_scope, DirName, nullptr, D->getBeginLoc());
9620   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9621   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9622   return Res;
9623 }
9624 
9625 template <typename Derived>
9626 StmtResult
9627 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
9628   DeclarationNameInfo DirName;
9629   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9630       OMPD_single, DirName, nullptr, D->getBeginLoc());
9631   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9632   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9633   return Res;
9634 }
9635 
9636 template <typename Derived>
9637 StmtResult
9638 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
9639   DeclarationNameInfo DirName;
9640   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9641       OMPD_master, DirName, nullptr, D->getBeginLoc());
9642   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9643   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9644   return Res;
9645 }
9646 
9647 template <typename Derived>
9648 StmtResult
9649 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
9650   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9651       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
9652   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9653   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9654   return Res;
9655 }
9656 
9657 template <typename Derived>
9658 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
9659     OMPParallelForDirective *D) {
9660   DeclarationNameInfo DirName;
9661   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9662       OMPD_parallel_for, DirName, nullptr, D->getBeginLoc());
9663   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9664   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9665   return Res;
9666 }
9667 
9668 template <typename Derived>
9669 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
9670     OMPParallelForSimdDirective *D) {
9671   DeclarationNameInfo DirName;
9672   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9673       OMPD_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9674   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9675   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9676   return Res;
9677 }
9678 
9679 template <typename Derived>
9680 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
9681     OMPParallelMasterDirective *D) {
9682   DeclarationNameInfo DirName;
9683   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9684       OMPD_parallel_master, DirName, nullptr, D->getBeginLoc());
9685   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9686   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9687   return Res;
9688 }
9689 
9690 template <typename Derived>
9691 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
9692     OMPParallelMaskedDirective *D) {
9693   DeclarationNameInfo DirName;
9694   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9695       OMPD_parallel_masked, DirName, nullptr, D->getBeginLoc());
9696   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9697   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9698   return Res;
9699 }
9700 
9701 template <typename Derived>
9702 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
9703     OMPParallelSectionsDirective *D) {
9704   DeclarationNameInfo DirName;
9705   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9706       OMPD_parallel_sections, DirName, nullptr, D->getBeginLoc());
9707   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9708   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9709   return Res;
9710 }
9711 
9712 template <typename Derived>
9713 StmtResult
9714 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
9715   DeclarationNameInfo DirName;
9716   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9717       OMPD_task, DirName, nullptr, D->getBeginLoc());
9718   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9719   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9720   return Res;
9721 }
9722 
9723 template <typename Derived>
9724 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
9725     OMPTaskyieldDirective *D) {
9726   DeclarationNameInfo DirName;
9727   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9728       OMPD_taskyield, DirName, nullptr, D->getBeginLoc());
9729   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9730   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9731   return Res;
9732 }
9733 
9734 template <typename Derived>
9735 StmtResult
9736 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
9737   DeclarationNameInfo DirName;
9738   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9739       OMPD_barrier, DirName, nullptr, D->getBeginLoc());
9740   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9741   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9742   return Res;
9743 }
9744 
9745 template <typename Derived>
9746 StmtResult
9747 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
9748   DeclarationNameInfo DirName;
9749   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9750       OMPD_taskwait, DirName, nullptr, D->getBeginLoc());
9751   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9752   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9753   return Res;
9754 }
9755 
9756 template <typename Derived>
9757 StmtResult
9758 TreeTransform<Derived>::TransformOMPAssumeDirective(OMPAssumeDirective *D) {
9759   DeclarationNameInfo DirName;
9760   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9761       OMPD_assume, DirName, nullptr, D->getBeginLoc());
9762   StmtResult Res = getDerived().TransformOMPInformationalDirective(D);
9763   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9764   return Res;
9765 }
9766 
9767 template <typename Derived>
9768 StmtResult
9769 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) {
9770   DeclarationNameInfo DirName;
9771   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9772       OMPD_error, DirName, nullptr, D->getBeginLoc());
9773   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9774   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9775   return Res;
9776 }
9777 
9778 template <typename Derived>
9779 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
9780     OMPTaskgroupDirective *D) {
9781   DeclarationNameInfo DirName;
9782   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9783       OMPD_taskgroup, DirName, nullptr, D->getBeginLoc());
9784   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9785   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9786   return Res;
9787 }
9788 
9789 template <typename Derived>
9790 StmtResult
9791 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
9792   DeclarationNameInfo DirName;
9793   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9794       OMPD_flush, DirName, nullptr, D->getBeginLoc());
9795   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9796   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9797   return Res;
9798 }
9799 
9800 template <typename Derived>
9801 StmtResult
9802 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
9803   DeclarationNameInfo DirName;
9804   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9805       OMPD_depobj, DirName, nullptr, D->getBeginLoc());
9806   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9807   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9808   return Res;
9809 }
9810 
9811 template <typename Derived>
9812 StmtResult
9813 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
9814   DeclarationNameInfo DirName;
9815   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9816       OMPD_scan, DirName, nullptr, D->getBeginLoc());
9817   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9818   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9819   return Res;
9820 }
9821 
9822 template <typename Derived>
9823 StmtResult
9824 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
9825   DeclarationNameInfo DirName;
9826   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9827       OMPD_ordered, DirName, nullptr, D->getBeginLoc());
9828   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9829   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9830   return Res;
9831 }
9832 
9833 template <typename Derived>
9834 StmtResult
9835 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
9836   DeclarationNameInfo DirName;
9837   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9838       OMPD_atomic, DirName, nullptr, D->getBeginLoc());
9839   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9840   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9841   return Res;
9842 }
9843 
9844 template <typename Derived>
9845 StmtResult
9846 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
9847   DeclarationNameInfo DirName;
9848   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9849       OMPD_target, DirName, nullptr, D->getBeginLoc());
9850   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9851   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9852   return Res;
9853 }
9854 
9855 template <typename Derived>
9856 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9857     OMPTargetDataDirective *D) {
9858   DeclarationNameInfo DirName;
9859   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9860       OMPD_target_data, DirName, nullptr, D->getBeginLoc());
9861   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9862   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9863   return Res;
9864 }
9865 
9866 template <typename Derived>
9867 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9868     OMPTargetEnterDataDirective *D) {
9869   DeclarationNameInfo DirName;
9870   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9871       OMPD_target_enter_data, DirName, nullptr, D->getBeginLoc());
9872   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9873   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9874   return Res;
9875 }
9876 
9877 template <typename Derived>
9878 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9879     OMPTargetExitDataDirective *D) {
9880   DeclarationNameInfo DirName;
9881   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9882       OMPD_target_exit_data, DirName, nullptr, D->getBeginLoc());
9883   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9884   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9885   return Res;
9886 }
9887 
9888 template <typename Derived>
9889 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9890     OMPTargetParallelDirective *D) {
9891   DeclarationNameInfo DirName;
9892   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9893       OMPD_target_parallel, DirName, nullptr, D->getBeginLoc());
9894   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9895   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9896   return Res;
9897 }
9898 
9899 template <typename Derived>
9900 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9901     OMPTargetParallelForDirective *D) {
9902   DeclarationNameInfo DirName;
9903   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9904       OMPD_target_parallel_for, DirName, nullptr, D->getBeginLoc());
9905   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9906   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9907   return Res;
9908 }
9909 
9910 template <typename Derived>
9911 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9912     OMPTargetUpdateDirective *D) {
9913   DeclarationNameInfo DirName;
9914   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9915       OMPD_target_update, DirName, nullptr, D->getBeginLoc());
9916   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9917   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9918   return Res;
9919 }
9920 
9921 template <typename Derived>
9922 StmtResult
9923 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
9924   DeclarationNameInfo DirName;
9925   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9926       OMPD_teams, DirName, nullptr, D->getBeginLoc());
9927   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9928   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9929   return Res;
9930 }
9931 
9932 template <typename Derived>
9933 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9934     OMPCancellationPointDirective *D) {
9935   DeclarationNameInfo DirName;
9936   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9937       OMPD_cancellation_point, DirName, nullptr, D->getBeginLoc());
9938   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9939   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9940   return Res;
9941 }
9942 
9943 template <typename Derived>
9944 StmtResult
9945 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
9946   DeclarationNameInfo DirName;
9947   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9948       OMPD_cancel, DirName, nullptr, D->getBeginLoc());
9949   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9950   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9951   return Res;
9952 }
9953 
9954 template <typename Derived>
9955 StmtResult
9956 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
9957   DeclarationNameInfo DirName;
9958   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9959       OMPD_taskloop, DirName, nullptr, D->getBeginLoc());
9960   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9961   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9962   return Res;
9963 }
9964 
9965 template <typename Derived>
9966 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9967     OMPTaskLoopSimdDirective *D) {
9968   DeclarationNameInfo DirName;
9969   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9970       OMPD_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9971   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9972   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9973   return Res;
9974 }
9975 
9976 template <typename Derived>
9977 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9978     OMPMasterTaskLoopDirective *D) {
9979   DeclarationNameInfo DirName;
9980   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9981       OMPD_master_taskloop, DirName, nullptr, D->getBeginLoc());
9982   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9983   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9984   return Res;
9985 }
9986 
9987 template <typename Derived>
9988 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9989     OMPMaskedTaskLoopDirective *D) {
9990   DeclarationNameInfo DirName;
9991   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
9992       OMPD_masked_taskloop, DirName, nullptr, D->getBeginLoc());
9993   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9994   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
9995   return Res;
9996 }
9997 
9998 template <typename Derived>
9999 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
10000     OMPMasterTaskLoopSimdDirective *D) {
10001   DeclarationNameInfo DirName;
10002   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10003       OMPD_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
10004   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10005   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10006   return Res;
10007 }
10008 
10009 template <typename Derived>
10010 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
10011     OMPMaskedTaskLoopSimdDirective *D) {
10012   DeclarationNameInfo DirName;
10013   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10014       OMPD_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
10015   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10016   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10017   return Res;
10018 }
10019 
10020 template <typename Derived>
10021 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
10022     OMPParallelMasterTaskLoopDirective *D) {
10023   DeclarationNameInfo DirName;
10024   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10025       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
10026   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10027   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10028   return Res;
10029 }
10030 
10031 template <typename Derived>
10032 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
10033     OMPParallelMaskedTaskLoopDirective *D) {
10034   DeclarationNameInfo DirName;
10035   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10036       OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc());
10037   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10038   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10039   return Res;
10040 }
10041 
10042 template <typename Derived>
10043 StmtResult
10044 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
10045     OMPParallelMasterTaskLoopSimdDirective *D) {
10046   DeclarationNameInfo DirName;
10047   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10048       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
10049   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10050   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10051   return Res;
10052 }
10053 
10054 template <typename Derived>
10055 StmtResult
10056 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
10057     OMPParallelMaskedTaskLoopSimdDirective *D) {
10058   DeclarationNameInfo DirName;
10059   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10060       OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
10061   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10062   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10063   return Res;
10064 }
10065 
10066 template <typename Derived>
10067 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
10068     OMPDistributeDirective *D) {
10069   DeclarationNameInfo DirName;
10070   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10071       OMPD_distribute, DirName, nullptr, D->getBeginLoc());
10072   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10073   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10074   return Res;
10075 }
10076 
10077 template <typename Derived>
10078 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
10079     OMPDistributeParallelForDirective *D) {
10080   DeclarationNameInfo DirName;
10081   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10082       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
10083   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10084   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10085   return Res;
10086 }
10087 
10088 template <typename Derived>
10089 StmtResult
10090 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
10091     OMPDistributeParallelForSimdDirective *D) {
10092   DeclarationNameInfo DirName;
10093   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10094       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
10095   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10096   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10097   return Res;
10098 }
10099 
10100 template <typename Derived>
10101 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
10102     OMPDistributeSimdDirective *D) {
10103   DeclarationNameInfo DirName;
10104   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10105       OMPD_distribute_simd, DirName, nullptr, D->getBeginLoc());
10106   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10107   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10108   return Res;
10109 }
10110 
10111 template <typename Derived>
10112 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
10113     OMPTargetParallelForSimdDirective *D) {
10114   DeclarationNameInfo DirName;
10115   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10116       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
10117   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10118   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10119   return Res;
10120 }
10121 
10122 template <typename Derived>
10123 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
10124     OMPTargetSimdDirective *D) {
10125   DeclarationNameInfo DirName;
10126   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10127       OMPD_target_simd, DirName, nullptr, D->getBeginLoc());
10128   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10129   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10130   return Res;
10131 }
10132 
10133 template <typename Derived>
10134 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
10135     OMPTeamsDistributeDirective *D) {
10136   DeclarationNameInfo DirName;
10137   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10138       OMPD_teams_distribute, DirName, nullptr, D->getBeginLoc());
10139   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10140   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10141   return Res;
10142 }
10143 
10144 template <typename Derived>
10145 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
10146     OMPTeamsDistributeSimdDirective *D) {
10147   DeclarationNameInfo DirName;
10148   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10149       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
10150   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10151   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10152   return Res;
10153 }
10154 
10155 template <typename Derived>
10156 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
10157     OMPTeamsDistributeParallelForSimdDirective *D) {
10158   DeclarationNameInfo DirName;
10159   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10160       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
10161       D->getBeginLoc());
10162   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10163   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10164   return Res;
10165 }
10166 
10167 template <typename Derived>
10168 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
10169     OMPTeamsDistributeParallelForDirective *D) {
10170   DeclarationNameInfo DirName;
10171   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10172       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
10173   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10174   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10175   return Res;
10176 }
10177 
10178 template <typename Derived>
10179 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
10180     OMPTargetTeamsDirective *D) {
10181   DeclarationNameInfo DirName;
10182   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10183       OMPD_target_teams, DirName, nullptr, D->getBeginLoc());
10184   auto Res = getDerived().TransformOMPExecutableDirective(D);
10185   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10186   return Res;
10187 }
10188 
10189 template <typename Derived>
10190 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
10191     OMPTargetTeamsDistributeDirective *D) {
10192   DeclarationNameInfo DirName;
10193   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10194       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
10195   auto Res = getDerived().TransformOMPExecutableDirective(D);
10196   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10197   return Res;
10198 }
10199 
10200 template <typename Derived>
10201 StmtResult
10202 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
10203     OMPTargetTeamsDistributeParallelForDirective *D) {
10204   DeclarationNameInfo DirName;
10205   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10206       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
10207       D->getBeginLoc());
10208   auto Res = getDerived().TransformOMPExecutableDirective(D);
10209   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10210   return Res;
10211 }
10212 
10213 template <typename Derived>
10214 StmtResult TreeTransform<Derived>::
10215     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
10216         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
10217   DeclarationNameInfo DirName;
10218   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10219       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
10220       D->getBeginLoc());
10221   auto Res = getDerived().TransformOMPExecutableDirective(D);
10222   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10223   return Res;
10224 }
10225 
10226 template <typename Derived>
10227 StmtResult
10228 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
10229     OMPTargetTeamsDistributeSimdDirective *D) {
10230   DeclarationNameInfo DirName;
10231   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10232       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
10233   auto Res = getDerived().TransformOMPExecutableDirective(D);
10234   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10235   return Res;
10236 }
10237 
10238 template <typename Derived>
10239 StmtResult
10240 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
10241   DeclarationNameInfo DirName;
10242   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10243       OMPD_interop, DirName, nullptr, D->getBeginLoc());
10244   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10245   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10246   return Res;
10247 }
10248 
10249 template <typename Derived>
10250 StmtResult
10251 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
10252   DeclarationNameInfo DirName;
10253   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10254       OMPD_dispatch, DirName, nullptr, D->getBeginLoc());
10255   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10256   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10257   return Res;
10258 }
10259 
10260 template <typename Derived>
10261 StmtResult
10262 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
10263   DeclarationNameInfo DirName;
10264   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10265       OMPD_masked, DirName, nullptr, D->getBeginLoc());
10266   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10267   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10268   return Res;
10269 }
10270 
10271 template <typename Derived>
10272 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
10273     OMPGenericLoopDirective *D) {
10274   DeclarationNameInfo DirName;
10275   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10276       OMPD_loop, DirName, nullptr, D->getBeginLoc());
10277   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10278   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10279   return Res;
10280 }
10281 
10282 template <typename Derived>
10283 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
10284     OMPTeamsGenericLoopDirective *D) {
10285   DeclarationNameInfo DirName;
10286   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10287       OMPD_teams_loop, DirName, nullptr, D->getBeginLoc());
10288   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10289   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10290   return Res;
10291 }
10292 
10293 template <typename Derived>
10294 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
10295     OMPTargetTeamsGenericLoopDirective *D) {
10296   DeclarationNameInfo DirName;
10297   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10298       OMPD_target_teams_loop, DirName, nullptr, D->getBeginLoc());
10299   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10300   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10301   return Res;
10302 }
10303 
10304 template <typename Derived>
10305 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
10306     OMPParallelGenericLoopDirective *D) {
10307   DeclarationNameInfo DirName;
10308   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10309       OMPD_parallel_loop, DirName, nullptr, D->getBeginLoc());
10310   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10311   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10312   return Res;
10313 }
10314 
10315 template <typename Derived>
10316 StmtResult
10317 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
10318     OMPTargetParallelGenericLoopDirective *D) {
10319   DeclarationNameInfo DirName;
10320   getDerived().getSema().OpenMP().StartOpenMPDSABlock(
10321       OMPD_target_parallel_loop, DirName, nullptr, D->getBeginLoc());
10322   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
10323   getDerived().getSema().OpenMP().EndOpenMPDSABlock(Res.get());
10324   return Res;
10325 }
10326 
10327 //===----------------------------------------------------------------------===//
10328 // OpenMP clause transformation
10329 //===----------------------------------------------------------------------===//
10330 template <typename Derived>
10331 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
10332   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10333   if (Cond.isInvalid())
10334     return nullptr;
10335   return getDerived().RebuildOMPIfClause(
10336       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
10337       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
10338 }
10339 
10340 template <typename Derived>
10341 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
10342   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10343   if (Cond.isInvalid())
10344     return nullptr;
10345   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
10346                                             C->getLParenLoc(), C->getEndLoc());
10347 }
10348 
10349 template <typename Derived>
10350 OMPClause *
10351 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
10352   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
10353   if (NumThreads.isInvalid())
10354     return nullptr;
10355   return getDerived().RebuildOMPNumThreadsClause(
10356       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10357 }
10358 
10359 template <typename Derived>
10360 OMPClause *
10361 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
10362   ExprResult E = getDerived().TransformExpr(C->getSafelen());
10363   if (E.isInvalid())
10364     return nullptr;
10365   return getDerived().RebuildOMPSafelenClause(
10366       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10367 }
10368 
10369 template <typename Derived>
10370 OMPClause *
10371 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
10372   ExprResult E = getDerived().TransformExpr(C->getAllocator());
10373   if (E.isInvalid())
10374     return nullptr;
10375   return getDerived().RebuildOMPAllocatorClause(
10376       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10377 }
10378 
10379 template <typename Derived>
10380 OMPClause *
10381 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
10382   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
10383   if (E.isInvalid())
10384     return nullptr;
10385   return getDerived().RebuildOMPSimdlenClause(
10386       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10387 }
10388 
10389 template <typename Derived>
10390 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
10391   SmallVector<Expr *, 4> TransformedSizes;
10392   TransformedSizes.reserve(C->getNumSizes());
10393   bool Changed = false;
10394   for (Expr *E : C->getSizesRefs()) {
10395     if (!E) {
10396       TransformedSizes.push_back(nullptr);
10397       continue;
10398     }
10399 
10400     ExprResult T = getDerived().TransformExpr(E);
10401     if (T.isInvalid())
10402       return nullptr;
10403     if (E != T.get())
10404       Changed = true;
10405     TransformedSizes.push_back(T.get());
10406   }
10407 
10408   if (!Changed && !getDerived().AlwaysRebuild())
10409     return C;
10410   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
10411                                C->getLParenLoc(), C->getEndLoc());
10412 }
10413 
10414 template <typename Derived>
10415 OMPClause *
10416 TreeTransform<Derived>::TransformOMPPermutationClause(OMPPermutationClause *C) {
10417   SmallVector<Expr *> TransformedArgs;
10418   TransformedArgs.reserve(C->getNumLoops());
10419   bool Changed = false;
10420   for (Expr *E : C->getArgsRefs()) {
10421     if (!E) {
10422       TransformedArgs.push_back(nullptr);
10423       continue;
10424     }
10425 
10426     ExprResult T = getDerived().TransformExpr(E);
10427     if (T.isInvalid())
10428       return nullptr;
10429     if (E != T.get())
10430       Changed = true;
10431     TransformedArgs.push_back(T.get());
10432   }
10433 
10434   if (!Changed && !getDerived().AlwaysRebuild())
10435     return C;
10436   return RebuildOMPPermutationClause(TransformedArgs, C->getBeginLoc(),
10437                                      C->getLParenLoc(), C->getEndLoc());
10438 }
10439 
10440 template <typename Derived>
10441 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
10442   if (!getDerived().AlwaysRebuild())
10443     return C;
10444   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
10445 }
10446 
10447 template <typename Derived>
10448 OMPClause *
10449 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
10450   ExprResult T = getDerived().TransformExpr(C->getFactor());
10451   if (T.isInvalid())
10452     return nullptr;
10453   Expr *Factor = T.get();
10454   bool Changed = Factor != C->getFactor();
10455 
10456   if (!Changed && !getDerived().AlwaysRebuild())
10457     return C;
10458   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
10459                                  C->getEndLoc());
10460 }
10461 
10462 template <typename Derived>
10463 OMPClause *
10464 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
10465   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
10466   if (E.isInvalid())
10467     return nullptr;
10468   return getDerived().RebuildOMPCollapseClause(
10469       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10470 }
10471 
10472 template <typename Derived>
10473 OMPClause *
10474 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
10475   return getDerived().RebuildOMPDefaultClause(
10476       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
10477       C->getLParenLoc(), C->getEndLoc());
10478 }
10479 
10480 template <typename Derived>
10481 OMPClause *
10482 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
10483   return getDerived().RebuildOMPProcBindClause(
10484       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
10485       C->getLParenLoc(), C->getEndLoc());
10486 }
10487 
10488 template <typename Derived>
10489 OMPClause *
10490 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
10491   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10492   if (E.isInvalid())
10493     return nullptr;
10494   return getDerived().RebuildOMPScheduleClause(
10495       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
10496       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10497       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
10498       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10499 }
10500 
10501 template <typename Derived>
10502 OMPClause *
10503 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
10504   ExprResult E;
10505   if (auto *Num = C->getNumForLoops()) {
10506     E = getDerived().TransformExpr(Num);
10507     if (E.isInvalid())
10508       return nullptr;
10509   }
10510   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
10511                                               C->getLParenLoc(), E.get());
10512 }
10513 
10514 template <typename Derived>
10515 OMPClause *
10516 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
10517   ExprResult E;
10518   if (Expr *Evt = C->getEventHandler()) {
10519     E = getDerived().TransformExpr(Evt);
10520     if (E.isInvalid())
10521       return nullptr;
10522   }
10523   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
10524                                              C->getLParenLoc(), C->getEndLoc());
10525 }
10526 
10527 template <typename Derived>
10528 OMPClause *
10529 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
10530   // No need to rebuild this clause, no template-dependent parameters.
10531   return C;
10532 }
10533 
10534 template <typename Derived>
10535 OMPClause *
10536 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
10537   // No need to rebuild this clause, no template-dependent parameters.
10538   return C;
10539 }
10540 
10541 template <typename Derived>
10542 OMPClause *
10543 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
10544   // No need to rebuild this clause, no template-dependent parameters.
10545   return C;
10546 }
10547 
10548 template <typename Derived>
10549 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
10550   // No need to rebuild this clause, no template-dependent parameters.
10551   return C;
10552 }
10553 
10554 template <typename Derived>
10555 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
10556   // No need to rebuild this clause, no template-dependent parameters.
10557   return C;
10558 }
10559 
10560 template <typename Derived>
10561 OMPClause *
10562 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
10563   // No need to rebuild this clause, no template-dependent parameters.
10564   return C;
10565 }
10566 
10567 template <typename Derived>
10568 OMPClause *
10569 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
10570   // No need to rebuild this clause, no template-dependent parameters.
10571   return C;
10572 }
10573 
10574 template <typename Derived>
10575 OMPClause *
10576 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
10577   // No need to rebuild this clause, no template-dependent parameters.
10578   return C;
10579 }
10580 
10581 template <typename Derived>
10582 OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *C) {
10583   // No need to rebuild this clause, no template-dependent parameters.
10584   return C;
10585 }
10586 
10587 template <typename Derived>
10588 OMPClause *
10589 TreeTransform<Derived>::TransformOMPAbsentClause(OMPAbsentClause *C) {
10590   return C;
10591 }
10592 
10593 template <typename Derived>
10594 OMPClause *TreeTransform<Derived>::TransformOMPHoldsClause(OMPHoldsClause *C) {
10595   ExprResult E = getDerived().TransformExpr(C->getExpr());
10596   if (E.isInvalid())
10597     return nullptr;
10598   return getDerived().RebuildOMPHoldsClause(E.get(), C->getBeginLoc(),
10599                                             C->getLParenLoc(), C->getEndLoc());
10600 }
10601 
10602 template <typename Derived>
10603 OMPClause *
10604 TreeTransform<Derived>::TransformOMPContainsClause(OMPContainsClause *C) {
10605   return C;
10606 }
10607 
10608 template <typename Derived>
10609 OMPClause *
10610 TreeTransform<Derived>::TransformOMPNoOpenMPClause(OMPNoOpenMPClause *C) {
10611   return C;
10612 }
10613 template <typename Derived>
10614 OMPClause *TreeTransform<Derived>::TransformOMPNoOpenMPRoutinesClause(
10615     OMPNoOpenMPRoutinesClause *C) {
10616   return C;
10617 }
10618 template <typename Derived>
10619 OMPClause *TreeTransform<Derived>::TransformOMPNoParallelismClause(
10620     OMPNoParallelismClause *C) {
10621   return C;
10622 }
10623 
10624 template <typename Derived>
10625 OMPClause *
10626 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
10627   // No need to rebuild this clause, no template-dependent parameters.
10628   return C;
10629 }
10630 
10631 template <typename Derived>
10632 OMPClause *
10633 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
10634   // No need to rebuild this clause, no template-dependent parameters.
10635   return C;
10636 }
10637 
10638 template <typename Derived>
10639 OMPClause *
10640 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
10641   // No need to rebuild this clause, no template-dependent parameters.
10642   return C;
10643 }
10644 
10645 template <typename Derived>
10646 OMPClause *
10647 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
10648   // No need to rebuild this clause, no template-dependent parameters.
10649   return C;
10650 }
10651 
10652 template <typename Derived>
10653 OMPClause *
10654 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
10655   // No need to rebuild this clause, no template-dependent parameters.
10656   return C;
10657 }
10658 
10659 template <typename Derived>
10660 OMPClause *TreeTransform<Derived>::TransformOMPWeakClause(OMPWeakClause *C) {
10661   // No need to rebuild this clause, no template-dependent parameters.
10662   return C;
10663 }
10664 
10665 template <typename Derived>
10666 OMPClause *
10667 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
10668   // No need to rebuild this clause, no template-dependent parameters.
10669   return C;
10670 }
10671 
10672 template <typename Derived>
10673 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
10674   // No need to rebuild this clause, no template-dependent parameters.
10675   return C;
10676 }
10677 
10678 template <typename Derived>
10679 OMPClause *
10680 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
10681   // No need to rebuild this clause, no template-dependent parameters.
10682   return C;
10683 }
10684 
10685 template <typename Derived>
10686 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
10687   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
10688   if (IVR.isInvalid())
10689     return nullptr;
10690 
10691   OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
10692   InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
10693   for (Expr *E : llvm::drop_begin(C->varlist())) {
10694     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
10695     if (ER.isInvalid())
10696       return nullptr;
10697     InteropInfo.PreferTypes.push_back(ER.get());
10698   }
10699   return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
10700                                            C->getBeginLoc(), C->getLParenLoc(),
10701                                            C->getVarLoc(), C->getEndLoc());
10702 }
10703 
10704 template <typename Derived>
10705 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
10706   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
10707   if (ER.isInvalid())
10708     return nullptr;
10709   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
10710                                           C->getLParenLoc(), C->getVarLoc(),
10711                                           C->getEndLoc());
10712 }
10713 
10714 template <typename Derived>
10715 OMPClause *
10716 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
10717   ExprResult ER;
10718   if (Expr *IV = C->getInteropVar()) {
10719     ER = getDerived().TransformExpr(IV);
10720     if (ER.isInvalid())
10721       return nullptr;
10722   }
10723   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
10724                                               C->getLParenLoc(), C->getVarLoc(),
10725                                               C->getEndLoc());
10726 }
10727 
10728 template <typename Derived>
10729 OMPClause *
10730 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
10731   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10732   if (Cond.isInvalid())
10733     return nullptr;
10734   return getDerived().RebuildOMPNovariantsClause(
10735       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10736 }
10737 
10738 template <typename Derived>
10739 OMPClause *
10740 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
10741   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10742   if (Cond.isInvalid())
10743     return nullptr;
10744   return getDerived().RebuildOMPNocontextClause(
10745       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10746 }
10747 
10748 template <typename Derived>
10749 OMPClause *
10750 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
10751   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
10752   if (ThreadID.isInvalid())
10753     return nullptr;
10754   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
10755                                              C->getLParenLoc(), C->getEndLoc());
10756 }
10757 
10758 template <typename Derived>
10759 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
10760   ExprResult E = getDerived().TransformExpr(C->getAlignment());
10761   if (E.isInvalid())
10762     return nullptr;
10763   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
10764                                             C->getLParenLoc(), C->getEndLoc());
10765 }
10766 
10767 template <typename Derived>
10768 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
10769     OMPUnifiedAddressClause *C) {
10770   llvm_unreachable("unified_address clause cannot appear in dependent context");
10771 }
10772 
10773 template <typename Derived>
10774 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
10775     OMPUnifiedSharedMemoryClause *C) {
10776   llvm_unreachable(
10777       "unified_shared_memory clause cannot appear in dependent context");
10778 }
10779 
10780 template <typename Derived>
10781 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
10782     OMPReverseOffloadClause *C) {
10783   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
10784 }
10785 
10786 template <typename Derived>
10787 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
10788     OMPDynamicAllocatorsClause *C) {
10789   llvm_unreachable(
10790       "dynamic_allocators clause cannot appear in dependent context");
10791 }
10792 
10793 template <typename Derived>
10794 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
10795     OMPAtomicDefaultMemOrderClause *C) {
10796   llvm_unreachable(
10797       "atomic_default_mem_order clause cannot appear in dependent context");
10798 }
10799 
10800 template <typename Derived>
10801 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) {
10802   return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(),
10803                                          C->getBeginLoc(), C->getLParenLoc(),
10804                                          C->getEndLoc());
10805 }
10806 
10807 template <typename Derived>
10808 OMPClause *
10809 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) {
10810   return getDerived().RebuildOMPSeverityClause(
10811       C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(),
10812       C->getLParenLoc(), C->getEndLoc());
10813 }
10814 
10815 template <typename Derived>
10816 OMPClause *
10817 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) {
10818   ExprResult E = getDerived().TransformExpr(C->getMessageString());
10819   if (E.isInvalid())
10820     return nullptr;
10821   return getDerived().RebuildOMPMessageClause(
10822       C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(),
10823       C->getEndLoc());
10824 }
10825 
10826 template <typename Derived>
10827 OMPClause *
10828 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
10829   llvm::SmallVector<Expr *, 16> Vars;
10830   Vars.reserve(C->varlist_size());
10831   for (auto *VE : C->varlist()) {
10832     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10833     if (EVar.isInvalid())
10834       return nullptr;
10835     Vars.push_back(EVar.get());
10836   }
10837   return getDerived().RebuildOMPPrivateClause(
10838       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10839 }
10840 
10841 template <typename Derived>
10842 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
10843     OMPFirstprivateClause *C) {
10844   llvm::SmallVector<Expr *, 16> Vars;
10845   Vars.reserve(C->varlist_size());
10846   for (auto *VE : C->varlist()) {
10847     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10848     if (EVar.isInvalid())
10849       return nullptr;
10850     Vars.push_back(EVar.get());
10851   }
10852   return getDerived().RebuildOMPFirstprivateClause(
10853       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10854 }
10855 
10856 template <typename Derived>
10857 OMPClause *
10858 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
10859   llvm::SmallVector<Expr *, 16> Vars;
10860   Vars.reserve(C->varlist_size());
10861   for (auto *VE : C->varlist()) {
10862     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10863     if (EVar.isInvalid())
10864       return nullptr;
10865     Vars.push_back(EVar.get());
10866   }
10867   return getDerived().RebuildOMPLastprivateClause(
10868       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
10869       C->getLParenLoc(), C->getEndLoc());
10870 }
10871 
10872 template <typename Derived>
10873 OMPClause *
10874 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
10875   llvm::SmallVector<Expr *, 16> Vars;
10876   Vars.reserve(C->varlist_size());
10877   for (auto *VE : C->varlist()) {
10878     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10879     if (EVar.isInvalid())
10880       return nullptr;
10881     Vars.push_back(EVar.get());
10882   }
10883   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
10884                                              C->getLParenLoc(), C->getEndLoc());
10885 }
10886 
10887 template <typename Derived>
10888 OMPClause *
10889 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
10890   llvm::SmallVector<Expr *, 16> Vars;
10891   Vars.reserve(C->varlist_size());
10892   for (auto *VE : C->varlist()) {
10893     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10894     if (EVar.isInvalid())
10895       return nullptr;
10896     Vars.push_back(EVar.get());
10897   }
10898   CXXScopeSpec ReductionIdScopeSpec;
10899   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10900 
10901   DeclarationNameInfo NameInfo = C->getNameInfo();
10902   if (NameInfo.getName()) {
10903     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10904     if (!NameInfo.getName())
10905       return nullptr;
10906   }
10907   // Build a list of all UDR decls with the same names ranged by the Scopes.
10908   // The Scope boundary is a duplication of the previous decl.
10909   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10910   for (auto *E : C->reduction_ops()) {
10911     // Transform all the decls.
10912     if (E) {
10913       auto *ULE = cast<UnresolvedLookupExpr>(E);
10914       UnresolvedSet<8> Decls;
10915       for (auto *D : ULE->decls()) {
10916         NamedDecl *InstD =
10917             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10918         Decls.addDecl(InstD, InstD->getAccess());
10919       }
10920       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10921           SemaRef.Context, /*NamingClass=*/nullptr,
10922           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10923           /*ADL=*/true, Decls.begin(), Decls.end(),
10924           /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false));
10925     } else
10926       UnresolvedReductions.push_back(nullptr);
10927   }
10928   return getDerived().RebuildOMPReductionClause(
10929       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10930       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10931       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10932 }
10933 
10934 template <typename Derived>
10935 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10936     OMPTaskReductionClause *C) {
10937   llvm::SmallVector<Expr *, 16> Vars;
10938   Vars.reserve(C->varlist_size());
10939   for (auto *VE : C->varlist()) {
10940     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10941     if (EVar.isInvalid())
10942       return nullptr;
10943     Vars.push_back(EVar.get());
10944   }
10945   CXXScopeSpec ReductionIdScopeSpec;
10946   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10947 
10948   DeclarationNameInfo NameInfo = C->getNameInfo();
10949   if (NameInfo.getName()) {
10950     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10951     if (!NameInfo.getName())
10952       return nullptr;
10953   }
10954   // Build a list of all UDR decls with the same names ranged by the Scopes.
10955   // The Scope boundary is a duplication of the previous decl.
10956   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10957   for (auto *E : C->reduction_ops()) {
10958     // Transform all the decls.
10959     if (E) {
10960       auto *ULE = cast<UnresolvedLookupExpr>(E);
10961       UnresolvedSet<8> Decls;
10962       for (auto *D : ULE->decls()) {
10963         NamedDecl *InstD =
10964             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10965         Decls.addDecl(InstD, InstD->getAccess());
10966       }
10967       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10968           SemaRef.Context, /*NamingClass=*/nullptr,
10969           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10970           /*ADL=*/true, Decls.begin(), Decls.end(),
10971           /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false));
10972     } else
10973       UnresolvedReductions.push_back(nullptr);
10974   }
10975   return getDerived().RebuildOMPTaskReductionClause(
10976       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10977       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10978 }
10979 
10980 template <typename Derived>
10981 OMPClause *
10982 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
10983   llvm::SmallVector<Expr *, 16> Vars;
10984   Vars.reserve(C->varlist_size());
10985   for (auto *VE : C->varlist()) {
10986     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10987     if (EVar.isInvalid())
10988       return nullptr;
10989     Vars.push_back(EVar.get());
10990   }
10991   CXXScopeSpec ReductionIdScopeSpec;
10992   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10993 
10994   DeclarationNameInfo NameInfo = C->getNameInfo();
10995   if (NameInfo.getName()) {
10996     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10997     if (!NameInfo.getName())
10998       return nullptr;
10999   }
11000   // Build a list of all UDR decls with the same names ranged by the Scopes.
11001   // The Scope boundary is a duplication of the previous decl.
11002   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
11003   for (auto *E : C->reduction_ops()) {
11004     // Transform all the decls.
11005     if (E) {
11006       auto *ULE = cast<UnresolvedLookupExpr>(E);
11007       UnresolvedSet<8> Decls;
11008       for (auto *D : ULE->decls()) {
11009         NamedDecl *InstD =
11010             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
11011         Decls.addDecl(InstD, InstD->getAccess());
11012       }
11013       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
11014           SemaRef.Context, /*NamingClass=*/nullptr,
11015           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
11016           /*ADL=*/true, Decls.begin(), Decls.end(),
11017           /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false));
11018     } else
11019       UnresolvedReductions.push_back(nullptr);
11020   }
11021   return getDerived().RebuildOMPInReductionClause(
11022       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
11023       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
11024 }
11025 
11026 template <typename Derived>
11027 OMPClause *
11028 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
11029   llvm::SmallVector<Expr *, 16> Vars;
11030   Vars.reserve(C->varlist_size());
11031   for (auto *VE : C->varlist()) {
11032     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11033     if (EVar.isInvalid())
11034       return nullptr;
11035     Vars.push_back(EVar.get());
11036   }
11037   ExprResult Step = getDerived().TransformExpr(C->getStep());
11038   if (Step.isInvalid())
11039     return nullptr;
11040   return getDerived().RebuildOMPLinearClause(
11041       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
11042       C->getModifierLoc(), C->getColonLoc(), C->getStepModifierLoc(),
11043       C->getEndLoc());
11044 }
11045 
11046 template <typename Derived>
11047 OMPClause *
11048 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
11049   llvm::SmallVector<Expr *, 16> Vars;
11050   Vars.reserve(C->varlist_size());
11051   for (auto *VE : C->varlist()) {
11052     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11053     if (EVar.isInvalid())
11054       return nullptr;
11055     Vars.push_back(EVar.get());
11056   }
11057   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
11058   if (Alignment.isInvalid())
11059     return nullptr;
11060   return getDerived().RebuildOMPAlignedClause(
11061       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
11062       C->getColonLoc(), C->getEndLoc());
11063 }
11064 
11065 template <typename Derived>
11066 OMPClause *
11067 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
11068   llvm::SmallVector<Expr *, 16> Vars;
11069   Vars.reserve(C->varlist_size());
11070   for (auto *VE : C->varlist()) {
11071     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11072     if (EVar.isInvalid())
11073       return nullptr;
11074     Vars.push_back(EVar.get());
11075   }
11076   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
11077                                              C->getLParenLoc(), C->getEndLoc());
11078 }
11079 
11080 template <typename Derived>
11081 OMPClause *
11082 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
11083   llvm::SmallVector<Expr *, 16> Vars;
11084   Vars.reserve(C->varlist_size());
11085   for (auto *VE : C->varlist()) {
11086     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11087     if (EVar.isInvalid())
11088       return nullptr;
11089     Vars.push_back(EVar.get());
11090   }
11091   return getDerived().RebuildOMPCopyprivateClause(
11092       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11093 }
11094 
11095 template <typename Derived>
11096 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
11097   llvm::SmallVector<Expr *, 16> Vars;
11098   Vars.reserve(C->varlist_size());
11099   for (auto *VE : C->varlist()) {
11100     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11101     if (EVar.isInvalid())
11102       return nullptr;
11103     Vars.push_back(EVar.get());
11104   }
11105   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
11106                                             C->getLParenLoc(), C->getEndLoc());
11107 }
11108 
11109 template <typename Derived>
11110 OMPClause *
11111 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
11112   ExprResult E = getDerived().TransformExpr(C->getDepobj());
11113   if (E.isInvalid())
11114     return nullptr;
11115   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
11116                                              C->getLParenLoc(), C->getEndLoc());
11117 }
11118 
11119 template <typename Derived>
11120 OMPClause *
11121 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
11122   llvm::SmallVector<Expr *, 16> Vars;
11123   Expr *DepModifier = C->getModifier();
11124   if (DepModifier) {
11125     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
11126     if (DepModRes.isInvalid())
11127       return nullptr;
11128     DepModifier = DepModRes.get();
11129   }
11130   Vars.reserve(C->varlist_size());
11131   for (auto *VE : C->varlist()) {
11132     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11133     if (EVar.isInvalid())
11134       return nullptr;
11135     Vars.push_back(EVar.get());
11136   }
11137   return getDerived().RebuildOMPDependClause(
11138       {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(),
11139        C->getOmpAllMemoryLoc()},
11140       DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11141 }
11142 
11143 template <typename Derived>
11144 OMPClause *
11145 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
11146   ExprResult E = getDerived().TransformExpr(C->getDevice());
11147   if (E.isInvalid())
11148     return nullptr;
11149   return getDerived().RebuildOMPDeviceClause(
11150       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
11151       C->getModifierLoc(), C->getEndLoc());
11152 }
11153 
11154 template <typename Derived, class T>
11155 bool transformOMPMappableExprListClause(
11156     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
11157     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
11158     DeclarationNameInfo &MapperIdInfo,
11159     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
11160   // Transform expressions in the list.
11161   Vars.reserve(C->varlist_size());
11162   for (auto *VE : C->varlist()) {
11163     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
11164     if (EVar.isInvalid())
11165       return true;
11166     Vars.push_back(EVar.get());
11167   }
11168   // Transform mapper scope specifier and identifier.
11169   NestedNameSpecifierLoc QualifierLoc;
11170   if (C->getMapperQualifierLoc()) {
11171     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
11172         C->getMapperQualifierLoc());
11173     if (!QualifierLoc)
11174       return true;
11175   }
11176   MapperIdScopeSpec.Adopt(QualifierLoc);
11177   MapperIdInfo = C->getMapperIdInfo();
11178   if (MapperIdInfo.getName()) {
11179     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
11180     if (!MapperIdInfo.getName())
11181       return true;
11182   }
11183   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
11184   // the previous user-defined mapper lookup in dependent environment.
11185   for (auto *E : C->mapperlists()) {
11186     // Transform all the decls.
11187     if (E) {
11188       auto *ULE = cast<UnresolvedLookupExpr>(E);
11189       UnresolvedSet<8> Decls;
11190       for (auto *D : ULE->decls()) {
11191         NamedDecl *InstD =
11192             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
11193         Decls.addDecl(InstD, InstD->getAccess());
11194       }
11195       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
11196           TT.getSema().Context, /*NamingClass=*/nullptr,
11197           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
11198           MapperIdInfo, /*ADL=*/true, Decls.begin(), Decls.end(),
11199           /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false));
11200     } else {
11201       UnresolvedMappers.push_back(nullptr);
11202     }
11203   }
11204   return false;
11205 }
11206 
11207 template <typename Derived>
11208 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
11209   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11210   llvm::SmallVector<Expr *, 16> Vars;
11211   Expr *IteratorModifier = C->getIteratorModifier();
11212   if (IteratorModifier) {
11213     ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
11214     if (MapModRes.isInvalid())
11215       return nullptr;
11216     IteratorModifier = MapModRes.get();
11217   }
11218   CXXScopeSpec MapperIdScopeSpec;
11219   DeclarationNameInfo MapperIdInfo;
11220   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
11221   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
11222           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11223     return nullptr;
11224   return getDerived().RebuildOMPMapClause(
11225       IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(),
11226       MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(),
11227       C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11228 }
11229 
11230 template <typename Derived>
11231 OMPClause *
11232 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
11233   Expr *Allocator = C->getAllocator();
11234   if (Allocator) {
11235     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
11236     if (AllocatorRes.isInvalid())
11237       return nullptr;
11238     Allocator = AllocatorRes.get();
11239   }
11240   Expr *Alignment = C->getAlignment();
11241   if (Alignment) {
11242     ExprResult AlignmentRes = getDerived().TransformExpr(Alignment);
11243     if (AlignmentRes.isInvalid())
11244       return nullptr;
11245     Alignment = AlignmentRes.get();
11246   }
11247   llvm::SmallVector<Expr *, 16> Vars;
11248   Vars.reserve(C->varlist_size());
11249   for (auto *VE : C->varlist()) {
11250     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11251     if (EVar.isInvalid())
11252       return nullptr;
11253     Vars.push_back(EVar.get());
11254   }
11255   return getDerived().RebuildOMPAllocateClause(
11256       Allocator, Alignment, C->getFirstAllocateModifier(),
11257       C->getFirstAllocateModifierLoc(), C->getSecondAllocateModifier(),
11258       C->getSecondAllocateModifierLoc(), Vars, C->getBeginLoc(),
11259       C->getLParenLoc(), C->getColonLoc(), C->getEndLoc());
11260 }
11261 
11262 template <typename Derived>
11263 OMPClause *
11264 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
11265   llvm::SmallVector<Expr *, 3> Vars;
11266   Vars.reserve(C->varlist_size());
11267   for (auto *VE : C->varlist()) {
11268     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11269     if (EVar.isInvalid())
11270       return nullptr;
11271     Vars.push_back(EVar.get());
11272   }
11273   return getDerived().RebuildOMPNumTeamsClause(
11274       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11275 }
11276 
11277 template <typename Derived>
11278 OMPClause *
11279 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
11280   llvm::SmallVector<Expr *, 3> Vars;
11281   Vars.reserve(C->varlist_size());
11282   for (auto *VE : C->varlist()) {
11283     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11284     if (EVar.isInvalid())
11285       return nullptr;
11286     Vars.push_back(EVar.get());
11287   }
11288   return getDerived().RebuildOMPThreadLimitClause(
11289       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11290 }
11291 
11292 template <typename Derived>
11293 OMPClause *
11294 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
11295   ExprResult E = getDerived().TransformExpr(C->getPriority());
11296   if (E.isInvalid())
11297     return nullptr;
11298   return getDerived().RebuildOMPPriorityClause(
11299       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11300 }
11301 
11302 template <typename Derived>
11303 OMPClause *
11304 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
11305   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
11306   if (E.isInvalid())
11307     return nullptr;
11308   return getDerived().RebuildOMPGrainsizeClause(
11309       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
11310       C->getModifierLoc(), C->getEndLoc());
11311 }
11312 
11313 template <typename Derived>
11314 OMPClause *
11315 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
11316   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
11317   if (E.isInvalid())
11318     return nullptr;
11319   return getDerived().RebuildOMPNumTasksClause(
11320       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
11321       C->getModifierLoc(), C->getEndLoc());
11322 }
11323 
11324 template <typename Derived>
11325 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
11326   ExprResult E = getDerived().TransformExpr(C->getHint());
11327   if (E.isInvalid())
11328     return nullptr;
11329   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
11330                                            C->getLParenLoc(), C->getEndLoc());
11331 }
11332 
11333 template <typename Derived>
11334 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
11335     OMPDistScheduleClause *C) {
11336   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
11337   if (E.isInvalid())
11338     return nullptr;
11339   return getDerived().RebuildOMPDistScheduleClause(
11340       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
11341       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
11342 }
11343 
11344 template <typename Derived>
11345 OMPClause *
11346 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
11347   // Rebuild Defaultmap Clause since we need to invoke the checking of
11348   // defaultmap(none:variable-category) after template initialization.
11349   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
11350                                                  C->getDefaultmapKind(),
11351                                                  C->getBeginLoc(),
11352                                                  C->getLParenLoc(),
11353                                                  C->getDefaultmapModifierLoc(),
11354                                                  C->getDefaultmapKindLoc(),
11355                                                  C->getEndLoc());
11356 }
11357 
11358 template <typename Derived>
11359 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
11360   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11361   llvm::SmallVector<Expr *, 16> Vars;
11362   CXXScopeSpec MapperIdScopeSpec;
11363   DeclarationNameInfo MapperIdInfo;
11364   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
11365   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
11366           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11367     return nullptr;
11368   return getDerived().RebuildOMPToClause(
11369       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
11370       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11371 }
11372 
11373 template <typename Derived>
11374 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
11375   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11376   llvm::SmallVector<Expr *, 16> Vars;
11377   CXXScopeSpec MapperIdScopeSpec;
11378   DeclarationNameInfo MapperIdInfo;
11379   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
11380   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
11381           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
11382     return nullptr;
11383   return getDerived().RebuildOMPFromClause(
11384       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
11385       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
11386 }
11387 
11388 template <typename Derived>
11389 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
11390     OMPUseDevicePtrClause *C) {
11391   llvm::SmallVector<Expr *, 16> Vars;
11392   Vars.reserve(C->varlist_size());
11393   for (auto *VE : C->varlist()) {
11394     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11395     if (EVar.isInvalid())
11396       return nullptr;
11397     Vars.push_back(EVar.get());
11398   }
11399   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11400   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
11401 }
11402 
11403 template <typename Derived>
11404 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
11405     OMPUseDeviceAddrClause *C) {
11406   llvm::SmallVector<Expr *, 16> Vars;
11407   Vars.reserve(C->varlist_size());
11408   for (auto *VE : C->varlist()) {
11409     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11410     if (EVar.isInvalid())
11411       return nullptr;
11412     Vars.push_back(EVar.get());
11413   }
11414   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11415   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
11416 }
11417 
11418 template <typename Derived>
11419 OMPClause *
11420 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
11421   llvm::SmallVector<Expr *, 16> Vars;
11422   Vars.reserve(C->varlist_size());
11423   for (auto *VE : C->varlist()) {
11424     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11425     if (EVar.isInvalid())
11426       return nullptr;
11427     Vars.push_back(EVar.get());
11428   }
11429   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11430   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
11431 }
11432 
11433 template <typename Derived>
11434 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
11435     OMPHasDeviceAddrClause *C) {
11436   llvm::SmallVector<Expr *, 16> Vars;
11437   Vars.reserve(C->varlist_size());
11438   for (auto *VE : C->varlist()) {
11439     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11440     if (EVar.isInvalid())
11441       return nullptr;
11442     Vars.push_back(EVar.get());
11443   }
11444   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11445   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
11446 }
11447 
11448 template <typename Derived>
11449 OMPClause *
11450 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
11451   llvm::SmallVector<Expr *, 16> Vars;
11452   Vars.reserve(C->varlist_size());
11453   for (auto *VE : C->varlist()) {
11454     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11455     if (EVar.isInvalid())
11456       return nullptr;
11457     Vars.push_back(EVar.get());
11458   }
11459   return getDerived().RebuildOMPNontemporalClause(
11460       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11461 }
11462 
11463 template <typename Derived>
11464 OMPClause *
11465 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
11466   llvm::SmallVector<Expr *, 16> Vars;
11467   Vars.reserve(C->varlist_size());
11468   for (auto *VE : C->varlist()) {
11469     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11470     if (EVar.isInvalid())
11471       return nullptr;
11472     Vars.push_back(EVar.get());
11473   }
11474   return getDerived().RebuildOMPInclusiveClause(
11475       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11476 }
11477 
11478 template <typename Derived>
11479 OMPClause *
11480 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
11481   llvm::SmallVector<Expr *, 16> Vars;
11482   Vars.reserve(C->varlist_size());
11483   for (auto *VE : C->varlist()) {
11484     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11485     if (EVar.isInvalid())
11486       return nullptr;
11487     Vars.push_back(EVar.get());
11488   }
11489   return getDerived().RebuildOMPExclusiveClause(
11490       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11491 }
11492 
11493 template <typename Derived>
11494 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
11495     OMPUsesAllocatorsClause *C) {
11496   SmallVector<SemaOpenMP::UsesAllocatorsData, 16> Data;
11497   Data.reserve(C->getNumberOfAllocators());
11498   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
11499     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
11500     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
11501     if (Allocator.isInvalid())
11502       continue;
11503     ExprResult AllocatorTraits;
11504     if (Expr *AT = D.AllocatorTraits) {
11505       AllocatorTraits = getDerived().TransformExpr(AT);
11506       if (AllocatorTraits.isInvalid())
11507         continue;
11508     }
11509     SemaOpenMP::UsesAllocatorsData &NewD = Data.emplace_back();
11510     NewD.Allocator = Allocator.get();
11511     NewD.AllocatorTraits = AllocatorTraits.get();
11512     NewD.LParenLoc = D.LParenLoc;
11513     NewD.RParenLoc = D.RParenLoc;
11514   }
11515   return getDerived().RebuildOMPUsesAllocatorsClause(
11516       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11517 }
11518 
11519 template <typename Derived>
11520 OMPClause *
11521 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
11522   SmallVector<Expr *, 4> Locators;
11523   Locators.reserve(C->varlist_size());
11524   ExprResult ModifierRes;
11525   if (Expr *Modifier = C->getModifier()) {
11526     ModifierRes = getDerived().TransformExpr(Modifier);
11527     if (ModifierRes.isInvalid())
11528       return nullptr;
11529   }
11530   for (Expr *E : C->varlist()) {
11531     ExprResult Locator = getDerived().TransformExpr(E);
11532     if (Locator.isInvalid())
11533       continue;
11534     Locators.push_back(Locator.get());
11535   }
11536   return getDerived().RebuildOMPAffinityClause(
11537       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
11538       ModifierRes.get(), Locators);
11539 }
11540 
11541 template <typename Derived>
11542 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
11543   return getDerived().RebuildOMPOrderClause(
11544       C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(),
11545       C->getEndLoc(), C->getModifier(), C->getModifierKwLoc());
11546 }
11547 
11548 template <typename Derived>
11549 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
11550   return getDerived().RebuildOMPBindClause(
11551       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
11552       C->getLParenLoc(), C->getEndLoc());
11553 }
11554 
11555 template <typename Derived>
11556 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
11557     OMPXDynCGroupMemClause *C) {
11558   ExprResult Size = getDerived().TransformExpr(C->getSize());
11559   if (Size.isInvalid())
11560     return nullptr;
11561   return getDerived().RebuildOMPXDynCGroupMemClause(
11562       Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11563 }
11564 
11565 template <typename Derived>
11566 OMPClause *
11567 TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *C) {
11568   llvm::SmallVector<Expr *, 16> Vars;
11569   Vars.reserve(C->varlist_size());
11570   for (auto *VE : C->varlist()) {
11571     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
11572     if (EVar.isInvalid())
11573       return nullptr;
11574     Vars.push_back(EVar.get());
11575   }
11576   return getDerived().RebuildOMPDoacrossClause(
11577       C->getDependenceType(), C->getDependenceLoc(), C->getColonLoc(), Vars,
11578       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11579 }
11580 
11581 template <typename Derived>
11582 OMPClause *
11583 TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *C) {
11584   SmallVector<const Attr *> NewAttrs;
11585   for (auto *A : C->getAttrs())
11586     NewAttrs.push_back(getDerived().TransformAttr(A));
11587   return getDerived().RebuildOMPXAttributeClause(
11588       NewAttrs, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
11589 }
11590 
11591 template <typename Derived>
11592 OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *C) {
11593   return getDerived().RebuildOMPXBareClause(C->getBeginLoc(), C->getEndLoc());
11594 }
11595 
11596 //===----------------------------------------------------------------------===//
11597 // OpenACC transformation
11598 //===----------------------------------------------------------------------===//
11599 namespace {
11600 template <typename Derived>
11601 class OpenACCClauseTransform final
11602     : public OpenACCClauseVisitor<OpenACCClauseTransform<Derived>> {
11603   TreeTransform<Derived> &Self;
11604   ArrayRef<const OpenACCClause *> ExistingClauses;
11605   SemaOpenACC::OpenACCParsedClause &ParsedClause;
11606   OpenACCClause *NewClause = nullptr;
11607 
11608   llvm::SmallVector<Expr *> VisitVarList(ArrayRef<Expr *> VarList) {
11609     llvm::SmallVector<Expr *> InstantiatedVarList;
11610     for (Expr *CurVar : VarList) {
11611       ExprResult Res = Self.TransformExpr(CurVar);
11612 
11613       if (!Res.isUsable())
11614         continue;
11615 
11616       Res = Self.getSema().OpenACC().ActOnVar(ParsedClause.getClauseKind(),
11617                                               Res.get());
11618 
11619       if (Res.isUsable())
11620         InstantiatedVarList.push_back(Res.get());
11621     }
11622 
11623     return InstantiatedVarList;
11624   }
11625 
11626 public:
11627   OpenACCClauseTransform(TreeTransform<Derived> &Self,
11628                          ArrayRef<const OpenACCClause *> ExistingClauses,
11629                          SemaOpenACC::OpenACCParsedClause &PC)
11630       : Self(Self), ExistingClauses(ExistingClauses), ParsedClause(PC) {}
11631 
11632   OpenACCClause *CreatedClause() const { return NewClause; }
11633 
11634 #define VISIT_CLAUSE(CLAUSE_NAME)                                              \
11635   void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
11636 #include "clang/Basic/OpenACCClauses.def"
11637 };
11638 
11639 template <typename Derived>
11640 void OpenACCClauseTransform<Derived>::VisitDefaultClause(
11641     const OpenACCDefaultClause &C) {
11642   ParsedClause.setDefaultDetails(C.getDefaultClauseKind());
11643 
11644   NewClause = OpenACCDefaultClause::Create(
11645       Self.getSema().getASTContext(), ParsedClause.getDefaultClauseKind(),
11646       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
11647       ParsedClause.getEndLoc());
11648 }
11649 
11650 template <typename Derived>
11651 void OpenACCClauseTransform<Derived>::VisitIfClause(const OpenACCIfClause &C) {
11652   Expr *Cond = const_cast<Expr *>(C.getConditionExpr());
11653   assert(Cond && "If constructed with invalid Condition");
11654   Sema::ConditionResult Res = Self.TransformCondition(
11655       Cond->getExprLoc(), /*Var=*/nullptr, Cond, Sema::ConditionKind::Boolean);
11656 
11657   if (Res.isInvalid() || !Res.get().second)
11658     return;
11659 
11660   ParsedClause.setConditionDetails(Res.get().second);
11661 
11662   NewClause = OpenACCIfClause::Create(
11663       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11664       ParsedClause.getLParenLoc(), ParsedClause.getConditionExpr(),
11665       ParsedClause.getEndLoc());
11666 }
11667 
11668 template <typename Derived>
11669 void OpenACCClauseTransform<Derived>::VisitSelfClause(
11670     const OpenACCSelfClause &C) {
11671 
11672   // If this is an 'update' 'self' clause, this is actually a var list instead.
11673   if (ParsedClause.getDirectiveKind() == OpenACCDirectiveKind::Update) {
11674     llvm::SmallVector<Expr *> InstantiatedVarList;
11675     for (Expr *CurVar : C.getVarList()) {
11676       ExprResult Res = Self.TransformExpr(CurVar);
11677 
11678       if (!Res.isUsable())
11679         continue;
11680 
11681       Res = Self.getSema().OpenACC().ActOnVar(ParsedClause.getClauseKind(),
11682                                               Res.get());
11683 
11684       if (Res.isUsable())
11685         InstantiatedVarList.push_back(Res.get());
11686     }
11687 
11688     ParsedClause.setVarListDetails(InstantiatedVarList,
11689                                    /*IsReadOnly=*/false, /*IsZero=*/false);
11690 
11691     NewClause = OpenACCSelfClause::Create(
11692         Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11693         ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11694         ParsedClause.getEndLoc());
11695   } else {
11696 
11697     if (C.hasConditionExpr()) {
11698       Expr *Cond = const_cast<Expr *>(C.getConditionExpr());
11699       Sema::ConditionResult Res =
11700           Self.TransformCondition(Cond->getExprLoc(), /*Var=*/nullptr, Cond,
11701                                   Sema::ConditionKind::Boolean);
11702 
11703       if (Res.isInvalid() || !Res.get().second)
11704         return;
11705 
11706       ParsedClause.setConditionDetails(Res.get().second);
11707     }
11708 
11709     NewClause = OpenACCSelfClause::Create(
11710         Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11711         ParsedClause.getLParenLoc(), ParsedClause.getConditionExpr(),
11712         ParsedClause.getEndLoc());
11713   }
11714 }
11715 
11716 template <typename Derived>
11717 void OpenACCClauseTransform<Derived>::VisitNumGangsClause(
11718     const OpenACCNumGangsClause &C) {
11719   llvm::SmallVector<Expr *> InstantiatedIntExprs;
11720 
11721   for (Expr *CurIntExpr : C.getIntExprs()) {
11722     ExprResult Res = Self.TransformExpr(CurIntExpr);
11723 
11724     if (!Res.isUsable())
11725       return;
11726 
11727     Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
11728                                                 C.getClauseKind(),
11729                                                 C.getBeginLoc(), Res.get());
11730     if (!Res.isUsable())
11731       return;
11732 
11733     InstantiatedIntExprs.push_back(Res.get());
11734   }
11735 
11736   ParsedClause.setIntExprDetails(InstantiatedIntExprs);
11737   NewClause = OpenACCNumGangsClause::Create(
11738       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11739       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs(),
11740       ParsedClause.getEndLoc());
11741 }
11742 
11743 template <typename Derived>
11744 void OpenACCClauseTransform<Derived>::VisitPrivateClause(
11745     const OpenACCPrivateClause &C) {
11746   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11747                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11748 
11749   NewClause = OpenACCPrivateClause::Create(
11750       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11751       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11752       ParsedClause.getEndLoc());
11753 }
11754 
11755 template <typename Derived>
11756 void OpenACCClauseTransform<Derived>::VisitHostClause(
11757     const OpenACCHostClause &C) {
11758   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11759                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11760 
11761   NewClause = OpenACCHostClause::Create(
11762       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11763       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11764       ParsedClause.getEndLoc());
11765 }
11766 
11767 template <typename Derived>
11768 void OpenACCClauseTransform<Derived>::VisitDeviceClause(
11769     const OpenACCDeviceClause &C) {
11770   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11771                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11772 
11773   NewClause = OpenACCDeviceClause::Create(
11774       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11775       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11776       ParsedClause.getEndLoc());
11777 }
11778 
11779 template <typename Derived>
11780 void OpenACCClauseTransform<Derived>::VisitFirstPrivateClause(
11781     const OpenACCFirstPrivateClause &C) {
11782   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11783                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11784 
11785   NewClause = OpenACCFirstPrivateClause::Create(
11786       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11787       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11788       ParsedClause.getEndLoc());
11789 }
11790 
11791 template <typename Derived>
11792 void OpenACCClauseTransform<Derived>::VisitNoCreateClause(
11793     const OpenACCNoCreateClause &C) {
11794   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11795                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11796 
11797   NewClause = OpenACCNoCreateClause::Create(
11798       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11799       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11800       ParsedClause.getEndLoc());
11801 }
11802 
11803 template <typename Derived>
11804 void OpenACCClauseTransform<Derived>::VisitPresentClause(
11805     const OpenACCPresentClause &C) {
11806   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11807                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11808 
11809   NewClause = OpenACCPresentClause::Create(
11810       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11811       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11812       ParsedClause.getEndLoc());
11813 }
11814 
11815 template <typename Derived>
11816 void OpenACCClauseTransform<Derived>::VisitCopyClause(
11817     const OpenACCCopyClause &C) {
11818   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11819                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11820 
11821   NewClause = OpenACCCopyClause::Create(
11822       Self.getSema().getASTContext(), ParsedClause.getClauseKind(),
11823       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
11824       ParsedClause.getVarList(), ParsedClause.getEndLoc());
11825 }
11826 
11827 template <typename Derived>
11828 void OpenACCClauseTransform<Derived>::VisitCopyInClause(
11829     const OpenACCCopyInClause &C) {
11830   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()), C.isReadOnly(),
11831                                  /*IsZero=*/false);
11832 
11833   NewClause = OpenACCCopyInClause::Create(
11834       Self.getSema().getASTContext(), ParsedClause.getClauseKind(),
11835       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
11836       ParsedClause.isReadOnly(), ParsedClause.getVarList(),
11837       ParsedClause.getEndLoc());
11838 }
11839 
11840 template <typename Derived>
11841 void OpenACCClauseTransform<Derived>::VisitCopyOutClause(
11842     const OpenACCCopyOutClause &C) {
11843   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11844                                  /*IsReadOnly=*/false, C.isZero());
11845 
11846   NewClause = OpenACCCopyOutClause::Create(
11847       Self.getSema().getASTContext(), ParsedClause.getClauseKind(),
11848       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
11849       ParsedClause.isZero(), ParsedClause.getVarList(),
11850       ParsedClause.getEndLoc());
11851 }
11852 
11853 template <typename Derived>
11854 void OpenACCClauseTransform<Derived>::VisitCreateClause(
11855     const OpenACCCreateClause &C) {
11856   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11857                                  /*IsReadOnly=*/false, C.isZero());
11858 
11859   NewClause = OpenACCCreateClause::Create(
11860       Self.getSema().getASTContext(), ParsedClause.getClauseKind(),
11861       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
11862       ParsedClause.isZero(), ParsedClause.getVarList(),
11863       ParsedClause.getEndLoc());
11864 }
11865 template <typename Derived>
11866 void OpenACCClauseTransform<Derived>::VisitAttachClause(
11867     const OpenACCAttachClause &C) {
11868   llvm::SmallVector<Expr *> VarList = VisitVarList(C.getVarList());
11869 
11870   // Ensure each var is a pointer type.
11871   VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *E) {
11872     return Self.getSema().OpenACC().CheckVarIsPointerType(
11873         OpenACCClauseKind::Attach, E);
11874   }), VarList.end());
11875 
11876   ParsedClause.setVarListDetails(VarList,
11877                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11878   NewClause = OpenACCAttachClause::Create(
11879       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11880       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11881       ParsedClause.getEndLoc());
11882 }
11883 
11884 template <typename Derived>
11885 void OpenACCClauseTransform<Derived>::VisitDetachClause(
11886     const OpenACCDetachClause &C) {
11887   llvm::SmallVector<Expr *> VarList = VisitVarList(C.getVarList());
11888 
11889   // Ensure each var is a pointer type.
11890   VarList.erase(
11891       std::remove_if(VarList.begin(), VarList.end(),
11892                      [&](Expr *E) {
11893                        return Self.getSema().OpenACC().CheckVarIsPointerType(
11894                            OpenACCClauseKind::Detach, E);
11895                      }),
11896       VarList.end());
11897 
11898   ParsedClause.setVarListDetails(VarList,
11899                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11900   NewClause = OpenACCDetachClause::Create(
11901       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11902       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11903       ParsedClause.getEndLoc());
11904 }
11905 
11906 template <typename Derived>
11907 void OpenACCClauseTransform<Derived>::VisitDeleteClause(
11908     const OpenACCDeleteClause &C) {
11909   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11910                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11911   NewClause = OpenACCDeleteClause::Create(
11912       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11913       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11914       ParsedClause.getEndLoc());
11915 }
11916 
11917 template <typename Derived>
11918 void OpenACCClauseTransform<Derived>::VisitUseDeviceClause(
11919     const OpenACCUseDeviceClause &C) {
11920   ParsedClause.setVarListDetails(VisitVarList(C.getVarList()),
11921                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11922   NewClause = OpenACCUseDeviceClause::Create(
11923       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11924       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11925       ParsedClause.getEndLoc());
11926 }
11927 
11928 template <typename Derived>
11929 void OpenACCClauseTransform<Derived>::VisitDevicePtrClause(
11930     const OpenACCDevicePtrClause &C) {
11931   llvm::SmallVector<Expr *> VarList = VisitVarList(C.getVarList());
11932 
11933   // Ensure each var is a pointer type.
11934   VarList.erase(std::remove_if(VarList.begin(), VarList.end(), [&](Expr *E) {
11935     return Self.getSema().OpenACC().CheckVarIsPointerType(
11936         OpenACCClauseKind::DevicePtr, E);
11937   }), VarList.end());
11938 
11939   ParsedClause.setVarListDetails(VarList,
11940                                  /*IsReadOnly=*/false, /*IsZero=*/false);
11941   NewClause = OpenACCDevicePtrClause::Create(
11942       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11943       ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
11944       ParsedClause.getEndLoc());
11945 }
11946 
11947 template <typename Derived>
11948 void OpenACCClauseTransform<Derived>::VisitNumWorkersClause(
11949     const OpenACCNumWorkersClause &C) {
11950   Expr *IntExpr = const_cast<Expr *>(C.getIntExpr());
11951   assert(IntExpr && "num_workers clause constructed with invalid int expr");
11952 
11953   ExprResult Res = Self.TransformExpr(IntExpr);
11954   if (!Res.isUsable())
11955     return;
11956 
11957   Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
11958                                               C.getClauseKind(),
11959                                               C.getBeginLoc(), Res.get());
11960   if (!Res.isUsable())
11961     return;
11962 
11963   ParsedClause.setIntExprDetails(Res.get());
11964   NewClause = OpenACCNumWorkersClause::Create(
11965       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11966       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs()[0],
11967       ParsedClause.getEndLoc());
11968 }
11969 
11970 template <typename Derived>
11971 void OpenACCClauseTransform<Derived>::VisitDeviceNumClause (
11972     const OpenACCDeviceNumClause &C) {
11973   Expr *IntExpr = const_cast<Expr *>(C.getIntExpr());
11974   assert(IntExpr && "device_num clause constructed with invalid int expr");
11975 
11976   ExprResult Res = Self.TransformExpr(IntExpr);
11977   if (!Res.isUsable())
11978     return;
11979 
11980   Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
11981                                               C.getClauseKind(),
11982                                               C.getBeginLoc(), Res.get());
11983   if (!Res.isUsable())
11984     return;
11985 
11986   ParsedClause.setIntExprDetails(Res.get());
11987   NewClause = OpenACCDeviceNumClause::Create(
11988       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
11989       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs()[0],
11990       ParsedClause.getEndLoc());
11991 }
11992 
11993 template <typename Derived>
11994 void OpenACCClauseTransform<Derived>::VisitDefaultAsyncClause(
11995     const OpenACCDefaultAsyncClause &C) {
11996   Expr *IntExpr = const_cast<Expr *>(C.getIntExpr());
11997   assert(IntExpr && "default_async clause constructed with invalid int expr");
11998 
11999   ExprResult Res = Self.TransformExpr(IntExpr);
12000   if (!Res.isUsable())
12001     return;
12002 
12003   Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12004                                               C.getClauseKind(),
12005                                               C.getBeginLoc(), Res.get());
12006   if (!Res.isUsable())
12007     return;
12008 
12009   ParsedClause.setIntExprDetails(Res.get());
12010   NewClause = OpenACCDefaultAsyncClause::Create(
12011       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12012       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs()[0],
12013       ParsedClause.getEndLoc());
12014 }
12015 
12016 template <typename Derived>
12017 void OpenACCClauseTransform<Derived>::VisitVectorLengthClause(
12018     const OpenACCVectorLengthClause &C) {
12019   Expr *IntExpr = const_cast<Expr *>(C.getIntExpr());
12020   assert(IntExpr && "vector_length clause constructed with invalid int expr");
12021 
12022   ExprResult Res = Self.TransformExpr(IntExpr);
12023   if (!Res.isUsable())
12024     return;
12025 
12026   Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12027                                               C.getClauseKind(),
12028                                               C.getBeginLoc(), Res.get());
12029   if (!Res.isUsable())
12030     return;
12031 
12032   ParsedClause.setIntExprDetails(Res.get());
12033   NewClause = OpenACCVectorLengthClause::Create(
12034       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12035       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs()[0],
12036       ParsedClause.getEndLoc());
12037 }
12038 
12039 template <typename Derived>
12040 void OpenACCClauseTransform<Derived>::VisitAsyncClause(
12041     const OpenACCAsyncClause &C) {
12042   if (C.hasIntExpr()) {
12043     ExprResult Res = Self.TransformExpr(const_cast<Expr *>(C.getIntExpr()));
12044     if (!Res.isUsable())
12045       return;
12046 
12047     Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12048                                                 C.getClauseKind(),
12049                                                 C.getBeginLoc(), Res.get());
12050     if (!Res.isUsable())
12051       return;
12052     ParsedClause.setIntExprDetails(Res.get());
12053   }
12054 
12055   NewClause = OpenACCAsyncClause::Create(
12056       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12057       ParsedClause.getLParenLoc(),
12058       ParsedClause.getNumIntExprs() != 0 ? ParsedClause.getIntExprs()[0]
12059                                          : nullptr,
12060       ParsedClause.getEndLoc());
12061 }
12062 
12063 template <typename Derived>
12064 void OpenACCClauseTransform<Derived>::VisitWorkerClause(
12065     const OpenACCWorkerClause &C) {
12066   if (C.hasIntExpr()) {
12067     // restrictions on this expression are all "does it exist in certain
12068     // situations" that are not possible to be dependent, so the only check we
12069     // have is that it transforms, and is an int expression.
12070     ExprResult Res = Self.TransformExpr(const_cast<Expr *>(C.getIntExpr()));
12071     if (!Res.isUsable())
12072       return;
12073 
12074     Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12075                                                 C.getClauseKind(),
12076                                                 C.getBeginLoc(), Res.get());
12077     if (!Res.isUsable())
12078       return;
12079     ParsedClause.setIntExprDetails(Res.get());
12080   }
12081 
12082   NewClause = OpenACCWorkerClause::Create(
12083       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12084       ParsedClause.getLParenLoc(),
12085       ParsedClause.getNumIntExprs() != 0 ? ParsedClause.getIntExprs()[0]
12086                                          : nullptr,
12087       ParsedClause.getEndLoc());
12088 }
12089 
12090 template <typename Derived>
12091 void OpenACCClauseTransform<Derived>::VisitVectorClause(
12092     const OpenACCVectorClause &C) {
12093   if (C.hasIntExpr()) {
12094     // restrictions on this expression are all "does it exist in certain
12095     // situations" that are not possible to be dependent, so the only check we
12096     // have is that it transforms, and is an int expression.
12097     ExprResult Res = Self.TransformExpr(const_cast<Expr *>(C.getIntExpr()));
12098     if (!Res.isUsable())
12099       return;
12100 
12101     Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12102                                                 C.getClauseKind(),
12103                                                 C.getBeginLoc(), Res.get());
12104     if (!Res.isUsable())
12105       return;
12106     ParsedClause.setIntExprDetails(Res.get());
12107   }
12108 
12109   NewClause = OpenACCVectorClause::Create(
12110       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12111       ParsedClause.getLParenLoc(),
12112       ParsedClause.getNumIntExprs() != 0 ? ParsedClause.getIntExprs()[0]
12113                                          : nullptr,
12114       ParsedClause.getEndLoc());
12115 }
12116 
12117 template <typename Derived>
12118 void OpenACCClauseTransform<Derived>::VisitWaitClause(
12119     const OpenACCWaitClause &C) {
12120   if (!C.getLParenLoc().isInvalid()) {
12121     Expr *DevNumExpr = nullptr;
12122     llvm::SmallVector<Expr *> InstantiatedQueueIdExprs;
12123 
12124     // Instantiate devnum expr if it exists.
12125     if (C.getDevNumExpr()) {
12126       ExprResult Res = Self.TransformExpr(C.getDevNumExpr());
12127       if (!Res.isUsable())
12128         return;
12129       Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12130                                                   C.getClauseKind(),
12131                                                   C.getBeginLoc(), Res.get());
12132       if (!Res.isUsable())
12133         return;
12134 
12135       DevNumExpr = Res.get();
12136     }
12137 
12138     // Instantiate queue ids.
12139     for (Expr *CurQueueIdExpr : C.getQueueIdExprs()) {
12140       ExprResult Res = Self.TransformExpr(CurQueueIdExpr);
12141       if (!Res.isUsable())
12142         return;
12143       Res = Self.getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Invalid,
12144                                                   C.getClauseKind(),
12145                                                   C.getBeginLoc(), Res.get());
12146       if (!Res.isUsable())
12147         return;
12148 
12149       InstantiatedQueueIdExprs.push_back(Res.get());
12150     }
12151 
12152     ParsedClause.setWaitDetails(DevNumExpr, C.getQueuesLoc(),
12153                                 std::move(InstantiatedQueueIdExprs));
12154   }
12155 
12156   NewClause = OpenACCWaitClause::Create(
12157       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12158       ParsedClause.getLParenLoc(), ParsedClause.getDevNumExpr(),
12159       ParsedClause.getQueuesLoc(), ParsedClause.getQueueIdExprs(),
12160       ParsedClause.getEndLoc());
12161 }
12162 
12163 template <typename Derived>
12164 void OpenACCClauseTransform<Derived>::VisitDeviceTypeClause(
12165     const OpenACCDeviceTypeClause &C) {
12166   // Nothing to transform here, just create a new version of 'C'.
12167   NewClause = OpenACCDeviceTypeClause::Create(
12168       Self.getSema().getASTContext(), C.getClauseKind(),
12169       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
12170       C.getArchitectures(), ParsedClause.getEndLoc());
12171 }
12172 
12173 template <typename Derived>
12174 void OpenACCClauseTransform<Derived>::VisitAutoClause(
12175     const OpenACCAutoClause &C) {
12176   // Nothing to do, so just create a new node.
12177   NewClause = OpenACCAutoClause::Create(Self.getSema().getASTContext(),
12178                                         ParsedClause.getBeginLoc(),
12179                                         ParsedClause.getEndLoc());
12180 }
12181 
12182 template <typename Derived>
12183 void OpenACCClauseTransform<Derived>::VisitIndependentClause(
12184     const OpenACCIndependentClause &C) {
12185   NewClause = OpenACCIndependentClause::Create(Self.getSema().getASTContext(),
12186                                                ParsedClause.getBeginLoc(),
12187                                                ParsedClause.getEndLoc());
12188 }
12189 
12190 template <typename Derived>
12191 void OpenACCClauseTransform<Derived>::VisitSeqClause(
12192     const OpenACCSeqClause &C) {
12193   NewClause = OpenACCSeqClause::Create(Self.getSema().getASTContext(),
12194                                        ParsedClause.getBeginLoc(),
12195                                        ParsedClause.getEndLoc());
12196 }
12197 template <typename Derived>
12198 void OpenACCClauseTransform<Derived>::VisitFinalizeClause(
12199     const OpenACCFinalizeClause &C) {
12200   NewClause = OpenACCFinalizeClause::Create(Self.getSema().getASTContext(),
12201                                             ParsedClause.getBeginLoc(),
12202                                             ParsedClause.getEndLoc());
12203 }
12204 
12205 template <typename Derived>
12206 void OpenACCClauseTransform<Derived>::VisitIfPresentClause(
12207     const OpenACCIfPresentClause &C) {
12208   NewClause = OpenACCIfPresentClause::Create(Self.getSema().getASTContext(),
12209                                              ParsedClause.getBeginLoc(),
12210                                              ParsedClause.getEndLoc());
12211 }
12212 
12213 template <typename Derived>
12214 void OpenACCClauseTransform<Derived>::VisitReductionClause(
12215     const OpenACCReductionClause &C) {
12216   SmallVector<Expr *> TransformedVars = VisitVarList(C.getVarList());
12217   SmallVector<Expr *> ValidVars;
12218 
12219   for (Expr *Var : TransformedVars) {
12220     ExprResult Res = Self.getSema().OpenACC().CheckReductionVar(
12221         ParsedClause.getDirectiveKind(), C.getReductionOp(), Var);
12222     if (Res.isUsable())
12223       ValidVars.push_back(Res.get());
12224   }
12225 
12226   NewClause = Self.getSema().OpenACC().CheckReductionClause(
12227       ExistingClauses, ParsedClause.getDirectiveKind(),
12228       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
12229       C.getReductionOp(), ValidVars, ParsedClause.getEndLoc());
12230 }
12231 
12232 template <typename Derived>
12233 void OpenACCClauseTransform<Derived>::VisitCollapseClause(
12234     const OpenACCCollapseClause &C) {
12235   Expr *LoopCount = const_cast<Expr *>(C.getLoopCount());
12236   assert(LoopCount && "collapse clause constructed with invalid loop count");
12237 
12238   ExprResult NewLoopCount = Self.TransformExpr(LoopCount);
12239 
12240   NewLoopCount = Self.getSema().OpenACC().ActOnIntExpr(
12241       OpenACCDirectiveKind::Invalid, ParsedClause.getClauseKind(),
12242       NewLoopCount.get()->getBeginLoc(), NewLoopCount.get());
12243 
12244   NewLoopCount =
12245       Self.getSema().OpenACC().CheckCollapseLoopCount(NewLoopCount.get());
12246 
12247   if (!NewLoopCount.isUsable())
12248     return;
12249 
12250   ParsedClause.setCollapseDetails(C.hasForce(), NewLoopCount.get());
12251   NewClause = OpenACCCollapseClause::Create(
12252       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12253       ParsedClause.getLParenLoc(), ParsedClause.isForce(),
12254       ParsedClause.getLoopCount(), ParsedClause.getEndLoc());
12255 }
12256 
12257 template <typename Derived>
12258 void OpenACCClauseTransform<Derived>::VisitTileClause(
12259     const OpenACCTileClause &C) {
12260 
12261   llvm::SmallVector<Expr *> TransformedExprs;
12262 
12263   for (Expr *E : C.getSizeExprs()) {
12264     ExprResult NewSizeExpr = Self.TransformExpr(E);
12265 
12266     if (!NewSizeExpr.isUsable())
12267       return;
12268 
12269     NewSizeExpr = Self.getSema().OpenACC().ActOnIntExpr(
12270         OpenACCDirectiveKind::Invalid, ParsedClause.getClauseKind(),
12271         NewSizeExpr.get()->getBeginLoc(), NewSizeExpr.get());
12272 
12273     NewSizeExpr = Self.getSema().OpenACC().CheckTileSizeExpr(NewSizeExpr.get());
12274 
12275     if (!NewSizeExpr.isUsable())
12276       return;
12277     TransformedExprs.push_back(NewSizeExpr.get());
12278   }
12279 
12280   ParsedClause.setIntExprDetails(TransformedExprs);
12281   NewClause = OpenACCTileClause::Create(
12282       Self.getSema().getASTContext(), ParsedClause.getBeginLoc(),
12283       ParsedClause.getLParenLoc(), ParsedClause.getIntExprs(),
12284       ParsedClause.getEndLoc());
12285 }
12286 template <typename Derived>
12287 void OpenACCClauseTransform<Derived>::VisitGangClause(
12288     const OpenACCGangClause &C) {
12289   llvm::SmallVector<OpenACCGangKind> TransformedGangKinds;
12290   llvm::SmallVector<Expr *> TransformedIntExprs;
12291 
12292   for (unsigned I = 0; I < C.getNumExprs(); ++I) {
12293     ExprResult ER = Self.TransformExpr(const_cast<Expr *>(C.getExpr(I).second));
12294     if (!ER.isUsable())
12295       continue;
12296 
12297     ER = Self.getSema().OpenACC().CheckGangExpr(ExistingClauses,
12298                                                 ParsedClause.getDirectiveKind(),
12299                                                 C.getExpr(I).first, ER.get());
12300     if (!ER.isUsable())
12301       continue;
12302     TransformedGangKinds.push_back(C.getExpr(I).first);
12303     TransformedIntExprs.push_back(ER.get());
12304   }
12305 
12306   NewClause = Self.getSema().OpenACC().CheckGangClause(
12307       ParsedClause.getDirectiveKind(), ExistingClauses,
12308       ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
12309       TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
12310 }
12311 } // namespace
12312 template <typename Derived>
12313 OpenACCClause *TreeTransform<Derived>::TransformOpenACCClause(
12314     ArrayRef<const OpenACCClause *> ExistingClauses,
12315     OpenACCDirectiveKind DirKind, const OpenACCClause *OldClause) {
12316 
12317   SemaOpenACC::OpenACCParsedClause ParsedClause(
12318       DirKind, OldClause->getClauseKind(), OldClause->getBeginLoc());
12319   ParsedClause.setEndLoc(OldClause->getEndLoc());
12320 
12321   if (const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(OldClause))
12322     ParsedClause.setLParenLoc(WithParms->getLParenLoc());
12323 
12324   OpenACCClauseTransform<Derived> Transform{*this, ExistingClauses,
12325                                             ParsedClause};
12326   Transform.Visit(OldClause);
12327 
12328   return Transform.CreatedClause();
12329 }
12330 
12331 template <typename Derived>
12332 llvm::SmallVector<OpenACCClause *>
12333 TreeTransform<Derived>::TransformOpenACCClauseList(
12334     OpenACCDirectiveKind DirKind, ArrayRef<const OpenACCClause *> OldClauses) {
12335   llvm::SmallVector<OpenACCClause *> TransformedClauses;
12336   for (const auto *Clause : OldClauses) {
12337     if (OpenACCClause *TransformedClause = getDerived().TransformOpenACCClause(
12338             TransformedClauses, DirKind, Clause))
12339       TransformedClauses.push_back(TransformedClause);
12340   }
12341   return TransformedClauses;
12342 }
12343 
12344 template <typename Derived>
12345 StmtResult TreeTransform<Derived>::TransformOpenACCComputeConstruct(
12346     OpenACCComputeConstruct *C) {
12347   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12348 
12349   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12350       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12351                                               C->clauses());
12352 
12353   if (getSema().OpenACC().ActOnStartStmtDirective(
12354           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12355     return StmtError();
12356 
12357   // Transform Structured Block.
12358   SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12359       getSema().OpenACC(), C->getDirectiveKind(), C->getDirectiveLoc(),
12360       C->clauses(), TransformedClauses);
12361   StmtResult StrBlock = getDerived().TransformStmt(C->getStructuredBlock());
12362   StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12363       C->getBeginLoc(), C->getDirectiveKind(), TransformedClauses, StrBlock);
12364 
12365   return getDerived().RebuildOpenACCComputeConstruct(
12366       C->getDirectiveKind(), C->getBeginLoc(), C->getDirectiveLoc(),
12367       C->getEndLoc(), TransformedClauses, StrBlock);
12368 }
12369 
12370 template <typename Derived>
12371 StmtResult
12372 TreeTransform<Derived>::TransformOpenACCLoopConstruct(OpenACCLoopConstruct *C) {
12373 
12374   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12375 
12376   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12377       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12378                                               C->clauses());
12379 
12380   if (getSema().OpenACC().ActOnStartStmtDirective(
12381           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12382     return StmtError();
12383 
12384   // Transform Loop.
12385   SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12386       getSema().OpenACC(), C->getDirectiveKind(), C->getDirectiveLoc(),
12387       C->clauses(), TransformedClauses);
12388   StmtResult Loop = getDerived().TransformStmt(C->getLoop());
12389   Loop = getSema().OpenACC().ActOnAssociatedStmt(
12390       C->getBeginLoc(), C->getDirectiveKind(), TransformedClauses, Loop);
12391 
12392   return getDerived().RebuildOpenACCLoopConstruct(
12393       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12394       TransformedClauses, Loop);
12395 }
12396 
12397 template <typename Derived>
12398 StmtResult TreeTransform<Derived>::TransformOpenACCCombinedConstruct(
12399     OpenACCCombinedConstruct *C) {
12400   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12401 
12402   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12403       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12404                                               C->clauses());
12405 
12406   if (getSema().OpenACC().ActOnStartStmtDirective(
12407           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12408     return StmtError();
12409 
12410   // Transform Loop.
12411   SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12412       getSema().OpenACC(), C->getDirectiveKind(), C->getDirectiveLoc(),
12413       C->clauses(), TransformedClauses);
12414   StmtResult Loop = getDerived().TransformStmt(C->getLoop());
12415   Loop = getSema().OpenACC().ActOnAssociatedStmt(
12416       C->getBeginLoc(), C->getDirectiveKind(), TransformedClauses, Loop);
12417 
12418   return getDerived().RebuildOpenACCCombinedConstruct(
12419       C->getDirectiveKind(), C->getBeginLoc(), C->getDirectiveLoc(),
12420       C->getEndLoc(), TransformedClauses, Loop);
12421 }
12422 
12423 template <typename Derived>
12424 StmtResult
12425 TreeTransform<Derived>::TransformOpenACCDataConstruct(OpenACCDataConstruct *C) {
12426   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12427 
12428   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12429       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12430                                               C->clauses());
12431   if (getSema().OpenACC().ActOnStartStmtDirective(
12432           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12433     return StmtError();
12434 
12435   SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12436       getSema().OpenACC(), C->getDirectiveKind(), C->getDirectiveLoc(),
12437       C->clauses(), TransformedClauses);
12438   StmtResult StrBlock = getDerived().TransformStmt(C->getStructuredBlock());
12439   StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12440       C->getBeginLoc(), C->getDirectiveKind(), TransformedClauses, StrBlock);
12441 
12442   return getDerived().RebuildOpenACCDataConstruct(
12443       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12444       TransformedClauses, StrBlock);
12445 }
12446 
12447 template <typename Derived>
12448 StmtResult TreeTransform<Derived>::TransformOpenACCEnterDataConstruct(
12449     OpenACCEnterDataConstruct *C) {
12450   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12451 
12452   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12453       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12454                                               C->clauses());
12455   if (getSema().OpenACC().ActOnStartStmtDirective(
12456           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12457     return StmtError();
12458 
12459   return getDerived().RebuildOpenACCEnterDataConstruct(
12460       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12461       TransformedClauses);
12462 }
12463 
12464 template <typename Derived>
12465 StmtResult TreeTransform<Derived>::TransformOpenACCExitDataConstruct(
12466     OpenACCExitDataConstruct *C) {
12467   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12468 
12469   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12470       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12471                                               C->clauses());
12472   if (getSema().OpenACC().ActOnStartStmtDirective(
12473           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12474     return StmtError();
12475 
12476   return getDerived().RebuildOpenACCExitDataConstruct(
12477       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12478       TransformedClauses);
12479 }
12480 
12481 template <typename Derived>
12482 StmtResult TreeTransform<Derived>::TransformOpenACCHostDataConstruct(
12483     OpenACCHostDataConstruct *C) {
12484   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12485 
12486   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12487       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12488                                               C->clauses());
12489   if (getSema().OpenACC().ActOnStartStmtDirective(
12490           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12491     return StmtError();
12492 
12493   SemaOpenACC::AssociatedStmtRAII AssocStmtRAII(
12494       getSema().OpenACC(), C->getDirectiveKind(), C->getDirectiveLoc(),
12495       C->clauses(), TransformedClauses);
12496   StmtResult StrBlock = getDerived().TransformStmt(C->getStructuredBlock());
12497   StrBlock = getSema().OpenACC().ActOnAssociatedStmt(
12498       C->getBeginLoc(), C->getDirectiveKind(), TransformedClauses, StrBlock);
12499 
12500   return getDerived().RebuildOpenACCHostDataConstruct(
12501       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12502       TransformedClauses, StrBlock);
12503 }
12504 
12505 template <typename Derived>
12506 StmtResult
12507 TreeTransform<Derived>::TransformOpenACCInitConstruct(OpenACCInitConstruct *C) {
12508   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12509 
12510   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12511       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12512                                               C->clauses());
12513   if (getSema().OpenACC().ActOnStartStmtDirective(
12514           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12515     return StmtError();
12516 
12517   return getDerived().RebuildOpenACCInitConstruct(
12518       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12519       TransformedClauses);
12520 }
12521 
12522 template <typename Derived>
12523 StmtResult TreeTransform<Derived>::TransformOpenACCShutdownConstruct(
12524     OpenACCShutdownConstruct *C) {
12525   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12526 
12527   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12528       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12529                                               C->clauses());
12530   if (getSema().OpenACC().ActOnStartStmtDirective(
12531           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12532     return StmtError();
12533 
12534   return getDerived().RebuildOpenACCShutdownConstruct(
12535       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12536       TransformedClauses);
12537 }
12538 template <typename Derived>
12539 StmtResult
12540 TreeTransform<Derived>::TransformOpenACCSetConstruct(OpenACCSetConstruct *C) {
12541   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12542 
12543   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12544       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12545                                               C->clauses());
12546   if (getSema().OpenACC().ActOnStartStmtDirective(
12547           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12548     return StmtError();
12549 
12550   return getDerived().RebuildOpenACCSetConstruct(
12551       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12552       TransformedClauses);
12553 }
12554 
12555 template <typename Derived>
12556 StmtResult TreeTransform<Derived>::TransformOpenACCUpdateConstruct(
12557     OpenACCUpdateConstruct *C) {
12558   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12559 
12560   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12561       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12562                                               C->clauses());
12563   if (getSema().OpenACC().ActOnStartStmtDirective(
12564           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12565     return StmtError();
12566 
12567   return getDerived().RebuildOpenACCUpdateConstruct(
12568       C->getBeginLoc(), C->getDirectiveLoc(), C->getEndLoc(),
12569       TransformedClauses);
12570 }
12571 
12572 template <typename Derived>
12573 StmtResult
12574 TreeTransform<Derived>::TransformOpenACCWaitConstruct(OpenACCWaitConstruct *C) {
12575   getSema().OpenACC().ActOnConstruct(C->getDirectiveKind(), C->getBeginLoc());
12576 
12577   ExprResult DevNumExpr;
12578   if (C->hasDevNumExpr()) {
12579     DevNumExpr = getDerived().TransformExpr(C->getDevNumExpr());
12580 
12581     if (DevNumExpr.isUsable())
12582       DevNumExpr = getSema().OpenACC().ActOnIntExpr(
12583           OpenACCDirectiveKind::Wait, OpenACCClauseKind::Invalid,
12584           C->getBeginLoc(), DevNumExpr.get());
12585   }
12586 
12587   llvm::SmallVector<Expr *> QueueIdExprs;
12588 
12589   for (Expr *QE : C->getQueueIdExprs()) {
12590     assert(QE && "Null queue id expr?");
12591     ExprResult NewEQ = getDerived().TransformExpr(QE);
12592 
12593     if (!NewEQ.isUsable())
12594       break;
12595     NewEQ = getSema().OpenACC().ActOnIntExpr(OpenACCDirectiveKind::Wait,
12596                                              OpenACCClauseKind::Invalid,
12597                                              C->getBeginLoc(), NewEQ.get());
12598     if (NewEQ.isUsable())
12599       QueueIdExprs.push_back(NewEQ.get());
12600   }
12601 
12602   llvm::SmallVector<OpenACCClause *> TransformedClauses =
12603       getDerived().TransformOpenACCClauseList(C->getDirectiveKind(),
12604                                               C->clauses());
12605 
12606   if (getSema().OpenACC().ActOnStartStmtDirective(
12607           C->getDirectiveKind(), C->getBeginLoc(), TransformedClauses))
12608     return StmtError();
12609 
12610   return getDerived().RebuildOpenACCWaitConstruct(
12611       C->getBeginLoc(), C->getDirectiveLoc(), C->getLParenLoc(),
12612       DevNumExpr.isUsable() ? DevNumExpr.get() : nullptr, C->getQueuesLoc(),
12613       QueueIdExprs, C->getRParenLoc(), C->getEndLoc(), TransformedClauses);
12614 }
12615 
12616 template <typename Derived>
12617 ExprResult TreeTransform<Derived>::TransformOpenACCAsteriskSizeExpr(
12618     OpenACCAsteriskSizeExpr *E) {
12619   if (getDerived().AlwaysRebuild())
12620     return getDerived().RebuildOpenACCAsteriskSizeExpr(E->getLocation());
12621   // Nothing can ever change, so there is never anything to transform.
12622   return E;
12623 }
12624 
12625 //===----------------------------------------------------------------------===//
12626 // Expression transformation
12627 //===----------------------------------------------------------------------===//
12628 template<typename Derived>
12629 ExprResult
12630 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
12631   return TransformExpr(E->getSubExpr());
12632 }
12633 
12634 template <typename Derived>
12635 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
12636     SYCLUniqueStableNameExpr *E) {
12637   if (!E->isTypeDependent())
12638     return E;
12639 
12640   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
12641 
12642   if (!NewT)
12643     return ExprError();
12644 
12645   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
12646     return E;
12647 
12648   return getDerived().RebuildSYCLUniqueStableNameExpr(
12649       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
12650 }
12651 
12652 template<typename Derived>
12653 ExprResult
12654 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
12655   if (!E->isTypeDependent())
12656     return E;
12657 
12658   return getDerived().RebuildPredefinedExpr(E->getLocation(),
12659                                             E->getIdentKind());
12660 }
12661 
12662 template<typename Derived>
12663 ExprResult
12664 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
12665   NestedNameSpecifierLoc QualifierLoc;
12666   if (E->getQualifierLoc()) {
12667     QualifierLoc
12668       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12669     if (!QualifierLoc)
12670       return ExprError();
12671   }
12672 
12673   ValueDecl *ND
12674     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
12675                                                          E->getDecl()));
12676   if (!ND)
12677     return ExprError();
12678 
12679   NamedDecl *Found = ND;
12680   if (E->getFoundDecl() != E->getDecl()) {
12681     Found = cast_or_null<NamedDecl>(
12682         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
12683     if (!Found)
12684       return ExprError();
12685   }
12686 
12687   DeclarationNameInfo NameInfo = E->getNameInfo();
12688   if (NameInfo.getName()) {
12689     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
12690     if (!NameInfo.getName())
12691       return ExprError();
12692   }
12693 
12694   if (!getDerived().AlwaysRebuild() &&
12695       !E->isCapturedByCopyInLambdaWithExplicitObjectParameter() &&
12696       QualifierLoc == E->getQualifierLoc() && ND == E->getDecl() &&
12697       Found == E->getFoundDecl() &&
12698       NameInfo.getName() == E->getDecl()->getDeclName() &&
12699       !E->hasExplicitTemplateArgs()) {
12700 
12701     // Mark it referenced in the new context regardless.
12702     // FIXME: this is a bit instantiation-specific.
12703     SemaRef.MarkDeclRefReferenced(E);
12704 
12705     return E;
12706   }
12707 
12708   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
12709   if (E->hasExplicitTemplateArgs()) {
12710     TemplateArgs = &TransArgs;
12711     TransArgs.setLAngleLoc(E->getLAngleLoc());
12712     TransArgs.setRAngleLoc(E->getRAngleLoc());
12713     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12714                                                 E->getNumTemplateArgs(),
12715                                                 TransArgs))
12716       return ExprError();
12717   }
12718 
12719   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
12720                                          Found, TemplateArgs);
12721 }
12722 
12723 template<typename Derived>
12724 ExprResult
12725 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
12726   return E;
12727 }
12728 
12729 template <typename Derived>
12730 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
12731     FixedPointLiteral *E) {
12732   return E;
12733 }
12734 
12735 template<typename Derived>
12736 ExprResult
12737 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
12738   return E;
12739 }
12740 
12741 template<typename Derived>
12742 ExprResult
12743 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
12744   return E;
12745 }
12746 
12747 template<typename Derived>
12748 ExprResult
12749 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
12750   return E;
12751 }
12752 
12753 template<typename Derived>
12754 ExprResult
12755 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
12756   return E;
12757 }
12758 
12759 template<typename Derived>
12760 ExprResult
12761 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
12762   return getDerived().TransformCallExpr(E);
12763 }
12764 
12765 template<typename Derived>
12766 ExprResult
12767 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
12768   ExprResult ControllingExpr;
12769   TypeSourceInfo *ControllingType = nullptr;
12770   if (E->isExprPredicate())
12771     ControllingExpr = getDerived().TransformExpr(E->getControllingExpr());
12772   else
12773     ControllingType = getDerived().TransformType(E->getControllingType());
12774 
12775   if (ControllingExpr.isInvalid() && !ControllingType)
12776     return ExprError();
12777 
12778   SmallVector<Expr *, 4> AssocExprs;
12779   SmallVector<TypeSourceInfo *, 4> AssocTypes;
12780   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
12781     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
12782     if (TSI) {
12783       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
12784       if (!AssocType)
12785         return ExprError();
12786       AssocTypes.push_back(AssocType);
12787     } else {
12788       AssocTypes.push_back(nullptr);
12789     }
12790 
12791     ExprResult AssocExpr =
12792         getDerived().TransformExpr(Assoc.getAssociationExpr());
12793     if (AssocExpr.isInvalid())
12794       return ExprError();
12795     AssocExprs.push_back(AssocExpr.get());
12796   }
12797 
12798   if (!ControllingType)
12799   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
12800                                                   E->getDefaultLoc(),
12801                                                   E->getRParenLoc(),
12802                                                   ControllingExpr.get(),
12803                                                   AssocTypes,
12804                                                   AssocExprs);
12805   return getDerived().RebuildGenericSelectionExpr(
12806       E->getGenericLoc(), E->getDefaultLoc(), E->getRParenLoc(),
12807       ControllingType, AssocTypes, AssocExprs);
12808 }
12809 
12810 template<typename Derived>
12811 ExprResult
12812 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
12813   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12814   if (SubExpr.isInvalid())
12815     return ExprError();
12816 
12817   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
12818     return E;
12819 
12820   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
12821                                        E->getRParen());
12822 }
12823 
12824 /// The operand of a unary address-of operator has special rules: it's
12825 /// allowed to refer to a non-static member of a class even if there's no 'this'
12826 /// object available.
12827 template<typename Derived>
12828 ExprResult
12829 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
12830   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
12831     return getDerived().TransformDependentScopeDeclRefExpr(
12832         DRE, /*IsAddressOfOperand=*/true, nullptr);
12833   else if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(E))
12834     return getDerived().TransformUnresolvedLookupExpr(
12835         ULE, /*IsAddressOfOperand=*/true);
12836   else
12837     return getDerived().TransformExpr(E);
12838 }
12839 
12840 template<typename Derived>
12841 ExprResult
12842 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
12843   ExprResult SubExpr;
12844   if (E->getOpcode() == UO_AddrOf)
12845     SubExpr = TransformAddressOfOperand(E->getSubExpr());
12846   else
12847     SubExpr = TransformExpr(E->getSubExpr());
12848   if (SubExpr.isInvalid())
12849     return ExprError();
12850 
12851   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
12852     return E;
12853 
12854   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
12855                                            E->getOpcode(),
12856                                            SubExpr.get());
12857 }
12858 
12859 template<typename Derived>
12860 ExprResult
12861 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
12862   // Transform the type.
12863   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12864   if (!Type)
12865     return ExprError();
12866 
12867   // Transform all of the components into components similar to what the
12868   // parser uses.
12869   // FIXME: It would be slightly more efficient in the non-dependent case to
12870   // just map FieldDecls, rather than requiring the rebuilder to look for
12871   // the fields again. However, __builtin_offsetof is rare enough in
12872   // template code that we don't care.
12873   bool ExprChanged = false;
12874   typedef Sema::OffsetOfComponent Component;
12875   SmallVector<Component, 4> Components;
12876   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
12877     const OffsetOfNode &ON = E->getComponent(I);
12878     Component Comp;
12879     Comp.isBrackets = true;
12880     Comp.LocStart = ON.getSourceRange().getBegin();
12881     Comp.LocEnd = ON.getSourceRange().getEnd();
12882     switch (ON.getKind()) {
12883     case OffsetOfNode::Array: {
12884       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
12885       ExprResult Index = getDerived().TransformExpr(FromIndex);
12886       if (Index.isInvalid())
12887         return ExprError();
12888 
12889       ExprChanged = ExprChanged || Index.get() != FromIndex;
12890       Comp.isBrackets = true;
12891       Comp.U.E = Index.get();
12892       break;
12893     }
12894 
12895     case OffsetOfNode::Field:
12896     case OffsetOfNode::Identifier:
12897       Comp.isBrackets = false;
12898       Comp.U.IdentInfo = ON.getFieldName();
12899       if (!Comp.U.IdentInfo)
12900         continue;
12901 
12902       break;
12903 
12904     case OffsetOfNode::Base:
12905       // Will be recomputed during the rebuild.
12906       continue;
12907     }
12908 
12909     Components.push_back(Comp);
12910   }
12911 
12912   // If nothing changed, retain the existing expression.
12913   if (!getDerived().AlwaysRebuild() &&
12914       Type == E->getTypeSourceInfo() &&
12915       !ExprChanged)
12916     return E;
12917 
12918   // Build a new offsetof expression.
12919   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
12920                                           Components, E->getRParenLoc());
12921 }
12922 
12923 template<typename Derived>
12924 ExprResult
12925 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
12926   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
12927          "opaque value expression requires transformation");
12928   return E;
12929 }
12930 
12931 template<typename Derived>
12932 ExprResult
12933 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
12934   return E;
12935 }
12936 
12937 template <typename Derived>
12938 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
12939   llvm::SmallVector<Expr *, 8> Children;
12940   bool Changed = false;
12941   for (Expr *C : E->subExpressions()) {
12942     ExprResult NewC = getDerived().TransformExpr(C);
12943     if (NewC.isInvalid())
12944       return ExprError();
12945     Children.push_back(NewC.get());
12946 
12947     Changed |= NewC.get() != C;
12948   }
12949   if (!getDerived().AlwaysRebuild() && !Changed)
12950     return E;
12951   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
12952                                           Children, E->getType());
12953 }
12954 
12955 template<typename Derived>
12956 ExprResult
12957 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
12958   // Rebuild the syntactic form.  The original syntactic form has
12959   // opaque-value expressions in it, so strip those away and rebuild
12960   // the result.  This is a really awful way of doing this, but the
12961   // better solution (rebuilding the semantic expressions and
12962   // rebinding OVEs as necessary) doesn't work; we'd need
12963   // TreeTransform to not strip away implicit conversions.
12964   Expr *newSyntacticForm = SemaRef.PseudoObject().recreateSyntacticForm(E);
12965   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
12966   if (result.isInvalid()) return ExprError();
12967 
12968   // If that gives us a pseudo-object result back, the pseudo-object
12969   // expression must have been an lvalue-to-rvalue conversion which we
12970   // should reapply.
12971   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
12972     result = SemaRef.PseudoObject().checkRValue(result.get());
12973 
12974   return result;
12975 }
12976 
12977 template<typename Derived>
12978 ExprResult
12979 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
12980                                                 UnaryExprOrTypeTraitExpr *E) {
12981   if (E->isArgumentType()) {
12982     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
12983 
12984     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
12985     if (!NewT)
12986       return ExprError();
12987 
12988     if (!getDerived().AlwaysRebuild() && OldT == NewT)
12989       return E;
12990 
12991     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
12992                                                     E->getKind(),
12993                                                     E->getSourceRange());
12994   }
12995 
12996   // C++0x [expr.sizeof]p1:
12997   //   The operand is either an expression, which is an unevaluated operand
12998   //   [...]
12999   EnterExpressionEvaluationContext Unevaluated(
13000       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
13001       Sema::ReuseLambdaContextDecl);
13002 
13003   // Try to recover if we have something like sizeof(T::X) where X is a type.
13004   // Notably, there must be *exactly* one set of parens if X is a type.
13005   TypeSourceInfo *RecoveryTSI = nullptr;
13006   ExprResult SubExpr;
13007   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
13008   if (auto *DRE =
13009           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
13010     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
13011         PE, DRE, false, &RecoveryTSI);
13012   else
13013     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
13014 
13015   if (RecoveryTSI) {
13016     return getDerived().RebuildUnaryExprOrTypeTrait(
13017         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
13018   } else if (SubExpr.isInvalid())
13019     return ExprError();
13020 
13021   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
13022     return E;
13023 
13024   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
13025                                                   E->getOperatorLoc(),
13026                                                   E->getKind(),
13027                                                   E->getSourceRange());
13028 }
13029 
13030 template<typename Derived>
13031 ExprResult
13032 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
13033   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
13034   if (LHS.isInvalid())
13035     return ExprError();
13036 
13037   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
13038   if (RHS.isInvalid())
13039     return ExprError();
13040 
13041 
13042   if (!getDerived().AlwaysRebuild() &&
13043       LHS.get() == E->getLHS() &&
13044       RHS.get() == E->getRHS())
13045     return E;
13046 
13047   return getDerived().RebuildArraySubscriptExpr(
13048       LHS.get(),
13049       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
13050 }
13051 
13052 template <typename Derived>
13053 ExprResult
13054 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
13055   ExprResult Base = getDerived().TransformExpr(E->getBase());
13056   if (Base.isInvalid())
13057     return ExprError();
13058 
13059   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
13060   if (RowIdx.isInvalid())
13061     return ExprError();
13062 
13063   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
13064   if (ColumnIdx.isInvalid())
13065     return ExprError();
13066 
13067   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
13068       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
13069     return E;
13070 
13071   return getDerived().RebuildMatrixSubscriptExpr(
13072       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
13073 }
13074 
13075 template <typename Derived>
13076 ExprResult
13077 TreeTransform<Derived>::TransformArraySectionExpr(ArraySectionExpr *E) {
13078   ExprResult Base = getDerived().TransformExpr(E->getBase());
13079   if (Base.isInvalid())
13080     return ExprError();
13081 
13082   ExprResult LowerBound;
13083   if (E->getLowerBound()) {
13084     LowerBound = getDerived().TransformExpr(E->getLowerBound());
13085     if (LowerBound.isInvalid())
13086       return ExprError();
13087   }
13088 
13089   ExprResult Length;
13090   if (E->getLength()) {
13091     Length = getDerived().TransformExpr(E->getLength());
13092     if (Length.isInvalid())
13093       return ExprError();
13094   }
13095 
13096   ExprResult Stride;
13097   if (E->isOMPArraySection()) {
13098     if (Expr *Str = E->getStride()) {
13099       Stride = getDerived().TransformExpr(Str);
13100       if (Stride.isInvalid())
13101         return ExprError();
13102     }
13103   }
13104 
13105   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
13106       LowerBound.get() == E->getLowerBound() &&
13107       Length.get() == E->getLength() &&
13108       (E->isOpenACCArraySection() || Stride.get() == E->getStride()))
13109     return E;
13110 
13111   return getDerived().RebuildArraySectionExpr(
13112       E->isOMPArraySection(), Base.get(), E->getBase()->getEndLoc(),
13113       LowerBound.get(), E->getColonLocFirst(),
13114       E->isOMPArraySection() ? E->getColonLocSecond() : SourceLocation{},
13115       Length.get(), Stride.get(), E->getRBracketLoc());
13116 }
13117 
13118 template <typename Derived>
13119 ExprResult
13120 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
13121   ExprResult Base = getDerived().TransformExpr(E->getBase());
13122   if (Base.isInvalid())
13123     return ExprError();
13124 
13125   SmallVector<Expr *, 4> Dims;
13126   bool ErrorFound = false;
13127   for (Expr *Dim : E->getDimensions()) {
13128     ExprResult DimRes = getDerived().TransformExpr(Dim);
13129     if (DimRes.isInvalid()) {
13130       ErrorFound = true;
13131       continue;
13132     }
13133     Dims.push_back(DimRes.get());
13134   }
13135 
13136   if (ErrorFound)
13137     return ExprError();
13138   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
13139                                                  E->getRParenLoc(), Dims,
13140                                                  E->getBracketsRanges());
13141 }
13142 
13143 template <typename Derived>
13144 ExprResult
13145 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
13146   unsigned NumIterators = E->numOfIterators();
13147   SmallVector<SemaOpenMP::OMPIteratorData, 4> Data(NumIterators);
13148 
13149   bool ErrorFound = false;
13150   bool NeedToRebuild = getDerived().AlwaysRebuild();
13151   for (unsigned I = 0; I < NumIterators; ++I) {
13152     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
13153     Data[I].DeclIdent = D->getIdentifier();
13154     Data[I].DeclIdentLoc = D->getLocation();
13155     if (D->getLocation() == D->getBeginLoc()) {
13156       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
13157              "Implicit type must be int.");
13158     } else {
13159       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
13160       QualType DeclTy = getDerived().TransformType(D->getType());
13161       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
13162     }
13163     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
13164     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
13165     ExprResult End = getDerived().TransformExpr(Range.End);
13166     ExprResult Step = getDerived().TransformExpr(Range.Step);
13167     ErrorFound = ErrorFound ||
13168                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
13169                                                !Data[I].Type.get().isNull())) ||
13170                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
13171     if (ErrorFound)
13172       continue;
13173     Data[I].Range.Begin = Begin.get();
13174     Data[I].Range.End = End.get();
13175     Data[I].Range.Step = Step.get();
13176     Data[I].AssignLoc = E->getAssignLoc(I);
13177     Data[I].ColonLoc = E->getColonLoc(I);
13178     Data[I].SecColonLoc = E->getSecondColonLoc(I);
13179     NeedToRebuild =
13180         NeedToRebuild ||
13181         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
13182                                        D->getType().getTypePtrOrNull()) ||
13183         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
13184         Range.Step != Data[I].Range.Step;
13185   }
13186   if (ErrorFound)
13187     return ExprError();
13188   if (!NeedToRebuild)
13189     return E;
13190 
13191   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
13192       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
13193   if (!Res.isUsable())
13194     return Res;
13195   auto *IE = cast<OMPIteratorExpr>(Res.get());
13196   for (unsigned I = 0; I < NumIterators; ++I)
13197     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
13198                                       IE->getIteratorDecl(I));
13199   return Res;
13200 }
13201 
13202 template<typename Derived>
13203 ExprResult
13204 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
13205   // Transform the callee.
13206   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
13207   if (Callee.isInvalid())
13208     return ExprError();
13209 
13210   // Transform arguments.
13211   bool ArgChanged = false;
13212   SmallVector<Expr*, 8> Args;
13213   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13214                                   &ArgChanged))
13215     return ExprError();
13216 
13217   if (!getDerived().AlwaysRebuild() &&
13218       Callee.get() == E->getCallee() &&
13219       !ArgChanged)
13220     return SemaRef.MaybeBindToTemporary(E);
13221 
13222   // FIXME: Wrong source location information for the '('.
13223   SourceLocation FakeLParenLoc
13224     = ((Expr *)Callee.get())->getSourceRange().getBegin();
13225 
13226   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13227   if (E->hasStoredFPFeatures()) {
13228     FPOptionsOverride NewOverrides = E->getFPFeatures();
13229     getSema().CurFPFeatures =
13230         NewOverrides.applyOverrides(getSema().getLangOpts());
13231     getSema().FpPragmaStack.CurrentValue = NewOverrides;
13232   }
13233 
13234   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
13235                                       Args,
13236                                       E->getRParenLoc());
13237 }
13238 
13239 template<typename Derived>
13240 ExprResult
13241 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
13242   ExprResult Base = getDerived().TransformExpr(E->getBase());
13243   if (Base.isInvalid())
13244     return ExprError();
13245 
13246   NestedNameSpecifierLoc QualifierLoc;
13247   if (E->hasQualifier()) {
13248     QualifierLoc
13249       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
13250 
13251     if (!QualifierLoc)
13252       return ExprError();
13253   }
13254   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13255 
13256   ValueDecl *Member
13257     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
13258                                                          E->getMemberDecl()));
13259   if (!Member)
13260     return ExprError();
13261 
13262   NamedDecl *FoundDecl = E->getFoundDecl();
13263   if (FoundDecl == E->getMemberDecl()) {
13264     FoundDecl = Member;
13265   } else {
13266     FoundDecl = cast_or_null<NamedDecl>(
13267                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
13268     if (!FoundDecl)
13269       return ExprError();
13270   }
13271 
13272   if (!getDerived().AlwaysRebuild() &&
13273       Base.get() == E->getBase() &&
13274       QualifierLoc == E->getQualifierLoc() &&
13275       Member == E->getMemberDecl() &&
13276       FoundDecl == E->getFoundDecl() &&
13277       !E->hasExplicitTemplateArgs()) {
13278 
13279     // Skip for member expression of (this->f), rebuilt thisi->f is needed
13280     // for Openmp where the field need to be privatizized in the case.
13281     if (!(isa<CXXThisExpr>(E->getBase()) &&
13282           getSema().OpenMP().isOpenMPRebuildMemberExpr(
13283               cast<ValueDecl>(Member)))) {
13284       // Mark it referenced in the new context regardless.
13285       // FIXME: this is a bit instantiation-specific.
13286       SemaRef.MarkMemberReferenced(E);
13287       return E;
13288     }
13289   }
13290 
13291   TemplateArgumentListInfo TransArgs;
13292   if (E->hasExplicitTemplateArgs()) {
13293     TransArgs.setLAngleLoc(E->getLAngleLoc());
13294     TransArgs.setRAngleLoc(E->getRAngleLoc());
13295     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13296                                                 E->getNumTemplateArgs(),
13297                                                 TransArgs))
13298       return ExprError();
13299   }
13300 
13301   // FIXME: Bogus source location for the operator
13302   SourceLocation FakeOperatorLoc =
13303       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
13304 
13305   // FIXME: to do this check properly, we will need to preserve the
13306   // first-qualifier-in-scope here, just in case we had a dependent
13307   // base (and therefore couldn't do the check) and a
13308   // nested-name-qualifier (and therefore could do the lookup).
13309   NamedDecl *FirstQualifierInScope = nullptr;
13310   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
13311   if (MemberNameInfo.getName()) {
13312     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
13313     if (!MemberNameInfo.getName())
13314       return ExprError();
13315   }
13316 
13317   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
13318                                         E->isArrow(),
13319                                         QualifierLoc,
13320                                         TemplateKWLoc,
13321                                         MemberNameInfo,
13322                                         Member,
13323                                         FoundDecl,
13324                                         (E->hasExplicitTemplateArgs()
13325                                            ? &TransArgs : nullptr),
13326                                         FirstQualifierInScope);
13327 }
13328 
13329 template<typename Derived>
13330 ExprResult
13331 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
13332   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
13333   if (LHS.isInvalid())
13334     return ExprError();
13335 
13336   ExprResult RHS =
13337       getDerived().TransformInitializer(E->getRHS(), /*NotCopyInit=*/false);
13338   if (RHS.isInvalid())
13339     return ExprError();
13340 
13341   if (!getDerived().AlwaysRebuild() &&
13342       LHS.get() == E->getLHS() &&
13343       RHS.get() == E->getRHS())
13344     return E;
13345 
13346   if (E->isCompoundAssignmentOp())
13347     // FPFeatures has already been established from trailing storage
13348     return getDerived().RebuildBinaryOperator(
13349         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
13350   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13351   FPOptionsOverride NewOverrides(E->getFPFeatures());
13352   getSema().CurFPFeatures =
13353       NewOverrides.applyOverrides(getSema().getLangOpts());
13354   getSema().FpPragmaStack.CurrentValue = NewOverrides;
13355   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
13356                                             LHS.get(), RHS.get());
13357 }
13358 
13359 template <typename Derived>
13360 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
13361     CXXRewrittenBinaryOperator *E) {
13362   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
13363 
13364   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
13365   if (LHS.isInvalid())
13366     return ExprError();
13367 
13368   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
13369   if (RHS.isInvalid())
13370     return ExprError();
13371 
13372   // Extract the already-resolved callee declarations so that we can restrict
13373   // ourselves to using them as the unqualified lookup results when rebuilding.
13374   UnresolvedSet<2> UnqualLookups;
13375   bool ChangedAnyLookups = false;
13376   Expr *PossibleBinOps[] = {E->getSemanticForm(),
13377                             const_cast<Expr *>(Decomp.InnerBinOp)};
13378   for (Expr *PossibleBinOp : PossibleBinOps) {
13379     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
13380     if (!Op)
13381       continue;
13382     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
13383     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
13384       continue;
13385 
13386     // Transform the callee in case we built a call to a local extern
13387     // declaration.
13388     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
13389         E->getOperatorLoc(), Callee->getFoundDecl()));
13390     if (!Found)
13391       return ExprError();
13392     if (Found != Callee->getFoundDecl())
13393       ChangedAnyLookups = true;
13394     UnqualLookups.addDecl(Found);
13395   }
13396 
13397   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
13398       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
13399     // Mark all functions used in the rewrite as referenced. Note that when
13400     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
13401     // function calls, and/or there might be a user-defined conversion sequence
13402     // applied to the operands of the <.
13403     // FIXME: this is a bit instantiation-specific.
13404     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
13405     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
13406     return E;
13407   }
13408 
13409   return getDerived().RebuildCXXRewrittenBinaryOperator(
13410       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
13411 }
13412 
13413 template<typename Derived>
13414 ExprResult
13415 TreeTransform<Derived>::TransformCompoundAssignOperator(
13416                                                       CompoundAssignOperator *E) {
13417   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13418   FPOptionsOverride NewOverrides(E->getFPFeatures());
13419   getSema().CurFPFeatures =
13420       NewOverrides.applyOverrides(getSema().getLangOpts());
13421   getSema().FpPragmaStack.CurrentValue = NewOverrides;
13422   return getDerived().TransformBinaryOperator(E);
13423 }
13424 
13425 template<typename Derived>
13426 ExprResult TreeTransform<Derived>::
13427 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
13428   // Just rebuild the common and RHS expressions and see whether we
13429   // get any changes.
13430 
13431   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
13432   if (commonExpr.isInvalid())
13433     return ExprError();
13434 
13435   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
13436   if (rhs.isInvalid())
13437     return ExprError();
13438 
13439   if (!getDerived().AlwaysRebuild() &&
13440       commonExpr.get() == e->getCommon() &&
13441       rhs.get() == e->getFalseExpr())
13442     return e;
13443 
13444   return getDerived().RebuildConditionalOperator(commonExpr.get(),
13445                                                  e->getQuestionLoc(),
13446                                                  nullptr,
13447                                                  e->getColonLoc(),
13448                                                  rhs.get());
13449 }
13450 
13451 template<typename Derived>
13452 ExprResult
13453 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
13454   ExprResult Cond = getDerived().TransformExpr(E->getCond());
13455   if (Cond.isInvalid())
13456     return ExprError();
13457 
13458   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
13459   if (LHS.isInvalid())
13460     return ExprError();
13461 
13462   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
13463   if (RHS.isInvalid())
13464     return ExprError();
13465 
13466   if (!getDerived().AlwaysRebuild() &&
13467       Cond.get() == E->getCond() &&
13468       LHS.get() == E->getLHS() &&
13469       RHS.get() == E->getRHS())
13470     return E;
13471 
13472   return getDerived().RebuildConditionalOperator(Cond.get(),
13473                                                  E->getQuestionLoc(),
13474                                                  LHS.get(),
13475                                                  E->getColonLoc(),
13476                                                  RHS.get());
13477 }
13478 
13479 template<typename Derived>
13480 ExprResult
13481 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
13482   // Implicit casts are eliminated during transformation, since they
13483   // will be recomputed by semantic analysis after transformation.
13484   return getDerived().TransformExpr(E->getSubExprAsWritten());
13485 }
13486 
13487 template<typename Derived>
13488 ExprResult
13489 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
13490   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
13491   if (!Type)
13492     return ExprError();
13493 
13494   ExprResult SubExpr
13495     = getDerived().TransformExpr(E->getSubExprAsWritten());
13496   if (SubExpr.isInvalid())
13497     return ExprError();
13498 
13499   if (!getDerived().AlwaysRebuild() &&
13500       Type == E->getTypeInfoAsWritten() &&
13501       SubExpr.get() == E->getSubExpr())
13502     return E;
13503 
13504   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
13505                                             Type,
13506                                             E->getRParenLoc(),
13507                                             SubExpr.get());
13508 }
13509 
13510 template<typename Derived>
13511 ExprResult
13512 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
13513   TypeSourceInfo *OldT = E->getTypeSourceInfo();
13514   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
13515   if (!NewT)
13516     return ExprError();
13517 
13518   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
13519   if (Init.isInvalid())
13520     return ExprError();
13521 
13522   if (!getDerived().AlwaysRebuild() &&
13523       OldT == NewT &&
13524       Init.get() == E->getInitializer())
13525     return SemaRef.MaybeBindToTemporary(E);
13526 
13527   // Note: the expression type doesn't necessarily match the
13528   // type-as-written, but that's okay, because it should always be
13529   // derivable from the initializer.
13530 
13531   return getDerived().RebuildCompoundLiteralExpr(
13532       E->getLParenLoc(), NewT,
13533       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
13534 }
13535 
13536 template<typename Derived>
13537 ExprResult
13538 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
13539   ExprResult Base = getDerived().TransformExpr(E->getBase());
13540   if (Base.isInvalid())
13541     return ExprError();
13542 
13543   if (!getDerived().AlwaysRebuild() &&
13544       Base.get() == E->getBase())
13545     return E;
13546 
13547   // FIXME: Bad source location
13548   SourceLocation FakeOperatorLoc =
13549       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
13550   return getDerived().RebuildExtVectorElementExpr(
13551       Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
13552       E->getAccessor());
13553 }
13554 
13555 template<typename Derived>
13556 ExprResult
13557 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
13558   if (InitListExpr *Syntactic = E->getSyntacticForm())
13559     E = Syntactic;
13560 
13561   bool InitChanged = false;
13562 
13563   EnterExpressionEvaluationContext Context(
13564       getSema(), EnterExpressionEvaluationContext::InitList);
13565 
13566   SmallVector<Expr*, 4> Inits;
13567   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
13568                                   Inits, &InitChanged))
13569     return ExprError();
13570 
13571   if (!getDerived().AlwaysRebuild() && !InitChanged) {
13572     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
13573     // in some cases. We can't reuse it in general, because the syntactic and
13574     // semantic forms are linked, and we can't know that semantic form will
13575     // match even if the syntactic form does.
13576   }
13577 
13578   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
13579                                       E->getRBraceLoc());
13580 }
13581 
13582 template<typename Derived>
13583 ExprResult
13584 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
13585   Designation Desig;
13586 
13587   // transform the initializer value
13588   ExprResult Init = getDerived().TransformExpr(E->getInit());
13589   if (Init.isInvalid())
13590     return ExprError();
13591 
13592   // transform the designators.
13593   SmallVector<Expr*, 4> ArrayExprs;
13594   bool ExprChanged = false;
13595   for (const DesignatedInitExpr::Designator &D : E->designators()) {
13596     if (D.isFieldDesignator()) {
13597       if (D.getFieldDecl()) {
13598         FieldDecl *Field = cast_or_null<FieldDecl>(
13599             getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl()));
13600         if (Field != D.getFieldDecl())
13601           // Rebuild the expression when the transformed FieldDecl is
13602           // different to the already assigned FieldDecl.
13603           ExprChanged = true;
13604         if (Field->isAnonymousStructOrUnion())
13605           continue;
13606       } else {
13607         // Ensure that the designator expression is rebuilt when there isn't
13608         // a resolved FieldDecl in the designator as we don't want to assign
13609         // a FieldDecl to a pattern designator that will be instantiated again.
13610         ExprChanged = true;
13611       }
13612       Desig.AddDesignator(Designator::CreateFieldDesignator(
13613           D.getFieldName(), D.getDotLoc(), D.getFieldLoc()));
13614       continue;
13615     }
13616 
13617     if (D.isArrayDesignator()) {
13618       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
13619       if (Index.isInvalid())
13620         return ExprError();
13621 
13622       Desig.AddDesignator(
13623           Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
13624 
13625       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
13626       ArrayExprs.push_back(Index.get());
13627       continue;
13628     }
13629 
13630     assert(D.isArrayRangeDesignator() && "New kind of designator?");
13631     ExprResult Start
13632       = getDerived().TransformExpr(E->getArrayRangeStart(D));
13633     if (Start.isInvalid())
13634       return ExprError();
13635 
13636     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
13637     if (End.isInvalid())
13638       return ExprError();
13639 
13640     Desig.AddDesignator(Designator::CreateArrayRangeDesignator(
13641         Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc()));
13642 
13643     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
13644                   End.get() != E->getArrayRangeEnd(D);
13645 
13646     ArrayExprs.push_back(Start.get());
13647     ArrayExprs.push_back(End.get());
13648   }
13649 
13650   if (!getDerived().AlwaysRebuild() &&
13651       Init.get() == E->getInit() &&
13652       !ExprChanged)
13653     return E;
13654 
13655   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
13656                                                 E->getEqualOrColonLoc(),
13657                                                 E->usesGNUSyntax(), Init.get());
13658 }
13659 
13660 // Seems that if TransformInitListExpr() only works on the syntactic form of an
13661 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
13662 template<typename Derived>
13663 ExprResult
13664 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
13665     DesignatedInitUpdateExpr *E) {
13666   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
13667                    "initializer");
13668   return ExprError();
13669 }
13670 
13671 template<typename Derived>
13672 ExprResult
13673 TreeTransform<Derived>::TransformNoInitExpr(
13674     NoInitExpr *E) {
13675   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
13676   return ExprError();
13677 }
13678 
13679 template<typename Derived>
13680 ExprResult
13681 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
13682   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
13683   return ExprError();
13684 }
13685 
13686 template<typename Derived>
13687 ExprResult
13688 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
13689   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
13690   return ExprError();
13691 }
13692 
13693 template<typename Derived>
13694 ExprResult
13695 TreeTransform<Derived>::TransformImplicitValueInitExpr(
13696                                                      ImplicitValueInitExpr *E) {
13697   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
13698 
13699   // FIXME: Will we ever have proper type location here? Will we actually
13700   // need to transform the type?
13701   QualType T = getDerived().TransformType(E->getType());
13702   if (T.isNull())
13703     return ExprError();
13704 
13705   if (!getDerived().AlwaysRebuild() &&
13706       T == E->getType())
13707     return E;
13708 
13709   return getDerived().RebuildImplicitValueInitExpr(T);
13710 }
13711 
13712 template<typename Derived>
13713 ExprResult
13714 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
13715   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
13716   if (!TInfo)
13717     return ExprError();
13718 
13719   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13720   if (SubExpr.isInvalid())
13721     return ExprError();
13722 
13723   if (!getDerived().AlwaysRebuild() &&
13724       TInfo == E->getWrittenTypeInfo() &&
13725       SubExpr.get() == E->getSubExpr())
13726     return E;
13727 
13728   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
13729                                        TInfo, E->getRParenLoc());
13730 }
13731 
13732 template<typename Derived>
13733 ExprResult
13734 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
13735   bool ArgumentChanged = false;
13736   SmallVector<Expr*, 4> Inits;
13737   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
13738                      &ArgumentChanged))
13739     return ExprError();
13740 
13741   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
13742                                            Inits,
13743                                            E->getRParenLoc());
13744 }
13745 
13746 /// Transform an address-of-label expression.
13747 ///
13748 /// By default, the transformation of an address-of-label expression always
13749 /// rebuilds the expression, so that the label identifier can be resolved to
13750 /// the corresponding label statement by semantic analysis.
13751 template<typename Derived>
13752 ExprResult
13753 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
13754   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
13755                                         E->getLabel());
13756   if (!LD)
13757     return ExprError();
13758 
13759   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
13760                                            cast<LabelDecl>(LD));
13761 }
13762 
13763 template<typename Derived>
13764 ExprResult
13765 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
13766   SemaRef.ActOnStartStmtExpr();
13767   StmtResult SubStmt
13768     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
13769   if (SubStmt.isInvalid()) {
13770     SemaRef.ActOnStmtExprError();
13771     return ExprError();
13772   }
13773 
13774   unsigned OldDepth = E->getTemplateDepth();
13775   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
13776 
13777   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
13778       SubStmt.get() == E->getSubStmt()) {
13779     // Calling this an 'error' is unintuitive, but it does the right thing.
13780     SemaRef.ActOnStmtExprError();
13781     return SemaRef.MaybeBindToTemporary(E);
13782   }
13783 
13784   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
13785                                       E->getRParenLoc(), NewDepth);
13786 }
13787 
13788 template<typename Derived>
13789 ExprResult
13790 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
13791   ExprResult Cond = getDerived().TransformExpr(E->getCond());
13792   if (Cond.isInvalid())
13793     return ExprError();
13794 
13795   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
13796   if (LHS.isInvalid())
13797     return ExprError();
13798 
13799   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
13800   if (RHS.isInvalid())
13801     return ExprError();
13802 
13803   if (!getDerived().AlwaysRebuild() &&
13804       Cond.get() == E->getCond() &&
13805       LHS.get() == E->getLHS() &&
13806       RHS.get() == E->getRHS())
13807     return E;
13808 
13809   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
13810                                         Cond.get(), LHS.get(), RHS.get(),
13811                                         E->getRParenLoc());
13812 }
13813 
13814 template<typename Derived>
13815 ExprResult
13816 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
13817   return E;
13818 }
13819 
13820 template<typename Derived>
13821 ExprResult
13822 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
13823   switch (E->getOperator()) {
13824   case OO_New:
13825   case OO_Delete:
13826   case OO_Array_New:
13827   case OO_Array_Delete:
13828     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
13829 
13830   case OO_Subscript:
13831   case OO_Call: {
13832     // This is a call to an object's operator().
13833     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
13834 
13835     // Transform the object itself.
13836     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
13837     if (Object.isInvalid())
13838       return ExprError();
13839 
13840     // FIXME: Poor location information
13841     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
13842         static_cast<Expr *>(Object.get())->getEndLoc());
13843 
13844     // Transform the call arguments.
13845     SmallVector<Expr*, 8> Args;
13846     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
13847                                     Args))
13848       return ExprError();
13849 
13850     if (E->getOperator() == OO_Subscript)
13851       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
13852                                                   Args, E->getEndLoc());
13853 
13854     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
13855                                         E->getEndLoc());
13856   }
13857 
13858 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
13859   case OO_##Name:                                                              \
13860     break;
13861 
13862 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
13863 #include "clang/Basic/OperatorKinds.def"
13864 
13865   case OO_Conditional:
13866     llvm_unreachable("conditional operator is not actually overloadable");
13867 
13868   case OO_None:
13869   case NUM_OVERLOADED_OPERATORS:
13870     llvm_unreachable("not an overloaded operator?");
13871   }
13872 
13873   ExprResult First;
13874   if (E->getNumArgs() == 1 && E->getOperator() == OO_Amp)
13875     First = getDerived().TransformAddressOfOperand(E->getArg(0));
13876   else
13877     First = getDerived().TransformExpr(E->getArg(0));
13878   if (First.isInvalid())
13879     return ExprError();
13880 
13881   ExprResult Second;
13882   if (E->getNumArgs() == 2) {
13883     Second =
13884         getDerived().TransformInitializer(E->getArg(1), /*NotCopyInit=*/false);
13885     if (Second.isInvalid())
13886       return ExprError();
13887   }
13888 
13889   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
13890   FPOptionsOverride NewOverrides(E->getFPFeatures());
13891   getSema().CurFPFeatures =
13892       NewOverrides.applyOverrides(getSema().getLangOpts());
13893   getSema().FpPragmaStack.CurrentValue = NewOverrides;
13894 
13895   Expr *Callee = E->getCallee();
13896   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
13897     LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
13898                    Sema::LookupOrdinaryName);
13899     if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R))
13900       return ExprError();
13901 
13902     return getDerived().RebuildCXXOperatorCallExpr(
13903         E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
13904         ULE->requiresADL(), R.asUnresolvedSet(), First.get(), Second.get());
13905   }
13906 
13907   UnresolvedSet<1> Functions;
13908   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
13909     Callee = ICE->getSubExprAsWritten();
13910   NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl();
13911   ValueDecl *VD = cast_or_null<ValueDecl>(
13912       getDerived().TransformDecl(DR->getLocation(), DR));
13913   if (!VD)
13914     return ExprError();
13915 
13916   if (!isa<CXXMethodDecl>(VD))
13917     Functions.addDecl(VD);
13918 
13919   return getDerived().RebuildCXXOperatorCallExpr(
13920       E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
13921       /*RequiresADL=*/false, Functions, First.get(), Second.get());
13922 }
13923 
13924 template<typename Derived>
13925 ExprResult
13926 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
13927   return getDerived().TransformCallExpr(E);
13928 }
13929 
13930 template <typename Derived>
13931 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
13932   bool NeedRebuildFunc = SourceLocExpr::MayBeDependent(E->getIdentKind()) &&
13933                          getSema().CurContext != E->getParentContext();
13934 
13935   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
13936     return E;
13937 
13938   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
13939                                            E->getBeginLoc(), E->getEndLoc(),
13940                                            getSema().CurContext);
13941 }
13942 
13943 template <typename Derived>
13944 ExprResult TreeTransform<Derived>::TransformEmbedExpr(EmbedExpr *E) {
13945   return E;
13946 }
13947 
13948 template<typename Derived>
13949 ExprResult
13950 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
13951   // Transform the callee.
13952   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
13953   if (Callee.isInvalid())
13954     return ExprError();
13955 
13956   // Transform exec config.
13957   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
13958   if (EC.isInvalid())
13959     return ExprError();
13960 
13961   // Transform arguments.
13962   bool ArgChanged = false;
13963   SmallVector<Expr*, 8> Args;
13964   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13965                                   &ArgChanged))
13966     return ExprError();
13967 
13968   if (!getDerived().AlwaysRebuild() &&
13969       Callee.get() == E->getCallee() &&
13970       !ArgChanged)
13971     return SemaRef.MaybeBindToTemporary(E);
13972 
13973   // FIXME: Wrong source location information for the '('.
13974   SourceLocation FakeLParenLoc
13975     = ((Expr *)Callee.get())->getSourceRange().getBegin();
13976   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
13977                                       Args,
13978                                       E->getRParenLoc(), EC.get());
13979 }
13980 
13981 template<typename Derived>
13982 ExprResult
13983 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
13984   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
13985   if (!Type)
13986     return ExprError();
13987 
13988   ExprResult SubExpr
13989     = getDerived().TransformExpr(E->getSubExprAsWritten());
13990   if (SubExpr.isInvalid())
13991     return ExprError();
13992 
13993   if (!getDerived().AlwaysRebuild() &&
13994       Type == E->getTypeInfoAsWritten() &&
13995       SubExpr.get() == E->getSubExpr())
13996     return E;
13997   return getDerived().RebuildCXXNamedCastExpr(
13998       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
13999       Type, E->getAngleBrackets().getEnd(),
14000       // FIXME. this should be '(' location
14001       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
14002 }
14003 
14004 template<typename Derived>
14005 ExprResult
14006 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
14007   TypeSourceInfo *TSI =
14008       getDerived().TransformType(BCE->getTypeInfoAsWritten());
14009   if (!TSI)
14010     return ExprError();
14011 
14012   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
14013   if (Sub.isInvalid())
14014     return ExprError();
14015 
14016   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
14017                                                 Sub.get(), BCE->getEndLoc());
14018 }
14019 
14020 template<typename Derived>
14021 ExprResult
14022 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
14023   return getDerived().TransformCXXNamedCastExpr(E);
14024 }
14025 
14026 template<typename Derived>
14027 ExprResult
14028 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
14029   return getDerived().TransformCXXNamedCastExpr(E);
14030 }
14031 
14032 template<typename Derived>
14033 ExprResult
14034 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
14035                                                       CXXReinterpretCastExpr *E) {
14036   return getDerived().TransformCXXNamedCastExpr(E);
14037 }
14038 
14039 template<typename Derived>
14040 ExprResult
14041 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
14042   return getDerived().TransformCXXNamedCastExpr(E);
14043 }
14044 
14045 template<typename Derived>
14046 ExprResult
14047 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
14048   return getDerived().TransformCXXNamedCastExpr(E);
14049 }
14050 
14051 template<typename Derived>
14052 ExprResult
14053 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
14054                                                      CXXFunctionalCastExpr *E) {
14055   TypeSourceInfo *Type =
14056       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
14057   if (!Type)
14058     return ExprError();
14059 
14060   ExprResult SubExpr
14061     = getDerived().TransformExpr(E->getSubExprAsWritten());
14062   if (SubExpr.isInvalid())
14063     return ExprError();
14064 
14065   if (!getDerived().AlwaysRebuild() &&
14066       Type == E->getTypeInfoAsWritten() &&
14067       SubExpr.get() == E->getSubExpr())
14068     return E;
14069 
14070   return getDerived().RebuildCXXFunctionalCastExpr(Type,
14071                                                    E->getLParenLoc(),
14072                                                    SubExpr.get(),
14073                                                    E->getRParenLoc(),
14074                                                    E->isListInitialization());
14075 }
14076 
14077 template<typename Derived>
14078 ExprResult
14079 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
14080   if (E->isTypeOperand()) {
14081     TypeSourceInfo *TInfo
14082       = getDerived().TransformType(E->getTypeOperandSourceInfo());
14083     if (!TInfo)
14084       return ExprError();
14085 
14086     if (!getDerived().AlwaysRebuild() &&
14087         TInfo == E->getTypeOperandSourceInfo())
14088       return E;
14089 
14090     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
14091                                              TInfo, E->getEndLoc());
14092   }
14093 
14094   // Typeid's operand is an unevaluated context, unless it's a polymorphic
14095   // type.  We must not unilaterally enter unevaluated context here, as then
14096   // semantic processing can re-transform an already transformed operand.
14097   Expr *Op = E->getExprOperand();
14098   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
14099   if (E->isGLValue())
14100     if (auto *RecordT = Op->getType()->getAs<RecordType>())
14101       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
14102         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
14103 
14104   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
14105                                                Sema::ReuseLambdaContextDecl);
14106 
14107   ExprResult SubExpr = getDerived().TransformExpr(Op);
14108   if (SubExpr.isInvalid())
14109     return ExprError();
14110 
14111   if (!getDerived().AlwaysRebuild() &&
14112       SubExpr.get() == E->getExprOperand())
14113     return E;
14114 
14115   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
14116                                            SubExpr.get(), E->getEndLoc());
14117 }
14118 
14119 template<typename Derived>
14120 ExprResult
14121 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
14122   if (E->isTypeOperand()) {
14123     TypeSourceInfo *TInfo
14124       = getDerived().TransformType(E->getTypeOperandSourceInfo());
14125     if (!TInfo)
14126       return ExprError();
14127 
14128     if (!getDerived().AlwaysRebuild() &&
14129         TInfo == E->getTypeOperandSourceInfo())
14130       return E;
14131 
14132     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
14133                                              TInfo, E->getEndLoc());
14134   }
14135 
14136   EnterExpressionEvaluationContext Unevaluated(
14137       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
14138 
14139   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
14140   if (SubExpr.isInvalid())
14141     return ExprError();
14142 
14143   if (!getDerived().AlwaysRebuild() &&
14144       SubExpr.get() == E->getExprOperand())
14145     return E;
14146 
14147   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
14148                                            SubExpr.get(), E->getEndLoc());
14149 }
14150 
14151 template<typename Derived>
14152 ExprResult
14153 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
14154   return E;
14155 }
14156 
14157 template<typename Derived>
14158 ExprResult
14159 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
14160                                                      CXXNullPtrLiteralExpr *E) {
14161   return E;
14162 }
14163 
14164 template<typename Derived>
14165 ExprResult
14166 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
14167 
14168   // In lambdas, the qualifiers of the type depends of where in
14169   // the call operator `this` appear, and we do not have a good way to
14170   // rebuild this information, so we transform the type.
14171   //
14172   // In other contexts, the type of `this` may be overrided
14173   // for type deduction, so we need to recompute it.
14174   //
14175   // Always recompute the type if we're in the body of a lambda, and
14176   // 'this' is dependent on a lambda's explicit object parameter.
14177   QualType T = [&]() {
14178     auto &S = getSema();
14179     if (E->isCapturedByCopyInLambdaWithExplicitObjectParameter())
14180       return S.getCurrentThisType();
14181     if (S.getCurLambda())
14182       return getDerived().TransformType(E->getType());
14183     return S.getCurrentThisType();
14184   }();
14185 
14186   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
14187     // Mark it referenced in the new context regardless.
14188     // FIXME: this is a bit instantiation-specific.
14189     getSema().MarkThisReferenced(E);
14190     return E;
14191   }
14192 
14193   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
14194 }
14195 
14196 template<typename Derived>
14197 ExprResult
14198 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
14199   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
14200   if (SubExpr.isInvalid())
14201     return ExprError();
14202 
14203   if (!getDerived().AlwaysRebuild() &&
14204       SubExpr.get() == E->getSubExpr())
14205     return E;
14206 
14207   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
14208                                           E->isThrownVariableInScope());
14209 }
14210 
14211 template<typename Derived>
14212 ExprResult
14213 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
14214   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
14215       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
14216   if (!Param)
14217     return ExprError();
14218 
14219   ExprResult InitRes;
14220   if (E->hasRewrittenInit()) {
14221     InitRes = getDerived().TransformExpr(E->getRewrittenExpr());
14222     if (InitRes.isInvalid())
14223       return ExprError();
14224   }
14225 
14226   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
14227       E->getUsedContext() == SemaRef.CurContext &&
14228       InitRes.get() == E->getRewrittenExpr())
14229     return E;
14230 
14231   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
14232                                                InitRes.get());
14233 }
14234 
14235 template<typename Derived>
14236 ExprResult
14237 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
14238   FieldDecl *Field = cast_or_null<FieldDecl>(
14239       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
14240   if (!Field)
14241     return ExprError();
14242 
14243   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
14244       E->getUsedContext() == SemaRef.CurContext)
14245     return E;
14246 
14247   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
14248 }
14249 
14250 template<typename Derived>
14251 ExprResult
14252 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
14253                                                     CXXScalarValueInitExpr *E) {
14254   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
14255   if (!T)
14256     return ExprError();
14257 
14258   if (!getDerived().AlwaysRebuild() &&
14259       T == E->getTypeSourceInfo())
14260     return E;
14261 
14262   return getDerived().RebuildCXXScalarValueInitExpr(T,
14263                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
14264                                                     E->getRParenLoc());
14265 }
14266 
14267 template<typename Derived>
14268 ExprResult
14269 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
14270   // Transform the type that we're allocating
14271   TypeSourceInfo *AllocTypeInfo =
14272       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
14273   if (!AllocTypeInfo)
14274     return ExprError();
14275 
14276   // Transform the size of the array we're allocating (if any).
14277   std::optional<Expr *> ArraySize;
14278   if (E->isArray()) {
14279     ExprResult NewArraySize;
14280     if (std::optional<Expr *> OldArraySize = E->getArraySize()) {
14281       NewArraySize = getDerived().TransformExpr(*OldArraySize);
14282       if (NewArraySize.isInvalid())
14283         return ExprError();
14284     }
14285     ArraySize = NewArraySize.get();
14286   }
14287 
14288   // Transform the placement arguments (if any).
14289   bool ArgumentChanged = false;
14290   SmallVector<Expr*, 8> PlacementArgs;
14291   if (getDerived().TransformExprs(E->getPlacementArgs(),
14292                                   E->getNumPlacementArgs(), true,
14293                                   PlacementArgs, &ArgumentChanged))
14294     return ExprError();
14295 
14296   // Transform the initializer (if any).
14297   Expr *OldInit = E->getInitializer();
14298   ExprResult NewInit;
14299   if (OldInit)
14300     NewInit = getDerived().TransformInitializer(OldInit, true);
14301   if (NewInit.isInvalid())
14302     return ExprError();
14303 
14304   // Transform new operator and delete operator.
14305   FunctionDecl *OperatorNew = nullptr;
14306   if (E->getOperatorNew()) {
14307     OperatorNew = cast_or_null<FunctionDecl>(
14308         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
14309     if (!OperatorNew)
14310       return ExprError();
14311   }
14312 
14313   FunctionDecl *OperatorDelete = nullptr;
14314   if (E->getOperatorDelete()) {
14315     OperatorDelete = cast_or_null<FunctionDecl>(
14316         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
14317     if (!OperatorDelete)
14318       return ExprError();
14319   }
14320 
14321   if (!getDerived().AlwaysRebuild() &&
14322       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
14323       ArraySize == E->getArraySize() &&
14324       NewInit.get() == OldInit &&
14325       OperatorNew == E->getOperatorNew() &&
14326       OperatorDelete == E->getOperatorDelete() &&
14327       !ArgumentChanged) {
14328     // Mark any declarations we need as referenced.
14329     // FIXME: instantiation-specific.
14330     if (OperatorNew)
14331       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
14332     if (OperatorDelete)
14333       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
14334 
14335     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
14336       QualType ElementType
14337         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
14338       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
14339         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
14340         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
14341           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
14342         }
14343       }
14344     }
14345 
14346     return E;
14347   }
14348 
14349   QualType AllocType = AllocTypeInfo->getType();
14350   if (!ArraySize) {
14351     // If no array size was specified, but the new expression was
14352     // instantiated with an array type (e.g., "new T" where T is
14353     // instantiated with "int[4]"), extract the outer bound from the
14354     // array type as our array size. We do this with constant and
14355     // dependently-sized array types.
14356     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
14357     if (!ArrayT) {
14358       // Do nothing
14359     } else if (const ConstantArrayType *ConsArrayT
14360                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
14361       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
14362                                          SemaRef.Context.getSizeType(),
14363                                          /*FIXME:*/ E->getBeginLoc());
14364       AllocType = ConsArrayT->getElementType();
14365     } else if (const DependentSizedArrayType *DepArrayT
14366                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
14367       if (DepArrayT->getSizeExpr()) {
14368         ArraySize = DepArrayT->getSizeExpr();
14369         AllocType = DepArrayT->getElementType();
14370       }
14371     }
14372   }
14373 
14374   return getDerived().RebuildCXXNewExpr(
14375       E->getBeginLoc(), E->isGlobalNew(),
14376       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
14377       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
14378       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
14379 }
14380 
14381 template<typename Derived>
14382 ExprResult
14383 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
14384   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
14385   if (Operand.isInvalid())
14386     return ExprError();
14387 
14388   // Transform the delete operator, if known.
14389   FunctionDecl *OperatorDelete = nullptr;
14390   if (E->getOperatorDelete()) {
14391     OperatorDelete = cast_or_null<FunctionDecl>(
14392         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
14393     if (!OperatorDelete)
14394       return ExprError();
14395   }
14396 
14397   if (!getDerived().AlwaysRebuild() &&
14398       Operand.get() == E->getArgument() &&
14399       OperatorDelete == E->getOperatorDelete()) {
14400     // Mark any declarations we need as referenced.
14401     // FIXME: instantiation-specific.
14402     if (OperatorDelete)
14403       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
14404 
14405     if (!E->getArgument()->isTypeDependent()) {
14406       QualType Destroyed = SemaRef.Context.getBaseElementType(
14407                                                          E->getDestroyedType());
14408       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
14409         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
14410         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
14411                                        SemaRef.LookupDestructor(Record));
14412       }
14413     }
14414 
14415     return E;
14416   }
14417 
14418   return getDerived().RebuildCXXDeleteExpr(
14419       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
14420 }
14421 
14422 template<typename Derived>
14423 ExprResult
14424 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
14425                                                      CXXPseudoDestructorExpr *E) {
14426   ExprResult Base = getDerived().TransformExpr(E->getBase());
14427   if (Base.isInvalid())
14428     return ExprError();
14429 
14430   ParsedType ObjectTypePtr;
14431   bool MayBePseudoDestructor = false;
14432   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
14433                                               E->getOperatorLoc(),
14434                                         E->isArrow()? tok::arrow : tok::period,
14435                                               ObjectTypePtr,
14436                                               MayBePseudoDestructor);
14437   if (Base.isInvalid())
14438     return ExprError();
14439 
14440   QualType ObjectType = ObjectTypePtr.get();
14441   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
14442   if (QualifierLoc) {
14443     QualifierLoc
14444       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
14445     if (!QualifierLoc)
14446       return ExprError();
14447   }
14448   CXXScopeSpec SS;
14449   SS.Adopt(QualifierLoc);
14450 
14451   PseudoDestructorTypeStorage Destroyed;
14452   if (E->getDestroyedTypeInfo()) {
14453     TypeSourceInfo *DestroyedTypeInfo
14454       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
14455                                                 ObjectType, nullptr, SS);
14456     if (!DestroyedTypeInfo)
14457       return ExprError();
14458     Destroyed = DestroyedTypeInfo;
14459   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
14460     // We aren't likely to be able to resolve the identifier down to a type
14461     // now anyway, so just retain the identifier.
14462     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
14463                                             E->getDestroyedTypeLoc());
14464   } else {
14465     // Look for a destructor known with the given name.
14466     ParsedType T = SemaRef.getDestructorName(
14467         *E->getDestroyedTypeIdentifier(), E->getDestroyedTypeLoc(),
14468         /*Scope=*/nullptr, SS, ObjectTypePtr, false);
14469     if (!T)
14470       return ExprError();
14471 
14472     Destroyed
14473       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
14474                                                  E->getDestroyedTypeLoc());
14475   }
14476 
14477   TypeSourceInfo *ScopeTypeInfo = nullptr;
14478   if (E->getScopeTypeInfo()) {
14479     CXXScopeSpec EmptySS;
14480     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
14481                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
14482     if (!ScopeTypeInfo)
14483       return ExprError();
14484   }
14485 
14486   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
14487                                                      E->getOperatorLoc(),
14488                                                      E->isArrow(),
14489                                                      SS,
14490                                                      ScopeTypeInfo,
14491                                                      E->getColonColonLoc(),
14492                                                      E->getTildeLoc(),
14493                                                      Destroyed);
14494 }
14495 
14496 template <typename Derived>
14497 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
14498                                                         bool RequiresADL,
14499                                                         LookupResult &R) {
14500   // Transform all the decls.
14501   bool AllEmptyPacks = true;
14502   for (auto *OldD : Old->decls()) {
14503     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
14504     if (!InstD) {
14505       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
14506       // This can happen because of dependent hiding.
14507       if (isa<UsingShadowDecl>(OldD))
14508         continue;
14509       else {
14510         R.clear();
14511         return true;
14512       }
14513     }
14514 
14515     // Expand using pack declarations.
14516     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
14517     ArrayRef<NamedDecl*> Decls = SingleDecl;
14518     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
14519       Decls = UPD->expansions();
14520 
14521     // Expand using declarations.
14522     for (auto *D : Decls) {
14523       if (auto *UD = dyn_cast<UsingDecl>(D)) {
14524         for (auto *SD : UD->shadows())
14525           R.addDecl(SD);
14526       } else {
14527         R.addDecl(D);
14528       }
14529     }
14530 
14531     AllEmptyPacks &= Decls.empty();
14532   }
14533 
14534   // C++ [temp.res]/8.4.2:
14535   //   The program is ill-formed, no diagnostic required, if [...] lookup for
14536   //   a name in the template definition found a using-declaration, but the
14537   //   lookup in the corresponding scope in the instantiation odoes not find
14538   //   any declarations because the using-declaration was a pack expansion and
14539   //   the corresponding pack is empty
14540   if (AllEmptyPacks && !RequiresADL) {
14541     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
14542         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
14543     return true;
14544   }
14545 
14546   // Resolve a kind, but don't do any further analysis.  If it's
14547   // ambiguous, the callee needs to deal with it.
14548   R.resolveKind();
14549 
14550   if (Old->hasTemplateKeyword() && !R.empty()) {
14551     NamedDecl *FoundDecl = R.getRepresentativeDecl()->getUnderlyingDecl();
14552     getSema().FilterAcceptableTemplateNames(R,
14553                                             /*AllowFunctionTemplates=*/true,
14554                                             /*AllowDependent=*/true);
14555     if (R.empty()) {
14556       // If a 'template' keyword was used, a lookup that finds only non-template
14557       // names is an error.
14558       getSema().Diag(R.getNameLoc(),
14559                      diag::err_template_kw_refers_to_non_template)
14560           << R.getLookupName() << Old->getQualifierLoc().getSourceRange()
14561           << Old->hasTemplateKeyword() << Old->getTemplateKeywordLoc();
14562       getSema().Diag(FoundDecl->getLocation(),
14563                      diag::note_template_kw_refers_to_non_template)
14564           << R.getLookupName();
14565       return true;
14566     }
14567   }
14568 
14569   return false;
14570 }
14571 
14572 template <typename Derived>
14573 ExprResult TreeTransform<Derived>::TransformUnresolvedLookupExpr(
14574     UnresolvedLookupExpr *Old) {
14575   return TransformUnresolvedLookupExpr(Old, /*IsAddressOfOperand=*/false);
14576 }
14577 
14578 template <typename Derived>
14579 ExprResult
14580 TreeTransform<Derived>::TransformUnresolvedLookupExpr(UnresolvedLookupExpr *Old,
14581                                                       bool IsAddressOfOperand) {
14582   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
14583                  Sema::LookupOrdinaryName);
14584 
14585   // Transform the declaration set.
14586   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
14587     return ExprError();
14588 
14589   // Rebuild the nested-name qualifier, if present.
14590   CXXScopeSpec SS;
14591   if (Old->getQualifierLoc()) {
14592     NestedNameSpecifierLoc QualifierLoc
14593       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
14594     if (!QualifierLoc)
14595       return ExprError();
14596 
14597     SS.Adopt(QualifierLoc);
14598   }
14599 
14600   if (Old->getNamingClass()) {
14601     CXXRecordDecl *NamingClass
14602       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
14603                                                             Old->getNameLoc(),
14604                                                         Old->getNamingClass()));
14605     if (!NamingClass) {
14606       R.clear();
14607       return ExprError();
14608     }
14609 
14610     R.setNamingClass(NamingClass);
14611   }
14612 
14613   // Rebuild the template arguments, if any.
14614   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
14615   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
14616   if (Old->hasExplicitTemplateArgs() &&
14617       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
14618                                               Old->getNumTemplateArgs(),
14619                                               TransArgs)) {
14620     R.clear();
14621     return ExprError();
14622   }
14623 
14624   // An UnresolvedLookupExpr can refer to a class member. This occurs e.g. when
14625   // a non-static data member is named in an unevaluated operand, or when
14626   // a member is named in a dependent class scope function template explicit
14627   // specialization that is neither declared static nor with an explicit object
14628   // parameter.
14629   if (SemaRef.isPotentialImplicitMemberAccess(SS, R, IsAddressOfOperand))
14630     return SemaRef.BuildPossibleImplicitMemberExpr(
14631         SS, TemplateKWLoc, R,
14632         Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr,
14633         /*S=*/nullptr);
14634 
14635   // If we have neither explicit template arguments, nor the template keyword,
14636   // it's a normal declaration name or member reference.
14637   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
14638     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
14639 
14640   // If we have template arguments, then rebuild the template-id expression.
14641   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
14642                                             Old->requiresADL(), &TransArgs);
14643 }
14644 
14645 template<typename Derived>
14646 ExprResult
14647 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
14648   bool ArgChanged = false;
14649   SmallVector<TypeSourceInfo *, 4> Args;
14650   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
14651     TypeSourceInfo *From = E->getArg(I);
14652     TypeLoc FromTL = From->getTypeLoc();
14653     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
14654       TypeLocBuilder TLB;
14655       TLB.reserve(FromTL.getFullDataSize());
14656       QualType To = getDerived().TransformType(TLB, FromTL);
14657       if (To.isNull())
14658         return ExprError();
14659 
14660       if (To == From->getType())
14661         Args.push_back(From);
14662       else {
14663         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
14664         ArgChanged = true;
14665       }
14666       continue;
14667     }
14668 
14669     ArgChanged = true;
14670 
14671     // We have a pack expansion. Instantiate it.
14672     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
14673     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
14674     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14675     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
14676 
14677     // Determine whether the set of unexpanded parameter packs can and should
14678     // be expanded.
14679     bool Expand = true;
14680     bool RetainExpansion = false;
14681     std::optional<unsigned> OrigNumExpansions =
14682         ExpansionTL.getTypePtr()->getNumExpansions();
14683     std::optional<unsigned> NumExpansions = OrigNumExpansions;
14684     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
14685                                              PatternTL.getSourceRange(),
14686                                              Unexpanded,
14687                                              Expand, RetainExpansion,
14688                                              NumExpansions))
14689       return ExprError();
14690 
14691     if (!Expand) {
14692       // The transform has determined that we should perform a simple
14693       // transformation on the pack expansion, producing another pack
14694       // expansion.
14695       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14696 
14697       TypeLocBuilder TLB;
14698       TLB.reserve(From->getTypeLoc().getFullDataSize());
14699 
14700       QualType To = getDerived().TransformType(TLB, PatternTL);
14701       if (To.isNull())
14702         return ExprError();
14703 
14704       To = getDerived().RebuildPackExpansionType(To,
14705                                                  PatternTL.getSourceRange(),
14706                                                  ExpansionTL.getEllipsisLoc(),
14707                                                  NumExpansions);
14708       if (To.isNull())
14709         return ExprError();
14710 
14711       PackExpansionTypeLoc ToExpansionTL
14712         = TLB.push<PackExpansionTypeLoc>(To);
14713       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14714       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
14715       continue;
14716     }
14717 
14718     // Expand the pack expansion by substituting for each argument in the
14719     // pack(s).
14720     for (unsigned I = 0; I != *NumExpansions; ++I) {
14721       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
14722       TypeLocBuilder TLB;
14723       TLB.reserve(PatternTL.getFullDataSize());
14724       QualType To = getDerived().TransformType(TLB, PatternTL);
14725       if (To.isNull())
14726         return ExprError();
14727 
14728       if (To->containsUnexpandedParameterPack()) {
14729         To = getDerived().RebuildPackExpansionType(To,
14730                                                    PatternTL.getSourceRange(),
14731                                                    ExpansionTL.getEllipsisLoc(),
14732                                                    NumExpansions);
14733         if (To.isNull())
14734           return ExprError();
14735 
14736         PackExpansionTypeLoc ToExpansionTL
14737           = TLB.push<PackExpansionTypeLoc>(To);
14738         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14739       }
14740 
14741       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
14742     }
14743 
14744     if (!RetainExpansion)
14745       continue;
14746 
14747     // If we're supposed to retain a pack expansion, do so by temporarily
14748     // forgetting the partially-substituted parameter pack.
14749     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14750 
14751     TypeLocBuilder TLB;
14752     TLB.reserve(From->getTypeLoc().getFullDataSize());
14753 
14754     QualType To = getDerived().TransformType(TLB, PatternTL);
14755     if (To.isNull())
14756       return ExprError();
14757 
14758     To = getDerived().RebuildPackExpansionType(To,
14759                                                PatternTL.getSourceRange(),
14760                                                ExpansionTL.getEllipsisLoc(),
14761                                                NumExpansions);
14762     if (To.isNull())
14763       return ExprError();
14764 
14765     PackExpansionTypeLoc ToExpansionTL
14766       = TLB.push<PackExpansionTypeLoc>(To);
14767     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
14768     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
14769   }
14770 
14771   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14772     return E;
14773 
14774   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
14775                                        E->getEndLoc());
14776 }
14777 
14778 template<typename Derived>
14779 ExprResult
14780 TreeTransform<Derived>::TransformConceptSpecializationExpr(
14781                                                  ConceptSpecializationExpr *E) {
14782   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
14783   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
14784   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
14785                                               Old->NumTemplateArgs, TransArgs))
14786     return ExprError();
14787 
14788   return getDerived().RebuildConceptSpecializationExpr(
14789       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
14790       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
14791       &TransArgs);
14792 }
14793 
14794 template<typename Derived>
14795 ExprResult
14796 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
14797   SmallVector<ParmVarDecl*, 4> TransParams;
14798   SmallVector<QualType, 4> TransParamTypes;
14799   Sema::ExtParameterInfoBuilder ExtParamInfos;
14800 
14801   // C++2a [expr.prim.req]p2
14802   // Expressions appearing within a requirement-body are unevaluated operands.
14803   EnterExpressionEvaluationContext Ctx(
14804       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
14805       Sema::ReuseLambdaContextDecl);
14806 
14807   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
14808       getSema().Context, getSema().CurContext,
14809       E->getBody()->getBeginLoc());
14810 
14811   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
14812 
14813   ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
14814       E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body,
14815       E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
14816 
14817   for (ParmVarDecl *Param : TransParams)
14818     if (Param)
14819       Param->setDeclContext(Body);
14820 
14821   // On failure to transform, TransformRequiresTypeParams returns an expression
14822   // in the event that the transformation of the type params failed in some way.
14823   // It is expected that this will result in a 'not satisfied' Requires clause
14824   // when instantiating.
14825   if (!TypeParamResult.isUnset())
14826     return TypeParamResult;
14827 
14828   SmallVector<concepts::Requirement *, 4> TransReqs;
14829   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
14830                                                      TransReqs))
14831     return ExprError();
14832 
14833   for (concepts::Requirement *Req : TransReqs) {
14834     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
14835       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
14836         ER->getReturnTypeRequirement()
14837                 .getTypeConstraintTemplateParameterList()->getParam(0)
14838                 ->setDeclContext(Body);
14839       }
14840     }
14841   }
14842 
14843   return getDerived().RebuildRequiresExpr(
14844       E->getRequiresKWLoc(), Body, E->getLParenLoc(), TransParams,
14845       E->getRParenLoc(), TransReqs, E->getRBraceLoc());
14846 }
14847 
14848 template<typename Derived>
14849 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
14850     ArrayRef<concepts::Requirement *> Reqs,
14851     SmallVectorImpl<concepts::Requirement *> &Transformed) {
14852   for (concepts::Requirement *Req : Reqs) {
14853     concepts::Requirement *TransReq = nullptr;
14854     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
14855       TransReq = getDerived().TransformTypeRequirement(TypeReq);
14856     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
14857       TransReq = getDerived().TransformExprRequirement(ExprReq);
14858     else
14859       TransReq = getDerived().TransformNestedRequirement(
14860                      cast<concepts::NestedRequirement>(Req));
14861     if (!TransReq)
14862       return true;
14863     Transformed.push_back(TransReq);
14864   }
14865   return false;
14866 }
14867 
14868 template<typename Derived>
14869 concepts::TypeRequirement *
14870 TreeTransform<Derived>::TransformTypeRequirement(
14871     concepts::TypeRequirement *Req) {
14872   if (Req->isSubstitutionFailure()) {
14873     if (getDerived().AlwaysRebuild())
14874       return getDerived().RebuildTypeRequirement(
14875               Req->getSubstitutionDiagnostic());
14876     return Req;
14877   }
14878   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
14879   if (!TransType)
14880     return nullptr;
14881   return getDerived().RebuildTypeRequirement(TransType);
14882 }
14883 
14884 template<typename Derived>
14885 concepts::ExprRequirement *
14886 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
14887   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
14888   if (Req->isExprSubstitutionFailure())
14889     TransExpr = Req->getExprSubstitutionDiagnostic();
14890   else {
14891     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
14892     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
14893       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
14894     if (TransExprRes.isInvalid())
14895       return nullptr;
14896     TransExpr = TransExprRes.get();
14897   }
14898 
14899   std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
14900   const auto &RetReq = Req->getReturnTypeRequirement();
14901   if (RetReq.isEmpty())
14902     TransRetReq.emplace();
14903   else if (RetReq.isSubstitutionFailure())
14904     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
14905   else if (RetReq.isTypeConstraint()) {
14906     TemplateParameterList *OrigTPL =
14907         RetReq.getTypeConstraintTemplateParameterList();
14908     TemplateParameterList *TPL =
14909         getDerived().TransformTemplateParameterList(OrigTPL);
14910     if (!TPL)
14911       return nullptr;
14912     TransRetReq.emplace(TPL);
14913   }
14914   assert(TransRetReq && "All code paths leading here must set TransRetReq");
14915   if (Expr *E = dyn_cast<Expr *>(TransExpr))
14916     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
14917                                                Req->getNoexceptLoc(),
14918                                                std::move(*TransRetReq));
14919   return getDerived().RebuildExprRequirement(
14920       cast<concepts::Requirement::SubstitutionDiagnostic *>(TransExpr),
14921       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
14922 }
14923 
14924 template<typename Derived>
14925 concepts::NestedRequirement *
14926 TreeTransform<Derived>::TransformNestedRequirement(
14927     concepts::NestedRequirement *Req) {
14928   if (Req->hasInvalidConstraint()) {
14929     if (getDerived().AlwaysRebuild())
14930       return getDerived().RebuildNestedRequirement(
14931           Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction());
14932     return Req;
14933   }
14934   ExprResult TransConstraint =
14935       getDerived().TransformExpr(Req->getConstraintExpr());
14936   if (TransConstraint.isInvalid())
14937     return nullptr;
14938   return getDerived().RebuildNestedRequirement(TransConstraint.get());
14939 }
14940 
14941 template<typename Derived>
14942 ExprResult
14943 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
14944   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
14945   if (!T)
14946     return ExprError();
14947 
14948   if (!getDerived().AlwaysRebuild() &&
14949       T == E->getQueriedTypeSourceInfo())
14950     return E;
14951 
14952   ExprResult SubExpr;
14953   {
14954     EnterExpressionEvaluationContext Unevaluated(
14955         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
14956     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
14957     if (SubExpr.isInvalid())
14958       return ExprError();
14959   }
14960 
14961   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
14962                                             SubExpr.get(), E->getEndLoc());
14963 }
14964 
14965 template<typename Derived>
14966 ExprResult
14967 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
14968   ExprResult SubExpr;
14969   {
14970     EnterExpressionEvaluationContext Unevaluated(
14971         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
14972     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
14973     if (SubExpr.isInvalid())
14974       return ExprError();
14975 
14976     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
14977       return E;
14978   }
14979 
14980   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
14981                                              SubExpr.get(), E->getEndLoc());
14982 }
14983 
14984 template <typename Derived>
14985 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
14986     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
14987     TypeSourceInfo **RecoveryTSI) {
14988   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
14989       DRE, AddrTaken, RecoveryTSI);
14990 
14991   // Propagate both errors and recovered types, which return ExprEmpty.
14992   if (!NewDRE.isUsable())
14993     return NewDRE;
14994 
14995   // We got an expr, wrap it up in parens.
14996   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
14997     return PE;
14998   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
14999                                        PE->getRParen());
15000 }
15001 
15002 template <typename Derived>
15003 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
15004     DependentScopeDeclRefExpr *E) {
15005   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
15006                                             nullptr);
15007 }
15008 
15009 template <typename Derived>
15010 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
15011     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
15012     TypeSourceInfo **RecoveryTSI) {
15013   assert(E->getQualifierLoc());
15014   NestedNameSpecifierLoc QualifierLoc =
15015       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
15016   if (!QualifierLoc)
15017     return ExprError();
15018   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
15019 
15020   // TODO: If this is a conversion-function-id, verify that the
15021   // destination type name (if present) resolves the same way after
15022   // instantiation as it did in the local scope.
15023 
15024   DeclarationNameInfo NameInfo =
15025       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
15026   if (!NameInfo.getName())
15027     return ExprError();
15028 
15029   if (!E->hasExplicitTemplateArgs()) {
15030     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
15031         // Note: it is sufficient to compare the Name component of NameInfo:
15032         // if name has not changed, DNLoc has not changed either.
15033         NameInfo.getName() == E->getDeclName())
15034       return E;
15035 
15036     return getDerived().RebuildDependentScopeDeclRefExpr(
15037         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
15038         IsAddressOfOperand, RecoveryTSI);
15039   }
15040 
15041   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
15042   if (getDerived().TransformTemplateArguments(
15043           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
15044     return ExprError();
15045 
15046   return getDerived().RebuildDependentScopeDeclRefExpr(
15047       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
15048       RecoveryTSI);
15049 }
15050 
15051 template<typename Derived>
15052 ExprResult
15053 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
15054   // CXXConstructExprs other than for list-initialization and
15055   // CXXTemporaryObjectExpr are always implicit, so when we have
15056   // a 1-argument construction we just transform that argument.
15057   if (getDerived().AllowSkippingCXXConstructExpr() &&
15058       ((E->getNumArgs() == 1 ||
15059         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
15060        (!getDerived().DropCallArgument(E->getArg(0))) &&
15061        !E->isListInitialization()))
15062     return getDerived().TransformInitializer(E->getArg(0),
15063                                              /*DirectInit*/ false);
15064 
15065   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
15066 
15067   QualType T = getDerived().TransformType(E->getType());
15068   if (T.isNull())
15069     return ExprError();
15070 
15071   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
15072       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
15073   if (!Constructor)
15074     return ExprError();
15075 
15076   bool ArgumentChanged = false;
15077   SmallVector<Expr*, 8> Args;
15078   {
15079     EnterExpressionEvaluationContext Context(
15080         getSema(), EnterExpressionEvaluationContext::InitList,
15081         E->isListInitialization());
15082     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
15083                                     &ArgumentChanged))
15084       return ExprError();
15085   }
15086 
15087   if (!getDerived().AlwaysRebuild() &&
15088       T == E->getType() &&
15089       Constructor == E->getConstructor() &&
15090       !ArgumentChanged) {
15091     // Mark the constructor as referenced.
15092     // FIXME: Instantiation-specific
15093     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
15094     return E;
15095   }
15096 
15097   return getDerived().RebuildCXXConstructExpr(
15098       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
15099       E->hadMultipleCandidates(), E->isListInitialization(),
15100       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
15101       E->getConstructionKind(), E->getParenOrBraceRange());
15102 }
15103 
15104 template<typename Derived>
15105 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
15106     CXXInheritedCtorInitExpr *E) {
15107   QualType T = getDerived().TransformType(E->getType());
15108   if (T.isNull())
15109     return ExprError();
15110 
15111   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
15112       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
15113   if (!Constructor)
15114     return ExprError();
15115 
15116   if (!getDerived().AlwaysRebuild() &&
15117       T == E->getType() &&
15118       Constructor == E->getConstructor()) {
15119     // Mark the constructor as referenced.
15120     // FIXME: Instantiation-specific
15121     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
15122     return E;
15123   }
15124 
15125   return getDerived().RebuildCXXInheritedCtorInitExpr(
15126       T, E->getLocation(), Constructor,
15127       E->constructsVBase(), E->inheritedFromVBase());
15128 }
15129 
15130 /// Transform a C++ temporary-binding expression.
15131 ///
15132 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
15133 /// transform the subexpression and return that.
15134 template<typename Derived>
15135 ExprResult
15136 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
15137   if (auto *Dtor = E->getTemporary()->getDestructor())
15138     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
15139                                    const_cast<CXXDestructorDecl *>(Dtor));
15140   return getDerived().TransformExpr(E->getSubExpr());
15141 }
15142 
15143 /// Transform a C++ expression that contains cleanups that should
15144 /// be run after the expression is evaluated.
15145 ///
15146 /// Since ExprWithCleanups nodes are implicitly generated, we
15147 /// just transform the subexpression and return that.
15148 template<typename Derived>
15149 ExprResult
15150 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
15151   return getDerived().TransformExpr(E->getSubExpr());
15152 }
15153 
15154 template<typename Derived>
15155 ExprResult
15156 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
15157                                                     CXXTemporaryObjectExpr *E) {
15158   TypeSourceInfo *T =
15159       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
15160   if (!T)
15161     return ExprError();
15162 
15163   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
15164       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
15165   if (!Constructor)
15166     return ExprError();
15167 
15168   bool ArgumentChanged = false;
15169   SmallVector<Expr*, 8> Args;
15170   Args.reserve(E->getNumArgs());
15171   {
15172     EnterExpressionEvaluationContext Context(
15173         getSema(), EnterExpressionEvaluationContext::InitList,
15174         E->isListInitialization());
15175     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
15176                        &ArgumentChanged))
15177       return ExprError();
15178 
15179     if (E->isListInitialization() && !E->isStdInitListInitialization()) {
15180       ExprResult Res = RebuildInitList(E->getBeginLoc(), Args, E->getEndLoc());
15181       if (Res.isInvalid())
15182         return ExprError();
15183       Args = {Res.get()};
15184     }
15185   }
15186 
15187   if (!getDerived().AlwaysRebuild() &&
15188       T == E->getTypeSourceInfo() &&
15189       Constructor == E->getConstructor() &&
15190       !ArgumentChanged) {
15191     // FIXME: Instantiation-specific
15192     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
15193     return SemaRef.MaybeBindToTemporary(E);
15194   }
15195 
15196   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
15197   return getDerived().RebuildCXXTemporaryObjectExpr(
15198       T, LParenLoc, Args, E->getEndLoc(), E->isListInitialization());
15199 }
15200 
15201 template<typename Derived>
15202 ExprResult
15203 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
15204   // Transform any init-capture expressions before entering the scope of the
15205   // lambda body, because they are not semantically within that scope.
15206   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
15207   struct TransformedInitCapture {
15208     // The location of the ... if the result is retaining a pack expansion.
15209     SourceLocation EllipsisLoc;
15210     // Zero or more expansions of the init-capture.
15211     SmallVector<InitCaptureInfoTy, 4> Expansions;
15212   };
15213   SmallVector<TransformedInitCapture, 4> InitCaptures;
15214   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
15215   for (LambdaExpr::capture_iterator C = E->capture_begin(),
15216                                     CEnd = E->capture_end();
15217        C != CEnd; ++C) {
15218     if (!E->isInitCapture(C))
15219       continue;
15220 
15221     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
15222     auto *OldVD = cast<VarDecl>(C->getCapturedVar());
15223 
15224     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
15225                                 std::optional<unsigned> NumExpansions) {
15226       ExprResult NewExprInitResult = getDerived().TransformInitializer(
15227           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
15228 
15229       if (NewExprInitResult.isInvalid()) {
15230         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
15231         return;
15232       }
15233       Expr *NewExprInit = NewExprInitResult.get();
15234 
15235       QualType NewInitCaptureType =
15236           getSema().buildLambdaInitCaptureInitialization(
15237               C->getLocation(), C->getCaptureKind() == LCK_ByRef,
15238               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
15239               cast<VarDecl>(C->getCapturedVar())->getInitStyle() !=
15240                   VarDecl::CInit,
15241               NewExprInit);
15242       Result.Expansions.push_back(
15243           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
15244     };
15245 
15246     // If this is an init-capture pack, consider expanding the pack now.
15247     if (OldVD->isParameterPack()) {
15248       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
15249                                              ->getTypeLoc()
15250                                              .castAs<PackExpansionTypeLoc>();
15251       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
15252       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
15253 
15254       // Determine whether the set of unexpanded parameter packs can and should
15255       // be expanded.
15256       bool Expand = true;
15257       bool RetainExpansion = false;
15258       std::optional<unsigned> OrigNumExpansions =
15259           ExpansionTL.getTypePtr()->getNumExpansions();
15260       std::optional<unsigned> NumExpansions = OrigNumExpansions;
15261       if (getDerived().TryExpandParameterPacks(
15262               ExpansionTL.getEllipsisLoc(),
15263               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
15264               RetainExpansion, NumExpansions))
15265         return ExprError();
15266       assert(!RetainExpansion && "Should not need to retain expansion after a "
15267                                  "capture since it cannot be extended");
15268       if (Expand) {
15269         for (unsigned I = 0; I != *NumExpansions; ++I) {
15270           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15271           SubstInitCapture(SourceLocation(), std::nullopt);
15272         }
15273       } else {
15274         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
15275         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
15276       }
15277     } else {
15278       SubstInitCapture(SourceLocation(), std::nullopt);
15279     }
15280   }
15281 
15282   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
15283   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
15284 
15285   // Create the local class that will describe the lambda.
15286 
15287   // FIXME: DependencyKind below is wrong when substituting inside a templated
15288   // context that isn't a DeclContext (such as a variable template), or when
15289   // substituting an unevaluated lambda inside of a function's parameter's type
15290   // - as parameter types are not instantiated from within a function's DC. We
15291   // use evaluation contexts to distinguish the function parameter case.
15292   CXXRecordDecl::LambdaDependencyKind DependencyKind =
15293       CXXRecordDecl::LDK_Unknown;
15294   DeclContext *DC = getSema().CurContext;
15295   // A RequiresExprBodyDecl is not interesting for dependencies.
15296   // For the following case,
15297   //
15298   // template <typename>
15299   // concept C = requires { [] {}; };
15300   //
15301   // template <class F>
15302   // struct Widget;
15303   //
15304   // template <C F>
15305   // struct Widget<F> {};
15306   //
15307   // While we are substituting Widget<F>, the parent of DC would be
15308   // the template specialization itself. Thus, the lambda expression
15309   // will be deemed as dependent even if there are no dependent template
15310   // arguments.
15311   // (A ClassTemplateSpecializationDecl is always a dependent context.)
15312   while (DC->isRequiresExprBody())
15313     DC = DC->getParent();
15314   if ((getSema().isUnevaluatedContext() ||
15315        getSema().isConstantEvaluatedContext()) &&
15316       (DC->isFileContext() || !DC->getParent()->isDependentContext()))
15317     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
15318 
15319   CXXRecordDecl *OldClass = E->getLambdaClass();
15320   CXXRecordDecl *Class = getSema().createLambdaClosureType(
15321       E->getIntroducerRange(), /*Info=*/nullptr, DependencyKind,
15322       E->getCaptureDefault());
15323   getDerived().transformedLocalDecl(OldClass, {Class});
15324 
15325   CXXMethodDecl *NewCallOperator =
15326       getSema().CreateLambdaCallOperator(E->getIntroducerRange(), Class);
15327 
15328   // Enter the scope of the lambda.
15329   getSema().buildLambdaScope(LSI, NewCallOperator, E->getIntroducerRange(),
15330                              E->getCaptureDefault(), E->getCaptureDefaultLoc(),
15331                              E->hasExplicitParameters(), E->isMutable());
15332 
15333   // Introduce the context of the call operator.
15334   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
15335                                  /*NewThisContext*/false);
15336 
15337   bool Invalid = false;
15338 
15339   // Transform captures.
15340   for (LambdaExpr::capture_iterator C = E->capture_begin(),
15341                                  CEnd = E->capture_end();
15342        C != CEnd; ++C) {
15343     // When we hit the first implicit capture, tell Sema that we've finished
15344     // the list of explicit captures.
15345     if (C->isImplicit())
15346       break;
15347 
15348     // Capturing 'this' is trivial.
15349     if (C->capturesThis()) {
15350       // If this is a lambda that is part of a default member initialiser
15351       // and which we're instantiating outside the class that 'this' is
15352       // supposed to refer to, adjust the type of 'this' accordingly.
15353       //
15354       // Otherwise, leave the type of 'this' as-is.
15355       Sema::CXXThisScopeRAII ThisScope(
15356           getSema(),
15357           dyn_cast_if_present<CXXRecordDecl>(
15358               getSema().getFunctionLevelDeclContext()),
15359           Qualifiers());
15360       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
15361                                     /*BuildAndDiagnose*/ true, nullptr,
15362                                     C->getCaptureKind() == LCK_StarThis);
15363       continue;
15364     }
15365     // Captured expression will be recaptured during captured variables
15366     // rebuilding.
15367     if (C->capturesVLAType())
15368       continue;
15369 
15370     // Rebuild init-captures, including the implied field declaration.
15371     if (E->isInitCapture(C)) {
15372       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
15373 
15374       auto *OldVD = cast<VarDecl>(C->getCapturedVar());
15375       llvm::SmallVector<Decl*, 4> NewVDs;
15376 
15377       for (InitCaptureInfoTy &Info : NewC.Expansions) {
15378         ExprResult Init = Info.first;
15379         QualType InitQualType = Info.second;
15380         if (Init.isInvalid() || InitQualType.isNull()) {
15381           Invalid = true;
15382           break;
15383         }
15384         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
15385             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
15386             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get(),
15387             getSema().CurContext);
15388         if (!NewVD) {
15389           Invalid = true;
15390           break;
15391         }
15392         NewVDs.push_back(NewVD);
15393         getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef);
15394         // Cases we want to tackle:
15395         //   ([C(Pack)] {}, ...)
15396         // But rule out cases e.g.
15397         //    [...C = Pack()] {}
15398         if (NewC.EllipsisLoc.isInvalid())
15399           LSI->ContainsUnexpandedParameterPack |=
15400               Init.get()->containsUnexpandedParameterPack();
15401       }
15402 
15403       if (Invalid)
15404         break;
15405 
15406       getDerived().transformedLocalDecl(OldVD, NewVDs);
15407       continue;
15408     }
15409 
15410     assert(C->capturesVariable() && "unexpected kind of lambda capture");
15411 
15412     // Determine the capture kind for Sema.
15413     Sema::TryCaptureKind Kind
15414       = C->isImplicit()? Sema::TryCapture_Implicit
15415                        : C->getCaptureKind() == LCK_ByCopy
15416                            ? Sema::TryCapture_ExplicitByVal
15417                            : Sema::TryCapture_ExplicitByRef;
15418     SourceLocation EllipsisLoc;
15419     if (C->isPackExpansion()) {
15420       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
15421       bool ShouldExpand = false;
15422       bool RetainExpansion = false;
15423       std::optional<unsigned> NumExpansions;
15424       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
15425                                                C->getLocation(),
15426                                                Unexpanded,
15427                                                ShouldExpand, RetainExpansion,
15428                                                NumExpansions)) {
15429         Invalid = true;
15430         continue;
15431       }
15432 
15433       if (ShouldExpand) {
15434         // The transform has determined that we should perform an expansion;
15435         // transform and capture each of the arguments.
15436         // expansion of the pattern. Do so.
15437         auto *Pack = cast<ValueDecl>(C->getCapturedVar());
15438         for (unsigned I = 0; I != *NumExpansions; ++I) {
15439           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
15440           ValueDecl *CapturedVar = cast_if_present<ValueDecl>(
15441               getDerived().TransformDecl(C->getLocation(), Pack));
15442           if (!CapturedVar) {
15443             Invalid = true;
15444             continue;
15445           }
15446 
15447           // Capture the transformed variable.
15448           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
15449         }
15450 
15451         // FIXME: Retain a pack expansion if RetainExpansion is true.
15452 
15453         continue;
15454       }
15455 
15456       EllipsisLoc = C->getEllipsisLoc();
15457     }
15458 
15459     // Transform the captured variable.
15460     auto *CapturedVar = cast_or_null<ValueDecl>(
15461         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
15462     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
15463       Invalid = true;
15464       continue;
15465     }
15466 
15467     // This is not an init-capture; however it contains an unexpanded pack e.g.
15468     //  ([Pack] {}(), ...)
15469     if (auto *VD = dyn_cast<VarDecl>(CapturedVar); VD && !C->isPackExpansion())
15470       LSI->ContainsUnexpandedParameterPack |= VD->isParameterPack();
15471 
15472     // Capture the transformed variable.
15473     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
15474                                  EllipsisLoc);
15475   }
15476   getSema().finishLambdaExplicitCaptures(LSI);
15477 
15478   // Transform the template parameters, and add them to the current
15479   // instantiation scope. The null case is handled correctly.
15480   auto TPL = getDerived().TransformTemplateParameterList(
15481       E->getTemplateParameterList());
15482   LSI->GLTemplateParameterList = TPL;
15483   if (TPL) {
15484     getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class,
15485                                                         TPL);
15486     LSI->ContainsUnexpandedParameterPack |=
15487         TPL->containsUnexpandedParameterPack();
15488   }
15489 
15490   TypeLocBuilder NewCallOpTLBuilder;
15491   TypeLoc OldCallOpTypeLoc =
15492       E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
15493   QualType NewCallOpType =
15494       getDerived().TransformType(NewCallOpTLBuilder, OldCallOpTypeLoc);
15495   if (NewCallOpType.isNull())
15496     return ExprError();
15497   LSI->ContainsUnexpandedParameterPack |=
15498       NewCallOpType->containsUnexpandedParameterPack();
15499   TypeSourceInfo *NewCallOpTSI =
15500       NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
15501 
15502   // The type may be an AttributedType or some other kind of sugar;
15503   // get the actual underlying FunctionProtoType.
15504   auto FPTL = NewCallOpTSI->getTypeLoc().getAsAdjusted<FunctionProtoTypeLoc>();
15505   assert(FPTL && "Not a FunctionProtoType?");
15506 
15507   getSema().CompleteLambdaCallOperator(
15508       NewCallOperator, E->getCallOperator()->getLocation(),
15509       E->getCallOperator()->getInnerLocStart(),
15510       E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
15511       E->getCallOperator()->getConstexprKind(),
15512       E->getCallOperator()->getStorageClass(), FPTL.getParams(),
15513       E->hasExplicitResultType());
15514 
15515   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
15516   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
15517 
15518   {
15519     // Number the lambda for linkage purposes if necessary.
15520     Sema::ContextRAII ManglingContext(getSema(), Class->getDeclContext());
15521 
15522     std::optional<CXXRecordDecl::LambdaNumbering> Numbering;
15523     if (getDerived().ReplacingOriginal()) {
15524       Numbering = OldClass->getLambdaNumbering();
15525     }
15526 
15527     getSema().handleLambdaNumbering(Class, NewCallOperator, Numbering);
15528   }
15529 
15530   // FIXME: Sema's lambda-building mechanism expects us to push an expression
15531   // evaluation context even if we're not transforming the function body.
15532   getSema().PushExpressionEvaluationContext(
15533       E->getCallOperator()->isConsteval() ?
15534       Sema::ExpressionEvaluationContext::ImmediateFunctionContext :
15535       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
15536   getSema().currentEvaluationContext().InImmediateEscalatingFunctionContext =
15537       getSema().getLangOpts().CPlusPlus20 &&
15538       E->getCallOperator()->isImmediateEscalating();
15539 
15540   Sema::CodeSynthesisContext C;
15541   C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution;
15542   C.PointOfInstantiation = E->getBody()->getBeginLoc();
15543   getSema().pushCodeSynthesisContext(C);
15544 
15545   // Instantiate the body of the lambda expression.
15546   StmtResult Body =
15547       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
15548 
15549   getSema().popCodeSynthesisContext();
15550 
15551   // ActOnLambda* will pop the function scope for us.
15552   FuncScopeCleanup.disable();
15553 
15554   if (Body.isInvalid()) {
15555     SavedContext.pop();
15556     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
15557                                /*IsInstantiation=*/true);
15558     return ExprError();
15559   }
15560 
15561   // Copy the LSI before ActOnFinishFunctionBody removes it.
15562   // FIXME: This is dumb. Store the lambda information somewhere that outlives
15563   // the call operator.
15564   auto LSICopy = *LSI;
15565   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
15566                                     /*IsInstantiation*/ true);
15567   SavedContext.pop();
15568 
15569   // Recompute the dependency of the lambda so that we can defer the lambda call
15570   // construction until after we have all the necessary template arguments. For
15571   // example, given
15572   //
15573   // template <class> struct S {
15574   //   template <class U>
15575   //   using Type = decltype([](U){}(42.0));
15576   // };
15577   // void foo() {
15578   //   using T = S<int>::Type<float>;
15579   //             ^~~~~~
15580   // }
15581   //
15582   // We would end up here from instantiating S<int> when ensuring its
15583   // completeness. That would transform the lambda call expression regardless of
15584   // the absence of the corresponding argument for U.
15585   //
15586   // Going ahead with unsubstituted type U makes things worse: we would soon
15587   // compare the argument type (which is float) against the parameter U
15588   // somewhere in Sema::BuildCallExpr. Then we would quickly run into a bogus
15589   // error suggesting unmatched types 'U' and 'float'!
15590   //
15591   // That said, everything will be fine if we defer that semantic checking.
15592   // Fortunately, we have such a mechanism that bypasses it if the CallExpr is
15593   // dependent. Since the CallExpr's dependency boils down to the lambda's
15594   // dependency in this case, we can harness that by recomputing the dependency
15595   // from the instantiation arguments.
15596   //
15597   // FIXME: Creating the type of a lambda requires us to have a dependency
15598   // value, which happens before its substitution. We update its dependency
15599   // *after* the substitution in case we can't decide the dependency
15600   // so early, e.g. because we want to see if any of the *substituted*
15601   // parameters are dependent.
15602   DependencyKind = getDerived().ComputeLambdaDependency(&LSICopy);
15603   Class->setLambdaDependencyKind(DependencyKind);
15604   // Clean up the type cache created previously. Then, we re-create a type for
15605   // such Decl with the new DependencyKind.
15606   Class->setTypeForDecl(nullptr);
15607   getSema().Context.getTypeDeclType(Class);
15608 
15609   return getDerived().RebuildLambdaExpr(E->getBeginLoc(),
15610                                         Body.get()->getEndLoc(), &LSICopy);
15611 }
15612 
15613 template<typename Derived>
15614 StmtResult
15615 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
15616   return TransformStmt(S);
15617 }
15618 
15619 template<typename Derived>
15620 StmtResult
15621 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
15622   // Transform captures.
15623   for (LambdaExpr::capture_iterator C = E->capture_begin(),
15624                                  CEnd = E->capture_end();
15625        C != CEnd; ++C) {
15626     // When we hit the first implicit capture, tell Sema that we've finished
15627     // the list of explicit captures.
15628     if (!C->isImplicit())
15629       continue;
15630 
15631     // Capturing 'this' is trivial.
15632     if (C->capturesThis()) {
15633       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
15634                                     /*BuildAndDiagnose*/ true, nullptr,
15635                                     C->getCaptureKind() == LCK_StarThis);
15636       continue;
15637     }
15638     // Captured expression will be recaptured during captured variables
15639     // rebuilding.
15640     if (C->capturesVLAType())
15641       continue;
15642 
15643     assert(C->capturesVariable() && "unexpected kind of lambda capture");
15644     assert(!E->isInitCapture(C) && "implicit init-capture?");
15645 
15646     // Transform the captured variable.
15647     VarDecl *CapturedVar = cast_or_null<VarDecl>(
15648         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
15649     if (!CapturedVar || CapturedVar->isInvalidDecl())
15650       return StmtError();
15651 
15652     // Capture the transformed variable.
15653     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
15654   }
15655 
15656   return S;
15657 }
15658 
15659 template<typename Derived>
15660 ExprResult
15661 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
15662                                                   CXXUnresolvedConstructExpr *E) {
15663   TypeSourceInfo *T =
15664       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
15665   if (!T)
15666     return ExprError();
15667 
15668   bool ArgumentChanged = false;
15669   SmallVector<Expr*, 8> Args;
15670   Args.reserve(E->getNumArgs());
15671   {
15672     EnterExpressionEvaluationContext Context(
15673         getSema(), EnterExpressionEvaluationContext::InitList,
15674         E->isListInitialization());
15675     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
15676                                     &ArgumentChanged))
15677       return ExprError();
15678   }
15679 
15680   if (!getDerived().AlwaysRebuild() &&
15681       T == E->getTypeSourceInfo() &&
15682       !ArgumentChanged)
15683     return E;
15684 
15685   // FIXME: we're faking the locations of the commas
15686   return getDerived().RebuildCXXUnresolvedConstructExpr(
15687       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
15688 }
15689 
15690 template<typename Derived>
15691 ExprResult
15692 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
15693                                              CXXDependentScopeMemberExpr *E) {
15694   // Transform the base of the expression.
15695   ExprResult Base((Expr*) nullptr);
15696   Expr *OldBase;
15697   QualType BaseType;
15698   QualType ObjectType;
15699   if (!E->isImplicitAccess()) {
15700     OldBase = E->getBase();
15701     Base = getDerived().TransformExpr(OldBase);
15702     if (Base.isInvalid())
15703       return ExprError();
15704 
15705     // Start the member reference and compute the object's type.
15706     ParsedType ObjectTy;
15707     bool MayBePseudoDestructor = false;
15708     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
15709                                                 E->getOperatorLoc(),
15710                                       E->isArrow()? tok::arrow : tok::period,
15711                                                 ObjectTy,
15712                                                 MayBePseudoDestructor);
15713     if (Base.isInvalid())
15714       return ExprError();
15715 
15716     ObjectType = ObjectTy.get();
15717     BaseType = ((Expr*) Base.get())->getType();
15718   } else {
15719     OldBase = nullptr;
15720     BaseType = getDerived().TransformType(E->getBaseType());
15721     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
15722   }
15723 
15724   // Transform the first part of the nested-name-specifier that qualifies
15725   // the member name.
15726   NamedDecl *FirstQualifierInScope
15727     = getDerived().TransformFirstQualifierInScope(
15728                                             E->getFirstQualifierFoundInScope(),
15729                                             E->getQualifierLoc().getBeginLoc());
15730 
15731   NestedNameSpecifierLoc QualifierLoc;
15732   if (E->getQualifier()) {
15733     QualifierLoc
15734       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
15735                                                      ObjectType,
15736                                                      FirstQualifierInScope);
15737     if (!QualifierLoc)
15738       return ExprError();
15739   }
15740 
15741   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
15742 
15743   // TODO: If this is a conversion-function-id, verify that the
15744   // destination type name (if present) resolves the same way after
15745   // instantiation as it did in the local scope.
15746 
15747   DeclarationNameInfo NameInfo
15748     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
15749   if (!NameInfo.getName())
15750     return ExprError();
15751 
15752   if (!E->hasExplicitTemplateArgs()) {
15753     // This is a reference to a member without an explicitly-specified
15754     // template argument list. Optimize for this common case.
15755     if (!getDerived().AlwaysRebuild() &&
15756         Base.get() == OldBase &&
15757         BaseType == E->getBaseType() &&
15758         QualifierLoc == E->getQualifierLoc() &&
15759         NameInfo.getName() == E->getMember() &&
15760         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
15761       return E;
15762 
15763     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
15764                                                        BaseType,
15765                                                        E->isArrow(),
15766                                                        E->getOperatorLoc(),
15767                                                        QualifierLoc,
15768                                                        TemplateKWLoc,
15769                                                        FirstQualifierInScope,
15770                                                        NameInfo,
15771                                                        /*TemplateArgs*/nullptr);
15772   }
15773 
15774   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
15775   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
15776                                               E->getNumTemplateArgs(),
15777                                               TransArgs))
15778     return ExprError();
15779 
15780   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
15781                                                      BaseType,
15782                                                      E->isArrow(),
15783                                                      E->getOperatorLoc(),
15784                                                      QualifierLoc,
15785                                                      TemplateKWLoc,
15786                                                      FirstQualifierInScope,
15787                                                      NameInfo,
15788                                                      &TransArgs);
15789 }
15790 
15791 template <typename Derived>
15792 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
15793     UnresolvedMemberExpr *Old) {
15794   // Transform the base of the expression.
15795   ExprResult Base((Expr *)nullptr);
15796   QualType BaseType;
15797   if (!Old->isImplicitAccess()) {
15798     Base = getDerived().TransformExpr(Old->getBase());
15799     if (Base.isInvalid())
15800       return ExprError();
15801     Base =
15802         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
15803     if (Base.isInvalid())
15804       return ExprError();
15805     BaseType = Base.get()->getType();
15806   } else {
15807     BaseType = getDerived().TransformType(Old->getBaseType());
15808   }
15809 
15810   NestedNameSpecifierLoc QualifierLoc;
15811   if (Old->getQualifierLoc()) {
15812     QualifierLoc =
15813         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
15814     if (!QualifierLoc)
15815       return ExprError();
15816   }
15817 
15818   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
15819 
15820   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
15821 
15822   // Transform the declaration set.
15823   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
15824     return ExprError();
15825 
15826   // Determine the naming class.
15827   if (Old->getNamingClass()) {
15828     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
15829         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
15830     if (!NamingClass)
15831       return ExprError();
15832 
15833     R.setNamingClass(NamingClass);
15834   }
15835 
15836   TemplateArgumentListInfo TransArgs;
15837   if (Old->hasExplicitTemplateArgs()) {
15838     TransArgs.setLAngleLoc(Old->getLAngleLoc());
15839     TransArgs.setRAngleLoc(Old->getRAngleLoc());
15840     if (getDerived().TransformTemplateArguments(
15841             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
15842       return ExprError();
15843   }
15844 
15845   // FIXME: to do this check properly, we will need to preserve the
15846   // first-qualifier-in-scope here, just in case we had a dependent
15847   // base (and therefore couldn't do the check) and a
15848   // nested-name-qualifier (and therefore could do the lookup).
15849   NamedDecl *FirstQualifierInScope = nullptr;
15850 
15851   return getDerived().RebuildUnresolvedMemberExpr(
15852       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
15853       TemplateKWLoc, FirstQualifierInScope, R,
15854       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
15855 }
15856 
15857 template<typename Derived>
15858 ExprResult
15859 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
15860   EnterExpressionEvaluationContext Unevaluated(
15861       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
15862   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
15863   if (SubExpr.isInvalid())
15864     return ExprError();
15865 
15866   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
15867     return E;
15868 
15869   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
15870 }
15871 
15872 template<typename Derived>
15873 ExprResult
15874 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
15875   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
15876   if (Pattern.isInvalid())
15877     return ExprError();
15878 
15879   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
15880     return E;
15881 
15882   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
15883                                            E->getNumExpansions());
15884 }
15885 
15886 template<typename Derived>
15887 ExprResult
15888 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
15889   // If E is not value-dependent, then nothing will change when we transform it.
15890   // Note: This is an instantiation-centric view.
15891   if (!E->isValueDependent())
15892     return E;
15893 
15894   EnterExpressionEvaluationContext Unevaluated(
15895       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
15896 
15897   ArrayRef<TemplateArgument> PackArgs;
15898   TemplateArgument ArgStorage;
15899 
15900   // Find the argument list to transform.
15901   if (E->isPartiallySubstituted()) {
15902     PackArgs = E->getPartialArguments();
15903   } else if (E->isValueDependent()) {
15904     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
15905     bool ShouldExpand = false;
15906     bool RetainExpansion = false;
15907     std::optional<unsigned> NumExpansions;
15908     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
15909                                              Unexpanded,
15910                                              ShouldExpand, RetainExpansion,
15911                                              NumExpansions))
15912       return ExprError();
15913 
15914     // If we need to expand the pack, build a template argument from it and
15915     // expand that.
15916     if (ShouldExpand) {
15917       auto *Pack = E->getPack();
15918       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
15919         ArgStorage = getSema().Context.getPackExpansionType(
15920             getSema().Context.getTypeDeclType(TTPD), std::nullopt);
15921       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
15922         ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
15923       } else {
15924         auto *VD = cast<ValueDecl>(Pack);
15925         ExprResult DRE = getSema().BuildDeclRefExpr(
15926             VD, VD->getType().getNonLValueExprType(getSema().Context),
15927             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
15928             E->getPackLoc());
15929         if (DRE.isInvalid())
15930           return ExprError();
15931         ArgStorage = new (getSema().Context)
15932             PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
15933                               E->getPackLoc(), std::nullopt);
15934       }
15935       PackArgs = ArgStorage;
15936     }
15937   }
15938 
15939   // If we're not expanding the pack, just transform the decl.
15940   if (!PackArgs.size()) {
15941     auto *Pack = cast_or_null<NamedDecl>(
15942         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
15943     if (!Pack)
15944       return ExprError();
15945     return getDerived().RebuildSizeOfPackExpr(
15946         E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(),
15947         std::nullopt, {});
15948   }
15949 
15950   // Try to compute the result without performing a partial substitution.
15951   std::optional<unsigned> Result = 0;
15952   for (const TemplateArgument &Arg : PackArgs) {
15953     if (!Arg.isPackExpansion()) {
15954       Result = *Result + 1;
15955       continue;
15956     }
15957 
15958     TemplateArgumentLoc ArgLoc;
15959     InventTemplateArgumentLoc(Arg, ArgLoc);
15960 
15961     // Find the pattern of the pack expansion.
15962     SourceLocation Ellipsis;
15963     std::optional<unsigned> OrigNumExpansions;
15964     TemplateArgumentLoc Pattern =
15965         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
15966                                                           OrigNumExpansions);
15967 
15968     // Substitute under the pack expansion. Do not expand the pack (yet).
15969     TemplateArgumentLoc OutPattern;
15970     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
15971     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
15972                                                /*Uneval*/ true))
15973       return true;
15974 
15975     // See if we can determine the number of arguments from the result.
15976     std::optional<unsigned> NumExpansions =
15977         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
15978     if (!NumExpansions) {
15979       // No: we must be in an alias template expansion, and we're going to need
15980       // to actually expand the packs.
15981       Result = std::nullopt;
15982       break;
15983     }
15984 
15985     Result = *Result + *NumExpansions;
15986   }
15987 
15988   // Common case: we could determine the number of expansions without
15989   // substituting.
15990   if (Result)
15991     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
15992                                               E->getPackLoc(),
15993                                               E->getRParenLoc(), *Result, {});
15994 
15995   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
15996                                                E->getPackLoc());
15997   {
15998     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
15999     typedef TemplateArgumentLocInventIterator<
16000         Derived, const TemplateArgument*> PackLocIterator;
16001     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
16002                                    PackLocIterator(*this, PackArgs.end()),
16003                                    TransformedPackArgs, /*Uneval*/true))
16004       return ExprError();
16005   }
16006 
16007   // Check whether we managed to fully-expand the pack.
16008   // FIXME: Is it possible for us to do so and not hit the early exit path?
16009   SmallVector<TemplateArgument, 8> Args;
16010   bool PartialSubstitution = false;
16011   for (auto &Loc : TransformedPackArgs.arguments()) {
16012     Args.push_back(Loc.getArgument());
16013     if (Loc.getArgument().isPackExpansion())
16014       PartialSubstitution = true;
16015   }
16016 
16017   if (PartialSubstitution)
16018     return getDerived().RebuildSizeOfPackExpr(
16019         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
16020         std::nullopt, Args);
16021 
16022   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
16023                                             E->getPackLoc(), E->getRParenLoc(),
16024                                             Args.size(), {});
16025 }
16026 
16027 template <typename Derived>
16028 ExprResult
16029 TreeTransform<Derived>::TransformPackIndexingExpr(PackIndexingExpr *E) {
16030   if (!E->isValueDependent())
16031     return E;
16032 
16033   // Transform the index
16034   ExprResult IndexExpr;
16035   {
16036     EnterExpressionEvaluationContext ConstantContext(
16037         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
16038     IndexExpr = getDerived().TransformExpr(E->getIndexExpr());
16039     if (IndexExpr.isInvalid())
16040       return ExprError();
16041   }
16042 
16043   SmallVector<Expr *, 5> ExpandedExprs;
16044   bool FullySubstituted = true;
16045   if (!E->expandsToEmptyPack() && E->getExpressions().empty()) {
16046     Expr *Pattern = E->getPackIdExpression();
16047     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
16048     getSema().collectUnexpandedParameterPacks(E->getPackIdExpression(),
16049                                               Unexpanded);
16050     assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
16051 
16052     // Determine whether the set of unexpanded parameter packs can and should
16053     // be expanded.
16054     bool ShouldExpand = true;
16055     bool RetainExpansion = false;
16056     std::optional<unsigned> OrigNumExpansions;
16057     std::optional<unsigned> NumExpansions = OrigNumExpansions;
16058     if (getDerived().TryExpandParameterPacks(
16059             E->getEllipsisLoc(), Pattern->getSourceRange(), Unexpanded,
16060             ShouldExpand, RetainExpansion, NumExpansions))
16061       return true;
16062     if (!ShouldExpand) {
16063       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16064       ExprResult Pack = getDerived().TransformExpr(Pattern);
16065       if (Pack.isInvalid())
16066         return ExprError();
16067       return getDerived().RebuildPackIndexingExpr(
16068           E->getEllipsisLoc(), E->getRSquareLoc(), Pack.get(), IndexExpr.get(),
16069           {}, /*FullySubstituted=*/false);
16070     }
16071     for (unsigned I = 0; I != *NumExpansions; ++I) {
16072       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16073       ExprResult Out = getDerived().TransformExpr(Pattern);
16074       if (Out.isInvalid())
16075         return true;
16076       if (Out.get()->containsUnexpandedParameterPack()) {
16077         Out = getDerived().RebuildPackExpansion(Out.get(), E->getEllipsisLoc(),
16078                                                 OrigNumExpansions);
16079         if (Out.isInvalid())
16080           return true;
16081         FullySubstituted = false;
16082       }
16083       ExpandedExprs.push_back(Out.get());
16084     }
16085     // If we're supposed to retain a pack expansion, do so by temporarily
16086     // forgetting the partially-substituted parameter pack.
16087     if (RetainExpansion) {
16088       ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16089 
16090       ExprResult Out = getDerived().TransformExpr(Pattern);
16091       if (Out.isInvalid())
16092         return true;
16093 
16094       Out = getDerived().RebuildPackExpansion(Out.get(), E->getEllipsisLoc(),
16095                                               OrigNumExpansions);
16096       if (Out.isInvalid())
16097         return true;
16098       FullySubstituted = false;
16099       ExpandedExprs.push_back(Out.get());
16100     }
16101   } else if (!E->expandsToEmptyPack()) {
16102     if (getDerived().TransformExprs(E->getExpressions().data(),
16103                                     E->getExpressions().size(), false,
16104                                     ExpandedExprs))
16105       return ExprError();
16106   }
16107 
16108   return getDerived().RebuildPackIndexingExpr(
16109       E->getEllipsisLoc(), E->getRSquareLoc(), E->getPackIdExpression(),
16110       IndexExpr.get(), ExpandedExprs, FullySubstituted);
16111 }
16112 
16113 template<typename Derived>
16114 ExprResult
16115 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
16116                                           SubstNonTypeTemplateParmPackExpr *E) {
16117   // Default behavior is to do nothing with this transformation.
16118   return E;
16119 }
16120 
16121 template<typename Derived>
16122 ExprResult
16123 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
16124                                           SubstNonTypeTemplateParmExpr *E) {
16125   // Default behavior is to do nothing with this transformation.
16126   return E;
16127 }
16128 
16129 template<typename Derived>
16130 ExprResult
16131 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
16132   // Default behavior is to do nothing with this transformation.
16133   return E;
16134 }
16135 
16136 template <typename Derived>
16137 ExprResult TreeTransform<Derived>::TransformResolvedUnexpandedPackExpr(
16138     ResolvedUnexpandedPackExpr *E) {
16139   bool ArgumentChanged = false;
16140   SmallVector<Expr *, 12> NewExprs;
16141   if (TransformExprs(E->getExprs().begin(), E->getNumExprs(),
16142                      /*IsCall=*/false, NewExprs, &ArgumentChanged))
16143     return ExprError();
16144 
16145   if (!AlwaysRebuild() && !ArgumentChanged)
16146     return E;
16147 
16148   // NOTE: The type is just a superficial PackExpansionType
16149   //       that needs no substitution.
16150   return RebuildResolvedUnexpandedPackExpr(E->getBeginLoc(), E->getType(),
16151                                            NewExprs);
16152 }
16153 
16154 template<typename Derived>
16155 ExprResult
16156 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
16157                                                   MaterializeTemporaryExpr *E) {
16158   return getDerived().TransformExpr(E->getSubExpr());
16159 }
16160 
16161 template<typename Derived>
16162 ExprResult
16163 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
16164   UnresolvedLookupExpr *Callee = nullptr;
16165   if (Expr *OldCallee = E->getCallee()) {
16166     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
16167     if (CalleeResult.isInvalid())
16168       return ExprError();
16169     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
16170   }
16171 
16172   Expr *Pattern = E->getPattern();
16173 
16174   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
16175   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
16176   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
16177 
16178   // Determine whether the set of unexpanded parameter packs can and should
16179   // be expanded.
16180   bool Expand = true;
16181   bool RetainExpansion = false;
16182   std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
16183                           NumExpansions = OrigNumExpansions;
16184   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
16185                                            Pattern->getSourceRange(),
16186                                            Unexpanded,
16187                                            Expand, RetainExpansion,
16188                                            NumExpansions))
16189     return true;
16190 
16191   if (!Expand) {
16192     // Do not expand any packs here, just transform and rebuild a fold
16193     // expression.
16194     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16195 
16196     ExprResult LHS =
16197         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
16198     if (LHS.isInvalid())
16199       return true;
16200 
16201     ExprResult RHS =
16202         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
16203     if (RHS.isInvalid())
16204       return true;
16205 
16206     if (!getDerived().AlwaysRebuild() &&
16207         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
16208       return E;
16209 
16210     return getDerived().RebuildCXXFoldExpr(
16211         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
16212         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
16213   }
16214 
16215   // Formally a fold expression expands to nested parenthesized expressions.
16216   // Enforce this limit to avoid creating trees so deep we can't safely traverse
16217   // them.
16218   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
16219     SemaRef.Diag(E->getEllipsisLoc(),
16220                  clang::diag::err_fold_expression_limit_exceeded)
16221         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
16222         << E->getSourceRange();
16223     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
16224     return ExprError();
16225   }
16226 
16227   // The transform has determined that we should perform an elementwise
16228   // expansion of the pattern. Do so.
16229   ExprResult Result = getDerived().TransformExpr(E->getInit());
16230   if (Result.isInvalid())
16231     return true;
16232   bool LeftFold = E->isLeftFold();
16233 
16234   // If we're retaining an expansion for a right fold, it is the innermost
16235   // component and takes the init (if any).
16236   if (!LeftFold && RetainExpansion) {
16237     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16238 
16239     ExprResult Out = getDerived().TransformExpr(Pattern);
16240     if (Out.isInvalid())
16241       return true;
16242 
16243     Result = getDerived().RebuildCXXFoldExpr(
16244         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
16245         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
16246     if (Result.isInvalid())
16247       return true;
16248   }
16249 
16250   for (unsigned I = 0; I != *NumExpansions; ++I) {
16251     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
16252         getSema(), LeftFold ? I : *NumExpansions - I - 1);
16253     ExprResult Out = getDerived().TransformExpr(Pattern);
16254     if (Out.isInvalid())
16255       return true;
16256 
16257     if (Out.get()->containsUnexpandedParameterPack()) {
16258       // We still have a pack; retain a pack expansion for this slice.
16259       Result = getDerived().RebuildCXXFoldExpr(
16260           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
16261           E->getOperator(), E->getEllipsisLoc(),
16262           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
16263           OrigNumExpansions);
16264     } else if (Result.isUsable()) {
16265       // We've got down to a single element; build a binary operator.
16266       Expr *LHS = LeftFold ? Result.get() : Out.get();
16267       Expr *RHS = LeftFold ? Out.get() : Result.get();
16268       if (Callee) {
16269         UnresolvedSet<16> Functions;
16270         Functions.append(Callee->decls_begin(), Callee->decls_end());
16271         Result = getDerived().RebuildCXXOperatorCallExpr(
16272             BinaryOperator::getOverloadedOperator(E->getOperator()),
16273             E->getEllipsisLoc(), Callee->getBeginLoc(), Callee->requiresADL(),
16274             Functions, LHS, RHS);
16275       } else {
16276         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
16277                                                     E->getOperator(), LHS, RHS);
16278       }
16279     } else
16280       Result = Out;
16281 
16282     if (Result.isInvalid())
16283       return true;
16284   }
16285 
16286   // If we're retaining an expansion for a left fold, it is the outermost
16287   // component and takes the complete expansion so far as its init (if any).
16288   if (LeftFold && RetainExpansion) {
16289     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
16290 
16291     ExprResult Out = getDerived().TransformExpr(Pattern);
16292     if (Out.isInvalid())
16293       return true;
16294 
16295     Result = getDerived().RebuildCXXFoldExpr(
16296         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
16297         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
16298     if (Result.isInvalid())
16299       return true;
16300   }
16301 
16302   if (ParenExpr *PE = dyn_cast_or_null<ParenExpr>(Result.get()))
16303     PE->setIsProducedByFoldExpansion();
16304 
16305   // If we had no init and an empty pack, and we're not retaining an expansion,
16306   // then produce a fallback value or error.
16307   if (Result.isUnset())
16308     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
16309                                                 E->getOperator());
16310   return Result;
16311 }
16312 
16313 template <typename Derived>
16314 ExprResult
16315 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) {
16316   SmallVector<Expr *, 4> TransformedInits;
16317   ArrayRef<Expr *> InitExprs = E->getInitExprs();
16318   if (TransformExprs(InitExprs.data(), InitExprs.size(), true,
16319                      TransformedInits))
16320     return ExprError();
16321 
16322   return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits,
16323                                            E->getEndLoc());
16324 }
16325 
16326 template<typename Derived>
16327 ExprResult
16328 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
16329     CXXStdInitializerListExpr *E) {
16330   return getDerived().TransformExpr(E->getSubExpr());
16331 }
16332 
16333 template<typename Derived>
16334 ExprResult
16335 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
16336   return SemaRef.MaybeBindToTemporary(E);
16337 }
16338 
16339 template<typename Derived>
16340 ExprResult
16341 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
16342   return E;
16343 }
16344 
16345 template<typename Derived>
16346 ExprResult
16347 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
16348   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
16349   if (SubExpr.isInvalid())
16350     return ExprError();
16351 
16352   if (!getDerived().AlwaysRebuild() &&
16353       SubExpr.get() == E->getSubExpr())
16354     return E;
16355 
16356   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
16357 }
16358 
16359 template<typename Derived>
16360 ExprResult
16361 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
16362   // Transform each of the elements.
16363   SmallVector<Expr *, 8> Elements;
16364   bool ArgChanged = false;
16365   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
16366                                   /*IsCall=*/false, Elements, &ArgChanged))
16367     return ExprError();
16368 
16369   if (!getDerived().AlwaysRebuild() && !ArgChanged)
16370     return SemaRef.MaybeBindToTemporary(E);
16371 
16372   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
16373                                               Elements.data(),
16374                                               Elements.size());
16375 }
16376 
16377 template<typename Derived>
16378 ExprResult
16379 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
16380                                                     ObjCDictionaryLiteral *E) {
16381   // Transform each of the elements.
16382   SmallVector<ObjCDictionaryElement, 8> Elements;
16383   bool ArgChanged = false;
16384   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
16385     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
16386 
16387     if (OrigElement.isPackExpansion()) {
16388       // This key/value element is a pack expansion.
16389       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
16390       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
16391       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
16392       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
16393 
16394       // Determine whether the set of unexpanded parameter packs can
16395       // and should be expanded.
16396       bool Expand = true;
16397       bool RetainExpansion = false;
16398       std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
16399       std::optional<unsigned> NumExpansions = OrigNumExpansions;
16400       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
16401                                OrigElement.Value->getEndLoc());
16402       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
16403                                                PatternRange, Unexpanded, Expand,
16404                                                RetainExpansion, NumExpansions))
16405         return ExprError();
16406 
16407       if (!Expand) {
16408         // The transform has determined that we should perform a simple
16409         // transformation on the pack expansion, producing another pack
16410         // expansion.
16411         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
16412         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16413         if (Key.isInvalid())
16414           return ExprError();
16415 
16416         if (Key.get() != OrigElement.Key)
16417           ArgChanged = true;
16418 
16419         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
16420         if (Value.isInvalid())
16421           return ExprError();
16422 
16423         if (Value.get() != OrigElement.Value)
16424           ArgChanged = true;
16425 
16426         ObjCDictionaryElement Expansion = {
16427           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
16428         };
16429         Elements.push_back(Expansion);
16430         continue;
16431       }
16432 
16433       // Record right away that the argument was changed.  This needs
16434       // to happen even if the array expands to nothing.
16435       ArgChanged = true;
16436 
16437       // The transform has determined that we should perform an elementwise
16438       // expansion of the pattern. Do so.
16439       for (unsigned I = 0; I != *NumExpansions; ++I) {
16440         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
16441         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16442         if (Key.isInvalid())
16443           return ExprError();
16444 
16445         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
16446         if (Value.isInvalid())
16447           return ExprError();
16448 
16449         ObjCDictionaryElement Element = {
16450           Key.get(), Value.get(), SourceLocation(), NumExpansions
16451         };
16452 
16453         // If any unexpanded parameter packs remain, we still have a
16454         // pack expansion.
16455         // FIXME: Can this really happen?
16456         if (Key.get()->containsUnexpandedParameterPack() ||
16457             Value.get()->containsUnexpandedParameterPack())
16458           Element.EllipsisLoc = OrigElement.EllipsisLoc;
16459 
16460         Elements.push_back(Element);
16461       }
16462 
16463       // FIXME: Retain a pack expansion if RetainExpansion is true.
16464 
16465       // We've finished with this pack expansion.
16466       continue;
16467     }
16468 
16469     // Transform and check key.
16470     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
16471     if (Key.isInvalid())
16472       return ExprError();
16473 
16474     if (Key.get() != OrigElement.Key)
16475       ArgChanged = true;
16476 
16477     // Transform and check value.
16478     ExprResult Value
16479       = getDerived().TransformExpr(OrigElement.Value);
16480     if (Value.isInvalid())
16481       return ExprError();
16482 
16483     if (Value.get() != OrigElement.Value)
16484       ArgChanged = true;
16485 
16486     ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(),
16487                                      std::nullopt};
16488     Elements.push_back(Element);
16489   }
16490 
16491   if (!getDerived().AlwaysRebuild() && !ArgChanged)
16492     return SemaRef.MaybeBindToTemporary(E);
16493 
16494   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
16495                                                    Elements);
16496 }
16497 
16498 template<typename Derived>
16499 ExprResult
16500 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
16501   TypeSourceInfo *EncodedTypeInfo
16502     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
16503   if (!EncodedTypeInfo)
16504     return ExprError();
16505 
16506   if (!getDerived().AlwaysRebuild() &&
16507       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
16508     return E;
16509 
16510   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
16511                                             EncodedTypeInfo,
16512                                             E->getRParenLoc());
16513 }
16514 
16515 template<typename Derived>
16516 ExprResult TreeTransform<Derived>::
16517 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
16518   // This is a kind of implicit conversion, and it needs to get dropped
16519   // and recomputed for the same general reasons that ImplicitCastExprs
16520   // do, as well a more specific one: this expression is only valid when
16521   // it appears *immediately* as an argument expression.
16522   return getDerived().TransformExpr(E->getSubExpr());
16523 }
16524 
16525 template<typename Derived>
16526 ExprResult TreeTransform<Derived>::
16527 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
16528   TypeSourceInfo *TSInfo
16529     = getDerived().TransformType(E->getTypeInfoAsWritten());
16530   if (!TSInfo)
16531     return ExprError();
16532 
16533   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
16534   if (Result.isInvalid())
16535     return ExprError();
16536 
16537   if (!getDerived().AlwaysRebuild() &&
16538       TSInfo == E->getTypeInfoAsWritten() &&
16539       Result.get() == E->getSubExpr())
16540     return E;
16541 
16542   return SemaRef.ObjC().BuildObjCBridgedCast(
16543       E->getLParenLoc(), E->getBridgeKind(), E->getBridgeKeywordLoc(), TSInfo,
16544       Result.get());
16545 }
16546 
16547 template <typename Derived>
16548 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
16549     ObjCAvailabilityCheckExpr *E) {
16550   return E;
16551 }
16552 
16553 template<typename Derived>
16554 ExprResult
16555 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
16556   // Transform arguments.
16557   bool ArgChanged = false;
16558   SmallVector<Expr*, 8> Args;
16559   Args.reserve(E->getNumArgs());
16560   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
16561                                   &ArgChanged))
16562     return ExprError();
16563 
16564   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
16565     // Class message: transform the receiver type.
16566     TypeSourceInfo *ReceiverTypeInfo
16567       = getDerived().TransformType(E->getClassReceiverTypeInfo());
16568     if (!ReceiverTypeInfo)
16569       return ExprError();
16570 
16571     // If nothing changed, just retain the existing message send.
16572     if (!getDerived().AlwaysRebuild() &&
16573         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
16574       return SemaRef.MaybeBindToTemporary(E);
16575 
16576     // Build a new class message send.
16577     SmallVector<SourceLocation, 16> SelLocs;
16578     E->getSelectorLocs(SelLocs);
16579     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
16580                                                E->getSelector(),
16581                                                SelLocs,
16582                                                E->getMethodDecl(),
16583                                                E->getLeftLoc(),
16584                                                Args,
16585                                                E->getRightLoc());
16586   }
16587   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
16588            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
16589     if (!E->getMethodDecl())
16590       return ExprError();
16591 
16592     // Build a new class message send to 'super'.
16593     SmallVector<SourceLocation, 16> SelLocs;
16594     E->getSelectorLocs(SelLocs);
16595     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
16596                                                E->getSelector(),
16597                                                SelLocs,
16598                                                E->getReceiverType(),
16599                                                E->getMethodDecl(),
16600                                                E->getLeftLoc(),
16601                                                Args,
16602                                                E->getRightLoc());
16603   }
16604 
16605   // Instance message: transform the receiver
16606   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
16607          "Only class and instance messages may be instantiated");
16608   ExprResult Receiver
16609     = getDerived().TransformExpr(E->getInstanceReceiver());
16610   if (Receiver.isInvalid())
16611     return ExprError();
16612 
16613   // If nothing changed, just retain the existing message send.
16614   if (!getDerived().AlwaysRebuild() &&
16615       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
16616     return SemaRef.MaybeBindToTemporary(E);
16617 
16618   // Build a new instance message send.
16619   SmallVector<SourceLocation, 16> SelLocs;
16620   E->getSelectorLocs(SelLocs);
16621   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
16622                                              E->getSelector(),
16623                                              SelLocs,
16624                                              E->getMethodDecl(),
16625                                              E->getLeftLoc(),
16626                                              Args,
16627                                              E->getRightLoc());
16628 }
16629 
16630 template<typename Derived>
16631 ExprResult
16632 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
16633   return E;
16634 }
16635 
16636 template<typename Derived>
16637 ExprResult
16638 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
16639   return E;
16640 }
16641 
16642 template<typename Derived>
16643 ExprResult
16644 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
16645   // Transform the base expression.
16646   ExprResult Base = getDerived().TransformExpr(E->getBase());
16647   if (Base.isInvalid())
16648     return ExprError();
16649 
16650   // We don't need to transform the ivar; it will never change.
16651 
16652   // If nothing changed, just retain the existing expression.
16653   if (!getDerived().AlwaysRebuild() &&
16654       Base.get() == E->getBase())
16655     return E;
16656 
16657   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
16658                                              E->getLocation(),
16659                                              E->isArrow(), E->isFreeIvar());
16660 }
16661 
16662 template<typename Derived>
16663 ExprResult
16664 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
16665   // 'super' and types never change. Property never changes. Just
16666   // retain the existing expression.
16667   if (!E->isObjectReceiver())
16668     return E;
16669 
16670   // Transform the base expression.
16671   ExprResult Base = getDerived().TransformExpr(E->getBase());
16672   if (Base.isInvalid())
16673     return ExprError();
16674 
16675   // We don't need to transform the property; it will never change.
16676 
16677   // If nothing changed, just retain the existing expression.
16678   if (!getDerived().AlwaysRebuild() &&
16679       Base.get() == E->getBase())
16680     return E;
16681 
16682   if (E->isExplicitProperty())
16683     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
16684                                                    E->getExplicitProperty(),
16685                                                    E->getLocation());
16686 
16687   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
16688                                                  SemaRef.Context.PseudoObjectTy,
16689                                                  E->getImplicitPropertyGetter(),
16690                                                  E->getImplicitPropertySetter(),
16691                                                  E->getLocation());
16692 }
16693 
16694 template<typename Derived>
16695 ExprResult
16696 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
16697   // Transform the base expression.
16698   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
16699   if (Base.isInvalid())
16700     return ExprError();
16701 
16702   // Transform the key expression.
16703   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
16704   if (Key.isInvalid())
16705     return ExprError();
16706 
16707   // If nothing changed, just retain the existing expression.
16708   if (!getDerived().AlwaysRebuild() &&
16709       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
16710     return E;
16711 
16712   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
16713                                                   Base.get(), Key.get(),
16714                                                   E->getAtIndexMethodDecl(),
16715                                                   E->setAtIndexMethodDecl());
16716 }
16717 
16718 template<typename Derived>
16719 ExprResult
16720 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
16721   // Transform the base expression.
16722   ExprResult Base = getDerived().TransformExpr(E->getBase());
16723   if (Base.isInvalid())
16724     return ExprError();
16725 
16726   // If nothing changed, just retain the existing expression.
16727   if (!getDerived().AlwaysRebuild() &&
16728       Base.get() == E->getBase())
16729     return E;
16730 
16731   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
16732                                          E->getOpLoc(),
16733                                          E->isArrow());
16734 }
16735 
16736 template<typename Derived>
16737 ExprResult
16738 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
16739   bool ArgumentChanged = false;
16740   SmallVector<Expr*, 8> SubExprs;
16741   SubExprs.reserve(E->getNumSubExprs());
16742   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
16743                                   SubExprs, &ArgumentChanged))
16744     return ExprError();
16745 
16746   if (!getDerived().AlwaysRebuild() &&
16747       !ArgumentChanged)
16748     return E;
16749 
16750   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
16751                                                SubExprs,
16752                                                E->getRParenLoc());
16753 }
16754 
16755 template<typename Derived>
16756 ExprResult
16757 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
16758   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
16759   if (SrcExpr.isInvalid())
16760     return ExprError();
16761 
16762   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
16763   if (!Type)
16764     return ExprError();
16765 
16766   if (!getDerived().AlwaysRebuild() &&
16767       Type == E->getTypeSourceInfo() &&
16768       SrcExpr.get() == E->getSrcExpr())
16769     return E;
16770 
16771   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
16772                                                SrcExpr.get(), Type,
16773                                                E->getRParenLoc());
16774 }
16775 
16776 template<typename Derived>
16777 ExprResult
16778 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
16779   BlockDecl *oldBlock = E->getBlockDecl();
16780 
16781   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
16782   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
16783 
16784   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
16785   blockScope->TheDecl->setBlockMissingReturnType(
16786                          oldBlock->blockMissingReturnType());
16787 
16788   SmallVector<ParmVarDecl*, 4> params;
16789   SmallVector<QualType, 4> paramTypes;
16790 
16791   const FunctionProtoType *exprFunctionType = E->getFunctionType();
16792 
16793   // Parameter substitution.
16794   Sema::ExtParameterInfoBuilder extParamInfos;
16795   if (getDerived().TransformFunctionTypeParams(
16796           E->getCaretLocation(), oldBlock->parameters(), nullptr,
16797           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
16798           extParamInfos)) {
16799     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
16800     return ExprError();
16801   }
16802 
16803   QualType exprResultType =
16804       getDerived().TransformType(exprFunctionType->getReturnType());
16805 
16806   auto epi = exprFunctionType->getExtProtoInfo();
16807   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
16808 
16809   QualType functionType =
16810     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
16811   blockScope->FunctionType = functionType;
16812 
16813   // Set the parameters on the block decl.
16814   if (!params.empty())
16815     blockScope->TheDecl->setParams(params);
16816 
16817   if (!oldBlock->blockMissingReturnType()) {
16818     blockScope->HasImplicitReturnType = false;
16819     blockScope->ReturnType = exprResultType;
16820   }
16821 
16822   // Transform the body
16823   StmtResult body = getDerived().TransformStmt(E->getBody());
16824   if (body.isInvalid()) {
16825     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
16826     return ExprError();
16827   }
16828 
16829 #ifndef NDEBUG
16830   // In builds with assertions, make sure that we captured everything we
16831   // captured before.
16832   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
16833     for (const auto &I : oldBlock->captures()) {
16834       VarDecl *oldCapture = I.getVariable();
16835 
16836       // Ignore parameter packs.
16837       if (oldCapture->isParameterPack())
16838         continue;
16839 
16840       VarDecl *newCapture =
16841         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
16842                                                  oldCapture));
16843       assert(blockScope->CaptureMap.count(newCapture));
16844     }
16845 
16846     // The this pointer may not be captured by the instantiated block, even when
16847     // it's captured by the original block, if the expression causing the
16848     // capture is in the discarded branch of a constexpr if statement.
16849     assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) &&
16850            "this pointer isn't captured in the old block");
16851   }
16852 #endif
16853 
16854   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
16855                                     /*Scope=*/nullptr);
16856 }
16857 
16858 template<typename Derived>
16859 ExprResult
16860 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
16861   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
16862   if (SrcExpr.isInvalid())
16863     return ExprError();
16864 
16865   QualType Type = getDerived().TransformType(E->getType());
16866 
16867   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
16868                                  E->getRParenLoc());
16869 }
16870 
16871 template<typename Derived>
16872 ExprResult
16873 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
16874   bool ArgumentChanged = false;
16875   SmallVector<Expr*, 8> SubExprs;
16876   SubExprs.reserve(E->getNumSubExprs());
16877   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
16878                                   SubExprs, &ArgumentChanged))
16879     return ExprError();
16880 
16881   if (!getDerived().AlwaysRebuild() &&
16882       !ArgumentChanged)
16883     return E;
16884 
16885   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
16886                                         E->getOp(), E->getRParenLoc());
16887 }
16888 
16889 //===----------------------------------------------------------------------===//
16890 // Type reconstruction
16891 //===----------------------------------------------------------------------===//
16892 
16893 template<typename Derived>
16894 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
16895                                                     SourceLocation Star) {
16896   return SemaRef.BuildPointerType(PointeeType, Star,
16897                                   getDerived().getBaseEntity());
16898 }
16899 
16900 template<typename Derived>
16901 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
16902                                                          SourceLocation Star) {
16903   return SemaRef.BuildBlockPointerType(PointeeType, Star,
16904                                        getDerived().getBaseEntity());
16905 }
16906 
16907 template<typename Derived>
16908 QualType
16909 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
16910                                              bool WrittenAsLValue,
16911                                              SourceLocation Sigil) {
16912   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
16913                                     Sigil, getDerived().getBaseEntity());
16914 }
16915 
16916 template<typename Derived>
16917 QualType
16918 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
16919                                                  QualType ClassType,
16920                                                  SourceLocation Sigil) {
16921   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
16922                                         getDerived().getBaseEntity());
16923 }
16924 
16925 template<typename Derived>
16926 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
16927            const ObjCTypeParamDecl *Decl,
16928            SourceLocation ProtocolLAngleLoc,
16929            ArrayRef<ObjCProtocolDecl *> Protocols,
16930            ArrayRef<SourceLocation> ProtocolLocs,
16931            SourceLocation ProtocolRAngleLoc) {
16932   return SemaRef.ObjC().BuildObjCTypeParamType(
16933       Decl, ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16934       /*FailOnError=*/true);
16935 }
16936 
16937 template<typename Derived>
16938 QualType TreeTransform<Derived>::RebuildObjCObjectType(
16939            QualType BaseType,
16940            SourceLocation Loc,
16941            SourceLocation TypeArgsLAngleLoc,
16942            ArrayRef<TypeSourceInfo *> TypeArgs,
16943            SourceLocation TypeArgsRAngleLoc,
16944            SourceLocation ProtocolLAngleLoc,
16945            ArrayRef<ObjCProtocolDecl *> Protocols,
16946            ArrayRef<SourceLocation> ProtocolLocs,
16947            SourceLocation ProtocolRAngleLoc) {
16948   return SemaRef.ObjC().BuildObjCObjectType(
16949       BaseType, Loc, TypeArgsLAngleLoc, TypeArgs, TypeArgsRAngleLoc,
16950       ProtocolLAngleLoc, Protocols, ProtocolLocs, ProtocolRAngleLoc,
16951       /*FailOnError=*/true,
16952       /*Rebuilding=*/true);
16953 }
16954 
16955 template<typename Derived>
16956 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
16957            QualType PointeeType,
16958            SourceLocation Star) {
16959   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
16960 }
16961 
16962 template <typename Derived>
16963 QualType TreeTransform<Derived>::RebuildArrayType(
16964     QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt *Size,
16965     Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) {
16966   if (SizeExpr || !Size)
16967     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
16968                                   IndexTypeQuals, BracketsRange,
16969                                   getDerived().getBaseEntity());
16970 
16971   QualType Types[] = {
16972     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
16973     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
16974     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
16975   };
16976   QualType SizeType;
16977   for (const auto &T : Types)
16978     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) {
16979       SizeType = T;
16980       break;
16981     }
16982 
16983   // Note that we can return a VariableArrayType here in the case where
16984   // the element type was a dependent VariableArrayType.
16985   IntegerLiteral *ArraySize
16986       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
16987                                /*FIXME*/BracketsRange.getBegin());
16988   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
16989                                 IndexTypeQuals, BracketsRange,
16990                                 getDerived().getBaseEntity());
16991 }
16992 
16993 template <typename Derived>
16994 QualType TreeTransform<Derived>::RebuildConstantArrayType(
16995     QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt &Size,
16996     Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) {
16997   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
16998                                         IndexTypeQuals, BracketsRange);
16999 }
17000 
17001 template <typename Derived>
17002 QualType TreeTransform<Derived>::RebuildIncompleteArrayType(
17003     QualType ElementType, ArraySizeModifier SizeMod, unsigned IndexTypeQuals,
17004     SourceRange BracketsRange) {
17005   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
17006                                        IndexTypeQuals, BracketsRange);
17007 }
17008 
17009 template <typename Derived>
17010 QualType TreeTransform<Derived>::RebuildVariableArrayType(
17011     QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr,
17012     unsigned IndexTypeQuals, SourceRange BracketsRange) {
17013   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
17014                                        SizeExpr,
17015                                        IndexTypeQuals, BracketsRange);
17016 }
17017 
17018 template <typename Derived>
17019 QualType TreeTransform<Derived>::RebuildDependentSizedArrayType(
17020     QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr,
17021     unsigned IndexTypeQuals, SourceRange BracketsRange) {
17022   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
17023                                        SizeExpr,
17024                                        IndexTypeQuals, BracketsRange);
17025 }
17026 
17027 template <typename Derived>
17028 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
17029     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
17030   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
17031                                           AttributeLoc);
17032 }
17033 
17034 template <typename Derived>
17035 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
17036                                                    unsigned NumElements,
17037                                                    VectorKind VecKind) {
17038   // FIXME: semantic checking!
17039   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
17040 }
17041 
17042 template <typename Derived>
17043 QualType TreeTransform<Derived>::RebuildDependentVectorType(
17044     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
17045     VectorKind VecKind) {
17046   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
17047 }
17048 
17049 template<typename Derived>
17050 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
17051                                                       unsigned NumElements,
17052                                                  SourceLocation AttributeLoc) {
17053   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
17054                           NumElements, true);
17055   IntegerLiteral *VectorSize
17056     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
17057                              AttributeLoc);
17058   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
17059 }
17060 
17061 template<typename Derived>
17062 QualType
17063 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
17064                                                            Expr *SizeExpr,
17065                                                   SourceLocation AttributeLoc) {
17066   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
17067 }
17068 
17069 template <typename Derived>
17070 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
17071     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
17072   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
17073                                                NumColumns);
17074 }
17075 
17076 template <typename Derived>
17077 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
17078     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
17079     SourceLocation AttributeLoc) {
17080   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
17081                                  AttributeLoc);
17082 }
17083 
17084 template <typename Derived>
17085 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
17086     QualType T, MutableArrayRef<QualType> ParamTypes,
17087     const FunctionProtoType::ExtProtoInfo &EPI) {
17088   return SemaRef.BuildFunctionType(T, ParamTypes,
17089                                    getDerived().getBaseLocation(),
17090                                    getDerived().getBaseEntity(),
17091                                    EPI);
17092 }
17093 
17094 template<typename Derived>
17095 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
17096   return SemaRef.Context.getFunctionNoProtoType(T);
17097 }
17098 
17099 template<typename Derived>
17100 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
17101                                                             Decl *D) {
17102   assert(D && "no decl found");
17103   if (D->isInvalidDecl()) return QualType();
17104 
17105   // FIXME: Doesn't account for ObjCInterfaceDecl!
17106   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
17107     // A valid resolved using typename pack expansion decl can have multiple
17108     // UsingDecls, but they must each have exactly one type, and it must be
17109     // the same type in every case. But we must have at least one expansion!
17110     if (UPD->expansions().empty()) {
17111       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
17112           << UPD->isCXXClassMember() << UPD;
17113       return QualType();
17114     }
17115 
17116     // We might still have some unresolved types. Try to pick a resolved type
17117     // if we can. The final instantiation will check that the remaining
17118     // unresolved types instantiate to the type we pick.
17119     QualType FallbackT;
17120     QualType T;
17121     for (auto *E : UPD->expansions()) {
17122       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
17123       if (ThisT.isNull())
17124         continue;
17125       else if (ThisT->getAs<UnresolvedUsingType>())
17126         FallbackT = ThisT;
17127       else if (T.isNull())
17128         T = ThisT;
17129       else
17130         assert(getSema().Context.hasSameType(ThisT, T) &&
17131                "mismatched resolved types in using pack expansion");
17132     }
17133     return T.isNull() ? FallbackT : T;
17134   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
17135     assert(Using->hasTypename() &&
17136            "UnresolvedUsingTypenameDecl transformed to non-typename using");
17137 
17138     // A valid resolved using typename decl points to exactly one type decl.
17139     assert(++Using->shadow_begin() == Using->shadow_end());
17140 
17141     UsingShadowDecl *Shadow = *Using->shadow_begin();
17142     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
17143       return QualType();
17144     return SemaRef.Context.getUsingType(
17145         Shadow, SemaRef.Context.getTypeDeclType(
17146                     cast<TypeDecl>(Shadow->getTargetDecl())));
17147   } else {
17148     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
17149            "UnresolvedUsingTypenameDecl transformed to non-using decl");
17150     return SemaRef.Context.getTypeDeclType(
17151         cast<UnresolvedUsingTypenameDecl>(D));
17152   }
17153 }
17154 
17155 template <typename Derived>
17156 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation,
17157                                                        TypeOfKind Kind) {
17158   return SemaRef.BuildTypeofExprType(E, Kind);
17159 }
17160 
17161 template<typename Derived>
17162 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying,
17163                                                    TypeOfKind Kind) {
17164   return SemaRef.Context.getTypeOfType(Underlying, Kind);
17165 }
17166 
17167 template <typename Derived>
17168 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
17169   return SemaRef.BuildDecltypeType(E);
17170 }
17171 
17172 template <typename Derived>
17173 QualType TreeTransform<Derived>::RebuildPackIndexingType(
17174     QualType Pattern, Expr *IndexExpr, SourceLocation Loc,
17175     SourceLocation EllipsisLoc, bool FullySubstituted,
17176     ArrayRef<QualType> Expansions) {
17177   return SemaRef.BuildPackIndexingType(Pattern, IndexExpr, Loc, EllipsisLoc,
17178                                        FullySubstituted, Expansions);
17179 }
17180 
17181 template<typename Derived>
17182 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
17183                                             UnaryTransformType::UTTKind UKind,
17184                                             SourceLocation Loc) {
17185   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
17186 }
17187 
17188 template<typename Derived>
17189 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
17190                                                       TemplateName Template,
17191                                              SourceLocation TemplateNameLoc,
17192                                      TemplateArgumentListInfo &TemplateArgs) {
17193   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
17194 }
17195 
17196 template<typename Derived>
17197 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
17198                                                    SourceLocation KWLoc) {
17199   return SemaRef.BuildAtomicType(ValueType, KWLoc);
17200 }
17201 
17202 template<typename Derived>
17203 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
17204                                                  SourceLocation KWLoc,
17205                                                  bool isReadPipe) {
17206   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
17207                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
17208 }
17209 
17210 template <typename Derived>
17211 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
17212                                                    unsigned NumBits,
17213                                                    SourceLocation Loc) {
17214   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
17215                         NumBits, true);
17216   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
17217                                                 SemaRef.Context.IntTy, Loc);
17218   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
17219 }
17220 
17221 template <typename Derived>
17222 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
17223     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
17224   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
17225 }
17226 
17227 template<typename Derived>
17228 TemplateName
17229 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
17230                                             bool TemplateKW,
17231                                             TemplateDecl *Template) {
17232   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
17233                                                   TemplateName(Template));
17234 }
17235 
17236 template<typename Derived>
17237 TemplateName
17238 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
17239                                             SourceLocation TemplateKWLoc,
17240                                             const IdentifierInfo &Name,
17241                                             SourceLocation NameLoc,
17242                                             QualType ObjectType,
17243                                             NamedDecl *FirstQualifierInScope,
17244                                             bool AllowInjectedClassName) {
17245   UnqualifiedId TemplateName;
17246   TemplateName.setIdentifier(&Name, NameLoc);
17247   Sema::TemplateTy Template;
17248   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
17249                               TemplateName, ParsedType::make(ObjectType),
17250                               /*EnteringContext=*/false, Template,
17251                               AllowInjectedClassName);
17252   return Template.get();
17253 }
17254 
17255 template<typename Derived>
17256 TemplateName
17257 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
17258                                             SourceLocation TemplateKWLoc,
17259                                             OverloadedOperatorKind Operator,
17260                                             SourceLocation NameLoc,
17261                                             QualType ObjectType,
17262                                             bool AllowInjectedClassName) {
17263   UnqualifiedId Name;
17264   // FIXME: Bogus location information.
17265   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
17266   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
17267   Sema::TemplateTy Template;
17268   getSema().ActOnTemplateName(
17269       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
17270       /*EnteringContext=*/false, Template, AllowInjectedClassName);
17271   return Template.get();
17272 }
17273 
17274 template <typename Derived>
17275 ExprResult TreeTransform<Derived>::RebuildCXXOperatorCallExpr(
17276     OverloadedOperatorKind Op, SourceLocation OpLoc, SourceLocation CalleeLoc,
17277     bool RequiresADL, const UnresolvedSetImpl &Functions, Expr *First,
17278     Expr *Second) {
17279   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
17280 
17281   if (First->getObjectKind() == OK_ObjCProperty) {
17282     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
17283     if (BinaryOperator::isAssignmentOp(Opc))
17284       return SemaRef.PseudoObject().checkAssignment(/*Scope=*/nullptr, OpLoc,
17285                                                     Opc, First, Second);
17286     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
17287     if (Result.isInvalid())
17288       return ExprError();
17289     First = Result.get();
17290   }
17291 
17292   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
17293     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
17294     if (Result.isInvalid())
17295       return ExprError();
17296     Second = Result.get();
17297   }
17298 
17299   // Determine whether this should be a builtin operation.
17300   if (Op == OO_Subscript) {
17301     if (!First->getType()->isOverloadableType() &&
17302         !Second->getType()->isOverloadableType())
17303       return getSema().CreateBuiltinArraySubscriptExpr(First, CalleeLoc, Second,
17304                                                        OpLoc);
17305   } else if (Op == OO_Arrow) {
17306     // It is possible that the type refers to a RecoveryExpr created earlier
17307     // in the tree transformation.
17308     if (First->getType()->isDependentType())
17309       return ExprError();
17310     // -> is never a builtin operation.
17311     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
17312   } else if (Second == nullptr || isPostIncDec) {
17313     if (!First->getType()->isOverloadableType() ||
17314         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
17315       // The argument is not of overloadable type, or this is an expression
17316       // of the form &Class::member, so try to create a built-in unary
17317       // operation.
17318       UnaryOperatorKind Opc
17319         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
17320 
17321       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
17322     }
17323   } else {
17324     if (!First->isTypeDependent() && !Second->isTypeDependent() &&
17325         !First->getType()->isOverloadableType() &&
17326         !Second->getType()->isOverloadableType()) {
17327       // Neither of the arguments is type-dependent or has an overloadable
17328       // type, so try to create a built-in binary operation.
17329       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
17330       ExprResult Result
17331         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
17332       if (Result.isInvalid())
17333         return ExprError();
17334 
17335       return Result;
17336     }
17337   }
17338 
17339   // Create the overloaded operator invocation for unary operators.
17340   if (!Second || isPostIncDec) {
17341     UnaryOperatorKind Opc
17342       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
17343     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
17344                                            RequiresADL);
17345   }
17346 
17347   // Create the overloaded operator invocation for binary operators.
17348   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
17349   ExprResult Result = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions,
17350                                                     First, Second, RequiresADL);
17351   if (Result.isInvalid())
17352     return ExprError();
17353 
17354   return Result;
17355 }
17356 
17357 template<typename Derived>
17358 ExprResult
17359 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
17360                                                      SourceLocation OperatorLoc,
17361                                                        bool isArrow,
17362                                                        CXXScopeSpec &SS,
17363                                                      TypeSourceInfo *ScopeType,
17364                                                        SourceLocation CCLoc,
17365                                                        SourceLocation TildeLoc,
17366                                         PseudoDestructorTypeStorage Destroyed) {
17367   QualType BaseType = Base->getType();
17368   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
17369       (!isArrow && !BaseType->getAs<RecordType>()) ||
17370       (isArrow && BaseType->getAs<PointerType>() &&
17371        !BaseType->castAs<PointerType>()->getPointeeType()
17372                                               ->template getAs<RecordType>())){
17373     // This pseudo-destructor expression is still a pseudo-destructor.
17374     return SemaRef.BuildPseudoDestructorExpr(
17375         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
17376         CCLoc, TildeLoc, Destroyed);
17377   }
17378 
17379   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
17380   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
17381                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
17382   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
17383   NameInfo.setNamedTypeInfo(DestroyedType);
17384 
17385   // The scope type is now known to be a valid nested name specifier
17386   // component. Tack it on to the end of the nested name specifier.
17387   if (ScopeType) {
17388     if (!ScopeType->getType()->getAs<TagType>()) {
17389       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
17390                      diag::err_expected_class_or_namespace)
17391           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
17392       return ExprError();
17393     }
17394     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
17395               CCLoc);
17396   }
17397 
17398   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
17399   return getSema().BuildMemberReferenceExpr(Base, BaseType,
17400                                             OperatorLoc, isArrow,
17401                                             SS, TemplateKWLoc,
17402                                             /*FIXME: FirstQualifier*/ nullptr,
17403                                             NameInfo,
17404                                             /*TemplateArgs*/ nullptr,
17405                                             /*S*/nullptr);
17406 }
17407 
17408 template<typename Derived>
17409 StmtResult
17410 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
17411   SourceLocation Loc = S->getBeginLoc();
17412   CapturedDecl *CD = S->getCapturedDecl();
17413   unsigned NumParams = CD->getNumParams();
17414   unsigned ContextParamPos = CD->getContextParamPosition();
17415   SmallVector<Sema::CapturedParamNameType, 4> Params;
17416   for (unsigned I = 0; I < NumParams; ++I) {
17417     if (I != ContextParamPos) {
17418       Params.push_back(
17419              std::make_pair(
17420                   CD->getParam(I)->getName(),
17421                   getDerived().TransformType(CD->getParam(I)->getType())));
17422     } else {
17423       Params.push_back(std::make_pair(StringRef(), QualType()));
17424     }
17425   }
17426   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
17427                                      S->getCapturedRegionKind(), Params);
17428   StmtResult Body;
17429   {
17430     Sema::CompoundScopeRAII CompoundScope(getSema());
17431     Body = getDerived().TransformStmt(S->getCapturedStmt());
17432   }
17433 
17434   if (Body.isInvalid()) {
17435     getSema().ActOnCapturedRegionError();
17436     return StmtError();
17437   }
17438 
17439   return getSema().ActOnCapturedRegionEnd(Body.get());
17440 }
17441 
17442 template <typename Derived>
17443 StmtResult
17444 TreeTransform<Derived>::TransformSYCLKernelCallStmt(SYCLKernelCallStmt *S) {
17445   // SYCLKernelCallStmt nodes are inserted upon completion of a (non-template)
17446   // function definition or instantiation of a function template specialization
17447   // and will therefore never appear in a dependent context.
17448   llvm_unreachable("SYCL kernel call statement cannot appear in dependent "
17449                    "context");
17450 }
17451 
17452 template <typename Derived>
17453 ExprResult TreeTransform<Derived>::TransformHLSLOutArgExpr(HLSLOutArgExpr *E) {
17454   // We can transform the base expression and allow argument resolution to fill
17455   // in the rest.
17456   return getDerived().TransformExpr(E->getArgLValue());
17457 }
17458 
17459 } // end namespace clang
17460 
17461 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
17462