xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 46c59ea9b61755455ff6bf9f3e7b834e1af634ea)
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/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/EnterExpressionEvaluationContext.h"
35 #include "clang/Sema/Lookup.h"
36 #include "clang/Sema/Ownership.h"
37 #include "clang/Sema/ParsedTemplate.h"
38 #include "clang/Sema/ScopeInfo.h"
39 #include "clang/Sema/SemaDiagnostic.h"
40 #include "clang/Sema/SemaInternal.h"
41 #include "llvm/ADT/ArrayRef.h"
42 #include "llvm/Support/ErrorHandling.h"
43 #include <algorithm>
44 #include <optional>
45 
46 using namespace llvm::omp;
47 
48 namespace clang {
49 using namespace sema;
50 
51 /// A semantic tree transformation that allows one to transform one
52 /// abstract syntax tree into another.
53 ///
54 /// A new tree transformation is defined by creating a new subclass \c X of
55 /// \c TreeTransform<X> and then overriding certain operations to provide
56 /// behavior specific to that transformation. For example, template
57 /// instantiation is implemented as a tree transformation where the
58 /// transformation of TemplateTypeParmType nodes involves substituting the
59 /// template arguments for their corresponding template parameters; a similar
60 /// transformation is performed for non-type template parameters and
61 /// template template parameters.
62 ///
63 /// This tree-transformation template uses static polymorphism to allow
64 /// subclasses to customize any of its operations. Thus, a subclass can
65 /// override any of the transformation or rebuild operators by providing an
66 /// operation with the same signature as the default implementation. The
67 /// overriding function should not be virtual.
68 ///
69 /// Semantic tree transformations are split into two stages, either of which
70 /// can be replaced by a subclass. The "transform" step transforms an AST node
71 /// or the parts of an AST node using the various transformation functions,
72 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
73 /// node of the appropriate kind from the pieces. The default transformation
74 /// routines recursively transform the operands to composite AST nodes (e.g.,
75 /// the pointee type of a PointerType node) and, if any of those operand nodes
76 /// were changed by the transformation, invokes the rebuild operation to create
77 /// a new AST node.
78 ///
79 /// Subclasses can customize the transformation at various levels. The
80 /// most coarse-grained transformations involve replacing TransformType(),
81 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
82 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
83 /// new implementations.
84 ///
85 /// For more fine-grained transformations, subclasses can replace any of the
86 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
87 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
88 /// replacing TransformTemplateTypeParmType() allows template instantiation
89 /// to substitute template arguments for their corresponding template
90 /// parameters. Additionally, subclasses can override the \c RebuildXXX
91 /// functions to control how AST nodes are rebuilt when their operands change.
92 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
93 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
94 /// be able to use more efficient rebuild steps.
95 ///
96 /// There are a handful of other functions that can be overridden, allowing one
97 /// to avoid traversing nodes that don't need any transformation
98 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
99 /// operands have not changed (\c AlwaysRebuild()), and customize the
100 /// default locations and entity names used for type-checking
101 /// (\c getBaseLocation(), \c getBaseEntity()).
102 template<typename Derived>
103 class TreeTransform {
104   /// Private RAII object that helps us forget and then re-remember
105   /// the template argument corresponding to a partially-substituted parameter
106   /// pack.
107   class ForgetPartiallySubstitutedPackRAII {
108     Derived &Self;
109     TemplateArgument Old;
110 
111   public:
112     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
113       Old = Self.ForgetPartiallySubstitutedPack();
114     }
115 
116     ~ForgetPartiallySubstitutedPackRAII() {
117       Self.RememberPartiallySubstitutedPack(Old);
118     }
119   };
120 
121 protected:
122   Sema &SemaRef;
123 
124   /// The set of local declarations that have been transformed, for
125   /// cases where we are forced to build new declarations within the transformer
126   /// rather than in the subclass (e.g., lambda closure types).
127   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
128 
129 public:
130   /// Initializes a new tree transformer.
131   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
132 
133   /// Retrieves a reference to the derived class.
134   Derived &getDerived() { return static_cast<Derived&>(*this); }
135 
136   /// Retrieves a reference to the derived class.
137   const Derived &getDerived() const {
138     return static_cast<const Derived&>(*this);
139   }
140 
141   static inline ExprResult Owned(Expr *E) { return E; }
142   static inline StmtResult Owned(Stmt *S) { return S; }
143 
144   /// Retrieves a reference to the semantic analysis object used for
145   /// this tree transform.
146   Sema &getSema() const { return SemaRef; }
147 
148   /// Whether the transformation should always rebuild AST nodes, even
149   /// if none of the children have changed.
150   ///
151   /// Subclasses may override this function to specify when the transformation
152   /// should rebuild all AST nodes.
153   ///
154   /// We must always rebuild all AST nodes when performing variadic template
155   /// pack expansion, in order to avoid violating the AST invariant that each
156   /// statement node appears at most once in its containing declaration.
157   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
158 
159   /// Whether the transformation is forming an expression or statement that
160   /// replaces the original. In this case, we'll reuse mangling numbers from
161   /// existing lambdas.
162   bool ReplacingOriginal() { return false; }
163 
164   /// Wether CXXConstructExpr can be skipped when they are implicit.
165   /// They will be reconstructed when used if needed.
166   /// This is useful when the user that cause rebuilding of the
167   /// CXXConstructExpr is outside of the expression at which the TreeTransform
168   /// started.
169   bool AllowSkippingCXXConstructExpr() { return true; }
170 
171   /// Returns the location of the entity being transformed, if that
172   /// information was not available elsewhere in the AST.
173   ///
174   /// By default, returns no source-location information. Subclasses can
175   /// provide an alternative implementation that provides better location
176   /// information.
177   SourceLocation getBaseLocation() { return SourceLocation(); }
178 
179   /// Returns the name of the entity being transformed, if that
180   /// information was not available elsewhere in the AST.
181   ///
182   /// By default, returns an empty name. Subclasses can provide an alternative
183   /// implementation with a more precise name.
184   DeclarationName getBaseEntity() { return DeclarationName(); }
185 
186   /// Sets the "base" location and entity when that
187   /// information is known based on another transformation.
188   ///
189   /// By default, the source location and entity are ignored. Subclasses can
190   /// override this function to provide a customized implementation.
191   void setBase(SourceLocation Loc, DeclarationName Entity) { }
192 
193   /// RAII object that temporarily sets the base location and entity
194   /// used for reporting diagnostics in types.
195   class TemporaryBase {
196     TreeTransform &Self;
197     SourceLocation OldLocation;
198     DeclarationName OldEntity;
199 
200   public:
201     TemporaryBase(TreeTransform &Self, SourceLocation Location,
202                   DeclarationName Entity) : Self(Self) {
203       OldLocation = Self.getDerived().getBaseLocation();
204       OldEntity = Self.getDerived().getBaseEntity();
205 
206       if (Location.isValid())
207         Self.getDerived().setBase(Location, Entity);
208     }
209 
210     ~TemporaryBase() {
211       Self.getDerived().setBase(OldLocation, OldEntity);
212     }
213   };
214 
215   /// Determine whether the given type \p T has already been
216   /// transformed.
217   ///
218   /// Subclasses can provide an alternative implementation of this routine
219   /// to short-circuit evaluation when it is known that a given type will
220   /// not change. For example, template instantiation need not traverse
221   /// non-dependent types.
222   bool AlreadyTransformed(QualType T) {
223     return T.isNull();
224   }
225 
226   /// Transform a template parameter depth level.
227   ///
228   /// During a transformation that transforms template parameters, this maps
229   /// an old template parameter depth to a new depth.
230   unsigned TransformTemplateDepth(unsigned Depth) {
231     return Depth;
232   }
233 
234   /// Determine whether the given call argument should be dropped, e.g.,
235   /// because it is a default argument.
236   ///
237   /// Subclasses can provide an alternative implementation of this routine to
238   /// determine which kinds of call arguments get dropped. By default,
239   /// CXXDefaultArgument nodes are dropped (prior to transformation).
240   bool DropCallArgument(Expr *E) {
241     return E->isDefaultArgument();
242   }
243 
244   /// Determine whether we should expand a pack expansion with the
245   /// given set of parameter packs into separate arguments by repeatedly
246   /// transforming the pattern.
247   ///
248   /// By default, the transformer never tries to expand pack expansions.
249   /// Subclasses can override this routine to provide different behavior.
250   ///
251   /// \param EllipsisLoc The location of the ellipsis that identifies the
252   /// pack expansion.
253   ///
254   /// \param PatternRange The source range that covers the entire pattern of
255   /// the pack expansion.
256   ///
257   /// \param Unexpanded The set of unexpanded parameter packs within the
258   /// pattern.
259   ///
260   /// \param ShouldExpand Will be set to \c true if the transformer should
261   /// expand the corresponding pack expansions into separate arguments. When
262   /// set, \c NumExpansions must also be set.
263   ///
264   /// \param RetainExpansion Whether the caller should add an unexpanded
265   /// pack expansion after all of the expanded arguments. This is used
266   /// when extending explicitly-specified template argument packs per
267   /// C++0x [temp.arg.explicit]p9.
268   ///
269   /// \param NumExpansions The number of separate arguments that will be in
270   /// the expanded form of the corresponding pack expansion. This is both an
271   /// input and an output parameter, which can be set by the caller if the
272   /// number of expansions is known a priori (e.g., due to a prior substitution)
273   /// and will be set by the callee when the number of expansions is known.
274   /// The callee must set this value when \c ShouldExpand is \c true; it may
275   /// set this value in other cases.
276   ///
277   /// \returns true if an error occurred (e.g., because the parameter packs
278   /// are to be instantiated with arguments of different lengths), false
279   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
280   /// must be set.
281   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
282                                SourceRange PatternRange,
283                                ArrayRef<UnexpandedParameterPack> Unexpanded,
284                                bool &ShouldExpand, bool &RetainExpansion,
285                                std::optional<unsigned> &NumExpansions) {
286     ShouldExpand = false;
287     return false;
288   }
289 
290   /// "Forget" about the partially-substituted pack template argument,
291   /// when performing an instantiation that must preserve the parameter pack
292   /// use.
293   ///
294   /// This routine is meant to be overridden by the template instantiator.
295   TemplateArgument ForgetPartiallySubstitutedPack() {
296     return TemplateArgument();
297   }
298 
299   /// "Remember" the partially-substituted pack template argument
300   /// after performing an instantiation that must preserve the parameter pack
301   /// use.
302   ///
303   /// This routine is meant to be overridden by the template instantiator.
304   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
305 
306   /// Note to the derived class when a function parameter pack is
307   /// being expanded.
308   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
309 
310   /// Transforms the given type into another type.
311   ///
312   /// By default, this routine transforms a type by creating a
313   /// TypeSourceInfo for it and delegating to the appropriate
314   /// function.  This is expensive, but we don't mind, because
315   /// this method is deprecated anyway;  all users should be
316   /// switched to storing TypeSourceInfos.
317   ///
318   /// \returns the transformed type.
319   QualType TransformType(QualType T);
320 
321   /// Transforms the given type-with-location into a new
322   /// type-with-location.
323   ///
324   /// By default, this routine transforms a type by delegating to the
325   /// appropriate TransformXXXType to build a new type.  Subclasses
326   /// may override this function (to take over all type
327   /// transformations) or some set of the TransformXXXType functions
328   /// to alter the transformation.
329   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
330 
331   /// Transform the given type-with-location into a new
332   /// type, collecting location information in the given builder
333   /// as necessary.
334   ///
335   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
336 
337   /// Transform a type that is permitted to produce a
338   /// DeducedTemplateSpecializationType.
339   ///
340   /// This is used in the (relatively rare) contexts where it is acceptable
341   /// for transformation to produce a class template type with deduced
342   /// template arguments.
343   /// @{
344   QualType TransformTypeWithDeducedTST(QualType T);
345   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
346   /// @}
347 
348   /// The reason why the value of a statement is not discarded, if any.
349   enum StmtDiscardKind {
350     SDK_Discarded,
351     SDK_NotDiscarded,
352     SDK_StmtExprResult,
353   };
354 
355   /// Transform the given statement.
356   ///
357   /// By default, this routine transforms a statement by delegating to the
358   /// appropriate TransformXXXStmt function to transform a specific kind of
359   /// statement or the TransformExpr() function to transform an expression.
360   /// Subclasses may override this function to transform statements using some
361   /// other mechanism.
362   ///
363   /// \returns the transformed statement.
364   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
365 
366   /// Transform the given statement.
367   ///
368   /// By default, this routine transforms a statement by delegating to the
369   /// appropriate TransformOMPXXXClause function to transform a specific kind
370   /// of clause. Subclasses may override this function to transform statements
371   /// using some other mechanism.
372   ///
373   /// \returns the transformed OpenMP clause.
374   OMPClause *TransformOMPClause(OMPClause *S);
375 
376   /// Transform the given attribute.
377   ///
378   /// By default, this routine transforms a statement by delegating to the
379   /// appropriate TransformXXXAttr function to transform a specific kind
380   /// of attribute. Subclasses may override this function to transform
381   /// attributed statements/types using some other mechanism.
382   ///
383   /// \returns the transformed attribute
384   const Attr *TransformAttr(const Attr *S);
385 
386   // Transform the given statement attribute.
387   //
388   // Delegates to the appropriate TransformXXXAttr function to transform a
389   // specific kind of statement attribute. Unlike the non-statement taking
390   // version of this, this implements all attributes, not just pragmas.
391   const Attr *TransformStmtAttr(const Stmt *OrigS, const Stmt *InstS,
392                                 const Attr *A);
393 
394   // Transform the specified attribute.
395   //
396   // Subclasses should override the transformation of attributes with a pragma
397   // spelling to transform expressions stored within the attribute.
398   //
399   // \returns the transformed attribute.
400 #define ATTR(X)                                                                \
401   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
402 #include "clang/Basic/AttrList.inc"
403 
404   // Transform the specified attribute.
405   //
406   // Subclasses should override the transformation of attributes to do
407   // transformation and checking of statement attributes. By default, this
408   // delegates to the non-statement taking version.
409   //
410   // \returns the transformed attribute.
411 #define ATTR(X)                                                                \
412   const X##Attr *TransformStmt##X##Attr(const Stmt *, const Stmt *,            \
413                                         const X##Attr *A) {                    \
414     return getDerived().Transform##X##Attr(A);                                 \
415   }
416 #include "clang/Basic/AttrList.inc"
417 
418   /// Transform the given expression.
419   ///
420   /// By default, this routine transforms an expression by delegating to the
421   /// appropriate TransformXXXExpr function to build a new expression.
422   /// Subclasses may override this function to transform expressions using some
423   /// other mechanism.
424   ///
425   /// \returns the transformed expression.
426   ExprResult TransformExpr(Expr *E);
427 
428   /// Transform the given initializer.
429   ///
430   /// By default, this routine transforms an initializer by stripping off the
431   /// semantic nodes added by initialization, then passing the result to
432   /// TransformExpr or TransformExprs.
433   ///
434   /// \returns the transformed initializer.
435   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
436 
437   /// Transform the given list of expressions.
438   ///
439   /// This routine transforms a list of expressions by invoking
440   /// \c TransformExpr() for each subexpression. However, it also provides
441   /// support for variadic templates by expanding any pack expansions (if the
442   /// derived class permits such expansion) along the way. When pack expansions
443   /// are present, the number of outputs may not equal the number of inputs.
444   ///
445   /// \param Inputs The set of expressions to be transformed.
446   ///
447   /// \param NumInputs The number of expressions in \c Inputs.
448   ///
449   /// \param IsCall If \c true, then this transform is being performed on
450   /// function-call arguments, and any arguments that should be dropped, will
451   /// be.
452   ///
453   /// \param Outputs The transformed input expressions will be added to this
454   /// vector.
455   ///
456   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
457   /// due to transformation.
458   ///
459   /// \returns true if an error occurred, false otherwise.
460   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
461                       SmallVectorImpl<Expr *> &Outputs,
462                       bool *ArgChanged = nullptr);
463 
464   /// Transform the given declaration, which is referenced from a type
465   /// or expression.
466   ///
467   /// By default, acts as the identity function on declarations, unless the
468   /// transformer has had to transform the declaration itself. Subclasses
469   /// may override this function to provide alternate behavior.
470   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
471     llvm::DenseMap<Decl *, Decl *>::iterator Known
472       = TransformedLocalDecls.find(D);
473     if (Known != TransformedLocalDecls.end())
474       return Known->second;
475 
476     return D;
477   }
478 
479   /// Transform the specified condition.
480   ///
481   /// By default, this transforms the variable and expression and rebuilds
482   /// the condition.
483   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
484                                            Expr *Expr,
485                                            Sema::ConditionKind Kind);
486 
487   /// Transform the attributes associated with the given declaration and
488   /// place them on the new declaration.
489   ///
490   /// By default, this operation does nothing. Subclasses may override this
491   /// behavior to transform attributes.
492   void transformAttrs(Decl *Old, Decl *New) { }
493 
494   /// Note that a local declaration has been transformed by this
495   /// transformer.
496   ///
497   /// Local declarations are typically transformed via a call to
498   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
499   /// the transformer itself has to transform the declarations. This routine
500   /// can be overridden by a subclass that keeps track of such mappings.
501   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
502     assert(New.size() == 1 &&
503            "must override transformedLocalDecl if performing pack expansion");
504     TransformedLocalDecls[Old] = New.front();
505   }
506 
507   /// Transform the definition of the given declaration.
508   ///
509   /// By default, invokes TransformDecl() to transform the declaration.
510   /// Subclasses may override this function to provide alternate behavior.
511   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
512     return getDerived().TransformDecl(Loc, D);
513   }
514 
515   /// Transform the given declaration, which was the first part of a
516   /// nested-name-specifier in a member access expression.
517   ///
518   /// This specific declaration transformation only applies to the first
519   /// identifier in a nested-name-specifier of a member access expression, e.g.,
520   /// the \c T in \c x->T::member
521   ///
522   /// By default, invokes TransformDecl() to transform the declaration.
523   /// Subclasses may override this function to provide alternate behavior.
524   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
525     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
526   }
527 
528   /// Transform the set of declarations in an OverloadExpr.
529   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
530                                   LookupResult &R);
531 
532   /// Transform the given nested-name-specifier with source-location
533   /// information.
534   ///
535   /// By default, transforms all of the types and declarations within the
536   /// nested-name-specifier. Subclasses may override this function to provide
537   /// alternate behavior.
538   NestedNameSpecifierLoc
539   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
540                                   QualType ObjectType = QualType(),
541                                   NamedDecl *FirstQualifierInScope = nullptr);
542 
543   /// Transform the given declaration name.
544   ///
545   /// By default, transforms the types of conversion function, constructor,
546   /// and destructor names and then (if needed) rebuilds the declaration name.
547   /// Identifiers and selectors are returned unmodified. Subclasses may
548   /// override this function to provide alternate behavior.
549   DeclarationNameInfo
550   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
551 
552   bool TransformRequiresExprRequirements(
553       ArrayRef<concepts::Requirement *> Reqs,
554       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
555   concepts::TypeRequirement *
556   TransformTypeRequirement(concepts::TypeRequirement *Req);
557   concepts::ExprRequirement *
558   TransformExprRequirement(concepts::ExprRequirement *Req);
559   concepts::NestedRequirement *
560   TransformNestedRequirement(concepts::NestedRequirement *Req);
561 
562   /// Transform the given template name.
563   ///
564   /// \param SS The nested-name-specifier that qualifies the template
565   /// name. This nested-name-specifier must already have been transformed.
566   ///
567   /// \param Name The template name to transform.
568   ///
569   /// \param NameLoc The source location of the template name.
570   ///
571   /// \param ObjectType If we're translating a template name within a member
572   /// access expression, this is the type of the object whose member template
573   /// is being referenced.
574   ///
575   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
576   /// also refers to a name within the current (lexical) scope, this is the
577   /// declaration it refers to.
578   ///
579   /// By default, transforms the template name by transforming the declarations
580   /// and nested-name-specifiers that occur within the template name.
581   /// Subclasses may override this function to provide alternate behavior.
582   TemplateName
583   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
584                         SourceLocation NameLoc,
585                         QualType ObjectType = QualType(),
586                         NamedDecl *FirstQualifierInScope = nullptr,
587                         bool AllowInjectedClassName = false);
588 
589   /// Transform the given template argument.
590   ///
591   /// By default, this operation transforms the type, expression, or
592   /// declaration stored within the template argument and constructs a
593   /// new template argument from the transformed result. Subclasses may
594   /// override this function to provide alternate behavior.
595   ///
596   /// Returns true if there was an error.
597   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
598                                  TemplateArgumentLoc &Output,
599                                  bool Uneval = false);
600 
601   /// Transform the given set of template arguments.
602   ///
603   /// By default, this operation transforms all of the template arguments
604   /// in the input set using \c TransformTemplateArgument(), and appends
605   /// the transformed arguments to the output list.
606   ///
607   /// Note that this overload of \c TransformTemplateArguments() is merely
608   /// a convenience function. Subclasses that wish to override this behavior
609   /// should override the iterator-based member template version.
610   ///
611   /// \param Inputs The set of template arguments to be transformed.
612   ///
613   /// \param NumInputs The number of template arguments in \p Inputs.
614   ///
615   /// \param Outputs The set of transformed template arguments output by this
616   /// routine.
617   ///
618   /// Returns true if an error occurred.
619   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
620                                   unsigned NumInputs,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false) {
623     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
624                                       Uneval);
625   }
626 
627   /// Transform the given set of template arguments.
628   ///
629   /// By default, this operation transforms all of the template arguments
630   /// in the input set using \c TransformTemplateArgument(), and appends
631   /// the transformed arguments to the output list.
632   ///
633   /// \param First An iterator to the first template argument.
634   ///
635   /// \param Last An iterator one step past the last template argument.
636   ///
637   /// \param Outputs The set of transformed template arguments output by this
638   /// routine.
639   ///
640   /// Returns true if an error occurred.
641   template<typename InputIterator>
642   bool TransformTemplateArguments(InputIterator First,
643                                   InputIterator Last,
644                                   TemplateArgumentListInfo &Outputs,
645                                   bool Uneval = false);
646 
647   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
648   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
649                                  TemplateArgumentLoc &ArgLoc);
650 
651   /// Fakes up a TypeSourceInfo for a type.
652   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
653     return SemaRef.Context.getTrivialTypeSourceInfo(T,
654                        getDerived().getBaseLocation());
655   }
656 
657 #define ABSTRACT_TYPELOC(CLASS, PARENT)
658 #define TYPELOC(CLASS, PARENT)                                   \
659   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
660 #include "clang/AST/TypeLocNodes.def"
661 
662   QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
663                                          TemplateTypeParmTypeLoc TL,
664                                          bool SuppressObjCLifetime);
665   QualType
666   TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
667                                          SubstTemplateTypeParmPackTypeLoc TL,
668                                          bool SuppressObjCLifetime);
669 
670   template<typename Fn>
671   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
672                                       FunctionProtoTypeLoc TL,
673                                       CXXRecordDecl *ThisContext,
674                                       Qualifiers ThisTypeQuals,
675                                       Fn TransformExceptionSpec);
676 
677   template <typename Fn>
678   QualType TransformAttributedType(TypeLocBuilder &TLB, AttributedTypeLoc TL,
679                                    Fn TransformModifiedType);
680 
681   bool TransformExceptionSpec(SourceLocation Loc,
682                               FunctionProtoType::ExceptionSpecInfo &ESI,
683                               SmallVectorImpl<QualType> &Exceptions,
684                               bool &Changed);
685 
686   StmtResult TransformSEHHandler(Stmt *Handler);
687 
688   QualType
689   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
690                                       TemplateSpecializationTypeLoc TL,
691                                       TemplateName Template);
692 
693   QualType
694   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
695                                       DependentTemplateSpecializationTypeLoc TL,
696                                                TemplateName Template,
697                                                CXXScopeSpec &SS);
698 
699   QualType TransformDependentTemplateSpecializationType(
700       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
701       NestedNameSpecifierLoc QualifierLoc);
702 
703   /// Transforms the parameters of a function type into the
704   /// given vectors.
705   ///
706   /// The result vectors should be kept in sync; null entries in the
707   /// variables vector are acceptable.
708   ///
709   /// LastParamTransformed, if non-null, will be set to the index of the last
710   /// parameter on which transfromation was started. In the event of an error,
711   /// this will contain the parameter which failed to instantiate.
712   ///
713   /// Return true on error.
714   bool TransformFunctionTypeParams(
715       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
716       const QualType *ParamTypes,
717       const FunctionProtoType::ExtParameterInfo *ParamInfos,
718       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
719       Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed);
720 
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) {
727     return getDerived().TransformFunctionTypeParams(
728         Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr);
729   }
730 
731   /// Transforms the parameters of a requires expresison into the given vectors.
732   ///
733   /// The result vectors should be kept in sync; null entries in the
734   /// variables vector are acceptable.
735   ///
736   /// Returns an unset ExprResult on success.  Returns an ExprResult the 'not
737   /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of
738   /// which are cases where transformation shouldn't continue.
739   ExprResult TransformRequiresTypeParams(
740       SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
741       RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
742       SmallVectorImpl<QualType> &PTypes,
743       SmallVectorImpl<ParmVarDecl *> &TransParams,
744       Sema::ExtParameterInfoBuilder &PInfos) {
745     if (getDerived().TransformFunctionTypeParams(
746             KWLoc, Params, /*ParamTypes=*/nullptr,
747             /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos))
748       return ExprError();
749 
750     return ExprResult{};
751   }
752 
753   /// Transforms a single function-type parameter.  Return null
754   /// on error.
755   ///
756   /// \param indexAdjustment - A number to add to the parameter's
757   ///   scope index;  can be negative
758   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
759                                           int indexAdjustment,
760                                           std::optional<unsigned> NumExpansions,
761                                           bool ExpectParameterPack);
762 
763   /// Transform the body of a lambda-expression.
764   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
765   /// Alternative implementation of TransformLambdaBody that skips transforming
766   /// the body.
767   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
768 
769   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
770 
771   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
772   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
773 
774   TemplateParameterList *TransformTemplateParameterList(
775         TemplateParameterList *TPL) {
776     return TPL;
777   }
778 
779   ExprResult TransformAddressOfOperand(Expr *E);
780 
781   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
782                                                 bool IsAddressOfOperand,
783                                                 TypeSourceInfo **RecoveryTSI);
784 
785   ExprResult TransformParenDependentScopeDeclRefExpr(
786       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
787       TypeSourceInfo **RecoveryTSI);
788 
789   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
790 
791 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
792 // amount of stack usage with clang.
793 #define STMT(Node, Parent)                        \
794   LLVM_ATTRIBUTE_NOINLINE \
795   StmtResult Transform##Node(Node *S);
796 #define VALUESTMT(Node, Parent)                   \
797   LLVM_ATTRIBUTE_NOINLINE \
798   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
799 #define EXPR(Node, Parent)                        \
800   LLVM_ATTRIBUTE_NOINLINE \
801   ExprResult Transform##Node(Node *E);
802 #define ABSTRACT_STMT(Stmt)
803 #include "clang/AST/StmtNodes.inc"
804 
805 #define GEN_CLANG_CLAUSE_CLASS
806 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
807   LLVM_ATTRIBUTE_NOINLINE                                                      \
808   OMPClause *Transform##Class(Class *S);
809 #include "llvm/Frontend/OpenMP/OMP.inc"
810 
811   /// Build a new qualified type given its unqualified type and type location.
812   ///
813   /// By default, this routine adds type qualifiers only to types that can
814   /// have qualifiers, and silently suppresses those qualifiers that are not
815   /// permitted. Subclasses may override this routine to provide different
816   /// behavior.
817   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
818 
819   /// Build a new pointer type given its pointee type.
820   ///
821   /// By default, performs semantic analysis when building the pointer type.
822   /// Subclasses may override this routine to provide different behavior.
823   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
824 
825   /// Build a new block pointer type given its pointee type.
826   ///
827   /// By default, performs semantic analysis when building the block pointer
828   /// type. Subclasses may override this routine to provide different behavior.
829   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
830 
831   /// Build a new reference type given the type it references.
832   ///
833   /// By default, performs semantic analysis when building the
834   /// reference type. Subclasses may override this routine to provide
835   /// different behavior.
836   ///
837   /// \param LValue whether the type was written with an lvalue sigil
838   /// or an rvalue sigil.
839   QualType RebuildReferenceType(QualType ReferentType,
840                                 bool LValue,
841                                 SourceLocation Sigil);
842 
843   /// Build a new member pointer type given the pointee type and the
844   /// class type it refers into.
845   ///
846   /// By default, performs semantic analysis when building the member pointer
847   /// type. Subclasses may override this routine to provide different behavior.
848   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
849                                     SourceLocation Sigil);
850 
851   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
852                                     SourceLocation ProtocolLAngleLoc,
853                                     ArrayRef<ObjCProtocolDecl *> Protocols,
854                                     ArrayRef<SourceLocation> ProtocolLocs,
855                                     SourceLocation ProtocolRAngleLoc);
856 
857   /// Build an Objective-C object type.
858   ///
859   /// By default, performs semantic analysis when building the object type.
860   /// Subclasses may override this routine to provide different behavior.
861   QualType RebuildObjCObjectType(QualType BaseType,
862                                  SourceLocation Loc,
863                                  SourceLocation TypeArgsLAngleLoc,
864                                  ArrayRef<TypeSourceInfo *> TypeArgs,
865                                  SourceLocation TypeArgsRAngleLoc,
866                                  SourceLocation ProtocolLAngleLoc,
867                                  ArrayRef<ObjCProtocolDecl *> Protocols,
868                                  ArrayRef<SourceLocation> ProtocolLocs,
869                                  SourceLocation ProtocolRAngleLoc);
870 
871   /// Build a new Objective-C object pointer type given the pointee type.
872   ///
873   /// By default, directly builds the pointer type, with no additional semantic
874   /// analysis.
875   QualType RebuildObjCObjectPointerType(QualType PointeeType,
876                                         SourceLocation Star);
877 
878   /// Build a new array type given the element type, size
879   /// modifier, size of the array (if known), size expression, and index type
880   /// qualifiers.
881   ///
882   /// By default, performs semantic analysis when building the array type.
883   /// Subclasses may override this routine to provide different behavior.
884   /// Also by default, all of the other Rebuild*Array
885   QualType RebuildArrayType(QualType ElementType, ArraySizeModifier SizeMod,
886                             const llvm::APInt *Size, Expr *SizeExpr,
887                             unsigned IndexTypeQuals, SourceRange BracketsRange);
888 
889   /// Build a new constant array type given the element type, size
890   /// modifier, (known) size of the array, and index type qualifiers.
891   ///
892   /// By default, performs semantic analysis when building the array type.
893   /// Subclasses may override this routine to provide different behavior.
894   QualType RebuildConstantArrayType(QualType ElementType,
895                                     ArraySizeModifier SizeMod,
896                                     const llvm::APInt &Size, Expr *SizeExpr,
897                                     unsigned IndexTypeQuals,
898                                     SourceRange BracketsRange);
899 
900   /// Build a new incomplete array type given the element type, size
901   /// modifier, and index type qualifiers.
902   ///
903   /// By default, performs semantic analysis when building the array type.
904   /// Subclasses may override this routine to provide different behavior.
905   QualType RebuildIncompleteArrayType(QualType ElementType,
906                                       ArraySizeModifier SizeMod,
907                                       unsigned IndexTypeQuals,
908                                       SourceRange BracketsRange);
909 
910   /// Build a new variable-length array type given the element type,
911   /// size modifier, size expression, and index type qualifiers.
912   ///
913   /// By default, performs semantic analysis when building the array type.
914   /// Subclasses may override this routine to provide different behavior.
915   QualType RebuildVariableArrayType(QualType ElementType,
916                                     ArraySizeModifier SizeMod, Expr *SizeExpr,
917                                     unsigned IndexTypeQuals,
918                                     SourceRange BracketsRange);
919 
920   /// Build a new dependent-sized array type given the element type,
921   /// size modifier, size expression, and index type qualifiers.
922   ///
923   /// By default, performs semantic analysis when building the array type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildDependentSizedArrayType(QualType ElementType,
926                                           ArraySizeModifier SizeMod,
927                                           Expr *SizeExpr,
928                                           unsigned IndexTypeQuals,
929                                           SourceRange BracketsRange);
930 
931   /// Build a new vector type given the element type and
932   /// number of elements.
933   ///
934   /// By default, performs semantic analysis when building the vector type.
935   /// Subclasses may override this routine to provide different behavior.
936   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
937                              VectorKind VecKind);
938 
939   /// Build a new potentially dependently-sized extended vector type
940   /// given the element type and number of elements.
941   ///
942   /// By default, performs semantic analysis when building the vector type.
943   /// Subclasses may override this routine to provide different behavior.
944   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
945                                       SourceLocation AttributeLoc, VectorKind);
946 
947   /// Build a new extended vector type given the element type and
948   /// number of elements.
949   ///
950   /// By default, performs semantic analysis when building the vector type.
951   /// Subclasses may override this routine to provide different behavior.
952   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
953                                 SourceLocation AttributeLoc);
954 
955   /// Build a new potentially dependently-sized extended vector type
956   /// given the element type and number of elements.
957   ///
958   /// By default, performs semantic analysis when building the vector type.
959   /// Subclasses may override this routine to provide different behavior.
960   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
961                                               Expr *SizeExpr,
962                                               SourceLocation AttributeLoc);
963 
964   /// Build a new matrix type given the element type and dimensions.
965   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
966                                      unsigned NumColumns);
967 
968   /// Build a new matrix type given the type and dependently-defined
969   /// dimensions.
970   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
971                                            Expr *ColumnExpr,
972                                            SourceLocation AttributeLoc);
973 
974   /// Build a new DependentAddressSpaceType or return the pointee
975   /// type variable with the correct address space (retrieved from
976   /// AddrSpaceExpr) applied to it. The former will be returned in cases
977   /// where the address space remains dependent.
978   ///
979   /// By default, performs semantic analysis when building the type with address
980   /// space applied. Subclasses may override this routine to provide different
981   /// behavior.
982   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
983                                             Expr *AddrSpaceExpr,
984                                             SourceLocation AttributeLoc);
985 
986   /// Build a new function type.
987   ///
988   /// By default, performs semantic analysis when building the function type.
989   /// Subclasses may override this routine to provide different behavior.
990   QualType RebuildFunctionProtoType(QualType T,
991                                     MutableArrayRef<QualType> ParamTypes,
992                                     const FunctionProtoType::ExtProtoInfo &EPI);
993 
994   /// Build a new unprototyped function type.
995   QualType RebuildFunctionNoProtoType(QualType ResultType);
996 
997   /// Rebuild an unresolved typename type, given the decl that
998   /// the UnresolvedUsingTypenameDecl was transformed to.
999   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
1000 
1001   /// Build a new type found via an alias.
1002   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
1003     return SemaRef.Context.getUsingType(Found, Underlying);
1004   }
1005 
1006   /// Build a new typedef type.
1007   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
1008     return SemaRef.Context.getTypeDeclType(Typedef);
1009   }
1010 
1011   /// Build a new MacroDefined type.
1012   QualType RebuildMacroQualifiedType(QualType T,
1013                                      const IdentifierInfo *MacroII) {
1014     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
1015   }
1016 
1017   /// Build a new class/struct/union type.
1018   QualType RebuildRecordType(RecordDecl *Record) {
1019     return SemaRef.Context.getTypeDeclType(Record);
1020   }
1021 
1022   /// Build a new Enum type.
1023   QualType RebuildEnumType(EnumDecl *Enum) {
1024     return SemaRef.Context.getTypeDeclType(Enum);
1025   }
1026 
1027   /// Build a new typeof(expr) type.
1028   ///
1029   /// By default, performs semantic analysis when building the typeof type.
1030   /// Subclasses may override this routine to provide different behavior.
1031   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc,
1032                                  TypeOfKind Kind);
1033 
1034   /// Build a new typeof(type) type.
1035   ///
1036   /// By default, builds a new TypeOfType with the given underlying type.
1037   QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind);
1038 
1039   /// Build a new unary transform type.
1040   QualType RebuildUnaryTransformType(QualType BaseType,
1041                                      UnaryTransformType::UTTKind UKind,
1042                                      SourceLocation Loc);
1043 
1044   /// Build a new C++11 decltype type.
1045   ///
1046   /// By default, performs semantic analysis when building the decltype type.
1047   /// Subclasses may override this routine to provide different behavior.
1048   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
1049 
1050   /// Build a new C++11 auto type.
1051   ///
1052   /// By default, builds a new AutoType with the given deduced type.
1053   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
1054                            ConceptDecl *TypeConstraintConcept,
1055                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
1056     // Note, IsDependent is always false here: we implicitly convert an 'auto'
1057     // which has been deduced to a dependent type into an undeduced 'auto', so
1058     // that we'll retry deduction after the transformation.
1059     return SemaRef.Context.getAutoType(Deduced, Keyword,
1060                                        /*IsDependent*/ false, /*IsPack=*/false,
1061                                        TypeConstraintConcept,
1062                                        TypeConstraintArgs);
1063   }
1064 
1065   /// By default, builds a new DeducedTemplateSpecializationType with the given
1066   /// deduced type.
1067   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1068       QualType Deduced) {
1069     return SemaRef.Context.getDeducedTemplateSpecializationType(
1070         Template, Deduced, /*IsDependent*/ false);
1071   }
1072 
1073   /// Build a new template specialization type.
1074   ///
1075   /// By default, performs semantic analysis when building the template
1076   /// specialization type. Subclasses may override this routine to provide
1077   /// different behavior.
1078   QualType RebuildTemplateSpecializationType(TemplateName Template,
1079                                              SourceLocation TemplateLoc,
1080                                              TemplateArgumentListInfo &Args);
1081 
1082   /// Build a new parenthesized type.
1083   ///
1084   /// By default, builds a new ParenType type from the inner type.
1085   /// Subclasses may override this routine to provide different behavior.
1086   QualType RebuildParenType(QualType InnerType) {
1087     return SemaRef.BuildParenType(InnerType);
1088   }
1089 
1090   /// Build a new qualified name type.
1091   ///
1092   /// By default, builds a new ElaboratedType type from the keyword,
1093   /// the nested-name-specifier and the named type.
1094   /// Subclasses may override this routine to provide different behavior.
1095   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1096                                  ElaboratedTypeKeyword Keyword,
1097                                  NestedNameSpecifierLoc QualifierLoc,
1098                                  QualType Named) {
1099     return SemaRef.Context.getElaboratedType(Keyword,
1100                                          QualifierLoc.getNestedNameSpecifier(),
1101                                              Named);
1102   }
1103 
1104   /// Build a new typename type that refers to a template-id.
1105   ///
1106   /// By default, builds a new DependentNameType type from the
1107   /// nested-name-specifier and the given type. Subclasses may override
1108   /// this routine to provide different behavior.
1109   QualType RebuildDependentTemplateSpecializationType(
1110                                           ElaboratedTypeKeyword Keyword,
1111                                           NestedNameSpecifierLoc QualifierLoc,
1112                                           SourceLocation TemplateKWLoc,
1113                                           const IdentifierInfo *Name,
1114                                           SourceLocation NameLoc,
1115                                           TemplateArgumentListInfo &Args,
1116                                           bool AllowInjectedClassName) {
1117     // Rebuild the template name.
1118     // TODO: avoid TemplateName abstraction
1119     CXXScopeSpec SS;
1120     SS.Adopt(QualifierLoc);
1121     TemplateName InstName = getDerived().RebuildTemplateName(
1122         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1123         AllowInjectedClassName);
1124 
1125     if (InstName.isNull())
1126       return QualType();
1127 
1128     // If it's still dependent, make a dependent specialization.
1129     if (InstName.getAsDependentTemplateName())
1130       return SemaRef.Context.getDependentTemplateSpecializationType(
1131           Keyword, QualifierLoc.getNestedNameSpecifier(), Name,
1132           Args.arguments());
1133 
1134     // Otherwise, make an elaborated type wrapping a non-dependent
1135     // specialization.
1136     QualType T =
1137         getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1138     if (T.isNull())
1139       return QualType();
1140     return SemaRef.Context.getElaboratedType(
1141         Keyword, QualifierLoc.getNestedNameSpecifier(), T);
1142   }
1143 
1144   /// Build a new typename type that refers to an identifier.
1145   ///
1146   /// By default, performs semantic analysis when building the typename type
1147   /// (or elaborated type). Subclasses may override this routine to provide
1148   /// different behavior.
1149   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1150                                     SourceLocation KeywordLoc,
1151                                     NestedNameSpecifierLoc QualifierLoc,
1152                                     const IdentifierInfo *Id,
1153                                     SourceLocation IdLoc,
1154                                     bool DeducedTSTContext) {
1155     CXXScopeSpec SS;
1156     SS.Adopt(QualifierLoc);
1157 
1158     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1159       // If the name is still dependent, just build a new dependent name type.
1160       if (!SemaRef.computeDeclContext(SS))
1161         return SemaRef.Context.getDependentNameType(Keyword,
1162                                           QualifierLoc.getNestedNameSpecifier(),
1163                                                     Id);
1164     }
1165 
1166     if (Keyword == ElaboratedTypeKeyword::None ||
1167         Keyword == ElaboratedTypeKeyword::Typename) {
1168       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1169                                        *Id, IdLoc, DeducedTSTContext);
1170     }
1171 
1172     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1173 
1174     // We had a dependent elaborated-type-specifier that has been transformed
1175     // into a non-dependent elaborated-type-specifier. Find the tag we're
1176     // referring to.
1177     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1178     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1179     if (!DC)
1180       return QualType();
1181 
1182     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1183       return QualType();
1184 
1185     TagDecl *Tag = nullptr;
1186     SemaRef.LookupQualifiedName(Result, DC);
1187     switch (Result.getResultKind()) {
1188       case LookupResult::NotFound:
1189       case LookupResult::NotFoundInCurrentInstantiation:
1190         break;
1191 
1192       case LookupResult::Found:
1193         Tag = Result.getAsSingle<TagDecl>();
1194         break;
1195 
1196       case LookupResult::FoundOverloaded:
1197       case LookupResult::FoundUnresolvedValue:
1198         llvm_unreachable("Tag lookup cannot find non-tags");
1199 
1200       case LookupResult::Ambiguous:
1201         // Let the LookupResult structure handle ambiguities.
1202         return QualType();
1203     }
1204 
1205     if (!Tag) {
1206       // Check where the name exists but isn't a tag type and use that to emit
1207       // better diagnostics.
1208       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1209       SemaRef.LookupQualifiedName(Result, DC);
1210       switch (Result.getResultKind()) {
1211         case LookupResult::Found:
1212         case LookupResult::FoundOverloaded:
1213         case LookupResult::FoundUnresolvedValue: {
1214           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1215           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1216           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag)
1217               << SomeDecl << NTK << llvm::to_underlying(Kind);
1218           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1219           break;
1220         }
1221         default:
1222           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1223               << llvm::to_underlying(Kind) << Id << DC
1224               << QualifierLoc.getSourceRange();
1225           break;
1226       }
1227       return QualType();
1228     }
1229 
1230     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1231                                               IdLoc, Id)) {
1232       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1233       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1234       return QualType();
1235     }
1236 
1237     // Build the elaborated-type-specifier type.
1238     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1239     return SemaRef.Context.getElaboratedType(Keyword,
1240                                          QualifierLoc.getNestedNameSpecifier(),
1241                                              T);
1242   }
1243 
1244   /// Build a new pack expansion type.
1245   ///
1246   /// By default, builds a new PackExpansionType type from the given pattern.
1247   /// Subclasses may override this routine to provide different behavior.
1248   QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange,
1249                                     SourceLocation EllipsisLoc,
1250                                     std::optional<unsigned> NumExpansions) {
1251     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1252                                         NumExpansions);
1253   }
1254 
1255   /// Build a new atomic type given its value type.
1256   ///
1257   /// By default, performs semantic analysis when building the atomic type.
1258   /// Subclasses may override this routine to provide different behavior.
1259   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1260 
1261   /// Build a new pipe type given its value type.
1262   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1263                            bool isReadPipe);
1264 
1265   /// Build a bit-precise int given its value type.
1266   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1267                              SourceLocation Loc);
1268 
1269   /// Build a dependent bit-precise int given its value type.
1270   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1271                                       SourceLocation Loc);
1272 
1273   /// Build a new template name given a nested name specifier, a flag
1274   /// indicating whether the "template" keyword was provided, and the template
1275   /// that the template name refers to.
1276   ///
1277   /// By default, builds the new template name directly. Subclasses may override
1278   /// this routine to provide different behavior.
1279   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1280                                    bool TemplateKW,
1281                                    TemplateDecl *Template);
1282 
1283   /// Build a new template name given a nested name specifier and the
1284   /// name that is referred to as a template.
1285   ///
1286   /// By default, performs semantic analysis to determine whether the name can
1287   /// be resolved to a specific template, then builds the appropriate kind of
1288   /// template name. Subclasses may override this routine to provide different
1289   /// behavior.
1290   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1291                                    SourceLocation TemplateKWLoc,
1292                                    const IdentifierInfo &Name,
1293                                    SourceLocation NameLoc, QualType ObjectType,
1294                                    NamedDecl *FirstQualifierInScope,
1295                                    bool AllowInjectedClassName);
1296 
1297   /// Build a new template name given a nested name specifier and the
1298   /// overloaded operator name that is referred to as a template.
1299   ///
1300   /// By default, performs semantic analysis to determine whether the name can
1301   /// be resolved to a specific template, then builds the appropriate kind of
1302   /// template name. Subclasses may override this routine to provide different
1303   /// behavior.
1304   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1305                                    SourceLocation TemplateKWLoc,
1306                                    OverloadedOperatorKind Operator,
1307                                    SourceLocation NameLoc, QualType ObjectType,
1308                                    bool AllowInjectedClassName);
1309 
1310   /// Build a new template name given a template template parameter pack
1311   /// and the
1312   ///
1313   /// By default, performs semantic analysis to determine whether the name can
1314   /// be resolved to a specific template, then builds the appropriate kind of
1315   /// template name. Subclasses may override this routine to provide different
1316   /// behavior.
1317   TemplateName RebuildTemplateName(const TemplateArgument &ArgPack,
1318                                    Decl *AssociatedDecl, unsigned Index,
1319                                    bool Final) {
1320     return getSema().Context.getSubstTemplateTemplateParmPack(
1321         ArgPack, AssociatedDecl, Index, Final);
1322   }
1323 
1324   /// Build a new compound statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1329                                        MultiStmtArg Statements,
1330                                        SourceLocation RBraceLoc,
1331                                        bool IsStmtExpr) {
1332     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1333                                        IsStmtExpr);
1334   }
1335 
1336   /// Build a new case statement.
1337   ///
1338   /// By default, performs semantic analysis to build the new statement.
1339   /// Subclasses may override this routine to provide different behavior.
1340   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1341                                    Expr *LHS,
1342                                    SourceLocation EllipsisLoc,
1343                                    Expr *RHS,
1344                                    SourceLocation ColonLoc) {
1345     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1346                                    ColonLoc);
1347   }
1348 
1349   /// Attach the body to a new case statement.
1350   ///
1351   /// By default, performs semantic analysis to build the new statement.
1352   /// Subclasses may override this routine to provide different behavior.
1353   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1354     getSema().ActOnCaseStmtBody(S, Body);
1355     return S;
1356   }
1357 
1358   /// Build a new default statement.
1359   ///
1360   /// By default, performs semantic analysis to build the new statement.
1361   /// Subclasses may override this routine to provide different behavior.
1362   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1363                                       SourceLocation ColonLoc,
1364                                       Stmt *SubStmt) {
1365     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1366                                       /*CurScope=*/nullptr);
1367   }
1368 
1369   /// Build a new label statement.
1370   ///
1371   /// By default, performs semantic analysis to build the new statement.
1372   /// Subclasses may override this routine to provide different behavior.
1373   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1374                               SourceLocation ColonLoc, Stmt *SubStmt) {
1375     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1376   }
1377 
1378   /// Build a new attributed statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1383                                    ArrayRef<const Attr *> Attrs,
1384                                    Stmt *SubStmt) {
1385     if (SemaRef.CheckRebuiltStmtAttributes(Attrs))
1386       return StmtError();
1387     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1388   }
1389 
1390   /// Build a new "if" statement.
1391   ///
1392   /// By default, performs semantic analysis to build the new statement.
1393   /// Subclasses may override this routine to provide different behavior.
1394   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1395                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1396                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1397                            SourceLocation ElseLoc, Stmt *Else) {
1398     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1399                                  Then, ElseLoc, Else);
1400   }
1401 
1402   /// Start building a new switch 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 RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1407                                     SourceLocation LParenLoc, Stmt *Init,
1408                                     Sema::ConditionResult Cond,
1409                                     SourceLocation RParenLoc) {
1410     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1411                                             RParenLoc);
1412   }
1413 
1414   /// Attach the body to the switch 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 RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1419                                    Stmt *Switch, Stmt *Body) {
1420     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1421   }
1422 
1423   /// Build a new while statement.
1424   ///
1425   /// By default, performs semantic analysis to build the new statement.
1426   /// Subclasses may override this routine to provide different behavior.
1427   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1428                               Sema::ConditionResult Cond,
1429                               SourceLocation RParenLoc, Stmt *Body) {
1430     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1431   }
1432 
1433   /// Build a new do-while statement.
1434   ///
1435   /// By default, performs semantic analysis to build the new statement.
1436   /// Subclasses may override this routine to provide different behavior.
1437   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1438                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1439                            Expr *Cond, SourceLocation RParenLoc) {
1440     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1441                                  Cond, RParenLoc);
1442   }
1443 
1444   /// Build a new for statement.
1445   ///
1446   /// By default, performs semantic analysis to build the new statement.
1447   /// Subclasses may override this routine to provide different behavior.
1448   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1449                             Stmt *Init, Sema::ConditionResult Cond,
1450                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1451                             Stmt *Body) {
1452     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1453                                   Inc, RParenLoc, Body);
1454   }
1455 
1456   /// Build a new goto statement.
1457   ///
1458   /// By default, performs semantic analysis to build the new statement.
1459   /// Subclasses may override this routine to provide different behavior.
1460   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1461                              LabelDecl *Label) {
1462     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1463   }
1464 
1465   /// Build a new indirect goto statement.
1466   ///
1467   /// By default, performs semantic analysis to build the new statement.
1468   /// Subclasses may override this routine to provide different behavior.
1469   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1470                                      SourceLocation StarLoc,
1471                                      Expr *Target) {
1472     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1473   }
1474 
1475   /// Build a new return statement.
1476   ///
1477   /// By default, performs semantic analysis to build the new statement.
1478   /// Subclasses may override this routine to provide different behavior.
1479   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1480     return getSema().BuildReturnStmt(ReturnLoc, Result);
1481   }
1482 
1483   /// Build a new declaration statement.
1484   ///
1485   /// By default, performs semantic analysis to build the new statement.
1486   /// Subclasses may override this routine to provide different behavior.
1487   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1488                              SourceLocation StartLoc, SourceLocation EndLoc) {
1489     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1490     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1491   }
1492 
1493   /// Build a new inline asm statement.
1494   ///
1495   /// By default, performs semantic analysis to build the new statement.
1496   /// Subclasses may override this routine to provide different behavior.
1497   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1498                                bool IsVolatile, unsigned NumOutputs,
1499                                unsigned NumInputs, IdentifierInfo **Names,
1500                                MultiExprArg Constraints, MultiExprArg Exprs,
1501                                Expr *AsmString, MultiExprArg Clobbers,
1502                                unsigned NumLabels,
1503                                SourceLocation RParenLoc) {
1504     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1505                                      NumInputs, Names, Constraints, Exprs,
1506                                      AsmString, Clobbers, NumLabels, RParenLoc);
1507   }
1508 
1509   /// Build a new MS style inline asm statement.
1510   ///
1511   /// By default, performs semantic analysis to build the new statement.
1512   /// Subclasses may override this routine to provide different behavior.
1513   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1514                               ArrayRef<Token> AsmToks,
1515                               StringRef AsmString,
1516                               unsigned NumOutputs, unsigned NumInputs,
1517                               ArrayRef<StringRef> Constraints,
1518                               ArrayRef<StringRef> Clobbers,
1519                               ArrayRef<Expr*> Exprs,
1520                               SourceLocation EndLoc) {
1521     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1522                                     NumOutputs, NumInputs,
1523                                     Constraints, Clobbers, Exprs, EndLoc);
1524   }
1525 
1526   /// Build a new co_return statement.
1527   ///
1528   /// By default, performs semantic analysis to build the new statement.
1529   /// Subclasses may override this routine to provide different behavior.
1530   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1531                                  bool IsImplicit) {
1532     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1533   }
1534 
1535   /// Build a new co_await expression.
1536   ///
1537   /// By default, performs semantic analysis to build the new expression.
1538   /// Subclasses may override this routine to provide different behavior.
1539   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand,
1540                                 UnresolvedLookupExpr *OpCoawaitLookup,
1541                                 bool IsImplicit) {
1542     // This function rebuilds a coawait-expr given its operator.
1543     // For an explicit coawait-expr, the rebuild involves the full set
1544     // of transformations performed by BuildUnresolvedCoawaitExpr(),
1545     // including calling await_transform().
1546     // For an implicit coawait-expr, we need to rebuild the "operator
1547     // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr().
1548     // This mirrors how the implicit CoawaitExpr is originally created
1549     // in Sema::ActOnCoroutineBodyStart().
1550     if (IsImplicit) {
1551       ExprResult Suspend = getSema().BuildOperatorCoawaitCall(
1552           CoawaitLoc, Operand, OpCoawaitLookup);
1553       if (Suspend.isInvalid())
1554         return ExprError();
1555       return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand,
1556                                                 Suspend.get(), true);
1557     }
1558 
1559     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand,
1560                                                 OpCoawaitLookup);
1561   }
1562 
1563   /// Build a new co_await expression.
1564   ///
1565   /// By default, performs semantic analysis to build the new expression.
1566   /// Subclasses may override this routine to provide different behavior.
1567   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1568                                          Expr *Result,
1569                                          UnresolvedLookupExpr *Lookup) {
1570     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1571   }
1572 
1573   /// Build a new co_yield expression.
1574   ///
1575   /// By default, performs semantic analysis to build the new expression.
1576   /// Subclasses may override this routine to provide different behavior.
1577   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1578     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1579   }
1580 
1581   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1582     return getSema().BuildCoroutineBodyStmt(Args);
1583   }
1584 
1585   /// Build a new Objective-C \@try statement.
1586   ///
1587   /// By default, performs semantic analysis to build the new statement.
1588   /// Subclasses may override this routine to provide different behavior.
1589   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1590                                         Stmt *TryBody,
1591                                         MultiStmtArg CatchStmts,
1592                                         Stmt *Finally) {
1593     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1594                                         Finally);
1595   }
1596 
1597   /// Rebuild an Objective-C exception declaration.
1598   ///
1599   /// By default, performs semantic analysis to build the new declaration.
1600   /// Subclasses may override this routine to provide different behavior.
1601   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1602                                     TypeSourceInfo *TInfo, QualType T) {
1603     return getSema().BuildObjCExceptionDecl(TInfo, T,
1604                                             ExceptionDecl->getInnerLocStart(),
1605                                             ExceptionDecl->getLocation(),
1606                                             ExceptionDecl->getIdentifier());
1607   }
1608 
1609   /// Build a new Objective-C \@catch 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 RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1614                                           SourceLocation RParenLoc,
1615                                           VarDecl *Var,
1616                                           Stmt *Body) {
1617     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1618                                           Var, Body);
1619   }
1620 
1621   /// Build a new Objective-C \@finally statement.
1622   ///
1623   /// By default, performs semantic analysis to build the new statement.
1624   /// Subclasses may override this routine to provide different behavior.
1625   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1626                                             Stmt *Body) {
1627     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1628   }
1629 
1630   /// Build a new Objective-C \@throw statement.
1631   ///
1632   /// By default, performs semantic analysis to build the new statement.
1633   /// Subclasses may override this routine to provide different behavior.
1634   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1635                                           Expr *Operand) {
1636     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1637   }
1638 
1639   /// Build a new OpenMP Canonical loop.
1640   ///
1641   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1642   /// OMPCanonicalLoop.
1643   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1644     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1645   }
1646 
1647   /// Build a new OpenMP executable directive.
1648   ///
1649   /// By default, performs semantic analysis to build the new statement.
1650   /// Subclasses may override this routine to provide different behavior.
1651   StmtResult RebuildOMPExecutableDirective(
1652       OpenMPDirectiveKind Kind, DeclarationNameInfo DirName,
1653       OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses,
1654       Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc,
1655       OpenMPDirectiveKind PrevMappedDirective = OMPD_unknown) {
1656 
1657     return getSema().ActOnOpenMPExecutableDirective(
1658         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc,
1659         PrevMappedDirective);
1660   }
1661 
1662   /// Build a new OpenMP 'if' clause.
1663   ///
1664   /// By default, performs semantic analysis to build the new OpenMP clause.
1665   /// Subclasses may override this routine to provide different behavior.
1666   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1667                                 Expr *Condition, SourceLocation StartLoc,
1668                                 SourceLocation LParenLoc,
1669                                 SourceLocation NameModifierLoc,
1670                                 SourceLocation ColonLoc,
1671                                 SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1673                                          LParenLoc, NameModifierLoc, ColonLoc,
1674                                          EndLoc);
1675   }
1676 
1677   /// Build a new OpenMP 'final' clause.
1678   ///
1679   /// By default, performs semantic analysis to build the new OpenMP clause.
1680   /// Subclasses may override this routine to provide different behavior.
1681   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1682                                    SourceLocation LParenLoc,
1683                                    SourceLocation EndLoc) {
1684     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1685                                             EndLoc);
1686   }
1687 
1688   /// Build a new OpenMP 'num_threads' clause.
1689   ///
1690   /// By default, performs semantic analysis to build the new OpenMP clause.
1691   /// Subclasses may override this routine to provide different behavior.
1692   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1693                                         SourceLocation StartLoc,
1694                                         SourceLocation LParenLoc,
1695                                         SourceLocation EndLoc) {
1696     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1697                                                  LParenLoc, EndLoc);
1698   }
1699 
1700   /// Build a new OpenMP 'safelen' clause.
1701   ///
1702   /// By default, performs semantic analysis to build the new OpenMP clause.
1703   /// Subclasses may override this routine to provide different behavior.
1704   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1705                                      SourceLocation LParenLoc,
1706                                      SourceLocation EndLoc) {
1707     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1708   }
1709 
1710   /// Build a new OpenMP 'simdlen' clause.
1711   ///
1712   /// By default, performs semantic analysis to build the new OpenMP clause.
1713   /// Subclasses may override this routine to provide different behavior.
1714   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1715                                      SourceLocation LParenLoc,
1716                                      SourceLocation EndLoc) {
1717     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1718   }
1719 
1720   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1721                                    SourceLocation StartLoc,
1722                                    SourceLocation LParenLoc,
1723                                    SourceLocation EndLoc) {
1724     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1725   }
1726 
1727   /// Build a new OpenMP 'full' clause.
1728   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1729                                   SourceLocation EndLoc) {
1730     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1731   }
1732 
1733   /// Build a new OpenMP 'partial' clause.
1734   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1735                                      SourceLocation LParenLoc,
1736                                      SourceLocation EndLoc) {
1737     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1738                                               EndLoc);
1739   }
1740 
1741   /// Build a new OpenMP 'allocator' clause.
1742   ///
1743   /// By default, performs semantic analysis to build the new OpenMP clause.
1744   /// Subclasses may override this routine to provide different behavior.
1745   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1746                                        SourceLocation LParenLoc,
1747                                        SourceLocation EndLoc) {
1748     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1749   }
1750 
1751   /// Build a new OpenMP 'collapse' clause.
1752   ///
1753   /// By default, performs semantic analysis to build the new OpenMP clause.
1754   /// Subclasses may override this routine to provide different behavior.
1755   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1756                                       SourceLocation LParenLoc,
1757                                       SourceLocation EndLoc) {
1758     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1759                                                EndLoc);
1760   }
1761 
1762   /// Build a new OpenMP 'default' clause.
1763   ///
1764   /// By default, performs semantic analysis to build the new OpenMP clause.
1765   /// Subclasses may override this routine to provide different behavior.
1766   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1767                                      SourceLocation StartLoc,
1768                                      SourceLocation LParenLoc,
1769                                      SourceLocation EndLoc) {
1770     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1771                                               StartLoc, LParenLoc, EndLoc);
1772   }
1773 
1774   /// Build a new OpenMP 'proc_bind' clause.
1775   ///
1776   /// By default, performs semantic analysis to build the new OpenMP clause.
1777   /// Subclasses may override this routine to provide different behavior.
1778   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1779                                       SourceLocation KindKwLoc,
1780                                       SourceLocation StartLoc,
1781                                       SourceLocation LParenLoc,
1782                                       SourceLocation EndLoc) {
1783     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1784                                                StartLoc, LParenLoc, EndLoc);
1785   }
1786 
1787   /// Build a new OpenMP 'schedule' 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 *RebuildOMPScheduleClause(
1792       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1793       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1794       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1795       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1796     return getSema().ActOnOpenMPScheduleClause(
1797         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1798         CommaLoc, EndLoc);
1799   }
1800 
1801   /// Build a new OpenMP 'ordered' clause.
1802   ///
1803   /// By default, performs semantic analysis to build the new OpenMP clause.
1804   /// Subclasses may override this routine to provide different behavior.
1805   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1806                                      SourceLocation EndLoc,
1807                                      SourceLocation LParenLoc, Expr *Num) {
1808     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1809   }
1810 
1811   /// Build a new OpenMP 'private' clause.
1812   ///
1813   /// By default, performs semantic analysis to build the new OpenMP clause.
1814   /// Subclasses may override this routine to provide different behavior.
1815   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1816                                      SourceLocation StartLoc,
1817                                      SourceLocation LParenLoc,
1818                                      SourceLocation EndLoc) {
1819     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1820                                               EndLoc);
1821   }
1822 
1823   /// Build a new OpenMP 'firstprivate' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new OpenMP clause.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1828                                           SourceLocation StartLoc,
1829                                           SourceLocation LParenLoc,
1830                                           SourceLocation EndLoc) {
1831     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1832                                                    EndLoc);
1833   }
1834 
1835   /// Build a new OpenMP 'lastprivate' clause.
1836   ///
1837   /// By default, performs semantic analysis to build the new OpenMP clause.
1838   /// Subclasses may override this routine to provide different behavior.
1839   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1840                                          OpenMPLastprivateModifier LPKind,
1841                                          SourceLocation LPKindLoc,
1842                                          SourceLocation ColonLoc,
1843                                          SourceLocation StartLoc,
1844                                          SourceLocation LParenLoc,
1845                                          SourceLocation EndLoc) {
1846     return getSema().ActOnOpenMPLastprivateClause(
1847         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1848   }
1849 
1850   /// Build a new OpenMP 'shared' clause.
1851   ///
1852   /// By default, performs semantic analysis to build the new OpenMP clause.
1853   /// Subclasses may override this routine to provide different behavior.
1854   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1855                                     SourceLocation StartLoc,
1856                                     SourceLocation LParenLoc,
1857                                     SourceLocation EndLoc) {
1858     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1859                                              EndLoc);
1860   }
1861 
1862   /// Build a new OpenMP 'reduction' clause.
1863   ///
1864   /// By default, performs semantic analysis to build the new statement.
1865   /// Subclasses may override this routine to provide different behavior.
1866   OMPClause *RebuildOMPReductionClause(
1867       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1868       SourceLocation StartLoc, SourceLocation LParenLoc,
1869       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1870       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1871       const DeclarationNameInfo &ReductionId,
1872       ArrayRef<Expr *> UnresolvedReductions) {
1873     return getSema().ActOnOpenMPReductionClause(
1874         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1875         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1876   }
1877 
1878   /// Build a new OpenMP 'task_reduction' clause.
1879   ///
1880   /// By default, performs semantic analysis to build the new statement.
1881   /// Subclasses may override this routine to provide different behavior.
1882   OMPClause *RebuildOMPTaskReductionClause(
1883       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1884       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1885       CXXScopeSpec &ReductionIdScopeSpec,
1886       const DeclarationNameInfo &ReductionId,
1887       ArrayRef<Expr *> UnresolvedReductions) {
1888     return getSema().ActOnOpenMPTaskReductionClause(
1889         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1890         ReductionId, UnresolvedReductions);
1891   }
1892 
1893   /// Build a new OpenMP 'in_reduction' clause.
1894   ///
1895   /// By default, performs semantic analysis to build the new statement.
1896   /// Subclasses may override this routine to provide different behavior.
1897   OMPClause *
1898   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1899                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1900                               SourceLocation EndLoc,
1901                               CXXScopeSpec &ReductionIdScopeSpec,
1902                               const DeclarationNameInfo &ReductionId,
1903                               ArrayRef<Expr *> UnresolvedReductions) {
1904     return getSema().ActOnOpenMPInReductionClause(
1905         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1906         ReductionId, UnresolvedReductions);
1907   }
1908 
1909   /// Build a new OpenMP 'linear' clause.
1910   ///
1911   /// By default, performs semantic analysis to build the new OpenMP clause.
1912   /// Subclasses may override this routine to provide different behavior.
1913   OMPClause *RebuildOMPLinearClause(
1914       ArrayRef<Expr *> VarList, Expr *Step, SourceLocation StartLoc,
1915       SourceLocation LParenLoc, OpenMPLinearClauseKind Modifier,
1916       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1917       SourceLocation StepModifierLoc, SourceLocation EndLoc) {
1918     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1919                                              Modifier, ModifierLoc, ColonLoc,
1920                                              StepModifierLoc, EndLoc);
1921   }
1922 
1923   /// Build a new OpenMP 'aligned' clause.
1924   ///
1925   /// By default, performs semantic analysis to build the new OpenMP clause.
1926   /// Subclasses may override this routine to provide different behavior.
1927   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1928                                      SourceLocation StartLoc,
1929                                      SourceLocation LParenLoc,
1930                                      SourceLocation ColonLoc,
1931                                      SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1933                                               LParenLoc, ColonLoc, EndLoc);
1934   }
1935 
1936   /// Build a new OpenMP 'copyin' clause.
1937   ///
1938   /// By default, performs semantic analysis to build the new OpenMP clause.
1939   /// Subclasses may override this routine to provide different behavior.
1940   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1941                                     SourceLocation StartLoc,
1942                                     SourceLocation LParenLoc,
1943                                     SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1945                                              EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'copyprivate' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new OpenMP clause.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1957                                                   EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'flush' pseudo clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new OpenMP clause.
1963   /// Subclasses may override this routine to provide different behavior.
1964   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1965                                    SourceLocation StartLoc,
1966                                    SourceLocation LParenLoc,
1967                                    SourceLocation EndLoc) {
1968     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1969                                             EndLoc);
1970   }
1971 
1972   /// Build a new OpenMP 'depobj' pseudo clause.
1973   ///
1974   /// By default, performs semantic analysis to build the new OpenMP clause.
1975   /// Subclasses may override this routine to provide different behavior.
1976   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1977                                     SourceLocation LParenLoc,
1978                                     SourceLocation EndLoc) {
1979     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1980                                              EndLoc);
1981   }
1982 
1983   /// Build a new OpenMP 'depend' pseudo clause.
1984   ///
1985   /// By default, performs semantic analysis to build the new OpenMP clause.
1986   /// Subclasses may override this routine to provide different behavior.
1987   OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data,
1988                                     Expr *DepModifier, ArrayRef<Expr *> VarList,
1989                                     SourceLocation StartLoc,
1990                                     SourceLocation LParenLoc,
1991                                     SourceLocation EndLoc) {
1992     return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList,
1993                                              StartLoc, LParenLoc, EndLoc);
1994   }
1995 
1996   /// Build a new OpenMP 'device' clause.
1997   ///
1998   /// By default, performs semantic analysis to build the new statement.
1999   /// Subclasses may override this routine to provide different behavior.
2000   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
2001                                     Expr *Device, SourceLocation StartLoc,
2002                                     SourceLocation LParenLoc,
2003                                     SourceLocation ModifierLoc,
2004                                     SourceLocation EndLoc) {
2005     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
2006                                              LParenLoc, ModifierLoc, EndLoc);
2007   }
2008 
2009   /// Build a new OpenMP 'map' clause.
2010   ///
2011   /// By default, performs semantic analysis to build the new OpenMP clause.
2012   /// Subclasses may override this routine to provide different behavior.
2013   OMPClause *RebuildOMPMapClause(
2014       Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
2015       ArrayRef<SourceLocation> MapTypeModifiersLoc,
2016       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
2017       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
2018       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
2019       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
2020     return getSema().ActOnOpenMPMapClause(
2021         IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
2022         MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
2023         ColonLoc, VarList, Locs,
2024         /*NoDiagnose=*/false, UnresolvedMappers);
2025   }
2026 
2027   /// Build a new OpenMP 'allocate' clause.
2028   ///
2029   /// By default, performs semantic analysis to build the new OpenMP clause.
2030   /// Subclasses may override this routine to provide different behavior.
2031   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
2032                                       SourceLocation StartLoc,
2033                                       SourceLocation LParenLoc,
2034                                       SourceLocation ColonLoc,
2035                                       SourceLocation EndLoc) {
2036     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
2037                                                LParenLoc, ColonLoc, EndLoc);
2038   }
2039 
2040   /// Build a new OpenMP 'num_teams' clause.
2041   ///
2042   /// By default, performs semantic analysis to build the new statement.
2043   /// Subclasses may override this routine to provide different behavior.
2044   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
2045                                       SourceLocation LParenLoc,
2046                                       SourceLocation EndLoc) {
2047     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
2048                                                EndLoc);
2049   }
2050 
2051   /// Build a new OpenMP 'thread_limit' clause.
2052   ///
2053   /// By default, performs semantic analysis to build the new statement.
2054   /// Subclasses may override this routine to provide different behavior.
2055   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
2056                                          SourceLocation StartLoc,
2057                                          SourceLocation LParenLoc,
2058                                          SourceLocation EndLoc) {
2059     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
2060                                                   LParenLoc, EndLoc);
2061   }
2062 
2063   /// Build a new OpenMP 'priority' clause.
2064   ///
2065   /// By default, performs semantic analysis to build the new statement.
2066   /// Subclasses may override this routine to provide different behavior.
2067   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
2068                                       SourceLocation LParenLoc,
2069                                       SourceLocation EndLoc) {
2070     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
2071                                                EndLoc);
2072   }
2073 
2074   /// Build a new OpenMP 'grainsize' clause.
2075   ///
2076   /// By default, performs semantic analysis to build the new statement.
2077   /// Subclasses may override this routine to provide different behavior.
2078   OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
2079                                        Expr *Device, SourceLocation StartLoc,
2080                                        SourceLocation LParenLoc,
2081                                        SourceLocation ModifierLoc,
2082                                        SourceLocation EndLoc) {
2083     return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc,
2084                                                 LParenLoc, ModifierLoc, EndLoc);
2085   }
2086 
2087   /// Build a new OpenMP 'num_tasks' clause.
2088   ///
2089   /// By default, performs semantic analysis to build the new statement.
2090   /// Subclasses may override this routine to provide different behavior.
2091   OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
2092                                       Expr *NumTasks, SourceLocation StartLoc,
2093                                       SourceLocation LParenLoc,
2094                                       SourceLocation ModifierLoc,
2095                                       SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc,
2097                                                LParenLoc, ModifierLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'hint' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new statement.
2103   /// Subclasses may override this routine to provide different behavior.
2104   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2105                                   SourceLocation LParenLoc,
2106                                   SourceLocation EndLoc) {
2107     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2108   }
2109 
2110   /// Build a new OpenMP 'detach' clause.
2111   ///
2112   /// By default, performs semantic analysis to build the new statement.
2113   /// Subclasses may override this routine to provide different behavior.
2114   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2115                                     SourceLocation LParenLoc,
2116                                     SourceLocation EndLoc) {
2117     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2118   }
2119 
2120   /// Build a new OpenMP 'dist_schedule' clause.
2121   ///
2122   /// By default, performs semantic analysis to build the new OpenMP clause.
2123   /// Subclasses may override this routine to provide different behavior.
2124   OMPClause *
2125   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2126                                Expr *ChunkSize, SourceLocation StartLoc,
2127                                SourceLocation LParenLoc, SourceLocation KindLoc,
2128                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2129     return getSema().ActOnOpenMPDistScheduleClause(
2130         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2131   }
2132 
2133   /// Build a new OpenMP 'to' clause.
2134   ///
2135   /// By default, performs semantic analysis to build the new statement.
2136   /// Subclasses may override this routine to provide different behavior.
2137   OMPClause *
2138   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2139                      ArrayRef<SourceLocation> MotionModifiersLoc,
2140                      CXXScopeSpec &MapperIdScopeSpec,
2141                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2142                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2143                      ArrayRef<Expr *> UnresolvedMappers) {
2144     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2145                                          MapperIdScopeSpec, MapperId, ColonLoc,
2146                                          VarList, Locs, UnresolvedMappers);
2147   }
2148 
2149   /// Build a new OpenMP 'from' clause.
2150   ///
2151   /// By default, performs semantic analysis to build the new statement.
2152   /// Subclasses may override this routine to provide different behavior.
2153   OMPClause *
2154   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2155                        ArrayRef<SourceLocation> MotionModifiersLoc,
2156                        CXXScopeSpec &MapperIdScopeSpec,
2157                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2158                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2159                        ArrayRef<Expr *> UnresolvedMappers) {
2160     return getSema().ActOnOpenMPFromClause(
2161         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2162         ColonLoc, VarList, Locs, UnresolvedMappers);
2163   }
2164 
2165   /// Build a new OpenMP 'use_device_ptr' clause.
2166   ///
2167   /// By default, performs semantic analysis to build the new OpenMP clause.
2168   /// Subclasses may override this routine to provide different behavior.
2169   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2170                                           const OMPVarListLocTy &Locs) {
2171     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2172   }
2173 
2174   /// Build a new OpenMP 'use_device_addr' clause.
2175   ///
2176   /// By default, performs semantic analysis to build the new OpenMP clause.
2177   /// Subclasses may override this routine to provide different behavior.
2178   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2179                                            const OMPVarListLocTy &Locs) {
2180     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2181   }
2182 
2183   /// Build a new OpenMP 'is_device_ptr' clause.
2184   ///
2185   /// By default, performs semantic analysis to build the new OpenMP clause.
2186   /// Subclasses may override this routine to provide different behavior.
2187   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2188                                          const OMPVarListLocTy &Locs) {
2189     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2190   }
2191 
2192   /// Build a new OpenMP 'has_device_addr' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
2196   OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2197                                            const OMPVarListLocTy &Locs) {
2198     return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2199   }
2200 
2201   /// Build a new OpenMP 'defaultmap' clause.
2202   ///
2203   /// By default, performs semantic analysis to build the new OpenMP clause.
2204   /// Subclasses may override this routine to provide different behavior.
2205   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2206                                         OpenMPDefaultmapClauseKind Kind,
2207                                         SourceLocation StartLoc,
2208                                         SourceLocation LParenLoc,
2209                                         SourceLocation MLoc,
2210                                         SourceLocation KindLoc,
2211                                         SourceLocation EndLoc) {
2212     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2213                                                  MLoc, KindLoc, EndLoc);
2214   }
2215 
2216   /// Build a new OpenMP 'nontemporal' clause.
2217   ///
2218   /// By default, performs semantic analysis to build the new OpenMP clause.
2219   /// Subclasses may override this routine to provide different behavior.
2220   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2221                                          SourceLocation StartLoc,
2222                                          SourceLocation LParenLoc,
2223                                          SourceLocation EndLoc) {
2224     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2225                                                   EndLoc);
2226   }
2227 
2228   /// Build a new OpenMP 'inclusive' clause.
2229   ///
2230   /// By default, performs semantic analysis to build the new OpenMP clause.
2231   /// Subclasses may override this routine to provide different behavior.
2232   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2233                                        SourceLocation StartLoc,
2234                                        SourceLocation LParenLoc,
2235                                        SourceLocation EndLoc) {
2236     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2237                                                 EndLoc);
2238   }
2239 
2240   /// Build a new OpenMP 'exclusive' clause.
2241   ///
2242   /// By default, performs semantic analysis to build the new OpenMP clause.
2243   /// Subclasses may override this routine to provide different behavior.
2244   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2245                                        SourceLocation StartLoc,
2246                                        SourceLocation LParenLoc,
2247                                        SourceLocation EndLoc) {
2248     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2249                                                 EndLoc);
2250   }
2251 
2252   /// Build a new OpenMP 'uses_allocators' clause.
2253   ///
2254   /// By default, performs semantic analysis to build the new OpenMP clause.
2255   /// Subclasses may override this routine to provide different behavior.
2256   OMPClause *RebuildOMPUsesAllocatorsClause(
2257       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2258       SourceLocation LParenLoc, SourceLocation EndLoc) {
2259     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2260                                                     Data);
2261   }
2262 
2263   /// Build a new OpenMP 'affinity' clause.
2264   ///
2265   /// By default, performs semantic analysis to build the new OpenMP clause.
2266   /// Subclasses may override this routine to provide different behavior.
2267   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2268                                       SourceLocation LParenLoc,
2269                                       SourceLocation ColonLoc,
2270                                       SourceLocation EndLoc, Expr *Modifier,
2271                                       ArrayRef<Expr *> Locators) {
2272     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2273                                                EndLoc, Modifier, Locators);
2274   }
2275 
2276   /// Build a new OpenMP 'order' clause.
2277   ///
2278   /// By default, performs semantic analysis to build the new OpenMP clause.
2279   /// Subclasses may override this routine to provide different behavior.
2280   OMPClause *RebuildOMPOrderClause(
2281       OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc,
2282       SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc,
2283       OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) {
2284     return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc,
2285                                             ModifierKwLoc, KindKwLoc, EndLoc);
2286   }
2287 
2288   /// Build a new OpenMP 'init' clause.
2289   ///
2290   /// By default, performs semantic analysis to build the new OpenMP clause.
2291   /// Subclasses may override this routine to provide different behavior.
2292   OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
2293                                   SourceLocation StartLoc,
2294                                   SourceLocation LParenLoc,
2295                                   SourceLocation VarLoc,
2296                                   SourceLocation EndLoc) {
2297     return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc,
2298                                            LParenLoc, VarLoc, EndLoc);
2299   }
2300 
2301   /// Build a new OpenMP 'use' clause.
2302   ///
2303   /// By default, performs semantic analysis to build the new OpenMP clause.
2304   /// Subclasses may override this routine to provide different behavior.
2305   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2306                                  SourceLocation LParenLoc,
2307                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2308     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2309                                           VarLoc, EndLoc);
2310   }
2311 
2312   /// Build a new OpenMP 'destroy' clause.
2313   ///
2314   /// By default, performs semantic analysis to build the new OpenMP clause.
2315   /// Subclasses may override this routine to provide different behavior.
2316   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2317                                      SourceLocation LParenLoc,
2318                                      SourceLocation VarLoc,
2319                                      SourceLocation EndLoc) {
2320     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2321                                               VarLoc, EndLoc);
2322   }
2323 
2324   /// Build a new OpenMP 'novariants' clause.
2325   ///
2326   /// By default, performs semantic analysis to build the new OpenMP clause.
2327   /// Subclasses may override this routine to provide different behavior.
2328   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2329                                         SourceLocation StartLoc,
2330                                         SourceLocation LParenLoc,
2331                                         SourceLocation EndLoc) {
2332     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2333                                                  EndLoc);
2334   }
2335 
2336   /// Build a new OpenMP 'nocontext' clause.
2337   ///
2338   /// By default, performs semantic analysis to build the new OpenMP clause.
2339   /// Subclasses may override this routine to provide different behavior.
2340   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2341                                        SourceLocation LParenLoc,
2342                                        SourceLocation EndLoc) {
2343     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2344                                                 EndLoc);
2345   }
2346 
2347   /// Build a new OpenMP 'filter' clause.
2348   ///
2349   /// By default, performs semantic analysis to build the new OpenMP clause.
2350   /// Subclasses may override this routine to provide different behavior.
2351   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2352                                     SourceLocation LParenLoc,
2353                                     SourceLocation EndLoc) {
2354     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2355                                              EndLoc);
2356   }
2357 
2358   /// Build a new OpenMP 'bind' clause.
2359   ///
2360   /// By default, performs semantic analysis to build the new OpenMP clause.
2361   /// Subclasses may override this routine to provide different behavior.
2362   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2363                                   SourceLocation KindLoc,
2364                                   SourceLocation StartLoc,
2365                                   SourceLocation LParenLoc,
2366                                   SourceLocation EndLoc) {
2367     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2368                                            EndLoc);
2369   }
2370 
2371   /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause.
2372   ///
2373   /// By default, performs semantic analysis to build the new OpenMP clause.
2374   /// Subclasses may override this routine to provide different behavior.
2375   OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
2376                                            SourceLocation LParenLoc,
2377                                            SourceLocation EndLoc) {
2378     return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc,
2379                                                     EndLoc);
2380   }
2381 
2382   /// Build a new OpenMP 'ompx_attribute' clause.
2383   ///
2384   /// By default, performs semantic analysis to build the new OpenMP clause.
2385   /// Subclasses may override this routine to provide different behavior.
2386   OMPClause *RebuildOMPXAttributeClause(ArrayRef<const Attr *> Attrs,
2387                                         SourceLocation StartLoc,
2388                                         SourceLocation LParenLoc,
2389                                         SourceLocation EndLoc) {
2390     return getSema().ActOnOpenMPXAttributeClause(Attrs, StartLoc, LParenLoc,
2391                                                  EndLoc);
2392   }
2393 
2394   /// Build a new OpenMP 'ompx_bare' clause.
2395   ///
2396   /// By default, performs semantic analysis to build the new OpenMP clause.
2397   /// Subclasses may override this routine to provide different behavior.
2398   OMPClause *RebuildOMPXBareClause(SourceLocation StartLoc,
2399                                    SourceLocation EndLoc) {
2400     return getSema().ActOnOpenMPXBareClause(StartLoc, EndLoc);
2401   }
2402 
2403   /// Build a new OpenMP 'align' 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 *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2408                                    SourceLocation LParenLoc,
2409                                    SourceLocation EndLoc) {
2410     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2411   }
2412 
2413   /// Build a new OpenMP 'at' clause.
2414   ///
2415   /// By default, performs semantic analysis to build the new OpenMP clause.
2416   /// Subclasses may override this routine to provide different behavior.
2417   OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc,
2418                                 SourceLocation StartLoc,
2419                                 SourceLocation LParenLoc,
2420                                 SourceLocation EndLoc) {
2421     return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc,
2422                                          EndLoc);
2423   }
2424 
2425   /// Build a new OpenMP 'severity' clause.
2426   ///
2427   /// By default, performs semantic analysis to build the new OpenMP clause.
2428   /// Subclasses may override this routine to provide different behavior.
2429   OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,
2430                                       SourceLocation KwLoc,
2431                                       SourceLocation StartLoc,
2432                                       SourceLocation LParenLoc,
2433                                       SourceLocation EndLoc) {
2434     return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc,
2435                                                EndLoc);
2436   }
2437 
2438   /// Build a new OpenMP 'message' 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 *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc,
2443                                      SourceLocation LParenLoc,
2444                                      SourceLocation EndLoc) {
2445     return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc);
2446   }
2447 
2448   /// Build a new OpenMP 'doacross' clause.
2449   ///
2450   /// By default, performs semantic analysis to build the new OpenMP clause.
2451   /// Subclasses may override this routine to provide different behavior.
2452   OMPClause *
2453   RebuildOMPDoacrossClause(OpenMPDoacrossClauseModifier DepType,
2454                            SourceLocation DepLoc, SourceLocation ColonLoc,
2455                            ArrayRef<Expr *> VarList, SourceLocation StartLoc,
2456                            SourceLocation LParenLoc, SourceLocation EndLoc) {
2457     return getSema().ActOnOpenMPDoacrossClause(
2458         DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
2459   }
2460 
2461   /// Rebuild the operand to an Objective-C \@synchronized statement.
2462   ///
2463   /// By default, performs semantic analysis to build the new statement.
2464   /// Subclasses may override this routine to provide different behavior.
2465   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2466                                               Expr *object) {
2467     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2468   }
2469 
2470   /// Build a new Objective-C \@synchronized statement.
2471   ///
2472   /// By default, performs semantic analysis to build the new statement.
2473   /// Subclasses may override this routine to provide different behavior.
2474   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2475                                            Expr *Object, Stmt *Body) {
2476     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2477   }
2478 
2479   /// Build a new Objective-C \@autoreleasepool statement.
2480   ///
2481   /// By default, performs semantic analysis to build the new statement.
2482   /// Subclasses may override this routine to provide different behavior.
2483   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2484                                             Stmt *Body) {
2485     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2486   }
2487 
2488   /// Build a new Objective-C fast enumeration statement.
2489   ///
2490   /// By default, performs semantic analysis to build the new statement.
2491   /// Subclasses may override this routine to provide different behavior.
2492   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2493                                           Stmt *Element,
2494                                           Expr *Collection,
2495                                           SourceLocation RParenLoc,
2496                                           Stmt *Body) {
2497     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2498                                                 Element,
2499                                                 Collection,
2500                                                 RParenLoc);
2501     if (ForEachStmt.isInvalid())
2502       return StmtError();
2503 
2504     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2505   }
2506 
2507   /// Build a new C++ exception declaration.
2508   ///
2509   /// By default, performs semantic analysis to build the new decaration.
2510   /// Subclasses may override this routine to provide different behavior.
2511   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2512                                 TypeSourceInfo *Declarator,
2513                                 SourceLocation StartLoc,
2514                                 SourceLocation IdLoc,
2515                                 IdentifierInfo *Id) {
2516     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2517                                                        StartLoc, IdLoc, Id);
2518     if (Var)
2519       getSema().CurContext->addDecl(Var);
2520     return Var;
2521   }
2522 
2523   /// Build a new C++ catch statement.
2524   ///
2525   /// By default, performs semantic analysis to build the new statement.
2526   /// Subclasses may override this routine to provide different behavior.
2527   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2528                                  VarDecl *ExceptionDecl,
2529                                  Stmt *Handler) {
2530     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2531                                                       Handler));
2532   }
2533 
2534   /// Build a new C++ try statement.
2535   ///
2536   /// By default, performs semantic analysis to build the new statement.
2537   /// Subclasses may override this routine to provide different behavior.
2538   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2539                                ArrayRef<Stmt *> Handlers) {
2540     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2541   }
2542 
2543   /// Build a new C++0x range-based for statement.
2544   ///
2545   /// By default, performs semantic analysis to build the new statement.
2546   /// Subclasses may override this routine to provide different behavior.
2547   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2548                                     SourceLocation CoawaitLoc, Stmt *Init,
2549                                     SourceLocation ColonLoc, Stmt *Range,
2550                                     Stmt *Begin, Stmt *End, Expr *Cond,
2551                                     Expr *Inc, Stmt *LoopVar,
2552                                     SourceLocation RParenLoc) {
2553     // If we've just learned that the range is actually an Objective-C
2554     // collection, treat this as an Objective-C fast enumeration loop.
2555     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2556       if (RangeStmt->isSingleDecl()) {
2557         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2558           if (RangeVar->isInvalidDecl())
2559             return StmtError();
2560 
2561           Expr *RangeExpr = RangeVar->getInit();
2562           if (!RangeExpr->isTypeDependent() &&
2563               RangeExpr->getType()->isObjCObjectPointerType()) {
2564             // FIXME: Support init-statements in Objective-C++20 ranged for
2565             // statement.
2566             if (Init) {
2567               return SemaRef.Diag(Init->getBeginLoc(),
2568                                   diag::err_objc_for_range_init_stmt)
2569                          << Init->getSourceRange();
2570             }
2571             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2572                                                         RangeExpr, RParenLoc);
2573           }
2574         }
2575       }
2576     }
2577 
2578     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2579                                           Range, Begin, End, Cond, Inc, LoopVar,
2580                                           RParenLoc, Sema::BFRK_Rebuild);
2581   }
2582 
2583   /// Build a new C++0x range-based for statement.
2584   ///
2585   /// By default, performs semantic analysis to build the new statement.
2586   /// Subclasses may override this routine to provide different behavior.
2587   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2588                                           bool IsIfExists,
2589                                           NestedNameSpecifierLoc QualifierLoc,
2590                                           DeclarationNameInfo NameInfo,
2591                                           Stmt *Nested) {
2592     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2593                                                 QualifierLoc, NameInfo, Nested);
2594   }
2595 
2596   /// Attach body to a C++0x range-based for statement.
2597   ///
2598   /// By default, performs semantic analysis to finish the new statement.
2599   /// Subclasses may override this routine to provide different behavior.
2600   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2601     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2602   }
2603 
2604   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2605                                Stmt *TryBlock, Stmt *Handler) {
2606     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2607   }
2608 
2609   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2610                                   Stmt *Block) {
2611     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2612   }
2613 
2614   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2615     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2616   }
2617 
2618   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2619                                              SourceLocation LParen,
2620                                              SourceLocation RParen,
2621                                              TypeSourceInfo *TSI) {
2622     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2623   }
2624 
2625   /// Build a new predefined expression.
2626   ///
2627   /// By default, performs semantic analysis to build the new expression.
2628   /// Subclasses may override this routine to provide different behavior.
2629   ExprResult RebuildPredefinedExpr(SourceLocation Loc, PredefinedIdentKind IK) {
2630     return getSema().BuildPredefinedExpr(Loc, IK);
2631   }
2632 
2633   /// Build a new expression that references a declaration.
2634   ///
2635   /// By default, performs semantic analysis to build the new expression.
2636   /// Subclasses may override this routine to provide different behavior.
2637   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2638                                         LookupResult &R,
2639                                         bool RequiresADL) {
2640     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2641   }
2642 
2643 
2644   /// Build a new expression that references a declaration.
2645   ///
2646   /// By default, performs semantic analysis to build the new expression.
2647   /// Subclasses may override this routine to provide different behavior.
2648   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2649                                 ValueDecl *VD,
2650                                 const DeclarationNameInfo &NameInfo,
2651                                 NamedDecl *Found,
2652                                 TemplateArgumentListInfo *TemplateArgs) {
2653     CXXScopeSpec SS;
2654     SS.Adopt(QualifierLoc);
2655     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2656                                               TemplateArgs);
2657   }
2658 
2659   /// Build a new expression in parentheses.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// Subclasses may override this routine to provide different behavior.
2663   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2664                                     SourceLocation RParen) {
2665     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2666   }
2667 
2668   /// Build a new pseudo-destructor expression.
2669   ///
2670   /// By default, performs semantic analysis to build the new expression.
2671   /// Subclasses may override this routine to provide different behavior.
2672   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2673                                             SourceLocation OperatorLoc,
2674                                             bool isArrow,
2675                                             CXXScopeSpec &SS,
2676                                             TypeSourceInfo *ScopeType,
2677                                             SourceLocation CCLoc,
2678                                             SourceLocation TildeLoc,
2679                                         PseudoDestructorTypeStorage Destroyed);
2680 
2681   /// Build a new unary operator expression.
2682   ///
2683   /// By default, performs semantic analysis to build the new expression.
2684   /// Subclasses may override this routine to provide different behavior.
2685   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2686                                         UnaryOperatorKind Opc,
2687                                         Expr *SubExpr) {
2688     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2689   }
2690 
2691   /// Build a new builtin offsetof expression.
2692   ///
2693   /// By default, performs semantic analysis to build the new expression.
2694   /// Subclasses may override this routine to provide different behavior.
2695   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2696                                  TypeSourceInfo *Type,
2697                                  ArrayRef<Sema::OffsetOfComponent> Components,
2698                                  SourceLocation RParenLoc) {
2699     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2700                                           RParenLoc);
2701   }
2702 
2703   /// Build a new sizeof, alignof or vec_step expression with a
2704   /// type argument.
2705   ///
2706   /// By default, performs semantic analysis to build the new expression.
2707   /// Subclasses may override this routine to provide different behavior.
2708   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2709                                          SourceLocation OpLoc,
2710                                          UnaryExprOrTypeTrait ExprKind,
2711                                          SourceRange R) {
2712     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2713   }
2714 
2715   /// Build a new sizeof, alignof or vec step expression with an
2716   /// expression argument.
2717   ///
2718   /// By default, performs semantic analysis to build the new expression.
2719   /// Subclasses may override this routine to provide different behavior.
2720   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2721                                          UnaryExprOrTypeTrait ExprKind,
2722                                          SourceRange R) {
2723     ExprResult Result
2724       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2725     if (Result.isInvalid())
2726       return ExprError();
2727 
2728     return Result;
2729   }
2730 
2731   /// Build a new array subscript expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2736                                              SourceLocation LBracketLoc,
2737                                              Expr *RHS,
2738                                              SourceLocation RBracketLoc) {
2739     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2740                                              LBracketLoc, RHS,
2741                                              RBracketLoc);
2742   }
2743 
2744   /// Build a new matrix subscript expression.
2745   ///
2746   /// By default, performs semantic analysis to build the new expression.
2747   /// Subclasses may override this routine to provide different behavior.
2748   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2749                                         Expr *ColumnIdx,
2750                                         SourceLocation RBracketLoc) {
2751     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2752                                                       RBracketLoc);
2753   }
2754 
2755   /// Build a new array section expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
2759   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2760                                         Expr *LowerBound,
2761                                         SourceLocation ColonLocFirst,
2762                                         SourceLocation ColonLocSecond,
2763                                         Expr *Length, Expr *Stride,
2764                                         SourceLocation RBracketLoc) {
2765     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2766                                               ColonLocFirst, ColonLocSecond,
2767                                               Length, Stride, RBracketLoc);
2768   }
2769 
2770   /// Build a new array shaping expression.
2771   ///
2772   /// By default, performs semantic analysis to build the new expression.
2773   /// Subclasses may override this routine to provide different behavior.
2774   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2775                                         SourceLocation RParenLoc,
2776                                         ArrayRef<Expr *> Dims,
2777                                         ArrayRef<SourceRange> BracketsRanges) {
2778     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2779                                               BracketsRanges);
2780   }
2781 
2782   /// Build a new iterator expression.
2783   ///
2784   /// By default, performs semantic analysis to build the new expression.
2785   /// Subclasses may override this routine to provide different behavior.
2786   ExprResult RebuildOMPIteratorExpr(
2787       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2788       ArrayRef<Sema::OMPIteratorData> Data) {
2789     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2790                                           LLoc, RLoc, Data);
2791   }
2792 
2793   /// Build a new call expression.
2794   ///
2795   /// By default, performs semantic analysis to build the new expression.
2796   /// Subclasses may override this routine to provide different behavior.
2797   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2798                                    MultiExprArg Args,
2799                                    SourceLocation RParenLoc,
2800                                    Expr *ExecConfig = nullptr) {
2801     return getSema().ActOnCallExpr(
2802         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2803   }
2804 
2805   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2806                                      MultiExprArg Args,
2807                                      SourceLocation RParenLoc) {
2808     return getSema().ActOnArraySubscriptExpr(
2809         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2810   }
2811 
2812   /// Build a new member access expression.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2817                                bool isArrow,
2818                                NestedNameSpecifierLoc QualifierLoc,
2819                                SourceLocation TemplateKWLoc,
2820                                const DeclarationNameInfo &MemberNameInfo,
2821                                ValueDecl *Member,
2822                                NamedDecl *FoundDecl,
2823                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2824                                NamedDecl *FirstQualifierInScope) {
2825     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2826                                                                       isArrow);
2827     if (!Member->getDeclName()) {
2828       // We have a reference to an unnamed field.  This is always the
2829       // base of an anonymous struct/union member access, i.e. the
2830       // field is always of record type.
2831       assert(Member->getType()->isRecordType() &&
2832              "unnamed member not of record type?");
2833 
2834       BaseResult =
2835         getSema().PerformObjectMemberConversion(BaseResult.get(),
2836                                                 QualifierLoc.getNestedNameSpecifier(),
2837                                                 FoundDecl, Member);
2838       if (BaseResult.isInvalid())
2839         return ExprError();
2840       Base = BaseResult.get();
2841 
2842       CXXScopeSpec EmptySS;
2843       return getSema().BuildFieldReferenceExpr(
2844           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2845           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2846     }
2847 
2848     CXXScopeSpec SS;
2849     SS.Adopt(QualifierLoc);
2850 
2851     Base = BaseResult.get();
2852     QualType BaseType = Base->getType();
2853 
2854     if (isArrow && !BaseType->isPointerType())
2855       return ExprError();
2856 
2857     // FIXME: this involves duplicating earlier analysis in a lot of
2858     // cases; we should avoid this when possible.
2859     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2860     R.addDecl(FoundDecl);
2861     R.resolveKind();
2862 
2863     if (getSema().isUnevaluatedContext() && Base->isImplicitCXXThis() &&
2864         isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(Member)) {
2865       if (auto *ThisClass = cast<CXXThisExpr>(Base)
2866                                 ->getType()
2867                                 ->getPointeeType()
2868                                 ->getAsCXXRecordDecl()) {
2869         auto *Class = cast<CXXRecordDecl>(Member->getDeclContext());
2870         // In unevaluated contexts, an expression supposed to be a member access
2871         // might reference a member in an unrelated class.
2872         if (!ThisClass->Equals(Class) && !ThisClass->isDerivedFrom(Class))
2873           return getSema().BuildDeclRefExpr(Member, Member->getType(),
2874                                             VK_LValue, Member->getLocation());
2875       }
2876     }
2877 
2878     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2879                                               SS, TemplateKWLoc,
2880                                               FirstQualifierInScope,
2881                                               R, ExplicitTemplateArgs,
2882                                               /*S*/nullptr);
2883   }
2884 
2885   /// Build a new binary operator expression.
2886   ///
2887   /// By default, performs semantic analysis to build the new expression.
2888   /// Subclasses may override this routine to provide different behavior.
2889   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2890                                          BinaryOperatorKind Opc,
2891                                          Expr *LHS, Expr *RHS) {
2892     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2893   }
2894 
2895   /// Build a new rewritten operator expression.
2896   ///
2897   /// By default, performs semantic analysis to build the new expression.
2898   /// Subclasses may override this routine to provide different behavior.
2899   ExprResult RebuildCXXRewrittenBinaryOperator(
2900       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2901       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2902     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2903                                            RHS, /*RequiresADL*/false);
2904   }
2905 
2906   /// Build a new conditional operator expression.
2907   ///
2908   /// By default, performs semantic analysis to build the new expression.
2909   /// Subclasses may override this routine to provide different behavior.
2910   ExprResult RebuildConditionalOperator(Expr *Cond,
2911                                         SourceLocation QuestionLoc,
2912                                         Expr *LHS,
2913                                         SourceLocation ColonLoc,
2914                                         Expr *RHS) {
2915     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2916                                         LHS, RHS);
2917   }
2918 
2919   /// Build a new C-style cast expression.
2920   ///
2921   /// By default, performs semantic analysis to build the new expression.
2922   /// Subclasses may override this routine to provide different behavior.
2923   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2924                                          TypeSourceInfo *TInfo,
2925                                          SourceLocation RParenLoc,
2926                                          Expr *SubExpr) {
2927     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2928                                          SubExpr);
2929   }
2930 
2931   /// Build a new compound literal expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2936                                               TypeSourceInfo *TInfo,
2937                                               SourceLocation RParenLoc,
2938                                               Expr *Init) {
2939     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2940                                               Init);
2941   }
2942 
2943   /// Build a new extended vector element access expression.
2944   ///
2945   /// By default, performs semantic analysis to build the new expression.
2946   /// Subclasses may override this routine to provide different behavior.
2947   ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
2948                                          bool IsArrow,
2949                                          SourceLocation AccessorLoc,
2950                                          IdentifierInfo &Accessor) {
2951 
2952     CXXScopeSpec SS;
2953     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2954     return getSema().BuildMemberReferenceExpr(
2955         Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
2956         /*FirstQualifierInScope*/ nullptr, NameInfo,
2957         /* TemplateArgs */ nullptr,
2958         /*S*/ nullptr);
2959   }
2960 
2961   /// Build a new initializer list expression.
2962   ///
2963   /// By default, performs semantic analysis to build the new expression.
2964   /// Subclasses may override this routine to provide different behavior.
2965   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2966                              MultiExprArg Inits,
2967                              SourceLocation RBraceLoc) {
2968     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2969   }
2970 
2971   /// Build a new designated initializer expression.
2972   ///
2973   /// By default, performs semantic analysis to build the new expression.
2974   /// Subclasses may override this routine to provide different behavior.
2975   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2976                                              MultiExprArg ArrayExprs,
2977                                              SourceLocation EqualOrColonLoc,
2978                                              bool GNUSyntax,
2979                                              Expr *Init) {
2980     ExprResult Result
2981       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2982                                            Init);
2983     if (Result.isInvalid())
2984       return ExprError();
2985 
2986     return Result;
2987   }
2988 
2989   /// Build a new value-initialized expression.
2990   ///
2991   /// By default, builds the implicit value initialization without performing
2992   /// any semantic analysis. Subclasses may override this routine to provide
2993   /// different behavior.
2994   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2995     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2996   }
2997 
2998   /// Build a new \c va_arg expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
3002   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
3003                                     Expr *SubExpr, TypeSourceInfo *TInfo,
3004                                     SourceLocation RParenLoc) {
3005     return getSema().BuildVAArgExpr(BuiltinLoc,
3006                                     SubExpr, TInfo,
3007                                     RParenLoc);
3008   }
3009 
3010   /// Build a new expression list in parentheses.
3011   ///
3012   /// By default, performs semantic analysis to build the new expression.
3013   /// Subclasses may override this routine to provide different behavior.
3014   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
3015                                   MultiExprArg SubExprs,
3016                                   SourceLocation RParenLoc) {
3017     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
3018   }
3019 
3020   /// Build a new address-of-label expression.
3021   ///
3022   /// By default, performs semantic analysis, using the name of the label
3023   /// rather than attempting to map the label statement itself.
3024   /// Subclasses may override this routine to provide different behavior.
3025   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
3026                                   SourceLocation LabelLoc, LabelDecl *Label) {
3027     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
3028   }
3029 
3030   /// Build a new GNU statement expression.
3031   ///
3032   /// By default, performs semantic analysis to build the new expression.
3033   /// Subclasses may override this routine to provide different behavior.
3034   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
3035                              SourceLocation RParenLoc, unsigned TemplateDepth) {
3036     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
3037                                    TemplateDepth);
3038   }
3039 
3040   /// Build a new __builtin_choose_expr expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
3044   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
3045                                      Expr *Cond, Expr *LHS, Expr *RHS,
3046                                      SourceLocation RParenLoc) {
3047     return SemaRef.ActOnChooseExpr(BuiltinLoc,
3048                                    Cond, LHS, RHS,
3049                                    RParenLoc);
3050   }
3051 
3052   /// Build a new generic selection expression with an expression predicate.
3053   ///
3054   /// By default, performs semantic analysis to build the new expression.
3055   /// Subclasses may override this routine to provide different behavior.
3056   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3057                                          SourceLocation DefaultLoc,
3058                                          SourceLocation RParenLoc,
3059                                          Expr *ControllingExpr,
3060                                          ArrayRef<TypeSourceInfo *> Types,
3061                                          ArrayRef<Expr *> Exprs) {
3062     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3063                                                 /*PredicateIsExpr=*/true,
3064                                                 ControllingExpr, Types, Exprs);
3065   }
3066 
3067   /// Build a new generic selection expression with a type predicate.
3068   ///
3069   /// By default, performs semantic analysis to build the new expression.
3070   /// Subclasses may override this routine to provide different behavior.
3071   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3072                                          SourceLocation DefaultLoc,
3073                                          SourceLocation RParenLoc,
3074                                          TypeSourceInfo *ControllingType,
3075                                          ArrayRef<TypeSourceInfo *> Types,
3076                                          ArrayRef<Expr *> Exprs) {
3077     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3078                                                 /*PredicateIsExpr=*/false,
3079                                                 ControllingType, Types, Exprs);
3080   }
3081 
3082   /// Build a new overloaded operator call expression.
3083   ///
3084   /// By default, performs semantic analysis to build the new expression.
3085   /// The semantic analysis provides the behavior of template instantiation,
3086   /// copying with transformations that turn what looks like an overloaded
3087   /// operator call into a use of a builtin operator, performing
3088   /// argument-dependent lookup, etc. Subclasses may override this routine to
3089   /// provide different behavior.
3090   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3091                                         SourceLocation OpLoc,
3092                                         SourceLocation CalleeLoc,
3093                                         bool RequiresADL,
3094                                         const UnresolvedSetImpl &Functions,
3095                                         Expr *First, Expr *Second);
3096 
3097   /// Build a new C++ "named" cast expression, such as static_cast or
3098   /// reinterpret_cast.
3099   ///
3100   /// By default, this routine dispatches to one of the more-specific routines
3101   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
3102   /// Subclasses may override this routine to provide different behavior.
3103   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
3104                                            Stmt::StmtClass Class,
3105                                            SourceLocation LAngleLoc,
3106                                            TypeSourceInfo *TInfo,
3107                                            SourceLocation RAngleLoc,
3108                                            SourceLocation LParenLoc,
3109                                            Expr *SubExpr,
3110                                            SourceLocation RParenLoc) {
3111     switch (Class) {
3112     case Stmt::CXXStaticCastExprClass:
3113       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3114                                                    RAngleLoc, LParenLoc,
3115                                                    SubExpr, RParenLoc);
3116 
3117     case Stmt::CXXDynamicCastExprClass:
3118       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3119                                                     RAngleLoc, LParenLoc,
3120                                                     SubExpr, RParenLoc);
3121 
3122     case Stmt::CXXReinterpretCastExprClass:
3123       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3124                                                         RAngleLoc, LParenLoc,
3125                                                         SubExpr,
3126                                                         RParenLoc);
3127 
3128     case Stmt::CXXConstCastExprClass:
3129       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3130                                                    RAngleLoc, LParenLoc,
3131                                                    SubExpr, RParenLoc);
3132 
3133     case Stmt::CXXAddrspaceCastExprClass:
3134       return getDerived().RebuildCXXAddrspaceCastExpr(
3135           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3136 
3137     default:
3138       llvm_unreachable("Invalid C++ named cast");
3139     }
3140   }
3141 
3142   /// Build a new C++ static_cast expression.
3143   ///
3144   /// By default, performs semantic analysis to build the new expression.
3145   /// Subclasses may override this routine to provide different behavior.
3146   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
3147                                             SourceLocation LAngleLoc,
3148                                             TypeSourceInfo *TInfo,
3149                                             SourceLocation RAngleLoc,
3150                                             SourceLocation LParenLoc,
3151                                             Expr *SubExpr,
3152                                             SourceLocation RParenLoc) {
3153     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
3154                                        TInfo, SubExpr,
3155                                        SourceRange(LAngleLoc, RAngleLoc),
3156                                        SourceRange(LParenLoc, RParenLoc));
3157   }
3158 
3159   /// Build a new C++ dynamic_cast expression.
3160   ///
3161   /// By default, performs semantic analysis to build the new expression.
3162   /// Subclasses may override this routine to provide different behavior.
3163   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
3164                                              SourceLocation LAngleLoc,
3165                                              TypeSourceInfo *TInfo,
3166                                              SourceLocation RAngleLoc,
3167                                              SourceLocation LParenLoc,
3168                                              Expr *SubExpr,
3169                                              SourceLocation RParenLoc) {
3170     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
3171                                        TInfo, SubExpr,
3172                                        SourceRange(LAngleLoc, RAngleLoc),
3173                                        SourceRange(LParenLoc, RParenLoc));
3174   }
3175 
3176   /// Build a new C++ reinterpret_cast expression.
3177   ///
3178   /// By default, performs semantic analysis to build the new expression.
3179   /// Subclasses may override this routine to provide different behavior.
3180   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
3181                                                  SourceLocation LAngleLoc,
3182                                                  TypeSourceInfo *TInfo,
3183                                                  SourceLocation RAngleLoc,
3184                                                  SourceLocation LParenLoc,
3185                                                  Expr *SubExpr,
3186                                                  SourceLocation RParenLoc) {
3187     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
3188                                        TInfo, SubExpr,
3189                                        SourceRange(LAngleLoc, RAngleLoc),
3190                                        SourceRange(LParenLoc, RParenLoc));
3191   }
3192 
3193   /// Build a new C++ const_cast expression.
3194   ///
3195   /// By default, performs semantic analysis to build the new expression.
3196   /// Subclasses may override this routine to provide different behavior.
3197   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3198                                            SourceLocation LAngleLoc,
3199                                            TypeSourceInfo *TInfo,
3200                                            SourceLocation RAngleLoc,
3201                                            SourceLocation LParenLoc,
3202                                            Expr *SubExpr,
3203                                            SourceLocation RParenLoc) {
3204     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3205                                        TInfo, SubExpr,
3206                                        SourceRange(LAngleLoc, RAngleLoc),
3207                                        SourceRange(LParenLoc, RParenLoc));
3208   }
3209 
3210   ExprResult
3211   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3212                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3213                               SourceLocation LParenLoc, Expr *SubExpr,
3214                               SourceLocation RParenLoc) {
3215     return getSema().BuildCXXNamedCast(
3216         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3217         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3218   }
3219 
3220   /// Build a new C++ functional-style cast expression.
3221   ///
3222   /// By default, performs semantic analysis to build the new expression.
3223   /// Subclasses may override this routine to provide different behavior.
3224   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3225                                           SourceLocation LParenLoc,
3226                                           Expr *Sub,
3227                                           SourceLocation RParenLoc,
3228                                           bool ListInitialization) {
3229     // If Sub is a ParenListExpr, then Sub is the syntatic form of a
3230     // CXXParenListInitExpr. Pass its expanded arguments so that the
3231     // CXXParenListInitExpr can be rebuilt.
3232     if (auto *PLE = dyn_cast<ParenListExpr>(Sub))
3233       return getSema().BuildCXXTypeConstructExpr(
3234           TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3235           RParenLoc, ListInitialization);
3236     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3237                                                MultiExprArg(&Sub, 1), RParenLoc,
3238                                                ListInitialization);
3239   }
3240 
3241   /// Build a new C++ __builtin_bit_cast expression.
3242   ///
3243   /// By default, performs semantic analysis to build the new expression.
3244   /// Subclasses may override this routine to provide different behavior.
3245   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3246                                        TypeSourceInfo *TSI, Expr *Sub,
3247                                        SourceLocation RParenLoc) {
3248     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3249   }
3250 
3251   /// Build a new C++ typeid(type) expression.
3252   ///
3253   /// By default, performs semantic analysis to build the new expression.
3254   /// Subclasses may override this routine to provide different behavior.
3255   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3256                                         SourceLocation TypeidLoc,
3257                                         TypeSourceInfo *Operand,
3258                                         SourceLocation RParenLoc) {
3259     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3260                                     RParenLoc);
3261   }
3262 
3263 
3264   /// Build a new C++ typeid(expr) 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 RebuildCXXTypeidExpr(QualType TypeInfoType,
3269                                         SourceLocation TypeidLoc,
3270                                         Expr *Operand,
3271                                         SourceLocation RParenLoc) {
3272     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3273                                     RParenLoc);
3274   }
3275 
3276   /// Build a new C++ __uuidof(type) expression.
3277   ///
3278   /// By default, performs semantic analysis to build the new expression.
3279   /// Subclasses may override this routine to provide different behavior.
3280   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3281                                   TypeSourceInfo *Operand,
3282                                   SourceLocation RParenLoc) {
3283     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3284   }
3285 
3286   /// Build a new C++ __uuidof(expr) expression.
3287   ///
3288   /// By default, performs semantic analysis to build the new expression.
3289   /// Subclasses may override this routine to provide different behavior.
3290   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3291                                   Expr *Operand, SourceLocation RParenLoc) {
3292     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3293   }
3294 
3295   /// Build a new C++ "this" expression.
3296   ///
3297   /// By default, builds a new "this" expression without performing any
3298   /// semantic analysis. Subclasses may override this routine to provide
3299   /// different behavior.
3300   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3301                                 QualType ThisType,
3302                                 bool isImplicit) {
3303     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3304   }
3305 
3306   /// Build a new C++ throw expression.
3307   ///
3308   /// By default, performs semantic analysis to build the new expression.
3309   /// Subclasses may override this routine to provide different behavior.
3310   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3311                                  bool IsThrownVariableInScope) {
3312     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3313   }
3314 
3315   /// Build a new C++ default-argument expression.
3316   ///
3317   /// By default, builds a new default-argument expression, which does not
3318   /// require any semantic analysis. Subclasses may override this routine to
3319   /// provide different behavior.
3320   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3321                                       Expr *RewrittenExpr) {
3322     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3323                                      RewrittenExpr, getSema().CurContext);
3324   }
3325 
3326   /// Build a new C++11 default-initialization expression.
3327   ///
3328   /// By default, builds a new default field initialization expression, which
3329   /// does not require any semantic analysis. Subclasses may override this
3330   /// routine to provide different behavior.
3331   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3332                                        FieldDecl *Field) {
3333     return getSema().BuildCXXDefaultInitExpr(Loc, Field);
3334   }
3335 
3336   /// Build a new C++ zero-initialization expression.
3337   ///
3338   /// By default, performs semantic analysis to build the new expression.
3339   /// Subclasses may override this routine to provide different behavior.
3340   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3341                                            SourceLocation LParenLoc,
3342                                            SourceLocation RParenLoc) {
3343     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt,
3344                                                RParenLoc,
3345                                                /*ListInitialization=*/false);
3346   }
3347 
3348   /// Build a new C++ "new" expression.
3349   ///
3350   /// By default, performs semantic analysis to build the new expression.
3351   /// Subclasses may override this routine to provide different behavior.
3352   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal,
3353                                SourceLocation PlacementLParen,
3354                                MultiExprArg PlacementArgs,
3355                                SourceLocation PlacementRParen,
3356                                SourceRange TypeIdParens, QualType AllocatedType,
3357                                TypeSourceInfo *AllocatedTypeInfo,
3358                                std::optional<Expr *> ArraySize,
3359                                SourceRange DirectInitRange, Expr *Initializer) {
3360     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3361                                  PlacementLParen,
3362                                  PlacementArgs,
3363                                  PlacementRParen,
3364                                  TypeIdParens,
3365                                  AllocatedType,
3366                                  AllocatedTypeInfo,
3367                                  ArraySize,
3368                                  DirectInitRange,
3369                                  Initializer);
3370   }
3371 
3372   /// Build a new C++ "delete" expression.
3373   ///
3374   /// By default, performs semantic analysis to build the new expression.
3375   /// Subclasses may override this routine to provide different behavior.
3376   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3377                                         bool IsGlobalDelete,
3378                                         bool IsArrayForm,
3379                                         Expr *Operand) {
3380     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3381                                     Operand);
3382   }
3383 
3384   /// Build a new type trait expression.
3385   ///
3386   /// By default, performs semantic analysis to build the new expression.
3387   /// Subclasses may override this routine to provide different behavior.
3388   ExprResult RebuildTypeTrait(TypeTrait Trait,
3389                               SourceLocation StartLoc,
3390                               ArrayRef<TypeSourceInfo *> Args,
3391                               SourceLocation RParenLoc) {
3392     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3393   }
3394 
3395   /// Build a new array type trait 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 RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3400                                    SourceLocation StartLoc,
3401                                    TypeSourceInfo *TSInfo,
3402                                    Expr *DimExpr,
3403                                    SourceLocation RParenLoc) {
3404     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3405   }
3406 
3407   /// Build a new expression trait expression.
3408   ///
3409   /// By default, performs semantic analysis to build the new expression.
3410   /// Subclasses may override this routine to provide different behavior.
3411   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3412                                    SourceLocation StartLoc,
3413                                    Expr *Queried,
3414                                    SourceLocation RParenLoc) {
3415     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3416   }
3417 
3418   /// Build a new (previously unresolved) declaration reference
3419   /// expression.
3420   ///
3421   /// By default, performs semantic analysis to build the new expression.
3422   /// Subclasses may override this routine to provide different behavior.
3423   ExprResult RebuildDependentScopeDeclRefExpr(
3424                                           NestedNameSpecifierLoc QualifierLoc,
3425                                           SourceLocation TemplateKWLoc,
3426                                        const DeclarationNameInfo &NameInfo,
3427                               const TemplateArgumentListInfo *TemplateArgs,
3428                                           bool IsAddressOfOperand,
3429                                           TypeSourceInfo **RecoveryTSI) {
3430     CXXScopeSpec SS;
3431     SS.Adopt(QualifierLoc);
3432 
3433     if (TemplateArgs || TemplateKWLoc.isValid())
3434       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3435                                                     TemplateArgs);
3436 
3437     return getSema().BuildQualifiedDeclarationNameExpr(
3438         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3439   }
3440 
3441   /// Build a new template-id expression.
3442   ///
3443   /// By default, performs semantic analysis to build the new expression.
3444   /// Subclasses may override this routine to provide different behavior.
3445   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3446                                    SourceLocation TemplateKWLoc,
3447                                    LookupResult &R,
3448                                    bool RequiresADL,
3449                               const TemplateArgumentListInfo *TemplateArgs) {
3450     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3451                                          TemplateArgs);
3452   }
3453 
3454   /// Build a new object-construction expression.
3455   ///
3456   /// By default, performs semantic analysis to build the new expression.
3457   /// Subclasses may override this routine to provide different behavior.
3458   ExprResult RebuildCXXConstructExpr(
3459       QualType T, SourceLocation Loc, CXXConstructorDecl *Constructor,
3460       bool IsElidable, MultiExprArg Args, bool HadMultipleCandidates,
3461       bool ListInitialization, bool StdInitListInitialization,
3462       bool RequiresZeroInit, CXXConstructionKind ConstructKind,
3463       SourceRange ParenRange) {
3464     // Reconstruct the constructor we originally found, which might be
3465     // different if this is a call to an inherited constructor.
3466     CXXConstructorDecl *FoundCtor = Constructor;
3467     if (Constructor->isInheritingConstructor())
3468       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3469 
3470     SmallVector<Expr *, 8> ConvertedArgs;
3471     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3472                                           ConvertedArgs))
3473       return ExprError();
3474 
3475     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3476                                            IsElidable,
3477                                            ConvertedArgs,
3478                                            HadMultipleCandidates,
3479                                            ListInitialization,
3480                                            StdInitListInitialization,
3481                                            RequiresZeroInit, ConstructKind,
3482                                            ParenRange);
3483   }
3484 
3485   /// Build a new implicit construction via inherited constructor
3486   /// expression.
3487   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3488                                              CXXConstructorDecl *Constructor,
3489                                              bool ConstructsVBase,
3490                                              bool InheritedFromVBase) {
3491     return new (getSema().Context) CXXInheritedCtorInitExpr(
3492         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3493   }
3494 
3495   /// Build a new object-construction 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 RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3500                                            SourceLocation LParenOrBraceLoc,
3501                                            MultiExprArg Args,
3502                                            SourceLocation RParenOrBraceLoc,
3503                                            bool ListInitialization) {
3504     return getSema().BuildCXXTypeConstructExpr(
3505         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3506   }
3507 
3508   /// Build a new object-construction expression.
3509   ///
3510   /// By default, performs semantic analysis to build the new expression.
3511   /// Subclasses may override this routine to provide different behavior.
3512   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3513                                                SourceLocation LParenLoc,
3514                                                MultiExprArg Args,
3515                                                SourceLocation RParenLoc,
3516                                                bool ListInitialization) {
3517     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3518                                                RParenLoc, ListInitialization);
3519   }
3520 
3521   /// Build a new member reference expression.
3522   ///
3523   /// By default, performs semantic analysis to build the new expression.
3524   /// Subclasses may override this routine to provide different behavior.
3525   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3526                                                 QualType BaseType,
3527                                                 bool IsArrow,
3528                                                 SourceLocation OperatorLoc,
3529                                           NestedNameSpecifierLoc QualifierLoc,
3530                                                 SourceLocation TemplateKWLoc,
3531                                             NamedDecl *FirstQualifierInScope,
3532                                    const DeclarationNameInfo &MemberNameInfo,
3533                               const TemplateArgumentListInfo *TemplateArgs) {
3534     CXXScopeSpec SS;
3535     SS.Adopt(QualifierLoc);
3536 
3537     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3538                                             OperatorLoc, IsArrow,
3539                                             SS, TemplateKWLoc,
3540                                             FirstQualifierInScope,
3541                                             MemberNameInfo,
3542                                             TemplateArgs, /*S*/nullptr);
3543   }
3544 
3545   /// Build a new member reference expression.
3546   ///
3547   /// By default, performs semantic analysis to build the new expression.
3548   /// Subclasses may override this routine to provide different behavior.
3549   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3550                                          SourceLocation OperatorLoc,
3551                                          bool IsArrow,
3552                                          NestedNameSpecifierLoc QualifierLoc,
3553                                          SourceLocation TemplateKWLoc,
3554                                          NamedDecl *FirstQualifierInScope,
3555                                          LookupResult &R,
3556                                 const TemplateArgumentListInfo *TemplateArgs) {
3557     CXXScopeSpec SS;
3558     SS.Adopt(QualifierLoc);
3559 
3560     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3561                                             OperatorLoc, IsArrow,
3562                                             SS, TemplateKWLoc,
3563                                             FirstQualifierInScope,
3564                                             R, TemplateArgs, /*S*/nullptr);
3565   }
3566 
3567   /// Build a new noexcept expression.
3568   ///
3569   /// By default, performs semantic analysis to build the new expression.
3570   /// Subclasses may override this routine to provide different behavior.
3571   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3572     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3573   }
3574 
3575   /// Build a new expression to compute the length of a parameter pack.
3576   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
3577                                    SourceLocation PackLoc,
3578                                    SourceLocation RParenLoc,
3579                                    std::optional<unsigned> Length,
3580                                    ArrayRef<TemplateArgument> PartialArgs) {
3581     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3582                                   RParenLoc, Length, PartialArgs);
3583   }
3584 
3585   /// Build a new expression representing a call to a source location
3586   ///  builtin.
3587   ///
3588   /// By default, performs semantic analysis to build the new expression.
3589   /// Subclasses may override this routine to provide different behavior.
3590   ExprResult RebuildSourceLocExpr(SourceLocIdentKind Kind, QualType ResultTy,
3591                                   SourceLocation BuiltinLoc,
3592                                   SourceLocation RPLoc,
3593                                   DeclContext *ParentContext) {
3594     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3595                                         ParentContext);
3596   }
3597 
3598   /// Build a new Objective-C boxed expression.
3599   ///
3600   /// By default, performs semantic analysis to build the new expression.
3601   /// Subclasses may override this routine to provide different behavior.
3602   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3603       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3604       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3605       TemplateArgumentListInfo *TALI) {
3606     CXXScopeSpec SS;
3607     SS.Adopt(NNS);
3608     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3609                                                          ConceptNameInfo,
3610                                                          FoundDecl,
3611                                                          NamedConcept, TALI);
3612     if (Result.isInvalid())
3613       return ExprError();
3614     return Result;
3615   }
3616 
3617   /// \brief Build a new requires expression.
3618   ///
3619   /// By default, performs semantic analysis to build the new expression.
3620   /// Subclasses may override this routine to provide different behavior.
3621   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3622                                  RequiresExprBodyDecl *Body,
3623                                  SourceLocation LParenLoc,
3624                                  ArrayRef<ParmVarDecl *> LocalParameters,
3625                                  SourceLocation RParenLoc,
3626                                  ArrayRef<concepts::Requirement *> Requirements,
3627                                  SourceLocation ClosingBraceLoc) {
3628     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, LParenLoc,
3629                                 LocalParameters, RParenLoc, Requirements,
3630                                 ClosingBraceLoc);
3631   }
3632 
3633   concepts::TypeRequirement *
3634   RebuildTypeRequirement(
3635       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3636     return SemaRef.BuildTypeRequirement(SubstDiag);
3637   }
3638 
3639   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3640     return SemaRef.BuildTypeRequirement(T);
3641   }
3642 
3643   concepts::ExprRequirement *
3644   RebuildExprRequirement(
3645       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3646       SourceLocation NoexceptLoc,
3647       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3648     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3649                                         std::move(Ret));
3650   }
3651 
3652   concepts::ExprRequirement *
3653   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3654                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3655     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3656                                         std::move(Ret));
3657   }
3658 
3659   concepts::NestedRequirement *
3660   RebuildNestedRequirement(StringRef InvalidConstraintEntity,
3661                            const ASTConstraintSatisfaction &Satisfaction) {
3662     return SemaRef.BuildNestedRequirement(InvalidConstraintEntity,
3663                                           Satisfaction);
3664   }
3665 
3666   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3667     return SemaRef.BuildNestedRequirement(Constraint);
3668   }
3669 
3670   /// \brief Build a new Objective-C boxed expression.
3671   ///
3672   /// By default, performs semantic analysis to build the new expression.
3673   /// Subclasses may override this routine to provide different behavior.
3674   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3675     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3676   }
3677 
3678   /// Build a new Objective-C array literal.
3679   ///
3680   /// By default, performs semantic analysis to build the new expression.
3681   /// Subclasses may override this routine to provide different behavior.
3682   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3683                                      Expr **Elements, unsigned NumElements) {
3684     return getSema().BuildObjCArrayLiteral(Range,
3685                                            MultiExprArg(Elements, NumElements));
3686   }
3687 
3688   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3689                                          Expr *Base, Expr *Key,
3690                                          ObjCMethodDecl *getterMethod,
3691                                          ObjCMethodDecl *setterMethod) {
3692     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3693                                                    getterMethod, setterMethod);
3694   }
3695 
3696   /// Build a new Objective-C dictionary literal.
3697   ///
3698   /// By default, performs semantic analysis to build the new expression.
3699   /// Subclasses may override this routine to provide different behavior.
3700   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3701                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3702     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3703   }
3704 
3705   /// Build a new Objective-C \@encode expression.
3706   ///
3707   /// By default, performs semantic analysis to build the new expression.
3708   /// Subclasses may override this routine to provide different behavior.
3709   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3710                                          TypeSourceInfo *EncodeTypeInfo,
3711                                          SourceLocation RParenLoc) {
3712     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3713   }
3714 
3715   /// Build a new Objective-C class message.
3716   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3717                                           Selector Sel,
3718                                           ArrayRef<SourceLocation> SelectorLocs,
3719                                           ObjCMethodDecl *Method,
3720                                           SourceLocation LBracLoc,
3721                                           MultiExprArg Args,
3722                                           SourceLocation RBracLoc) {
3723     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3724                                      ReceiverTypeInfo->getType(),
3725                                      /*SuperLoc=*/SourceLocation(),
3726                                      Sel, Method, LBracLoc, SelectorLocs,
3727                                      RBracLoc, Args);
3728   }
3729 
3730   /// Build a new Objective-C instance message.
3731   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3732                                           Selector Sel,
3733                                           ArrayRef<SourceLocation> SelectorLocs,
3734                                           ObjCMethodDecl *Method,
3735                                           SourceLocation LBracLoc,
3736                                           MultiExprArg Args,
3737                                           SourceLocation RBracLoc) {
3738     return SemaRef.BuildInstanceMessage(Receiver,
3739                                         Receiver->getType(),
3740                                         /*SuperLoc=*/SourceLocation(),
3741                                         Sel, Method, LBracLoc, SelectorLocs,
3742                                         RBracLoc, Args);
3743   }
3744 
3745   /// Build a new Objective-C instance/class message to 'super'.
3746   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3747                                     Selector Sel,
3748                                     ArrayRef<SourceLocation> SelectorLocs,
3749                                     QualType SuperType,
3750                                     ObjCMethodDecl *Method,
3751                                     SourceLocation LBracLoc,
3752                                     MultiExprArg Args,
3753                                     SourceLocation RBracLoc) {
3754     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3755                                           SuperType,
3756                                           SuperLoc,
3757                                           Sel, Method, LBracLoc, SelectorLocs,
3758                                           RBracLoc, Args)
3759                                       : SemaRef.BuildClassMessage(nullptr,
3760                                           SuperType,
3761                                           SuperLoc,
3762                                           Sel, Method, LBracLoc, SelectorLocs,
3763                                           RBracLoc, Args);
3764 
3765 
3766   }
3767 
3768   /// Build a new Objective-C ivar reference expression.
3769   ///
3770   /// By default, performs semantic analysis to build the new expression.
3771   /// Subclasses may override this routine to provide different behavior.
3772   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3773                                           SourceLocation IvarLoc,
3774                                           bool IsArrow, bool IsFreeIvar) {
3775     CXXScopeSpec SS;
3776     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3777     ExprResult Result = getSema().BuildMemberReferenceExpr(
3778         BaseArg, BaseArg->getType(),
3779         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3780         /*FirstQualifierInScope=*/nullptr, NameInfo,
3781         /*TemplateArgs=*/nullptr,
3782         /*S=*/nullptr);
3783     if (IsFreeIvar && Result.isUsable())
3784       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3785     return Result;
3786   }
3787 
3788   /// Build a new Objective-C property reference expression.
3789   ///
3790   /// By default, performs semantic analysis to build the new expression.
3791   /// Subclasses may override this routine to provide different behavior.
3792   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3793                                         ObjCPropertyDecl *Property,
3794                                         SourceLocation PropertyLoc) {
3795     CXXScopeSpec SS;
3796     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3797     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3798                                               /*FIXME:*/PropertyLoc,
3799                                               /*IsArrow=*/false,
3800                                               SS, SourceLocation(),
3801                                               /*FirstQualifierInScope=*/nullptr,
3802                                               NameInfo,
3803                                               /*TemplateArgs=*/nullptr,
3804                                               /*S=*/nullptr);
3805   }
3806 
3807   /// Build a new Objective-C property reference expression.
3808   ///
3809   /// By default, performs semantic analysis to build the new expression.
3810   /// Subclasses may override this routine to provide different behavior.
3811   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3812                                         ObjCMethodDecl *Getter,
3813                                         ObjCMethodDecl *Setter,
3814                                         SourceLocation PropertyLoc) {
3815     // Since these expressions can only be value-dependent, we do not
3816     // need to perform semantic analysis again.
3817     return Owned(
3818       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3819                                                   VK_LValue, OK_ObjCProperty,
3820                                                   PropertyLoc, Base));
3821   }
3822 
3823   /// Build a new Objective-C "isa" expression.
3824   ///
3825   /// By default, performs semantic analysis to build the new expression.
3826   /// Subclasses may override this routine to provide different behavior.
3827   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3828                                 SourceLocation OpLoc, bool IsArrow) {
3829     CXXScopeSpec SS;
3830     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3831     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3832                                               OpLoc, IsArrow,
3833                                               SS, SourceLocation(),
3834                                               /*FirstQualifierInScope=*/nullptr,
3835                                               NameInfo,
3836                                               /*TemplateArgs=*/nullptr,
3837                                               /*S=*/nullptr);
3838   }
3839 
3840   /// Build a new shuffle vector expression.
3841   ///
3842   /// By default, performs semantic analysis to build the new expression.
3843   /// Subclasses may override this routine to provide different behavior.
3844   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3845                                       MultiExprArg SubExprs,
3846                                       SourceLocation RParenLoc) {
3847     // Find the declaration for __builtin_shufflevector
3848     const IdentifierInfo &Name
3849       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3850     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3851     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3852     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3853 
3854     // Build a reference to the __builtin_shufflevector builtin
3855     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3856     Expr *Callee = new (SemaRef.Context)
3857         DeclRefExpr(SemaRef.Context, Builtin, false,
3858                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3859     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3860     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3861                                        CK_BuiltinFnToFnPtr).get();
3862 
3863     // Build the CallExpr
3864     ExprResult TheCall = CallExpr::Create(
3865         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3866         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3867         FPOptionsOverride());
3868 
3869     // Type-check the __builtin_shufflevector expression.
3870     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3871   }
3872 
3873   /// Build a new convert vector expression.
3874   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3875                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3876                                       SourceLocation RParenLoc) {
3877     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3878                                          BuiltinLoc, RParenLoc);
3879   }
3880 
3881   /// Build a new template argument pack expansion.
3882   ///
3883   /// By default, performs semantic analysis to build a new pack expansion
3884   /// for a template argument. Subclasses may override this routine to provide
3885   /// different behavior.
3886   TemplateArgumentLoc
3887   RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc,
3888                        std::optional<unsigned> NumExpansions) {
3889     switch (Pattern.getArgument().getKind()) {
3890     case TemplateArgument::Expression: {
3891       ExprResult Result
3892         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3893                                        EllipsisLoc, NumExpansions);
3894       if (Result.isInvalid())
3895         return TemplateArgumentLoc();
3896 
3897       return TemplateArgumentLoc(Result.get(), Result.get());
3898     }
3899 
3900     case TemplateArgument::Template:
3901       return TemplateArgumentLoc(
3902           SemaRef.Context,
3903           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3904                            NumExpansions),
3905           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3906           EllipsisLoc);
3907 
3908     case TemplateArgument::Null:
3909     case TemplateArgument::Integral:
3910     case TemplateArgument::Declaration:
3911     case TemplateArgument::Pack:
3912     case TemplateArgument::TemplateExpansion:
3913     case TemplateArgument::NullPtr:
3914       llvm_unreachable("Pack expansion pattern has no parameter packs");
3915 
3916     case TemplateArgument::Type:
3917       if (TypeSourceInfo *Expansion
3918             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3919                                            EllipsisLoc,
3920                                            NumExpansions))
3921         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3922                                    Expansion);
3923       break;
3924     }
3925 
3926     return TemplateArgumentLoc();
3927   }
3928 
3929   /// Build a new expression pack expansion.
3930   ///
3931   /// By default, performs semantic analysis to build a new pack expansion
3932   /// for an expression. Subclasses may override this routine to provide
3933   /// different behavior.
3934   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3935                                   std::optional<unsigned> NumExpansions) {
3936     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3937   }
3938 
3939   /// Build a new C++1z fold-expression.
3940   ///
3941   /// By default, performs semantic analysis in order to build a new fold
3942   /// expression.
3943   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3944                                 SourceLocation LParenLoc, Expr *LHS,
3945                                 BinaryOperatorKind Operator,
3946                                 SourceLocation EllipsisLoc, Expr *RHS,
3947                                 SourceLocation RParenLoc,
3948                                 std::optional<unsigned> NumExpansions) {
3949     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3950                                       EllipsisLoc, RHS, RParenLoc,
3951                                       NumExpansions);
3952   }
3953 
3954   /// Build an empty C++1z fold-expression with the given operator.
3955   ///
3956   /// By default, produces the fallback value for the fold-expression, or
3957   /// produce an error if there is no fallback value.
3958   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3959                                      BinaryOperatorKind Operator) {
3960     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3961   }
3962 
3963   /// Build a new atomic operation expression.
3964   ///
3965   /// By default, performs semantic analysis to build the new expression.
3966   /// Subclasses may override this routine to provide different behavior.
3967   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3968                                AtomicExpr::AtomicOp Op,
3969                                SourceLocation RParenLoc) {
3970     // Use this for all of the locations, since we don't know the difference
3971     // between the call and the expr at this point.
3972     SourceRange Range{BuiltinLoc, RParenLoc};
3973     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3974                                      Sema::AtomicArgumentOrder::AST);
3975   }
3976 
3977   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3978                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3979     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3980   }
3981 
3982 private:
3983   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3984                                      QualType ObjectType,
3985                                      NamedDecl *FirstQualifierInScope,
3986                                      CXXScopeSpec &SS);
3987 
3988   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3989                                              QualType ObjectType,
3990                                              NamedDecl *FirstQualifierInScope,
3991                                              CXXScopeSpec &SS);
3992 
3993   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3994                                             NamedDecl *FirstQualifierInScope,
3995                                             CXXScopeSpec &SS);
3996 
3997   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3998                                       DependentNameTypeLoc TL,
3999                                       bool DeducibleTSTContext);
4000 };
4001 
4002 template <typename Derived>
4003 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
4004   if (!S)
4005     return S;
4006 
4007   switch (S->getStmtClass()) {
4008   case Stmt::NoStmtClass: break;
4009 
4010   // Transform individual statement nodes
4011   // Pass SDK into statements that can produce a value
4012 #define STMT(Node, Parent)                                              \
4013   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
4014 #define VALUESTMT(Node, Parent)                                         \
4015   case Stmt::Node##Class:                                               \
4016     return getDerived().Transform##Node(cast<Node>(S), SDK);
4017 #define ABSTRACT_STMT(Node)
4018 #define EXPR(Node, Parent)
4019 #include "clang/AST/StmtNodes.inc"
4020 
4021   // Transform expressions by calling TransformExpr.
4022 #define STMT(Node, Parent)
4023 #define ABSTRACT_STMT(Stmt)
4024 #define EXPR(Node, Parent) case Stmt::Node##Class:
4025 #include "clang/AST/StmtNodes.inc"
4026     {
4027       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
4028 
4029       if (SDK == SDK_StmtExprResult)
4030         E = getSema().ActOnStmtExprResult(E);
4031       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
4032     }
4033   }
4034 
4035   return S;
4036 }
4037 
4038 template<typename Derived>
4039 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
4040   if (!S)
4041     return S;
4042 
4043   switch (S->getClauseKind()) {
4044   default: break;
4045   // Transform individual clause nodes
4046 #define GEN_CLANG_CLAUSE_CLASS
4047 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
4048   case Enum:                                                                   \
4049     return getDerived().Transform##Class(cast<Class>(S));
4050 #include "llvm/Frontend/OpenMP/OMP.inc"
4051   }
4052 
4053   return S;
4054 }
4055 
4056 
4057 template<typename Derived>
4058 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
4059   if (!E)
4060     return E;
4061 
4062   switch (E->getStmtClass()) {
4063     case Stmt::NoStmtClass: break;
4064 #define STMT(Node, Parent) case Stmt::Node##Class: break;
4065 #define ABSTRACT_STMT(Stmt)
4066 #define EXPR(Node, Parent)                                              \
4067     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
4068 #include "clang/AST/StmtNodes.inc"
4069   }
4070 
4071   return E;
4072 }
4073 
4074 template<typename Derived>
4075 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
4076                                                         bool NotCopyInit) {
4077   // Initializers are instantiated like expressions, except that various outer
4078   // layers are stripped.
4079   if (!Init)
4080     return Init;
4081 
4082   if (auto *FE = dyn_cast<FullExpr>(Init))
4083     Init = FE->getSubExpr();
4084 
4085   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
4086     OpaqueValueExpr *OVE = AIL->getCommonExpr();
4087     Init = OVE->getSourceExpr();
4088   }
4089 
4090   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
4091     Init = MTE->getSubExpr();
4092 
4093   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
4094     Init = Binder->getSubExpr();
4095 
4096   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
4097     Init = ICE->getSubExprAsWritten();
4098 
4099   if (CXXStdInitializerListExpr *ILE =
4100           dyn_cast<CXXStdInitializerListExpr>(Init))
4101     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4102 
4103   // If this is copy-initialization, we only need to reconstruct
4104   // InitListExprs. Other forms of copy-initialization will be a no-op if
4105   // the initializer is already the right type.
4106   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
4107   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
4108     return getDerived().TransformExpr(Init);
4109 
4110   // Revert value-initialization back to empty parens.
4111   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
4112     SourceRange Parens = VIE->getSourceRange();
4113     return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt,
4114                                              Parens.getEnd());
4115   }
4116 
4117   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
4118   if (isa<ImplicitValueInitExpr>(Init))
4119     return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt,
4120                                              SourceLocation());
4121 
4122   // Revert initialization by constructor back to a parenthesized or braced list
4123   // of expressions. Any other form of initializer can just be reused directly.
4124   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4125     return getDerived().TransformExpr(Init);
4126 
4127   // If the initialization implicitly converted an initializer list to a
4128   // std::initializer_list object, unwrap the std::initializer_list too.
4129   if (Construct && Construct->isStdInitListInitialization())
4130     return TransformInitializer(Construct->getArg(0), NotCopyInit);
4131 
4132   // Enter a list-init context if this was list initialization.
4133   EnterExpressionEvaluationContext Context(
4134       getSema(), EnterExpressionEvaluationContext::InitList,
4135       Construct->isListInitialization());
4136 
4137   SmallVector<Expr*, 8> NewArgs;
4138   bool ArgChanged = false;
4139   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
4140                                   /*IsCall*/true, NewArgs, &ArgChanged))
4141     return ExprError();
4142 
4143   // If this was list initialization, revert to syntactic list form.
4144   if (Construct->isListInitialization())
4145     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
4146                                         Construct->getEndLoc());
4147 
4148   // Build a ParenListExpr to represent anything else.
4149   SourceRange Parens = Construct->getParenOrBraceRange();
4150   if (Parens.isInvalid()) {
4151     // This was a variable declaration's initialization for which no initializer
4152     // was specified.
4153     assert(NewArgs.empty() &&
4154            "no parens or braces but have direct init with arguments?");
4155     return ExprEmpty();
4156   }
4157   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
4158                                            Parens.getEnd());
4159 }
4160 
4161 template<typename Derived>
4162 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
4163                                             unsigned NumInputs,
4164                                             bool IsCall,
4165                                       SmallVectorImpl<Expr *> &Outputs,
4166                                             bool *ArgChanged) {
4167   for (unsigned I = 0; I != NumInputs; ++I) {
4168     // If requested, drop call arguments that need to be dropped.
4169     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4170       if (ArgChanged)
4171         *ArgChanged = true;
4172 
4173       break;
4174     }
4175 
4176     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
4177       Expr *Pattern = Expansion->getPattern();
4178 
4179       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4180       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4181       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4182 
4183       // Determine whether the set of unexpanded parameter packs can and should
4184       // be expanded.
4185       bool Expand = true;
4186       bool RetainExpansion = false;
4187       std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4188       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4189       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4190                                                Pattern->getSourceRange(),
4191                                                Unexpanded,
4192                                                Expand, RetainExpansion,
4193                                                NumExpansions))
4194         return true;
4195 
4196       if (!Expand) {
4197         // The transform has determined that we should perform a simple
4198         // transformation on the pack expansion, producing another pack
4199         // expansion.
4200         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4201         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4202         if (OutPattern.isInvalid())
4203           return true;
4204 
4205         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4206                                                 Expansion->getEllipsisLoc(),
4207                                                            NumExpansions);
4208         if (Out.isInvalid())
4209           return true;
4210 
4211         if (ArgChanged)
4212           *ArgChanged = true;
4213         Outputs.push_back(Out.get());
4214         continue;
4215       }
4216 
4217       // Record right away that the argument was changed.  This needs
4218       // to happen even if the array expands to nothing.
4219       if (ArgChanged) *ArgChanged = true;
4220 
4221       // The transform has determined that we should perform an elementwise
4222       // expansion of the pattern. Do so.
4223       for (unsigned I = 0; I != *NumExpansions; ++I) {
4224         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4225         ExprResult Out = getDerived().TransformExpr(Pattern);
4226         if (Out.isInvalid())
4227           return true;
4228 
4229         if (Out.get()->containsUnexpandedParameterPack()) {
4230           Out = getDerived().RebuildPackExpansion(
4231               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4232           if (Out.isInvalid())
4233             return true;
4234         }
4235 
4236         Outputs.push_back(Out.get());
4237       }
4238 
4239       // If we're supposed to retain a pack expansion, do so by temporarily
4240       // forgetting the partially-substituted parameter pack.
4241       if (RetainExpansion) {
4242         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4243 
4244         ExprResult Out = getDerived().TransformExpr(Pattern);
4245         if (Out.isInvalid())
4246           return true;
4247 
4248         Out = getDerived().RebuildPackExpansion(
4249             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4250         if (Out.isInvalid())
4251           return true;
4252 
4253         Outputs.push_back(Out.get());
4254       }
4255 
4256       continue;
4257     }
4258 
4259     ExprResult Result =
4260       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4261              : getDerived().TransformExpr(Inputs[I]);
4262     if (Result.isInvalid())
4263       return true;
4264 
4265     if (Result.get() != Inputs[I] && ArgChanged)
4266       *ArgChanged = true;
4267 
4268     Outputs.push_back(Result.get());
4269   }
4270 
4271   return false;
4272 }
4273 
4274 template <typename Derived>
4275 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4276     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4277   if (Var) {
4278     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4279         getDerived().TransformDefinition(Var->getLocation(), Var));
4280 
4281     if (!ConditionVar)
4282       return Sema::ConditionError();
4283 
4284     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4285   }
4286 
4287   if (Expr) {
4288     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4289 
4290     if (CondExpr.isInvalid())
4291       return Sema::ConditionError();
4292 
4293     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4294                                     /*MissingOK=*/true);
4295   }
4296 
4297   return Sema::ConditionResult();
4298 }
4299 
4300 template <typename Derived>
4301 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4302     NestedNameSpecifierLoc NNS, QualType ObjectType,
4303     NamedDecl *FirstQualifierInScope) {
4304   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4305 
4306   auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) {
4307     for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4308          Qualifier = Qualifier.getPrefix())
4309       Qualifiers.push_back(Qualifier);
4310   };
4311   insertNNS(NNS);
4312 
4313   CXXScopeSpec SS;
4314   while (!Qualifiers.empty()) {
4315     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4316     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4317 
4318     switch (QNNS->getKind()) {
4319     case NestedNameSpecifier::Identifier: {
4320       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4321                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4322                                       ObjectType);
4323       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4324                                               SS, FirstQualifierInScope, false))
4325         return NestedNameSpecifierLoc();
4326       break;
4327     }
4328 
4329     case NestedNameSpecifier::Namespace: {
4330       NamespaceDecl *NS =
4331           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4332               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4333       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4334       break;
4335     }
4336 
4337     case NestedNameSpecifier::NamespaceAlias: {
4338       NamespaceAliasDecl *Alias =
4339           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4340               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4341       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4342                 Q.getLocalEndLoc());
4343       break;
4344     }
4345 
4346     case NestedNameSpecifier::Global:
4347       // There is no meaningful transformation that one could perform on the
4348       // global scope.
4349       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4350       break;
4351 
4352     case NestedNameSpecifier::Super: {
4353       CXXRecordDecl *RD =
4354           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4355               SourceLocation(), QNNS->getAsRecordDecl()));
4356       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4357       break;
4358     }
4359 
4360     case NestedNameSpecifier::TypeSpecWithTemplate:
4361     case NestedNameSpecifier::TypeSpec: {
4362       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4363                                               FirstQualifierInScope, SS);
4364 
4365       if (!TL)
4366         return NestedNameSpecifierLoc();
4367 
4368       QualType T = TL.getType();
4369       if (T->isDependentType() || T->isRecordType() ||
4370           (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) {
4371         if (T->isEnumeralType())
4372           SemaRef.Diag(TL.getBeginLoc(),
4373                        diag::warn_cxx98_compat_enum_nested_name_spec);
4374 
4375         if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) {
4376           SS.Adopt(ETL.getQualifierLoc());
4377           TL = ETL.getNamedTypeLoc();
4378         }
4379         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4380                   Q.getLocalEndLoc());
4381         break;
4382       }
4383       // If the nested-name-specifier is an invalid type def, don't emit an
4384       // error because a previous error should have already been emitted.
4385       TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>();
4386       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4387         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4388             << T << SS.getRange();
4389       }
4390       return NestedNameSpecifierLoc();
4391     }
4392     }
4393 
4394     // The qualifier-in-scope and object type only apply to the leftmost entity.
4395     FirstQualifierInScope = nullptr;
4396     ObjectType = QualType();
4397   }
4398 
4399   // Don't rebuild the nested-name-specifier if we don't have to.
4400   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4401       !getDerived().AlwaysRebuild())
4402     return NNS;
4403 
4404   // If we can re-use the source-location data from the original
4405   // nested-name-specifier, do so.
4406   if (SS.location_size() == NNS.getDataLength() &&
4407       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4408     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4409 
4410   // Allocate new nested-name-specifier location information.
4411   return SS.getWithLocInContext(SemaRef.Context);
4412 }
4413 
4414 template<typename Derived>
4415 DeclarationNameInfo
4416 TreeTransform<Derived>
4417 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4418   DeclarationName Name = NameInfo.getName();
4419   if (!Name)
4420     return DeclarationNameInfo();
4421 
4422   switch (Name.getNameKind()) {
4423   case DeclarationName::Identifier:
4424   case DeclarationName::ObjCZeroArgSelector:
4425   case DeclarationName::ObjCOneArgSelector:
4426   case DeclarationName::ObjCMultiArgSelector:
4427   case DeclarationName::CXXOperatorName:
4428   case DeclarationName::CXXLiteralOperatorName:
4429   case DeclarationName::CXXUsingDirective:
4430     return NameInfo;
4431 
4432   case DeclarationName::CXXDeductionGuideName: {
4433     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4434     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4435         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4436     if (!NewTemplate)
4437       return DeclarationNameInfo();
4438 
4439     DeclarationNameInfo NewNameInfo(NameInfo);
4440     NewNameInfo.setName(
4441         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4442     return NewNameInfo;
4443   }
4444 
4445   case DeclarationName::CXXConstructorName:
4446   case DeclarationName::CXXDestructorName:
4447   case DeclarationName::CXXConversionFunctionName: {
4448     TypeSourceInfo *NewTInfo;
4449     CanQualType NewCanTy;
4450     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4451       NewTInfo = getDerived().TransformType(OldTInfo);
4452       if (!NewTInfo)
4453         return DeclarationNameInfo();
4454       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4455     }
4456     else {
4457       NewTInfo = nullptr;
4458       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4459       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4460       if (NewT.isNull())
4461         return DeclarationNameInfo();
4462       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4463     }
4464 
4465     DeclarationName NewName
4466       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4467                                                            NewCanTy);
4468     DeclarationNameInfo NewNameInfo(NameInfo);
4469     NewNameInfo.setName(NewName);
4470     NewNameInfo.setNamedTypeInfo(NewTInfo);
4471     return NewNameInfo;
4472   }
4473   }
4474 
4475   llvm_unreachable("Unknown name kind.");
4476 }
4477 
4478 template<typename Derived>
4479 TemplateName
4480 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4481                                               TemplateName Name,
4482                                               SourceLocation NameLoc,
4483                                               QualType ObjectType,
4484                                               NamedDecl *FirstQualifierInScope,
4485                                               bool AllowInjectedClassName) {
4486   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4487     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4488     assert(Template && "qualified template name must refer to a template");
4489 
4490     TemplateDecl *TransTemplate
4491       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4492                                                               Template));
4493     if (!TransTemplate)
4494       return TemplateName();
4495 
4496     if (!getDerived().AlwaysRebuild() &&
4497         SS.getScopeRep() == QTN->getQualifier() &&
4498         TransTemplate == Template)
4499       return Name;
4500 
4501     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4502                                             TransTemplate);
4503   }
4504 
4505   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4506     if (SS.getScopeRep()) {
4507       // These apply to the scope specifier, not the template.
4508       ObjectType = QualType();
4509       FirstQualifierInScope = nullptr;
4510     }
4511 
4512     if (!getDerived().AlwaysRebuild() &&
4513         SS.getScopeRep() == DTN->getQualifier() &&
4514         ObjectType.isNull())
4515       return Name;
4516 
4517     // FIXME: Preserve the location of the "template" keyword.
4518     SourceLocation TemplateKWLoc = NameLoc;
4519 
4520     if (DTN->isIdentifier()) {
4521       return getDerived().RebuildTemplateName(SS,
4522                                               TemplateKWLoc,
4523                                               *DTN->getIdentifier(),
4524                                               NameLoc,
4525                                               ObjectType,
4526                                               FirstQualifierInScope,
4527                                               AllowInjectedClassName);
4528     }
4529 
4530     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4531                                             DTN->getOperator(), NameLoc,
4532                                             ObjectType, AllowInjectedClassName);
4533   }
4534 
4535   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4536     TemplateDecl *TransTemplate
4537       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4538                                                               Template));
4539     if (!TransTemplate)
4540       return TemplateName();
4541 
4542     if (!getDerived().AlwaysRebuild() &&
4543         TransTemplate == Template)
4544       return Name;
4545 
4546     return TemplateName(TransTemplate);
4547   }
4548 
4549   if (SubstTemplateTemplateParmPackStorage *SubstPack
4550       = Name.getAsSubstTemplateTemplateParmPack()) {
4551     return getDerived().RebuildTemplateName(
4552         SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4553         SubstPack->getIndex(), SubstPack->getFinal());
4554   }
4555 
4556   // These should be getting filtered out before they reach the AST.
4557   llvm_unreachable("overloaded function decl survived to here");
4558 }
4559 
4560 template<typename Derived>
4561 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4562                                          const TemplateArgument &Arg,
4563                                          TemplateArgumentLoc &Output) {
4564   Output = getSema().getTrivialTemplateArgumentLoc(
4565       Arg, QualType(), getDerived().getBaseLocation());
4566 }
4567 
4568 template <typename Derived>
4569 bool TreeTransform<Derived>::TransformTemplateArgument(
4570     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4571     bool Uneval) {
4572   const TemplateArgument &Arg = Input.getArgument();
4573   switch (Arg.getKind()) {
4574   case TemplateArgument::Null:
4575   case TemplateArgument::Pack:
4576     llvm_unreachable("Unexpected TemplateArgument");
4577 
4578   case TemplateArgument::Integral:
4579   case TemplateArgument::NullPtr:
4580   case TemplateArgument::Declaration: {
4581     // Transform a resolved template argument straight to a resolved template
4582     // argument. We get here when substituting into an already-substituted
4583     // template type argument during concept satisfaction checking.
4584     QualType T = Arg.getNonTypeTemplateArgumentType();
4585     QualType NewT = getDerived().TransformType(T);
4586     if (NewT.isNull())
4587       return true;
4588 
4589     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4590                        ? Arg.getAsDecl()
4591                        : nullptr;
4592     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4593                               getDerived().getBaseLocation(), D))
4594                         : nullptr;
4595     if (D && !NewD)
4596       return true;
4597 
4598     if (NewT == T && D == NewD)
4599       Output = Input;
4600     else if (Arg.getKind() == TemplateArgument::Integral)
4601       Output = TemplateArgumentLoc(
4602           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4603           TemplateArgumentLocInfo());
4604     else if (Arg.getKind() == TemplateArgument::NullPtr)
4605       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4606                                    TemplateArgumentLocInfo());
4607     else
4608       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4609                                    TemplateArgumentLocInfo());
4610 
4611     return false;
4612   }
4613 
4614   case TemplateArgument::Type: {
4615     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4616     if (!DI)
4617       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4618 
4619     DI = getDerived().TransformType(DI);
4620     if (!DI)
4621       return true;
4622 
4623     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4624     return false;
4625   }
4626 
4627   case TemplateArgument::Template: {
4628     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4629     if (QualifierLoc) {
4630       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4631       if (!QualifierLoc)
4632         return true;
4633     }
4634 
4635     CXXScopeSpec SS;
4636     SS.Adopt(QualifierLoc);
4637     TemplateName Template = getDerived().TransformTemplateName(
4638         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4639     if (Template.isNull())
4640       return true;
4641 
4642     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4643                                  QualifierLoc, Input.getTemplateNameLoc());
4644     return false;
4645   }
4646 
4647   case TemplateArgument::TemplateExpansion:
4648     llvm_unreachable("Caller should expand pack expansions");
4649 
4650   case TemplateArgument::Expression: {
4651     // Template argument expressions are constant expressions.
4652     EnterExpressionEvaluationContext Unevaluated(
4653         getSema(),
4654         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4655                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4656         Sema::ReuseLambdaContextDecl, /*ExprContext=*/
4657         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4658 
4659     Expr *InputExpr = Input.getSourceExpression();
4660     if (!InputExpr)
4661       InputExpr = Input.getArgument().getAsExpr();
4662 
4663     ExprResult E = getDerived().TransformExpr(InputExpr);
4664     E = SemaRef.ActOnConstantExpression(E);
4665     if (E.isInvalid())
4666       return true;
4667     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4668     return false;
4669   }
4670   }
4671 
4672   // Work around bogus GCC warning
4673   return true;
4674 }
4675 
4676 /// Iterator adaptor that invents template argument location information
4677 /// for each of the template arguments in its underlying iterator.
4678 template<typename Derived, typename InputIterator>
4679 class TemplateArgumentLocInventIterator {
4680   TreeTransform<Derived> &Self;
4681   InputIterator Iter;
4682 
4683 public:
4684   typedef TemplateArgumentLoc value_type;
4685   typedef TemplateArgumentLoc reference;
4686   typedef typename std::iterator_traits<InputIterator>::difference_type
4687     difference_type;
4688   typedef std::input_iterator_tag iterator_category;
4689 
4690   class pointer {
4691     TemplateArgumentLoc Arg;
4692 
4693   public:
4694     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4695 
4696     const TemplateArgumentLoc *operator->() const { return &Arg; }
4697   };
4698 
4699   TemplateArgumentLocInventIterator() { }
4700 
4701   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4702                                              InputIterator Iter)
4703     : Self(Self), Iter(Iter) { }
4704 
4705   TemplateArgumentLocInventIterator &operator++() {
4706     ++Iter;
4707     return *this;
4708   }
4709 
4710   TemplateArgumentLocInventIterator operator++(int) {
4711     TemplateArgumentLocInventIterator Old(*this);
4712     ++(*this);
4713     return Old;
4714   }
4715 
4716   reference operator*() const {
4717     TemplateArgumentLoc Result;
4718     Self.InventTemplateArgumentLoc(*Iter, Result);
4719     return Result;
4720   }
4721 
4722   pointer operator->() const { return pointer(**this); }
4723 
4724   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4725                          const TemplateArgumentLocInventIterator &Y) {
4726     return X.Iter == Y.Iter;
4727   }
4728 
4729   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4730                          const TemplateArgumentLocInventIterator &Y) {
4731     return X.Iter != Y.Iter;
4732   }
4733 };
4734 
4735 template<typename Derived>
4736 template<typename InputIterator>
4737 bool TreeTransform<Derived>::TransformTemplateArguments(
4738     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4739     bool Uneval) {
4740   for (; First != Last; ++First) {
4741     TemplateArgumentLoc Out;
4742     TemplateArgumentLoc In = *First;
4743 
4744     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4745       // Unpack argument packs, which we translate them into separate
4746       // arguments.
4747       // FIXME: We could do much better if we could guarantee that the
4748       // TemplateArgumentLocInfo for the pack expansion would be usable for
4749       // all of the template arguments in the argument pack.
4750       typedef TemplateArgumentLocInventIterator<Derived,
4751                                                 TemplateArgument::pack_iterator>
4752         PackLocIterator;
4753       if (TransformTemplateArguments(PackLocIterator(*this,
4754                                                  In.getArgument().pack_begin()),
4755                                      PackLocIterator(*this,
4756                                                    In.getArgument().pack_end()),
4757                                      Outputs, Uneval))
4758         return true;
4759 
4760       continue;
4761     }
4762 
4763     if (In.getArgument().isPackExpansion()) {
4764       // We have a pack expansion, for which we will be substituting into
4765       // the pattern.
4766       SourceLocation Ellipsis;
4767       std::optional<unsigned> OrigNumExpansions;
4768       TemplateArgumentLoc Pattern
4769         = getSema().getTemplateArgumentPackExpansionPattern(
4770               In, Ellipsis, OrigNumExpansions);
4771 
4772       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4773       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4774       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4775 
4776       // Determine whether the set of unexpanded parameter packs can and should
4777       // be expanded.
4778       bool Expand = true;
4779       bool RetainExpansion = false;
4780       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4781       if (getDerived().TryExpandParameterPacks(Ellipsis,
4782                                                Pattern.getSourceRange(),
4783                                                Unexpanded,
4784                                                Expand,
4785                                                RetainExpansion,
4786                                                NumExpansions))
4787         return true;
4788 
4789       if (!Expand) {
4790         // The transform has determined that we should perform a simple
4791         // transformation on the pack expansion, producing another pack
4792         // expansion.
4793         TemplateArgumentLoc OutPattern;
4794         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4795         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4796           return true;
4797 
4798         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4799                                                 NumExpansions);
4800         if (Out.getArgument().isNull())
4801           return true;
4802 
4803         Outputs.addArgument(Out);
4804         continue;
4805       }
4806 
4807       // The transform has determined that we should perform an elementwise
4808       // expansion of the pattern. Do so.
4809       for (unsigned I = 0; I != *NumExpansions; ++I) {
4810         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4811 
4812         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4813           return true;
4814 
4815         if (Out.getArgument().containsUnexpandedParameterPack()) {
4816           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4817                                                   OrigNumExpansions);
4818           if (Out.getArgument().isNull())
4819             return true;
4820         }
4821 
4822         Outputs.addArgument(Out);
4823       }
4824 
4825       // If we're supposed to retain a pack expansion, do so by temporarily
4826       // forgetting the partially-substituted parameter pack.
4827       if (RetainExpansion) {
4828         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4829 
4830         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4831           return true;
4832 
4833         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4834                                                 OrigNumExpansions);
4835         if (Out.getArgument().isNull())
4836           return true;
4837 
4838         Outputs.addArgument(Out);
4839       }
4840 
4841       continue;
4842     }
4843 
4844     // The simple case:
4845     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4846       return true;
4847 
4848     Outputs.addArgument(Out);
4849   }
4850 
4851   return false;
4852 
4853 }
4854 
4855 //===----------------------------------------------------------------------===//
4856 // Type transformation
4857 //===----------------------------------------------------------------------===//
4858 
4859 template<typename Derived>
4860 QualType TreeTransform<Derived>::TransformType(QualType T) {
4861   if (getDerived().AlreadyTransformed(T))
4862     return T;
4863 
4864   // Temporary workaround.  All of these transformations should
4865   // eventually turn into transformations on TypeLocs.
4866   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4867                                                 getDerived().getBaseLocation());
4868 
4869   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4870 
4871   if (!NewDI)
4872     return QualType();
4873 
4874   return NewDI->getType();
4875 }
4876 
4877 template<typename Derived>
4878 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4879   // Refine the base location to the type's location.
4880   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4881                        getDerived().getBaseEntity());
4882   if (getDerived().AlreadyTransformed(DI->getType()))
4883     return DI;
4884 
4885   TypeLocBuilder TLB;
4886 
4887   TypeLoc TL = DI->getTypeLoc();
4888   TLB.reserve(TL.getFullDataSize());
4889 
4890   QualType Result = getDerived().TransformType(TLB, TL);
4891   if (Result.isNull())
4892     return nullptr;
4893 
4894   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4895 }
4896 
4897 template<typename Derived>
4898 QualType
4899 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4900   switch (T.getTypeLocClass()) {
4901 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4902 #define TYPELOC(CLASS, PARENT)                                                 \
4903   case TypeLoc::CLASS:                                                         \
4904     return getDerived().Transform##CLASS##Type(TLB,                            \
4905                                                T.castAs<CLASS##TypeLoc>());
4906 #include "clang/AST/TypeLocNodes.def"
4907   }
4908 
4909   llvm_unreachable("unhandled type loc!");
4910 }
4911 
4912 template<typename Derived>
4913 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4914   if (!isa<DependentNameType>(T))
4915     return TransformType(T);
4916 
4917   if (getDerived().AlreadyTransformed(T))
4918     return T;
4919   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4920                                                 getDerived().getBaseLocation());
4921   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4922   return NewDI ? NewDI->getType() : QualType();
4923 }
4924 
4925 template<typename Derived>
4926 TypeSourceInfo *
4927 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4928   if (!isa<DependentNameType>(DI->getType()))
4929     return TransformType(DI);
4930 
4931   // Refine the base location to the type's location.
4932   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4933                        getDerived().getBaseEntity());
4934   if (getDerived().AlreadyTransformed(DI->getType()))
4935     return DI;
4936 
4937   TypeLocBuilder TLB;
4938 
4939   TypeLoc TL = DI->getTypeLoc();
4940   TLB.reserve(TL.getFullDataSize());
4941 
4942   auto QTL = TL.getAs<QualifiedTypeLoc>();
4943   if (QTL)
4944     TL = QTL.getUnqualifiedLoc();
4945 
4946   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4947 
4948   QualType Result = getDerived().TransformDependentNameType(
4949       TLB, DNTL, /*DeducedTSTContext*/true);
4950   if (Result.isNull())
4951     return nullptr;
4952 
4953   if (QTL) {
4954     Result = getDerived().RebuildQualifiedType(Result, QTL);
4955     if (Result.isNull())
4956       return nullptr;
4957     TLB.TypeWasModifiedSafely(Result);
4958   }
4959 
4960   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4961 }
4962 
4963 template<typename Derived>
4964 QualType
4965 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4966                                                QualifiedTypeLoc T) {
4967   QualType Result;
4968   TypeLoc UnqualTL = T.getUnqualifiedLoc();
4969   auto SuppressObjCLifetime =
4970       T.getType().getLocalQualifiers().hasObjCLifetime();
4971   if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) {
4972     Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
4973                                                         SuppressObjCLifetime);
4974   } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) {
4975     Result = getDerived().TransformSubstTemplateTypeParmPackType(
4976         TLB, STTP, SuppressObjCLifetime);
4977   } else {
4978     Result = getDerived().TransformType(TLB, UnqualTL);
4979   }
4980 
4981   if (Result.isNull())
4982     return QualType();
4983 
4984   Result = getDerived().RebuildQualifiedType(Result, T);
4985 
4986   if (Result.isNull())
4987     return QualType();
4988 
4989   // RebuildQualifiedType might have updated the type, but not in a way
4990   // that invalidates the TypeLoc. (There's no location information for
4991   // qualifiers.)
4992   TLB.TypeWasModifiedSafely(Result);
4993 
4994   return Result;
4995 }
4996 
4997 template <typename Derived>
4998 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4999                                                       QualifiedTypeLoc TL) {
5000 
5001   SourceLocation Loc = TL.getBeginLoc();
5002   Qualifiers Quals = TL.getType().getLocalQualifiers();
5003 
5004   if ((T.getAddressSpace() != LangAS::Default &&
5005        Quals.getAddressSpace() != LangAS::Default) &&
5006       T.getAddressSpace() != Quals.getAddressSpace()) {
5007     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
5008         << TL.getType() << T;
5009     return QualType();
5010   }
5011 
5012   // C++ [dcl.fct]p7:
5013   //   [When] adding cv-qualifications on top of the function type [...] the
5014   //   cv-qualifiers are ignored.
5015   if (T->isFunctionType()) {
5016     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
5017                                                      Quals.getAddressSpace());
5018     return T;
5019   }
5020 
5021   // C++ [dcl.ref]p1:
5022   //   when the cv-qualifiers are introduced through the use of a typedef-name
5023   //   or decltype-specifier [...] the cv-qualifiers are ignored.
5024   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
5025   // applied to a reference type.
5026   if (T->isReferenceType()) {
5027     // The only qualifier that applies to a reference type is restrict.
5028     if (!Quals.hasRestrict())
5029       return T;
5030     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
5031   }
5032 
5033   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
5034   // resulting type.
5035   if (Quals.hasObjCLifetime()) {
5036     if (!T->isObjCLifetimeType() && !T->isDependentType())
5037       Quals.removeObjCLifetime();
5038     else if (T.getObjCLifetime()) {
5039       // Objective-C ARC:
5040       //   A lifetime qualifier applied to a substituted template parameter
5041       //   overrides the lifetime qualifier from the template argument.
5042       const AutoType *AutoTy;
5043       if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
5044         // 'auto' types behave the same way as template parameters.
5045         QualType Deduced = AutoTy->getDeducedType();
5046         Qualifiers Qs = Deduced.getQualifiers();
5047         Qs.removeObjCLifetime();
5048         Deduced =
5049             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
5050         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
5051                                         AutoTy->isDependentType(),
5052                                         /*isPack=*/false,
5053                                         AutoTy->getTypeConstraintConcept(),
5054                                         AutoTy->getTypeConstraintArguments());
5055       } else {
5056         // Otherwise, complain about the addition of a qualifier to an
5057         // already-qualified type.
5058         // FIXME: Why is this check not in Sema::BuildQualifiedType?
5059         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
5060         Quals.removeObjCLifetime();
5061       }
5062     }
5063   }
5064 
5065   return SemaRef.BuildQualifiedType(T, Loc, Quals);
5066 }
5067 
5068 template<typename Derived>
5069 TypeLoc
5070 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
5071                                                    QualType ObjectType,
5072                                                    NamedDecl *UnqualLookup,
5073                                                    CXXScopeSpec &SS) {
5074   if (getDerived().AlreadyTransformed(TL.getType()))
5075     return TL;
5076 
5077   TypeSourceInfo *TSI =
5078       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
5079   if (TSI)
5080     return TSI->getTypeLoc();
5081   return TypeLoc();
5082 }
5083 
5084 template<typename Derived>
5085 TypeSourceInfo *
5086 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5087                                                    QualType ObjectType,
5088                                                    NamedDecl *UnqualLookup,
5089                                                    CXXScopeSpec &SS) {
5090   if (getDerived().AlreadyTransformed(TSInfo->getType()))
5091     return TSInfo;
5092 
5093   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5094                                    UnqualLookup, SS);
5095 }
5096 
5097 template <typename Derived>
5098 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5099     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5100     CXXScopeSpec &SS) {
5101   QualType T = TL.getType();
5102   assert(!getDerived().AlreadyTransformed(T));
5103 
5104   TypeLocBuilder TLB;
5105   QualType Result;
5106 
5107   if (isa<TemplateSpecializationType>(T)) {
5108     TemplateSpecializationTypeLoc SpecTL =
5109         TL.castAs<TemplateSpecializationTypeLoc>();
5110 
5111     TemplateName Template = getDerived().TransformTemplateName(
5112         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5113         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
5114     if (Template.isNull())
5115       return nullptr;
5116 
5117     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5118                                                               Template);
5119   } else if (isa<DependentTemplateSpecializationType>(T)) {
5120     DependentTemplateSpecializationTypeLoc SpecTL =
5121         TL.castAs<DependentTemplateSpecializationTypeLoc>();
5122 
5123     TemplateName Template
5124       = getDerived().RebuildTemplateName(SS,
5125                                          SpecTL.getTemplateKeywordLoc(),
5126                                          *SpecTL.getTypePtr()->getIdentifier(),
5127                                          SpecTL.getTemplateNameLoc(),
5128                                          ObjectType, UnqualLookup,
5129                                          /*AllowInjectedClassName*/true);
5130     if (Template.isNull())
5131       return nullptr;
5132 
5133     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5134                                                                        SpecTL,
5135                                                                        Template,
5136                                                                        SS);
5137   } else {
5138     // Nothing special needs to be done for these.
5139     Result = getDerived().TransformType(TLB, TL);
5140   }
5141 
5142   if (Result.isNull())
5143     return nullptr;
5144 
5145   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5146 }
5147 
5148 template <class TyLoc> static inline
5149 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
5150   TyLoc NewT = TLB.push<TyLoc>(T.getType());
5151   NewT.setNameLoc(T.getNameLoc());
5152   return T.getType();
5153 }
5154 
5155 template<typename Derived>
5156 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5157                                                       BuiltinTypeLoc T) {
5158   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
5159   NewT.setBuiltinLoc(T.getBuiltinLoc());
5160   if (T.needsExtraLocalData())
5161     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
5162   return T.getType();
5163 }
5164 
5165 template<typename Derived>
5166 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5167                                                       ComplexTypeLoc T) {
5168   // FIXME: recurse?
5169   return TransformTypeSpecType(TLB, T);
5170 }
5171 
5172 template <typename Derived>
5173 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5174                                                        AdjustedTypeLoc TL) {
5175   // Adjustments applied during transformation are handled elsewhere.
5176   return getDerived().TransformType(TLB, TL.getOriginalLoc());
5177 }
5178 
5179 template<typename Derived>
5180 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5181                                                       DecayedTypeLoc TL) {
5182   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5183   if (OriginalType.isNull())
5184     return QualType();
5185 
5186   QualType Result = TL.getType();
5187   if (getDerived().AlwaysRebuild() ||
5188       OriginalType != TL.getOriginalLoc().getType())
5189     Result = SemaRef.Context.getDecayedType(OriginalType);
5190   TLB.push<DecayedTypeLoc>(Result);
5191   // Nothing to set for DecayedTypeLoc.
5192   return Result;
5193 }
5194 
5195 template<typename Derived>
5196 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5197                                                       PointerTypeLoc TL) {
5198   QualType PointeeType
5199     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5200   if (PointeeType.isNull())
5201     return QualType();
5202 
5203   QualType Result = TL.getType();
5204   if (PointeeType->getAs<ObjCObjectType>()) {
5205     // A dependent pointer type 'T *' has is being transformed such
5206     // that an Objective-C class type is being replaced for 'T'. The
5207     // resulting pointer type is an ObjCObjectPointerType, not a
5208     // PointerType.
5209     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5210 
5211     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5212     NewT.setStarLoc(TL.getStarLoc());
5213     return Result;
5214   }
5215 
5216   if (getDerived().AlwaysRebuild() ||
5217       PointeeType != TL.getPointeeLoc().getType()) {
5218     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5219     if (Result.isNull())
5220       return QualType();
5221   }
5222 
5223   // Objective-C ARC can add lifetime qualifiers to the type that we're
5224   // pointing to.
5225   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5226 
5227   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5228   NewT.setSigilLoc(TL.getSigilLoc());
5229   return Result;
5230 }
5231 
5232 template<typename Derived>
5233 QualType
5234 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5235                                                   BlockPointerTypeLoc TL) {
5236   QualType PointeeType
5237     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5238   if (PointeeType.isNull())
5239     return QualType();
5240 
5241   QualType Result = TL.getType();
5242   if (getDerived().AlwaysRebuild() ||
5243       PointeeType != TL.getPointeeLoc().getType()) {
5244     Result = getDerived().RebuildBlockPointerType(PointeeType,
5245                                                   TL.getSigilLoc());
5246     if (Result.isNull())
5247       return QualType();
5248   }
5249 
5250   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5251   NewT.setSigilLoc(TL.getSigilLoc());
5252   return Result;
5253 }
5254 
5255 /// Transforms a reference type.  Note that somewhat paradoxically we
5256 /// don't care whether the type itself is an l-value type or an r-value
5257 /// type;  we only care if the type was *written* as an l-value type
5258 /// or an r-value type.
5259 template<typename Derived>
5260 QualType
5261 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5262                                                ReferenceTypeLoc TL) {
5263   const ReferenceType *T = TL.getTypePtr();
5264 
5265   // Note that this works with the pointee-as-written.
5266   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5267   if (PointeeType.isNull())
5268     return QualType();
5269 
5270   QualType Result = TL.getType();
5271   if (getDerived().AlwaysRebuild() ||
5272       PointeeType != T->getPointeeTypeAsWritten()) {
5273     Result = getDerived().RebuildReferenceType(PointeeType,
5274                                                T->isSpelledAsLValue(),
5275                                                TL.getSigilLoc());
5276     if (Result.isNull())
5277       return QualType();
5278   }
5279 
5280   // Objective-C ARC can add lifetime qualifiers to the type that we're
5281   // referring to.
5282   TLB.TypeWasModifiedSafely(
5283       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5284 
5285   // r-value references can be rebuilt as l-value references.
5286   ReferenceTypeLoc NewTL;
5287   if (isa<LValueReferenceType>(Result))
5288     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5289   else
5290     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5291   NewTL.setSigilLoc(TL.getSigilLoc());
5292 
5293   return Result;
5294 }
5295 
5296 template<typename Derived>
5297 QualType
5298 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5299                                                  LValueReferenceTypeLoc TL) {
5300   return TransformReferenceType(TLB, TL);
5301 }
5302 
5303 template<typename Derived>
5304 QualType
5305 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5306                                                  RValueReferenceTypeLoc TL) {
5307   return TransformReferenceType(TLB, TL);
5308 }
5309 
5310 template<typename Derived>
5311 QualType
5312 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5313                                                    MemberPointerTypeLoc TL) {
5314   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5315   if (PointeeType.isNull())
5316     return QualType();
5317 
5318   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5319   TypeSourceInfo *NewClsTInfo = nullptr;
5320   if (OldClsTInfo) {
5321     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5322     if (!NewClsTInfo)
5323       return QualType();
5324   }
5325 
5326   const MemberPointerType *T = TL.getTypePtr();
5327   QualType OldClsType = QualType(T->getClass(), 0);
5328   QualType NewClsType;
5329   if (NewClsTInfo)
5330     NewClsType = NewClsTInfo->getType();
5331   else {
5332     NewClsType = getDerived().TransformType(OldClsType);
5333     if (NewClsType.isNull())
5334       return QualType();
5335   }
5336 
5337   QualType Result = TL.getType();
5338   if (getDerived().AlwaysRebuild() ||
5339       PointeeType != T->getPointeeType() ||
5340       NewClsType != OldClsType) {
5341     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5342                                                    TL.getStarLoc());
5343     if (Result.isNull())
5344       return QualType();
5345   }
5346 
5347   // If we had to adjust the pointee type when building a member pointer, make
5348   // sure to push TypeLoc info for it.
5349   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5350   if (MPT && PointeeType != MPT->getPointeeType()) {
5351     assert(isa<AdjustedType>(MPT->getPointeeType()));
5352     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5353   }
5354 
5355   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5356   NewTL.setSigilLoc(TL.getSigilLoc());
5357   NewTL.setClassTInfo(NewClsTInfo);
5358 
5359   return Result;
5360 }
5361 
5362 template<typename Derived>
5363 QualType
5364 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5365                                                    ConstantArrayTypeLoc TL) {
5366   const ConstantArrayType *T = TL.getTypePtr();
5367   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5368   if (ElementType.isNull())
5369     return QualType();
5370 
5371   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5372   Expr *OldSize = TL.getSizeExpr();
5373   if (!OldSize)
5374     OldSize = const_cast<Expr*>(T->getSizeExpr());
5375   Expr *NewSize = nullptr;
5376   if (OldSize) {
5377     EnterExpressionEvaluationContext Unevaluated(
5378         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5379     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5380     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5381   }
5382 
5383   QualType Result = TL.getType();
5384   if (getDerived().AlwaysRebuild() ||
5385       ElementType != T->getElementType() ||
5386       (T->getSizeExpr() && NewSize != OldSize)) {
5387     Result = getDerived().RebuildConstantArrayType(ElementType,
5388                                                    T->getSizeModifier(),
5389                                                    T->getSize(), NewSize,
5390                                              T->getIndexTypeCVRQualifiers(),
5391                                                    TL.getBracketsRange());
5392     if (Result.isNull())
5393       return QualType();
5394   }
5395 
5396   // We might have either a ConstantArrayType or a VariableArrayType now:
5397   // a ConstantArrayType is allowed to have an element type which is a
5398   // VariableArrayType if the type is dependent.  Fortunately, all array
5399   // types have the same location layout.
5400   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5401   NewTL.setLBracketLoc(TL.getLBracketLoc());
5402   NewTL.setRBracketLoc(TL.getRBracketLoc());
5403   NewTL.setSizeExpr(NewSize);
5404 
5405   return Result;
5406 }
5407 
5408 template<typename Derived>
5409 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5410                                               TypeLocBuilder &TLB,
5411                                               IncompleteArrayTypeLoc TL) {
5412   const IncompleteArrayType *T = TL.getTypePtr();
5413   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5414   if (ElementType.isNull())
5415     return QualType();
5416 
5417   QualType Result = TL.getType();
5418   if (getDerived().AlwaysRebuild() ||
5419       ElementType != T->getElementType()) {
5420     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5421                                                      T->getSizeModifier(),
5422                                            T->getIndexTypeCVRQualifiers(),
5423                                                      TL.getBracketsRange());
5424     if (Result.isNull())
5425       return QualType();
5426   }
5427 
5428   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5429   NewTL.setLBracketLoc(TL.getLBracketLoc());
5430   NewTL.setRBracketLoc(TL.getRBracketLoc());
5431   NewTL.setSizeExpr(nullptr);
5432 
5433   return Result;
5434 }
5435 
5436 template<typename Derived>
5437 QualType
5438 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5439                                                    VariableArrayTypeLoc TL) {
5440   const VariableArrayType *T = TL.getTypePtr();
5441   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5442   if (ElementType.isNull())
5443     return QualType();
5444 
5445   ExprResult SizeResult;
5446   {
5447     EnterExpressionEvaluationContext Context(
5448         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5449     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5450   }
5451   if (SizeResult.isInvalid())
5452     return QualType();
5453   SizeResult =
5454       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5455   if (SizeResult.isInvalid())
5456     return QualType();
5457 
5458   Expr *Size = SizeResult.get();
5459 
5460   QualType Result = TL.getType();
5461   if (getDerived().AlwaysRebuild() ||
5462       ElementType != T->getElementType() ||
5463       Size != T->getSizeExpr()) {
5464     Result = getDerived().RebuildVariableArrayType(ElementType,
5465                                                    T->getSizeModifier(),
5466                                                    Size,
5467                                              T->getIndexTypeCVRQualifiers(),
5468                                                    TL.getBracketsRange());
5469     if (Result.isNull())
5470       return QualType();
5471   }
5472 
5473   // We might have constant size array now, but fortunately it has the same
5474   // location layout.
5475   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5476   NewTL.setLBracketLoc(TL.getLBracketLoc());
5477   NewTL.setRBracketLoc(TL.getRBracketLoc());
5478   NewTL.setSizeExpr(Size);
5479 
5480   return Result;
5481 }
5482 
5483 template<typename Derived>
5484 QualType
5485 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5486                                              DependentSizedArrayTypeLoc TL) {
5487   const DependentSizedArrayType *T = TL.getTypePtr();
5488   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5489   if (ElementType.isNull())
5490     return QualType();
5491 
5492   // Array bounds are constant expressions.
5493   EnterExpressionEvaluationContext Unevaluated(
5494       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5495 
5496   // If we have a VLA then it won't be a constant.
5497   SemaRef.ExprEvalContexts.back().InConditionallyConstantEvaluateContext = true;
5498 
5499   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5500   Expr *origSize = TL.getSizeExpr();
5501   if (!origSize) origSize = T->getSizeExpr();
5502 
5503   ExprResult sizeResult
5504     = getDerived().TransformExpr(origSize);
5505   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5506   if (sizeResult.isInvalid())
5507     return QualType();
5508 
5509   Expr *size = sizeResult.get();
5510 
5511   QualType Result = TL.getType();
5512   if (getDerived().AlwaysRebuild() ||
5513       ElementType != T->getElementType() ||
5514       size != origSize) {
5515     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5516                                                          T->getSizeModifier(),
5517                                                          size,
5518                                                 T->getIndexTypeCVRQualifiers(),
5519                                                         TL.getBracketsRange());
5520     if (Result.isNull())
5521       return QualType();
5522   }
5523 
5524   // We might have any sort of array type now, but fortunately they
5525   // all have the same location layout.
5526   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5527   NewTL.setLBracketLoc(TL.getLBracketLoc());
5528   NewTL.setRBracketLoc(TL.getRBracketLoc());
5529   NewTL.setSizeExpr(size);
5530 
5531   return Result;
5532 }
5533 
5534 template <typename Derived>
5535 QualType TreeTransform<Derived>::TransformDependentVectorType(
5536     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5537   const DependentVectorType *T = TL.getTypePtr();
5538   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5539   if (ElementType.isNull())
5540     return QualType();
5541 
5542   EnterExpressionEvaluationContext Unevaluated(
5543       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5544 
5545   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5546   Size = SemaRef.ActOnConstantExpression(Size);
5547   if (Size.isInvalid())
5548     return QualType();
5549 
5550   QualType Result = TL.getType();
5551   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5552       Size.get() != T->getSizeExpr()) {
5553     Result = getDerived().RebuildDependentVectorType(
5554         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5555     if (Result.isNull())
5556       return QualType();
5557   }
5558 
5559   // Result might be dependent or not.
5560   if (isa<DependentVectorType>(Result)) {
5561     DependentVectorTypeLoc NewTL =
5562         TLB.push<DependentVectorTypeLoc>(Result);
5563     NewTL.setNameLoc(TL.getNameLoc());
5564   } else {
5565     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5566     NewTL.setNameLoc(TL.getNameLoc());
5567   }
5568 
5569   return Result;
5570 }
5571 
5572 template<typename Derived>
5573 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5574                                       TypeLocBuilder &TLB,
5575                                       DependentSizedExtVectorTypeLoc TL) {
5576   const DependentSizedExtVectorType *T = TL.getTypePtr();
5577 
5578   // FIXME: ext vector locs should be nested
5579   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5580   if (ElementType.isNull())
5581     return QualType();
5582 
5583   // Vector sizes are constant expressions.
5584   EnterExpressionEvaluationContext Unevaluated(
5585       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5586 
5587   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5588   Size = SemaRef.ActOnConstantExpression(Size);
5589   if (Size.isInvalid())
5590     return QualType();
5591 
5592   QualType Result = TL.getType();
5593   if (getDerived().AlwaysRebuild() ||
5594       ElementType != T->getElementType() ||
5595       Size.get() != T->getSizeExpr()) {
5596     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5597                                                              Size.get(),
5598                                                          T->getAttributeLoc());
5599     if (Result.isNull())
5600       return QualType();
5601   }
5602 
5603   // Result might be dependent or not.
5604   if (isa<DependentSizedExtVectorType>(Result)) {
5605     DependentSizedExtVectorTypeLoc NewTL
5606       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5607     NewTL.setNameLoc(TL.getNameLoc());
5608   } else {
5609     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5610     NewTL.setNameLoc(TL.getNameLoc());
5611   }
5612 
5613   return Result;
5614 }
5615 
5616 template <typename Derived>
5617 QualType
5618 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5619                                                     ConstantMatrixTypeLoc TL) {
5620   const ConstantMatrixType *T = TL.getTypePtr();
5621   QualType ElementType = getDerived().TransformType(T->getElementType());
5622   if (ElementType.isNull())
5623     return QualType();
5624 
5625   QualType Result = TL.getType();
5626   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5627     Result = getDerived().RebuildConstantMatrixType(
5628         ElementType, T->getNumRows(), T->getNumColumns());
5629     if (Result.isNull())
5630       return QualType();
5631   }
5632 
5633   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5634   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5635   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5636   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5637   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5638 
5639   return Result;
5640 }
5641 
5642 template <typename Derived>
5643 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5644     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5645   const DependentSizedMatrixType *T = TL.getTypePtr();
5646 
5647   QualType ElementType = getDerived().TransformType(T->getElementType());
5648   if (ElementType.isNull()) {
5649     return QualType();
5650   }
5651 
5652   // Matrix dimensions are constant expressions.
5653   EnterExpressionEvaluationContext Unevaluated(
5654       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5655 
5656   Expr *origRows = TL.getAttrRowOperand();
5657   if (!origRows)
5658     origRows = T->getRowExpr();
5659   Expr *origColumns = TL.getAttrColumnOperand();
5660   if (!origColumns)
5661     origColumns = T->getColumnExpr();
5662 
5663   ExprResult rowResult = getDerived().TransformExpr(origRows);
5664   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5665   if (rowResult.isInvalid())
5666     return QualType();
5667 
5668   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5669   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5670   if (columnResult.isInvalid())
5671     return QualType();
5672 
5673   Expr *rows = rowResult.get();
5674   Expr *columns = columnResult.get();
5675 
5676   QualType Result = TL.getType();
5677   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5678       rows != origRows || columns != origColumns) {
5679     Result = getDerived().RebuildDependentSizedMatrixType(
5680         ElementType, rows, columns, T->getAttributeLoc());
5681 
5682     if (Result.isNull())
5683       return QualType();
5684   }
5685 
5686   // We might have any sort of matrix type now, but fortunately they
5687   // all have the same location layout.
5688   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5689   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5690   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5691   NewTL.setAttrRowOperand(rows);
5692   NewTL.setAttrColumnOperand(columns);
5693   return Result;
5694 }
5695 
5696 template <typename Derived>
5697 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5698     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5699   const DependentAddressSpaceType *T = TL.getTypePtr();
5700 
5701   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5702 
5703   if (pointeeType.isNull())
5704     return QualType();
5705 
5706   // Address spaces are constant expressions.
5707   EnterExpressionEvaluationContext Unevaluated(
5708       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5709 
5710   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5711   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5712   if (AddrSpace.isInvalid())
5713     return QualType();
5714 
5715   QualType Result = TL.getType();
5716   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5717       AddrSpace.get() != T->getAddrSpaceExpr()) {
5718     Result = getDerived().RebuildDependentAddressSpaceType(
5719         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5720     if (Result.isNull())
5721       return QualType();
5722   }
5723 
5724   // Result might be dependent or not.
5725   if (isa<DependentAddressSpaceType>(Result)) {
5726     DependentAddressSpaceTypeLoc NewTL =
5727         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5728 
5729     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5730     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5731     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5732 
5733   } else {
5734     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5735         Result, getDerived().getBaseLocation());
5736     TransformType(TLB, DI->getTypeLoc());
5737   }
5738 
5739   return Result;
5740 }
5741 
5742 template <typename Derived>
5743 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5744                                                      VectorTypeLoc TL) {
5745   const VectorType *T = TL.getTypePtr();
5746   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5747   if (ElementType.isNull())
5748     return QualType();
5749 
5750   QualType Result = TL.getType();
5751   if (getDerived().AlwaysRebuild() ||
5752       ElementType != T->getElementType()) {
5753     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5754                                             T->getVectorKind());
5755     if (Result.isNull())
5756       return QualType();
5757   }
5758 
5759   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5760   NewTL.setNameLoc(TL.getNameLoc());
5761 
5762   return Result;
5763 }
5764 
5765 template<typename Derived>
5766 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5767                                                         ExtVectorTypeLoc TL) {
5768   const VectorType *T = TL.getTypePtr();
5769   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5770   if (ElementType.isNull())
5771     return QualType();
5772 
5773   QualType Result = TL.getType();
5774   if (getDerived().AlwaysRebuild() ||
5775       ElementType != T->getElementType()) {
5776     Result = getDerived().RebuildExtVectorType(ElementType,
5777                                                T->getNumElements(),
5778                                                /*FIXME*/ SourceLocation());
5779     if (Result.isNull())
5780       return QualType();
5781   }
5782 
5783   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5784   NewTL.setNameLoc(TL.getNameLoc());
5785 
5786   return Result;
5787 }
5788 
5789 template <typename Derived>
5790 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5791     ParmVarDecl *OldParm, int indexAdjustment,
5792     std::optional<unsigned> NumExpansions, bool ExpectParameterPack) {
5793   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5794   TypeSourceInfo *NewDI = nullptr;
5795 
5796   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5797     // If we're substituting into a pack expansion type and we know the
5798     // length we want to expand to, just substitute for the pattern.
5799     TypeLoc OldTL = OldDI->getTypeLoc();
5800     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5801 
5802     TypeLocBuilder TLB;
5803     TypeLoc NewTL = OldDI->getTypeLoc();
5804     TLB.reserve(NewTL.getFullDataSize());
5805 
5806     QualType Result = getDerived().TransformType(TLB,
5807                                                OldExpansionTL.getPatternLoc());
5808     if (Result.isNull())
5809       return nullptr;
5810 
5811     Result = RebuildPackExpansionType(Result,
5812                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5813                                       OldExpansionTL.getEllipsisLoc(),
5814                                       NumExpansions);
5815     if (Result.isNull())
5816       return nullptr;
5817 
5818     PackExpansionTypeLoc NewExpansionTL
5819       = TLB.push<PackExpansionTypeLoc>(Result);
5820     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5821     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5822   } else
5823     NewDI = getDerived().TransformType(OldDI);
5824   if (!NewDI)
5825     return nullptr;
5826 
5827   if (NewDI == OldDI && indexAdjustment == 0)
5828     return OldParm;
5829 
5830   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5831                                              OldParm->getDeclContext(),
5832                                              OldParm->getInnerLocStart(),
5833                                              OldParm->getLocation(),
5834                                              OldParm->getIdentifier(),
5835                                              NewDI->getType(),
5836                                              NewDI,
5837                                              OldParm->getStorageClass(),
5838                                              /* DefArg */ nullptr);
5839   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5840                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5841   transformedLocalDecl(OldParm, {newParm});
5842   return newParm;
5843 }
5844 
5845 template <typename Derived>
5846 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5847     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5848     const QualType *ParamTypes,
5849     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5850     SmallVectorImpl<QualType> &OutParamTypes,
5851     SmallVectorImpl<ParmVarDecl *> *PVars,
5852     Sema::ExtParameterInfoBuilder &PInfos,
5853     unsigned *LastParamTransformed) {
5854   int indexAdjustment = 0;
5855 
5856   unsigned NumParams = Params.size();
5857   for (unsigned i = 0; i != NumParams; ++i) {
5858     if (LastParamTransformed)
5859       *LastParamTransformed = i;
5860     if (ParmVarDecl *OldParm = Params[i]) {
5861       assert(OldParm->getFunctionScopeIndex() == i);
5862 
5863       std::optional<unsigned> NumExpansions;
5864       ParmVarDecl *NewParm = nullptr;
5865       if (OldParm->isParameterPack()) {
5866         // We have a function parameter pack that may need to be expanded.
5867         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5868 
5869         // Find the parameter packs that could be expanded.
5870         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5871         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5872         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5873         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5874 
5875         // Determine whether we should expand the parameter packs.
5876         bool ShouldExpand = false;
5877         bool RetainExpansion = false;
5878         std::optional<unsigned> OrigNumExpansions;
5879         if (Unexpanded.size() > 0) {
5880           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5881           NumExpansions = OrigNumExpansions;
5882           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5883                                                    Pattern.getSourceRange(),
5884                                                    Unexpanded,
5885                                                    ShouldExpand,
5886                                                    RetainExpansion,
5887                                                    NumExpansions)) {
5888             return true;
5889           }
5890         } else {
5891 #ifndef NDEBUG
5892           const AutoType *AT =
5893               Pattern.getType().getTypePtr()->getContainedAutoType();
5894           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5895                  "Could not find parameter packs or undeduced auto type!");
5896 #endif
5897         }
5898 
5899         if (ShouldExpand) {
5900           // Expand the function parameter pack into multiple, separate
5901           // parameters.
5902           getDerived().ExpandingFunctionParameterPack(OldParm);
5903           for (unsigned I = 0; I != *NumExpansions; ++I) {
5904             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5905             ParmVarDecl *NewParm
5906               = getDerived().TransformFunctionTypeParam(OldParm,
5907                                                         indexAdjustment++,
5908                                                         OrigNumExpansions,
5909                                                 /*ExpectParameterPack=*/false);
5910             if (!NewParm)
5911               return true;
5912 
5913             if (ParamInfos)
5914               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5915             OutParamTypes.push_back(NewParm->getType());
5916             if (PVars)
5917               PVars->push_back(NewParm);
5918           }
5919 
5920           // If we're supposed to retain a pack expansion, do so by temporarily
5921           // forgetting the partially-substituted parameter pack.
5922           if (RetainExpansion) {
5923             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5924             ParmVarDecl *NewParm
5925               = getDerived().TransformFunctionTypeParam(OldParm,
5926                                                         indexAdjustment++,
5927                                                         OrigNumExpansions,
5928                                                 /*ExpectParameterPack=*/false);
5929             if (!NewParm)
5930               return true;
5931 
5932             if (ParamInfos)
5933               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5934             OutParamTypes.push_back(NewParm->getType());
5935             if (PVars)
5936               PVars->push_back(NewParm);
5937           }
5938 
5939           // The next parameter should have the same adjustment as the
5940           // last thing we pushed, but we post-incremented indexAdjustment
5941           // on every push.  Also, if we push nothing, the adjustment should
5942           // go down by one.
5943           indexAdjustment--;
5944 
5945           // We're done with the pack expansion.
5946           continue;
5947         }
5948 
5949         // We'll substitute the parameter now without expanding the pack
5950         // expansion.
5951         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5952         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5953                                                           indexAdjustment,
5954                                                           NumExpansions,
5955                                                   /*ExpectParameterPack=*/true);
5956         assert(NewParm->isParameterPack() &&
5957                "Parameter pack no longer a parameter pack after "
5958                "transformation.");
5959       } else {
5960         NewParm = getDerived().TransformFunctionTypeParam(
5961             OldParm, indexAdjustment, std::nullopt,
5962             /*ExpectParameterPack=*/false);
5963       }
5964 
5965       if (!NewParm)
5966         return true;
5967 
5968       if (ParamInfos)
5969         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5970       OutParamTypes.push_back(NewParm->getType());
5971       if (PVars)
5972         PVars->push_back(NewParm);
5973       continue;
5974     }
5975 
5976     // Deal with the possibility that we don't have a parameter
5977     // declaration for this parameter.
5978     assert(ParamTypes);
5979     QualType OldType = ParamTypes[i];
5980     bool IsPackExpansion = false;
5981     std::optional<unsigned> NumExpansions;
5982     QualType NewType;
5983     if (const PackExpansionType *Expansion
5984                                        = dyn_cast<PackExpansionType>(OldType)) {
5985       // We have a function parameter pack that may need to be expanded.
5986       QualType Pattern = Expansion->getPattern();
5987       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5988       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5989 
5990       // Determine whether we should expand the parameter packs.
5991       bool ShouldExpand = false;
5992       bool RetainExpansion = false;
5993       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5994                                                Unexpanded,
5995                                                ShouldExpand,
5996                                                RetainExpansion,
5997                                                NumExpansions)) {
5998         return true;
5999       }
6000 
6001       if (ShouldExpand) {
6002         // Expand the function parameter pack into multiple, separate
6003         // parameters.
6004         for (unsigned I = 0; I != *NumExpansions; ++I) {
6005           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
6006           QualType NewType = getDerived().TransformType(Pattern);
6007           if (NewType.isNull())
6008             return true;
6009 
6010           if (NewType->containsUnexpandedParameterPack()) {
6011             NewType = getSema().getASTContext().getPackExpansionType(
6012                 NewType, std::nullopt);
6013 
6014             if (NewType.isNull())
6015               return true;
6016           }
6017 
6018           if (ParamInfos)
6019             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6020           OutParamTypes.push_back(NewType);
6021           if (PVars)
6022             PVars->push_back(nullptr);
6023         }
6024 
6025         // We're done with the pack expansion.
6026         continue;
6027       }
6028 
6029       // If we're supposed to retain a pack expansion, do so by temporarily
6030       // forgetting the partially-substituted parameter pack.
6031       if (RetainExpansion) {
6032         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6033         QualType NewType = getDerived().TransformType(Pattern);
6034         if (NewType.isNull())
6035           return true;
6036 
6037         if (ParamInfos)
6038           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6039         OutParamTypes.push_back(NewType);
6040         if (PVars)
6041           PVars->push_back(nullptr);
6042       }
6043 
6044       // We'll substitute the parameter now without expanding the pack
6045       // expansion.
6046       OldType = Expansion->getPattern();
6047       IsPackExpansion = true;
6048       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6049       NewType = getDerived().TransformType(OldType);
6050     } else {
6051       NewType = getDerived().TransformType(OldType);
6052     }
6053 
6054     if (NewType.isNull())
6055       return true;
6056 
6057     if (IsPackExpansion)
6058       NewType = getSema().Context.getPackExpansionType(NewType,
6059                                                        NumExpansions);
6060 
6061     if (ParamInfos)
6062       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6063     OutParamTypes.push_back(NewType);
6064     if (PVars)
6065       PVars->push_back(nullptr);
6066   }
6067 
6068 #ifndef NDEBUG
6069   if (PVars) {
6070     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
6071       if (ParmVarDecl *parm = (*PVars)[i])
6072         assert(parm->getFunctionScopeIndex() == i);
6073   }
6074 #endif
6075 
6076   return false;
6077 }
6078 
6079 template<typename Derived>
6080 QualType
6081 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
6082                                                    FunctionProtoTypeLoc TL) {
6083   SmallVector<QualType, 4> ExceptionStorage;
6084   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
6085   return getDerived().TransformFunctionProtoType(
6086       TLB, TL, nullptr, Qualifiers(),
6087       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
6088         return This->getDerived().TransformExceptionSpec(
6089             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
6090       });
6091 }
6092 
6093 template<typename Derived> template<typename Fn>
6094 QualType TreeTransform<Derived>::TransformFunctionProtoType(
6095     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
6096     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6097 
6098   // Transform the parameters and return type.
6099   //
6100   // We are required to instantiate the params and return type in source order.
6101   // When the function has a trailing return type, we instantiate the
6102   // parameters before the return type,  since the return type can then refer
6103   // to the parameters themselves (via decltype, sizeof, etc.).
6104   //
6105   SmallVector<QualType, 4> ParamTypes;
6106   SmallVector<ParmVarDecl*, 4> ParamDecls;
6107   Sema::ExtParameterInfoBuilder ExtParamInfos;
6108   const FunctionProtoType *T = TL.getTypePtr();
6109 
6110   QualType ResultType;
6111 
6112   if (T->hasTrailingReturn()) {
6113     if (getDerived().TransformFunctionTypeParams(
6114             TL.getBeginLoc(), TL.getParams(),
6115             TL.getTypePtr()->param_type_begin(),
6116             T->getExtParameterInfosOrNull(),
6117             ParamTypes, &ParamDecls, ExtParamInfos))
6118       return QualType();
6119 
6120     {
6121       // C++11 [expr.prim.general]p3:
6122       //   If a declaration declares a member function or member function
6123       //   template of a class X, the expression this is a prvalue of type
6124       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6125       //   and the end of the function-definition, member-declarator, or
6126       //   declarator.
6127       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
6128 
6129       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6130       if (ResultType.isNull())
6131         return QualType();
6132     }
6133   }
6134   else {
6135     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6136     if (ResultType.isNull())
6137       return QualType();
6138 
6139     if (getDerived().TransformFunctionTypeParams(
6140             TL.getBeginLoc(), TL.getParams(),
6141             TL.getTypePtr()->param_type_begin(),
6142             T->getExtParameterInfosOrNull(),
6143             ParamTypes, &ParamDecls, ExtParamInfos))
6144       return QualType();
6145   }
6146 
6147   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
6148 
6149   bool EPIChanged = false;
6150   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
6151     return QualType();
6152 
6153   // Handle extended parameter information.
6154   if (auto NewExtParamInfos =
6155         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
6156     if (!EPI.ExtParameterInfos ||
6157         llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) !=
6158             llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) {
6159       EPIChanged = true;
6160     }
6161     EPI.ExtParameterInfos = NewExtParamInfos;
6162   } else if (EPI.ExtParameterInfos) {
6163     EPIChanged = true;
6164     EPI.ExtParameterInfos = nullptr;
6165   }
6166 
6167   QualType Result = TL.getType();
6168   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
6169       T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) {
6170     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6171     if (Result.isNull())
6172       return QualType();
6173   }
6174 
6175   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
6176   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6177   NewTL.setLParenLoc(TL.getLParenLoc());
6178   NewTL.setRParenLoc(TL.getRParenLoc());
6179   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
6180   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6181   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
6182     NewTL.setParam(i, ParamDecls[i]);
6183 
6184   return Result;
6185 }
6186 
6187 template<typename Derived>
6188 bool TreeTransform<Derived>::TransformExceptionSpec(
6189     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
6190     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
6191   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
6192 
6193   // Instantiate a dynamic noexcept expression, if any.
6194   if (isComputedNoexcept(ESI.Type)) {
6195     // Update this scrope because ContextDecl in Sema will be used in
6196     // TransformExpr.
6197     auto *Method = dyn_cast_if_present<CXXMethodDecl>(ESI.SourceTemplate);
6198     Sema::CXXThisScopeRAII ThisScope(
6199         SemaRef, Method ? Method->getParent() : nullptr,
6200         Method ? Method->getMethodQualifiers() : Qualifiers{},
6201         Method != nullptr);
6202     EnterExpressionEvaluationContext Unevaluated(
6203         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6204     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
6205     if (NoexceptExpr.isInvalid())
6206       return true;
6207 
6208     ExceptionSpecificationType EST = ESI.Type;
6209     NoexceptExpr =
6210         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
6211     if (NoexceptExpr.isInvalid())
6212       return true;
6213 
6214     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6215       Changed = true;
6216     ESI.NoexceptExpr = NoexceptExpr.get();
6217     ESI.Type = EST;
6218   }
6219 
6220   if (ESI.Type != EST_Dynamic)
6221     return false;
6222 
6223   // Instantiate a dynamic exception specification's type.
6224   for (QualType T : ESI.Exceptions) {
6225     if (const PackExpansionType *PackExpansion =
6226             T->getAs<PackExpansionType>()) {
6227       Changed = true;
6228 
6229       // We have a pack expansion. Instantiate it.
6230       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6231       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6232                                               Unexpanded);
6233       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6234 
6235       // Determine whether the set of unexpanded parameter packs can and
6236       // should
6237       // be expanded.
6238       bool Expand = false;
6239       bool RetainExpansion = false;
6240       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6241       // FIXME: Track the location of the ellipsis (and track source location
6242       // information for the types in the exception specification in general).
6243       if (getDerived().TryExpandParameterPacks(
6244               Loc, SourceRange(), Unexpanded, Expand,
6245               RetainExpansion, NumExpansions))
6246         return true;
6247 
6248       if (!Expand) {
6249         // We can't expand this pack expansion into separate arguments yet;
6250         // just substitute into the pattern and create a new pack expansion
6251         // type.
6252         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6253         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6254         if (U.isNull())
6255           return true;
6256 
6257         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6258         Exceptions.push_back(U);
6259         continue;
6260       }
6261 
6262       // Substitute into the pack expansion pattern for each slice of the
6263       // pack.
6264       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6265         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6266 
6267         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6268         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6269           return true;
6270 
6271         Exceptions.push_back(U);
6272       }
6273     } else {
6274       QualType U = getDerived().TransformType(T);
6275       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6276         return true;
6277       if (T != U)
6278         Changed = true;
6279 
6280       Exceptions.push_back(U);
6281     }
6282   }
6283 
6284   ESI.Exceptions = Exceptions;
6285   if (ESI.Exceptions.empty())
6286     ESI.Type = EST_DynamicNone;
6287   return false;
6288 }
6289 
6290 template<typename Derived>
6291 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6292                                                  TypeLocBuilder &TLB,
6293                                                  FunctionNoProtoTypeLoc TL) {
6294   const FunctionNoProtoType *T = TL.getTypePtr();
6295   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6296   if (ResultType.isNull())
6297     return QualType();
6298 
6299   QualType Result = TL.getType();
6300   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6301     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6302 
6303   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6304   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6305   NewTL.setLParenLoc(TL.getLParenLoc());
6306   NewTL.setRParenLoc(TL.getRParenLoc());
6307   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6308 
6309   return Result;
6310 }
6311 
6312 template <typename Derived>
6313 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6314     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6315   const UnresolvedUsingType *T = TL.getTypePtr();
6316   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6317   if (!D)
6318     return QualType();
6319 
6320   QualType Result = TL.getType();
6321   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6322     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6323     if (Result.isNull())
6324       return QualType();
6325   }
6326 
6327   // We might get an arbitrary type spec type back.  We should at
6328   // least always get a type spec type, though.
6329   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6330   NewTL.setNameLoc(TL.getNameLoc());
6331 
6332   return Result;
6333 }
6334 
6335 template <typename Derived>
6336 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6337                                                     UsingTypeLoc TL) {
6338   const UsingType *T = TL.getTypePtr();
6339 
6340   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6341       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6342   if (!Found)
6343     return QualType();
6344 
6345   QualType Underlying = getDerived().TransformType(T->desugar());
6346   if (Underlying.isNull())
6347     return QualType();
6348 
6349   QualType Result = TL.getType();
6350   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6351       Underlying != T->getUnderlyingType()) {
6352     Result = getDerived().RebuildUsingType(Found, Underlying);
6353     if (Result.isNull())
6354       return QualType();
6355   }
6356 
6357   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6358   return Result;
6359 }
6360 
6361 template<typename Derived>
6362 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6363                                                       TypedefTypeLoc TL) {
6364   const TypedefType *T = TL.getTypePtr();
6365   TypedefNameDecl *Typedef
6366     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6367                                                                T->getDecl()));
6368   if (!Typedef)
6369     return QualType();
6370 
6371   QualType Result = TL.getType();
6372   if (getDerived().AlwaysRebuild() ||
6373       Typedef != T->getDecl()) {
6374     Result = getDerived().RebuildTypedefType(Typedef);
6375     if (Result.isNull())
6376       return QualType();
6377   }
6378 
6379   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6380   NewTL.setNameLoc(TL.getNameLoc());
6381 
6382   return Result;
6383 }
6384 
6385 template<typename Derived>
6386 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6387                                                       TypeOfExprTypeLoc TL) {
6388   // typeof expressions are not potentially evaluated contexts
6389   EnterExpressionEvaluationContext Unevaluated(
6390       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6391       Sema::ReuseLambdaContextDecl);
6392 
6393   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6394   if (E.isInvalid())
6395     return QualType();
6396 
6397   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6398   if (E.isInvalid())
6399     return QualType();
6400 
6401   QualType Result = TL.getType();
6402   TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind();
6403   if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) {
6404     Result =
6405         getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind);
6406     if (Result.isNull())
6407       return QualType();
6408   }
6409 
6410   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6411   NewTL.setTypeofLoc(TL.getTypeofLoc());
6412   NewTL.setLParenLoc(TL.getLParenLoc());
6413   NewTL.setRParenLoc(TL.getRParenLoc());
6414 
6415   return Result;
6416 }
6417 
6418 template<typename Derived>
6419 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6420                                                      TypeOfTypeLoc TL) {
6421   TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6422   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6423   if (!New_Under_TI)
6424     return QualType();
6425 
6426   QualType Result = TL.getType();
6427   TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind();
6428   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6429     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6430     if (Result.isNull())
6431       return QualType();
6432   }
6433 
6434   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6435   NewTL.setTypeofLoc(TL.getTypeofLoc());
6436   NewTL.setLParenLoc(TL.getLParenLoc());
6437   NewTL.setRParenLoc(TL.getRParenLoc());
6438   NewTL.setUnmodifiedTInfo(New_Under_TI);
6439 
6440   return Result;
6441 }
6442 
6443 template<typename Derived>
6444 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6445                                                        DecltypeTypeLoc TL) {
6446   const DecltypeType *T = TL.getTypePtr();
6447 
6448   // decltype expressions are not potentially evaluated contexts
6449   EnterExpressionEvaluationContext Unevaluated(
6450       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6451       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6452 
6453   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6454   if (E.isInvalid())
6455     return QualType();
6456 
6457   E = getSema().ActOnDecltypeExpression(E.get());
6458   if (E.isInvalid())
6459     return QualType();
6460 
6461   QualType Result = TL.getType();
6462   if (getDerived().AlwaysRebuild() ||
6463       E.get() != T->getUnderlyingExpr()) {
6464     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6465     if (Result.isNull())
6466       return QualType();
6467   }
6468   else E.get();
6469 
6470   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6471   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6472   NewTL.setRParenLoc(TL.getRParenLoc());
6473   return Result;
6474 }
6475 
6476 template<typename Derived>
6477 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6478                                                             TypeLocBuilder &TLB,
6479                                                      UnaryTransformTypeLoc TL) {
6480   QualType Result = TL.getType();
6481   if (Result->isDependentType()) {
6482     const UnaryTransformType *T = TL.getTypePtr();
6483     QualType NewBase =
6484       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6485     Result = getDerived().RebuildUnaryTransformType(NewBase,
6486                                                     T->getUTTKind(),
6487                                                     TL.getKWLoc());
6488     if (Result.isNull())
6489       return QualType();
6490   }
6491 
6492   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6493   NewTL.setKWLoc(TL.getKWLoc());
6494   NewTL.setParensRange(TL.getParensRange());
6495   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6496   return Result;
6497 }
6498 
6499 template<typename Derived>
6500 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6501     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6502   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6503 
6504   CXXScopeSpec SS;
6505   TemplateName TemplateName = getDerived().TransformTemplateName(
6506       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6507   if (TemplateName.isNull())
6508     return QualType();
6509 
6510   QualType OldDeduced = T->getDeducedType();
6511   QualType NewDeduced;
6512   if (!OldDeduced.isNull()) {
6513     NewDeduced = getDerived().TransformType(OldDeduced);
6514     if (NewDeduced.isNull())
6515       return QualType();
6516   }
6517 
6518   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6519       TemplateName, NewDeduced);
6520   if (Result.isNull())
6521     return QualType();
6522 
6523   DeducedTemplateSpecializationTypeLoc NewTL =
6524       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6525   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6526 
6527   return Result;
6528 }
6529 
6530 template<typename Derived>
6531 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6532                                                      RecordTypeLoc TL) {
6533   const RecordType *T = TL.getTypePtr();
6534   RecordDecl *Record
6535     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6536                                                           T->getDecl()));
6537   if (!Record)
6538     return QualType();
6539 
6540   QualType Result = TL.getType();
6541   if (getDerived().AlwaysRebuild() ||
6542       Record != T->getDecl()) {
6543     Result = getDerived().RebuildRecordType(Record);
6544     if (Result.isNull())
6545       return QualType();
6546   }
6547 
6548   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6549   NewTL.setNameLoc(TL.getNameLoc());
6550 
6551   return Result;
6552 }
6553 
6554 template<typename Derived>
6555 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6556                                                    EnumTypeLoc TL) {
6557   const EnumType *T = TL.getTypePtr();
6558   EnumDecl *Enum
6559     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6560                                                         T->getDecl()));
6561   if (!Enum)
6562     return QualType();
6563 
6564   QualType Result = TL.getType();
6565   if (getDerived().AlwaysRebuild() ||
6566       Enum != T->getDecl()) {
6567     Result = getDerived().RebuildEnumType(Enum);
6568     if (Result.isNull())
6569       return QualType();
6570   }
6571 
6572   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6573   NewTL.setNameLoc(TL.getNameLoc());
6574 
6575   return Result;
6576 }
6577 
6578 template<typename Derived>
6579 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6580                                          TypeLocBuilder &TLB,
6581                                          InjectedClassNameTypeLoc TL) {
6582   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6583                                        TL.getTypePtr()->getDecl());
6584   if (!D) return QualType();
6585 
6586   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6587   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6588   return T;
6589 }
6590 
6591 template<typename Derived>
6592 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6593                                                 TypeLocBuilder &TLB,
6594                                                 TemplateTypeParmTypeLoc TL) {
6595   return getDerived().TransformTemplateTypeParmType(
6596       TLB, TL,
6597       /*SuppressObjCLifetime=*/false);
6598 }
6599 
6600 template <typename Derived>
6601 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6602     TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) {
6603   return TransformTypeSpecType(TLB, TL);
6604 }
6605 
6606 template<typename Derived>
6607 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6608                                          TypeLocBuilder &TLB,
6609                                          SubstTemplateTypeParmTypeLoc TL) {
6610   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6611 
6612   Decl *NewReplaced =
6613       getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
6614 
6615   // Substitute into the replacement type, which itself might involve something
6616   // that needs to be transformed. This only tends to occur with default
6617   // template arguments of template template parameters.
6618   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6619   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6620   if (Replacement.isNull())
6621     return QualType();
6622 
6623   QualType Result = SemaRef.Context.getSubstTemplateTypeParmType(
6624       Replacement, NewReplaced, T->getIndex(), T->getPackIndex());
6625 
6626   // Propagate type-source information.
6627   SubstTemplateTypeParmTypeLoc NewTL
6628     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6629   NewTL.setNameLoc(TL.getNameLoc());
6630   return Result;
6631 
6632 }
6633 
6634 template<typename Derived>
6635 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6636                                           TypeLocBuilder &TLB,
6637                                           SubstTemplateTypeParmPackTypeLoc TL) {
6638   return getDerived().TransformSubstTemplateTypeParmPackType(
6639       TLB, TL, /*SuppressObjCLifetime=*/false);
6640 }
6641 
6642 template <typename Derived>
6643 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6644     TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) {
6645   return TransformTypeSpecType(TLB, TL);
6646 }
6647 
6648 template<typename Derived>
6649 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6650                                                         TypeLocBuilder &TLB,
6651                                            TemplateSpecializationTypeLoc TL) {
6652   const TemplateSpecializationType *T = TL.getTypePtr();
6653 
6654   // The nested-name-specifier never matters in a TemplateSpecializationType,
6655   // because we can't have a dependent nested-name-specifier anyway.
6656   CXXScopeSpec SS;
6657   TemplateName Template
6658     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6659                                          TL.getTemplateNameLoc());
6660   if (Template.isNull())
6661     return QualType();
6662 
6663   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6664 }
6665 
6666 template<typename Derived>
6667 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6668                                                      AtomicTypeLoc TL) {
6669   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6670   if (ValueType.isNull())
6671     return QualType();
6672 
6673   QualType Result = TL.getType();
6674   if (getDerived().AlwaysRebuild() ||
6675       ValueType != TL.getValueLoc().getType()) {
6676     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6677     if (Result.isNull())
6678       return QualType();
6679   }
6680 
6681   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6682   NewTL.setKWLoc(TL.getKWLoc());
6683   NewTL.setLParenLoc(TL.getLParenLoc());
6684   NewTL.setRParenLoc(TL.getRParenLoc());
6685 
6686   return Result;
6687 }
6688 
6689 template <typename Derived>
6690 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6691                                                    PipeTypeLoc TL) {
6692   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6693   if (ValueType.isNull())
6694     return QualType();
6695 
6696   QualType Result = TL.getType();
6697   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6698     const PipeType *PT = Result->castAs<PipeType>();
6699     bool isReadPipe = PT->isReadOnly();
6700     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6701     if (Result.isNull())
6702       return QualType();
6703   }
6704 
6705   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6706   NewTL.setKWLoc(TL.getKWLoc());
6707 
6708   return Result;
6709 }
6710 
6711 template <typename Derived>
6712 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6713                                                      BitIntTypeLoc TL) {
6714   const BitIntType *EIT = TL.getTypePtr();
6715   QualType Result = TL.getType();
6716 
6717   if (getDerived().AlwaysRebuild()) {
6718     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6719                                             EIT->getNumBits(), TL.getNameLoc());
6720     if (Result.isNull())
6721       return QualType();
6722   }
6723 
6724   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6725   NewTL.setNameLoc(TL.getNameLoc());
6726   return Result;
6727 }
6728 
6729 template <typename Derived>
6730 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6731     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6732   const DependentBitIntType *EIT = TL.getTypePtr();
6733 
6734   EnterExpressionEvaluationContext Unevaluated(
6735       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6736   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6737   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6738 
6739   if (BitsExpr.isInvalid())
6740     return QualType();
6741 
6742   QualType Result = TL.getType();
6743 
6744   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6745     Result = getDerived().RebuildDependentBitIntType(
6746         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6747 
6748     if (Result.isNull())
6749       return QualType();
6750   }
6751 
6752   if (isa<DependentBitIntType>(Result)) {
6753     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6754     NewTL.setNameLoc(TL.getNameLoc());
6755   } else {
6756     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6757     NewTL.setNameLoc(TL.getNameLoc());
6758   }
6759   return Result;
6760 }
6761 
6762   /// Simple iterator that traverses the template arguments in a
6763   /// container that provides a \c getArgLoc() member function.
6764   ///
6765   /// This iterator is intended to be used with the iterator form of
6766   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6767   template<typename ArgLocContainer>
6768   class TemplateArgumentLocContainerIterator {
6769     ArgLocContainer *Container;
6770     unsigned Index;
6771 
6772   public:
6773     typedef TemplateArgumentLoc value_type;
6774     typedef TemplateArgumentLoc reference;
6775     typedef int difference_type;
6776     typedef std::input_iterator_tag iterator_category;
6777 
6778     class pointer {
6779       TemplateArgumentLoc Arg;
6780 
6781     public:
6782       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6783 
6784       const TemplateArgumentLoc *operator->() const {
6785         return &Arg;
6786       }
6787     };
6788 
6789 
6790     TemplateArgumentLocContainerIterator() {}
6791 
6792     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6793                                  unsigned Index)
6794       : Container(&Container), Index(Index) { }
6795 
6796     TemplateArgumentLocContainerIterator &operator++() {
6797       ++Index;
6798       return *this;
6799     }
6800 
6801     TemplateArgumentLocContainerIterator operator++(int) {
6802       TemplateArgumentLocContainerIterator Old(*this);
6803       ++(*this);
6804       return Old;
6805     }
6806 
6807     TemplateArgumentLoc operator*() const {
6808       return Container->getArgLoc(Index);
6809     }
6810 
6811     pointer operator->() const {
6812       return pointer(Container->getArgLoc(Index));
6813     }
6814 
6815     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6816                            const TemplateArgumentLocContainerIterator &Y) {
6817       return X.Container == Y.Container && X.Index == Y.Index;
6818     }
6819 
6820     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6821                            const TemplateArgumentLocContainerIterator &Y) {
6822       return !(X == Y);
6823     }
6824   };
6825 
6826 template<typename Derived>
6827 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6828                                                    AutoTypeLoc TL) {
6829   const AutoType *T = TL.getTypePtr();
6830   QualType OldDeduced = T->getDeducedType();
6831   QualType NewDeduced;
6832   if (!OldDeduced.isNull()) {
6833     NewDeduced = getDerived().TransformType(OldDeduced);
6834     if (NewDeduced.isNull())
6835       return QualType();
6836   }
6837 
6838   ConceptDecl *NewCD = nullptr;
6839   TemplateArgumentListInfo NewTemplateArgs;
6840   NestedNameSpecifierLoc NewNestedNameSpec;
6841   if (T->isConstrained()) {
6842     assert(TL.getConceptReference());
6843     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6844         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6845 
6846     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6847     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6848     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6849     if (getDerived().TransformTemplateArguments(
6850             ArgIterator(TL, 0), ArgIterator(TL, TL.getNumArgs()),
6851             NewTemplateArgs))
6852       return QualType();
6853 
6854     if (TL.getNestedNameSpecifierLoc()) {
6855       NewNestedNameSpec
6856         = getDerived().TransformNestedNameSpecifierLoc(
6857             TL.getNestedNameSpecifierLoc());
6858       if (!NewNestedNameSpec)
6859         return QualType();
6860     }
6861   }
6862 
6863   QualType Result = TL.getType();
6864   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6865       T->isDependentType() || T->isConstrained()) {
6866     // FIXME: Maybe don't rebuild if all template arguments are the same.
6867     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6868     NewArgList.reserve(NewTemplateArgs.size());
6869     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6870       NewArgList.push_back(ArgLoc.getArgument());
6871     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6872                                           NewArgList);
6873     if (Result.isNull())
6874       return QualType();
6875   }
6876 
6877   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6878   NewTL.setNameLoc(TL.getNameLoc());
6879   NewTL.setRParenLoc(TL.getRParenLoc());
6880   NewTL.setConceptReference(nullptr);
6881 
6882   if (T->isConstrained()) {
6883     DeclarationNameInfo DNI = DeclarationNameInfo(
6884         TL.getTypePtr()->getTypeConstraintConcept()->getDeclName(),
6885         TL.getConceptNameLoc(),
6886         TL.getTypePtr()->getTypeConstraintConcept()->getDeclName());
6887     auto *CR = ConceptReference::Create(
6888         SemaRef.Context, NewNestedNameSpec, TL.getTemplateKWLoc(), DNI,
6889         TL.getFoundDecl(), TL.getTypePtr()->getTypeConstraintConcept(),
6890         ASTTemplateArgumentListInfo::Create(SemaRef.Context, NewTemplateArgs));
6891     NewTL.setConceptReference(CR);
6892   }
6893 
6894   return Result;
6895 }
6896 
6897 template <typename Derived>
6898 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6899                                                         TypeLocBuilder &TLB,
6900                                            TemplateSpecializationTypeLoc TL,
6901                                                       TemplateName Template) {
6902   TemplateArgumentListInfo NewTemplateArgs;
6903   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6904   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6905   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6906     ArgIterator;
6907   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6908                                               ArgIterator(TL, TL.getNumArgs()),
6909                                               NewTemplateArgs))
6910     return QualType();
6911 
6912   // FIXME: maybe don't rebuild if all the template arguments are the same.
6913 
6914   QualType Result =
6915     getDerived().RebuildTemplateSpecializationType(Template,
6916                                                    TL.getTemplateNameLoc(),
6917                                                    NewTemplateArgs);
6918 
6919   if (!Result.isNull()) {
6920     // Specializations of template template parameters are represented as
6921     // TemplateSpecializationTypes, and substitution of type alias templates
6922     // within a dependent context can transform them into
6923     // DependentTemplateSpecializationTypes.
6924     if (isa<DependentTemplateSpecializationType>(Result)) {
6925       DependentTemplateSpecializationTypeLoc NewTL
6926         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6927       NewTL.setElaboratedKeywordLoc(SourceLocation());
6928       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6929       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6930       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6931       NewTL.setLAngleLoc(TL.getLAngleLoc());
6932       NewTL.setRAngleLoc(TL.getRAngleLoc());
6933       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6934         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6935       return Result;
6936     }
6937 
6938     TemplateSpecializationTypeLoc NewTL
6939       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6940     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6941     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6942     NewTL.setLAngleLoc(TL.getLAngleLoc());
6943     NewTL.setRAngleLoc(TL.getRAngleLoc());
6944     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6945       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6946   }
6947 
6948   return Result;
6949 }
6950 
6951 template <typename Derived>
6952 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6953                                      TypeLocBuilder &TLB,
6954                                      DependentTemplateSpecializationTypeLoc TL,
6955                                      TemplateName Template,
6956                                      CXXScopeSpec &SS) {
6957   TemplateArgumentListInfo NewTemplateArgs;
6958   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6959   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6960   typedef TemplateArgumentLocContainerIterator<
6961             DependentTemplateSpecializationTypeLoc> ArgIterator;
6962   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6963                                               ArgIterator(TL, TL.getNumArgs()),
6964                                               NewTemplateArgs))
6965     return QualType();
6966 
6967   // FIXME: maybe don't rebuild if all the template arguments are the same.
6968 
6969   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6970     QualType Result = getSema().Context.getDependentTemplateSpecializationType(
6971         TL.getTypePtr()->getKeyword(), DTN->getQualifier(),
6972         DTN->getIdentifier(), NewTemplateArgs.arguments());
6973 
6974     DependentTemplateSpecializationTypeLoc NewTL
6975       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6976     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6977     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6978     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6979     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6980     NewTL.setLAngleLoc(TL.getLAngleLoc());
6981     NewTL.setRAngleLoc(TL.getRAngleLoc());
6982     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6983       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6984     return Result;
6985   }
6986 
6987   QualType Result
6988     = getDerived().RebuildTemplateSpecializationType(Template,
6989                                                      TL.getTemplateNameLoc(),
6990                                                      NewTemplateArgs);
6991 
6992   if (!Result.isNull()) {
6993     /// FIXME: Wrap this in an elaborated-type-specifier?
6994     TemplateSpecializationTypeLoc NewTL
6995       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6996     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6997     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6998     NewTL.setLAngleLoc(TL.getLAngleLoc());
6999     NewTL.setRAngleLoc(TL.getRAngleLoc());
7000     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
7001       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
7002   }
7003 
7004   return Result;
7005 }
7006 
7007 template<typename Derived>
7008 QualType
7009 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
7010                                                 ElaboratedTypeLoc TL) {
7011   const ElaboratedType *T = TL.getTypePtr();
7012 
7013   NestedNameSpecifierLoc QualifierLoc;
7014   // NOTE: the qualifier in an ElaboratedType is optional.
7015   if (TL.getQualifierLoc()) {
7016     QualifierLoc
7017       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7018     if (!QualifierLoc)
7019       return QualType();
7020   }
7021 
7022   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
7023   if (NamedT.isNull())
7024     return QualType();
7025 
7026   // C++0x [dcl.type.elab]p2:
7027   //   If the identifier resolves to a typedef-name or the simple-template-id
7028   //   resolves to an alias template specialization, the
7029   //   elaborated-type-specifier is ill-formed.
7030   if (T->getKeyword() != ElaboratedTypeKeyword::None &&
7031       T->getKeyword() != ElaboratedTypeKeyword::Typename) {
7032     if (const TemplateSpecializationType *TST =
7033           NamedT->getAs<TemplateSpecializationType>()) {
7034       TemplateName Template = TST->getTemplateName();
7035       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
7036               Template.getAsTemplateDecl())) {
7037         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
7038                      diag::err_tag_reference_non_tag)
7039             << TAT << Sema::NTK_TypeAliasTemplate
7040             << llvm::to_underlying(
7041                    ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()));
7042         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
7043       }
7044     }
7045   }
7046 
7047   QualType Result = TL.getType();
7048   if (getDerived().AlwaysRebuild() ||
7049       QualifierLoc != TL.getQualifierLoc() ||
7050       NamedT != T->getNamedType()) {
7051     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
7052                                                 T->getKeyword(),
7053                                                 QualifierLoc, NamedT);
7054     if (Result.isNull())
7055       return QualType();
7056   }
7057 
7058   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7059   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7060   NewTL.setQualifierLoc(QualifierLoc);
7061   return Result;
7062 }
7063 
7064 template <typename Derived>
7065 template <typename Fn>
7066 QualType TreeTransform<Derived>::TransformAttributedType(
7067     TypeLocBuilder &TLB, AttributedTypeLoc TL, Fn TransformModifiedTypeFn) {
7068   const AttributedType *oldType = TL.getTypePtr();
7069   QualType modifiedType = TransformModifiedTypeFn(TLB, TL.getModifiedLoc());
7070   if (modifiedType.isNull())
7071     return QualType();
7072 
7073   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
7074   const Attr *oldAttr = TL.getAttr();
7075   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
7076   if (oldAttr && !newAttr)
7077     return QualType();
7078 
7079   QualType result = TL.getType();
7080 
7081   // FIXME: dependent operand expressions?
7082   if (getDerived().AlwaysRebuild() ||
7083       modifiedType != oldType->getModifiedType()) {
7084     // TODO: this is really lame; we should really be rebuilding the
7085     // equivalent type from first principles.
7086     QualType equivalentType
7087       = getDerived().TransformType(oldType->getEquivalentType());
7088     if (equivalentType.isNull())
7089       return QualType();
7090 
7091     // Check whether we can add nullability; it is only represented as
7092     // type sugar, and therefore cannot be diagnosed in any other way.
7093     if (auto nullability = oldType->getImmediateNullability()) {
7094       if (!modifiedType->canHaveNullability()) {
7095         SemaRef.Diag((TL.getAttr() ? TL.getAttr()->getLocation()
7096                                    : TL.getModifiedLoc().getBeginLoc()),
7097                      diag::err_nullability_nonpointer)
7098             << DiagNullabilityKind(*nullability, false) << modifiedType;
7099         return QualType();
7100       }
7101     }
7102 
7103     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
7104                                                modifiedType,
7105                                                equivalentType);
7106   }
7107 
7108   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7109   newTL.setAttr(newAttr);
7110   return result;
7111 }
7112 
7113 template <typename Derived>
7114 QualType TreeTransform<Derived>::TransformAttributedType(TypeLocBuilder &TLB,
7115                                                          AttributedTypeLoc TL) {
7116   return getDerived().TransformAttributedType(
7117       TLB, TL, [&](TypeLocBuilder &TLB, TypeLoc ModifiedLoc) -> QualType {
7118         return getDerived().TransformType(TLB, ModifiedLoc);
7119       });
7120 }
7121 
7122 template <typename Derived>
7123 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7124     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7125   // The BTFTagAttributedType is available for C only.
7126   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
7127 }
7128 
7129 template<typename Derived>
7130 QualType
7131 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7132                                            ParenTypeLoc TL) {
7133   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7134   if (Inner.isNull())
7135     return QualType();
7136 
7137   QualType Result = TL.getType();
7138   if (getDerived().AlwaysRebuild() ||
7139       Inner != TL.getInnerLoc().getType()) {
7140     Result = getDerived().RebuildParenType(Inner);
7141     if (Result.isNull())
7142       return QualType();
7143   }
7144 
7145   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
7146   NewTL.setLParenLoc(TL.getLParenLoc());
7147   NewTL.setRParenLoc(TL.getRParenLoc());
7148   return Result;
7149 }
7150 
7151 template <typename Derived>
7152 QualType
7153 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7154                                                     MacroQualifiedTypeLoc TL) {
7155   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7156   if (Inner.isNull())
7157     return QualType();
7158 
7159   QualType Result = TL.getType();
7160   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7161     Result =
7162         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7163     if (Result.isNull())
7164       return QualType();
7165   }
7166 
7167   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
7168   NewTL.setExpansionLoc(TL.getExpansionLoc());
7169   return Result;
7170 }
7171 
7172 template<typename Derived>
7173 QualType TreeTransform<Derived>::TransformDependentNameType(
7174     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7175   return TransformDependentNameType(TLB, TL, false);
7176 }
7177 
7178 template<typename Derived>
7179 QualType TreeTransform<Derived>::TransformDependentNameType(
7180     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
7181   const DependentNameType *T = TL.getTypePtr();
7182 
7183   NestedNameSpecifierLoc QualifierLoc
7184     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7185   if (!QualifierLoc)
7186     return QualType();
7187 
7188   QualType Result
7189     = getDerived().RebuildDependentNameType(T->getKeyword(),
7190                                             TL.getElaboratedKeywordLoc(),
7191                                             QualifierLoc,
7192                                             T->getIdentifier(),
7193                                             TL.getNameLoc(),
7194                                             DeducedTSTContext);
7195   if (Result.isNull())
7196     return QualType();
7197 
7198   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
7199     QualType NamedT = ElabT->getNamedType();
7200     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7201 
7202     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7203     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7204     NewTL.setQualifierLoc(QualifierLoc);
7205   } else {
7206     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
7207     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7208     NewTL.setQualifierLoc(QualifierLoc);
7209     NewTL.setNameLoc(TL.getNameLoc());
7210   }
7211   return Result;
7212 }
7213 
7214 template<typename Derived>
7215 QualType TreeTransform<Derived>::
7216           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7217                                  DependentTemplateSpecializationTypeLoc TL) {
7218   NestedNameSpecifierLoc QualifierLoc;
7219   if (TL.getQualifierLoc()) {
7220     QualifierLoc
7221       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7222     if (!QualifierLoc)
7223       return QualType();
7224   }
7225 
7226   return getDerived()
7227            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7228 }
7229 
7230 template<typename Derived>
7231 QualType TreeTransform<Derived>::
7232 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7233                                    DependentTemplateSpecializationTypeLoc TL,
7234                                        NestedNameSpecifierLoc QualifierLoc) {
7235   const DependentTemplateSpecializationType *T = TL.getTypePtr();
7236 
7237   TemplateArgumentListInfo NewTemplateArgs;
7238   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7239   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7240 
7241   typedef TemplateArgumentLocContainerIterator<
7242   DependentTemplateSpecializationTypeLoc> ArgIterator;
7243   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7244                                               ArgIterator(TL, TL.getNumArgs()),
7245                                               NewTemplateArgs))
7246     return QualType();
7247 
7248   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7249       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7250       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7251       /*AllowInjectedClassName*/ false);
7252   if (Result.isNull())
7253     return QualType();
7254 
7255   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7256     QualType NamedT = ElabT->getNamedType();
7257 
7258     // Copy information relevant to the template specialization.
7259     TemplateSpecializationTypeLoc NamedTL
7260       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7261     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7262     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7263     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7264     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7265     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7266       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7267 
7268     // Copy information relevant to the elaborated type.
7269     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7270     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7271     NewTL.setQualifierLoc(QualifierLoc);
7272   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7273     DependentTemplateSpecializationTypeLoc SpecTL
7274       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7275     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7276     SpecTL.setQualifierLoc(QualifierLoc);
7277     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7278     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7279     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7280     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7281     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7282       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7283   } else {
7284     TemplateSpecializationTypeLoc SpecTL
7285       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7286     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7287     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7288     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7289     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7290     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7291       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7292   }
7293   return Result;
7294 }
7295 
7296 template<typename Derived>
7297 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7298                                                       PackExpansionTypeLoc TL) {
7299   QualType Pattern
7300     = getDerived().TransformType(TLB, TL.getPatternLoc());
7301   if (Pattern.isNull())
7302     return QualType();
7303 
7304   QualType Result = TL.getType();
7305   if (getDerived().AlwaysRebuild() ||
7306       Pattern != TL.getPatternLoc().getType()) {
7307     Result = getDerived().RebuildPackExpansionType(Pattern,
7308                                            TL.getPatternLoc().getSourceRange(),
7309                                                    TL.getEllipsisLoc(),
7310                                            TL.getTypePtr()->getNumExpansions());
7311     if (Result.isNull())
7312       return QualType();
7313   }
7314 
7315   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7316   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7317   return Result;
7318 }
7319 
7320 template<typename Derived>
7321 QualType
7322 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7323                                                    ObjCInterfaceTypeLoc TL) {
7324   // ObjCInterfaceType is never dependent.
7325   TLB.pushFullCopy(TL);
7326   return TL.getType();
7327 }
7328 
7329 template<typename Derived>
7330 QualType
7331 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7332                                                    ObjCTypeParamTypeLoc TL) {
7333   const ObjCTypeParamType *T = TL.getTypePtr();
7334   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7335       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7336   if (!OTP)
7337     return QualType();
7338 
7339   QualType Result = TL.getType();
7340   if (getDerived().AlwaysRebuild() ||
7341       OTP != T->getDecl()) {
7342     Result = getDerived().RebuildObjCTypeParamType(
7343         OTP, TL.getProtocolLAngleLoc(),
7344         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7345         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7346     if (Result.isNull())
7347       return QualType();
7348   }
7349 
7350   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7351   if (TL.getNumProtocols()) {
7352     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7353     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7354       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7355     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7356   }
7357   return Result;
7358 }
7359 
7360 template<typename Derived>
7361 QualType
7362 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7363                                                 ObjCObjectTypeLoc TL) {
7364   // Transform base type.
7365   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7366   if (BaseType.isNull())
7367     return QualType();
7368 
7369   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7370 
7371   // Transform type arguments.
7372   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7373   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7374     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7375     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7376     QualType TypeArg = TypeArgInfo->getType();
7377     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7378       AnyChanged = true;
7379 
7380       // We have a pack expansion. Instantiate it.
7381       const auto *PackExpansion = PackExpansionLoc.getType()
7382                                     ->castAs<PackExpansionType>();
7383       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7384       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7385                                               Unexpanded);
7386       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7387 
7388       // Determine whether the set of unexpanded parameter packs can
7389       // and should be expanded.
7390       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7391       bool Expand = false;
7392       bool RetainExpansion = false;
7393       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7394       if (getDerived().TryExpandParameterPacks(
7395             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7396             Unexpanded, Expand, RetainExpansion, NumExpansions))
7397         return QualType();
7398 
7399       if (!Expand) {
7400         // We can't expand this pack expansion into separate arguments yet;
7401         // just substitute into the pattern and create a new pack expansion
7402         // type.
7403         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7404 
7405         TypeLocBuilder TypeArgBuilder;
7406         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7407         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7408                                                              PatternLoc);
7409         if (NewPatternType.isNull())
7410           return QualType();
7411 
7412         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7413                                       NewPatternType, NumExpansions);
7414         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7415         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7416         NewTypeArgInfos.push_back(
7417           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7418         continue;
7419       }
7420 
7421       // Substitute into the pack expansion pattern for each slice of the
7422       // pack.
7423       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7424         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7425 
7426         TypeLocBuilder TypeArgBuilder;
7427         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7428 
7429         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7430                                                          PatternLoc);
7431         if (NewTypeArg.isNull())
7432           return QualType();
7433 
7434         NewTypeArgInfos.push_back(
7435           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7436       }
7437 
7438       continue;
7439     }
7440 
7441     TypeLocBuilder TypeArgBuilder;
7442     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7443     QualType NewTypeArg =
7444         getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7445     if (NewTypeArg.isNull())
7446       return QualType();
7447 
7448     // If nothing changed, just keep the old TypeSourceInfo.
7449     if (NewTypeArg == TypeArg) {
7450       NewTypeArgInfos.push_back(TypeArgInfo);
7451       continue;
7452     }
7453 
7454     NewTypeArgInfos.push_back(
7455       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7456     AnyChanged = true;
7457   }
7458 
7459   QualType Result = TL.getType();
7460   if (getDerived().AlwaysRebuild() || AnyChanged) {
7461     // Rebuild the type.
7462     Result = getDerived().RebuildObjCObjectType(
7463         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7464         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7465         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7466         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7467 
7468     if (Result.isNull())
7469       return QualType();
7470   }
7471 
7472   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7473   NewT.setHasBaseTypeAsWritten(true);
7474   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7475   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7476     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7477   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7478   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7479   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7480     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7481   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7482   return Result;
7483 }
7484 
7485 template<typename Derived>
7486 QualType
7487 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7488                                                ObjCObjectPointerTypeLoc TL) {
7489   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7490   if (PointeeType.isNull())
7491     return QualType();
7492 
7493   QualType Result = TL.getType();
7494   if (getDerived().AlwaysRebuild() ||
7495       PointeeType != TL.getPointeeLoc().getType()) {
7496     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7497                                                        TL.getStarLoc());
7498     if (Result.isNull())
7499       return QualType();
7500   }
7501 
7502   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7503   NewT.setStarLoc(TL.getStarLoc());
7504   return Result;
7505 }
7506 
7507 //===----------------------------------------------------------------------===//
7508 // Statement transformation
7509 //===----------------------------------------------------------------------===//
7510 template<typename Derived>
7511 StmtResult
7512 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7513   return S;
7514 }
7515 
7516 template<typename Derived>
7517 StmtResult
7518 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7519   return getDerived().TransformCompoundStmt(S, false);
7520 }
7521 
7522 template<typename Derived>
7523 StmtResult
7524 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7525                                               bool IsStmtExpr) {
7526   Sema::CompoundScopeRAII CompoundScope(getSema());
7527   Sema::FPFeaturesStateRAII FPSave(getSema());
7528   if (S->hasStoredFPFeatures())
7529     getSema().resetFPOptions(
7530         S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts()));
7531 
7532   const Stmt *ExprResult = S->getStmtExprResult();
7533   bool SubStmtInvalid = false;
7534   bool SubStmtChanged = false;
7535   SmallVector<Stmt*, 8> Statements;
7536   for (auto *B : S->body()) {
7537     StmtResult Result = getDerived().TransformStmt(
7538         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7539 
7540     if (Result.isInvalid()) {
7541       // Immediately fail if this was a DeclStmt, since it's very
7542       // likely that this will cause problems for future statements.
7543       if (isa<DeclStmt>(B))
7544         return StmtError();
7545 
7546       // Otherwise, just keep processing substatements and fail later.
7547       SubStmtInvalid = true;
7548       continue;
7549     }
7550 
7551     SubStmtChanged = SubStmtChanged || Result.get() != B;
7552     Statements.push_back(Result.getAs<Stmt>());
7553   }
7554 
7555   if (SubStmtInvalid)
7556     return StmtError();
7557 
7558   if (!getDerived().AlwaysRebuild() &&
7559       !SubStmtChanged)
7560     return S;
7561 
7562   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7563                                           Statements,
7564                                           S->getRBracLoc(),
7565                                           IsStmtExpr);
7566 }
7567 
7568 template<typename Derived>
7569 StmtResult
7570 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7571   ExprResult LHS, RHS;
7572   {
7573     EnterExpressionEvaluationContext Unevaluated(
7574         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7575 
7576     // Transform the left-hand case value.
7577     LHS = getDerived().TransformExpr(S->getLHS());
7578     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7579     if (LHS.isInvalid())
7580       return StmtError();
7581 
7582     // Transform the right-hand case value (for the GNU case-range extension).
7583     RHS = getDerived().TransformExpr(S->getRHS());
7584     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7585     if (RHS.isInvalid())
7586       return StmtError();
7587   }
7588 
7589   // Build the case statement.
7590   // Case statements are always rebuilt so that they will attached to their
7591   // transformed switch statement.
7592   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7593                                                        LHS.get(),
7594                                                        S->getEllipsisLoc(),
7595                                                        RHS.get(),
7596                                                        S->getColonLoc());
7597   if (Case.isInvalid())
7598     return StmtError();
7599 
7600   // Transform the statement following the case
7601   StmtResult SubStmt =
7602       getDerived().TransformStmt(S->getSubStmt());
7603   if (SubStmt.isInvalid())
7604     return StmtError();
7605 
7606   // Attach the body to the case statement
7607   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7608 }
7609 
7610 template <typename Derived>
7611 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7612   // Transform the statement following the default case
7613   StmtResult SubStmt =
7614       getDerived().TransformStmt(S->getSubStmt());
7615   if (SubStmt.isInvalid())
7616     return StmtError();
7617 
7618   // Default statements are always rebuilt
7619   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7620                                          SubStmt.get());
7621 }
7622 
7623 template<typename Derived>
7624 StmtResult
7625 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7626   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7627   if (SubStmt.isInvalid())
7628     return StmtError();
7629 
7630   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7631                                         S->getDecl());
7632   if (!LD)
7633     return StmtError();
7634 
7635   // If we're transforming "in-place" (we're not creating new local
7636   // declarations), assume we're replacing the old label statement
7637   // and clear out the reference to it.
7638   if (LD == S->getDecl())
7639     S->getDecl()->setStmt(nullptr);
7640 
7641   // FIXME: Pass the real colon location in.
7642   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7643                                        cast<LabelDecl>(LD), SourceLocation(),
7644                                        SubStmt.get());
7645 }
7646 
7647 template <typename Derived>
7648 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7649   if (!R)
7650     return R;
7651 
7652   switch (R->getKind()) {
7653 // Transform attributes by calling TransformXXXAttr.
7654 #define ATTR(X)                                                                \
7655   case attr::X:                                                                \
7656     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7657 #include "clang/Basic/AttrList.inc"
7658   }
7659   return R;
7660 }
7661 
7662 template <typename Derived>
7663 const Attr *TreeTransform<Derived>::TransformStmtAttr(const Stmt *OrigS,
7664                                                       const Stmt *InstS,
7665                                                       const Attr *R) {
7666   if (!R)
7667     return R;
7668 
7669   switch (R->getKind()) {
7670 // Transform attributes by calling TransformStmtXXXAttr.
7671 #define ATTR(X)                                                                \
7672   case attr::X:                                                                \
7673     return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R));
7674 #include "clang/Basic/AttrList.inc"
7675   }
7676   return TransformAttr(R);
7677 }
7678 
7679 template <typename Derived>
7680 StmtResult
7681 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7682                                                 StmtDiscardKind SDK) {
7683   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7684   if (SubStmt.isInvalid())
7685     return StmtError();
7686 
7687   bool AttrsChanged = false;
7688   SmallVector<const Attr *, 1> Attrs;
7689 
7690   // Visit attributes and keep track if any are transformed.
7691   for (const auto *I : S->getAttrs()) {
7692     const Attr *R =
7693         getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.get(), I);
7694     AttrsChanged |= (I != R);
7695     if (R)
7696       Attrs.push_back(R);
7697   }
7698 
7699   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7700     return S;
7701 
7702   // If transforming the attributes failed for all of the attributes in the
7703   // statement, don't make an AttributedStmt without attributes.
7704   if (Attrs.empty())
7705     return SubStmt;
7706 
7707   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7708                                             SubStmt.get());
7709 }
7710 
7711 template<typename Derived>
7712 StmtResult
7713 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7714   // Transform the initialization statement
7715   StmtResult Init = getDerived().TransformStmt(S->getInit());
7716   if (Init.isInvalid())
7717     return StmtError();
7718 
7719   Sema::ConditionResult Cond;
7720   if (!S->isConsteval()) {
7721     // Transform the condition
7722     Cond = getDerived().TransformCondition(
7723         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7724         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7725                          : Sema::ConditionKind::Boolean);
7726     if (Cond.isInvalid())
7727       return StmtError();
7728   }
7729 
7730   // If this is a constexpr if, determine which arm we should instantiate.
7731   std::optional<bool> ConstexprConditionValue;
7732   if (S->isConstexpr())
7733     ConstexprConditionValue = Cond.getKnownValue();
7734 
7735   // Transform the "then" branch.
7736   StmtResult Then;
7737   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7738     Then = getDerived().TransformStmt(S->getThen());
7739     if (Then.isInvalid())
7740       return StmtError();
7741   } else {
7742     // Discarded branch is replaced with empty CompoundStmt so we can keep
7743     // proper source location for start and end of original branch, so
7744     // subsequent transformations like CoverageMapping work properly
7745     Then = new (getSema().Context)
7746         CompoundStmt(S->getThen()->getBeginLoc(), S->getThen()->getEndLoc());
7747   }
7748 
7749   // Transform the "else" branch.
7750   StmtResult Else;
7751   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7752     Else = getDerived().TransformStmt(S->getElse());
7753     if (Else.isInvalid())
7754       return StmtError();
7755   } else if (S->getElse() && ConstexprConditionValue &&
7756              *ConstexprConditionValue) {
7757     // Same thing here as with <then> branch, we are discarding it, we can't
7758     // replace it with NULL nor NullStmt as we need to keep for source location
7759     // range, for CoverageMapping
7760     Else = new (getSema().Context)
7761         CompoundStmt(S->getElse()->getBeginLoc(), S->getElse()->getEndLoc());
7762   }
7763 
7764   if (!getDerived().AlwaysRebuild() &&
7765       Init.get() == S->getInit() &&
7766       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7767       Then.get() == S->getThen() &&
7768       Else.get() == S->getElse())
7769     return S;
7770 
7771   return getDerived().RebuildIfStmt(
7772       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7773       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7774 }
7775 
7776 template<typename Derived>
7777 StmtResult
7778 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7779   // Transform the initialization statement
7780   StmtResult Init = getDerived().TransformStmt(S->getInit());
7781   if (Init.isInvalid())
7782     return StmtError();
7783 
7784   // Transform the condition.
7785   Sema::ConditionResult Cond = getDerived().TransformCondition(
7786       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7787       Sema::ConditionKind::Switch);
7788   if (Cond.isInvalid())
7789     return StmtError();
7790 
7791   // Rebuild the switch statement.
7792   StmtResult Switch =
7793       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7794                                           Init.get(), Cond, S->getRParenLoc());
7795   if (Switch.isInvalid())
7796     return StmtError();
7797 
7798   // Transform the body of the switch statement.
7799   StmtResult Body = getDerived().TransformStmt(S->getBody());
7800   if (Body.isInvalid())
7801     return StmtError();
7802 
7803   // Complete the switch statement.
7804   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7805                                             Body.get());
7806 }
7807 
7808 template<typename Derived>
7809 StmtResult
7810 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7811   // Transform the condition
7812   Sema::ConditionResult Cond = getDerived().TransformCondition(
7813       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7814       Sema::ConditionKind::Boolean);
7815   if (Cond.isInvalid())
7816     return StmtError();
7817 
7818   // Transform the body
7819   StmtResult Body = getDerived().TransformStmt(S->getBody());
7820   if (Body.isInvalid())
7821     return StmtError();
7822 
7823   if (!getDerived().AlwaysRebuild() &&
7824       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7825       Body.get() == S->getBody())
7826     return Owned(S);
7827 
7828   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7829                                        Cond, S->getRParenLoc(), Body.get());
7830 }
7831 
7832 template<typename Derived>
7833 StmtResult
7834 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7835   // Transform the body
7836   StmtResult Body = getDerived().TransformStmt(S->getBody());
7837   if (Body.isInvalid())
7838     return StmtError();
7839 
7840   // Transform the condition
7841   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7842   if (Cond.isInvalid())
7843     return StmtError();
7844 
7845   if (!getDerived().AlwaysRebuild() &&
7846       Cond.get() == S->getCond() &&
7847       Body.get() == S->getBody())
7848     return S;
7849 
7850   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7851                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7852                                     S->getRParenLoc());
7853 }
7854 
7855 template<typename Derived>
7856 StmtResult
7857 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7858   if (getSema().getLangOpts().OpenMP)
7859     getSema().startOpenMPLoop();
7860 
7861   // Transform the initialization statement
7862   StmtResult Init = getDerived().TransformStmt(S->getInit());
7863   if (Init.isInvalid())
7864     return StmtError();
7865 
7866   // In OpenMP loop region loop control variable must be captured and be
7867   // private. Perform analysis of first part (if any).
7868   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7869     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7870 
7871   // Transform the condition
7872   Sema::ConditionResult Cond = getDerived().TransformCondition(
7873       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7874       Sema::ConditionKind::Boolean);
7875   if (Cond.isInvalid())
7876     return StmtError();
7877 
7878   // Transform the increment
7879   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7880   if (Inc.isInvalid())
7881     return StmtError();
7882 
7883   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7884   if (S->getInc() && !FullInc.get())
7885     return StmtError();
7886 
7887   // Transform the body
7888   StmtResult Body = getDerived().TransformStmt(S->getBody());
7889   if (Body.isInvalid())
7890     return StmtError();
7891 
7892   if (!getDerived().AlwaysRebuild() &&
7893       Init.get() == S->getInit() &&
7894       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7895       Inc.get() == S->getInc() &&
7896       Body.get() == S->getBody())
7897     return S;
7898 
7899   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7900                                      Init.get(), Cond, FullInc,
7901                                      S->getRParenLoc(), Body.get());
7902 }
7903 
7904 template<typename Derived>
7905 StmtResult
7906 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7907   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7908                                         S->getLabel());
7909   if (!LD)
7910     return StmtError();
7911 
7912   // Goto statements must always be rebuilt, to resolve the label.
7913   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7914                                       cast<LabelDecl>(LD));
7915 }
7916 
7917 template<typename Derived>
7918 StmtResult
7919 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7920   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7921   if (Target.isInvalid())
7922     return StmtError();
7923   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7924 
7925   if (!getDerived().AlwaysRebuild() &&
7926       Target.get() == S->getTarget())
7927     return S;
7928 
7929   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7930                                               Target.get());
7931 }
7932 
7933 template<typename Derived>
7934 StmtResult
7935 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7936   return S;
7937 }
7938 
7939 template<typename Derived>
7940 StmtResult
7941 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7942   return S;
7943 }
7944 
7945 template<typename Derived>
7946 StmtResult
7947 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7948   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7949                                                         /*NotCopyInit*/false);
7950   if (Result.isInvalid())
7951     return StmtError();
7952 
7953   // FIXME: We always rebuild the return statement because there is no way
7954   // to tell whether the return type of the function has changed.
7955   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7956 }
7957 
7958 template<typename Derived>
7959 StmtResult
7960 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7961   bool DeclChanged = false;
7962   SmallVector<Decl *, 4> Decls;
7963   for (auto *D : S->decls()) {
7964     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7965     if (!Transformed)
7966       return StmtError();
7967 
7968     if (Transformed != D)
7969       DeclChanged = true;
7970 
7971     Decls.push_back(Transformed);
7972   }
7973 
7974   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7975     return S;
7976 
7977   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7978 }
7979 
7980 template<typename Derived>
7981 StmtResult
7982 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7983 
7984   SmallVector<Expr*, 8> Constraints;
7985   SmallVector<Expr*, 8> Exprs;
7986   SmallVector<IdentifierInfo *, 4> Names;
7987 
7988   ExprResult AsmString;
7989   SmallVector<Expr*, 8> Clobbers;
7990 
7991   bool ExprsChanged = false;
7992 
7993   // Go through the outputs.
7994   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7995     Names.push_back(S->getOutputIdentifier(I));
7996 
7997     // No need to transform the constraint literal.
7998     Constraints.push_back(S->getOutputConstraintLiteral(I));
7999 
8000     // Transform the output expr.
8001     Expr *OutputExpr = S->getOutputExpr(I);
8002     ExprResult Result = getDerived().TransformExpr(OutputExpr);
8003     if (Result.isInvalid())
8004       return StmtError();
8005 
8006     ExprsChanged |= Result.get() != OutputExpr;
8007 
8008     Exprs.push_back(Result.get());
8009   }
8010 
8011   // Go through the inputs.
8012   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
8013     Names.push_back(S->getInputIdentifier(I));
8014 
8015     // No need to transform the constraint literal.
8016     Constraints.push_back(S->getInputConstraintLiteral(I));
8017 
8018     // Transform the input expr.
8019     Expr *InputExpr = S->getInputExpr(I);
8020     ExprResult Result = getDerived().TransformExpr(InputExpr);
8021     if (Result.isInvalid())
8022       return StmtError();
8023 
8024     ExprsChanged |= Result.get() != InputExpr;
8025 
8026     Exprs.push_back(Result.get());
8027   }
8028 
8029   // Go through the Labels.
8030   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
8031     Names.push_back(S->getLabelIdentifier(I));
8032 
8033     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
8034     if (Result.isInvalid())
8035       return StmtError();
8036     ExprsChanged |= Result.get() != S->getLabelExpr(I);
8037     Exprs.push_back(Result.get());
8038   }
8039   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
8040     return S;
8041 
8042   // Go through the clobbers.
8043   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
8044     Clobbers.push_back(S->getClobberStringLiteral(I));
8045 
8046   // No need to transform the asm string literal.
8047   AsmString = S->getAsmString();
8048   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
8049                                         S->isVolatile(), S->getNumOutputs(),
8050                                         S->getNumInputs(), Names.data(),
8051                                         Constraints, Exprs, AsmString.get(),
8052                                         Clobbers, S->getNumLabels(),
8053                                         S->getRParenLoc());
8054 }
8055 
8056 template<typename Derived>
8057 StmtResult
8058 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
8059   ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks());
8060 
8061   bool HadError = false, HadChange = false;
8062 
8063   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
8064   SmallVector<Expr*, 8> TransformedExprs;
8065   TransformedExprs.reserve(SrcExprs.size());
8066   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
8067     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
8068     if (!Result.isUsable()) {
8069       HadError = true;
8070     } else {
8071       HadChange |= (Result.get() != SrcExprs[i]);
8072       TransformedExprs.push_back(Result.get());
8073     }
8074   }
8075 
8076   if (HadError) return StmtError();
8077   if (!HadChange && !getDerived().AlwaysRebuild())
8078     return Owned(S);
8079 
8080   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
8081                                        AsmToks, S->getAsmString(),
8082                                        S->getNumOutputs(), S->getNumInputs(),
8083                                        S->getAllConstraints(), S->getClobbers(),
8084                                        TransformedExprs, S->getEndLoc());
8085 }
8086 
8087 // C++ Coroutines
8088 template<typename Derived>
8089 StmtResult
8090 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
8091   auto *ScopeInfo = SemaRef.getCurFunction();
8092   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
8093   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
8094          ScopeInfo->NeedsCoroutineSuspends &&
8095          ScopeInfo->CoroutineSuspends.first == nullptr &&
8096          ScopeInfo->CoroutineSuspends.second == nullptr &&
8097          "expected clean scope info");
8098 
8099   // Set that we have (possibly-invalid) suspend points before we do anything
8100   // that may fail.
8101   ScopeInfo->setNeedsCoroutineSuspends(false);
8102 
8103   // We re-build the coroutine promise object (and the coroutine parameters its
8104   // type and constructor depend on) based on the types used in our current
8105   // function. We must do so, and set it on the current FunctionScopeInfo,
8106   // before attempting to transform the other parts of the coroutine body
8107   // statement, such as the implicit suspend statements (because those
8108   // statements reference the FunctionScopeInfo::CoroutinePromise).
8109   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
8110     return StmtError();
8111   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
8112   if (!Promise)
8113     return StmtError();
8114   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
8115   ScopeInfo->CoroutinePromise = Promise;
8116 
8117   // Transform the implicit coroutine statements constructed using dependent
8118   // types during the previous parse: initial and final suspensions, the return
8119   // object, and others. We also transform the coroutine function's body.
8120   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
8121   if (InitSuspend.isInvalid())
8122     return StmtError();
8123   StmtResult FinalSuspend =
8124       getDerived().TransformStmt(S->getFinalSuspendStmt());
8125   if (FinalSuspend.isInvalid() ||
8126       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
8127     return StmtError();
8128   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
8129   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
8130 
8131   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
8132   if (BodyRes.isInvalid())
8133     return StmtError();
8134 
8135   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
8136   if (Builder.isInvalid())
8137     return StmtError();
8138 
8139   Expr *ReturnObject = S->getReturnValueInit();
8140   assert(ReturnObject && "the return object is expected to be valid");
8141   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8142                                                      /*NoCopyInit*/ false);
8143   if (Res.isInvalid())
8144     return StmtError();
8145   Builder.ReturnValue = Res.get();
8146 
8147   // If during the previous parse the coroutine still had a dependent promise
8148   // statement, we may need to build some implicit coroutine statements
8149   // (such as exception and fallthrough handlers) for the first time.
8150   if (S->hasDependentPromiseType()) {
8151     // We can only build these statements, however, if the current promise type
8152     // is not dependent.
8153     if (!Promise->getType()->isDependentType()) {
8154       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8155              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8156              "these nodes should not have been built yet");
8157       if (!Builder.buildDependentStatements())
8158         return StmtError();
8159     }
8160   } else {
8161     if (auto *OnFallthrough = S->getFallthroughHandler()) {
8162       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8163       if (Res.isInvalid())
8164         return StmtError();
8165       Builder.OnFallthrough = Res.get();
8166     }
8167 
8168     if (auto *OnException = S->getExceptionHandler()) {
8169       StmtResult Res = getDerived().TransformStmt(OnException);
8170       if (Res.isInvalid())
8171         return StmtError();
8172       Builder.OnException = Res.get();
8173     }
8174 
8175     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8176       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8177       if (Res.isInvalid())
8178         return StmtError();
8179       Builder.ReturnStmtOnAllocFailure = Res.get();
8180     }
8181 
8182     // Transform any additional statements we may have already built
8183     assert(S->getAllocate() && S->getDeallocate() &&
8184            "allocation and deallocation calls must already be built");
8185     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8186     if (AllocRes.isInvalid())
8187       return StmtError();
8188     Builder.Allocate = AllocRes.get();
8189 
8190     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8191     if (DeallocRes.isInvalid())
8192       return StmtError();
8193     Builder.Deallocate = DeallocRes.get();
8194 
8195     if (auto *ResultDecl = S->getResultDecl()) {
8196       StmtResult Res = getDerived().TransformStmt(ResultDecl);
8197       if (Res.isInvalid())
8198         return StmtError();
8199       Builder.ResultDecl = Res.get();
8200     }
8201 
8202     if (auto *ReturnStmt = S->getReturnStmt()) {
8203       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8204       if (Res.isInvalid())
8205         return StmtError();
8206       Builder.ReturnStmt = Res.get();
8207     }
8208   }
8209 
8210   return getDerived().RebuildCoroutineBodyStmt(Builder);
8211 }
8212 
8213 template<typename Derived>
8214 StmtResult
8215 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8216   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
8217                                                         /*NotCopyInit*/false);
8218   if (Result.isInvalid())
8219     return StmtError();
8220 
8221   // Always rebuild; we don't know if this needs to be injected into a new
8222   // context or if the promise type has changed.
8223   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
8224                                           S->isImplicit());
8225 }
8226 
8227 template <typename Derived>
8228 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
8229   ExprResult Operand = getDerived().TransformInitializer(E->getOperand(),
8230                                                          /*NotCopyInit*/ false);
8231   if (Operand.isInvalid())
8232     return ExprError();
8233 
8234   // Rebuild the common-expr from the operand rather than transforming it
8235   // separately.
8236 
8237   // FIXME: getCurScope() should not be used during template instantiation.
8238   // We should pick up the set of unqualified lookup results for operator
8239   // co_await during the initial parse.
8240   ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8241       getSema().getCurScope(), E->getKeywordLoc());
8242 
8243   // Always rebuild; we don't know if this needs to be injected into a new
8244   // context or if the promise type has changed.
8245   return getDerived().RebuildCoawaitExpr(
8246       E->getKeywordLoc(), Operand.get(),
8247       cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit());
8248 }
8249 
8250 template <typename Derived>
8251 ExprResult
8252 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
8253   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
8254                                                         /*NotCopyInit*/ false);
8255   if (OperandResult.isInvalid())
8256     return ExprError();
8257 
8258   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8259           E->getOperatorCoawaitLookup());
8260 
8261   if (LookupResult.isInvalid())
8262     return ExprError();
8263 
8264   // Always rebuild; we don't know if this needs to be injected into a new
8265   // context or if the promise type has changed.
8266   return getDerived().RebuildDependentCoawaitExpr(
8267       E->getKeywordLoc(), OperandResult.get(),
8268       cast<UnresolvedLookupExpr>(LookupResult.get()));
8269 }
8270 
8271 template<typename Derived>
8272 ExprResult
8273 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
8274   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
8275                                                         /*NotCopyInit*/false);
8276   if (Result.isInvalid())
8277     return ExprError();
8278 
8279   // Always rebuild; we don't know if this needs to be injected into a new
8280   // context or if the promise type has changed.
8281   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
8282 }
8283 
8284 // Objective-C Statements.
8285 
8286 template<typename Derived>
8287 StmtResult
8288 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8289   // Transform the body of the @try.
8290   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8291   if (TryBody.isInvalid())
8292     return StmtError();
8293 
8294   // Transform the @catch statements (if present).
8295   bool AnyCatchChanged = false;
8296   SmallVector<Stmt*, 8> CatchStmts;
8297   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8298     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8299     if (Catch.isInvalid())
8300       return StmtError();
8301     if (Catch.get() != S->getCatchStmt(I))
8302       AnyCatchChanged = true;
8303     CatchStmts.push_back(Catch.get());
8304   }
8305 
8306   // Transform the @finally statement (if present).
8307   StmtResult Finally;
8308   if (S->getFinallyStmt()) {
8309     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8310     if (Finally.isInvalid())
8311       return StmtError();
8312   }
8313 
8314   // If nothing changed, just retain this statement.
8315   if (!getDerived().AlwaysRebuild() &&
8316       TryBody.get() == S->getTryBody() &&
8317       !AnyCatchChanged &&
8318       Finally.get() == S->getFinallyStmt())
8319     return S;
8320 
8321   // Build a new statement.
8322   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8323                                            CatchStmts, Finally.get());
8324 }
8325 
8326 template<typename Derived>
8327 StmtResult
8328 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8329   // Transform the @catch parameter, if there is one.
8330   VarDecl *Var = nullptr;
8331   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8332     TypeSourceInfo *TSInfo = nullptr;
8333     if (FromVar->getTypeSourceInfo()) {
8334       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8335       if (!TSInfo)
8336         return StmtError();
8337     }
8338 
8339     QualType T;
8340     if (TSInfo)
8341       T = TSInfo->getType();
8342     else {
8343       T = getDerived().TransformType(FromVar->getType());
8344       if (T.isNull())
8345         return StmtError();
8346     }
8347 
8348     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8349     if (!Var)
8350       return StmtError();
8351   }
8352 
8353   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8354   if (Body.isInvalid())
8355     return StmtError();
8356 
8357   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8358                                              S->getRParenLoc(),
8359                                              Var, Body.get());
8360 }
8361 
8362 template<typename Derived>
8363 StmtResult
8364 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8365   // Transform the body.
8366   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8367   if (Body.isInvalid())
8368     return StmtError();
8369 
8370   // If nothing changed, just retain this statement.
8371   if (!getDerived().AlwaysRebuild() &&
8372       Body.get() == S->getFinallyBody())
8373     return S;
8374 
8375   // Build a new statement.
8376   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8377                                                Body.get());
8378 }
8379 
8380 template<typename Derived>
8381 StmtResult
8382 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8383   ExprResult Operand;
8384   if (S->getThrowExpr()) {
8385     Operand = getDerived().TransformExpr(S->getThrowExpr());
8386     if (Operand.isInvalid())
8387       return StmtError();
8388   }
8389 
8390   if (!getDerived().AlwaysRebuild() &&
8391       Operand.get() == S->getThrowExpr())
8392     return S;
8393 
8394   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8395 }
8396 
8397 template<typename Derived>
8398 StmtResult
8399 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8400                                                   ObjCAtSynchronizedStmt *S) {
8401   // Transform the object we are locking.
8402   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8403   if (Object.isInvalid())
8404     return StmtError();
8405   Object =
8406     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8407                                                   Object.get());
8408   if (Object.isInvalid())
8409     return StmtError();
8410 
8411   // Transform the body.
8412   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8413   if (Body.isInvalid())
8414     return StmtError();
8415 
8416   // If nothing change, just retain the current statement.
8417   if (!getDerived().AlwaysRebuild() &&
8418       Object.get() == S->getSynchExpr() &&
8419       Body.get() == S->getSynchBody())
8420     return S;
8421 
8422   // Build a new statement.
8423   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8424                                                     Object.get(), Body.get());
8425 }
8426 
8427 template<typename Derived>
8428 StmtResult
8429 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8430                                               ObjCAutoreleasePoolStmt *S) {
8431   // Transform the body.
8432   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8433   if (Body.isInvalid())
8434     return StmtError();
8435 
8436   // If nothing changed, just retain this statement.
8437   if (!getDerived().AlwaysRebuild() &&
8438       Body.get() == S->getSubStmt())
8439     return S;
8440 
8441   // Build a new statement.
8442   return getDerived().RebuildObjCAutoreleasePoolStmt(
8443                         S->getAtLoc(), Body.get());
8444 }
8445 
8446 template<typename Derived>
8447 StmtResult
8448 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8449                                                   ObjCForCollectionStmt *S) {
8450   // Transform the element statement.
8451   StmtResult Element =
8452       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8453   if (Element.isInvalid())
8454     return StmtError();
8455 
8456   // Transform the collection expression.
8457   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8458   if (Collection.isInvalid())
8459     return StmtError();
8460 
8461   // Transform the body.
8462   StmtResult Body = getDerived().TransformStmt(S->getBody());
8463   if (Body.isInvalid())
8464     return StmtError();
8465 
8466   // If nothing changed, just retain this statement.
8467   if (!getDerived().AlwaysRebuild() &&
8468       Element.get() == S->getElement() &&
8469       Collection.get() == S->getCollection() &&
8470       Body.get() == S->getBody())
8471     return S;
8472 
8473   // Build a new statement.
8474   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8475                                                    Element.get(),
8476                                                    Collection.get(),
8477                                                    S->getRParenLoc(),
8478                                                    Body.get());
8479 }
8480 
8481 template <typename Derived>
8482 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8483   // Transform the exception declaration, if any.
8484   VarDecl *Var = nullptr;
8485   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8486     TypeSourceInfo *T =
8487         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8488     if (!T)
8489       return StmtError();
8490 
8491     Var = getDerived().RebuildExceptionDecl(
8492         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8493         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8494     if (!Var || Var->isInvalidDecl())
8495       return StmtError();
8496   }
8497 
8498   // Transform the actual exception handler.
8499   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8500   if (Handler.isInvalid())
8501     return StmtError();
8502 
8503   if (!getDerived().AlwaysRebuild() && !Var &&
8504       Handler.get() == S->getHandlerBlock())
8505     return S;
8506 
8507   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8508 }
8509 
8510 template <typename Derived>
8511 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8512   // Transform the try block itself.
8513   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8514   if (TryBlock.isInvalid())
8515     return StmtError();
8516 
8517   // Transform the handlers.
8518   bool HandlerChanged = false;
8519   SmallVector<Stmt *, 8> Handlers;
8520   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8521     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8522     if (Handler.isInvalid())
8523       return StmtError();
8524 
8525     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8526     Handlers.push_back(Handler.getAs<Stmt>());
8527   }
8528 
8529   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8530       !HandlerChanged)
8531     return S;
8532 
8533   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8534                                         Handlers);
8535 }
8536 
8537 template<typename Derived>
8538 StmtResult
8539 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8540   StmtResult Init =
8541       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8542   if (Init.isInvalid())
8543     return StmtError();
8544 
8545   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8546   if (Range.isInvalid())
8547     return StmtError();
8548 
8549   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8550   if (Begin.isInvalid())
8551     return StmtError();
8552   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8553   if (End.isInvalid())
8554     return StmtError();
8555 
8556   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8557   if (Cond.isInvalid())
8558     return StmtError();
8559   if (Cond.get())
8560     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8561   if (Cond.isInvalid())
8562     return StmtError();
8563   if (Cond.get())
8564     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8565 
8566   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8567   if (Inc.isInvalid())
8568     return StmtError();
8569   if (Inc.get())
8570     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8571 
8572   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8573   if (LoopVar.isInvalid())
8574     return StmtError();
8575 
8576   StmtResult NewStmt = S;
8577   if (getDerived().AlwaysRebuild() ||
8578       Init.get() != S->getInit() ||
8579       Range.get() != S->getRangeStmt() ||
8580       Begin.get() != S->getBeginStmt() ||
8581       End.get() != S->getEndStmt() ||
8582       Cond.get() != S->getCond() ||
8583       Inc.get() != S->getInc() ||
8584       LoopVar.get() != S->getLoopVarStmt()) {
8585     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8586                                                   S->getCoawaitLoc(), Init.get(),
8587                                                   S->getColonLoc(), Range.get(),
8588                                                   Begin.get(), End.get(),
8589                                                   Cond.get(),
8590                                                   Inc.get(), LoopVar.get(),
8591                                                   S->getRParenLoc());
8592     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8593       // Might not have attached any initializer to the loop variable.
8594       getSema().ActOnInitializerError(
8595           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8596       return StmtError();
8597     }
8598   }
8599 
8600   StmtResult Body = getDerived().TransformStmt(S->getBody());
8601   if (Body.isInvalid())
8602     return StmtError();
8603 
8604   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8605   // it now so we have a new statement to attach the body to.
8606   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8607     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8608                                                   S->getCoawaitLoc(), Init.get(),
8609                                                   S->getColonLoc(), Range.get(),
8610                                                   Begin.get(), End.get(),
8611                                                   Cond.get(),
8612                                                   Inc.get(), LoopVar.get(),
8613                                                   S->getRParenLoc());
8614     if (NewStmt.isInvalid())
8615       return StmtError();
8616   }
8617 
8618   if (NewStmt.get() == S)
8619     return S;
8620 
8621   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8622 }
8623 
8624 template<typename Derived>
8625 StmtResult
8626 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8627                                                     MSDependentExistsStmt *S) {
8628   // Transform the nested-name-specifier, if any.
8629   NestedNameSpecifierLoc QualifierLoc;
8630   if (S->getQualifierLoc()) {
8631     QualifierLoc
8632       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8633     if (!QualifierLoc)
8634       return StmtError();
8635   }
8636 
8637   // Transform the declaration name.
8638   DeclarationNameInfo NameInfo = S->getNameInfo();
8639   if (NameInfo.getName()) {
8640     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8641     if (!NameInfo.getName())
8642       return StmtError();
8643   }
8644 
8645   // Check whether anything changed.
8646   if (!getDerived().AlwaysRebuild() &&
8647       QualifierLoc == S->getQualifierLoc() &&
8648       NameInfo.getName() == S->getNameInfo().getName())
8649     return S;
8650 
8651   // Determine whether this name exists, if we can.
8652   CXXScopeSpec SS;
8653   SS.Adopt(QualifierLoc);
8654   bool Dependent = false;
8655   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8656   case Sema::IER_Exists:
8657     if (S->isIfExists())
8658       break;
8659 
8660     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8661 
8662   case Sema::IER_DoesNotExist:
8663     if (S->isIfNotExists())
8664       break;
8665 
8666     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8667 
8668   case Sema::IER_Dependent:
8669     Dependent = true;
8670     break;
8671 
8672   case Sema::IER_Error:
8673     return StmtError();
8674   }
8675 
8676   // We need to continue with the instantiation, so do so now.
8677   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8678   if (SubStmt.isInvalid())
8679     return StmtError();
8680 
8681   // If we have resolved the name, just transform to the substatement.
8682   if (!Dependent)
8683     return SubStmt;
8684 
8685   // The name is still dependent, so build a dependent expression again.
8686   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8687                                                    S->isIfExists(),
8688                                                    QualifierLoc,
8689                                                    NameInfo,
8690                                                    SubStmt.get());
8691 }
8692 
8693 template<typename Derived>
8694 ExprResult
8695 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8696   NestedNameSpecifierLoc QualifierLoc;
8697   if (E->getQualifierLoc()) {
8698     QualifierLoc
8699     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8700     if (!QualifierLoc)
8701       return ExprError();
8702   }
8703 
8704   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8705     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8706   if (!PD)
8707     return ExprError();
8708 
8709   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8710   if (Base.isInvalid())
8711     return ExprError();
8712 
8713   return new (SemaRef.getASTContext())
8714       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8715                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8716                         QualifierLoc, E->getMemberLoc());
8717 }
8718 
8719 template <typename Derived>
8720 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8721     MSPropertySubscriptExpr *E) {
8722   auto BaseRes = getDerived().TransformExpr(E->getBase());
8723   if (BaseRes.isInvalid())
8724     return ExprError();
8725   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8726   if (IdxRes.isInvalid())
8727     return ExprError();
8728 
8729   if (!getDerived().AlwaysRebuild() &&
8730       BaseRes.get() == E->getBase() &&
8731       IdxRes.get() == E->getIdx())
8732     return E;
8733 
8734   return getDerived().RebuildArraySubscriptExpr(
8735       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8736 }
8737 
8738 template <typename Derived>
8739 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8740   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8741   if (TryBlock.isInvalid())
8742     return StmtError();
8743 
8744   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8745   if (Handler.isInvalid())
8746     return StmtError();
8747 
8748   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8749       Handler.get() == S->getHandler())
8750     return S;
8751 
8752   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8753                                         TryBlock.get(), Handler.get());
8754 }
8755 
8756 template <typename Derived>
8757 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8758   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8759   if (Block.isInvalid())
8760     return StmtError();
8761 
8762   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8763 }
8764 
8765 template <typename Derived>
8766 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8767   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8768   if (FilterExpr.isInvalid())
8769     return StmtError();
8770 
8771   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8772   if (Block.isInvalid())
8773     return StmtError();
8774 
8775   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8776                                            Block.get());
8777 }
8778 
8779 template <typename Derived>
8780 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8781   if (isa<SEHFinallyStmt>(Handler))
8782     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8783   else
8784     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8785 }
8786 
8787 template<typename Derived>
8788 StmtResult
8789 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8790   return S;
8791 }
8792 
8793 //===----------------------------------------------------------------------===//
8794 // OpenMP directive transformation
8795 //===----------------------------------------------------------------------===//
8796 
8797 template <typename Derived>
8798 StmtResult
8799 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8800   // OMPCanonicalLoops are eliminated during transformation, since they will be
8801   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8802   // after transformation.
8803   return getDerived().TransformStmt(L->getLoopStmt());
8804 }
8805 
8806 template <typename Derived>
8807 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8808     OMPExecutableDirective *D) {
8809 
8810   // Transform the clauses
8811   llvm::SmallVector<OMPClause *, 16> TClauses;
8812   ArrayRef<OMPClause *> Clauses = D->clauses();
8813   TClauses.reserve(Clauses.size());
8814   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8815        I != E; ++I) {
8816     if (*I) {
8817       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8818       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8819       getDerived().getSema().EndOpenMPClause();
8820       if (Clause)
8821         TClauses.push_back(Clause);
8822     } else {
8823       TClauses.push_back(nullptr);
8824     }
8825   }
8826   StmtResult AssociatedStmt;
8827   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8828     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8829                                                   /*CurScope=*/nullptr);
8830     StmtResult Body;
8831     {
8832       Sema::CompoundScopeRAII CompoundScope(getSema());
8833       Stmt *CS;
8834       if (D->getDirectiveKind() == OMPD_atomic ||
8835           D->getDirectiveKind() == OMPD_critical ||
8836           D->getDirectiveKind() == OMPD_section ||
8837           D->getDirectiveKind() == OMPD_master)
8838         CS = D->getAssociatedStmt();
8839       else
8840         CS = D->getRawStmt();
8841       Body = getDerived().TransformStmt(CS);
8842       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8843           getSema().getLangOpts().OpenMPIRBuilder)
8844         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8845     }
8846     AssociatedStmt =
8847         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8848     if (AssociatedStmt.isInvalid()) {
8849       return StmtError();
8850     }
8851   }
8852   if (TClauses.size() != Clauses.size()) {
8853     return StmtError();
8854   }
8855 
8856   // Transform directive name for 'omp critical' directive.
8857   DeclarationNameInfo DirName;
8858   if (D->getDirectiveKind() == OMPD_critical) {
8859     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8860     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8861   }
8862   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8863   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8864     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8865   } else if (D->getDirectiveKind() == OMPD_cancel) {
8866     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8867   }
8868 
8869   return getDerived().RebuildOMPExecutableDirective(
8870       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8871       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc(),
8872       D->getMappedDirective());
8873 }
8874 
8875 template <typename Derived>
8876 StmtResult
8877 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8878   // TODO: Fix This
8879   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8880       << getOpenMPDirectiveName(D->getDirectiveKind());
8881   return StmtError();
8882 }
8883 
8884 template <typename Derived>
8885 StmtResult
8886 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8887   DeclarationNameInfo DirName;
8888   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8889                                              D->getBeginLoc());
8890   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8891   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8892   return Res;
8893 }
8894 
8895 template <typename Derived>
8896 StmtResult
8897 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8898   DeclarationNameInfo DirName;
8899   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8900                                              D->getBeginLoc());
8901   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8902   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8903   return Res;
8904 }
8905 
8906 template <typename Derived>
8907 StmtResult
8908 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8909   DeclarationNameInfo DirName;
8910   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8911                                              nullptr, D->getBeginLoc());
8912   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8913   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8914   return Res;
8915 }
8916 
8917 template <typename Derived>
8918 StmtResult
8919 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8920   DeclarationNameInfo DirName;
8921   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8922                                              nullptr, D->getBeginLoc());
8923   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8924   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8925   return Res;
8926 }
8927 
8928 template <typename Derived>
8929 StmtResult
8930 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8931   DeclarationNameInfo DirName;
8932   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8933                                              D->getBeginLoc());
8934   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8935   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8936   return Res;
8937 }
8938 
8939 template <typename Derived>
8940 StmtResult
8941 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8942   DeclarationNameInfo DirName;
8943   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8944                                              D->getBeginLoc());
8945   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8946   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8947   return Res;
8948 }
8949 
8950 template <typename Derived>
8951 StmtResult
8952 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8953   DeclarationNameInfo DirName;
8954   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8955                                              D->getBeginLoc());
8956   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8957   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8958   return Res;
8959 }
8960 
8961 template <typename Derived>
8962 StmtResult
8963 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8964   DeclarationNameInfo DirName;
8965   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8966                                              D->getBeginLoc());
8967   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8968   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8969   return Res;
8970 }
8971 
8972 template <typename Derived>
8973 StmtResult
8974 TreeTransform<Derived>::TransformOMPScopeDirective(OMPScopeDirective *D) {
8975   DeclarationNameInfo DirName;
8976   getDerived().getSema().StartOpenMPDSABlock(OMPD_scope, DirName, nullptr,
8977                                              D->getBeginLoc());
8978   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8979   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8980   return Res;
8981 }
8982 
8983 template <typename Derived>
8984 StmtResult
8985 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8986   DeclarationNameInfo DirName;
8987   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8988                                              D->getBeginLoc());
8989   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8990   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8991   return Res;
8992 }
8993 
8994 template <typename Derived>
8995 StmtResult
8996 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8997   DeclarationNameInfo DirName;
8998   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8999                                              D->getBeginLoc());
9000   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9001   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9002   return Res;
9003 }
9004 
9005 template <typename Derived>
9006 StmtResult
9007 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
9008   getDerived().getSema().StartOpenMPDSABlock(
9009       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
9010   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9011   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9012   return Res;
9013 }
9014 
9015 template <typename Derived>
9016 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
9017     OMPParallelForDirective *D) {
9018   DeclarationNameInfo DirName;
9019   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
9020                                              nullptr, D->getBeginLoc());
9021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9023   return Res;
9024 }
9025 
9026 template <typename Derived>
9027 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
9028     OMPParallelForSimdDirective *D) {
9029   DeclarationNameInfo DirName;
9030   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
9031                                              nullptr, D->getBeginLoc());
9032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9034   return Res;
9035 }
9036 
9037 template <typename Derived>
9038 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
9039     OMPParallelMasterDirective *D) {
9040   DeclarationNameInfo DirName;
9041   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
9042                                              nullptr, D->getBeginLoc());
9043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9045   return Res;
9046 }
9047 
9048 template <typename Derived>
9049 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
9050     OMPParallelMaskedDirective *D) {
9051   DeclarationNameInfo DirName;
9052   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName,
9053                                              nullptr, D->getBeginLoc());
9054   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9055   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9056   return Res;
9057 }
9058 
9059 template <typename Derived>
9060 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
9061     OMPParallelSectionsDirective *D) {
9062   DeclarationNameInfo DirName;
9063   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
9064                                              nullptr, D->getBeginLoc());
9065   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9066   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9067   return Res;
9068 }
9069 
9070 template <typename Derived>
9071 StmtResult
9072 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
9073   DeclarationNameInfo DirName;
9074   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
9075                                              D->getBeginLoc());
9076   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9077   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9078   return Res;
9079 }
9080 
9081 template <typename Derived>
9082 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
9083     OMPTaskyieldDirective *D) {
9084   DeclarationNameInfo DirName;
9085   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
9086                                              D->getBeginLoc());
9087   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9088   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9089   return Res;
9090 }
9091 
9092 template <typename Derived>
9093 StmtResult
9094 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
9095   DeclarationNameInfo DirName;
9096   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
9097                                              D->getBeginLoc());
9098   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9099   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9100   return Res;
9101 }
9102 
9103 template <typename Derived>
9104 StmtResult
9105 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
9106   DeclarationNameInfo DirName;
9107   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
9108                                              D->getBeginLoc());
9109   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9110   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9111   return Res;
9112 }
9113 
9114 template <typename Derived>
9115 StmtResult
9116 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) {
9117   DeclarationNameInfo DirName;
9118   getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr,
9119                                              D->getBeginLoc());
9120   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9121   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9122   return Res;
9123 }
9124 
9125 template <typename Derived>
9126 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
9127     OMPTaskgroupDirective *D) {
9128   DeclarationNameInfo DirName;
9129   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
9130                                              D->getBeginLoc());
9131   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9132   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9133   return Res;
9134 }
9135 
9136 template <typename Derived>
9137 StmtResult
9138 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
9139   DeclarationNameInfo DirName;
9140   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
9141                                              D->getBeginLoc());
9142   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9143   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9144   return Res;
9145 }
9146 
9147 template <typename Derived>
9148 StmtResult
9149 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
9150   DeclarationNameInfo DirName;
9151   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
9152                                              D->getBeginLoc());
9153   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9154   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9155   return Res;
9156 }
9157 
9158 template <typename Derived>
9159 StmtResult
9160 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
9161   DeclarationNameInfo DirName;
9162   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
9163                                              D->getBeginLoc());
9164   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9165   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9166   return Res;
9167 }
9168 
9169 template <typename Derived>
9170 StmtResult
9171 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
9172   DeclarationNameInfo DirName;
9173   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
9174                                              D->getBeginLoc());
9175   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9176   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9177   return Res;
9178 }
9179 
9180 template <typename Derived>
9181 StmtResult
9182 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
9183   DeclarationNameInfo DirName;
9184   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
9185                                              D->getBeginLoc());
9186   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9187   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9188   return Res;
9189 }
9190 
9191 template <typename Derived>
9192 StmtResult
9193 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
9194   DeclarationNameInfo DirName;
9195   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
9196                                              D->getBeginLoc());
9197   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9198   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9199   return Res;
9200 }
9201 
9202 template <typename Derived>
9203 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9204     OMPTargetDataDirective *D) {
9205   DeclarationNameInfo DirName;
9206   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
9207                                              D->getBeginLoc());
9208   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9209   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9210   return Res;
9211 }
9212 
9213 template <typename Derived>
9214 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9215     OMPTargetEnterDataDirective *D) {
9216   DeclarationNameInfo DirName;
9217   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
9218                                              nullptr, D->getBeginLoc());
9219   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9220   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9221   return Res;
9222 }
9223 
9224 template <typename Derived>
9225 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9226     OMPTargetExitDataDirective *D) {
9227   DeclarationNameInfo DirName;
9228   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
9229                                              nullptr, D->getBeginLoc());
9230   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9231   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9232   return Res;
9233 }
9234 
9235 template <typename Derived>
9236 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9237     OMPTargetParallelDirective *D) {
9238   DeclarationNameInfo DirName;
9239   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
9240                                              nullptr, D->getBeginLoc());
9241   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9242   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9243   return Res;
9244 }
9245 
9246 template <typename Derived>
9247 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9248     OMPTargetParallelForDirective *D) {
9249   DeclarationNameInfo DirName;
9250   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
9251                                              nullptr, D->getBeginLoc());
9252   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9253   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9254   return Res;
9255 }
9256 
9257 template <typename Derived>
9258 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9259     OMPTargetUpdateDirective *D) {
9260   DeclarationNameInfo DirName;
9261   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
9262                                              nullptr, D->getBeginLoc());
9263   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9264   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9265   return Res;
9266 }
9267 
9268 template <typename Derived>
9269 StmtResult
9270 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
9271   DeclarationNameInfo DirName;
9272   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
9273                                              D->getBeginLoc());
9274   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9275   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9276   return Res;
9277 }
9278 
9279 template <typename Derived>
9280 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9281     OMPCancellationPointDirective *D) {
9282   DeclarationNameInfo DirName;
9283   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
9284                                              nullptr, D->getBeginLoc());
9285   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9286   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9287   return Res;
9288 }
9289 
9290 template <typename Derived>
9291 StmtResult
9292 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
9293   DeclarationNameInfo DirName;
9294   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
9295                                              D->getBeginLoc());
9296   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9297   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9298   return Res;
9299 }
9300 
9301 template <typename Derived>
9302 StmtResult
9303 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
9304   DeclarationNameInfo DirName;
9305   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
9306                                              D->getBeginLoc());
9307   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9308   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9309   return Res;
9310 }
9311 
9312 template <typename Derived>
9313 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9314     OMPTaskLoopSimdDirective *D) {
9315   DeclarationNameInfo DirName;
9316   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
9317                                              nullptr, D->getBeginLoc());
9318   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9319   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9320   return Res;
9321 }
9322 
9323 template <typename Derived>
9324 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9325     OMPMasterTaskLoopDirective *D) {
9326   DeclarationNameInfo DirName;
9327   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
9328                                              nullptr, D->getBeginLoc());
9329   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9330   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9331   return Res;
9332 }
9333 
9334 template <typename Derived>
9335 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9336     OMPMaskedTaskLoopDirective *D) {
9337   DeclarationNameInfo DirName;
9338   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName,
9339                                              nullptr, D->getBeginLoc());
9340   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9341   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9342   return Res;
9343 }
9344 
9345 template <typename Derived>
9346 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9347     OMPMasterTaskLoopSimdDirective *D) {
9348   DeclarationNameInfo DirName;
9349   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9350                                              nullptr, D->getBeginLoc());
9351   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9352   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9353   return Res;
9354 }
9355 
9356 template <typename Derived>
9357 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
9358     OMPMaskedTaskLoopSimdDirective *D) {
9359   DeclarationNameInfo DirName;
9360   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName,
9361                                              nullptr, D->getBeginLoc());
9362   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9363   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9364   return Res;
9365 }
9366 
9367 template <typename Derived>
9368 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9369     OMPParallelMasterTaskLoopDirective *D) {
9370   DeclarationNameInfo DirName;
9371   getDerived().getSema().StartOpenMPDSABlock(
9372       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9373   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9374   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9375   return Res;
9376 }
9377 
9378 template <typename Derived>
9379 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
9380     OMPParallelMaskedTaskLoopDirective *D) {
9381   DeclarationNameInfo DirName;
9382   getDerived().getSema().StartOpenMPDSABlock(
9383       OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc());
9384   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9385   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9386   return Res;
9387 }
9388 
9389 template <typename Derived>
9390 StmtResult
9391 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9392     OMPParallelMasterTaskLoopSimdDirective *D) {
9393   DeclarationNameInfo DirName;
9394   getDerived().getSema().StartOpenMPDSABlock(
9395       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9396   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9397   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9398   return Res;
9399 }
9400 
9401 template <typename Derived>
9402 StmtResult
9403 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
9404     OMPParallelMaskedTaskLoopSimdDirective *D) {
9405   DeclarationNameInfo DirName;
9406   getDerived().getSema().StartOpenMPDSABlock(
9407       OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9408   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9409   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9410   return Res;
9411 }
9412 
9413 template <typename Derived>
9414 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9415     OMPDistributeDirective *D) {
9416   DeclarationNameInfo DirName;
9417   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9418                                              D->getBeginLoc());
9419   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9420   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9421   return Res;
9422 }
9423 
9424 template <typename Derived>
9425 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9426     OMPDistributeParallelForDirective *D) {
9427   DeclarationNameInfo DirName;
9428   getDerived().getSema().StartOpenMPDSABlock(
9429       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9430   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9431   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9432   return Res;
9433 }
9434 
9435 template <typename Derived>
9436 StmtResult
9437 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9438     OMPDistributeParallelForSimdDirective *D) {
9439   DeclarationNameInfo DirName;
9440   getDerived().getSema().StartOpenMPDSABlock(
9441       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9442   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9443   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9444   return Res;
9445 }
9446 
9447 template <typename Derived>
9448 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9449     OMPDistributeSimdDirective *D) {
9450   DeclarationNameInfo DirName;
9451   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9452                                              nullptr, D->getBeginLoc());
9453   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9454   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9455   return Res;
9456 }
9457 
9458 template <typename Derived>
9459 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9460     OMPTargetParallelForSimdDirective *D) {
9461   DeclarationNameInfo DirName;
9462   getDerived().getSema().StartOpenMPDSABlock(
9463       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9464   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9465   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9466   return Res;
9467 }
9468 
9469 template <typename Derived>
9470 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9471     OMPTargetSimdDirective *D) {
9472   DeclarationNameInfo DirName;
9473   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9474                                              D->getBeginLoc());
9475   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9476   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9477   return Res;
9478 }
9479 
9480 template <typename Derived>
9481 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9482     OMPTeamsDistributeDirective *D) {
9483   DeclarationNameInfo DirName;
9484   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9485                                              nullptr, D->getBeginLoc());
9486   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9488   return Res;
9489 }
9490 
9491 template <typename Derived>
9492 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9493     OMPTeamsDistributeSimdDirective *D) {
9494   DeclarationNameInfo DirName;
9495   getDerived().getSema().StartOpenMPDSABlock(
9496       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9499   return Res;
9500 }
9501 
9502 template <typename Derived>
9503 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9504     OMPTeamsDistributeParallelForSimdDirective *D) {
9505   DeclarationNameInfo DirName;
9506   getDerived().getSema().StartOpenMPDSABlock(
9507       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9508       D->getBeginLoc());
9509   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9510   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9511   return Res;
9512 }
9513 
9514 template <typename Derived>
9515 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9516     OMPTeamsDistributeParallelForDirective *D) {
9517   DeclarationNameInfo DirName;
9518   getDerived().getSema().StartOpenMPDSABlock(
9519       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9520   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9521   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9522   return Res;
9523 }
9524 
9525 template <typename Derived>
9526 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9527     OMPTargetTeamsDirective *D) {
9528   DeclarationNameInfo DirName;
9529   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9530                                              nullptr, D->getBeginLoc());
9531   auto Res = getDerived().TransformOMPExecutableDirective(D);
9532   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9533   return Res;
9534 }
9535 
9536 template <typename Derived>
9537 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9538     OMPTargetTeamsDistributeDirective *D) {
9539   DeclarationNameInfo DirName;
9540   getDerived().getSema().StartOpenMPDSABlock(
9541       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9542   auto Res = getDerived().TransformOMPExecutableDirective(D);
9543   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9544   return Res;
9545 }
9546 
9547 template <typename Derived>
9548 StmtResult
9549 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9550     OMPTargetTeamsDistributeParallelForDirective *D) {
9551   DeclarationNameInfo DirName;
9552   getDerived().getSema().StartOpenMPDSABlock(
9553       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9554       D->getBeginLoc());
9555   auto Res = getDerived().TransformOMPExecutableDirective(D);
9556   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9557   return Res;
9558 }
9559 
9560 template <typename Derived>
9561 StmtResult TreeTransform<Derived>::
9562     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9563         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9564   DeclarationNameInfo DirName;
9565   getDerived().getSema().StartOpenMPDSABlock(
9566       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9567       D->getBeginLoc());
9568   auto Res = getDerived().TransformOMPExecutableDirective(D);
9569   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9570   return Res;
9571 }
9572 
9573 template <typename Derived>
9574 StmtResult
9575 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9576     OMPTargetTeamsDistributeSimdDirective *D) {
9577   DeclarationNameInfo DirName;
9578   getDerived().getSema().StartOpenMPDSABlock(
9579       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9580   auto Res = getDerived().TransformOMPExecutableDirective(D);
9581   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9582   return Res;
9583 }
9584 
9585 template <typename Derived>
9586 StmtResult
9587 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9588   DeclarationNameInfo DirName;
9589   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9590                                              D->getBeginLoc());
9591   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9592   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9593   return Res;
9594 }
9595 
9596 template <typename Derived>
9597 StmtResult
9598 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9599   DeclarationNameInfo DirName;
9600   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9601                                              D->getBeginLoc());
9602   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9603   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9604   return Res;
9605 }
9606 
9607 template <typename Derived>
9608 StmtResult
9609 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9610   DeclarationNameInfo DirName;
9611   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9612                                              D->getBeginLoc());
9613   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9614   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9615   return Res;
9616 }
9617 
9618 template <typename Derived>
9619 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9620     OMPGenericLoopDirective *D) {
9621   DeclarationNameInfo DirName;
9622   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9623                                              D->getBeginLoc());
9624   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9625   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9626   return Res;
9627 }
9628 
9629 template <typename Derived>
9630 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9631     OMPTeamsGenericLoopDirective *D) {
9632   DeclarationNameInfo DirName;
9633   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9634                                              D->getBeginLoc());
9635   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9636   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9637   return Res;
9638 }
9639 
9640 template <typename Derived>
9641 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9642     OMPTargetTeamsGenericLoopDirective *D) {
9643   DeclarationNameInfo DirName;
9644   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9645                                              nullptr, D->getBeginLoc());
9646   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9647   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9648   return Res;
9649 }
9650 
9651 template <typename Derived>
9652 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9653     OMPParallelGenericLoopDirective *D) {
9654   DeclarationNameInfo DirName;
9655   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9656                                              nullptr, D->getBeginLoc());
9657   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9658   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9659   return Res;
9660 }
9661 
9662 template <typename Derived>
9663 StmtResult
9664 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9665     OMPTargetParallelGenericLoopDirective *D) {
9666   DeclarationNameInfo DirName;
9667   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9668                                              nullptr, D->getBeginLoc());
9669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9671   return Res;
9672 }
9673 
9674 //===----------------------------------------------------------------------===//
9675 // OpenMP clause transformation
9676 //===----------------------------------------------------------------------===//
9677 template <typename Derived>
9678 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9679   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9680   if (Cond.isInvalid())
9681     return nullptr;
9682   return getDerived().RebuildOMPIfClause(
9683       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9684       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9685 }
9686 
9687 template <typename Derived>
9688 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9689   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9690   if (Cond.isInvalid())
9691     return nullptr;
9692   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9693                                             C->getLParenLoc(), C->getEndLoc());
9694 }
9695 
9696 template <typename Derived>
9697 OMPClause *
9698 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9699   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9700   if (NumThreads.isInvalid())
9701     return nullptr;
9702   return getDerived().RebuildOMPNumThreadsClause(
9703       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9704 }
9705 
9706 template <typename Derived>
9707 OMPClause *
9708 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9709   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9710   if (E.isInvalid())
9711     return nullptr;
9712   return getDerived().RebuildOMPSafelenClause(
9713       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9714 }
9715 
9716 template <typename Derived>
9717 OMPClause *
9718 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9719   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9720   if (E.isInvalid())
9721     return nullptr;
9722   return getDerived().RebuildOMPAllocatorClause(
9723       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9724 }
9725 
9726 template <typename Derived>
9727 OMPClause *
9728 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9729   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9730   if (E.isInvalid())
9731     return nullptr;
9732   return getDerived().RebuildOMPSimdlenClause(
9733       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9734 }
9735 
9736 template <typename Derived>
9737 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9738   SmallVector<Expr *, 4> TransformedSizes;
9739   TransformedSizes.reserve(C->getNumSizes());
9740   bool Changed = false;
9741   for (Expr *E : C->getSizesRefs()) {
9742     if (!E) {
9743       TransformedSizes.push_back(nullptr);
9744       continue;
9745     }
9746 
9747     ExprResult T = getDerived().TransformExpr(E);
9748     if (T.isInvalid())
9749       return nullptr;
9750     if (E != T.get())
9751       Changed = true;
9752     TransformedSizes.push_back(T.get());
9753   }
9754 
9755   if (!Changed && !getDerived().AlwaysRebuild())
9756     return C;
9757   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9758                                C->getLParenLoc(), C->getEndLoc());
9759 }
9760 
9761 template <typename Derived>
9762 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9763   if (!getDerived().AlwaysRebuild())
9764     return C;
9765   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9766 }
9767 
9768 template <typename Derived>
9769 OMPClause *
9770 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9771   ExprResult T = getDerived().TransformExpr(C->getFactor());
9772   if (T.isInvalid())
9773     return nullptr;
9774   Expr *Factor = T.get();
9775   bool Changed = Factor != C->getFactor();
9776 
9777   if (!Changed && !getDerived().AlwaysRebuild())
9778     return C;
9779   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9780                                  C->getEndLoc());
9781 }
9782 
9783 template <typename Derived>
9784 OMPClause *
9785 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9786   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9787   if (E.isInvalid())
9788     return nullptr;
9789   return getDerived().RebuildOMPCollapseClause(
9790       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9791 }
9792 
9793 template <typename Derived>
9794 OMPClause *
9795 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9796   return getDerived().RebuildOMPDefaultClause(
9797       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9798       C->getLParenLoc(), C->getEndLoc());
9799 }
9800 
9801 template <typename Derived>
9802 OMPClause *
9803 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9804   return getDerived().RebuildOMPProcBindClause(
9805       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9806       C->getLParenLoc(), C->getEndLoc());
9807 }
9808 
9809 template <typename Derived>
9810 OMPClause *
9811 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9812   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9813   if (E.isInvalid())
9814     return nullptr;
9815   return getDerived().RebuildOMPScheduleClause(
9816       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9817       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9818       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9819       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9820 }
9821 
9822 template <typename Derived>
9823 OMPClause *
9824 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9825   ExprResult E;
9826   if (auto *Num = C->getNumForLoops()) {
9827     E = getDerived().TransformExpr(Num);
9828     if (E.isInvalid())
9829       return nullptr;
9830   }
9831   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9832                                               C->getLParenLoc(), E.get());
9833 }
9834 
9835 template <typename Derived>
9836 OMPClause *
9837 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9838   ExprResult E;
9839   if (Expr *Evt = C->getEventHandler()) {
9840     E = getDerived().TransformExpr(Evt);
9841     if (E.isInvalid())
9842       return nullptr;
9843   }
9844   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9845                                              C->getLParenLoc(), C->getEndLoc());
9846 }
9847 
9848 template <typename Derived>
9849 OMPClause *
9850 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9851   // No need to rebuild this clause, no template-dependent parameters.
9852   return C;
9853 }
9854 
9855 template <typename Derived>
9856 OMPClause *
9857 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9858   // No need to rebuild this clause, no template-dependent parameters.
9859   return C;
9860 }
9861 
9862 template <typename Derived>
9863 OMPClause *
9864 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9865   // No need to rebuild this clause, no template-dependent parameters.
9866   return C;
9867 }
9868 
9869 template <typename Derived>
9870 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9871   // No need to rebuild this clause, no template-dependent parameters.
9872   return C;
9873 }
9874 
9875 template <typename Derived>
9876 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9877   // No need to rebuild this clause, no template-dependent parameters.
9878   return C;
9879 }
9880 
9881 template <typename Derived>
9882 OMPClause *
9883 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9884   // No need to rebuild this clause, no template-dependent parameters.
9885   return C;
9886 }
9887 
9888 template <typename Derived>
9889 OMPClause *
9890 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9891   // No need to rebuild this clause, no template-dependent parameters.
9892   return C;
9893 }
9894 
9895 template <typename Derived>
9896 OMPClause *
9897 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9898   // No need to rebuild this clause, no template-dependent parameters.
9899   return C;
9900 }
9901 
9902 template <typename Derived>
9903 OMPClause *TreeTransform<Derived>::TransformOMPFailClause(OMPFailClause *C) {
9904   // No need to rebuild this clause, no template-dependent parameters.
9905   return C;
9906 }
9907 
9908 template <typename Derived>
9909 OMPClause *
9910 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9911   // No need to rebuild this clause, no template-dependent parameters.
9912   return C;
9913 }
9914 
9915 template <typename Derived>
9916 OMPClause *
9917 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9918   // No need to rebuild this clause, no template-dependent parameters.
9919   return C;
9920 }
9921 
9922 template <typename Derived>
9923 OMPClause *
9924 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9925   // No need to rebuild this clause, no template-dependent parameters.
9926   return C;
9927 }
9928 
9929 template <typename Derived>
9930 OMPClause *
9931 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9932   // No need to rebuild this clause, no template-dependent parameters.
9933   return C;
9934 }
9935 
9936 template <typename Derived>
9937 OMPClause *
9938 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9939   // No need to rebuild this clause, no template-dependent parameters.
9940   return C;
9941 }
9942 
9943 template <typename Derived>
9944 OMPClause *
9945 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9946   // No need to rebuild this clause, no template-dependent parameters.
9947   return C;
9948 }
9949 
9950 template <typename Derived>
9951 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9952   // No need to rebuild this clause, no template-dependent parameters.
9953   return C;
9954 }
9955 
9956 template <typename Derived>
9957 OMPClause *
9958 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9959   // No need to rebuild this clause, no template-dependent parameters.
9960   return C;
9961 }
9962 
9963 template <typename Derived>
9964 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9965   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9966   if (IVR.isInvalid())
9967     return nullptr;
9968 
9969   OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
9970   InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
9971   for (Expr *E : llvm::drop_begin(C->varlists())) {
9972     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9973     if (ER.isInvalid())
9974       return nullptr;
9975     InteropInfo.PreferTypes.push_back(ER.get());
9976   }
9977   return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
9978                                            C->getBeginLoc(), C->getLParenLoc(),
9979                                            C->getVarLoc(), C->getEndLoc());
9980 }
9981 
9982 template <typename Derived>
9983 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9984   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9985   if (ER.isInvalid())
9986     return nullptr;
9987   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9988                                           C->getLParenLoc(), C->getVarLoc(),
9989                                           C->getEndLoc());
9990 }
9991 
9992 template <typename Derived>
9993 OMPClause *
9994 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9995   ExprResult ER;
9996   if (Expr *IV = C->getInteropVar()) {
9997     ER = getDerived().TransformExpr(IV);
9998     if (ER.isInvalid())
9999       return nullptr;
10000   }
10001   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
10002                                               C->getLParenLoc(), C->getVarLoc(),
10003                                               C->getEndLoc());
10004 }
10005 
10006 template <typename Derived>
10007 OMPClause *
10008 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
10009   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10010   if (Cond.isInvalid())
10011     return nullptr;
10012   return getDerived().RebuildOMPNovariantsClause(
10013       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10014 }
10015 
10016 template <typename Derived>
10017 OMPClause *
10018 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
10019   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
10020   if (Cond.isInvalid())
10021     return nullptr;
10022   return getDerived().RebuildOMPNocontextClause(
10023       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10024 }
10025 
10026 template <typename Derived>
10027 OMPClause *
10028 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
10029   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
10030   if (ThreadID.isInvalid())
10031     return nullptr;
10032   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
10033                                              C->getLParenLoc(), C->getEndLoc());
10034 }
10035 
10036 template <typename Derived>
10037 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
10038   ExprResult E = getDerived().TransformExpr(C->getAlignment());
10039   if (E.isInvalid())
10040     return nullptr;
10041   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
10042                                             C->getLParenLoc(), C->getEndLoc());
10043 }
10044 
10045 template <typename Derived>
10046 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
10047     OMPUnifiedAddressClause *C) {
10048   llvm_unreachable("unified_address clause cannot appear in dependent context");
10049 }
10050 
10051 template <typename Derived>
10052 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
10053     OMPUnifiedSharedMemoryClause *C) {
10054   llvm_unreachable(
10055       "unified_shared_memory clause cannot appear in dependent context");
10056 }
10057 
10058 template <typename Derived>
10059 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
10060     OMPReverseOffloadClause *C) {
10061   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
10062 }
10063 
10064 template <typename Derived>
10065 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
10066     OMPDynamicAllocatorsClause *C) {
10067   llvm_unreachable(
10068       "dynamic_allocators clause cannot appear in dependent context");
10069 }
10070 
10071 template <typename Derived>
10072 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
10073     OMPAtomicDefaultMemOrderClause *C) {
10074   llvm_unreachable(
10075       "atomic_default_mem_order clause cannot appear in dependent context");
10076 }
10077 
10078 template <typename Derived>
10079 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) {
10080   return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(),
10081                                          C->getBeginLoc(), C->getLParenLoc(),
10082                                          C->getEndLoc());
10083 }
10084 
10085 template <typename Derived>
10086 OMPClause *
10087 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) {
10088   return getDerived().RebuildOMPSeverityClause(
10089       C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(),
10090       C->getLParenLoc(), C->getEndLoc());
10091 }
10092 
10093 template <typename Derived>
10094 OMPClause *
10095 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) {
10096   ExprResult E = getDerived().TransformExpr(C->getMessageString());
10097   if (E.isInvalid())
10098     return nullptr;
10099   return getDerived().RebuildOMPMessageClause(
10100       C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(),
10101       C->getEndLoc());
10102 }
10103 
10104 template <typename Derived>
10105 OMPClause *
10106 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
10107   llvm::SmallVector<Expr *, 16> Vars;
10108   Vars.reserve(C->varlist_size());
10109   for (auto *VE : C->varlists()) {
10110     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10111     if (EVar.isInvalid())
10112       return nullptr;
10113     Vars.push_back(EVar.get());
10114   }
10115   return getDerived().RebuildOMPPrivateClause(
10116       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10117 }
10118 
10119 template <typename Derived>
10120 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
10121     OMPFirstprivateClause *C) {
10122   llvm::SmallVector<Expr *, 16> Vars;
10123   Vars.reserve(C->varlist_size());
10124   for (auto *VE : C->varlists()) {
10125     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10126     if (EVar.isInvalid())
10127       return nullptr;
10128     Vars.push_back(EVar.get());
10129   }
10130   return getDerived().RebuildOMPFirstprivateClause(
10131       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10132 }
10133 
10134 template <typename Derived>
10135 OMPClause *
10136 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
10137   llvm::SmallVector<Expr *, 16> Vars;
10138   Vars.reserve(C->varlist_size());
10139   for (auto *VE : C->varlists()) {
10140     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10141     if (EVar.isInvalid())
10142       return nullptr;
10143     Vars.push_back(EVar.get());
10144   }
10145   return getDerived().RebuildOMPLastprivateClause(
10146       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
10147       C->getLParenLoc(), C->getEndLoc());
10148 }
10149 
10150 template <typename Derived>
10151 OMPClause *
10152 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
10153   llvm::SmallVector<Expr *, 16> Vars;
10154   Vars.reserve(C->varlist_size());
10155   for (auto *VE : C->varlists()) {
10156     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10157     if (EVar.isInvalid())
10158       return nullptr;
10159     Vars.push_back(EVar.get());
10160   }
10161   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
10162                                              C->getLParenLoc(), C->getEndLoc());
10163 }
10164 
10165 template <typename Derived>
10166 OMPClause *
10167 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
10168   llvm::SmallVector<Expr *, 16> Vars;
10169   Vars.reserve(C->varlist_size());
10170   for (auto *VE : C->varlists()) {
10171     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10172     if (EVar.isInvalid())
10173       return nullptr;
10174     Vars.push_back(EVar.get());
10175   }
10176   CXXScopeSpec ReductionIdScopeSpec;
10177   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10178 
10179   DeclarationNameInfo NameInfo = C->getNameInfo();
10180   if (NameInfo.getName()) {
10181     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10182     if (!NameInfo.getName())
10183       return nullptr;
10184   }
10185   // Build a list of all UDR decls with the same names ranged by the Scopes.
10186   // The Scope boundary is a duplication of the previous decl.
10187   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10188   for (auto *E : C->reduction_ops()) {
10189     // Transform all the decls.
10190     if (E) {
10191       auto *ULE = cast<UnresolvedLookupExpr>(E);
10192       UnresolvedSet<8> Decls;
10193       for (auto *D : ULE->decls()) {
10194         NamedDecl *InstD =
10195             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10196         Decls.addDecl(InstD, InstD->getAccess());
10197       }
10198       UnresolvedReductions.push_back(
10199        UnresolvedLookupExpr::Create(
10200           SemaRef.Context, /*NamingClass=*/nullptr,
10201           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
10202           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
10203           Decls.begin(), Decls.end()));
10204     } else
10205       UnresolvedReductions.push_back(nullptr);
10206   }
10207   return getDerived().RebuildOMPReductionClause(
10208       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10209       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10210       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10211 }
10212 
10213 template <typename Derived>
10214 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10215     OMPTaskReductionClause *C) {
10216   llvm::SmallVector<Expr *, 16> Vars;
10217   Vars.reserve(C->varlist_size());
10218   for (auto *VE : C->varlists()) {
10219     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10220     if (EVar.isInvalid())
10221       return nullptr;
10222     Vars.push_back(EVar.get());
10223   }
10224   CXXScopeSpec ReductionIdScopeSpec;
10225   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10226 
10227   DeclarationNameInfo NameInfo = C->getNameInfo();
10228   if (NameInfo.getName()) {
10229     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10230     if (!NameInfo.getName())
10231       return nullptr;
10232   }
10233   // Build a list of all UDR decls with the same names ranged by the Scopes.
10234   // The Scope boundary is a duplication of the previous decl.
10235   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10236   for (auto *E : C->reduction_ops()) {
10237     // Transform all the decls.
10238     if (E) {
10239       auto *ULE = cast<UnresolvedLookupExpr>(E);
10240       UnresolvedSet<8> Decls;
10241       for (auto *D : ULE->decls()) {
10242         NamedDecl *InstD =
10243             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10244         Decls.addDecl(InstD, InstD->getAccess());
10245       }
10246       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10247           SemaRef.Context, /*NamingClass=*/nullptr,
10248           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10249           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10250     } else
10251       UnresolvedReductions.push_back(nullptr);
10252   }
10253   return getDerived().RebuildOMPTaskReductionClause(
10254       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10255       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10256 }
10257 
10258 template <typename Derived>
10259 OMPClause *
10260 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
10261   llvm::SmallVector<Expr *, 16> Vars;
10262   Vars.reserve(C->varlist_size());
10263   for (auto *VE : C->varlists()) {
10264     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10265     if (EVar.isInvalid())
10266       return nullptr;
10267     Vars.push_back(EVar.get());
10268   }
10269   CXXScopeSpec ReductionIdScopeSpec;
10270   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10271 
10272   DeclarationNameInfo NameInfo = C->getNameInfo();
10273   if (NameInfo.getName()) {
10274     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10275     if (!NameInfo.getName())
10276       return nullptr;
10277   }
10278   // Build a list of all UDR decls with the same names ranged by the Scopes.
10279   // The Scope boundary is a duplication of the previous decl.
10280   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10281   for (auto *E : C->reduction_ops()) {
10282     // Transform all the decls.
10283     if (E) {
10284       auto *ULE = cast<UnresolvedLookupExpr>(E);
10285       UnresolvedSet<8> Decls;
10286       for (auto *D : ULE->decls()) {
10287         NamedDecl *InstD =
10288             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10289         Decls.addDecl(InstD, InstD->getAccess());
10290       }
10291       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10292           SemaRef.Context, /*NamingClass=*/nullptr,
10293           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10294           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10295     } else
10296       UnresolvedReductions.push_back(nullptr);
10297   }
10298   return getDerived().RebuildOMPInReductionClause(
10299       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10300       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10301 }
10302 
10303 template <typename Derived>
10304 OMPClause *
10305 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
10306   llvm::SmallVector<Expr *, 16> Vars;
10307   Vars.reserve(C->varlist_size());
10308   for (auto *VE : C->varlists()) {
10309     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10310     if (EVar.isInvalid())
10311       return nullptr;
10312     Vars.push_back(EVar.get());
10313   }
10314   ExprResult Step = getDerived().TransformExpr(C->getStep());
10315   if (Step.isInvalid())
10316     return nullptr;
10317   return getDerived().RebuildOMPLinearClause(
10318       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
10319       C->getModifierLoc(), C->getColonLoc(), C->getStepModifierLoc(),
10320       C->getEndLoc());
10321 }
10322 
10323 template <typename Derived>
10324 OMPClause *
10325 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
10326   llvm::SmallVector<Expr *, 16> Vars;
10327   Vars.reserve(C->varlist_size());
10328   for (auto *VE : C->varlists()) {
10329     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10330     if (EVar.isInvalid())
10331       return nullptr;
10332     Vars.push_back(EVar.get());
10333   }
10334   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
10335   if (Alignment.isInvalid())
10336     return nullptr;
10337   return getDerived().RebuildOMPAlignedClause(
10338       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
10339       C->getColonLoc(), C->getEndLoc());
10340 }
10341 
10342 template <typename Derived>
10343 OMPClause *
10344 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
10345   llvm::SmallVector<Expr *, 16> Vars;
10346   Vars.reserve(C->varlist_size());
10347   for (auto *VE : C->varlists()) {
10348     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10349     if (EVar.isInvalid())
10350       return nullptr;
10351     Vars.push_back(EVar.get());
10352   }
10353   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
10354                                              C->getLParenLoc(), C->getEndLoc());
10355 }
10356 
10357 template <typename Derived>
10358 OMPClause *
10359 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
10360   llvm::SmallVector<Expr *, 16> Vars;
10361   Vars.reserve(C->varlist_size());
10362   for (auto *VE : C->varlists()) {
10363     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10364     if (EVar.isInvalid())
10365       return nullptr;
10366     Vars.push_back(EVar.get());
10367   }
10368   return getDerived().RebuildOMPCopyprivateClause(
10369       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10370 }
10371 
10372 template <typename Derived>
10373 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
10374   llvm::SmallVector<Expr *, 16> Vars;
10375   Vars.reserve(C->varlist_size());
10376   for (auto *VE : C->varlists()) {
10377     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10378     if (EVar.isInvalid())
10379       return nullptr;
10380     Vars.push_back(EVar.get());
10381   }
10382   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
10383                                             C->getLParenLoc(), C->getEndLoc());
10384 }
10385 
10386 template <typename Derived>
10387 OMPClause *
10388 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
10389   ExprResult E = getDerived().TransformExpr(C->getDepobj());
10390   if (E.isInvalid())
10391     return nullptr;
10392   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
10393                                              C->getLParenLoc(), C->getEndLoc());
10394 }
10395 
10396 template <typename Derived>
10397 OMPClause *
10398 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
10399   llvm::SmallVector<Expr *, 16> Vars;
10400   Expr *DepModifier = C->getModifier();
10401   if (DepModifier) {
10402     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
10403     if (DepModRes.isInvalid())
10404       return nullptr;
10405     DepModifier = DepModRes.get();
10406   }
10407   Vars.reserve(C->varlist_size());
10408   for (auto *VE : C->varlists()) {
10409     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10410     if (EVar.isInvalid())
10411       return nullptr;
10412     Vars.push_back(EVar.get());
10413   }
10414   return getDerived().RebuildOMPDependClause(
10415       {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(),
10416        C->getOmpAllMemoryLoc()},
10417       DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10418 }
10419 
10420 template <typename Derived>
10421 OMPClause *
10422 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10423   ExprResult E = getDerived().TransformExpr(C->getDevice());
10424   if (E.isInvalid())
10425     return nullptr;
10426   return getDerived().RebuildOMPDeviceClause(
10427       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10428       C->getModifierLoc(), C->getEndLoc());
10429 }
10430 
10431 template <typename Derived, class T>
10432 bool transformOMPMappableExprListClause(
10433     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10434     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10435     DeclarationNameInfo &MapperIdInfo,
10436     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10437   // Transform expressions in the list.
10438   Vars.reserve(C->varlist_size());
10439   for (auto *VE : C->varlists()) {
10440     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10441     if (EVar.isInvalid())
10442       return true;
10443     Vars.push_back(EVar.get());
10444   }
10445   // Transform mapper scope specifier and identifier.
10446   NestedNameSpecifierLoc QualifierLoc;
10447   if (C->getMapperQualifierLoc()) {
10448     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10449         C->getMapperQualifierLoc());
10450     if (!QualifierLoc)
10451       return true;
10452   }
10453   MapperIdScopeSpec.Adopt(QualifierLoc);
10454   MapperIdInfo = C->getMapperIdInfo();
10455   if (MapperIdInfo.getName()) {
10456     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10457     if (!MapperIdInfo.getName())
10458       return true;
10459   }
10460   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10461   // the previous user-defined mapper lookup in dependent environment.
10462   for (auto *E : C->mapperlists()) {
10463     // Transform all the decls.
10464     if (E) {
10465       auto *ULE = cast<UnresolvedLookupExpr>(E);
10466       UnresolvedSet<8> Decls;
10467       for (auto *D : ULE->decls()) {
10468         NamedDecl *InstD =
10469             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10470         Decls.addDecl(InstD, InstD->getAccess());
10471       }
10472       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10473           TT.getSema().Context, /*NamingClass=*/nullptr,
10474           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10475           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10476           Decls.end()));
10477     } else {
10478       UnresolvedMappers.push_back(nullptr);
10479     }
10480   }
10481   return false;
10482 }
10483 
10484 template <typename Derived>
10485 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10486   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10487   llvm::SmallVector<Expr *, 16> Vars;
10488   Expr *IteratorModifier = C->getIteratorModifier();
10489   if (IteratorModifier) {
10490     ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
10491     if (MapModRes.isInvalid())
10492       return nullptr;
10493     IteratorModifier = MapModRes.get();
10494   }
10495   CXXScopeSpec MapperIdScopeSpec;
10496   DeclarationNameInfo MapperIdInfo;
10497   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10498   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10499           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10500     return nullptr;
10501   return getDerived().RebuildOMPMapClause(
10502       IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(),
10503       MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(),
10504       C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10505 }
10506 
10507 template <typename Derived>
10508 OMPClause *
10509 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10510   Expr *Allocator = C->getAllocator();
10511   if (Allocator) {
10512     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10513     if (AllocatorRes.isInvalid())
10514       return nullptr;
10515     Allocator = AllocatorRes.get();
10516   }
10517   llvm::SmallVector<Expr *, 16> Vars;
10518   Vars.reserve(C->varlist_size());
10519   for (auto *VE : C->varlists()) {
10520     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10521     if (EVar.isInvalid())
10522       return nullptr;
10523     Vars.push_back(EVar.get());
10524   }
10525   return getDerived().RebuildOMPAllocateClause(
10526       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10527       C->getEndLoc());
10528 }
10529 
10530 template <typename Derived>
10531 OMPClause *
10532 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10533   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10534   if (E.isInvalid())
10535     return nullptr;
10536   return getDerived().RebuildOMPNumTeamsClause(
10537       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10538 }
10539 
10540 template <typename Derived>
10541 OMPClause *
10542 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10543   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10544   if (E.isInvalid())
10545     return nullptr;
10546   return getDerived().RebuildOMPThreadLimitClause(
10547       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10548 }
10549 
10550 template <typename Derived>
10551 OMPClause *
10552 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10553   ExprResult E = getDerived().TransformExpr(C->getPriority());
10554   if (E.isInvalid())
10555     return nullptr;
10556   return getDerived().RebuildOMPPriorityClause(
10557       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10558 }
10559 
10560 template <typename Derived>
10561 OMPClause *
10562 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10563   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10564   if (E.isInvalid())
10565     return nullptr;
10566   return getDerived().RebuildOMPGrainsizeClause(
10567       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10568       C->getModifierLoc(), C->getEndLoc());
10569 }
10570 
10571 template <typename Derived>
10572 OMPClause *
10573 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10574   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10575   if (E.isInvalid())
10576     return nullptr;
10577   return getDerived().RebuildOMPNumTasksClause(
10578       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10579       C->getModifierLoc(), C->getEndLoc());
10580 }
10581 
10582 template <typename Derived>
10583 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10584   ExprResult E = getDerived().TransformExpr(C->getHint());
10585   if (E.isInvalid())
10586     return nullptr;
10587   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10588                                            C->getLParenLoc(), C->getEndLoc());
10589 }
10590 
10591 template <typename Derived>
10592 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10593     OMPDistScheduleClause *C) {
10594   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10595   if (E.isInvalid())
10596     return nullptr;
10597   return getDerived().RebuildOMPDistScheduleClause(
10598       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10599       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10600 }
10601 
10602 template <typename Derived>
10603 OMPClause *
10604 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10605   // Rebuild Defaultmap Clause since we need to invoke the checking of
10606   // defaultmap(none:variable-category) after template initialization.
10607   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10608                                                  C->getDefaultmapKind(),
10609                                                  C->getBeginLoc(),
10610                                                  C->getLParenLoc(),
10611                                                  C->getDefaultmapModifierLoc(),
10612                                                  C->getDefaultmapKindLoc(),
10613                                                  C->getEndLoc());
10614 }
10615 
10616 template <typename Derived>
10617 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10618   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10619   llvm::SmallVector<Expr *, 16> Vars;
10620   CXXScopeSpec MapperIdScopeSpec;
10621   DeclarationNameInfo MapperIdInfo;
10622   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10623   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10624           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10625     return nullptr;
10626   return getDerived().RebuildOMPToClause(
10627       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10628       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10629 }
10630 
10631 template <typename Derived>
10632 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10633   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10634   llvm::SmallVector<Expr *, 16> Vars;
10635   CXXScopeSpec MapperIdScopeSpec;
10636   DeclarationNameInfo MapperIdInfo;
10637   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10638   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10639           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10640     return nullptr;
10641   return getDerived().RebuildOMPFromClause(
10642       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10643       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10644 }
10645 
10646 template <typename Derived>
10647 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10648     OMPUseDevicePtrClause *C) {
10649   llvm::SmallVector<Expr *, 16> Vars;
10650   Vars.reserve(C->varlist_size());
10651   for (auto *VE : C->varlists()) {
10652     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10653     if (EVar.isInvalid())
10654       return nullptr;
10655     Vars.push_back(EVar.get());
10656   }
10657   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10658   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10659 }
10660 
10661 template <typename Derived>
10662 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10663     OMPUseDeviceAddrClause *C) {
10664   llvm::SmallVector<Expr *, 16> Vars;
10665   Vars.reserve(C->varlist_size());
10666   for (auto *VE : C->varlists()) {
10667     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10668     if (EVar.isInvalid())
10669       return nullptr;
10670     Vars.push_back(EVar.get());
10671   }
10672   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10673   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10674 }
10675 
10676 template <typename Derived>
10677 OMPClause *
10678 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10679   llvm::SmallVector<Expr *, 16> Vars;
10680   Vars.reserve(C->varlist_size());
10681   for (auto *VE : C->varlists()) {
10682     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10683     if (EVar.isInvalid())
10684       return nullptr;
10685     Vars.push_back(EVar.get());
10686   }
10687   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10688   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10689 }
10690 
10691 template <typename Derived>
10692 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
10693     OMPHasDeviceAddrClause *C) {
10694   llvm::SmallVector<Expr *, 16> Vars;
10695   Vars.reserve(C->varlist_size());
10696   for (auto *VE : C->varlists()) {
10697     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10698     if (EVar.isInvalid())
10699       return nullptr;
10700     Vars.push_back(EVar.get());
10701   }
10702   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10703   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
10704 }
10705 
10706 template <typename Derived>
10707 OMPClause *
10708 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10709   llvm::SmallVector<Expr *, 16> Vars;
10710   Vars.reserve(C->varlist_size());
10711   for (auto *VE : C->varlists()) {
10712     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10713     if (EVar.isInvalid())
10714       return nullptr;
10715     Vars.push_back(EVar.get());
10716   }
10717   return getDerived().RebuildOMPNontemporalClause(
10718       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10719 }
10720 
10721 template <typename Derived>
10722 OMPClause *
10723 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10724   llvm::SmallVector<Expr *, 16> Vars;
10725   Vars.reserve(C->varlist_size());
10726   for (auto *VE : C->varlists()) {
10727     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10728     if (EVar.isInvalid())
10729       return nullptr;
10730     Vars.push_back(EVar.get());
10731   }
10732   return getDerived().RebuildOMPInclusiveClause(
10733       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10734 }
10735 
10736 template <typename Derived>
10737 OMPClause *
10738 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10739   llvm::SmallVector<Expr *, 16> Vars;
10740   Vars.reserve(C->varlist_size());
10741   for (auto *VE : C->varlists()) {
10742     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10743     if (EVar.isInvalid())
10744       return nullptr;
10745     Vars.push_back(EVar.get());
10746   }
10747   return getDerived().RebuildOMPExclusiveClause(
10748       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10749 }
10750 
10751 template <typename Derived>
10752 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10753     OMPUsesAllocatorsClause *C) {
10754   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10755   Data.reserve(C->getNumberOfAllocators());
10756   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10757     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10758     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10759     if (Allocator.isInvalid())
10760       continue;
10761     ExprResult AllocatorTraits;
10762     if (Expr *AT = D.AllocatorTraits) {
10763       AllocatorTraits = getDerived().TransformExpr(AT);
10764       if (AllocatorTraits.isInvalid())
10765         continue;
10766     }
10767     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10768     NewD.Allocator = Allocator.get();
10769     NewD.AllocatorTraits = AllocatorTraits.get();
10770     NewD.LParenLoc = D.LParenLoc;
10771     NewD.RParenLoc = D.RParenLoc;
10772   }
10773   return getDerived().RebuildOMPUsesAllocatorsClause(
10774       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10775 }
10776 
10777 template <typename Derived>
10778 OMPClause *
10779 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10780   SmallVector<Expr *, 4> Locators;
10781   Locators.reserve(C->varlist_size());
10782   ExprResult ModifierRes;
10783   if (Expr *Modifier = C->getModifier()) {
10784     ModifierRes = getDerived().TransformExpr(Modifier);
10785     if (ModifierRes.isInvalid())
10786       return nullptr;
10787   }
10788   for (Expr *E : C->varlists()) {
10789     ExprResult Locator = getDerived().TransformExpr(E);
10790     if (Locator.isInvalid())
10791       continue;
10792     Locators.push_back(Locator.get());
10793   }
10794   return getDerived().RebuildOMPAffinityClause(
10795       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10796       ModifierRes.get(), Locators);
10797 }
10798 
10799 template <typename Derived>
10800 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10801   return getDerived().RebuildOMPOrderClause(
10802       C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(),
10803       C->getEndLoc(), C->getModifier(), C->getModifierKwLoc());
10804 }
10805 
10806 template <typename Derived>
10807 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10808   return getDerived().RebuildOMPBindClause(
10809       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10810       C->getLParenLoc(), C->getEndLoc());
10811 }
10812 
10813 template <typename Derived>
10814 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
10815     OMPXDynCGroupMemClause *C) {
10816   ExprResult Size = getDerived().TransformExpr(C->getSize());
10817   if (Size.isInvalid())
10818     return nullptr;
10819   return getDerived().RebuildOMPXDynCGroupMemClause(
10820       Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10821 }
10822 
10823 template <typename Derived>
10824 OMPClause *
10825 TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *C) {
10826   llvm::SmallVector<Expr *, 16> Vars;
10827   Vars.reserve(C->varlist_size());
10828   for (auto *VE : C->varlists()) {
10829     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10830     if (EVar.isInvalid())
10831       return nullptr;
10832     Vars.push_back(EVar.get());
10833   }
10834   return getDerived().RebuildOMPDoacrossClause(
10835       C->getDependenceType(), C->getDependenceLoc(), C->getColonLoc(), Vars,
10836       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10837 }
10838 
10839 template <typename Derived>
10840 OMPClause *
10841 TreeTransform<Derived>::TransformOMPXAttributeClause(OMPXAttributeClause *C) {
10842   SmallVector<const Attr *> NewAttrs;
10843   for (auto *A : C->getAttrs())
10844     NewAttrs.push_back(getDerived().TransformAttr(A));
10845   return getDerived().RebuildOMPXAttributeClause(
10846       NewAttrs, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10847 }
10848 
10849 template <typename Derived>
10850 OMPClause *TreeTransform<Derived>::TransformOMPXBareClause(OMPXBareClause *C) {
10851   return getDerived().RebuildOMPXBareClause(C->getBeginLoc(), C->getEndLoc());
10852 }
10853 
10854 //===----------------------------------------------------------------------===//
10855 // Expression transformation
10856 //===----------------------------------------------------------------------===//
10857 template<typename Derived>
10858 ExprResult
10859 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10860   return TransformExpr(E->getSubExpr());
10861 }
10862 
10863 template <typename Derived>
10864 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10865     SYCLUniqueStableNameExpr *E) {
10866   if (!E->isTypeDependent())
10867     return E;
10868 
10869   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10870 
10871   if (!NewT)
10872     return ExprError();
10873 
10874   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10875     return E;
10876 
10877   return getDerived().RebuildSYCLUniqueStableNameExpr(
10878       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10879 }
10880 
10881 template<typename Derived>
10882 ExprResult
10883 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10884   if (!E->isTypeDependent())
10885     return E;
10886 
10887   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10888                                             E->getIdentKind());
10889 }
10890 
10891 template<typename Derived>
10892 ExprResult
10893 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10894   NestedNameSpecifierLoc QualifierLoc;
10895   if (E->getQualifierLoc()) {
10896     QualifierLoc
10897       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10898     if (!QualifierLoc)
10899       return ExprError();
10900   }
10901 
10902   ValueDecl *ND
10903     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10904                                                          E->getDecl()));
10905   if (!ND)
10906     return ExprError();
10907 
10908   NamedDecl *Found = ND;
10909   if (E->getFoundDecl() != E->getDecl()) {
10910     Found = cast_or_null<NamedDecl>(
10911         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10912     if (!Found)
10913       return ExprError();
10914   }
10915 
10916   DeclarationNameInfo NameInfo = E->getNameInfo();
10917   if (NameInfo.getName()) {
10918     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10919     if (!NameInfo.getName())
10920       return ExprError();
10921   }
10922 
10923   if (!getDerived().AlwaysRebuild() &&
10924       QualifierLoc == E->getQualifierLoc() &&
10925       ND == E->getDecl() &&
10926       Found == E->getFoundDecl() &&
10927       NameInfo.getName() == E->getDecl()->getDeclName() &&
10928       !E->hasExplicitTemplateArgs()) {
10929 
10930     // Mark it referenced in the new context regardless.
10931     // FIXME: this is a bit instantiation-specific.
10932     SemaRef.MarkDeclRefReferenced(E);
10933 
10934     return E;
10935   }
10936 
10937   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10938   if (E->hasExplicitTemplateArgs()) {
10939     TemplateArgs = &TransArgs;
10940     TransArgs.setLAngleLoc(E->getLAngleLoc());
10941     TransArgs.setRAngleLoc(E->getRAngleLoc());
10942     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10943                                                 E->getNumTemplateArgs(),
10944                                                 TransArgs))
10945       return ExprError();
10946   }
10947 
10948   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10949                                          Found, TemplateArgs);
10950 }
10951 
10952 template<typename Derived>
10953 ExprResult
10954 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10955   return E;
10956 }
10957 
10958 template <typename Derived>
10959 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10960     FixedPointLiteral *E) {
10961   return E;
10962 }
10963 
10964 template<typename Derived>
10965 ExprResult
10966 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10967   return E;
10968 }
10969 
10970 template<typename Derived>
10971 ExprResult
10972 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10973   return E;
10974 }
10975 
10976 template<typename Derived>
10977 ExprResult
10978 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10979   return E;
10980 }
10981 
10982 template<typename Derived>
10983 ExprResult
10984 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10985   return E;
10986 }
10987 
10988 template<typename Derived>
10989 ExprResult
10990 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10991   return getDerived().TransformCallExpr(E);
10992 }
10993 
10994 template<typename Derived>
10995 ExprResult
10996 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10997   ExprResult ControllingExpr;
10998   TypeSourceInfo *ControllingType = nullptr;
10999   if (E->isExprPredicate())
11000     ControllingExpr = getDerived().TransformExpr(E->getControllingExpr());
11001   else
11002     ControllingType = getDerived().TransformType(E->getControllingType());
11003 
11004   if (ControllingExpr.isInvalid() && !ControllingType)
11005     return ExprError();
11006 
11007   SmallVector<Expr *, 4> AssocExprs;
11008   SmallVector<TypeSourceInfo *, 4> AssocTypes;
11009   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
11010     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
11011     if (TSI) {
11012       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
11013       if (!AssocType)
11014         return ExprError();
11015       AssocTypes.push_back(AssocType);
11016     } else {
11017       AssocTypes.push_back(nullptr);
11018     }
11019 
11020     ExprResult AssocExpr =
11021         getDerived().TransformExpr(Assoc.getAssociationExpr());
11022     if (AssocExpr.isInvalid())
11023       return ExprError();
11024     AssocExprs.push_back(AssocExpr.get());
11025   }
11026 
11027   if (!ControllingType)
11028   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
11029                                                   E->getDefaultLoc(),
11030                                                   E->getRParenLoc(),
11031                                                   ControllingExpr.get(),
11032                                                   AssocTypes,
11033                                                   AssocExprs);
11034   return getDerived().RebuildGenericSelectionExpr(
11035       E->getGenericLoc(), E->getDefaultLoc(), E->getRParenLoc(),
11036       ControllingType, AssocTypes, AssocExprs);
11037 }
11038 
11039 template<typename Derived>
11040 ExprResult
11041 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
11042   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11043   if (SubExpr.isInvalid())
11044     return ExprError();
11045 
11046   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
11047     return E;
11048 
11049   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
11050                                        E->getRParen());
11051 }
11052 
11053 /// The operand of a unary address-of operator has special rules: it's
11054 /// allowed to refer to a non-static member of a class even if there's no 'this'
11055 /// object available.
11056 template<typename Derived>
11057 ExprResult
11058 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
11059   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
11060     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
11061   else
11062     return getDerived().TransformExpr(E);
11063 }
11064 
11065 template<typename Derived>
11066 ExprResult
11067 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
11068   ExprResult SubExpr;
11069   if (E->getOpcode() == UO_AddrOf)
11070     SubExpr = TransformAddressOfOperand(E->getSubExpr());
11071   else
11072     SubExpr = TransformExpr(E->getSubExpr());
11073   if (SubExpr.isInvalid())
11074     return ExprError();
11075 
11076   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
11077     return E;
11078 
11079   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
11080                                            E->getOpcode(),
11081                                            SubExpr.get());
11082 }
11083 
11084 template<typename Derived>
11085 ExprResult
11086 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
11087   // Transform the type.
11088   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
11089   if (!Type)
11090     return ExprError();
11091 
11092   // Transform all of the components into components similar to what the
11093   // parser uses.
11094   // FIXME: It would be slightly more efficient in the non-dependent case to
11095   // just map FieldDecls, rather than requiring the rebuilder to look for
11096   // the fields again. However, __builtin_offsetof is rare enough in
11097   // template code that we don't care.
11098   bool ExprChanged = false;
11099   typedef Sema::OffsetOfComponent Component;
11100   SmallVector<Component, 4> Components;
11101   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
11102     const OffsetOfNode &ON = E->getComponent(I);
11103     Component Comp;
11104     Comp.isBrackets = true;
11105     Comp.LocStart = ON.getSourceRange().getBegin();
11106     Comp.LocEnd = ON.getSourceRange().getEnd();
11107     switch (ON.getKind()) {
11108     case OffsetOfNode::Array: {
11109       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
11110       ExprResult Index = getDerived().TransformExpr(FromIndex);
11111       if (Index.isInvalid())
11112         return ExprError();
11113 
11114       ExprChanged = ExprChanged || Index.get() != FromIndex;
11115       Comp.isBrackets = true;
11116       Comp.U.E = Index.get();
11117       break;
11118     }
11119 
11120     case OffsetOfNode::Field:
11121     case OffsetOfNode::Identifier:
11122       Comp.isBrackets = false;
11123       Comp.U.IdentInfo = ON.getFieldName();
11124       if (!Comp.U.IdentInfo)
11125         continue;
11126 
11127       break;
11128 
11129     case OffsetOfNode::Base:
11130       // Will be recomputed during the rebuild.
11131       continue;
11132     }
11133 
11134     Components.push_back(Comp);
11135   }
11136 
11137   // If nothing changed, retain the existing expression.
11138   if (!getDerived().AlwaysRebuild() &&
11139       Type == E->getTypeSourceInfo() &&
11140       !ExprChanged)
11141     return E;
11142 
11143   // Build a new offsetof expression.
11144   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
11145                                           Components, E->getRParenLoc());
11146 }
11147 
11148 template<typename Derived>
11149 ExprResult
11150 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
11151   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
11152          "opaque value expression requires transformation");
11153   return E;
11154 }
11155 
11156 template<typename Derived>
11157 ExprResult
11158 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
11159   return E;
11160 }
11161 
11162 template <typename Derived>
11163 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
11164   llvm::SmallVector<Expr *, 8> Children;
11165   bool Changed = false;
11166   for (Expr *C : E->subExpressions()) {
11167     ExprResult NewC = getDerived().TransformExpr(C);
11168     if (NewC.isInvalid())
11169       return ExprError();
11170     Children.push_back(NewC.get());
11171 
11172     Changed |= NewC.get() != C;
11173   }
11174   if (!getDerived().AlwaysRebuild() && !Changed)
11175     return E;
11176   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
11177                                           Children, E->getType());
11178 }
11179 
11180 template<typename Derived>
11181 ExprResult
11182 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
11183   // Rebuild the syntactic form.  The original syntactic form has
11184   // opaque-value expressions in it, so strip those away and rebuild
11185   // the result.  This is a really awful way of doing this, but the
11186   // better solution (rebuilding the semantic expressions and
11187   // rebinding OVEs as necessary) doesn't work; we'd need
11188   // TreeTransform to not strip away implicit conversions.
11189   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
11190   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
11191   if (result.isInvalid()) return ExprError();
11192 
11193   // If that gives us a pseudo-object result back, the pseudo-object
11194   // expression must have been an lvalue-to-rvalue conversion which we
11195   // should reapply.
11196   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
11197     result = SemaRef.checkPseudoObjectRValue(result.get());
11198 
11199   return result;
11200 }
11201 
11202 template<typename Derived>
11203 ExprResult
11204 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
11205                                                 UnaryExprOrTypeTraitExpr *E) {
11206   if (E->isArgumentType()) {
11207     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
11208 
11209     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11210     if (!NewT)
11211       return ExprError();
11212 
11213     if (!getDerived().AlwaysRebuild() && OldT == NewT)
11214       return E;
11215 
11216     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
11217                                                     E->getKind(),
11218                                                     E->getSourceRange());
11219   }
11220 
11221   // C++0x [expr.sizeof]p1:
11222   //   The operand is either an expression, which is an unevaluated operand
11223   //   [...]
11224   EnterExpressionEvaluationContext Unevaluated(
11225       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11226       Sema::ReuseLambdaContextDecl);
11227 
11228   // Try to recover if we have something like sizeof(T::X) where X is a type.
11229   // Notably, there must be *exactly* one set of parens if X is a type.
11230   TypeSourceInfo *RecoveryTSI = nullptr;
11231   ExprResult SubExpr;
11232   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
11233   if (auto *DRE =
11234           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
11235     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
11236         PE, DRE, false, &RecoveryTSI);
11237   else
11238     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
11239 
11240   if (RecoveryTSI) {
11241     return getDerived().RebuildUnaryExprOrTypeTrait(
11242         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
11243   } else if (SubExpr.isInvalid())
11244     return ExprError();
11245 
11246   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
11247     return E;
11248 
11249   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
11250                                                   E->getOperatorLoc(),
11251                                                   E->getKind(),
11252                                                   E->getSourceRange());
11253 }
11254 
11255 template<typename Derived>
11256 ExprResult
11257 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
11258   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11259   if (LHS.isInvalid())
11260     return ExprError();
11261 
11262   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11263   if (RHS.isInvalid())
11264     return ExprError();
11265 
11266 
11267   if (!getDerived().AlwaysRebuild() &&
11268       LHS.get() == E->getLHS() &&
11269       RHS.get() == E->getRHS())
11270     return E;
11271 
11272   return getDerived().RebuildArraySubscriptExpr(
11273       LHS.get(),
11274       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
11275 }
11276 
11277 template <typename Derived>
11278 ExprResult
11279 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
11280   ExprResult Base = getDerived().TransformExpr(E->getBase());
11281   if (Base.isInvalid())
11282     return ExprError();
11283 
11284   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
11285   if (RowIdx.isInvalid())
11286     return ExprError();
11287 
11288   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
11289   if (ColumnIdx.isInvalid())
11290     return ExprError();
11291 
11292   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11293       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
11294     return E;
11295 
11296   return getDerived().RebuildMatrixSubscriptExpr(
11297       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
11298 }
11299 
11300 template <typename Derived>
11301 ExprResult
11302 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
11303   ExprResult Base = getDerived().TransformExpr(E->getBase());
11304   if (Base.isInvalid())
11305     return ExprError();
11306 
11307   ExprResult LowerBound;
11308   if (E->getLowerBound()) {
11309     LowerBound = getDerived().TransformExpr(E->getLowerBound());
11310     if (LowerBound.isInvalid())
11311       return ExprError();
11312   }
11313 
11314   ExprResult Length;
11315   if (E->getLength()) {
11316     Length = getDerived().TransformExpr(E->getLength());
11317     if (Length.isInvalid())
11318       return ExprError();
11319   }
11320 
11321   ExprResult Stride;
11322   if (Expr *Str = E->getStride()) {
11323     Stride = getDerived().TransformExpr(Str);
11324     if (Stride.isInvalid())
11325       return ExprError();
11326   }
11327 
11328   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11329       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
11330     return E;
11331 
11332   return getDerived().RebuildOMPArraySectionExpr(
11333       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
11334       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
11335       E->getRBracketLoc());
11336 }
11337 
11338 template <typename Derived>
11339 ExprResult
11340 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
11341   ExprResult Base = getDerived().TransformExpr(E->getBase());
11342   if (Base.isInvalid())
11343     return ExprError();
11344 
11345   SmallVector<Expr *, 4> Dims;
11346   bool ErrorFound = false;
11347   for (Expr *Dim : E->getDimensions()) {
11348     ExprResult DimRes = getDerived().TransformExpr(Dim);
11349     if (DimRes.isInvalid()) {
11350       ErrorFound = true;
11351       continue;
11352     }
11353     Dims.push_back(DimRes.get());
11354   }
11355 
11356   if (ErrorFound)
11357     return ExprError();
11358   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
11359                                                  E->getRParenLoc(), Dims,
11360                                                  E->getBracketsRanges());
11361 }
11362 
11363 template <typename Derived>
11364 ExprResult
11365 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
11366   unsigned NumIterators = E->numOfIterators();
11367   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
11368 
11369   bool ErrorFound = false;
11370   bool NeedToRebuild = getDerived().AlwaysRebuild();
11371   for (unsigned I = 0; I < NumIterators; ++I) {
11372     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
11373     Data[I].DeclIdent = D->getIdentifier();
11374     Data[I].DeclIdentLoc = D->getLocation();
11375     if (D->getLocation() == D->getBeginLoc()) {
11376       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
11377              "Implicit type must be int.");
11378     } else {
11379       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
11380       QualType DeclTy = getDerived().TransformType(D->getType());
11381       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
11382     }
11383     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
11384     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
11385     ExprResult End = getDerived().TransformExpr(Range.End);
11386     ExprResult Step = getDerived().TransformExpr(Range.Step);
11387     ErrorFound = ErrorFound ||
11388                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
11389                                                !Data[I].Type.get().isNull())) ||
11390                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
11391     if (ErrorFound)
11392       continue;
11393     Data[I].Range.Begin = Begin.get();
11394     Data[I].Range.End = End.get();
11395     Data[I].Range.Step = Step.get();
11396     Data[I].AssignLoc = E->getAssignLoc(I);
11397     Data[I].ColonLoc = E->getColonLoc(I);
11398     Data[I].SecColonLoc = E->getSecondColonLoc(I);
11399     NeedToRebuild =
11400         NeedToRebuild ||
11401         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
11402                                        D->getType().getTypePtrOrNull()) ||
11403         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
11404         Range.Step != Data[I].Range.Step;
11405   }
11406   if (ErrorFound)
11407     return ExprError();
11408   if (!NeedToRebuild)
11409     return E;
11410 
11411   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
11412       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
11413   if (!Res.isUsable())
11414     return Res;
11415   auto *IE = cast<OMPIteratorExpr>(Res.get());
11416   for (unsigned I = 0; I < NumIterators; ++I)
11417     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
11418                                       IE->getIteratorDecl(I));
11419   return Res;
11420 }
11421 
11422 template<typename Derived>
11423 ExprResult
11424 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
11425   // Transform the callee.
11426   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11427   if (Callee.isInvalid())
11428     return ExprError();
11429 
11430   // Transform arguments.
11431   bool ArgChanged = false;
11432   SmallVector<Expr*, 8> Args;
11433   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11434                                   &ArgChanged))
11435     return ExprError();
11436 
11437   if (!getDerived().AlwaysRebuild() &&
11438       Callee.get() == E->getCallee() &&
11439       !ArgChanged)
11440     return SemaRef.MaybeBindToTemporary(E);
11441 
11442   // FIXME: Wrong source location information for the '('.
11443   SourceLocation FakeLParenLoc
11444     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11445 
11446   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11447   if (E->hasStoredFPFeatures()) {
11448     FPOptionsOverride NewOverrides = E->getFPFeatures();
11449     getSema().CurFPFeatures =
11450         NewOverrides.applyOverrides(getSema().getLangOpts());
11451     getSema().FpPragmaStack.CurrentValue = NewOverrides;
11452   }
11453 
11454   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11455                                       Args,
11456                                       E->getRParenLoc());
11457 }
11458 
11459 template<typename Derived>
11460 ExprResult
11461 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
11462   ExprResult Base = getDerived().TransformExpr(E->getBase());
11463   if (Base.isInvalid())
11464     return ExprError();
11465 
11466   NestedNameSpecifierLoc QualifierLoc;
11467   if (E->hasQualifier()) {
11468     QualifierLoc
11469       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11470 
11471     if (!QualifierLoc)
11472       return ExprError();
11473   }
11474   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11475 
11476   ValueDecl *Member
11477     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
11478                                                          E->getMemberDecl()));
11479   if (!Member)
11480     return ExprError();
11481 
11482   NamedDecl *FoundDecl = E->getFoundDecl();
11483   if (FoundDecl == E->getMemberDecl()) {
11484     FoundDecl = Member;
11485   } else {
11486     FoundDecl = cast_or_null<NamedDecl>(
11487                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11488     if (!FoundDecl)
11489       return ExprError();
11490   }
11491 
11492   if (!getDerived().AlwaysRebuild() &&
11493       Base.get() == E->getBase() &&
11494       QualifierLoc == E->getQualifierLoc() &&
11495       Member == E->getMemberDecl() &&
11496       FoundDecl == E->getFoundDecl() &&
11497       !E->hasExplicitTemplateArgs()) {
11498 
11499     // Skip for member expression of (this->f), rebuilt thisi->f is needed
11500     // for Openmp where the field need to be privatizized in the case.
11501     if (!(isa<CXXThisExpr>(E->getBase()) &&
11502           getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) {
11503       // Mark it referenced in the new context regardless.
11504       // FIXME: this is a bit instantiation-specific.
11505       SemaRef.MarkMemberReferenced(E);
11506       return E;
11507     }
11508   }
11509 
11510   TemplateArgumentListInfo TransArgs;
11511   if (E->hasExplicitTemplateArgs()) {
11512     TransArgs.setLAngleLoc(E->getLAngleLoc());
11513     TransArgs.setRAngleLoc(E->getRAngleLoc());
11514     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11515                                                 E->getNumTemplateArgs(),
11516                                                 TransArgs))
11517       return ExprError();
11518   }
11519 
11520   // FIXME: Bogus source location for the operator
11521   SourceLocation FakeOperatorLoc =
11522       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11523 
11524   // FIXME: to do this check properly, we will need to preserve the
11525   // first-qualifier-in-scope here, just in case we had a dependent
11526   // base (and therefore couldn't do the check) and a
11527   // nested-name-qualifier (and therefore could do the lookup).
11528   NamedDecl *FirstQualifierInScope = nullptr;
11529   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11530   if (MemberNameInfo.getName()) {
11531     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11532     if (!MemberNameInfo.getName())
11533       return ExprError();
11534   }
11535 
11536   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11537                                         E->isArrow(),
11538                                         QualifierLoc,
11539                                         TemplateKWLoc,
11540                                         MemberNameInfo,
11541                                         Member,
11542                                         FoundDecl,
11543                                         (E->hasExplicitTemplateArgs()
11544                                            ? &TransArgs : nullptr),
11545                                         FirstQualifierInScope);
11546 }
11547 
11548 template<typename Derived>
11549 ExprResult
11550 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11551   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11552   if (LHS.isInvalid())
11553     return ExprError();
11554 
11555   ExprResult RHS =
11556       getDerived().TransformInitializer(E->getRHS(), /*NotCopyInit=*/false);
11557   if (RHS.isInvalid())
11558     return ExprError();
11559 
11560   if (!getDerived().AlwaysRebuild() &&
11561       LHS.get() == E->getLHS() &&
11562       RHS.get() == E->getRHS())
11563     return E;
11564 
11565   if (E->isCompoundAssignmentOp())
11566     // FPFeatures has already been established from trailing storage
11567     return getDerived().RebuildBinaryOperator(
11568         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11569   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11570   FPOptionsOverride NewOverrides(E->getFPFeatures());
11571   getSema().CurFPFeatures =
11572       NewOverrides.applyOverrides(getSema().getLangOpts());
11573   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11574   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11575                                             LHS.get(), RHS.get());
11576 }
11577 
11578 template <typename Derived>
11579 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11580     CXXRewrittenBinaryOperator *E) {
11581   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11582 
11583   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11584   if (LHS.isInvalid())
11585     return ExprError();
11586 
11587   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11588   if (RHS.isInvalid())
11589     return ExprError();
11590 
11591   // Extract the already-resolved callee declarations so that we can restrict
11592   // ourselves to using them as the unqualified lookup results when rebuilding.
11593   UnresolvedSet<2> UnqualLookups;
11594   bool ChangedAnyLookups = false;
11595   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11596                             const_cast<Expr *>(Decomp.InnerBinOp)};
11597   for (Expr *PossibleBinOp : PossibleBinOps) {
11598     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11599     if (!Op)
11600       continue;
11601     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11602     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11603       continue;
11604 
11605     // Transform the callee in case we built a call to a local extern
11606     // declaration.
11607     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11608         E->getOperatorLoc(), Callee->getFoundDecl()));
11609     if (!Found)
11610       return ExprError();
11611     if (Found != Callee->getFoundDecl())
11612       ChangedAnyLookups = true;
11613     UnqualLookups.addDecl(Found);
11614   }
11615 
11616   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11617       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11618     // Mark all functions used in the rewrite as referenced. Note that when
11619     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11620     // function calls, and/or there might be a user-defined conversion sequence
11621     // applied to the operands of the <.
11622     // FIXME: this is a bit instantiation-specific.
11623     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11624     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11625     return E;
11626   }
11627 
11628   return getDerived().RebuildCXXRewrittenBinaryOperator(
11629       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11630 }
11631 
11632 template<typename Derived>
11633 ExprResult
11634 TreeTransform<Derived>::TransformCompoundAssignOperator(
11635                                                       CompoundAssignOperator *E) {
11636   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11637   FPOptionsOverride NewOverrides(E->getFPFeatures());
11638   getSema().CurFPFeatures =
11639       NewOverrides.applyOverrides(getSema().getLangOpts());
11640   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11641   return getDerived().TransformBinaryOperator(E);
11642 }
11643 
11644 template<typename Derived>
11645 ExprResult TreeTransform<Derived>::
11646 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11647   // Just rebuild the common and RHS expressions and see whether we
11648   // get any changes.
11649 
11650   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11651   if (commonExpr.isInvalid())
11652     return ExprError();
11653 
11654   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11655   if (rhs.isInvalid())
11656     return ExprError();
11657 
11658   if (!getDerived().AlwaysRebuild() &&
11659       commonExpr.get() == e->getCommon() &&
11660       rhs.get() == e->getFalseExpr())
11661     return e;
11662 
11663   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11664                                                  e->getQuestionLoc(),
11665                                                  nullptr,
11666                                                  e->getColonLoc(),
11667                                                  rhs.get());
11668 }
11669 
11670 template<typename Derived>
11671 ExprResult
11672 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11673   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11674   if (Cond.isInvalid())
11675     return ExprError();
11676 
11677   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11678   if (LHS.isInvalid())
11679     return ExprError();
11680 
11681   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11682   if (RHS.isInvalid())
11683     return ExprError();
11684 
11685   if (!getDerived().AlwaysRebuild() &&
11686       Cond.get() == E->getCond() &&
11687       LHS.get() == E->getLHS() &&
11688       RHS.get() == E->getRHS())
11689     return E;
11690 
11691   return getDerived().RebuildConditionalOperator(Cond.get(),
11692                                                  E->getQuestionLoc(),
11693                                                  LHS.get(),
11694                                                  E->getColonLoc(),
11695                                                  RHS.get());
11696 }
11697 
11698 template<typename Derived>
11699 ExprResult
11700 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11701   // Implicit casts are eliminated during transformation, since they
11702   // will be recomputed by semantic analysis after transformation.
11703   return getDerived().TransformExpr(E->getSubExprAsWritten());
11704 }
11705 
11706 template<typename Derived>
11707 ExprResult
11708 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11709   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11710   if (!Type)
11711     return ExprError();
11712 
11713   ExprResult SubExpr
11714     = getDerived().TransformExpr(E->getSubExprAsWritten());
11715   if (SubExpr.isInvalid())
11716     return ExprError();
11717 
11718   if (!getDerived().AlwaysRebuild() &&
11719       Type == E->getTypeInfoAsWritten() &&
11720       SubExpr.get() == E->getSubExpr())
11721     return E;
11722 
11723   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11724                                             Type,
11725                                             E->getRParenLoc(),
11726                                             SubExpr.get());
11727 }
11728 
11729 template<typename Derived>
11730 ExprResult
11731 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11732   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11733   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11734   if (!NewT)
11735     return ExprError();
11736 
11737   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11738   if (Init.isInvalid())
11739     return ExprError();
11740 
11741   if (!getDerived().AlwaysRebuild() &&
11742       OldT == NewT &&
11743       Init.get() == E->getInitializer())
11744     return SemaRef.MaybeBindToTemporary(E);
11745 
11746   // Note: the expression type doesn't necessarily match the
11747   // type-as-written, but that's okay, because it should always be
11748   // derivable from the initializer.
11749 
11750   return getDerived().RebuildCompoundLiteralExpr(
11751       E->getLParenLoc(), NewT,
11752       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11753 }
11754 
11755 template<typename Derived>
11756 ExprResult
11757 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11758   ExprResult Base = getDerived().TransformExpr(E->getBase());
11759   if (Base.isInvalid())
11760     return ExprError();
11761 
11762   if (!getDerived().AlwaysRebuild() &&
11763       Base.get() == E->getBase())
11764     return E;
11765 
11766   // FIXME: Bad source location
11767   SourceLocation FakeOperatorLoc =
11768       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11769   return getDerived().RebuildExtVectorElementExpr(
11770       Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
11771       E->getAccessor());
11772 }
11773 
11774 template<typename Derived>
11775 ExprResult
11776 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11777   if (InitListExpr *Syntactic = E->getSyntacticForm())
11778     E = Syntactic;
11779 
11780   bool InitChanged = false;
11781 
11782   EnterExpressionEvaluationContext Context(
11783       getSema(), EnterExpressionEvaluationContext::InitList);
11784 
11785   SmallVector<Expr*, 4> Inits;
11786   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11787                                   Inits, &InitChanged))
11788     return ExprError();
11789 
11790   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11791     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11792     // in some cases. We can't reuse it in general, because the syntactic and
11793     // semantic forms are linked, and we can't know that semantic form will
11794     // match even if the syntactic form does.
11795   }
11796 
11797   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11798                                       E->getRBraceLoc());
11799 }
11800 
11801 template<typename Derived>
11802 ExprResult
11803 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11804   Designation Desig;
11805 
11806   // transform the initializer value
11807   ExprResult Init = getDerived().TransformExpr(E->getInit());
11808   if (Init.isInvalid())
11809     return ExprError();
11810 
11811   // transform the designators.
11812   SmallVector<Expr*, 4> ArrayExprs;
11813   bool ExprChanged = false;
11814   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11815     if (D.isFieldDesignator()) {
11816       if (D.getFieldDecl()) {
11817         FieldDecl *Field = cast_or_null<FieldDecl>(
11818             getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl()));
11819         if (Field != D.getFieldDecl())
11820           // Rebuild the expression when the transformed FieldDecl is
11821           // different to the already assigned FieldDecl.
11822           ExprChanged = true;
11823         if (Field->isAnonymousStructOrUnion())
11824           continue;
11825       } else {
11826         // Ensure that the designator expression is rebuilt when there isn't
11827         // a resolved FieldDecl in the designator as we don't want to assign
11828         // a FieldDecl to a pattern designator that will be instantiated again.
11829         ExprChanged = true;
11830       }
11831       Desig.AddDesignator(Designator::CreateFieldDesignator(
11832           D.getFieldName(), D.getDotLoc(), D.getFieldLoc()));
11833       continue;
11834     }
11835 
11836     if (D.isArrayDesignator()) {
11837       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11838       if (Index.isInvalid())
11839         return ExprError();
11840 
11841       Desig.AddDesignator(
11842           Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
11843 
11844       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11845       ArrayExprs.push_back(Index.get());
11846       continue;
11847     }
11848 
11849     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11850     ExprResult Start
11851       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11852     if (Start.isInvalid())
11853       return ExprError();
11854 
11855     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11856     if (End.isInvalid())
11857       return ExprError();
11858 
11859     Desig.AddDesignator(Designator::CreateArrayRangeDesignator(
11860         Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc()));
11861 
11862     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11863                   End.get() != E->getArrayRangeEnd(D);
11864 
11865     ArrayExprs.push_back(Start.get());
11866     ArrayExprs.push_back(End.get());
11867   }
11868 
11869   if (!getDerived().AlwaysRebuild() &&
11870       Init.get() == E->getInit() &&
11871       !ExprChanged)
11872     return E;
11873 
11874   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11875                                                 E->getEqualOrColonLoc(),
11876                                                 E->usesGNUSyntax(), Init.get());
11877 }
11878 
11879 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11880 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11881 template<typename Derived>
11882 ExprResult
11883 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11884     DesignatedInitUpdateExpr *E) {
11885   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11886                    "initializer");
11887   return ExprError();
11888 }
11889 
11890 template<typename Derived>
11891 ExprResult
11892 TreeTransform<Derived>::TransformNoInitExpr(
11893     NoInitExpr *E) {
11894   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11895   return ExprError();
11896 }
11897 
11898 template<typename Derived>
11899 ExprResult
11900 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11901   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11902   return ExprError();
11903 }
11904 
11905 template<typename Derived>
11906 ExprResult
11907 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11908   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11909   return ExprError();
11910 }
11911 
11912 template<typename Derived>
11913 ExprResult
11914 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11915                                                      ImplicitValueInitExpr *E) {
11916   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11917 
11918   // FIXME: Will we ever have proper type location here? Will we actually
11919   // need to transform the type?
11920   QualType T = getDerived().TransformType(E->getType());
11921   if (T.isNull())
11922     return ExprError();
11923 
11924   if (!getDerived().AlwaysRebuild() &&
11925       T == E->getType())
11926     return E;
11927 
11928   return getDerived().RebuildImplicitValueInitExpr(T);
11929 }
11930 
11931 template<typename Derived>
11932 ExprResult
11933 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11934   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11935   if (!TInfo)
11936     return ExprError();
11937 
11938   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11939   if (SubExpr.isInvalid())
11940     return ExprError();
11941 
11942   if (!getDerived().AlwaysRebuild() &&
11943       TInfo == E->getWrittenTypeInfo() &&
11944       SubExpr.get() == E->getSubExpr())
11945     return E;
11946 
11947   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11948                                        TInfo, E->getRParenLoc());
11949 }
11950 
11951 template<typename Derived>
11952 ExprResult
11953 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11954   bool ArgumentChanged = false;
11955   SmallVector<Expr*, 4> Inits;
11956   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11957                      &ArgumentChanged))
11958     return ExprError();
11959 
11960   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11961                                            Inits,
11962                                            E->getRParenLoc());
11963 }
11964 
11965 /// Transform an address-of-label expression.
11966 ///
11967 /// By default, the transformation of an address-of-label expression always
11968 /// rebuilds the expression, so that the label identifier can be resolved to
11969 /// the corresponding label statement by semantic analysis.
11970 template<typename Derived>
11971 ExprResult
11972 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11973   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11974                                         E->getLabel());
11975   if (!LD)
11976     return ExprError();
11977 
11978   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11979                                            cast<LabelDecl>(LD));
11980 }
11981 
11982 template<typename Derived>
11983 ExprResult
11984 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11985   SemaRef.ActOnStartStmtExpr();
11986   StmtResult SubStmt
11987     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11988   if (SubStmt.isInvalid()) {
11989     SemaRef.ActOnStmtExprError();
11990     return ExprError();
11991   }
11992 
11993   unsigned OldDepth = E->getTemplateDepth();
11994   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11995 
11996   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11997       SubStmt.get() == E->getSubStmt()) {
11998     // Calling this an 'error' is unintuitive, but it does the right thing.
11999     SemaRef.ActOnStmtExprError();
12000     return SemaRef.MaybeBindToTemporary(E);
12001   }
12002 
12003   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
12004                                       E->getRParenLoc(), NewDepth);
12005 }
12006 
12007 template<typename Derived>
12008 ExprResult
12009 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
12010   ExprResult Cond = getDerived().TransformExpr(E->getCond());
12011   if (Cond.isInvalid())
12012     return ExprError();
12013 
12014   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
12015   if (LHS.isInvalid())
12016     return ExprError();
12017 
12018   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
12019   if (RHS.isInvalid())
12020     return ExprError();
12021 
12022   if (!getDerived().AlwaysRebuild() &&
12023       Cond.get() == E->getCond() &&
12024       LHS.get() == E->getLHS() &&
12025       RHS.get() == E->getRHS())
12026     return E;
12027 
12028   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
12029                                         Cond.get(), LHS.get(), RHS.get(),
12030                                         E->getRParenLoc());
12031 }
12032 
12033 template<typename Derived>
12034 ExprResult
12035 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
12036   return E;
12037 }
12038 
12039 template<typename Derived>
12040 ExprResult
12041 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
12042   switch (E->getOperator()) {
12043   case OO_New:
12044   case OO_Delete:
12045   case OO_Array_New:
12046   case OO_Array_Delete:
12047     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
12048 
12049   case OO_Subscript:
12050   case OO_Call: {
12051     // This is a call to an object's operator().
12052     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
12053 
12054     // Transform the object itself.
12055     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
12056     if (Object.isInvalid())
12057       return ExprError();
12058 
12059     // FIXME: Poor location information
12060     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
12061         static_cast<Expr *>(Object.get())->getEndLoc());
12062 
12063     // Transform the call arguments.
12064     SmallVector<Expr*, 8> Args;
12065     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
12066                                     Args))
12067       return ExprError();
12068 
12069     if (E->getOperator() == OO_Subscript)
12070       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
12071                                                   Args, E->getEndLoc());
12072 
12073     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
12074                                         E->getEndLoc());
12075   }
12076 
12077 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
12078   case OO_##Name:                                                              \
12079     break;
12080 
12081 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
12082 #include "clang/Basic/OperatorKinds.def"
12083 
12084   case OO_Conditional:
12085     llvm_unreachable("conditional operator is not actually overloadable");
12086 
12087   case OO_None:
12088   case NUM_OVERLOADED_OPERATORS:
12089     llvm_unreachable("not an overloaded operator?");
12090   }
12091 
12092   ExprResult First;
12093   if (E->getOperator() == OO_Amp)
12094     First = getDerived().TransformAddressOfOperand(E->getArg(0));
12095   else
12096     First = getDerived().TransformExpr(E->getArg(0));
12097   if (First.isInvalid())
12098     return ExprError();
12099 
12100   ExprResult Second;
12101   if (E->getNumArgs() == 2) {
12102     Second =
12103         getDerived().TransformInitializer(E->getArg(1), /*NotCopyInit=*/false);
12104     if (Second.isInvalid())
12105       return ExprError();
12106   }
12107 
12108   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
12109   FPOptionsOverride NewOverrides(E->getFPFeatures());
12110   getSema().CurFPFeatures =
12111       NewOverrides.applyOverrides(getSema().getLangOpts());
12112   getSema().FpPragmaStack.CurrentValue = NewOverrides;
12113 
12114   Expr *Callee = E->getCallee();
12115   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12116     LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
12117                    Sema::LookupOrdinaryName);
12118     if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R))
12119       return ExprError();
12120 
12121     return getDerived().RebuildCXXOperatorCallExpr(
12122         E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
12123         ULE->requiresADL(), R.asUnresolvedSet(), First.get(), Second.get());
12124   }
12125 
12126   UnresolvedSet<1> Functions;
12127   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
12128     Callee = ICE->getSubExprAsWritten();
12129   NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl();
12130   ValueDecl *VD = cast_or_null<ValueDecl>(
12131       getDerived().TransformDecl(DR->getLocation(), DR));
12132   if (!VD)
12133     return ExprError();
12134 
12135   if (!isa<CXXMethodDecl>(VD))
12136     Functions.addDecl(VD);
12137 
12138   return getDerived().RebuildCXXOperatorCallExpr(
12139       E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
12140       /*RequiresADL=*/false, Functions, First.get(), Second.get());
12141 }
12142 
12143 template<typename Derived>
12144 ExprResult
12145 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
12146   return getDerived().TransformCallExpr(E);
12147 }
12148 
12149 template <typename Derived>
12150 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
12151   bool NeedRebuildFunc = E->getIdentKind() == SourceLocIdentKind::Function &&
12152                          getSema().CurContext != E->getParentContext();
12153 
12154   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
12155     return E;
12156 
12157   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
12158                                            E->getBeginLoc(), E->getEndLoc(),
12159                                            getSema().CurContext);
12160 }
12161 
12162 template<typename Derived>
12163 ExprResult
12164 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
12165   // Transform the callee.
12166   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
12167   if (Callee.isInvalid())
12168     return ExprError();
12169 
12170   // Transform exec config.
12171   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
12172   if (EC.isInvalid())
12173     return ExprError();
12174 
12175   // Transform arguments.
12176   bool ArgChanged = false;
12177   SmallVector<Expr*, 8> Args;
12178   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12179                                   &ArgChanged))
12180     return ExprError();
12181 
12182   if (!getDerived().AlwaysRebuild() &&
12183       Callee.get() == E->getCallee() &&
12184       !ArgChanged)
12185     return SemaRef.MaybeBindToTemporary(E);
12186 
12187   // FIXME: Wrong source location information for the '('.
12188   SourceLocation FakeLParenLoc
12189     = ((Expr *)Callee.get())->getSourceRange().getBegin();
12190   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
12191                                       Args,
12192                                       E->getRParenLoc(), EC.get());
12193 }
12194 
12195 template<typename Derived>
12196 ExprResult
12197 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
12198   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
12199   if (!Type)
12200     return ExprError();
12201 
12202   ExprResult SubExpr
12203     = getDerived().TransformExpr(E->getSubExprAsWritten());
12204   if (SubExpr.isInvalid())
12205     return ExprError();
12206 
12207   if (!getDerived().AlwaysRebuild() &&
12208       Type == E->getTypeInfoAsWritten() &&
12209       SubExpr.get() == E->getSubExpr())
12210     return E;
12211   return getDerived().RebuildCXXNamedCastExpr(
12212       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
12213       Type, E->getAngleBrackets().getEnd(),
12214       // FIXME. this should be '(' location
12215       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
12216 }
12217 
12218 template<typename Derived>
12219 ExprResult
12220 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
12221   TypeSourceInfo *TSI =
12222       getDerived().TransformType(BCE->getTypeInfoAsWritten());
12223   if (!TSI)
12224     return ExprError();
12225 
12226   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
12227   if (Sub.isInvalid())
12228     return ExprError();
12229 
12230   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
12231                                                 Sub.get(), BCE->getEndLoc());
12232 }
12233 
12234 template<typename Derived>
12235 ExprResult
12236 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
12237   return getDerived().TransformCXXNamedCastExpr(E);
12238 }
12239 
12240 template<typename Derived>
12241 ExprResult
12242 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
12243   return getDerived().TransformCXXNamedCastExpr(E);
12244 }
12245 
12246 template<typename Derived>
12247 ExprResult
12248 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
12249                                                       CXXReinterpretCastExpr *E) {
12250   return getDerived().TransformCXXNamedCastExpr(E);
12251 }
12252 
12253 template<typename Derived>
12254 ExprResult
12255 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
12256   return getDerived().TransformCXXNamedCastExpr(E);
12257 }
12258 
12259 template<typename Derived>
12260 ExprResult
12261 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
12262   return getDerived().TransformCXXNamedCastExpr(E);
12263 }
12264 
12265 template<typename Derived>
12266 ExprResult
12267 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
12268                                                      CXXFunctionalCastExpr *E) {
12269   TypeSourceInfo *Type =
12270       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
12271   if (!Type)
12272     return ExprError();
12273 
12274   ExprResult SubExpr
12275     = getDerived().TransformExpr(E->getSubExprAsWritten());
12276   if (SubExpr.isInvalid())
12277     return ExprError();
12278 
12279   if (!getDerived().AlwaysRebuild() &&
12280       Type == E->getTypeInfoAsWritten() &&
12281       SubExpr.get() == E->getSubExpr())
12282     return E;
12283 
12284   return getDerived().RebuildCXXFunctionalCastExpr(Type,
12285                                                    E->getLParenLoc(),
12286                                                    SubExpr.get(),
12287                                                    E->getRParenLoc(),
12288                                                    E->isListInitialization());
12289 }
12290 
12291 template<typename Derived>
12292 ExprResult
12293 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
12294   if (E->isTypeOperand()) {
12295     TypeSourceInfo *TInfo
12296       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12297     if (!TInfo)
12298       return ExprError();
12299 
12300     if (!getDerived().AlwaysRebuild() &&
12301         TInfo == E->getTypeOperandSourceInfo())
12302       return E;
12303 
12304     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12305                                              TInfo, E->getEndLoc());
12306   }
12307 
12308   // Typeid's operand is an unevaluated context, unless it's a polymorphic
12309   // type.  We must not unilaterally enter unevaluated context here, as then
12310   // semantic processing can re-transform an already transformed operand.
12311   Expr *Op = E->getExprOperand();
12312   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
12313   if (E->isGLValue())
12314     if (auto *RecordT = Op->getType()->getAs<RecordType>())
12315       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
12316         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
12317 
12318   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
12319                                                Sema::ReuseLambdaContextDecl);
12320 
12321   ExprResult SubExpr = getDerived().TransformExpr(Op);
12322   if (SubExpr.isInvalid())
12323     return ExprError();
12324 
12325   if (!getDerived().AlwaysRebuild() &&
12326       SubExpr.get() == E->getExprOperand())
12327     return E;
12328 
12329   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12330                                            SubExpr.get(), E->getEndLoc());
12331 }
12332 
12333 template<typename Derived>
12334 ExprResult
12335 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
12336   if (E->isTypeOperand()) {
12337     TypeSourceInfo *TInfo
12338       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12339     if (!TInfo)
12340       return ExprError();
12341 
12342     if (!getDerived().AlwaysRebuild() &&
12343         TInfo == E->getTypeOperandSourceInfo())
12344       return E;
12345 
12346     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12347                                              TInfo, E->getEndLoc());
12348   }
12349 
12350   EnterExpressionEvaluationContext Unevaluated(
12351       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12352 
12353   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
12354   if (SubExpr.isInvalid())
12355     return ExprError();
12356 
12357   if (!getDerived().AlwaysRebuild() &&
12358       SubExpr.get() == E->getExprOperand())
12359     return E;
12360 
12361   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12362                                            SubExpr.get(), E->getEndLoc());
12363 }
12364 
12365 template<typename Derived>
12366 ExprResult
12367 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
12368   return E;
12369 }
12370 
12371 template<typename Derived>
12372 ExprResult
12373 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
12374                                                      CXXNullPtrLiteralExpr *E) {
12375   return E;
12376 }
12377 
12378 template<typename Derived>
12379 ExprResult
12380 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
12381 
12382   // In lambdas, the qualifiers of the type depends of where in
12383   // the call operator `this` appear, and we do not have a good way to
12384   // rebuild this information, so we transform the type.
12385   //
12386   // In other contexts, the type of `this` may be overrided
12387   // for type deduction, so we need to recompute it.
12388   QualType T = getSema().getCurLambda() ?
12389                    getDerived().TransformType(E->getType())
12390                  : getSema().getCurrentThisType();
12391 
12392   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
12393     // Mark it referenced in the new context regardless.
12394     // FIXME: this is a bit instantiation-specific.
12395     getSema().MarkThisReferenced(E);
12396     return E;
12397   }
12398 
12399   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
12400 }
12401 
12402 template<typename Derived>
12403 ExprResult
12404 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
12405   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12406   if (SubExpr.isInvalid())
12407     return ExprError();
12408 
12409   if (!getDerived().AlwaysRebuild() &&
12410       SubExpr.get() == E->getSubExpr())
12411     return E;
12412 
12413   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
12414                                           E->isThrownVariableInScope());
12415 }
12416 
12417 template<typename Derived>
12418 ExprResult
12419 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
12420   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
12421       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
12422   if (!Param)
12423     return ExprError();
12424 
12425   ExprResult InitRes;
12426   if (E->hasRewrittenInit()) {
12427     InitRes = getDerived().TransformExpr(E->getRewrittenExpr());
12428     if (InitRes.isInvalid())
12429       return ExprError();
12430   }
12431 
12432   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
12433       E->getUsedContext() == SemaRef.CurContext &&
12434       InitRes.get() == E->getRewrittenExpr())
12435     return E;
12436 
12437   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
12438                                                InitRes.get());
12439 }
12440 
12441 template<typename Derived>
12442 ExprResult
12443 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
12444   FieldDecl *Field = cast_or_null<FieldDecl>(
12445       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
12446   if (!Field)
12447     return ExprError();
12448 
12449   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
12450       E->getUsedContext() == SemaRef.CurContext)
12451     return E;
12452 
12453   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
12454 }
12455 
12456 template<typename Derived>
12457 ExprResult
12458 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
12459                                                     CXXScalarValueInitExpr *E) {
12460   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
12461   if (!T)
12462     return ExprError();
12463 
12464   if (!getDerived().AlwaysRebuild() &&
12465       T == E->getTypeSourceInfo())
12466     return E;
12467 
12468   return getDerived().RebuildCXXScalarValueInitExpr(T,
12469                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
12470                                                     E->getRParenLoc());
12471 }
12472 
12473 template<typename Derived>
12474 ExprResult
12475 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
12476   // Transform the type that we're allocating
12477   TypeSourceInfo *AllocTypeInfo =
12478       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
12479   if (!AllocTypeInfo)
12480     return ExprError();
12481 
12482   // Transform the size of the array we're allocating (if any).
12483   std::optional<Expr *> ArraySize;
12484   if (E->isArray()) {
12485     ExprResult NewArraySize;
12486     if (std::optional<Expr *> OldArraySize = E->getArraySize()) {
12487       NewArraySize = getDerived().TransformExpr(*OldArraySize);
12488       if (NewArraySize.isInvalid())
12489         return ExprError();
12490     }
12491     ArraySize = NewArraySize.get();
12492   }
12493 
12494   // Transform the placement arguments (if any).
12495   bool ArgumentChanged = false;
12496   SmallVector<Expr*, 8> PlacementArgs;
12497   if (getDerived().TransformExprs(E->getPlacementArgs(),
12498                                   E->getNumPlacementArgs(), true,
12499                                   PlacementArgs, &ArgumentChanged))
12500     return ExprError();
12501 
12502   // Transform the initializer (if any).
12503   Expr *OldInit = E->getInitializer();
12504   ExprResult NewInit;
12505   if (OldInit)
12506     NewInit = getDerived().TransformInitializer(OldInit, true);
12507   if (NewInit.isInvalid())
12508     return ExprError();
12509 
12510   // Transform new operator and delete operator.
12511   FunctionDecl *OperatorNew = nullptr;
12512   if (E->getOperatorNew()) {
12513     OperatorNew = cast_or_null<FunctionDecl>(
12514         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
12515     if (!OperatorNew)
12516       return ExprError();
12517   }
12518 
12519   FunctionDecl *OperatorDelete = nullptr;
12520   if (E->getOperatorDelete()) {
12521     OperatorDelete = cast_or_null<FunctionDecl>(
12522         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12523     if (!OperatorDelete)
12524       return ExprError();
12525   }
12526 
12527   if (!getDerived().AlwaysRebuild() &&
12528       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12529       ArraySize == E->getArraySize() &&
12530       NewInit.get() == OldInit &&
12531       OperatorNew == E->getOperatorNew() &&
12532       OperatorDelete == E->getOperatorDelete() &&
12533       !ArgumentChanged) {
12534     // Mark any declarations we need as referenced.
12535     // FIXME: instantiation-specific.
12536     if (OperatorNew)
12537       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12538     if (OperatorDelete)
12539       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12540 
12541     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12542       QualType ElementType
12543         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12544       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12545         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12546         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12547           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12548         }
12549       }
12550     }
12551 
12552     return E;
12553   }
12554 
12555   QualType AllocType = AllocTypeInfo->getType();
12556   if (!ArraySize) {
12557     // If no array size was specified, but the new expression was
12558     // instantiated with an array type (e.g., "new T" where T is
12559     // instantiated with "int[4]"), extract the outer bound from the
12560     // array type as our array size. We do this with constant and
12561     // dependently-sized array types.
12562     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12563     if (!ArrayT) {
12564       // Do nothing
12565     } else if (const ConstantArrayType *ConsArrayT
12566                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12567       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12568                                          SemaRef.Context.getSizeType(),
12569                                          /*FIXME:*/ E->getBeginLoc());
12570       AllocType = ConsArrayT->getElementType();
12571     } else if (const DependentSizedArrayType *DepArrayT
12572                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12573       if (DepArrayT->getSizeExpr()) {
12574         ArraySize = DepArrayT->getSizeExpr();
12575         AllocType = DepArrayT->getElementType();
12576       }
12577     }
12578   }
12579 
12580   return getDerived().RebuildCXXNewExpr(
12581       E->getBeginLoc(), E->isGlobalNew(),
12582       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12583       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12584       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12585 }
12586 
12587 template<typename Derived>
12588 ExprResult
12589 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12590   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12591   if (Operand.isInvalid())
12592     return ExprError();
12593 
12594   // Transform the delete operator, if known.
12595   FunctionDecl *OperatorDelete = nullptr;
12596   if (E->getOperatorDelete()) {
12597     OperatorDelete = cast_or_null<FunctionDecl>(
12598         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12599     if (!OperatorDelete)
12600       return ExprError();
12601   }
12602 
12603   if (!getDerived().AlwaysRebuild() &&
12604       Operand.get() == E->getArgument() &&
12605       OperatorDelete == E->getOperatorDelete()) {
12606     // Mark any declarations we need as referenced.
12607     // FIXME: instantiation-specific.
12608     if (OperatorDelete)
12609       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12610 
12611     if (!E->getArgument()->isTypeDependent()) {
12612       QualType Destroyed = SemaRef.Context.getBaseElementType(
12613                                                          E->getDestroyedType());
12614       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12615         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12616         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12617                                        SemaRef.LookupDestructor(Record));
12618       }
12619     }
12620 
12621     return E;
12622   }
12623 
12624   return getDerived().RebuildCXXDeleteExpr(
12625       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12626 }
12627 
12628 template<typename Derived>
12629 ExprResult
12630 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12631                                                      CXXPseudoDestructorExpr *E) {
12632   ExprResult Base = getDerived().TransformExpr(E->getBase());
12633   if (Base.isInvalid())
12634     return ExprError();
12635 
12636   ParsedType ObjectTypePtr;
12637   bool MayBePseudoDestructor = false;
12638   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12639                                               E->getOperatorLoc(),
12640                                         E->isArrow()? tok::arrow : tok::period,
12641                                               ObjectTypePtr,
12642                                               MayBePseudoDestructor);
12643   if (Base.isInvalid())
12644     return ExprError();
12645 
12646   QualType ObjectType = ObjectTypePtr.get();
12647   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12648   if (QualifierLoc) {
12649     QualifierLoc
12650       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12651     if (!QualifierLoc)
12652       return ExprError();
12653   }
12654   CXXScopeSpec SS;
12655   SS.Adopt(QualifierLoc);
12656 
12657   PseudoDestructorTypeStorage Destroyed;
12658   if (E->getDestroyedTypeInfo()) {
12659     TypeSourceInfo *DestroyedTypeInfo
12660       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12661                                                 ObjectType, nullptr, SS);
12662     if (!DestroyedTypeInfo)
12663       return ExprError();
12664     Destroyed = DestroyedTypeInfo;
12665   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12666     // We aren't likely to be able to resolve the identifier down to a type
12667     // now anyway, so just retain the identifier.
12668     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12669                                             E->getDestroyedTypeLoc());
12670   } else {
12671     // Look for a destructor known with the given name.
12672     ParsedType T = SemaRef.getDestructorName(
12673         *E->getDestroyedTypeIdentifier(), E->getDestroyedTypeLoc(),
12674         /*Scope=*/nullptr, SS, ObjectTypePtr, false);
12675     if (!T)
12676       return ExprError();
12677 
12678     Destroyed
12679       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12680                                                  E->getDestroyedTypeLoc());
12681   }
12682 
12683   TypeSourceInfo *ScopeTypeInfo = nullptr;
12684   if (E->getScopeTypeInfo()) {
12685     CXXScopeSpec EmptySS;
12686     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12687                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12688     if (!ScopeTypeInfo)
12689       return ExprError();
12690   }
12691 
12692   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12693                                                      E->getOperatorLoc(),
12694                                                      E->isArrow(),
12695                                                      SS,
12696                                                      ScopeTypeInfo,
12697                                                      E->getColonColonLoc(),
12698                                                      E->getTildeLoc(),
12699                                                      Destroyed);
12700 }
12701 
12702 template <typename Derived>
12703 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12704                                                         bool RequiresADL,
12705                                                         LookupResult &R) {
12706   // Transform all the decls.
12707   bool AllEmptyPacks = true;
12708   for (auto *OldD : Old->decls()) {
12709     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12710     if (!InstD) {
12711       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12712       // This can happen because of dependent hiding.
12713       if (isa<UsingShadowDecl>(OldD))
12714         continue;
12715       else {
12716         R.clear();
12717         return true;
12718       }
12719     }
12720 
12721     // Expand using pack declarations.
12722     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12723     ArrayRef<NamedDecl*> Decls = SingleDecl;
12724     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12725       Decls = UPD->expansions();
12726 
12727     // Expand using declarations.
12728     for (auto *D : Decls) {
12729       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12730         for (auto *SD : UD->shadows())
12731           R.addDecl(SD);
12732       } else {
12733         R.addDecl(D);
12734       }
12735     }
12736 
12737     AllEmptyPacks &= Decls.empty();
12738   };
12739 
12740   // C++ [temp.res]/8.4.2:
12741   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12742   //   a name in the template definition found a using-declaration, but the
12743   //   lookup in the corresponding scope in the instantiation odoes not find
12744   //   any declarations because the using-declaration was a pack expansion and
12745   //   the corresponding pack is empty
12746   if (AllEmptyPacks && !RequiresADL) {
12747     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12748         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12749     return true;
12750   }
12751 
12752   // Resolve a kind, but don't do any further analysis.  If it's
12753   // ambiguous, the callee needs to deal with it.
12754   R.resolveKind();
12755   return false;
12756 }
12757 
12758 template<typename Derived>
12759 ExprResult
12760 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12761                                                   UnresolvedLookupExpr *Old) {
12762   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12763                  Sema::LookupOrdinaryName);
12764 
12765   // Transform the declaration set.
12766   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12767     return ExprError();
12768 
12769   // Rebuild the nested-name qualifier, if present.
12770   CXXScopeSpec SS;
12771   if (Old->getQualifierLoc()) {
12772     NestedNameSpecifierLoc QualifierLoc
12773       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12774     if (!QualifierLoc)
12775       return ExprError();
12776 
12777     SS.Adopt(QualifierLoc);
12778   }
12779 
12780   if (Old->getNamingClass()) {
12781     CXXRecordDecl *NamingClass
12782       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12783                                                             Old->getNameLoc(),
12784                                                         Old->getNamingClass()));
12785     if (!NamingClass) {
12786       R.clear();
12787       return ExprError();
12788     }
12789 
12790     R.setNamingClass(NamingClass);
12791   }
12792 
12793   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12794 
12795   // If we have neither explicit template arguments, nor the template keyword,
12796   // it's a normal declaration name or member reference.
12797   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12798     NamedDecl *D = R.getAsSingle<NamedDecl>();
12799     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12800     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12801     // give a good diagnostic.
12802     if (D && D->isCXXInstanceMember()) {
12803       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12804                                                      /*TemplateArgs=*/nullptr,
12805                                                      /*Scope=*/nullptr);
12806     }
12807 
12808     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12809   }
12810 
12811   // If we have template arguments, rebuild them, then rebuild the
12812   // templateid expression.
12813   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12814   if (Old->hasExplicitTemplateArgs() &&
12815       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12816                                               Old->getNumTemplateArgs(),
12817                                               TransArgs)) {
12818     R.clear();
12819     return ExprError();
12820   }
12821 
12822   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12823                                             Old->requiresADL(), &TransArgs);
12824 }
12825 
12826 template<typename Derived>
12827 ExprResult
12828 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12829   bool ArgChanged = false;
12830   SmallVector<TypeSourceInfo *, 4> Args;
12831   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12832     TypeSourceInfo *From = E->getArg(I);
12833     TypeLoc FromTL = From->getTypeLoc();
12834     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12835       TypeLocBuilder TLB;
12836       TLB.reserve(FromTL.getFullDataSize());
12837       QualType To = getDerived().TransformType(TLB, FromTL);
12838       if (To.isNull())
12839         return ExprError();
12840 
12841       if (To == From->getType())
12842         Args.push_back(From);
12843       else {
12844         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12845         ArgChanged = true;
12846       }
12847       continue;
12848     }
12849 
12850     ArgChanged = true;
12851 
12852     // We have a pack expansion. Instantiate it.
12853     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12854     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12855     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12856     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12857 
12858     // Determine whether the set of unexpanded parameter packs can and should
12859     // be expanded.
12860     bool Expand = true;
12861     bool RetainExpansion = false;
12862     std::optional<unsigned> OrigNumExpansions =
12863         ExpansionTL.getTypePtr()->getNumExpansions();
12864     std::optional<unsigned> NumExpansions = OrigNumExpansions;
12865     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12866                                              PatternTL.getSourceRange(),
12867                                              Unexpanded,
12868                                              Expand, RetainExpansion,
12869                                              NumExpansions))
12870       return ExprError();
12871 
12872     if (!Expand) {
12873       // The transform has determined that we should perform a simple
12874       // transformation on the pack expansion, producing another pack
12875       // expansion.
12876       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12877 
12878       TypeLocBuilder TLB;
12879       TLB.reserve(From->getTypeLoc().getFullDataSize());
12880 
12881       QualType To = getDerived().TransformType(TLB, PatternTL);
12882       if (To.isNull())
12883         return ExprError();
12884 
12885       To = getDerived().RebuildPackExpansionType(To,
12886                                                  PatternTL.getSourceRange(),
12887                                                  ExpansionTL.getEllipsisLoc(),
12888                                                  NumExpansions);
12889       if (To.isNull())
12890         return ExprError();
12891 
12892       PackExpansionTypeLoc ToExpansionTL
12893         = TLB.push<PackExpansionTypeLoc>(To);
12894       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12895       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12896       continue;
12897     }
12898 
12899     // Expand the pack expansion by substituting for each argument in the
12900     // pack(s).
12901     for (unsigned I = 0; I != *NumExpansions; ++I) {
12902       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12903       TypeLocBuilder TLB;
12904       TLB.reserve(PatternTL.getFullDataSize());
12905       QualType To = getDerived().TransformType(TLB, PatternTL);
12906       if (To.isNull())
12907         return ExprError();
12908 
12909       if (To->containsUnexpandedParameterPack()) {
12910         To = getDerived().RebuildPackExpansionType(To,
12911                                                    PatternTL.getSourceRange(),
12912                                                    ExpansionTL.getEllipsisLoc(),
12913                                                    NumExpansions);
12914         if (To.isNull())
12915           return ExprError();
12916 
12917         PackExpansionTypeLoc ToExpansionTL
12918           = TLB.push<PackExpansionTypeLoc>(To);
12919         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12920       }
12921 
12922       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12923     }
12924 
12925     if (!RetainExpansion)
12926       continue;
12927 
12928     // If we're supposed to retain a pack expansion, do so by temporarily
12929     // forgetting the partially-substituted parameter pack.
12930     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12931 
12932     TypeLocBuilder TLB;
12933     TLB.reserve(From->getTypeLoc().getFullDataSize());
12934 
12935     QualType To = getDerived().TransformType(TLB, PatternTL);
12936     if (To.isNull())
12937       return ExprError();
12938 
12939     To = getDerived().RebuildPackExpansionType(To,
12940                                                PatternTL.getSourceRange(),
12941                                                ExpansionTL.getEllipsisLoc(),
12942                                                NumExpansions);
12943     if (To.isNull())
12944       return ExprError();
12945 
12946     PackExpansionTypeLoc ToExpansionTL
12947       = TLB.push<PackExpansionTypeLoc>(To);
12948     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12949     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12950   }
12951 
12952   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12953     return E;
12954 
12955   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12956                                        E->getEndLoc());
12957 }
12958 
12959 template<typename Derived>
12960 ExprResult
12961 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12962                                                  ConceptSpecializationExpr *E) {
12963   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12964   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12965   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12966                                               Old->NumTemplateArgs, TransArgs))
12967     return ExprError();
12968 
12969   return getDerived().RebuildConceptSpecializationExpr(
12970       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12971       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12972       &TransArgs);
12973 }
12974 
12975 template<typename Derived>
12976 ExprResult
12977 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12978   SmallVector<ParmVarDecl*, 4> TransParams;
12979   SmallVector<QualType, 4> TransParamTypes;
12980   Sema::ExtParameterInfoBuilder ExtParamInfos;
12981 
12982   // C++2a [expr.prim.req]p2
12983   // Expressions appearing within a requirement-body are unevaluated operands.
12984   EnterExpressionEvaluationContext Ctx(
12985       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
12986       Sema::ReuseLambdaContextDecl);
12987 
12988   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12989       getSema().Context, getSema().CurContext,
12990       E->getBody()->getBeginLoc());
12991 
12992   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12993 
12994   ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
12995       E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body,
12996       E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
12997 
12998   for (ParmVarDecl *Param : TransParams)
12999     if (Param)
13000       Param->setDeclContext(Body);
13001 
13002   // On failure to transform, TransformRequiresTypeParams returns an expression
13003   // in the event that the transformation of the type params failed in some way.
13004   // It is expected that this will result in a 'not satisfied' Requires clause
13005   // when instantiating.
13006   if (!TypeParamResult.isUnset())
13007     return TypeParamResult;
13008 
13009   SmallVector<concepts::Requirement *, 4> TransReqs;
13010   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
13011                                                      TransReqs))
13012     return ExprError();
13013 
13014   for (concepts::Requirement *Req : TransReqs) {
13015     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
13016       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
13017         ER->getReturnTypeRequirement()
13018                 .getTypeConstraintTemplateParameterList()->getParam(0)
13019                 ->setDeclContext(Body);
13020       }
13021     }
13022   }
13023 
13024   return getDerived().RebuildRequiresExpr(
13025       E->getRequiresKWLoc(), Body, E->getLParenLoc(), TransParams,
13026       E->getRParenLoc(), TransReqs, E->getRBraceLoc());
13027 }
13028 
13029 template<typename Derived>
13030 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
13031     ArrayRef<concepts::Requirement *> Reqs,
13032     SmallVectorImpl<concepts::Requirement *> &Transformed) {
13033   for (concepts::Requirement *Req : Reqs) {
13034     concepts::Requirement *TransReq = nullptr;
13035     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
13036       TransReq = getDerived().TransformTypeRequirement(TypeReq);
13037     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
13038       TransReq = getDerived().TransformExprRequirement(ExprReq);
13039     else
13040       TransReq = getDerived().TransformNestedRequirement(
13041                      cast<concepts::NestedRequirement>(Req));
13042     if (!TransReq)
13043       return true;
13044     Transformed.push_back(TransReq);
13045   }
13046   return false;
13047 }
13048 
13049 template<typename Derived>
13050 concepts::TypeRequirement *
13051 TreeTransform<Derived>::TransformTypeRequirement(
13052     concepts::TypeRequirement *Req) {
13053   if (Req->isSubstitutionFailure()) {
13054     if (getDerived().AlwaysRebuild())
13055       return getDerived().RebuildTypeRequirement(
13056               Req->getSubstitutionDiagnostic());
13057     return Req;
13058   }
13059   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
13060   if (!TransType)
13061     return nullptr;
13062   return getDerived().RebuildTypeRequirement(TransType);
13063 }
13064 
13065 template<typename Derived>
13066 concepts::ExprRequirement *
13067 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
13068   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
13069   if (Req->isExprSubstitutionFailure())
13070     TransExpr = Req->getExprSubstitutionDiagnostic();
13071   else {
13072     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
13073     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
13074       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
13075     if (TransExprRes.isInvalid())
13076       return nullptr;
13077     TransExpr = TransExprRes.get();
13078   }
13079 
13080   std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
13081   const auto &RetReq = Req->getReturnTypeRequirement();
13082   if (RetReq.isEmpty())
13083     TransRetReq.emplace();
13084   else if (RetReq.isSubstitutionFailure())
13085     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
13086   else if (RetReq.isTypeConstraint()) {
13087     TemplateParameterList *OrigTPL =
13088         RetReq.getTypeConstraintTemplateParameterList();
13089     TemplateParameterList *TPL =
13090         getDerived().TransformTemplateParameterList(OrigTPL);
13091     if (!TPL)
13092       return nullptr;
13093     TransRetReq.emplace(TPL);
13094   }
13095   assert(TransRetReq && "All code paths leading here must set TransRetReq");
13096   if (Expr *E = TransExpr.dyn_cast<Expr *>())
13097     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
13098                                                Req->getNoexceptLoc(),
13099                                                std::move(*TransRetReq));
13100   return getDerived().RebuildExprRequirement(
13101       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
13102       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
13103 }
13104 
13105 template<typename Derived>
13106 concepts::NestedRequirement *
13107 TreeTransform<Derived>::TransformNestedRequirement(
13108     concepts::NestedRequirement *Req) {
13109   if (Req->hasInvalidConstraint()) {
13110     if (getDerived().AlwaysRebuild())
13111       return getDerived().RebuildNestedRequirement(
13112           Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction());
13113     return Req;
13114   }
13115   ExprResult TransConstraint =
13116       getDerived().TransformExpr(Req->getConstraintExpr());
13117   if (TransConstraint.isInvalid())
13118     return nullptr;
13119   return getDerived().RebuildNestedRequirement(TransConstraint.get());
13120 }
13121 
13122 template<typename Derived>
13123 ExprResult
13124 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
13125   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
13126   if (!T)
13127     return ExprError();
13128 
13129   if (!getDerived().AlwaysRebuild() &&
13130       T == E->getQueriedTypeSourceInfo())
13131     return E;
13132 
13133   ExprResult SubExpr;
13134   {
13135     EnterExpressionEvaluationContext Unevaluated(
13136         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13137     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
13138     if (SubExpr.isInvalid())
13139       return ExprError();
13140 
13141     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
13142       return E;
13143   }
13144 
13145   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
13146                                             SubExpr.get(), E->getEndLoc());
13147 }
13148 
13149 template<typename Derived>
13150 ExprResult
13151 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
13152   ExprResult SubExpr;
13153   {
13154     EnterExpressionEvaluationContext Unevaluated(
13155         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13156     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
13157     if (SubExpr.isInvalid())
13158       return ExprError();
13159 
13160     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
13161       return E;
13162   }
13163 
13164   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
13165                                              SubExpr.get(), E->getEndLoc());
13166 }
13167 
13168 template <typename Derived>
13169 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
13170     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
13171     TypeSourceInfo **RecoveryTSI) {
13172   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
13173       DRE, AddrTaken, RecoveryTSI);
13174 
13175   // Propagate both errors and recovered types, which return ExprEmpty.
13176   if (!NewDRE.isUsable())
13177     return NewDRE;
13178 
13179   // We got an expr, wrap it up in parens.
13180   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
13181     return PE;
13182   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
13183                                        PE->getRParen());
13184 }
13185 
13186 template <typename Derived>
13187 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
13188     DependentScopeDeclRefExpr *E) {
13189   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
13190                                             nullptr);
13191 }
13192 
13193 template <typename Derived>
13194 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
13195     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
13196     TypeSourceInfo **RecoveryTSI) {
13197   assert(E->getQualifierLoc());
13198   NestedNameSpecifierLoc QualifierLoc =
13199       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
13200   if (!QualifierLoc)
13201     return ExprError();
13202   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13203 
13204   // TODO: If this is a conversion-function-id, verify that the
13205   // destination type name (if present) resolves the same way after
13206   // instantiation as it did in the local scope.
13207 
13208   DeclarationNameInfo NameInfo =
13209       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
13210   if (!NameInfo.getName())
13211     return ExprError();
13212 
13213   if (!E->hasExplicitTemplateArgs()) {
13214     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
13215         // Note: it is sufficient to compare the Name component of NameInfo:
13216         // if name has not changed, DNLoc has not changed either.
13217         NameInfo.getName() == E->getDeclName())
13218       return E;
13219 
13220     return getDerived().RebuildDependentScopeDeclRefExpr(
13221         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
13222         IsAddressOfOperand, RecoveryTSI);
13223   }
13224 
13225   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13226   if (getDerived().TransformTemplateArguments(
13227           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
13228     return ExprError();
13229 
13230   return getDerived().RebuildDependentScopeDeclRefExpr(
13231       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
13232       RecoveryTSI);
13233 }
13234 
13235 template<typename Derived>
13236 ExprResult
13237 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
13238   // CXXConstructExprs other than for list-initialization and
13239   // CXXTemporaryObjectExpr are always implicit, so when we have
13240   // a 1-argument construction we just transform that argument.
13241   if (getDerived().AllowSkippingCXXConstructExpr() &&
13242       ((E->getNumArgs() == 1 ||
13243         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
13244        (!getDerived().DropCallArgument(E->getArg(0))) &&
13245        !E->isListInitialization()))
13246     return getDerived().TransformInitializer(E->getArg(0),
13247                                              /*DirectInit*/ false);
13248 
13249   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
13250 
13251   QualType T = getDerived().TransformType(E->getType());
13252   if (T.isNull())
13253     return ExprError();
13254 
13255   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13256       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13257   if (!Constructor)
13258     return ExprError();
13259 
13260   bool ArgumentChanged = false;
13261   SmallVector<Expr*, 8> Args;
13262   {
13263     EnterExpressionEvaluationContext Context(
13264         getSema(), EnterExpressionEvaluationContext::InitList,
13265         E->isListInitialization());
13266     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13267                                     &ArgumentChanged))
13268       return ExprError();
13269   }
13270 
13271   if (!getDerived().AlwaysRebuild() &&
13272       T == E->getType() &&
13273       Constructor == E->getConstructor() &&
13274       !ArgumentChanged) {
13275     // Mark the constructor as referenced.
13276     // FIXME: Instantiation-specific
13277     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13278     return E;
13279   }
13280 
13281   return getDerived().RebuildCXXConstructExpr(
13282       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
13283       E->hadMultipleCandidates(), E->isListInitialization(),
13284       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
13285       E->getConstructionKind(), E->getParenOrBraceRange());
13286 }
13287 
13288 template<typename Derived>
13289 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
13290     CXXInheritedCtorInitExpr *E) {
13291   QualType T = getDerived().TransformType(E->getType());
13292   if (T.isNull())
13293     return ExprError();
13294 
13295   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13296       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13297   if (!Constructor)
13298     return ExprError();
13299 
13300   if (!getDerived().AlwaysRebuild() &&
13301       T == E->getType() &&
13302       Constructor == E->getConstructor()) {
13303     // Mark the constructor as referenced.
13304     // FIXME: Instantiation-specific
13305     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13306     return E;
13307   }
13308 
13309   return getDerived().RebuildCXXInheritedCtorInitExpr(
13310       T, E->getLocation(), Constructor,
13311       E->constructsVBase(), E->inheritedFromVBase());
13312 }
13313 
13314 /// Transform a C++ temporary-binding expression.
13315 ///
13316 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
13317 /// transform the subexpression and return that.
13318 template<typename Derived>
13319 ExprResult
13320 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
13321   if (auto *Dtor = E->getTemporary()->getDestructor())
13322     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
13323                                    const_cast<CXXDestructorDecl *>(Dtor));
13324   return getDerived().TransformExpr(E->getSubExpr());
13325 }
13326 
13327 /// Transform a C++ expression that contains cleanups that should
13328 /// be run after the expression is evaluated.
13329 ///
13330 /// Since ExprWithCleanups nodes are implicitly generated, we
13331 /// just transform the subexpression and return that.
13332 template<typename Derived>
13333 ExprResult
13334 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
13335   return getDerived().TransformExpr(E->getSubExpr());
13336 }
13337 
13338 template<typename Derived>
13339 ExprResult
13340 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
13341                                                     CXXTemporaryObjectExpr *E) {
13342   TypeSourceInfo *T =
13343       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13344   if (!T)
13345     return ExprError();
13346 
13347   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13348       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13349   if (!Constructor)
13350     return ExprError();
13351 
13352   bool ArgumentChanged = false;
13353   SmallVector<Expr*, 8> Args;
13354   Args.reserve(E->getNumArgs());
13355   {
13356     EnterExpressionEvaluationContext Context(
13357         getSema(), EnterExpressionEvaluationContext::InitList,
13358         E->isListInitialization());
13359     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13360                        &ArgumentChanged))
13361       return ExprError();
13362   }
13363 
13364   if (!getDerived().AlwaysRebuild() &&
13365       T == E->getTypeSourceInfo() &&
13366       Constructor == E->getConstructor() &&
13367       !ArgumentChanged) {
13368     // FIXME: Instantiation-specific
13369     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13370     return SemaRef.MaybeBindToTemporary(E);
13371   }
13372 
13373   // FIXME: We should just pass E->isListInitialization(), but we're not
13374   // prepared to handle list-initialization without a child InitListExpr.
13375   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
13376   return getDerived().RebuildCXXTemporaryObjectExpr(
13377       T, LParenLoc, Args, E->getEndLoc(),
13378       /*ListInitialization=*/LParenLoc.isInvalid());
13379 }
13380 
13381 template<typename Derived>
13382 ExprResult
13383 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
13384   // Transform any init-capture expressions before entering the scope of the
13385   // lambda body, because they are not semantically within that scope.
13386   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
13387   struct TransformedInitCapture {
13388     // The location of the ... if the result is retaining a pack expansion.
13389     SourceLocation EllipsisLoc;
13390     // Zero or more expansions of the init-capture.
13391     SmallVector<InitCaptureInfoTy, 4> Expansions;
13392   };
13393   SmallVector<TransformedInitCapture, 4> InitCaptures;
13394   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
13395   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13396                                     CEnd = E->capture_end();
13397        C != CEnd; ++C) {
13398     if (!E->isInitCapture(C))
13399       continue;
13400 
13401     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
13402     auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13403 
13404     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
13405                                 std::optional<unsigned> NumExpansions) {
13406       ExprResult NewExprInitResult = getDerived().TransformInitializer(
13407           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
13408 
13409       if (NewExprInitResult.isInvalid()) {
13410         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
13411         return;
13412       }
13413       Expr *NewExprInit = NewExprInitResult.get();
13414 
13415       QualType NewInitCaptureType =
13416           getSema().buildLambdaInitCaptureInitialization(
13417               C->getLocation(), C->getCaptureKind() == LCK_ByRef,
13418               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
13419               cast<VarDecl>(C->getCapturedVar())->getInitStyle() !=
13420                   VarDecl::CInit,
13421               NewExprInit);
13422       Result.Expansions.push_back(
13423           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
13424     };
13425 
13426     // If this is an init-capture pack, consider expanding the pack now.
13427     if (OldVD->isParameterPack()) {
13428       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
13429                                              ->getTypeLoc()
13430                                              .castAs<PackExpansionTypeLoc>();
13431       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13432       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
13433 
13434       // Determine whether the set of unexpanded parameter packs can and should
13435       // be expanded.
13436       bool Expand = true;
13437       bool RetainExpansion = false;
13438       std::optional<unsigned> OrigNumExpansions =
13439           ExpansionTL.getTypePtr()->getNumExpansions();
13440       std::optional<unsigned> NumExpansions = OrigNumExpansions;
13441       if (getDerived().TryExpandParameterPacks(
13442               ExpansionTL.getEllipsisLoc(),
13443               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
13444               RetainExpansion, NumExpansions))
13445         return ExprError();
13446       if (Expand) {
13447         for (unsigned I = 0; I != *NumExpansions; ++I) {
13448           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13449           SubstInitCapture(SourceLocation(), std::nullopt);
13450         }
13451       }
13452       if (!Expand || RetainExpansion) {
13453         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13454         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
13455         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
13456       }
13457     } else {
13458       SubstInitCapture(SourceLocation(), std::nullopt);
13459     }
13460   }
13461 
13462   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
13463   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
13464 
13465   // Create the local class that will describe the lambda.
13466 
13467   // FIXME: DependencyKind below is wrong when substituting inside a templated
13468   // context that isn't a DeclContext (such as a variable template), or when
13469   // substituting an unevaluated lambda inside of a function's parameter's type
13470   // - as parameter types are not instantiated from within a function's DC. We
13471   // use evaluation contexts to distinguish the function parameter case.
13472   CXXRecordDecl::LambdaDependencyKind DependencyKind =
13473       CXXRecordDecl::LDK_Unknown;
13474   if ((getSema().isUnevaluatedContext() ||
13475        getSema().isConstantEvaluatedContext()) &&
13476       (getSema().CurContext->isFileContext() ||
13477        !getSema().CurContext->getParent()->isDependentContext()))
13478     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
13479 
13480   CXXRecordDecl *OldClass = E->getLambdaClass();
13481   CXXRecordDecl *Class = getSema().createLambdaClosureType(
13482       E->getIntroducerRange(), /*Info=*/nullptr, DependencyKind,
13483       E->getCaptureDefault());
13484   getDerived().transformedLocalDecl(OldClass, {Class});
13485 
13486   CXXMethodDecl *NewCallOperator =
13487       getSema().CreateLambdaCallOperator(E->getIntroducerRange(), Class);
13488   NewCallOperator->setLexicalDeclContext(getSema().CurContext);
13489 
13490   // Enter the scope of the lambda.
13491   getSema().buildLambdaScope(LSI, NewCallOperator, E->getIntroducerRange(),
13492                              E->getCaptureDefault(), E->getCaptureDefaultLoc(),
13493                              E->hasExplicitParameters(), E->isMutable());
13494 
13495   // Introduce the context of the call operator.
13496   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13497                                  /*NewThisContext*/false);
13498 
13499   bool Invalid = false;
13500 
13501   // Transform captures.
13502   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13503                                  CEnd = E->capture_end();
13504        C != CEnd; ++C) {
13505     // When we hit the first implicit capture, tell Sema that we've finished
13506     // the list of explicit captures.
13507     if (C->isImplicit())
13508       break;
13509 
13510     // Capturing 'this' is trivial.
13511     if (C->capturesThis()) {
13512       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13513                                     /*BuildAndDiagnose*/ true, nullptr,
13514                                     C->getCaptureKind() == LCK_StarThis);
13515       continue;
13516     }
13517     // Captured expression will be recaptured during captured variables
13518     // rebuilding.
13519     if (C->capturesVLAType())
13520       continue;
13521 
13522     // Rebuild init-captures, including the implied field declaration.
13523     if (E->isInitCapture(C)) {
13524       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13525 
13526       auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13527       llvm::SmallVector<Decl*, 4> NewVDs;
13528 
13529       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13530         ExprResult Init = Info.first;
13531         QualType InitQualType = Info.second;
13532         if (Init.isInvalid() || InitQualType.isNull()) {
13533           Invalid = true;
13534           break;
13535         }
13536         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13537             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13538             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get(),
13539             getSema().CurContext);
13540         if (!NewVD) {
13541           Invalid = true;
13542           break;
13543         }
13544         NewVDs.push_back(NewVD);
13545         getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef);
13546       }
13547 
13548       if (Invalid)
13549         break;
13550 
13551       getDerived().transformedLocalDecl(OldVD, NewVDs);
13552       continue;
13553     }
13554 
13555     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13556 
13557     // Determine the capture kind for Sema.
13558     Sema::TryCaptureKind Kind
13559       = C->isImplicit()? Sema::TryCapture_Implicit
13560                        : C->getCaptureKind() == LCK_ByCopy
13561                            ? Sema::TryCapture_ExplicitByVal
13562                            : Sema::TryCapture_ExplicitByRef;
13563     SourceLocation EllipsisLoc;
13564     if (C->isPackExpansion()) {
13565       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13566       bool ShouldExpand = false;
13567       bool RetainExpansion = false;
13568       std::optional<unsigned> NumExpansions;
13569       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13570                                                C->getLocation(),
13571                                                Unexpanded,
13572                                                ShouldExpand, RetainExpansion,
13573                                                NumExpansions)) {
13574         Invalid = true;
13575         continue;
13576       }
13577 
13578       if (ShouldExpand) {
13579         // The transform has determined that we should perform an expansion;
13580         // transform and capture each of the arguments.
13581         // expansion of the pattern. Do so.
13582         auto *Pack = cast<VarDecl>(C->getCapturedVar());
13583         for (unsigned I = 0; I != *NumExpansions; ++I) {
13584           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13585           VarDecl *CapturedVar
13586             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13587                                                                Pack));
13588           if (!CapturedVar) {
13589             Invalid = true;
13590             continue;
13591           }
13592 
13593           // Capture the transformed variable.
13594           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13595         }
13596 
13597         // FIXME: Retain a pack expansion if RetainExpansion is true.
13598 
13599         continue;
13600       }
13601 
13602       EllipsisLoc = C->getEllipsisLoc();
13603     }
13604 
13605     // Transform the captured variable.
13606     auto *CapturedVar = cast_or_null<ValueDecl>(
13607         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13608     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13609       Invalid = true;
13610       continue;
13611     }
13612 
13613     // Capture the transformed variable.
13614     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13615                                  EllipsisLoc);
13616   }
13617   getSema().finishLambdaExplicitCaptures(LSI);
13618 
13619   // Transform the template parameters, and add them to the current
13620   // instantiation scope. The null case is handled correctly.
13621   auto TPL = getDerived().TransformTemplateParameterList(
13622       E->getTemplateParameterList());
13623   LSI->GLTemplateParameterList = TPL;
13624   if (TPL)
13625     getSema().AddTemplateParametersToLambdaCallOperator(NewCallOperator, Class,
13626                                                         TPL);
13627 
13628   // Transform the type of the original lambda's call operator.
13629   // The transformation MUST be done in the CurrentInstantiationScope since
13630   // it introduces a mapping of the original to the newly created
13631   // transformed parameters.
13632   TypeSourceInfo *NewCallOpTSI = nullptr;
13633   {
13634     auto OldCallOpTypeLoc =
13635         E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
13636 
13637     auto TransformFunctionProtoTypeLoc =
13638         [this](TypeLocBuilder &TLB, FunctionProtoTypeLoc FPTL) -> QualType {
13639       SmallVector<QualType, 4> ExceptionStorage;
13640       TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
13641       return this->TransformFunctionProtoType(
13642           TLB, FPTL, nullptr, Qualifiers(),
13643           [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13644             return This->TransformExceptionSpec(FPTL.getBeginLoc(), ESI,
13645                                                 ExceptionStorage, Changed);
13646           });
13647     };
13648 
13649     QualType NewCallOpType;
13650     TypeLocBuilder NewCallOpTLBuilder;
13651 
13652     if (auto ATL = OldCallOpTypeLoc.getAs<AttributedTypeLoc>()) {
13653       NewCallOpType = this->TransformAttributedType(
13654           NewCallOpTLBuilder, ATL,
13655           [&](TypeLocBuilder &TLB, TypeLoc TL) -> QualType {
13656             return TransformFunctionProtoTypeLoc(
13657                 TLB, TL.castAs<FunctionProtoTypeLoc>());
13658           });
13659     } else {
13660       auto FPTL = OldCallOpTypeLoc.castAs<FunctionProtoTypeLoc>();
13661       NewCallOpType = TransformFunctionProtoTypeLoc(NewCallOpTLBuilder, FPTL);
13662     }
13663 
13664     if (NewCallOpType.isNull())
13665       return ExprError();
13666     NewCallOpTSI =
13667         NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13668   }
13669 
13670   ArrayRef<ParmVarDecl *> Params;
13671   if (auto ATL = NewCallOpTSI->getTypeLoc().getAs<AttributedTypeLoc>()) {
13672     Params = ATL.getModifiedLoc().castAs<FunctionProtoTypeLoc>().getParams();
13673   } else {
13674     auto FPTL = NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>();
13675     Params = FPTL.getParams();
13676   }
13677 
13678   getSema().CompleteLambdaCallOperator(
13679       NewCallOperator, E->getCallOperator()->getLocation(),
13680       E->getCallOperator()->getInnerLocStart(),
13681       E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
13682       E->getCallOperator()->getConstexprKind(),
13683       E->getCallOperator()->getStorageClass(), Params,
13684       E->hasExplicitResultType());
13685 
13686   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13687   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13688 
13689   {
13690     // Number the lambda for linkage purposes if necessary.
13691     Sema::ContextRAII ManglingContext(getSema(), Class->getDeclContext());
13692 
13693     std::optional<CXXRecordDecl::LambdaNumbering> Numbering;
13694     if (getDerived().ReplacingOriginal()) {
13695       Numbering = OldClass->getLambdaNumbering();
13696     }
13697 
13698     getSema().handleLambdaNumbering(Class, NewCallOperator, Numbering);
13699   }
13700 
13701   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13702   // evaluation context even if we're not transforming the function body.
13703   getSema().PushExpressionEvaluationContext(
13704       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13705 
13706   Sema::CodeSynthesisContext C;
13707   C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution;
13708   C.PointOfInstantiation = E->getBody()->getBeginLoc();
13709   getSema().pushCodeSynthesisContext(C);
13710 
13711   // Instantiate the body of the lambda expression.
13712   StmtResult Body =
13713       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13714 
13715   getSema().popCodeSynthesisContext();
13716 
13717   // ActOnLambda* will pop the function scope for us.
13718   FuncScopeCleanup.disable();
13719 
13720   if (Body.isInvalid()) {
13721     SavedContext.pop();
13722     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13723                                /*IsInstantiation=*/true);
13724     return ExprError();
13725   }
13726 
13727   // Copy the LSI before ActOnFinishFunctionBody removes it.
13728   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13729   // the call operator.
13730   auto LSICopy = *LSI;
13731   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13732                                     /*IsInstantiation*/ true);
13733   SavedContext.pop();
13734 
13735   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13736                                    &LSICopy);
13737 }
13738 
13739 template<typename Derived>
13740 StmtResult
13741 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13742   return TransformStmt(S);
13743 }
13744 
13745 template<typename Derived>
13746 StmtResult
13747 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13748   // Transform captures.
13749   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13750                                  CEnd = E->capture_end();
13751        C != CEnd; ++C) {
13752     // When we hit the first implicit capture, tell Sema that we've finished
13753     // the list of explicit captures.
13754     if (!C->isImplicit())
13755       continue;
13756 
13757     // Capturing 'this' is trivial.
13758     if (C->capturesThis()) {
13759       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13760                                     /*BuildAndDiagnose*/ true, nullptr,
13761                                     C->getCaptureKind() == LCK_StarThis);
13762       continue;
13763     }
13764     // Captured expression will be recaptured during captured variables
13765     // rebuilding.
13766     if (C->capturesVLAType())
13767       continue;
13768 
13769     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13770     assert(!E->isInitCapture(C) && "implicit init-capture?");
13771 
13772     // Transform the captured variable.
13773     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13774         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13775     if (!CapturedVar || CapturedVar->isInvalidDecl())
13776       return StmtError();
13777 
13778     // Capture the transformed variable.
13779     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13780   }
13781 
13782   return S;
13783 }
13784 
13785 template<typename Derived>
13786 ExprResult
13787 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13788                                                   CXXUnresolvedConstructExpr *E) {
13789   TypeSourceInfo *T =
13790       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13791   if (!T)
13792     return ExprError();
13793 
13794   bool ArgumentChanged = false;
13795   SmallVector<Expr*, 8> Args;
13796   Args.reserve(E->getNumArgs());
13797   {
13798     EnterExpressionEvaluationContext Context(
13799         getSema(), EnterExpressionEvaluationContext::InitList,
13800         E->isListInitialization());
13801     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13802                                     &ArgumentChanged))
13803       return ExprError();
13804   }
13805 
13806   if (!getDerived().AlwaysRebuild() &&
13807       T == E->getTypeSourceInfo() &&
13808       !ArgumentChanged)
13809     return E;
13810 
13811   // FIXME: we're faking the locations of the commas
13812   return getDerived().RebuildCXXUnresolvedConstructExpr(
13813       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13814 }
13815 
13816 template<typename Derived>
13817 ExprResult
13818 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13819                                              CXXDependentScopeMemberExpr *E) {
13820   // Transform the base of the expression.
13821   ExprResult Base((Expr*) nullptr);
13822   Expr *OldBase;
13823   QualType BaseType;
13824   QualType ObjectType;
13825   if (!E->isImplicitAccess()) {
13826     OldBase = E->getBase();
13827     Base = getDerived().TransformExpr(OldBase);
13828     if (Base.isInvalid())
13829       return ExprError();
13830 
13831     // Start the member reference and compute the object's type.
13832     ParsedType ObjectTy;
13833     bool MayBePseudoDestructor = false;
13834     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13835                                                 E->getOperatorLoc(),
13836                                       E->isArrow()? tok::arrow : tok::period,
13837                                                 ObjectTy,
13838                                                 MayBePseudoDestructor);
13839     if (Base.isInvalid())
13840       return ExprError();
13841 
13842     ObjectType = ObjectTy.get();
13843     BaseType = ((Expr*) Base.get())->getType();
13844   } else {
13845     OldBase = nullptr;
13846     BaseType = getDerived().TransformType(E->getBaseType());
13847     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13848   }
13849 
13850   // Transform the first part of the nested-name-specifier that qualifies
13851   // the member name.
13852   NamedDecl *FirstQualifierInScope
13853     = getDerived().TransformFirstQualifierInScope(
13854                                             E->getFirstQualifierFoundInScope(),
13855                                             E->getQualifierLoc().getBeginLoc());
13856 
13857   NestedNameSpecifierLoc QualifierLoc;
13858   if (E->getQualifier()) {
13859     QualifierLoc
13860       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13861                                                      ObjectType,
13862                                                      FirstQualifierInScope);
13863     if (!QualifierLoc)
13864       return ExprError();
13865   }
13866 
13867   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13868 
13869   // TODO: If this is a conversion-function-id, verify that the
13870   // destination type name (if present) resolves the same way after
13871   // instantiation as it did in the local scope.
13872 
13873   DeclarationNameInfo NameInfo
13874     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13875   if (!NameInfo.getName())
13876     return ExprError();
13877 
13878   if (!E->hasExplicitTemplateArgs()) {
13879     // This is a reference to a member without an explicitly-specified
13880     // template argument list. Optimize for this common case.
13881     if (!getDerived().AlwaysRebuild() &&
13882         Base.get() == OldBase &&
13883         BaseType == E->getBaseType() &&
13884         QualifierLoc == E->getQualifierLoc() &&
13885         NameInfo.getName() == E->getMember() &&
13886         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13887       return E;
13888 
13889     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13890                                                        BaseType,
13891                                                        E->isArrow(),
13892                                                        E->getOperatorLoc(),
13893                                                        QualifierLoc,
13894                                                        TemplateKWLoc,
13895                                                        FirstQualifierInScope,
13896                                                        NameInfo,
13897                                                        /*TemplateArgs*/nullptr);
13898   }
13899 
13900   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13901   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13902                                               E->getNumTemplateArgs(),
13903                                               TransArgs))
13904     return ExprError();
13905 
13906   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13907                                                      BaseType,
13908                                                      E->isArrow(),
13909                                                      E->getOperatorLoc(),
13910                                                      QualifierLoc,
13911                                                      TemplateKWLoc,
13912                                                      FirstQualifierInScope,
13913                                                      NameInfo,
13914                                                      &TransArgs);
13915 }
13916 
13917 template <typename Derived>
13918 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13919     UnresolvedMemberExpr *Old) {
13920   // Transform the base of the expression.
13921   ExprResult Base((Expr *)nullptr);
13922   QualType BaseType;
13923   if (!Old->isImplicitAccess()) {
13924     Base = getDerived().TransformExpr(Old->getBase());
13925     if (Base.isInvalid())
13926       return ExprError();
13927     Base =
13928         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13929     if (Base.isInvalid())
13930       return ExprError();
13931     BaseType = Base.get()->getType();
13932   } else {
13933     BaseType = getDerived().TransformType(Old->getBaseType());
13934   }
13935 
13936   NestedNameSpecifierLoc QualifierLoc;
13937   if (Old->getQualifierLoc()) {
13938     QualifierLoc =
13939         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13940     if (!QualifierLoc)
13941       return ExprError();
13942   }
13943 
13944   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13945 
13946   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13947 
13948   // Transform the declaration set.
13949   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13950     return ExprError();
13951 
13952   // Determine the naming class.
13953   if (Old->getNamingClass()) {
13954     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13955         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13956     if (!NamingClass)
13957       return ExprError();
13958 
13959     R.setNamingClass(NamingClass);
13960   }
13961 
13962   TemplateArgumentListInfo TransArgs;
13963   if (Old->hasExplicitTemplateArgs()) {
13964     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13965     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13966     if (getDerived().TransformTemplateArguments(
13967             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13968       return ExprError();
13969   }
13970 
13971   // FIXME: to do this check properly, we will need to preserve the
13972   // first-qualifier-in-scope here, just in case we had a dependent
13973   // base (and therefore couldn't do the check) and a
13974   // nested-name-qualifier (and therefore could do the lookup).
13975   NamedDecl *FirstQualifierInScope = nullptr;
13976 
13977   return getDerived().RebuildUnresolvedMemberExpr(
13978       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13979       TemplateKWLoc, FirstQualifierInScope, R,
13980       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13981 }
13982 
13983 template<typename Derived>
13984 ExprResult
13985 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13986   EnterExpressionEvaluationContext Unevaluated(
13987       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13988   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13989   if (SubExpr.isInvalid())
13990     return ExprError();
13991 
13992   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13993     return E;
13994 
13995   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13996 }
13997 
13998 template<typename Derived>
13999 ExprResult
14000 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
14001   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
14002   if (Pattern.isInvalid())
14003     return ExprError();
14004 
14005   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
14006     return E;
14007 
14008   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
14009                                            E->getNumExpansions());
14010 }
14011 
14012 template<typename Derived>
14013 ExprResult
14014 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
14015   // If E is not value-dependent, then nothing will change when we transform it.
14016   // Note: This is an instantiation-centric view.
14017   if (!E->isValueDependent())
14018     return E;
14019 
14020   EnterExpressionEvaluationContext Unevaluated(
14021       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
14022 
14023   ArrayRef<TemplateArgument> PackArgs;
14024   TemplateArgument ArgStorage;
14025 
14026   // Find the argument list to transform.
14027   if (E->isPartiallySubstituted()) {
14028     PackArgs = E->getPartialArguments();
14029   } else if (E->isValueDependent()) {
14030     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
14031     bool ShouldExpand = false;
14032     bool RetainExpansion = false;
14033     std::optional<unsigned> NumExpansions;
14034     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
14035                                              Unexpanded,
14036                                              ShouldExpand, RetainExpansion,
14037                                              NumExpansions))
14038       return ExprError();
14039 
14040     // If we need to expand the pack, build a template argument from it and
14041     // expand that.
14042     if (ShouldExpand) {
14043       auto *Pack = E->getPack();
14044       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
14045         ArgStorage = getSema().Context.getPackExpansionType(
14046             getSema().Context.getTypeDeclType(TTPD), std::nullopt);
14047       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
14048         ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
14049       } else {
14050         auto *VD = cast<ValueDecl>(Pack);
14051         ExprResult DRE = getSema().BuildDeclRefExpr(
14052             VD, VD->getType().getNonLValueExprType(getSema().Context),
14053             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
14054             E->getPackLoc());
14055         if (DRE.isInvalid())
14056           return ExprError();
14057         ArgStorage = new (getSema().Context)
14058             PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
14059                               E->getPackLoc(), std::nullopt);
14060       }
14061       PackArgs = ArgStorage;
14062     }
14063   }
14064 
14065   // If we're not expanding the pack, just transform the decl.
14066   if (!PackArgs.size()) {
14067     auto *Pack = cast_or_null<NamedDecl>(
14068         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
14069     if (!Pack)
14070       return ExprError();
14071     return getDerived().RebuildSizeOfPackExpr(
14072         E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(),
14073         std::nullopt, std::nullopt);
14074   }
14075 
14076   // Try to compute the result without performing a partial substitution.
14077   std::optional<unsigned> Result = 0;
14078   for (const TemplateArgument &Arg : PackArgs) {
14079     if (!Arg.isPackExpansion()) {
14080       Result = *Result + 1;
14081       continue;
14082     }
14083 
14084     TemplateArgumentLoc ArgLoc;
14085     InventTemplateArgumentLoc(Arg, ArgLoc);
14086 
14087     // Find the pattern of the pack expansion.
14088     SourceLocation Ellipsis;
14089     std::optional<unsigned> OrigNumExpansions;
14090     TemplateArgumentLoc Pattern =
14091         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
14092                                                           OrigNumExpansions);
14093 
14094     // Substitute under the pack expansion. Do not expand the pack (yet).
14095     TemplateArgumentLoc OutPattern;
14096     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14097     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
14098                                                /*Uneval*/ true))
14099       return true;
14100 
14101     // See if we can determine the number of arguments from the result.
14102     std::optional<unsigned> NumExpansions =
14103         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
14104     if (!NumExpansions) {
14105       // No: we must be in an alias template expansion, and we're going to need
14106       // to actually expand the packs.
14107       Result = std::nullopt;
14108       break;
14109     }
14110 
14111     Result = *Result + *NumExpansions;
14112   }
14113 
14114   // Common case: we could determine the number of expansions without
14115   // substituting.
14116   if (Result)
14117     return getDerived().RebuildSizeOfPackExpr(
14118         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
14119         *Result, std::nullopt);
14120 
14121   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
14122                                                E->getPackLoc());
14123   {
14124     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
14125     typedef TemplateArgumentLocInventIterator<
14126         Derived, const TemplateArgument*> PackLocIterator;
14127     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
14128                                    PackLocIterator(*this, PackArgs.end()),
14129                                    TransformedPackArgs, /*Uneval*/true))
14130       return ExprError();
14131   }
14132 
14133   // Check whether we managed to fully-expand the pack.
14134   // FIXME: Is it possible for us to do so and not hit the early exit path?
14135   SmallVector<TemplateArgument, 8> Args;
14136   bool PartialSubstitution = false;
14137   for (auto &Loc : TransformedPackArgs.arguments()) {
14138     Args.push_back(Loc.getArgument());
14139     if (Loc.getArgument().isPackExpansion())
14140       PartialSubstitution = true;
14141   }
14142 
14143   if (PartialSubstitution)
14144     return getDerived().RebuildSizeOfPackExpr(
14145         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
14146         std::nullopt, Args);
14147 
14148   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
14149                                             E->getPackLoc(), E->getRParenLoc(),
14150                                             Args.size(), std::nullopt);
14151 }
14152 
14153 template<typename Derived>
14154 ExprResult
14155 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
14156                                           SubstNonTypeTemplateParmPackExpr *E) {
14157   // Default behavior is to do nothing with this transformation.
14158   return E;
14159 }
14160 
14161 template<typename Derived>
14162 ExprResult
14163 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
14164                                           SubstNonTypeTemplateParmExpr *E) {
14165   // Default behavior is to do nothing with this transformation.
14166   return E;
14167 }
14168 
14169 template<typename Derived>
14170 ExprResult
14171 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
14172   // Default behavior is to do nothing with this transformation.
14173   return E;
14174 }
14175 
14176 template<typename Derived>
14177 ExprResult
14178 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
14179                                                   MaterializeTemporaryExpr *E) {
14180   return getDerived().TransformExpr(E->getSubExpr());
14181 }
14182 
14183 template<typename Derived>
14184 ExprResult
14185 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
14186   UnresolvedLookupExpr *Callee = nullptr;
14187   if (Expr *OldCallee = E->getCallee()) {
14188     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
14189     if (CalleeResult.isInvalid())
14190       return ExprError();
14191     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
14192   }
14193 
14194   Expr *Pattern = E->getPattern();
14195 
14196   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14197   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
14198   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14199 
14200   // Determine whether the set of unexpanded parameter packs can and should
14201   // be expanded.
14202   bool Expand = true;
14203   bool RetainExpansion = false;
14204   std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
14205                           NumExpansions = OrigNumExpansions;
14206   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
14207                                            Pattern->getSourceRange(),
14208                                            Unexpanded,
14209                                            Expand, RetainExpansion,
14210                                            NumExpansions))
14211     return true;
14212 
14213   if (!Expand) {
14214     // Do not expand any packs here, just transform and rebuild a fold
14215     // expression.
14216     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14217 
14218     ExprResult LHS =
14219         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
14220     if (LHS.isInvalid())
14221       return true;
14222 
14223     ExprResult RHS =
14224         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
14225     if (RHS.isInvalid())
14226       return true;
14227 
14228     if (!getDerived().AlwaysRebuild() &&
14229         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
14230       return E;
14231 
14232     return getDerived().RebuildCXXFoldExpr(
14233         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
14234         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
14235   }
14236 
14237   // Formally a fold expression expands to nested parenthesized expressions.
14238   // Enforce this limit to avoid creating trees so deep we can't safely traverse
14239   // them.
14240   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
14241     SemaRef.Diag(E->getEllipsisLoc(),
14242                  clang::diag::err_fold_expression_limit_exceeded)
14243         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
14244         << E->getSourceRange();
14245     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
14246     return ExprError();
14247   }
14248 
14249   // The transform has determined that we should perform an elementwise
14250   // expansion of the pattern. Do so.
14251   ExprResult Result = getDerived().TransformExpr(E->getInit());
14252   if (Result.isInvalid())
14253     return true;
14254   bool LeftFold = E->isLeftFold();
14255 
14256   // If we're retaining an expansion for a right fold, it is the innermost
14257   // component and takes the init (if any).
14258   if (!LeftFold && RetainExpansion) {
14259     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14260 
14261     ExprResult Out = getDerived().TransformExpr(Pattern);
14262     if (Out.isInvalid())
14263       return true;
14264 
14265     Result = getDerived().RebuildCXXFoldExpr(
14266         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
14267         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
14268     if (Result.isInvalid())
14269       return true;
14270   }
14271 
14272   for (unsigned I = 0; I != *NumExpansions; ++I) {
14273     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
14274         getSema(), LeftFold ? I : *NumExpansions - I - 1);
14275     ExprResult Out = getDerived().TransformExpr(Pattern);
14276     if (Out.isInvalid())
14277       return true;
14278 
14279     if (Out.get()->containsUnexpandedParameterPack()) {
14280       // We still have a pack; retain a pack expansion for this slice.
14281       Result = getDerived().RebuildCXXFoldExpr(
14282           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
14283           E->getOperator(), E->getEllipsisLoc(),
14284           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
14285           OrigNumExpansions);
14286     } else if (Result.isUsable()) {
14287       // We've got down to a single element; build a binary operator.
14288       Expr *LHS = LeftFold ? Result.get() : Out.get();
14289       Expr *RHS = LeftFold ? Out.get() : Result.get();
14290       if (Callee) {
14291         UnresolvedSet<16> Functions;
14292         Functions.append(Callee->decls_begin(), Callee->decls_end());
14293         Result = getDerived().RebuildCXXOperatorCallExpr(
14294             BinaryOperator::getOverloadedOperator(E->getOperator()),
14295             E->getEllipsisLoc(), Callee->getBeginLoc(), Callee->requiresADL(),
14296             Functions, LHS, RHS);
14297       } else {
14298         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
14299                                                     E->getOperator(), LHS, RHS);
14300       }
14301     } else
14302       Result = Out;
14303 
14304     if (Result.isInvalid())
14305       return true;
14306   }
14307 
14308   // If we're retaining an expansion for a left fold, it is the outermost
14309   // component and takes the complete expansion so far as its init (if any).
14310   if (LeftFold && RetainExpansion) {
14311     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14312 
14313     ExprResult Out = getDerived().TransformExpr(Pattern);
14314     if (Out.isInvalid())
14315       return true;
14316 
14317     Result = getDerived().RebuildCXXFoldExpr(
14318         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
14319         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
14320     if (Result.isInvalid())
14321       return true;
14322   }
14323 
14324   // If we had no init and an empty pack, and we're not retaining an expansion,
14325   // then produce a fallback value or error.
14326   if (Result.isUnset())
14327     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
14328                                                 E->getOperator());
14329 
14330   return Result;
14331 }
14332 
14333 template <typename Derived>
14334 ExprResult
14335 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) {
14336   SmallVector<Expr *, 4> TransformedInits;
14337   ArrayRef<Expr *> InitExprs = E->getInitExprs();
14338   if (TransformExprs(InitExprs.data(), InitExprs.size(), true,
14339                      TransformedInits))
14340     return ExprError();
14341 
14342   return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits,
14343                                            E->getEndLoc());
14344 }
14345 
14346 template<typename Derived>
14347 ExprResult
14348 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
14349     CXXStdInitializerListExpr *E) {
14350   return getDerived().TransformExpr(E->getSubExpr());
14351 }
14352 
14353 template<typename Derived>
14354 ExprResult
14355 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
14356   return SemaRef.MaybeBindToTemporary(E);
14357 }
14358 
14359 template<typename Derived>
14360 ExprResult
14361 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
14362   return E;
14363 }
14364 
14365 template<typename Derived>
14366 ExprResult
14367 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
14368   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
14369   if (SubExpr.isInvalid())
14370     return ExprError();
14371 
14372   if (!getDerived().AlwaysRebuild() &&
14373       SubExpr.get() == E->getSubExpr())
14374     return E;
14375 
14376   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
14377 }
14378 
14379 template<typename Derived>
14380 ExprResult
14381 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
14382   // Transform each of the elements.
14383   SmallVector<Expr *, 8> Elements;
14384   bool ArgChanged = false;
14385   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
14386                                   /*IsCall=*/false, Elements, &ArgChanged))
14387     return ExprError();
14388 
14389   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14390     return SemaRef.MaybeBindToTemporary(E);
14391 
14392   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
14393                                               Elements.data(),
14394                                               Elements.size());
14395 }
14396 
14397 template<typename Derived>
14398 ExprResult
14399 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
14400                                                     ObjCDictionaryLiteral *E) {
14401   // Transform each of the elements.
14402   SmallVector<ObjCDictionaryElement, 8> Elements;
14403   bool ArgChanged = false;
14404   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
14405     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
14406 
14407     if (OrigElement.isPackExpansion()) {
14408       // This key/value element is a pack expansion.
14409       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14410       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
14411       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
14412       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14413 
14414       // Determine whether the set of unexpanded parameter packs can
14415       // and should be expanded.
14416       bool Expand = true;
14417       bool RetainExpansion = false;
14418       std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
14419       std::optional<unsigned> NumExpansions = OrigNumExpansions;
14420       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
14421                                OrigElement.Value->getEndLoc());
14422       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
14423                                                PatternRange, Unexpanded, Expand,
14424                                                RetainExpansion, NumExpansions))
14425         return ExprError();
14426 
14427       if (!Expand) {
14428         // The transform has determined that we should perform a simple
14429         // transformation on the pack expansion, producing another pack
14430         // expansion.
14431         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14432         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14433         if (Key.isInvalid())
14434           return ExprError();
14435 
14436         if (Key.get() != OrigElement.Key)
14437           ArgChanged = true;
14438 
14439         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14440         if (Value.isInvalid())
14441           return ExprError();
14442 
14443         if (Value.get() != OrigElement.Value)
14444           ArgChanged = true;
14445 
14446         ObjCDictionaryElement Expansion = {
14447           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
14448         };
14449         Elements.push_back(Expansion);
14450         continue;
14451       }
14452 
14453       // Record right away that the argument was changed.  This needs
14454       // to happen even if the array expands to nothing.
14455       ArgChanged = true;
14456 
14457       // The transform has determined that we should perform an elementwise
14458       // expansion of the pattern. Do so.
14459       for (unsigned I = 0; I != *NumExpansions; ++I) {
14460         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
14461         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14462         if (Key.isInvalid())
14463           return ExprError();
14464 
14465         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14466         if (Value.isInvalid())
14467           return ExprError();
14468 
14469         ObjCDictionaryElement Element = {
14470           Key.get(), Value.get(), SourceLocation(), NumExpansions
14471         };
14472 
14473         // If any unexpanded parameter packs remain, we still have a
14474         // pack expansion.
14475         // FIXME: Can this really happen?
14476         if (Key.get()->containsUnexpandedParameterPack() ||
14477             Value.get()->containsUnexpandedParameterPack())
14478           Element.EllipsisLoc = OrigElement.EllipsisLoc;
14479 
14480         Elements.push_back(Element);
14481       }
14482 
14483       // FIXME: Retain a pack expansion if RetainExpansion is true.
14484 
14485       // We've finished with this pack expansion.
14486       continue;
14487     }
14488 
14489     // Transform and check key.
14490     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14491     if (Key.isInvalid())
14492       return ExprError();
14493 
14494     if (Key.get() != OrigElement.Key)
14495       ArgChanged = true;
14496 
14497     // Transform and check value.
14498     ExprResult Value
14499       = getDerived().TransformExpr(OrigElement.Value);
14500     if (Value.isInvalid())
14501       return ExprError();
14502 
14503     if (Value.get() != OrigElement.Value)
14504       ArgChanged = true;
14505 
14506     ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(),
14507                                      std::nullopt};
14508     Elements.push_back(Element);
14509   }
14510 
14511   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14512     return SemaRef.MaybeBindToTemporary(E);
14513 
14514   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
14515                                                    Elements);
14516 }
14517 
14518 template<typename Derived>
14519 ExprResult
14520 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
14521   TypeSourceInfo *EncodedTypeInfo
14522     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
14523   if (!EncodedTypeInfo)
14524     return ExprError();
14525 
14526   if (!getDerived().AlwaysRebuild() &&
14527       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
14528     return E;
14529 
14530   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
14531                                             EncodedTypeInfo,
14532                                             E->getRParenLoc());
14533 }
14534 
14535 template<typename Derived>
14536 ExprResult TreeTransform<Derived>::
14537 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
14538   // This is a kind of implicit conversion, and it needs to get dropped
14539   // and recomputed for the same general reasons that ImplicitCastExprs
14540   // do, as well a more specific one: this expression is only valid when
14541   // it appears *immediately* as an argument expression.
14542   return getDerived().TransformExpr(E->getSubExpr());
14543 }
14544 
14545 template<typename Derived>
14546 ExprResult TreeTransform<Derived>::
14547 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
14548   TypeSourceInfo *TSInfo
14549     = getDerived().TransformType(E->getTypeInfoAsWritten());
14550   if (!TSInfo)
14551     return ExprError();
14552 
14553   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
14554   if (Result.isInvalid())
14555     return ExprError();
14556 
14557   if (!getDerived().AlwaysRebuild() &&
14558       TSInfo == E->getTypeInfoAsWritten() &&
14559       Result.get() == E->getSubExpr())
14560     return E;
14561 
14562   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
14563                                       E->getBridgeKeywordLoc(), TSInfo,
14564                                       Result.get());
14565 }
14566 
14567 template <typename Derived>
14568 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14569     ObjCAvailabilityCheckExpr *E) {
14570   return E;
14571 }
14572 
14573 template<typename Derived>
14574 ExprResult
14575 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14576   // Transform arguments.
14577   bool ArgChanged = false;
14578   SmallVector<Expr*, 8> Args;
14579   Args.reserve(E->getNumArgs());
14580   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14581                                   &ArgChanged))
14582     return ExprError();
14583 
14584   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14585     // Class message: transform the receiver type.
14586     TypeSourceInfo *ReceiverTypeInfo
14587       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14588     if (!ReceiverTypeInfo)
14589       return ExprError();
14590 
14591     // If nothing changed, just retain the existing message send.
14592     if (!getDerived().AlwaysRebuild() &&
14593         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14594       return SemaRef.MaybeBindToTemporary(E);
14595 
14596     // Build a new class message send.
14597     SmallVector<SourceLocation, 16> SelLocs;
14598     E->getSelectorLocs(SelLocs);
14599     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14600                                                E->getSelector(),
14601                                                SelLocs,
14602                                                E->getMethodDecl(),
14603                                                E->getLeftLoc(),
14604                                                Args,
14605                                                E->getRightLoc());
14606   }
14607   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14608            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14609     if (!E->getMethodDecl())
14610       return ExprError();
14611 
14612     // Build a new class message send to 'super'.
14613     SmallVector<SourceLocation, 16> SelLocs;
14614     E->getSelectorLocs(SelLocs);
14615     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14616                                                E->getSelector(),
14617                                                SelLocs,
14618                                                E->getReceiverType(),
14619                                                E->getMethodDecl(),
14620                                                E->getLeftLoc(),
14621                                                Args,
14622                                                E->getRightLoc());
14623   }
14624 
14625   // Instance message: transform the receiver
14626   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14627          "Only class and instance messages may be instantiated");
14628   ExprResult Receiver
14629     = getDerived().TransformExpr(E->getInstanceReceiver());
14630   if (Receiver.isInvalid())
14631     return ExprError();
14632 
14633   // If nothing changed, just retain the existing message send.
14634   if (!getDerived().AlwaysRebuild() &&
14635       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14636     return SemaRef.MaybeBindToTemporary(E);
14637 
14638   // Build a new instance message send.
14639   SmallVector<SourceLocation, 16> SelLocs;
14640   E->getSelectorLocs(SelLocs);
14641   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14642                                              E->getSelector(),
14643                                              SelLocs,
14644                                              E->getMethodDecl(),
14645                                              E->getLeftLoc(),
14646                                              Args,
14647                                              E->getRightLoc());
14648 }
14649 
14650 template<typename Derived>
14651 ExprResult
14652 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14653   return E;
14654 }
14655 
14656 template<typename Derived>
14657 ExprResult
14658 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14659   return E;
14660 }
14661 
14662 template<typename Derived>
14663 ExprResult
14664 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14665   // Transform the base expression.
14666   ExprResult Base = getDerived().TransformExpr(E->getBase());
14667   if (Base.isInvalid())
14668     return ExprError();
14669 
14670   // We don't need to transform the ivar; it will never change.
14671 
14672   // If nothing changed, just retain the existing expression.
14673   if (!getDerived().AlwaysRebuild() &&
14674       Base.get() == E->getBase())
14675     return E;
14676 
14677   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14678                                              E->getLocation(),
14679                                              E->isArrow(), E->isFreeIvar());
14680 }
14681 
14682 template<typename Derived>
14683 ExprResult
14684 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14685   // 'super' and types never change. Property never changes. Just
14686   // retain the existing expression.
14687   if (!E->isObjectReceiver())
14688     return E;
14689 
14690   // Transform the base expression.
14691   ExprResult Base = getDerived().TransformExpr(E->getBase());
14692   if (Base.isInvalid())
14693     return ExprError();
14694 
14695   // We don't need to transform the property; it will never change.
14696 
14697   // If nothing changed, just retain the existing expression.
14698   if (!getDerived().AlwaysRebuild() &&
14699       Base.get() == E->getBase())
14700     return E;
14701 
14702   if (E->isExplicitProperty())
14703     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14704                                                    E->getExplicitProperty(),
14705                                                    E->getLocation());
14706 
14707   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14708                                                  SemaRef.Context.PseudoObjectTy,
14709                                                  E->getImplicitPropertyGetter(),
14710                                                  E->getImplicitPropertySetter(),
14711                                                  E->getLocation());
14712 }
14713 
14714 template<typename Derived>
14715 ExprResult
14716 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14717   // Transform the base expression.
14718   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14719   if (Base.isInvalid())
14720     return ExprError();
14721 
14722   // Transform the key expression.
14723   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14724   if (Key.isInvalid())
14725     return ExprError();
14726 
14727   // If nothing changed, just retain the existing expression.
14728   if (!getDerived().AlwaysRebuild() &&
14729       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14730     return E;
14731 
14732   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14733                                                   Base.get(), Key.get(),
14734                                                   E->getAtIndexMethodDecl(),
14735                                                   E->setAtIndexMethodDecl());
14736 }
14737 
14738 template<typename Derived>
14739 ExprResult
14740 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14741   // Transform the base expression.
14742   ExprResult Base = getDerived().TransformExpr(E->getBase());
14743   if (Base.isInvalid())
14744     return ExprError();
14745 
14746   // If nothing changed, just retain the existing expression.
14747   if (!getDerived().AlwaysRebuild() &&
14748       Base.get() == E->getBase())
14749     return E;
14750 
14751   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14752                                          E->getOpLoc(),
14753                                          E->isArrow());
14754 }
14755 
14756 template<typename Derived>
14757 ExprResult
14758 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14759   bool ArgumentChanged = false;
14760   SmallVector<Expr*, 8> SubExprs;
14761   SubExprs.reserve(E->getNumSubExprs());
14762   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14763                                   SubExprs, &ArgumentChanged))
14764     return ExprError();
14765 
14766   if (!getDerived().AlwaysRebuild() &&
14767       !ArgumentChanged)
14768     return E;
14769 
14770   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14771                                                SubExprs,
14772                                                E->getRParenLoc());
14773 }
14774 
14775 template<typename Derived>
14776 ExprResult
14777 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14778   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14779   if (SrcExpr.isInvalid())
14780     return ExprError();
14781 
14782   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14783   if (!Type)
14784     return ExprError();
14785 
14786   if (!getDerived().AlwaysRebuild() &&
14787       Type == E->getTypeSourceInfo() &&
14788       SrcExpr.get() == E->getSrcExpr())
14789     return E;
14790 
14791   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14792                                                SrcExpr.get(), Type,
14793                                                E->getRParenLoc());
14794 }
14795 
14796 template<typename Derived>
14797 ExprResult
14798 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14799   BlockDecl *oldBlock = E->getBlockDecl();
14800 
14801   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14802   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14803 
14804   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14805   blockScope->TheDecl->setBlockMissingReturnType(
14806                          oldBlock->blockMissingReturnType());
14807 
14808   SmallVector<ParmVarDecl*, 4> params;
14809   SmallVector<QualType, 4> paramTypes;
14810 
14811   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14812 
14813   // Parameter substitution.
14814   Sema::ExtParameterInfoBuilder extParamInfos;
14815   if (getDerived().TransformFunctionTypeParams(
14816           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14817           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14818           extParamInfos)) {
14819     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14820     return ExprError();
14821   }
14822 
14823   QualType exprResultType =
14824       getDerived().TransformType(exprFunctionType->getReturnType());
14825 
14826   auto epi = exprFunctionType->getExtProtoInfo();
14827   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14828 
14829   QualType functionType =
14830     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14831   blockScope->FunctionType = functionType;
14832 
14833   // Set the parameters on the block decl.
14834   if (!params.empty())
14835     blockScope->TheDecl->setParams(params);
14836 
14837   if (!oldBlock->blockMissingReturnType()) {
14838     blockScope->HasImplicitReturnType = false;
14839     blockScope->ReturnType = exprResultType;
14840   }
14841 
14842   // Transform the body
14843   StmtResult body = getDerived().TransformStmt(E->getBody());
14844   if (body.isInvalid()) {
14845     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14846     return ExprError();
14847   }
14848 
14849 #ifndef NDEBUG
14850   // In builds with assertions, make sure that we captured everything we
14851   // captured before.
14852   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14853     for (const auto &I : oldBlock->captures()) {
14854       VarDecl *oldCapture = I.getVariable();
14855 
14856       // Ignore parameter packs.
14857       if (oldCapture->isParameterPack())
14858         continue;
14859 
14860       VarDecl *newCapture =
14861         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14862                                                  oldCapture));
14863       assert(blockScope->CaptureMap.count(newCapture));
14864     }
14865 
14866     // The this pointer may not be captured by the instantiated block, even when
14867     // it's captured by the original block, if the expression causing the
14868     // capture is in the discarded branch of a constexpr if statement.
14869     assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) &&
14870            "this pointer isn't captured in the old block");
14871   }
14872 #endif
14873 
14874   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14875                                     /*Scope=*/nullptr);
14876 }
14877 
14878 template<typename Derived>
14879 ExprResult
14880 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14881   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14882   if (SrcExpr.isInvalid())
14883     return ExprError();
14884 
14885   QualType Type = getDerived().TransformType(E->getType());
14886 
14887   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14888                                  E->getRParenLoc());
14889 }
14890 
14891 template<typename Derived>
14892 ExprResult
14893 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14894   bool ArgumentChanged = false;
14895   SmallVector<Expr*, 8> SubExprs;
14896   SubExprs.reserve(E->getNumSubExprs());
14897   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14898                                   SubExprs, &ArgumentChanged))
14899     return ExprError();
14900 
14901   if (!getDerived().AlwaysRebuild() &&
14902       !ArgumentChanged)
14903     return E;
14904 
14905   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14906                                         E->getOp(), E->getRParenLoc());
14907 }
14908 
14909 //===----------------------------------------------------------------------===//
14910 // Type reconstruction
14911 //===----------------------------------------------------------------------===//
14912 
14913 template<typename Derived>
14914 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14915                                                     SourceLocation Star) {
14916   return SemaRef.BuildPointerType(PointeeType, Star,
14917                                   getDerived().getBaseEntity());
14918 }
14919 
14920 template<typename Derived>
14921 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14922                                                          SourceLocation Star) {
14923   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14924                                        getDerived().getBaseEntity());
14925 }
14926 
14927 template<typename Derived>
14928 QualType
14929 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14930                                              bool WrittenAsLValue,
14931                                              SourceLocation Sigil) {
14932   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14933                                     Sigil, getDerived().getBaseEntity());
14934 }
14935 
14936 template<typename Derived>
14937 QualType
14938 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14939                                                  QualType ClassType,
14940                                                  SourceLocation Sigil) {
14941   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14942                                         getDerived().getBaseEntity());
14943 }
14944 
14945 template<typename Derived>
14946 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14947            const ObjCTypeParamDecl *Decl,
14948            SourceLocation ProtocolLAngleLoc,
14949            ArrayRef<ObjCProtocolDecl *> Protocols,
14950            ArrayRef<SourceLocation> ProtocolLocs,
14951            SourceLocation ProtocolRAngleLoc) {
14952   return SemaRef.BuildObjCTypeParamType(Decl,
14953                                         ProtocolLAngleLoc, Protocols,
14954                                         ProtocolLocs, ProtocolRAngleLoc,
14955                                         /*FailOnError=*/true);
14956 }
14957 
14958 template<typename Derived>
14959 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14960            QualType BaseType,
14961            SourceLocation Loc,
14962            SourceLocation TypeArgsLAngleLoc,
14963            ArrayRef<TypeSourceInfo *> TypeArgs,
14964            SourceLocation TypeArgsRAngleLoc,
14965            SourceLocation ProtocolLAngleLoc,
14966            ArrayRef<ObjCProtocolDecl *> Protocols,
14967            ArrayRef<SourceLocation> ProtocolLocs,
14968            SourceLocation ProtocolRAngleLoc) {
14969   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs,
14970                                      TypeArgsRAngleLoc, ProtocolLAngleLoc,
14971                                      Protocols, ProtocolLocs, ProtocolRAngleLoc,
14972                                      /*FailOnError=*/true,
14973                                      /*Rebuilding=*/true);
14974 }
14975 
14976 template<typename Derived>
14977 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14978            QualType PointeeType,
14979            SourceLocation Star) {
14980   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14981 }
14982 
14983 template <typename Derived>
14984 QualType TreeTransform<Derived>::RebuildArrayType(
14985     QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt *Size,
14986     Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) {
14987   if (SizeExpr || !Size)
14988     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14989                                   IndexTypeQuals, BracketsRange,
14990                                   getDerived().getBaseEntity());
14991 
14992   QualType Types[] = {
14993     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14994     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14995     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14996   };
14997   QualType SizeType;
14998   for (const auto &T : Types)
14999     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) {
15000       SizeType = T;
15001       break;
15002     }
15003 
15004   // Note that we can return a VariableArrayType here in the case where
15005   // the element type was a dependent VariableArrayType.
15006   IntegerLiteral *ArraySize
15007       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
15008                                /*FIXME*/BracketsRange.getBegin());
15009   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
15010                                 IndexTypeQuals, BracketsRange,
15011                                 getDerived().getBaseEntity());
15012 }
15013 
15014 template <typename Derived>
15015 QualType TreeTransform<Derived>::RebuildConstantArrayType(
15016     QualType ElementType, ArraySizeModifier SizeMod, const llvm::APInt &Size,
15017     Expr *SizeExpr, unsigned IndexTypeQuals, SourceRange BracketsRange) {
15018   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
15019                                         IndexTypeQuals, BracketsRange);
15020 }
15021 
15022 template <typename Derived>
15023 QualType TreeTransform<Derived>::RebuildIncompleteArrayType(
15024     QualType ElementType, ArraySizeModifier SizeMod, unsigned IndexTypeQuals,
15025     SourceRange BracketsRange) {
15026   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
15027                                        IndexTypeQuals, BracketsRange);
15028 }
15029 
15030 template <typename Derived>
15031 QualType TreeTransform<Derived>::RebuildVariableArrayType(
15032     QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr,
15033     unsigned IndexTypeQuals, SourceRange BracketsRange) {
15034   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
15035                                        SizeExpr,
15036                                        IndexTypeQuals, BracketsRange);
15037 }
15038 
15039 template <typename Derived>
15040 QualType TreeTransform<Derived>::RebuildDependentSizedArrayType(
15041     QualType ElementType, ArraySizeModifier SizeMod, Expr *SizeExpr,
15042     unsigned IndexTypeQuals, SourceRange BracketsRange) {
15043   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
15044                                        SizeExpr,
15045                                        IndexTypeQuals, BracketsRange);
15046 }
15047 
15048 template <typename Derived>
15049 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
15050     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
15051   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
15052                                           AttributeLoc);
15053 }
15054 
15055 template <typename Derived>
15056 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
15057                                                    unsigned NumElements,
15058                                                    VectorKind VecKind) {
15059   // FIXME: semantic checking!
15060   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
15061 }
15062 
15063 template <typename Derived>
15064 QualType TreeTransform<Derived>::RebuildDependentVectorType(
15065     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
15066     VectorKind VecKind) {
15067   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
15068 }
15069 
15070 template<typename Derived>
15071 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
15072                                                       unsigned NumElements,
15073                                                  SourceLocation AttributeLoc) {
15074   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
15075                           NumElements, true);
15076   IntegerLiteral *VectorSize
15077     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
15078                              AttributeLoc);
15079   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
15080 }
15081 
15082 template<typename Derived>
15083 QualType
15084 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
15085                                                            Expr *SizeExpr,
15086                                                   SourceLocation AttributeLoc) {
15087   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
15088 }
15089 
15090 template <typename Derived>
15091 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
15092     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
15093   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
15094                                                NumColumns);
15095 }
15096 
15097 template <typename Derived>
15098 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
15099     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
15100     SourceLocation AttributeLoc) {
15101   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
15102                                  AttributeLoc);
15103 }
15104 
15105 template<typename Derived>
15106 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
15107     QualType T,
15108     MutableArrayRef<QualType> ParamTypes,
15109     const FunctionProtoType::ExtProtoInfo &EPI) {
15110   return SemaRef.BuildFunctionType(T, ParamTypes,
15111                                    getDerived().getBaseLocation(),
15112                                    getDerived().getBaseEntity(),
15113                                    EPI);
15114 }
15115 
15116 template<typename Derived>
15117 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
15118   return SemaRef.Context.getFunctionNoProtoType(T);
15119 }
15120 
15121 template<typename Derived>
15122 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
15123                                                             Decl *D) {
15124   assert(D && "no decl found");
15125   if (D->isInvalidDecl()) return QualType();
15126 
15127   // FIXME: Doesn't account for ObjCInterfaceDecl!
15128   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
15129     // A valid resolved using typename pack expansion decl can have multiple
15130     // UsingDecls, but they must each have exactly one type, and it must be
15131     // the same type in every case. But we must have at least one expansion!
15132     if (UPD->expansions().empty()) {
15133       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
15134           << UPD->isCXXClassMember() << UPD;
15135       return QualType();
15136     }
15137 
15138     // We might still have some unresolved types. Try to pick a resolved type
15139     // if we can. The final instantiation will check that the remaining
15140     // unresolved types instantiate to the type we pick.
15141     QualType FallbackT;
15142     QualType T;
15143     for (auto *E : UPD->expansions()) {
15144       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
15145       if (ThisT.isNull())
15146         continue;
15147       else if (ThisT->getAs<UnresolvedUsingType>())
15148         FallbackT = ThisT;
15149       else if (T.isNull())
15150         T = ThisT;
15151       else
15152         assert(getSema().Context.hasSameType(ThisT, T) &&
15153                "mismatched resolved types in using pack expansion");
15154     }
15155     return T.isNull() ? FallbackT : T;
15156   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
15157     assert(Using->hasTypename() &&
15158            "UnresolvedUsingTypenameDecl transformed to non-typename using");
15159 
15160     // A valid resolved using typename decl points to exactly one type decl.
15161     assert(++Using->shadow_begin() == Using->shadow_end());
15162 
15163     UsingShadowDecl *Shadow = *Using->shadow_begin();
15164     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
15165       return QualType();
15166     return SemaRef.Context.getUsingType(
15167         Shadow, SemaRef.Context.getTypeDeclType(
15168                     cast<TypeDecl>(Shadow->getTargetDecl())));
15169   } else {
15170     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
15171            "UnresolvedUsingTypenameDecl transformed to non-using decl");
15172     return SemaRef.Context.getTypeDeclType(
15173         cast<UnresolvedUsingTypenameDecl>(D));
15174   }
15175 }
15176 
15177 template <typename Derived>
15178 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation,
15179                                                        TypeOfKind Kind) {
15180   return SemaRef.BuildTypeofExprType(E, Kind);
15181 }
15182 
15183 template<typename Derived>
15184 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying,
15185                                                    TypeOfKind Kind) {
15186   return SemaRef.Context.getTypeOfType(Underlying, Kind);
15187 }
15188 
15189 template <typename Derived>
15190 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
15191   return SemaRef.BuildDecltypeType(E);
15192 }
15193 
15194 template<typename Derived>
15195 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
15196                                             UnaryTransformType::UTTKind UKind,
15197                                             SourceLocation Loc) {
15198   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
15199 }
15200 
15201 template<typename Derived>
15202 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
15203                                                       TemplateName Template,
15204                                              SourceLocation TemplateNameLoc,
15205                                      TemplateArgumentListInfo &TemplateArgs) {
15206   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
15207 }
15208 
15209 template<typename Derived>
15210 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
15211                                                    SourceLocation KWLoc) {
15212   return SemaRef.BuildAtomicType(ValueType, KWLoc);
15213 }
15214 
15215 template<typename Derived>
15216 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
15217                                                  SourceLocation KWLoc,
15218                                                  bool isReadPipe) {
15219   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
15220                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
15221 }
15222 
15223 template <typename Derived>
15224 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
15225                                                    unsigned NumBits,
15226                                                    SourceLocation Loc) {
15227   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
15228                         NumBits, true);
15229   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
15230                                                 SemaRef.Context.IntTy, Loc);
15231   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
15232 }
15233 
15234 template <typename Derived>
15235 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
15236     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
15237   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
15238 }
15239 
15240 template<typename Derived>
15241 TemplateName
15242 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15243                                             bool TemplateKW,
15244                                             TemplateDecl *Template) {
15245   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
15246                                                   TemplateName(Template));
15247 }
15248 
15249 template<typename Derived>
15250 TemplateName
15251 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15252                                             SourceLocation TemplateKWLoc,
15253                                             const IdentifierInfo &Name,
15254                                             SourceLocation NameLoc,
15255                                             QualType ObjectType,
15256                                             NamedDecl *FirstQualifierInScope,
15257                                             bool AllowInjectedClassName) {
15258   UnqualifiedId TemplateName;
15259   TemplateName.setIdentifier(&Name, NameLoc);
15260   Sema::TemplateTy Template;
15261   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
15262                               TemplateName, ParsedType::make(ObjectType),
15263                               /*EnteringContext=*/false, Template,
15264                               AllowInjectedClassName);
15265   return Template.get();
15266 }
15267 
15268 template<typename Derived>
15269 TemplateName
15270 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15271                                             SourceLocation TemplateKWLoc,
15272                                             OverloadedOperatorKind Operator,
15273                                             SourceLocation NameLoc,
15274                                             QualType ObjectType,
15275                                             bool AllowInjectedClassName) {
15276   UnqualifiedId Name;
15277   // FIXME: Bogus location information.
15278   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
15279   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
15280   Sema::TemplateTy Template;
15281   getSema().ActOnTemplateName(
15282       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
15283       /*EnteringContext=*/false, Template, AllowInjectedClassName);
15284   return Template.get();
15285 }
15286 
15287 template <typename Derived>
15288 ExprResult TreeTransform<Derived>::RebuildCXXOperatorCallExpr(
15289     OverloadedOperatorKind Op, SourceLocation OpLoc, SourceLocation CalleeLoc,
15290     bool RequiresADL, const UnresolvedSetImpl &Functions, Expr *First,
15291     Expr *Second) {
15292   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
15293 
15294   if (First->getObjectKind() == OK_ObjCProperty) {
15295     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15296     if (BinaryOperator::isAssignmentOp(Opc))
15297       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
15298                                                  First, Second);
15299     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
15300     if (Result.isInvalid())
15301       return ExprError();
15302     First = Result.get();
15303   }
15304 
15305   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
15306     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
15307     if (Result.isInvalid())
15308       return ExprError();
15309     Second = Result.get();
15310   }
15311 
15312   // Determine whether this should be a builtin operation.
15313   if (Op == OO_Subscript) {
15314     if (!First->getType()->isOverloadableType() &&
15315         !Second->getType()->isOverloadableType())
15316       return getSema().CreateBuiltinArraySubscriptExpr(First, CalleeLoc, Second,
15317                                                        OpLoc);
15318   } else if (Op == OO_Arrow) {
15319     // It is possible that the type refers to a RecoveryExpr created earlier
15320     // in the tree transformation.
15321     if (First->getType()->isDependentType())
15322       return ExprError();
15323     // -> is never a builtin operation.
15324     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
15325   } else if (Second == nullptr || isPostIncDec) {
15326     if (!First->getType()->isOverloadableType() ||
15327         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
15328       // The argument is not of overloadable type, or this is an expression
15329       // of the form &Class::member, so try to create a built-in unary
15330       // operation.
15331       UnaryOperatorKind Opc
15332         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15333 
15334       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
15335     }
15336   } else {
15337     if (!First->getType()->isOverloadableType() &&
15338         !Second->getType()->isOverloadableType()) {
15339       // Neither of the arguments is an overloadable type, so try to
15340       // create a built-in binary operation.
15341       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15342       ExprResult Result
15343         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
15344       if (Result.isInvalid())
15345         return ExprError();
15346 
15347       return Result;
15348     }
15349   }
15350 
15351   // Add any functions found via argument-dependent lookup.
15352   Expr *Args[2] = { First, Second };
15353   unsigned NumArgs = 1 + (Second != nullptr);
15354 
15355   // Create the overloaded operator invocation for unary operators.
15356   if (NumArgs == 1 || isPostIncDec) {
15357     UnaryOperatorKind Opc
15358       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15359     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
15360                                            RequiresADL);
15361   }
15362 
15363   // Create the overloaded operator invocation for binary operators.
15364   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15365   ExprResult Result = SemaRef.CreateOverloadedBinOp(
15366       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
15367   if (Result.isInvalid())
15368     return ExprError();
15369 
15370   return Result;
15371 }
15372 
15373 template<typename Derived>
15374 ExprResult
15375 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
15376                                                      SourceLocation OperatorLoc,
15377                                                        bool isArrow,
15378                                                        CXXScopeSpec &SS,
15379                                                      TypeSourceInfo *ScopeType,
15380                                                        SourceLocation CCLoc,
15381                                                        SourceLocation TildeLoc,
15382                                         PseudoDestructorTypeStorage Destroyed) {
15383   QualType BaseType = Base->getType();
15384   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
15385       (!isArrow && !BaseType->getAs<RecordType>()) ||
15386       (isArrow && BaseType->getAs<PointerType>() &&
15387        !BaseType->castAs<PointerType>()->getPointeeType()
15388                                               ->template getAs<RecordType>())){
15389     // This pseudo-destructor expression is still a pseudo-destructor.
15390     return SemaRef.BuildPseudoDestructorExpr(
15391         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
15392         CCLoc, TildeLoc, Destroyed);
15393   }
15394 
15395   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
15396   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
15397                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
15398   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
15399   NameInfo.setNamedTypeInfo(DestroyedType);
15400 
15401   // The scope type is now known to be a valid nested name specifier
15402   // component. Tack it on to the end of the nested name specifier.
15403   if (ScopeType) {
15404     if (!ScopeType->getType()->getAs<TagType>()) {
15405       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
15406                      diag::err_expected_class_or_namespace)
15407           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
15408       return ExprError();
15409     }
15410     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
15411               CCLoc);
15412   }
15413 
15414   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
15415   return getSema().BuildMemberReferenceExpr(Base, BaseType,
15416                                             OperatorLoc, isArrow,
15417                                             SS, TemplateKWLoc,
15418                                             /*FIXME: FirstQualifier*/ nullptr,
15419                                             NameInfo,
15420                                             /*TemplateArgs*/ nullptr,
15421                                             /*S*/nullptr);
15422 }
15423 
15424 template<typename Derived>
15425 StmtResult
15426 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
15427   SourceLocation Loc = S->getBeginLoc();
15428   CapturedDecl *CD = S->getCapturedDecl();
15429   unsigned NumParams = CD->getNumParams();
15430   unsigned ContextParamPos = CD->getContextParamPosition();
15431   SmallVector<Sema::CapturedParamNameType, 4> Params;
15432   for (unsigned I = 0; I < NumParams; ++I) {
15433     if (I != ContextParamPos) {
15434       Params.push_back(
15435              std::make_pair(
15436                   CD->getParam(I)->getName(),
15437                   getDerived().TransformType(CD->getParam(I)->getType())));
15438     } else {
15439       Params.push_back(std::make_pair(StringRef(), QualType()));
15440     }
15441   }
15442   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
15443                                      S->getCapturedRegionKind(), Params);
15444   StmtResult Body;
15445   {
15446     Sema::CompoundScopeRAII CompoundScope(getSema());
15447     Body = getDerived().TransformStmt(S->getCapturedStmt());
15448   }
15449 
15450   if (Body.isInvalid()) {
15451     getSema().ActOnCapturedRegionError();
15452     return StmtError();
15453   }
15454 
15455   return getSema().ActOnCapturedRegionEnd(Body.get());
15456 }
15457 
15458 } // end namespace clang
15459 
15460 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15461