xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 3bd749dbd90cc3b95719b65393df5ca8a0fe919d)
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(ArrayRef<concepts::Requirement *> Reqs,
553       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
554   concepts::TypeRequirement *
555   TransformTypeRequirement(concepts::TypeRequirement *Req);
556   concepts::ExprRequirement *
557   TransformExprRequirement(concepts::ExprRequirement *Req);
558   concepts::NestedRequirement *
559   TransformNestedRequirement(concepts::NestedRequirement *Req);
560 
561   /// Transform the given template name.
562   ///
563   /// \param SS The nested-name-specifier that qualifies the template
564   /// name. This nested-name-specifier must already have been transformed.
565   ///
566   /// \param Name The template name to transform.
567   ///
568   /// \param NameLoc The source location of the template name.
569   ///
570   /// \param ObjectType If we're translating a template name within a member
571   /// access expression, this is the type of the object whose member template
572   /// is being referenced.
573   ///
574   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
575   /// also refers to a name within the current (lexical) scope, this is the
576   /// declaration it refers to.
577   ///
578   /// By default, transforms the template name by transforming the declarations
579   /// and nested-name-specifiers that occur within the template name.
580   /// Subclasses may override this function to provide alternate behavior.
581   TemplateName
582   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
583                         SourceLocation NameLoc,
584                         QualType ObjectType = QualType(),
585                         NamedDecl *FirstQualifierInScope = nullptr,
586                         bool AllowInjectedClassName = false);
587 
588   /// Transform the given template argument.
589   ///
590   /// By default, this operation transforms the type, expression, or
591   /// declaration stored within the template argument and constructs a
592   /// new template argument from the transformed result. Subclasses may
593   /// override this function to provide alternate behavior.
594   ///
595   /// Returns true if there was an error.
596   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
597                                  TemplateArgumentLoc &Output,
598                                  bool Uneval = false);
599 
600   /// Transform the given set of template arguments.
601   ///
602   /// By default, this operation transforms all of the template arguments
603   /// in the input set using \c TransformTemplateArgument(), and appends
604   /// the transformed arguments to the output list.
605   ///
606   /// Note that this overload of \c TransformTemplateArguments() is merely
607   /// a convenience function. Subclasses that wish to override this behavior
608   /// should override the iterator-based member template version.
609   ///
610   /// \param Inputs The set of template arguments to be transformed.
611   ///
612   /// \param NumInputs The number of template arguments in \p Inputs.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
619                                   unsigned NumInputs,
620                                   TemplateArgumentListInfo &Outputs,
621                                   bool Uneval = false) {
622     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
623                                       Uneval);
624   }
625 
626   /// Transform the given set of template arguments.
627   ///
628   /// By default, this operation transforms all of the template arguments
629   /// in the input set using \c TransformTemplateArgument(), and appends
630   /// the transformed arguments to the output list.
631   ///
632   /// \param First An iterator to the first template argument.
633   ///
634   /// \param Last An iterator one step past the last template argument.
635   ///
636   /// \param Outputs The set of transformed template arguments output by this
637   /// routine.
638   ///
639   /// Returns true if an error occurred.
640   template<typename InputIterator>
641   bool TransformTemplateArguments(InputIterator First,
642                                   InputIterator Last,
643                                   TemplateArgumentListInfo &Outputs,
644                                   bool Uneval = false);
645 
646   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
647   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
648                                  TemplateArgumentLoc &ArgLoc);
649 
650   /// Fakes up a TypeSourceInfo for a type.
651   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
652     return SemaRef.Context.getTrivialTypeSourceInfo(T,
653                        getDerived().getBaseLocation());
654   }
655 
656 #define ABSTRACT_TYPELOC(CLASS, PARENT)
657 #define TYPELOC(CLASS, PARENT)                                   \
658   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
659 #include "clang/AST/TypeLocNodes.def"
660 
661   QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
662                                          TemplateTypeParmTypeLoc TL,
663                                          bool SuppressObjCLifetime);
664   QualType
665   TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
666                                          SubstTemplateTypeParmPackTypeLoc TL,
667                                          bool SuppressObjCLifetime);
668 
669   template<typename Fn>
670   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
671                                       FunctionProtoTypeLoc TL,
672                                       CXXRecordDecl *ThisContext,
673                                       Qualifiers ThisTypeQuals,
674                                       Fn TransformExceptionSpec);
675 
676   bool TransformExceptionSpec(SourceLocation Loc,
677                               FunctionProtoType::ExceptionSpecInfo &ESI,
678                               SmallVectorImpl<QualType> &Exceptions,
679                               bool &Changed);
680 
681   StmtResult TransformSEHHandler(Stmt *Handler);
682 
683   QualType
684   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
685                                       TemplateSpecializationTypeLoc TL,
686                                       TemplateName Template);
687 
688   QualType
689   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
690                                       DependentTemplateSpecializationTypeLoc TL,
691                                                TemplateName Template,
692                                                CXXScopeSpec &SS);
693 
694   QualType TransformDependentTemplateSpecializationType(
695       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
696       NestedNameSpecifierLoc QualifierLoc);
697 
698   /// Transforms the parameters of a function type into the
699   /// given vectors.
700   ///
701   /// The result vectors should be kept in sync; null entries in the
702   /// variables vector are acceptable.
703   ///
704   /// LastParamTransformed, if non-null, will be set to the index of the last
705   /// parameter on which transfromation was started. In the event of an error,
706   /// this will contain the parameter which failed to instantiate.
707   ///
708   /// Return true on error.
709   bool TransformFunctionTypeParams(
710       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
711       const QualType *ParamTypes,
712       const FunctionProtoType::ExtParameterInfo *ParamInfos,
713       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
714       Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed);
715 
716   bool TransformFunctionTypeParams(
717       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
718       const QualType *ParamTypes,
719       const FunctionProtoType::ExtParameterInfo *ParamInfos,
720       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
721       Sema::ExtParameterInfoBuilder &PInfos) {
722     return getDerived().TransformFunctionTypeParams(
723         Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr);
724   }
725 
726   /// Transforms the parameters of a requires expresison into the given vectors.
727   ///
728   /// The result vectors should be kept in sync; null entries in the
729   /// variables vector are acceptable.
730   ///
731   /// Returns an unset ExprResult on success.  Returns an ExprResult the 'not
732   /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of
733   /// which are cases where transformation shouldn't continue.
734   ExprResult TransformRequiresTypeParams(
735       SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
736       RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
737       SmallVectorImpl<QualType> &PTypes,
738       SmallVectorImpl<ParmVarDecl *> &TransParams,
739       Sema::ExtParameterInfoBuilder &PInfos) {
740     if (getDerived().TransformFunctionTypeParams(
741             KWLoc, Params, /*ParamTypes=*/nullptr,
742             /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos))
743       return ExprError();
744 
745     return ExprResult{};
746   }
747 
748   /// Transforms a single function-type parameter.  Return null
749   /// on error.
750   ///
751   /// \param indexAdjustment - A number to add to the parameter's
752   ///   scope index;  can be negative
753   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
754                                           int indexAdjustment,
755                                           std::optional<unsigned> NumExpansions,
756                                           bool ExpectParameterPack);
757 
758   /// Transform the body of a lambda-expression.
759   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
760   /// Alternative implementation of TransformLambdaBody that skips transforming
761   /// the body.
762   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
763 
764   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
765 
766   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
767   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
768 
769   TemplateParameterList *TransformTemplateParameterList(
770         TemplateParameterList *TPL) {
771     return TPL;
772   }
773 
774   ExprResult TransformAddressOfOperand(Expr *E);
775 
776   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
777                                                 bool IsAddressOfOperand,
778                                                 TypeSourceInfo **RecoveryTSI);
779 
780   ExprResult TransformParenDependentScopeDeclRefExpr(
781       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
782       TypeSourceInfo **RecoveryTSI);
783 
784   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
785 
786 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
787 // amount of stack usage with clang.
788 #define STMT(Node, Parent)                        \
789   LLVM_ATTRIBUTE_NOINLINE \
790   StmtResult Transform##Node(Node *S);
791 #define VALUESTMT(Node, Parent)                   \
792   LLVM_ATTRIBUTE_NOINLINE \
793   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
794 #define EXPR(Node, Parent)                        \
795   LLVM_ATTRIBUTE_NOINLINE \
796   ExprResult Transform##Node(Node *E);
797 #define ABSTRACT_STMT(Stmt)
798 #include "clang/AST/StmtNodes.inc"
799 
800 #define GEN_CLANG_CLAUSE_CLASS
801 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
802   LLVM_ATTRIBUTE_NOINLINE                                                      \
803   OMPClause *Transform##Class(Class *S);
804 #include "llvm/Frontend/OpenMP/OMP.inc"
805 
806   /// Build a new qualified type given its unqualified type and type location.
807   ///
808   /// By default, this routine adds type qualifiers only to types that can
809   /// have qualifiers, and silently suppresses those qualifiers that are not
810   /// permitted. Subclasses may override this routine to provide different
811   /// behavior.
812   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
813 
814   /// Build a new pointer type given its pointee type.
815   ///
816   /// By default, performs semantic analysis when building the pointer type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
819 
820   /// Build a new block pointer type given its pointee type.
821   ///
822   /// By default, performs semantic analysis when building the block pointer
823   /// type. Subclasses may override this routine to provide different behavior.
824   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
825 
826   /// Build a new reference type given the type it references.
827   ///
828   /// By default, performs semantic analysis when building the
829   /// reference type. Subclasses may override this routine to provide
830   /// different behavior.
831   ///
832   /// \param LValue whether the type was written with an lvalue sigil
833   /// or an rvalue sigil.
834   QualType RebuildReferenceType(QualType ReferentType,
835                                 bool LValue,
836                                 SourceLocation Sigil);
837 
838   /// Build a new member pointer type given the pointee type and the
839   /// class type it refers into.
840   ///
841   /// By default, performs semantic analysis when building the member pointer
842   /// type. Subclasses may override this routine to provide different behavior.
843   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
844                                     SourceLocation Sigil);
845 
846   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
847                                     SourceLocation ProtocolLAngleLoc,
848                                     ArrayRef<ObjCProtocolDecl *> Protocols,
849                                     ArrayRef<SourceLocation> ProtocolLocs,
850                                     SourceLocation ProtocolRAngleLoc);
851 
852   /// Build an Objective-C object type.
853   ///
854   /// By default, performs semantic analysis when building the object type.
855   /// Subclasses may override this routine to provide different behavior.
856   QualType RebuildObjCObjectType(QualType BaseType,
857                                  SourceLocation Loc,
858                                  SourceLocation TypeArgsLAngleLoc,
859                                  ArrayRef<TypeSourceInfo *> TypeArgs,
860                                  SourceLocation TypeArgsRAngleLoc,
861                                  SourceLocation ProtocolLAngleLoc,
862                                  ArrayRef<ObjCProtocolDecl *> Protocols,
863                                  ArrayRef<SourceLocation> ProtocolLocs,
864                                  SourceLocation ProtocolRAngleLoc);
865 
866   /// Build a new Objective-C object pointer type given the pointee type.
867   ///
868   /// By default, directly builds the pointer type, with no additional semantic
869   /// analysis.
870   QualType RebuildObjCObjectPointerType(QualType PointeeType,
871                                         SourceLocation Star);
872 
873   /// Build a new array type given the element type, size
874   /// modifier, size of the array (if known), size expression, and index type
875   /// qualifiers.
876   ///
877   /// By default, performs semantic analysis when building the array type.
878   /// Subclasses may override this routine to provide different behavior.
879   /// Also by default, all of the other Rebuild*Array
880   QualType RebuildArrayType(QualType ElementType,
881                             ArrayType::ArraySizeModifier SizeMod,
882                             const llvm::APInt *Size,
883                             Expr *SizeExpr,
884                             unsigned IndexTypeQuals,
885                             SourceRange BracketsRange);
886 
887   /// Build a new constant array type given the element type, size
888   /// modifier, (known) size of the array, and index type qualifiers.
889   ///
890   /// By default, performs semantic analysis when building the array type.
891   /// Subclasses may override this routine to provide different behavior.
892   QualType RebuildConstantArrayType(QualType ElementType,
893                                     ArrayType::ArraySizeModifier SizeMod,
894                                     const llvm::APInt &Size,
895                                     Expr *SizeExpr,
896                                     unsigned IndexTypeQuals,
897                                     SourceRange BracketsRange);
898 
899   /// Build a new incomplete array type given the element type, size
900   /// modifier, and index type qualifiers.
901   ///
902   /// By default, performs semantic analysis when building the array type.
903   /// Subclasses may override this routine to provide different behavior.
904   QualType RebuildIncompleteArrayType(QualType ElementType,
905                                       ArrayType::ArraySizeModifier SizeMod,
906                                       unsigned IndexTypeQuals,
907                                       SourceRange BracketsRange);
908 
909   /// Build a new variable-length array type given the element type,
910   /// size modifier, size expression, and index type qualifiers.
911   ///
912   /// By default, performs semantic analysis when building the array type.
913   /// Subclasses may override this routine to provide different behavior.
914   QualType RebuildVariableArrayType(QualType ElementType,
915                                     ArrayType::ArraySizeModifier SizeMod,
916                                     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                                           ArrayType::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                              VectorType::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,
946                                            VectorType::VectorKind);
947 
948   /// Build a new extended vector type given the element type and
949   /// number of elements.
950   ///
951   /// By default, performs semantic analysis when building the vector type.
952   /// Subclasses may override this routine to provide different behavior.
953   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
954                                 SourceLocation AttributeLoc);
955 
956   /// Build a new potentially dependently-sized extended vector type
957   /// given the element type and number of elements.
958   ///
959   /// By default, performs semantic analysis when building the vector type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
962                                               Expr *SizeExpr,
963                                               SourceLocation AttributeLoc);
964 
965   /// Build a new matrix type given the element type and dimensions.
966   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
967                                      unsigned NumColumns);
968 
969   /// Build a new matrix type given the type and dependently-defined
970   /// dimensions.
971   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
972                                            Expr *ColumnExpr,
973                                            SourceLocation AttributeLoc);
974 
975   /// Build a new DependentAddressSpaceType or return the pointee
976   /// type variable with the correct address space (retrieved from
977   /// AddrSpaceExpr) applied to it. The former will be returned in cases
978   /// where the address space remains dependent.
979   ///
980   /// By default, performs semantic analysis when building the type with address
981   /// space applied. Subclasses may override this routine to provide different
982   /// behavior.
983   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
984                                             Expr *AddrSpaceExpr,
985                                             SourceLocation AttributeLoc);
986 
987   /// Build a new function type.
988   ///
989   /// By default, performs semantic analysis when building the function type.
990   /// Subclasses may override this routine to provide different behavior.
991   QualType RebuildFunctionProtoType(QualType T,
992                                     MutableArrayRef<QualType> ParamTypes,
993                                     const FunctionProtoType::ExtProtoInfo &EPI);
994 
995   /// Build a new unprototyped function type.
996   QualType RebuildFunctionNoProtoType(QualType ResultType);
997 
998   /// Rebuild an unresolved typename type, given the decl that
999   /// the UnresolvedUsingTypenameDecl was transformed to.
1000   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
1001 
1002   /// Build a new type found via an alias.
1003   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
1004     return SemaRef.Context.getUsingType(Found, Underlying);
1005   }
1006 
1007   /// Build a new typedef type.
1008   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
1009     return SemaRef.Context.getTypeDeclType(Typedef);
1010   }
1011 
1012   /// Build a new MacroDefined type.
1013   QualType RebuildMacroQualifiedType(QualType T,
1014                                      const IdentifierInfo *MacroII) {
1015     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
1016   }
1017 
1018   /// Build a new class/struct/union type.
1019   QualType RebuildRecordType(RecordDecl *Record) {
1020     return SemaRef.Context.getTypeDeclType(Record);
1021   }
1022 
1023   /// Build a new Enum type.
1024   QualType RebuildEnumType(EnumDecl *Enum) {
1025     return SemaRef.Context.getTypeDeclType(Enum);
1026   }
1027 
1028   /// Build a new typeof(expr) type.
1029   ///
1030   /// By default, performs semantic analysis when building the typeof type.
1031   /// Subclasses may override this routine to provide different behavior.
1032   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc,
1033                                  TypeOfKind Kind);
1034 
1035   /// Build a new typeof(type) type.
1036   ///
1037   /// By default, builds a new TypeOfType with the given underlying type.
1038   QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind);
1039 
1040   /// Build a new unary transform type.
1041   QualType RebuildUnaryTransformType(QualType BaseType,
1042                                      UnaryTransformType::UTTKind UKind,
1043                                      SourceLocation Loc);
1044 
1045   /// Build a new C++11 decltype type.
1046   ///
1047   /// By default, performs semantic analysis when building the decltype type.
1048   /// Subclasses may override this routine to provide different behavior.
1049   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
1050 
1051   /// Build a new C++11 auto type.
1052   ///
1053   /// By default, builds a new AutoType with the given deduced type.
1054   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
1055                            ConceptDecl *TypeConstraintConcept,
1056                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
1057     // Note, IsDependent is always false here: we implicitly convert an 'auto'
1058     // which has been deduced to a dependent type into an undeduced 'auto', so
1059     // that we'll retry deduction after the transformation.
1060     return SemaRef.Context.getAutoType(Deduced, Keyword,
1061                                        /*IsDependent*/ false, /*IsPack=*/false,
1062                                        TypeConstraintConcept,
1063                                        TypeConstraintArgs);
1064   }
1065 
1066   /// By default, builds a new DeducedTemplateSpecializationType with the given
1067   /// deduced type.
1068   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1069       QualType Deduced) {
1070     return SemaRef.Context.getDeducedTemplateSpecializationType(
1071         Template, Deduced, /*IsDependent*/ false);
1072   }
1073 
1074   /// Build a new template specialization type.
1075   ///
1076   /// By default, performs semantic analysis when building the template
1077   /// specialization type. Subclasses may override this routine to provide
1078   /// different behavior.
1079   QualType RebuildTemplateSpecializationType(TemplateName Template,
1080                                              SourceLocation TemplateLoc,
1081                                              TemplateArgumentListInfo &Args);
1082 
1083   /// Build a new parenthesized type.
1084   ///
1085   /// By default, builds a new ParenType type from the inner type.
1086   /// Subclasses may override this routine to provide different behavior.
1087   QualType RebuildParenType(QualType InnerType) {
1088     return SemaRef.BuildParenType(InnerType);
1089   }
1090 
1091   /// Build a new qualified name type.
1092   ///
1093   /// By default, builds a new ElaboratedType type from the keyword,
1094   /// the nested-name-specifier and the named type.
1095   /// Subclasses may override this routine to provide different behavior.
1096   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1097                                  ElaboratedTypeKeyword Keyword,
1098                                  NestedNameSpecifierLoc QualifierLoc,
1099                                  QualType Named) {
1100     return SemaRef.Context.getElaboratedType(Keyword,
1101                                          QualifierLoc.getNestedNameSpecifier(),
1102                                              Named);
1103   }
1104 
1105   /// Build a new typename type that refers to a template-id.
1106   ///
1107   /// By default, builds a new DependentNameType type from the
1108   /// nested-name-specifier and the given type. Subclasses may override
1109   /// this routine to provide different behavior.
1110   QualType RebuildDependentTemplateSpecializationType(
1111                                           ElaboratedTypeKeyword Keyword,
1112                                           NestedNameSpecifierLoc QualifierLoc,
1113                                           SourceLocation TemplateKWLoc,
1114                                           const IdentifierInfo *Name,
1115                                           SourceLocation NameLoc,
1116                                           TemplateArgumentListInfo &Args,
1117                                           bool AllowInjectedClassName) {
1118     // Rebuild the template name.
1119     // TODO: avoid TemplateName abstraction
1120     CXXScopeSpec SS;
1121     SS.Adopt(QualifierLoc);
1122     TemplateName InstName = getDerived().RebuildTemplateName(
1123         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1124         AllowInjectedClassName);
1125 
1126     if (InstName.isNull())
1127       return QualType();
1128 
1129     // If it's still dependent, make a dependent specialization.
1130     if (InstName.getAsDependentTemplateName())
1131       return SemaRef.Context.getDependentTemplateSpecializationType(
1132           Keyword, QualifierLoc.getNestedNameSpecifier(), Name,
1133           Args.arguments());
1134 
1135     // Otherwise, make an elaborated type wrapping a non-dependent
1136     // specialization.
1137     QualType T =
1138         getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1139     if (T.isNull())
1140       return QualType();
1141     return SemaRef.Context.getElaboratedType(
1142         Keyword, QualifierLoc.getNestedNameSpecifier(), T);
1143   }
1144 
1145   /// Build a new typename type that refers to an identifier.
1146   ///
1147   /// By default, performs semantic analysis when building the typename type
1148   /// (or elaborated type). Subclasses may override this routine to provide
1149   /// different behavior.
1150   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1151                                     SourceLocation KeywordLoc,
1152                                     NestedNameSpecifierLoc QualifierLoc,
1153                                     const IdentifierInfo *Id,
1154                                     SourceLocation IdLoc,
1155                                     bool DeducedTSTContext) {
1156     CXXScopeSpec SS;
1157     SS.Adopt(QualifierLoc);
1158 
1159     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1160       // If the name is still dependent, just build a new dependent name type.
1161       if (!SemaRef.computeDeclContext(SS))
1162         return SemaRef.Context.getDependentNameType(Keyword,
1163                                           QualifierLoc.getNestedNameSpecifier(),
1164                                                     Id);
1165     }
1166 
1167     if (Keyword == ETK_None || Keyword == ETK_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) << SomeDecl
1217                                                                << NTK << 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               << Kind << Id << DC << QualifierLoc.getSourceRange();
1224           break;
1225       }
1226       return QualType();
1227     }
1228 
1229     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1230                                               IdLoc, Id)) {
1231       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1232       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1233       return QualType();
1234     }
1235 
1236     // Build the elaborated-type-specifier type.
1237     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1238     return SemaRef.Context.getElaboratedType(Keyword,
1239                                          QualifierLoc.getNestedNameSpecifier(),
1240                                              T);
1241   }
1242 
1243   /// Build a new pack expansion type.
1244   ///
1245   /// By default, builds a new PackExpansionType type from the given pattern.
1246   /// Subclasses may override this routine to provide different behavior.
1247   QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange,
1248                                     SourceLocation EllipsisLoc,
1249                                     std::optional<unsigned> NumExpansions) {
1250     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1251                                         NumExpansions);
1252   }
1253 
1254   /// Build a new atomic type given its value type.
1255   ///
1256   /// By default, performs semantic analysis when building the atomic type.
1257   /// Subclasses may override this routine to provide different behavior.
1258   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1259 
1260   /// Build a new pipe type given its value type.
1261   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1262                            bool isReadPipe);
1263 
1264   /// Build a bit-precise int given its value type.
1265   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1266                              SourceLocation Loc);
1267 
1268   /// Build a dependent bit-precise int given its value type.
1269   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1270                                       SourceLocation Loc);
1271 
1272   /// Build a new template name given a nested name specifier, a flag
1273   /// indicating whether the "template" keyword was provided, and the template
1274   /// that the template name refers to.
1275   ///
1276   /// By default, builds the new template name directly. Subclasses may override
1277   /// this routine to provide different behavior.
1278   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1279                                    bool TemplateKW,
1280                                    TemplateDecl *Template);
1281 
1282   /// Build a new template name given a nested name specifier and the
1283   /// name that is referred to as a template.
1284   ///
1285   /// By default, performs semantic analysis to determine whether the name can
1286   /// be resolved to a specific template, then builds the appropriate kind of
1287   /// template name. Subclasses may override this routine to provide different
1288   /// behavior.
1289   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1290                                    SourceLocation TemplateKWLoc,
1291                                    const IdentifierInfo &Name,
1292                                    SourceLocation NameLoc, QualType ObjectType,
1293                                    NamedDecl *FirstQualifierInScope,
1294                                    bool AllowInjectedClassName);
1295 
1296   /// Build a new template name given a nested name specifier and the
1297   /// overloaded operator name that is referred to as a template.
1298   ///
1299   /// By default, performs semantic analysis to determine whether the name can
1300   /// be resolved to a specific template, then builds the appropriate kind of
1301   /// template name. Subclasses may override this routine to provide different
1302   /// behavior.
1303   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1304                                    SourceLocation TemplateKWLoc,
1305                                    OverloadedOperatorKind Operator,
1306                                    SourceLocation NameLoc, QualType ObjectType,
1307                                    bool AllowInjectedClassName);
1308 
1309   /// Build a new template name given a template template parameter pack
1310   /// and the
1311   ///
1312   /// By default, performs semantic analysis to determine whether the name can
1313   /// be resolved to a specific template, then builds the appropriate kind of
1314   /// template name. Subclasses may override this routine to provide different
1315   /// behavior.
1316   TemplateName RebuildTemplateName(const TemplateArgument &ArgPack,
1317                                    Decl *AssociatedDecl, unsigned Index,
1318                                    bool Final) {
1319     return getSema().Context.getSubstTemplateTemplateParmPack(
1320         ArgPack, AssociatedDecl, Index, Final);
1321   }
1322 
1323   /// Build a new compound statement.
1324   ///
1325   /// By default, performs semantic analysis to build the new statement.
1326   /// Subclasses may override this routine to provide different behavior.
1327   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1328                                        MultiStmtArg Statements,
1329                                        SourceLocation RBraceLoc,
1330                                        bool IsStmtExpr) {
1331     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1332                                        IsStmtExpr);
1333   }
1334 
1335   /// Build a new case statement.
1336   ///
1337   /// By default, performs semantic analysis to build the new statement.
1338   /// Subclasses may override this routine to provide different behavior.
1339   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1340                                    Expr *LHS,
1341                                    SourceLocation EllipsisLoc,
1342                                    Expr *RHS,
1343                                    SourceLocation ColonLoc) {
1344     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1345                                    ColonLoc);
1346   }
1347 
1348   /// Attach the body to a new case statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1353     getSema().ActOnCaseStmtBody(S, Body);
1354     return S;
1355   }
1356 
1357   /// Build a new default statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1362                                       SourceLocation ColonLoc,
1363                                       Stmt *SubStmt) {
1364     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1365                                       /*CurScope=*/nullptr);
1366   }
1367 
1368   /// Build a new label statement.
1369   ///
1370   /// By default, performs semantic analysis to build the new statement.
1371   /// Subclasses may override this routine to provide different behavior.
1372   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1373                               SourceLocation ColonLoc, Stmt *SubStmt) {
1374     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1375   }
1376 
1377   /// Build a new attributed statement.
1378   ///
1379   /// By default, performs semantic analysis to build the new statement.
1380   /// Subclasses may override this routine to provide different behavior.
1381   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1382                                    ArrayRef<const Attr *> Attrs,
1383                                    Stmt *SubStmt) {
1384     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1385   }
1386 
1387   /// Build a new "if" statement.
1388   ///
1389   /// By default, performs semantic analysis to build the new statement.
1390   /// Subclasses may override this routine to provide different behavior.
1391   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1392                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1393                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1394                            SourceLocation ElseLoc, Stmt *Else) {
1395     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1396                                  Then, ElseLoc, Else);
1397   }
1398 
1399   /// Start building a new switch statement.
1400   ///
1401   /// By default, performs semantic analysis to build the new statement.
1402   /// Subclasses may override this routine to provide different behavior.
1403   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1404                                     SourceLocation LParenLoc, Stmt *Init,
1405                                     Sema::ConditionResult Cond,
1406                                     SourceLocation RParenLoc) {
1407     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1408                                             RParenLoc);
1409   }
1410 
1411   /// Attach the body to the switch statement.
1412   ///
1413   /// By default, performs semantic analysis to build the new statement.
1414   /// Subclasses may override this routine to provide different behavior.
1415   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1416                                    Stmt *Switch, Stmt *Body) {
1417     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1418   }
1419 
1420   /// Build a new while statement.
1421   ///
1422   /// By default, performs semantic analysis to build the new statement.
1423   /// Subclasses may override this routine to provide different behavior.
1424   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1425                               Sema::ConditionResult Cond,
1426                               SourceLocation RParenLoc, Stmt *Body) {
1427     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1428   }
1429 
1430   /// Build a new do-while statement.
1431   ///
1432   /// By default, performs semantic analysis to build the new statement.
1433   /// Subclasses may override this routine to provide different behavior.
1434   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1435                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1436                            Expr *Cond, SourceLocation RParenLoc) {
1437     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1438                                  Cond, RParenLoc);
1439   }
1440 
1441   /// Build a new for statement.
1442   ///
1443   /// By default, performs semantic analysis to build the new statement.
1444   /// Subclasses may override this routine to provide different behavior.
1445   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1446                             Stmt *Init, Sema::ConditionResult Cond,
1447                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1448                             Stmt *Body) {
1449     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1450                                   Inc, RParenLoc, Body);
1451   }
1452 
1453   /// Build a new goto statement.
1454   ///
1455   /// By default, performs semantic analysis to build the new statement.
1456   /// Subclasses may override this routine to provide different behavior.
1457   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1458                              LabelDecl *Label) {
1459     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1460   }
1461 
1462   /// Build a new indirect goto statement.
1463   ///
1464   /// By default, performs semantic analysis to build the new statement.
1465   /// Subclasses may override this routine to provide different behavior.
1466   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1467                                      SourceLocation StarLoc,
1468                                      Expr *Target) {
1469     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1470   }
1471 
1472   /// Build a new return statement.
1473   ///
1474   /// By default, performs semantic analysis to build the new statement.
1475   /// Subclasses may override this routine to provide different behavior.
1476   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1477     return getSema().BuildReturnStmt(ReturnLoc, Result);
1478   }
1479 
1480   /// Build a new declaration statement.
1481   ///
1482   /// By default, performs semantic analysis to build the new statement.
1483   /// Subclasses may override this routine to provide different behavior.
1484   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1485                              SourceLocation StartLoc, SourceLocation EndLoc) {
1486     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1487     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1488   }
1489 
1490   /// Build a new inline asm statement.
1491   ///
1492   /// By default, performs semantic analysis to build the new statement.
1493   /// Subclasses may override this routine to provide different behavior.
1494   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1495                                bool IsVolatile, unsigned NumOutputs,
1496                                unsigned NumInputs, IdentifierInfo **Names,
1497                                MultiExprArg Constraints, MultiExprArg Exprs,
1498                                Expr *AsmString, MultiExprArg Clobbers,
1499                                unsigned NumLabels,
1500                                SourceLocation RParenLoc) {
1501     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1502                                      NumInputs, Names, Constraints, Exprs,
1503                                      AsmString, Clobbers, NumLabels, RParenLoc);
1504   }
1505 
1506   /// Build a new MS style inline asm statement.
1507   ///
1508   /// By default, performs semantic analysis to build the new statement.
1509   /// Subclasses may override this routine to provide different behavior.
1510   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1511                               ArrayRef<Token> AsmToks,
1512                               StringRef AsmString,
1513                               unsigned NumOutputs, unsigned NumInputs,
1514                               ArrayRef<StringRef> Constraints,
1515                               ArrayRef<StringRef> Clobbers,
1516                               ArrayRef<Expr*> Exprs,
1517                               SourceLocation EndLoc) {
1518     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1519                                     NumOutputs, NumInputs,
1520                                     Constraints, Clobbers, Exprs, EndLoc);
1521   }
1522 
1523   /// Build a new co_return statement.
1524   ///
1525   /// By default, performs semantic analysis to build the new statement.
1526   /// Subclasses may override this routine to provide different behavior.
1527   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1528                                  bool IsImplicit) {
1529     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1530   }
1531 
1532   /// Build a new co_await expression.
1533   ///
1534   /// By default, performs semantic analysis to build the new expression.
1535   /// Subclasses may override this routine to provide different behavior.
1536   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand,
1537                                 UnresolvedLookupExpr *OpCoawaitLookup,
1538                                 bool IsImplicit) {
1539     // This function rebuilds a coawait-expr given its operator.
1540     // For an explicit coawait-expr, the rebuild involves the full set
1541     // of transformations performed by BuildUnresolvedCoawaitExpr(),
1542     // including calling await_transform().
1543     // For an implicit coawait-expr, we need to rebuild the "operator
1544     // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr().
1545     // This mirrors how the implicit CoawaitExpr is originally created
1546     // in Sema::ActOnCoroutineBodyStart().
1547     if (IsImplicit) {
1548       ExprResult Suspend = getSema().BuildOperatorCoawaitCall(
1549           CoawaitLoc, Operand, OpCoawaitLookup);
1550       if (Suspend.isInvalid())
1551         return ExprError();
1552       return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand,
1553                                                 Suspend.get(), true);
1554     }
1555 
1556     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand,
1557                                                 OpCoawaitLookup);
1558   }
1559 
1560   /// Build a new co_await expression.
1561   ///
1562   /// By default, performs semantic analysis to build the new expression.
1563   /// Subclasses may override this routine to provide different behavior.
1564   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1565                                          Expr *Result,
1566                                          UnresolvedLookupExpr *Lookup) {
1567     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1568   }
1569 
1570   /// Build a new co_yield expression.
1571   ///
1572   /// By default, performs semantic analysis to build the new expression.
1573   /// Subclasses may override this routine to provide different behavior.
1574   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1575     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1576   }
1577 
1578   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1579     return getSema().BuildCoroutineBodyStmt(Args);
1580   }
1581 
1582   /// Build a new Objective-C \@try statement.
1583   ///
1584   /// By default, performs semantic analysis to build the new statement.
1585   /// Subclasses may override this routine to provide different behavior.
1586   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1587                                         Stmt *TryBody,
1588                                         MultiStmtArg CatchStmts,
1589                                         Stmt *Finally) {
1590     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1591                                         Finally);
1592   }
1593 
1594   /// Rebuild an Objective-C exception declaration.
1595   ///
1596   /// By default, performs semantic analysis to build the new declaration.
1597   /// Subclasses may override this routine to provide different behavior.
1598   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1599                                     TypeSourceInfo *TInfo, QualType T) {
1600     return getSema().BuildObjCExceptionDecl(TInfo, T,
1601                                             ExceptionDecl->getInnerLocStart(),
1602                                             ExceptionDecl->getLocation(),
1603                                             ExceptionDecl->getIdentifier());
1604   }
1605 
1606   /// Build a new Objective-C \@catch statement.
1607   ///
1608   /// By default, performs semantic analysis to build the new statement.
1609   /// Subclasses may override this routine to provide different behavior.
1610   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1611                                           SourceLocation RParenLoc,
1612                                           VarDecl *Var,
1613                                           Stmt *Body) {
1614     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1615                                           Var, Body);
1616   }
1617 
1618   /// Build a new Objective-C \@finally statement.
1619   ///
1620   /// By default, performs semantic analysis to build the new statement.
1621   /// Subclasses may override this routine to provide different behavior.
1622   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1623                                             Stmt *Body) {
1624     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1625   }
1626 
1627   /// Build a new Objective-C \@throw statement.
1628   ///
1629   /// By default, performs semantic analysis to build the new statement.
1630   /// Subclasses may override this routine to provide different behavior.
1631   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1632                                           Expr *Operand) {
1633     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1634   }
1635 
1636   /// Build a new OpenMP Canonical loop.
1637   ///
1638   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1639   /// OMPCanonicalLoop.
1640   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1641     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1642   }
1643 
1644   /// Build a new OpenMP executable directive.
1645   ///
1646   /// By default, performs semantic analysis to build the new statement.
1647   /// Subclasses may override this routine to provide different behavior.
1648   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1649                                            DeclarationNameInfo DirName,
1650                                            OpenMPDirectiveKind CancelRegion,
1651                                            ArrayRef<OMPClause *> Clauses,
1652                                            Stmt *AStmt, SourceLocation StartLoc,
1653                                            SourceLocation EndLoc) {
1654     return getSema().ActOnOpenMPExecutableDirective(
1655         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1656   }
1657 
1658   /// Build a new OpenMP 'if' clause.
1659   ///
1660   /// By default, performs semantic analysis to build the new OpenMP clause.
1661   /// Subclasses may override this routine to provide different behavior.
1662   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1663                                 Expr *Condition, SourceLocation StartLoc,
1664                                 SourceLocation LParenLoc,
1665                                 SourceLocation NameModifierLoc,
1666                                 SourceLocation ColonLoc,
1667                                 SourceLocation EndLoc) {
1668     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1669                                          LParenLoc, NameModifierLoc, ColonLoc,
1670                                          EndLoc);
1671   }
1672 
1673   /// Build a new OpenMP 'final' clause.
1674   ///
1675   /// By default, performs semantic analysis to build the new OpenMP clause.
1676   /// Subclasses may override this routine to provide different behavior.
1677   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1678                                    SourceLocation LParenLoc,
1679                                    SourceLocation EndLoc) {
1680     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1681                                             EndLoc);
1682   }
1683 
1684   /// Build a new OpenMP 'num_threads' clause.
1685   ///
1686   /// By default, performs semantic analysis to build the new OpenMP clause.
1687   /// Subclasses may override this routine to provide different behavior.
1688   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1689                                         SourceLocation StartLoc,
1690                                         SourceLocation LParenLoc,
1691                                         SourceLocation EndLoc) {
1692     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1693                                                  LParenLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'safelen' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1701                                      SourceLocation LParenLoc,
1702                                      SourceLocation EndLoc) {
1703     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1704   }
1705 
1706   /// Build a new OpenMP 'simdlen' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
1710   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1711                                      SourceLocation LParenLoc,
1712                                      SourceLocation EndLoc) {
1713     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1714   }
1715 
1716   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1717                                    SourceLocation StartLoc,
1718                                    SourceLocation LParenLoc,
1719                                    SourceLocation EndLoc) {
1720     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1721   }
1722 
1723   /// Build a new OpenMP 'full' clause.
1724   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1725                                   SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1727   }
1728 
1729   /// Build a new OpenMP 'partial' clause.
1730   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1731                                      SourceLocation LParenLoc,
1732                                      SourceLocation EndLoc) {
1733     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1734                                               EndLoc);
1735   }
1736 
1737   /// Build a new OpenMP 'allocator' clause.
1738   ///
1739   /// By default, performs semantic analysis to build the new OpenMP clause.
1740   /// Subclasses may override this routine to provide different behavior.
1741   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1742                                        SourceLocation LParenLoc,
1743                                        SourceLocation EndLoc) {
1744     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1745   }
1746 
1747   /// Build a new OpenMP 'collapse' clause.
1748   ///
1749   /// By default, performs semantic analysis to build the new OpenMP clause.
1750   /// Subclasses may override this routine to provide different behavior.
1751   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1752                                       SourceLocation LParenLoc,
1753                                       SourceLocation EndLoc) {
1754     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1755                                                EndLoc);
1756   }
1757 
1758   /// Build a new OpenMP 'default' clause.
1759   ///
1760   /// By default, performs semantic analysis to build the new OpenMP clause.
1761   /// Subclasses may override this routine to provide different behavior.
1762   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1763                                      SourceLocation StartLoc,
1764                                      SourceLocation LParenLoc,
1765                                      SourceLocation EndLoc) {
1766     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1767                                               StartLoc, LParenLoc, EndLoc);
1768   }
1769 
1770   /// Build a new OpenMP 'proc_bind' clause.
1771   ///
1772   /// By default, performs semantic analysis to build the new OpenMP clause.
1773   /// Subclasses may override this routine to provide different behavior.
1774   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1775                                       SourceLocation KindKwLoc,
1776                                       SourceLocation StartLoc,
1777                                       SourceLocation LParenLoc,
1778                                       SourceLocation EndLoc) {
1779     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1780                                                StartLoc, LParenLoc, EndLoc);
1781   }
1782 
1783   /// Build a new OpenMP 'schedule' clause.
1784   ///
1785   /// By default, performs semantic analysis to build the new OpenMP clause.
1786   /// Subclasses may override this routine to provide different behavior.
1787   OMPClause *RebuildOMPScheduleClause(
1788       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1789       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1790       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1791       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1792     return getSema().ActOnOpenMPScheduleClause(
1793         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1794         CommaLoc, EndLoc);
1795   }
1796 
1797   /// Build a new OpenMP 'ordered' clause.
1798   ///
1799   /// By default, performs semantic analysis to build the new OpenMP clause.
1800   /// Subclasses may override this routine to provide different behavior.
1801   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1802                                      SourceLocation EndLoc,
1803                                      SourceLocation LParenLoc, Expr *Num) {
1804     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1805   }
1806 
1807   /// Build a new OpenMP 'private' clause.
1808   ///
1809   /// By default, performs semantic analysis to build the new OpenMP clause.
1810   /// Subclasses may override this routine to provide different behavior.
1811   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1812                                      SourceLocation StartLoc,
1813                                      SourceLocation LParenLoc,
1814                                      SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1816                                               EndLoc);
1817   }
1818 
1819   /// Build a new OpenMP 'firstprivate' clause.
1820   ///
1821   /// By default, performs semantic analysis to build the new OpenMP clause.
1822   /// Subclasses may override this routine to provide different behavior.
1823   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1824                                           SourceLocation StartLoc,
1825                                           SourceLocation LParenLoc,
1826                                           SourceLocation EndLoc) {
1827     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1828                                                    EndLoc);
1829   }
1830 
1831   /// Build a new OpenMP 'lastprivate' clause.
1832   ///
1833   /// By default, performs semantic analysis to build the new OpenMP clause.
1834   /// Subclasses may override this routine to provide different behavior.
1835   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1836                                          OpenMPLastprivateModifier LPKind,
1837                                          SourceLocation LPKindLoc,
1838                                          SourceLocation ColonLoc,
1839                                          SourceLocation StartLoc,
1840                                          SourceLocation LParenLoc,
1841                                          SourceLocation EndLoc) {
1842     return getSema().ActOnOpenMPLastprivateClause(
1843         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1844   }
1845 
1846   /// Build a new OpenMP 'shared' clause.
1847   ///
1848   /// By default, performs semantic analysis to build the new OpenMP clause.
1849   /// Subclasses may override this routine to provide different behavior.
1850   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1851                                     SourceLocation StartLoc,
1852                                     SourceLocation LParenLoc,
1853                                     SourceLocation EndLoc) {
1854     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1855                                              EndLoc);
1856   }
1857 
1858   /// Build a new OpenMP 'reduction' clause.
1859   ///
1860   /// By default, performs semantic analysis to build the new statement.
1861   /// Subclasses may override this routine to provide different behavior.
1862   OMPClause *RebuildOMPReductionClause(
1863       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1864       SourceLocation StartLoc, SourceLocation LParenLoc,
1865       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1866       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1867       const DeclarationNameInfo &ReductionId,
1868       ArrayRef<Expr *> UnresolvedReductions) {
1869     return getSema().ActOnOpenMPReductionClause(
1870         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1871         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1872   }
1873 
1874   /// Build a new OpenMP 'task_reduction' clause.
1875   ///
1876   /// By default, performs semantic analysis to build the new statement.
1877   /// Subclasses may override this routine to provide different behavior.
1878   OMPClause *RebuildOMPTaskReductionClause(
1879       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1880       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1881       CXXScopeSpec &ReductionIdScopeSpec,
1882       const DeclarationNameInfo &ReductionId,
1883       ArrayRef<Expr *> UnresolvedReductions) {
1884     return getSema().ActOnOpenMPTaskReductionClause(
1885         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1886         ReductionId, UnresolvedReductions);
1887   }
1888 
1889   /// Build a new OpenMP 'in_reduction' clause.
1890   ///
1891   /// By default, performs semantic analysis to build the new statement.
1892   /// Subclasses may override this routine to provide different behavior.
1893   OMPClause *
1894   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1895                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1896                               SourceLocation EndLoc,
1897                               CXXScopeSpec &ReductionIdScopeSpec,
1898                               const DeclarationNameInfo &ReductionId,
1899                               ArrayRef<Expr *> UnresolvedReductions) {
1900     return getSema().ActOnOpenMPInReductionClause(
1901         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1902         ReductionId, UnresolvedReductions);
1903   }
1904 
1905   /// Build a new OpenMP 'linear' clause.
1906   ///
1907   /// By default, performs semantic analysis to build the new OpenMP clause.
1908   /// Subclasses may override this routine to provide different behavior.
1909   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1910                                     SourceLocation StartLoc,
1911                                     SourceLocation LParenLoc,
1912                                     OpenMPLinearClauseKind Modifier,
1913                                     SourceLocation ModifierLoc,
1914                                     SourceLocation ColonLoc,
1915                                     SourceLocation EndLoc) {
1916     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1917                                              Modifier, ModifierLoc, ColonLoc,
1918                                              EndLoc);
1919   }
1920 
1921   /// Build a new OpenMP 'aligned' clause.
1922   ///
1923   /// By default, performs semantic analysis to build the new OpenMP clause.
1924   /// Subclasses may override this routine to provide different behavior.
1925   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1926                                      SourceLocation StartLoc,
1927                                      SourceLocation LParenLoc,
1928                                      SourceLocation ColonLoc,
1929                                      SourceLocation EndLoc) {
1930     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1931                                               LParenLoc, ColonLoc, EndLoc);
1932   }
1933 
1934   /// Build a new OpenMP 'copyin' clause.
1935   ///
1936   /// By default, performs semantic analysis to build the new OpenMP clause.
1937   /// Subclasses may override this routine to provide different behavior.
1938   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1939                                     SourceLocation StartLoc,
1940                                     SourceLocation LParenLoc,
1941                                     SourceLocation EndLoc) {
1942     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1943                                              EndLoc);
1944   }
1945 
1946   /// Build a new OpenMP 'copyprivate' clause.
1947   ///
1948   /// By default, performs semantic analysis to build the new OpenMP clause.
1949   /// Subclasses may override this routine to provide different behavior.
1950   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1951                                          SourceLocation StartLoc,
1952                                          SourceLocation LParenLoc,
1953                                          SourceLocation EndLoc) {
1954     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1955                                                   EndLoc);
1956   }
1957 
1958   /// Build a new OpenMP 'flush' pseudo clause.
1959   ///
1960   /// By default, performs semantic analysis to build the new OpenMP clause.
1961   /// Subclasses may override this routine to provide different behavior.
1962   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1963                                    SourceLocation StartLoc,
1964                                    SourceLocation LParenLoc,
1965                                    SourceLocation EndLoc) {
1966     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1967                                             EndLoc);
1968   }
1969 
1970   /// Build a new OpenMP 'depobj' pseudo clause.
1971   ///
1972   /// By default, performs semantic analysis to build the new OpenMP clause.
1973   /// Subclasses may override this routine to provide different behavior.
1974   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1975                                     SourceLocation LParenLoc,
1976                                     SourceLocation EndLoc) {
1977     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1978                                              EndLoc);
1979   }
1980 
1981   /// Build a new OpenMP 'depend' pseudo clause.
1982   ///
1983   /// By default, performs semantic analysis to build the new OpenMP clause.
1984   /// Subclasses may override this routine to provide different behavior.
1985   OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data,
1986                                     Expr *DepModifier, ArrayRef<Expr *> VarList,
1987                                     SourceLocation StartLoc,
1988                                     SourceLocation LParenLoc,
1989                                     SourceLocation EndLoc) {
1990     return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList,
1991                                              StartLoc, LParenLoc, EndLoc);
1992   }
1993 
1994   /// Build a new OpenMP 'device' clause.
1995   ///
1996   /// By default, performs semantic analysis to build the new statement.
1997   /// Subclasses may override this routine to provide different behavior.
1998   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1999                                     Expr *Device, SourceLocation StartLoc,
2000                                     SourceLocation LParenLoc,
2001                                     SourceLocation ModifierLoc,
2002                                     SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
2004                                              LParenLoc, ModifierLoc, EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'map' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new OpenMP clause.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPMapClause(
2012       Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
2013       ArrayRef<SourceLocation> MapTypeModifiersLoc,
2014       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
2015       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
2016       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
2017       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
2018     return getSema().ActOnOpenMPMapClause(
2019         IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
2020         MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
2021         ColonLoc, VarList, Locs,
2022         /*NoDiagnose=*/false, UnresolvedMappers);
2023   }
2024 
2025   /// Build a new OpenMP 'allocate' clause.
2026   ///
2027   /// By default, performs semantic analysis to build the new OpenMP clause.
2028   /// Subclasses may override this routine to provide different behavior.
2029   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
2030                                       SourceLocation StartLoc,
2031                                       SourceLocation LParenLoc,
2032                                       SourceLocation ColonLoc,
2033                                       SourceLocation EndLoc) {
2034     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
2035                                                LParenLoc, ColonLoc, EndLoc);
2036   }
2037 
2038   /// Build a new OpenMP 'num_teams' clause.
2039   ///
2040   /// By default, performs semantic analysis to build the new statement.
2041   /// Subclasses may override this routine to provide different behavior.
2042   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
2043                                       SourceLocation LParenLoc,
2044                                       SourceLocation EndLoc) {
2045     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
2046                                                EndLoc);
2047   }
2048 
2049   /// Build a new OpenMP 'thread_limit' clause.
2050   ///
2051   /// By default, performs semantic analysis to build the new statement.
2052   /// Subclasses may override this routine to provide different behavior.
2053   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
2054                                          SourceLocation StartLoc,
2055                                          SourceLocation LParenLoc,
2056                                          SourceLocation EndLoc) {
2057     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
2058                                                   LParenLoc, EndLoc);
2059   }
2060 
2061   /// Build a new OpenMP 'priority' clause.
2062   ///
2063   /// By default, performs semantic analysis to build the new statement.
2064   /// Subclasses may override this routine to provide different behavior.
2065   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
2066                                       SourceLocation LParenLoc,
2067                                       SourceLocation EndLoc) {
2068     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
2069                                                EndLoc);
2070   }
2071 
2072   /// Build a new OpenMP 'grainsize' clause.
2073   ///
2074   /// By default, performs semantic analysis to build the new statement.
2075   /// Subclasses may override this routine to provide different behavior.
2076   OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
2077                                        Expr *Device, SourceLocation StartLoc,
2078                                        SourceLocation LParenLoc,
2079                                        SourceLocation ModifierLoc,
2080                                        SourceLocation EndLoc) {
2081     return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc,
2082                                                 LParenLoc, ModifierLoc, EndLoc);
2083   }
2084 
2085   /// Build a new OpenMP 'num_tasks' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new statement.
2088   /// Subclasses may override this routine to provide different behavior.
2089   OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
2090                                       Expr *NumTasks, SourceLocation StartLoc,
2091                                       SourceLocation LParenLoc,
2092                                       SourceLocation ModifierLoc,
2093                                       SourceLocation EndLoc) {
2094     return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc,
2095                                                LParenLoc, ModifierLoc, EndLoc);
2096   }
2097 
2098   /// Build a new OpenMP 'hint' clause.
2099   ///
2100   /// By default, performs semantic analysis to build the new statement.
2101   /// Subclasses may override this routine to provide different behavior.
2102   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2103                                   SourceLocation LParenLoc,
2104                                   SourceLocation EndLoc) {
2105     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2106   }
2107 
2108   /// Build a new OpenMP 'detach' clause.
2109   ///
2110   /// By default, performs semantic analysis to build the new statement.
2111   /// Subclasses may override this routine to provide different behavior.
2112   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2113                                     SourceLocation LParenLoc,
2114                                     SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2116   }
2117 
2118   /// Build a new OpenMP 'dist_schedule' clause.
2119   ///
2120   /// By default, performs semantic analysis to build the new OpenMP clause.
2121   /// Subclasses may override this routine to provide different behavior.
2122   OMPClause *
2123   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2124                                Expr *ChunkSize, SourceLocation StartLoc,
2125                                SourceLocation LParenLoc, SourceLocation KindLoc,
2126                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPDistScheduleClause(
2128         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2129   }
2130 
2131   /// Build a new OpenMP 'to' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new statement.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *
2136   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2137                      ArrayRef<SourceLocation> MotionModifiersLoc,
2138                      CXXScopeSpec &MapperIdScopeSpec,
2139                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2140                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2141                      ArrayRef<Expr *> UnresolvedMappers) {
2142     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2143                                          MapperIdScopeSpec, MapperId, ColonLoc,
2144                                          VarList, Locs, UnresolvedMappers);
2145   }
2146 
2147   /// Build a new OpenMP 'from' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new statement.
2150   /// Subclasses may override this routine to provide different behavior.
2151   OMPClause *
2152   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2153                        ArrayRef<SourceLocation> MotionModifiersLoc,
2154                        CXXScopeSpec &MapperIdScopeSpec,
2155                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2156                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2157                        ArrayRef<Expr *> UnresolvedMappers) {
2158     return getSema().ActOnOpenMPFromClause(
2159         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2160         ColonLoc, VarList, Locs, UnresolvedMappers);
2161   }
2162 
2163   /// Build a new OpenMP 'use_device_ptr' clause.
2164   ///
2165   /// By default, performs semantic analysis to build the new OpenMP clause.
2166   /// Subclasses may override this routine to provide different behavior.
2167   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2168                                           const OMPVarListLocTy &Locs) {
2169     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2170   }
2171 
2172   /// Build a new OpenMP 'use_device_addr' clause.
2173   ///
2174   /// By default, performs semantic analysis to build the new OpenMP clause.
2175   /// Subclasses may override this routine to provide different behavior.
2176   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2177                                            const OMPVarListLocTy &Locs) {
2178     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2179   }
2180 
2181   /// Build a new OpenMP 'is_device_ptr' clause.
2182   ///
2183   /// By default, performs semantic analysis to build the new OpenMP clause.
2184   /// Subclasses may override this routine to provide different behavior.
2185   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2186                                          const OMPVarListLocTy &Locs) {
2187     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2188   }
2189 
2190   /// Build a new OpenMP 'has_device_addr' clause.
2191   ///
2192   /// By default, performs semantic analysis to build the new OpenMP clause.
2193   /// Subclasses may override this routine to provide different behavior.
2194   OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2195                                            const OMPVarListLocTy &Locs) {
2196     return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2197   }
2198 
2199   /// Build a new OpenMP 'defaultmap' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
2203   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2204                                         OpenMPDefaultmapClauseKind Kind,
2205                                         SourceLocation StartLoc,
2206                                         SourceLocation LParenLoc,
2207                                         SourceLocation MLoc,
2208                                         SourceLocation KindLoc,
2209                                         SourceLocation EndLoc) {
2210     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2211                                                  MLoc, KindLoc, EndLoc);
2212   }
2213 
2214   /// Build a new OpenMP 'nontemporal' clause.
2215   ///
2216   /// By default, performs semantic analysis to build the new OpenMP clause.
2217   /// Subclasses may override this routine to provide different behavior.
2218   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2219                                          SourceLocation StartLoc,
2220                                          SourceLocation LParenLoc,
2221                                          SourceLocation EndLoc) {
2222     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2223                                                   EndLoc);
2224   }
2225 
2226   /// Build a new OpenMP 'inclusive' clause.
2227   ///
2228   /// By default, performs semantic analysis to build the new OpenMP clause.
2229   /// Subclasses may override this routine to provide different behavior.
2230   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2231                                        SourceLocation StartLoc,
2232                                        SourceLocation LParenLoc,
2233                                        SourceLocation EndLoc) {
2234     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2235                                                 EndLoc);
2236   }
2237 
2238   /// Build a new OpenMP 'exclusive' clause.
2239   ///
2240   /// By default, performs semantic analysis to build the new OpenMP clause.
2241   /// Subclasses may override this routine to provide different behavior.
2242   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2243                                        SourceLocation StartLoc,
2244                                        SourceLocation LParenLoc,
2245                                        SourceLocation EndLoc) {
2246     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2247                                                 EndLoc);
2248   }
2249 
2250   /// Build a new OpenMP 'uses_allocators' clause.
2251   ///
2252   /// By default, performs semantic analysis to build the new OpenMP clause.
2253   /// Subclasses may override this routine to provide different behavior.
2254   OMPClause *RebuildOMPUsesAllocatorsClause(
2255       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2256       SourceLocation LParenLoc, SourceLocation EndLoc) {
2257     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2258                                                     Data);
2259   }
2260 
2261   /// Build a new OpenMP 'affinity' clause.
2262   ///
2263   /// By default, performs semantic analysis to build the new OpenMP clause.
2264   /// Subclasses may override this routine to provide different behavior.
2265   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2266                                       SourceLocation LParenLoc,
2267                                       SourceLocation ColonLoc,
2268                                       SourceLocation EndLoc, Expr *Modifier,
2269                                       ArrayRef<Expr *> Locators) {
2270     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2271                                                EndLoc, Modifier, Locators);
2272   }
2273 
2274   /// Build a new OpenMP 'order' clause.
2275   ///
2276   /// By default, performs semantic analysis to build the new OpenMP clause.
2277   /// Subclasses may override this routine to provide different behavior.
2278   OMPClause *RebuildOMPOrderClause(
2279       OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc,
2280       SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc,
2281       OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) {
2282     return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc,
2283                                             ModifierKwLoc, KindKwLoc, EndLoc);
2284   }
2285 
2286   /// Build a new OpenMP 'init' clause.
2287   ///
2288   /// By default, performs semantic analysis to build the new OpenMP clause.
2289   /// Subclasses may override this routine to provide different behavior.
2290   OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
2291                                   SourceLocation StartLoc,
2292                                   SourceLocation LParenLoc,
2293                                   SourceLocation VarLoc,
2294                                   SourceLocation EndLoc) {
2295     return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc,
2296                                            LParenLoc, VarLoc, EndLoc);
2297   }
2298 
2299   /// Build a new OpenMP 'use' clause.
2300   ///
2301   /// By default, performs semantic analysis to build the new OpenMP clause.
2302   /// Subclasses may override this routine to provide different behavior.
2303   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2304                                  SourceLocation LParenLoc,
2305                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2306     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2307                                           VarLoc, EndLoc);
2308   }
2309 
2310   /// Build a new OpenMP 'destroy' clause.
2311   ///
2312   /// By default, performs semantic analysis to build the new OpenMP clause.
2313   /// Subclasses may override this routine to provide different behavior.
2314   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2315                                      SourceLocation LParenLoc,
2316                                      SourceLocation VarLoc,
2317                                      SourceLocation EndLoc) {
2318     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2319                                               VarLoc, EndLoc);
2320   }
2321 
2322   /// Build a new OpenMP 'novariants' clause.
2323   ///
2324   /// By default, performs semantic analysis to build the new OpenMP clause.
2325   /// Subclasses may override this routine to provide different behavior.
2326   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2327                                         SourceLocation StartLoc,
2328                                         SourceLocation LParenLoc,
2329                                         SourceLocation EndLoc) {
2330     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2331                                                  EndLoc);
2332   }
2333 
2334   /// Build a new OpenMP 'nocontext' clause.
2335   ///
2336   /// By default, performs semantic analysis to build the new OpenMP clause.
2337   /// Subclasses may override this routine to provide different behavior.
2338   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2339                                        SourceLocation LParenLoc,
2340                                        SourceLocation EndLoc) {
2341     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2342                                                 EndLoc);
2343   }
2344 
2345   /// Build a new OpenMP 'filter' clause.
2346   ///
2347   /// By default, performs semantic analysis to build the new OpenMP clause.
2348   /// Subclasses may override this routine to provide different behavior.
2349   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2350                                     SourceLocation LParenLoc,
2351                                     SourceLocation EndLoc) {
2352     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2353                                              EndLoc);
2354   }
2355 
2356   /// Build a new OpenMP 'bind' clause.
2357   ///
2358   /// By default, performs semantic analysis to build the new OpenMP clause.
2359   /// Subclasses may override this routine to provide different behavior.
2360   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2361                                   SourceLocation KindLoc,
2362                                   SourceLocation StartLoc,
2363                                   SourceLocation LParenLoc,
2364                                   SourceLocation EndLoc) {
2365     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2366                                            EndLoc);
2367   }
2368 
2369   /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause.
2370   ///
2371   /// By default, performs semantic analysis to build the new OpenMP clause.
2372   /// Subclasses may override this routine to provide different behavior.
2373   OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
2374                                            SourceLocation LParenLoc,
2375                                            SourceLocation EndLoc) {
2376     return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc,
2377                                                     EndLoc);
2378   }
2379 
2380   /// Build a new OpenMP 'align' clause.
2381   ///
2382   /// By default, performs semantic analysis to build the new OpenMP clause.
2383   /// Subclasses may override this routine to provide different behavior.
2384   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2385                                    SourceLocation LParenLoc,
2386                                    SourceLocation EndLoc) {
2387     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2388   }
2389 
2390   /// Build a new OpenMP 'at' clause.
2391   ///
2392   /// By default, performs semantic analysis to build the new OpenMP clause.
2393   /// Subclasses may override this routine to provide different behavior.
2394   OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc,
2395                                 SourceLocation StartLoc,
2396                                 SourceLocation LParenLoc,
2397                                 SourceLocation EndLoc) {
2398     return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc,
2399                                          EndLoc);
2400   }
2401 
2402   /// Build a new OpenMP 'severity' clause.
2403   ///
2404   /// By default, performs semantic analysis to build the new OpenMP clause.
2405   /// Subclasses may override this routine to provide different behavior.
2406   OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,
2407                                       SourceLocation KwLoc,
2408                                       SourceLocation StartLoc,
2409                                       SourceLocation LParenLoc,
2410                                       SourceLocation EndLoc) {
2411     return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc,
2412                                                EndLoc);
2413   }
2414 
2415   /// Build a new OpenMP 'message' clause.
2416   ///
2417   /// By default, performs semantic analysis to build the new OpenMP clause.
2418   /// Subclasses may override this routine to provide different behavior.
2419   OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc,
2420                                      SourceLocation LParenLoc,
2421                                      SourceLocation EndLoc) {
2422     return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc);
2423   }
2424 
2425   /// Build a new OpenMP 'doacross' 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 *
2430   RebuildOMPDoacrossClause(OpenMPDoacrossClauseModifier DepType,
2431                            SourceLocation DepLoc, SourceLocation ColonLoc,
2432                            ArrayRef<Expr *> VarList, SourceLocation StartLoc,
2433                            SourceLocation LParenLoc, SourceLocation EndLoc) {
2434     return getSema().ActOnOpenMPDoacrossClause(
2435         DepType, DepLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
2436   }
2437 
2438   /// Rebuild the operand to an Objective-C \@synchronized statement.
2439   ///
2440   /// By default, performs semantic analysis to build the new statement.
2441   /// Subclasses may override this routine to provide different behavior.
2442   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2443                                               Expr *object) {
2444     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2445   }
2446 
2447   /// Build a new Objective-C \@synchronized statement.
2448   ///
2449   /// By default, performs semantic analysis to build the new statement.
2450   /// Subclasses may override this routine to provide different behavior.
2451   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2452                                            Expr *Object, Stmt *Body) {
2453     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2454   }
2455 
2456   /// Build a new Objective-C \@autoreleasepool statement.
2457   ///
2458   /// By default, performs semantic analysis to build the new statement.
2459   /// Subclasses may override this routine to provide different behavior.
2460   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2461                                             Stmt *Body) {
2462     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2463   }
2464 
2465   /// Build a new Objective-C fast enumeration statement.
2466   ///
2467   /// By default, performs semantic analysis to build the new statement.
2468   /// Subclasses may override this routine to provide different behavior.
2469   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2470                                           Stmt *Element,
2471                                           Expr *Collection,
2472                                           SourceLocation RParenLoc,
2473                                           Stmt *Body) {
2474     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2475                                                 Element,
2476                                                 Collection,
2477                                                 RParenLoc);
2478     if (ForEachStmt.isInvalid())
2479       return StmtError();
2480 
2481     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2482   }
2483 
2484   /// Build a new C++ exception declaration.
2485   ///
2486   /// By default, performs semantic analysis to build the new decaration.
2487   /// Subclasses may override this routine to provide different behavior.
2488   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2489                                 TypeSourceInfo *Declarator,
2490                                 SourceLocation StartLoc,
2491                                 SourceLocation IdLoc,
2492                                 IdentifierInfo *Id) {
2493     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2494                                                        StartLoc, IdLoc, Id);
2495     if (Var)
2496       getSema().CurContext->addDecl(Var);
2497     return Var;
2498   }
2499 
2500   /// Build a new C++ catch statement.
2501   ///
2502   /// By default, performs semantic analysis to build the new statement.
2503   /// Subclasses may override this routine to provide different behavior.
2504   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2505                                  VarDecl *ExceptionDecl,
2506                                  Stmt *Handler) {
2507     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2508                                                       Handler));
2509   }
2510 
2511   /// Build a new C++ try statement.
2512   ///
2513   /// By default, performs semantic analysis to build the new statement.
2514   /// Subclasses may override this routine to provide different behavior.
2515   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2516                                ArrayRef<Stmt *> Handlers) {
2517     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2518   }
2519 
2520   /// Build a new C++0x range-based for statement.
2521   ///
2522   /// By default, performs semantic analysis to build the new statement.
2523   /// Subclasses may override this routine to provide different behavior.
2524   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2525                                     SourceLocation CoawaitLoc, Stmt *Init,
2526                                     SourceLocation ColonLoc, Stmt *Range,
2527                                     Stmt *Begin, Stmt *End, Expr *Cond,
2528                                     Expr *Inc, Stmt *LoopVar,
2529                                     SourceLocation RParenLoc) {
2530     // If we've just learned that the range is actually an Objective-C
2531     // collection, treat this as an Objective-C fast enumeration loop.
2532     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2533       if (RangeStmt->isSingleDecl()) {
2534         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2535           if (RangeVar->isInvalidDecl())
2536             return StmtError();
2537 
2538           Expr *RangeExpr = RangeVar->getInit();
2539           if (!RangeExpr->isTypeDependent() &&
2540               RangeExpr->getType()->isObjCObjectPointerType()) {
2541             // FIXME: Support init-statements in Objective-C++20 ranged for
2542             // statement.
2543             if (Init) {
2544               return SemaRef.Diag(Init->getBeginLoc(),
2545                                   diag::err_objc_for_range_init_stmt)
2546                          << Init->getSourceRange();
2547             }
2548             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2549                                                         RangeExpr, RParenLoc);
2550           }
2551         }
2552       }
2553     }
2554 
2555     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2556                                           Range, Begin, End, Cond, Inc, LoopVar,
2557                                           RParenLoc, Sema::BFRK_Rebuild);
2558   }
2559 
2560   /// Build a new C++0x range-based for statement.
2561   ///
2562   /// By default, performs semantic analysis to build the new statement.
2563   /// Subclasses may override this routine to provide different behavior.
2564   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2565                                           bool IsIfExists,
2566                                           NestedNameSpecifierLoc QualifierLoc,
2567                                           DeclarationNameInfo NameInfo,
2568                                           Stmt *Nested) {
2569     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2570                                                 QualifierLoc, NameInfo, Nested);
2571   }
2572 
2573   /// Attach body to a C++0x range-based for statement.
2574   ///
2575   /// By default, performs semantic analysis to finish the new statement.
2576   /// Subclasses may override this routine to provide different behavior.
2577   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2578     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2579   }
2580 
2581   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2582                                Stmt *TryBlock, Stmt *Handler) {
2583     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2584   }
2585 
2586   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2587                                   Stmt *Block) {
2588     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2589   }
2590 
2591   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2592     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2593   }
2594 
2595   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2596                                              SourceLocation LParen,
2597                                              SourceLocation RParen,
2598                                              TypeSourceInfo *TSI) {
2599     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2600   }
2601 
2602   /// Build a new predefined expression.
2603   ///
2604   /// By default, performs semantic analysis to build the new expression.
2605   /// Subclasses may override this routine to provide different behavior.
2606   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2607                                    PredefinedExpr::IdentKind IK) {
2608     return getSema().BuildPredefinedExpr(Loc, IK);
2609   }
2610 
2611   /// Build a new expression that references a declaration.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2616                                         LookupResult &R,
2617                                         bool RequiresADL) {
2618     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2619   }
2620 
2621 
2622   /// Build a new expression that references a declaration.
2623   ///
2624   /// By default, performs semantic analysis to build the new expression.
2625   /// Subclasses may override this routine to provide different behavior.
2626   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2627                                 ValueDecl *VD,
2628                                 const DeclarationNameInfo &NameInfo,
2629                                 NamedDecl *Found,
2630                                 TemplateArgumentListInfo *TemplateArgs) {
2631     CXXScopeSpec SS;
2632     SS.Adopt(QualifierLoc);
2633     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2634                                               TemplateArgs);
2635   }
2636 
2637   /// Build a new expression in parentheses.
2638   ///
2639   /// By default, performs semantic analysis to build the new expression.
2640   /// Subclasses may override this routine to provide different behavior.
2641   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2642                                     SourceLocation RParen) {
2643     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2644   }
2645 
2646   /// Build a new pseudo-destructor expression.
2647   ///
2648   /// By default, performs semantic analysis to build the new expression.
2649   /// Subclasses may override this routine to provide different behavior.
2650   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2651                                             SourceLocation OperatorLoc,
2652                                             bool isArrow,
2653                                             CXXScopeSpec &SS,
2654                                             TypeSourceInfo *ScopeType,
2655                                             SourceLocation CCLoc,
2656                                             SourceLocation TildeLoc,
2657                                         PseudoDestructorTypeStorage Destroyed);
2658 
2659   /// Build a new unary operator expression.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// Subclasses may override this routine to provide different behavior.
2663   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2664                                         UnaryOperatorKind Opc,
2665                                         Expr *SubExpr) {
2666     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2667   }
2668 
2669   /// Build a new builtin offsetof expression.
2670   ///
2671   /// By default, performs semantic analysis to build the new expression.
2672   /// Subclasses may override this routine to provide different behavior.
2673   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2674                                  TypeSourceInfo *Type,
2675                                  ArrayRef<Sema::OffsetOfComponent> Components,
2676                                  SourceLocation RParenLoc) {
2677     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2678                                           RParenLoc);
2679   }
2680 
2681   /// Build a new sizeof, alignof or vec_step expression with a
2682   /// type argument.
2683   ///
2684   /// By default, performs semantic analysis to build the new expression.
2685   /// Subclasses may override this routine to provide different behavior.
2686   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2687                                          SourceLocation OpLoc,
2688                                          UnaryExprOrTypeTrait ExprKind,
2689                                          SourceRange R) {
2690     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2691   }
2692 
2693   /// Build a new sizeof, alignof or vec step expression with an
2694   /// expression argument.
2695   ///
2696   /// By default, performs semantic analysis to build the new expression.
2697   /// Subclasses may override this routine to provide different behavior.
2698   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2699                                          UnaryExprOrTypeTrait ExprKind,
2700                                          SourceRange R) {
2701     ExprResult Result
2702       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2703     if (Result.isInvalid())
2704       return ExprError();
2705 
2706     return Result;
2707   }
2708 
2709   /// Build a new array subscript expression.
2710   ///
2711   /// By default, performs semantic analysis to build the new expression.
2712   /// Subclasses may override this routine to provide different behavior.
2713   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2714                                              SourceLocation LBracketLoc,
2715                                              Expr *RHS,
2716                                              SourceLocation RBracketLoc) {
2717     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2718                                              LBracketLoc, RHS,
2719                                              RBracketLoc);
2720   }
2721 
2722   /// Build a new matrix subscript expression.
2723   ///
2724   /// By default, performs semantic analysis to build the new expression.
2725   /// Subclasses may override this routine to provide different behavior.
2726   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2727                                         Expr *ColumnIdx,
2728                                         SourceLocation RBracketLoc) {
2729     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2730                                                       RBracketLoc);
2731   }
2732 
2733   /// Build a new array section expression.
2734   ///
2735   /// By default, performs semantic analysis to build the new expression.
2736   /// Subclasses may override this routine to provide different behavior.
2737   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2738                                         Expr *LowerBound,
2739                                         SourceLocation ColonLocFirst,
2740                                         SourceLocation ColonLocSecond,
2741                                         Expr *Length, Expr *Stride,
2742                                         SourceLocation RBracketLoc) {
2743     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2744                                               ColonLocFirst, ColonLocSecond,
2745                                               Length, Stride, RBracketLoc);
2746   }
2747 
2748   /// Build a new array shaping expression.
2749   ///
2750   /// By default, performs semantic analysis to build the new expression.
2751   /// Subclasses may override this routine to provide different behavior.
2752   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2753                                         SourceLocation RParenLoc,
2754                                         ArrayRef<Expr *> Dims,
2755                                         ArrayRef<SourceRange> BracketsRanges) {
2756     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2757                                               BracketsRanges);
2758   }
2759 
2760   /// Build a new iterator expression.
2761   ///
2762   /// By default, performs semantic analysis to build the new expression.
2763   /// Subclasses may override this routine to provide different behavior.
2764   ExprResult RebuildOMPIteratorExpr(
2765       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2766       ArrayRef<Sema::OMPIteratorData> Data) {
2767     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2768                                           LLoc, RLoc, Data);
2769   }
2770 
2771   /// Build a new call expression.
2772   ///
2773   /// By default, performs semantic analysis to build the new expression.
2774   /// Subclasses may override this routine to provide different behavior.
2775   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2776                                    MultiExprArg Args,
2777                                    SourceLocation RParenLoc,
2778                                    Expr *ExecConfig = nullptr) {
2779     return getSema().ActOnCallExpr(
2780         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2781   }
2782 
2783   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2784                                      MultiExprArg Args,
2785                                      SourceLocation RParenLoc) {
2786     return getSema().ActOnArraySubscriptExpr(
2787         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2788   }
2789 
2790   /// Build a new member access expression.
2791   ///
2792   /// By default, performs semantic analysis to build the new expression.
2793   /// Subclasses may override this routine to provide different behavior.
2794   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2795                                bool isArrow,
2796                                NestedNameSpecifierLoc QualifierLoc,
2797                                SourceLocation TemplateKWLoc,
2798                                const DeclarationNameInfo &MemberNameInfo,
2799                                ValueDecl *Member,
2800                                NamedDecl *FoundDecl,
2801                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2802                                NamedDecl *FirstQualifierInScope) {
2803     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2804                                                                       isArrow);
2805     if (!Member->getDeclName()) {
2806       // We have a reference to an unnamed field.  This is always the
2807       // base of an anonymous struct/union member access, i.e. the
2808       // field is always of record type.
2809       assert(Member->getType()->isRecordType() &&
2810              "unnamed member not of record type?");
2811 
2812       BaseResult =
2813         getSema().PerformObjectMemberConversion(BaseResult.get(),
2814                                                 QualifierLoc.getNestedNameSpecifier(),
2815                                                 FoundDecl, Member);
2816       if (BaseResult.isInvalid())
2817         return ExprError();
2818       Base = BaseResult.get();
2819 
2820       CXXScopeSpec EmptySS;
2821       return getSema().BuildFieldReferenceExpr(
2822           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2823           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2824     }
2825 
2826     CXXScopeSpec SS;
2827     SS.Adopt(QualifierLoc);
2828 
2829     Base = BaseResult.get();
2830     QualType BaseType = Base->getType();
2831 
2832     if (isArrow && !BaseType->isPointerType())
2833       return ExprError();
2834 
2835     // FIXME: this involves duplicating earlier analysis in a lot of
2836     // cases; we should avoid this when possible.
2837     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2838     R.addDecl(FoundDecl);
2839     R.resolveKind();
2840 
2841     if (getSema().isUnevaluatedContext() && Base->isImplicitCXXThis() &&
2842         isa<FieldDecl, IndirectFieldDecl, MSPropertyDecl>(Member)) {
2843       if (auto *ThisClass = cast<CXXThisExpr>(Base)
2844                                 ->getType()
2845                                 ->getPointeeType()
2846                                 ->getAsCXXRecordDecl()) {
2847         auto *Class = cast<CXXRecordDecl>(Member->getDeclContext());
2848         // In unevaluated contexts, an expression supposed to be a member access
2849         // might reference a member in an unrelated class.
2850         if (!ThisClass->Equals(Class) && !ThisClass->isDerivedFrom(Class))
2851           return getSema().BuildDeclRefExpr(Member, Member->getType(),
2852                                             VK_LValue, Member->getLocation());
2853       }
2854     }
2855 
2856     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2857                                               SS, TemplateKWLoc,
2858                                               FirstQualifierInScope,
2859                                               R, ExplicitTemplateArgs,
2860                                               /*S*/nullptr);
2861   }
2862 
2863   /// Build a new binary operator expression.
2864   ///
2865   /// By default, performs semantic analysis to build the new expression.
2866   /// Subclasses may override this routine to provide different behavior.
2867   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2868                                          BinaryOperatorKind Opc,
2869                                          Expr *LHS, Expr *RHS) {
2870     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2871   }
2872 
2873   /// Build a new rewritten operator expression.
2874   ///
2875   /// By default, performs semantic analysis to build the new expression.
2876   /// Subclasses may override this routine to provide different behavior.
2877   ExprResult RebuildCXXRewrittenBinaryOperator(
2878       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2879       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2880     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2881                                            RHS, /*RequiresADL*/false);
2882   }
2883 
2884   /// Build a new conditional operator expression.
2885   ///
2886   /// By default, performs semantic analysis to build the new expression.
2887   /// Subclasses may override this routine to provide different behavior.
2888   ExprResult RebuildConditionalOperator(Expr *Cond,
2889                                         SourceLocation QuestionLoc,
2890                                         Expr *LHS,
2891                                         SourceLocation ColonLoc,
2892                                         Expr *RHS) {
2893     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2894                                         LHS, RHS);
2895   }
2896 
2897   /// Build a new C-style cast expression.
2898   ///
2899   /// By default, performs semantic analysis to build the new expression.
2900   /// Subclasses may override this routine to provide different behavior.
2901   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2902                                          TypeSourceInfo *TInfo,
2903                                          SourceLocation RParenLoc,
2904                                          Expr *SubExpr) {
2905     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2906                                          SubExpr);
2907   }
2908 
2909   /// Build a new compound literal expression.
2910   ///
2911   /// By default, performs semantic analysis to build the new expression.
2912   /// Subclasses may override this routine to provide different behavior.
2913   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2914                                               TypeSourceInfo *TInfo,
2915                                               SourceLocation RParenLoc,
2916                                               Expr *Init) {
2917     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2918                                               Init);
2919   }
2920 
2921   /// Build a new extended vector element access expression.
2922   ///
2923   /// By default, performs semantic analysis to build the new expression.
2924   /// Subclasses may override this routine to provide different behavior.
2925   ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
2926                                          bool IsArrow,
2927                                          SourceLocation AccessorLoc,
2928                                          IdentifierInfo &Accessor) {
2929 
2930     CXXScopeSpec SS;
2931     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2932     return getSema().BuildMemberReferenceExpr(
2933         Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
2934         /*FirstQualifierInScope*/ nullptr, NameInfo,
2935         /* TemplateArgs */ nullptr,
2936         /*S*/ nullptr);
2937   }
2938 
2939   /// Build a new initializer list expression.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2944                              MultiExprArg Inits,
2945                              SourceLocation RBraceLoc) {
2946     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2947   }
2948 
2949   /// Build a new designated initializer expression.
2950   ///
2951   /// By default, performs semantic analysis to build the new expression.
2952   /// Subclasses may override this routine to provide different behavior.
2953   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2954                                              MultiExprArg ArrayExprs,
2955                                              SourceLocation EqualOrColonLoc,
2956                                              bool GNUSyntax,
2957                                              Expr *Init) {
2958     ExprResult Result
2959       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2960                                            Init);
2961     if (Result.isInvalid())
2962       return ExprError();
2963 
2964     return Result;
2965   }
2966 
2967   /// Build a new value-initialized expression.
2968   ///
2969   /// By default, builds the implicit value initialization without performing
2970   /// any semantic analysis. Subclasses may override this routine to provide
2971   /// different behavior.
2972   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2973     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2974   }
2975 
2976   /// Build a new \c va_arg expression.
2977   ///
2978   /// By default, performs semantic analysis to build the new expression.
2979   /// Subclasses may override this routine to provide different behavior.
2980   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2981                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2982                                     SourceLocation RParenLoc) {
2983     return getSema().BuildVAArgExpr(BuiltinLoc,
2984                                     SubExpr, TInfo,
2985                                     RParenLoc);
2986   }
2987 
2988   /// Build a new expression list in parentheses.
2989   ///
2990   /// By default, performs semantic analysis to build the new expression.
2991   /// Subclasses may override this routine to provide different behavior.
2992   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2993                                   MultiExprArg SubExprs,
2994                                   SourceLocation RParenLoc) {
2995     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2996   }
2997 
2998   /// Build a new address-of-label expression.
2999   ///
3000   /// By default, performs semantic analysis, using the name of the label
3001   /// rather than attempting to map the label statement itself.
3002   /// Subclasses may override this routine to provide different behavior.
3003   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
3004                                   SourceLocation LabelLoc, LabelDecl *Label) {
3005     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
3006   }
3007 
3008   /// Build a new GNU statement expression.
3009   ///
3010   /// By default, performs semantic analysis to build the new expression.
3011   /// Subclasses may override this routine to provide different behavior.
3012   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
3013                              SourceLocation RParenLoc, unsigned TemplateDepth) {
3014     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
3015                                    TemplateDepth);
3016   }
3017 
3018   /// Build a new __builtin_choose_expr expression.
3019   ///
3020   /// By default, performs semantic analysis to build the new expression.
3021   /// Subclasses may override this routine to provide different behavior.
3022   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
3023                                      Expr *Cond, Expr *LHS, Expr *RHS,
3024                                      SourceLocation RParenLoc) {
3025     return SemaRef.ActOnChooseExpr(BuiltinLoc,
3026                                    Cond, LHS, RHS,
3027                                    RParenLoc);
3028   }
3029 
3030   /// Build a new generic selection expression with an expression predicate.
3031   ///
3032   /// By default, performs semantic analysis to build the new expression.
3033   /// Subclasses may override this routine to provide different behavior.
3034   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3035                                          SourceLocation DefaultLoc,
3036                                          SourceLocation RParenLoc,
3037                                          Expr *ControllingExpr,
3038                                          ArrayRef<TypeSourceInfo *> Types,
3039                                          ArrayRef<Expr *> Exprs) {
3040     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3041                                                 /*PredicateIsExpr=*/true,
3042                                                 ControllingExpr, Types, Exprs);
3043   }
3044 
3045   /// Build a new generic selection expression with a type predicate.
3046   ///
3047   /// By default, performs semantic analysis to build the new expression.
3048   /// Subclasses may override this routine to provide different behavior.
3049   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
3050                                          SourceLocation DefaultLoc,
3051                                          SourceLocation RParenLoc,
3052                                          TypeSourceInfo *ControllingType,
3053                                          ArrayRef<TypeSourceInfo *> Types,
3054                                          ArrayRef<Expr *> Exprs) {
3055     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
3056                                                 /*PredicateIsExpr=*/false,
3057                                                 ControllingType, Types, Exprs);
3058   }
3059 
3060   /// Build a new overloaded operator call expression.
3061   ///
3062   /// By default, performs semantic analysis to build the new expression.
3063   /// The semantic analysis provides the behavior of template instantiation,
3064   /// copying with transformations that turn what looks like an overloaded
3065   /// operator call into a use of a builtin operator, performing
3066   /// argument-dependent lookup, etc. Subclasses may override this routine to
3067   /// provide different behavior.
3068   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3069                                         SourceLocation OpLoc,
3070                                         SourceLocation CalleeLoc,
3071                                         bool RequiresADL,
3072                                         const UnresolvedSetImpl &Functions,
3073                                         Expr *First, Expr *Second);
3074 
3075   /// Build a new C++ "named" cast expression, such as static_cast or
3076   /// reinterpret_cast.
3077   ///
3078   /// By default, this routine dispatches to one of the more-specific routines
3079   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
3080   /// Subclasses may override this routine to provide different behavior.
3081   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
3082                                            Stmt::StmtClass Class,
3083                                            SourceLocation LAngleLoc,
3084                                            TypeSourceInfo *TInfo,
3085                                            SourceLocation RAngleLoc,
3086                                            SourceLocation LParenLoc,
3087                                            Expr *SubExpr,
3088                                            SourceLocation RParenLoc) {
3089     switch (Class) {
3090     case Stmt::CXXStaticCastExprClass:
3091       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3092                                                    RAngleLoc, LParenLoc,
3093                                                    SubExpr, RParenLoc);
3094 
3095     case Stmt::CXXDynamicCastExprClass:
3096       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3097                                                     RAngleLoc, LParenLoc,
3098                                                     SubExpr, RParenLoc);
3099 
3100     case Stmt::CXXReinterpretCastExprClass:
3101       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3102                                                         RAngleLoc, LParenLoc,
3103                                                         SubExpr,
3104                                                         RParenLoc);
3105 
3106     case Stmt::CXXConstCastExprClass:
3107       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3108                                                    RAngleLoc, LParenLoc,
3109                                                    SubExpr, RParenLoc);
3110 
3111     case Stmt::CXXAddrspaceCastExprClass:
3112       return getDerived().RebuildCXXAddrspaceCastExpr(
3113           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3114 
3115     default:
3116       llvm_unreachable("Invalid C++ named cast");
3117     }
3118   }
3119 
3120   /// Build a new C++ static_cast expression.
3121   ///
3122   /// By default, performs semantic analysis to build the new expression.
3123   /// Subclasses may override this routine to provide different behavior.
3124   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
3125                                             SourceLocation LAngleLoc,
3126                                             TypeSourceInfo *TInfo,
3127                                             SourceLocation RAngleLoc,
3128                                             SourceLocation LParenLoc,
3129                                             Expr *SubExpr,
3130                                             SourceLocation RParenLoc) {
3131     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
3132                                        TInfo, SubExpr,
3133                                        SourceRange(LAngleLoc, RAngleLoc),
3134                                        SourceRange(LParenLoc, RParenLoc));
3135   }
3136 
3137   /// Build a new C++ dynamic_cast expression.
3138   ///
3139   /// By default, performs semantic analysis to build the new expression.
3140   /// Subclasses may override this routine to provide different behavior.
3141   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
3142                                              SourceLocation LAngleLoc,
3143                                              TypeSourceInfo *TInfo,
3144                                              SourceLocation RAngleLoc,
3145                                              SourceLocation LParenLoc,
3146                                              Expr *SubExpr,
3147                                              SourceLocation RParenLoc) {
3148     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
3149                                        TInfo, SubExpr,
3150                                        SourceRange(LAngleLoc, RAngleLoc),
3151                                        SourceRange(LParenLoc, RParenLoc));
3152   }
3153 
3154   /// Build a new C++ reinterpret_cast expression.
3155   ///
3156   /// By default, performs semantic analysis to build the new expression.
3157   /// Subclasses may override this routine to provide different behavior.
3158   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
3159                                                  SourceLocation LAngleLoc,
3160                                                  TypeSourceInfo *TInfo,
3161                                                  SourceLocation RAngleLoc,
3162                                                  SourceLocation LParenLoc,
3163                                                  Expr *SubExpr,
3164                                                  SourceLocation RParenLoc) {
3165     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
3166                                        TInfo, SubExpr,
3167                                        SourceRange(LAngleLoc, RAngleLoc),
3168                                        SourceRange(LParenLoc, RParenLoc));
3169   }
3170 
3171   /// Build a new C++ const_cast expression.
3172   ///
3173   /// By default, performs semantic analysis to build the new expression.
3174   /// Subclasses may override this routine to provide different behavior.
3175   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3176                                            SourceLocation LAngleLoc,
3177                                            TypeSourceInfo *TInfo,
3178                                            SourceLocation RAngleLoc,
3179                                            SourceLocation LParenLoc,
3180                                            Expr *SubExpr,
3181                                            SourceLocation RParenLoc) {
3182     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3183                                        TInfo, SubExpr,
3184                                        SourceRange(LAngleLoc, RAngleLoc),
3185                                        SourceRange(LParenLoc, RParenLoc));
3186   }
3187 
3188   ExprResult
3189   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3190                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3191                               SourceLocation LParenLoc, Expr *SubExpr,
3192                               SourceLocation RParenLoc) {
3193     return getSema().BuildCXXNamedCast(
3194         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3195         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3196   }
3197 
3198   /// Build a new C++ functional-style cast expression.
3199   ///
3200   /// By default, performs semantic analysis to build the new expression.
3201   /// Subclasses may override this routine to provide different behavior.
3202   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3203                                           SourceLocation LParenLoc,
3204                                           Expr *Sub,
3205                                           SourceLocation RParenLoc,
3206                                           bool ListInitialization) {
3207     // If Sub is a ParenListExpr, then Sub is the syntatic form of a
3208     // CXXParenListInitExpr. Pass its expanded arguments so that the
3209     // CXXParenListInitExpr can be rebuilt.
3210     if (auto *PLE = dyn_cast<ParenListExpr>(Sub))
3211       return getSema().BuildCXXTypeConstructExpr(
3212           TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()),
3213           RParenLoc, ListInitialization);
3214     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3215                                                MultiExprArg(&Sub, 1), RParenLoc,
3216                                                ListInitialization);
3217   }
3218 
3219   /// Build a new C++ __builtin_bit_cast expression.
3220   ///
3221   /// By default, performs semantic analysis to build the new expression.
3222   /// Subclasses may override this routine to provide different behavior.
3223   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3224                                        TypeSourceInfo *TSI, Expr *Sub,
3225                                        SourceLocation RParenLoc) {
3226     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3227   }
3228 
3229   /// Build a new C++ typeid(type) expression.
3230   ///
3231   /// By default, performs semantic analysis to build the new expression.
3232   /// Subclasses may override this routine to provide different behavior.
3233   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3234                                         SourceLocation TypeidLoc,
3235                                         TypeSourceInfo *Operand,
3236                                         SourceLocation RParenLoc) {
3237     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3238                                     RParenLoc);
3239   }
3240 
3241 
3242   /// Build a new C++ typeid(expr) expression.
3243   ///
3244   /// By default, performs semantic analysis to build the new expression.
3245   /// Subclasses may override this routine to provide different behavior.
3246   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3247                                         SourceLocation TypeidLoc,
3248                                         Expr *Operand,
3249                                         SourceLocation RParenLoc) {
3250     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3251                                     RParenLoc);
3252   }
3253 
3254   /// Build a new C++ __uuidof(type) expression.
3255   ///
3256   /// By default, performs semantic analysis to build the new expression.
3257   /// Subclasses may override this routine to provide different behavior.
3258   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3259                                   TypeSourceInfo *Operand,
3260                                   SourceLocation RParenLoc) {
3261     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3262   }
3263 
3264   /// Build a new C++ __uuidof(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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3269                                   Expr *Operand, SourceLocation RParenLoc) {
3270     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3271   }
3272 
3273   /// Build a new C++ "this" expression.
3274   ///
3275   /// By default, builds a new "this" expression without performing any
3276   /// semantic analysis. Subclasses may override this routine to provide
3277   /// different behavior.
3278   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3279                                 QualType ThisType,
3280                                 bool isImplicit) {
3281     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3282   }
3283 
3284   /// Build a new C++ throw expression.
3285   ///
3286   /// By default, performs semantic analysis to build the new expression.
3287   /// Subclasses may override this routine to provide different behavior.
3288   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3289                                  bool IsThrownVariableInScope) {
3290     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3291   }
3292 
3293   /// Build a new C++ default-argument expression.
3294   ///
3295   /// By default, builds a new default-argument expression, which does not
3296   /// require any semantic analysis. Subclasses may override this routine to
3297   /// provide different behavior.
3298   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3299                                       Expr *RewrittenExpr) {
3300     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3301                                      RewrittenExpr, getSema().CurContext);
3302   }
3303 
3304   /// Build a new C++11 default-initialization expression.
3305   ///
3306   /// By default, builds a new default field initialization expression, which
3307   /// does not require any semantic analysis. Subclasses may override this
3308   /// routine to provide different behavior.
3309   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3310                                        FieldDecl *Field) {
3311     return getSema().BuildCXXDefaultInitExpr(Loc, Field);
3312   }
3313 
3314   /// Build a new C++ zero-initialization expression.
3315   ///
3316   /// By default, performs semantic analysis to build the new expression.
3317   /// Subclasses may override this routine to provide different behavior.
3318   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3319                                            SourceLocation LParenLoc,
3320                                            SourceLocation RParenLoc) {
3321     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt,
3322                                                RParenLoc,
3323                                                /*ListInitialization=*/false);
3324   }
3325 
3326   /// Build a new C++ "new" expression.
3327   ///
3328   /// By default, performs semantic analysis to build the new expression.
3329   /// Subclasses may override this routine to provide different behavior.
3330   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal,
3331                                SourceLocation PlacementLParen,
3332                                MultiExprArg PlacementArgs,
3333                                SourceLocation PlacementRParen,
3334                                SourceRange TypeIdParens, QualType AllocatedType,
3335                                TypeSourceInfo *AllocatedTypeInfo,
3336                                std::optional<Expr *> ArraySize,
3337                                SourceRange DirectInitRange, Expr *Initializer) {
3338     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3339                                  PlacementLParen,
3340                                  PlacementArgs,
3341                                  PlacementRParen,
3342                                  TypeIdParens,
3343                                  AllocatedType,
3344                                  AllocatedTypeInfo,
3345                                  ArraySize,
3346                                  DirectInitRange,
3347                                  Initializer);
3348   }
3349 
3350   /// Build a new C++ "delete" expression.
3351   ///
3352   /// By default, performs semantic analysis to build the new expression.
3353   /// Subclasses may override this routine to provide different behavior.
3354   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3355                                         bool IsGlobalDelete,
3356                                         bool IsArrayForm,
3357                                         Expr *Operand) {
3358     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3359                                     Operand);
3360   }
3361 
3362   /// Build a new type trait expression.
3363   ///
3364   /// By default, performs semantic analysis to build the new expression.
3365   /// Subclasses may override this routine to provide different behavior.
3366   ExprResult RebuildTypeTrait(TypeTrait Trait,
3367                               SourceLocation StartLoc,
3368                               ArrayRef<TypeSourceInfo *> Args,
3369                               SourceLocation RParenLoc) {
3370     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3371   }
3372 
3373   /// Build a new array type trait expression.
3374   ///
3375   /// By default, performs semantic analysis to build the new expression.
3376   /// Subclasses may override this routine to provide different behavior.
3377   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3378                                    SourceLocation StartLoc,
3379                                    TypeSourceInfo *TSInfo,
3380                                    Expr *DimExpr,
3381                                    SourceLocation RParenLoc) {
3382     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3383   }
3384 
3385   /// Build a new expression trait expression.
3386   ///
3387   /// By default, performs semantic analysis to build the new expression.
3388   /// Subclasses may override this routine to provide different behavior.
3389   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3390                                    SourceLocation StartLoc,
3391                                    Expr *Queried,
3392                                    SourceLocation RParenLoc) {
3393     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3394   }
3395 
3396   /// Build a new (previously unresolved) declaration reference
3397   /// expression.
3398   ///
3399   /// By default, performs semantic analysis to build the new expression.
3400   /// Subclasses may override this routine to provide different behavior.
3401   ExprResult RebuildDependentScopeDeclRefExpr(
3402                                           NestedNameSpecifierLoc QualifierLoc,
3403                                           SourceLocation TemplateKWLoc,
3404                                        const DeclarationNameInfo &NameInfo,
3405                               const TemplateArgumentListInfo *TemplateArgs,
3406                                           bool IsAddressOfOperand,
3407                                           TypeSourceInfo **RecoveryTSI) {
3408     CXXScopeSpec SS;
3409     SS.Adopt(QualifierLoc);
3410 
3411     if (TemplateArgs || TemplateKWLoc.isValid())
3412       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3413                                                     TemplateArgs);
3414 
3415     return getSema().BuildQualifiedDeclarationNameExpr(
3416         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3417   }
3418 
3419   /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3424                                    SourceLocation TemplateKWLoc,
3425                                    LookupResult &R,
3426                                    bool RequiresADL,
3427                               const TemplateArgumentListInfo *TemplateArgs) {
3428     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3429                                          TemplateArgs);
3430   }
3431 
3432   /// Build a new object-construction expression.
3433   ///
3434   /// By default, performs semantic analysis to build the new expression.
3435   /// Subclasses may override this routine to provide different behavior.
3436   ExprResult RebuildCXXConstructExpr(QualType T,
3437                                      SourceLocation Loc,
3438                                      CXXConstructorDecl *Constructor,
3439                                      bool IsElidable,
3440                                      MultiExprArg Args,
3441                                      bool HadMultipleCandidates,
3442                                      bool ListInitialization,
3443                                      bool StdInitListInitialization,
3444                                      bool RequiresZeroInit,
3445                              CXXConstructExpr::ConstructionKind ConstructKind,
3446                                      SourceRange ParenRange) {
3447     // Reconstruct the constructor we originally found, which might be
3448     // different if this is a call to an inherited constructor.
3449     CXXConstructorDecl *FoundCtor = Constructor;
3450     if (Constructor->isInheritingConstructor())
3451       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3452 
3453     SmallVector<Expr *, 8> ConvertedArgs;
3454     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3455                                           ConvertedArgs))
3456       return ExprError();
3457 
3458     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3459                                            IsElidable,
3460                                            ConvertedArgs,
3461                                            HadMultipleCandidates,
3462                                            ListInitialization,
3463                                            StdInitListInitialization,
3464                                            RequiresZeroInit, ConstructKind,
3465                                            ParenRange);
3466   }
3467 
3468   /// Build a new implicit construction via inherited constructor
3469   /// expression.
3470   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3471                                              CXXConstructorDecl *Constructor,
3472                                              bool ConstructsVBase,
3473                                              bool InheritedFromVBase) {
3474     return new (getSema().Context) CXXInheritedCtorInitExpr(
3475         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3476   }
3477 
3478   /// Build a new object-construction expression.
3479   ///
3480   /// By default, performs semantic analysis to build the new expression.
3481   /// Subclasses may override this routine to provide different behavior.
3482   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3483                                            SourceLocation LParenOrBraceLoc,
3484                                            MultiExprArg Args,
3485                                            SourceLocation RParenOrBraceLoc,
3486                                            bool ListInitialization) {
3487     return getSema().BuildCXXTypeConstructExpr(
3488         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3489   }
3490 
3491   /// Build a new object-construction expression.
3492   ///
3493   /// By default, performs semantic analysis to build the new expression.
3494   /// Subclasses may override this routine to provide different behavior.
3495   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3496                                                SourceLocation LParenLoc,
3497                                                MultiExprArg Args,
3498                                                SourceLocation RParenLoc,
3499                                                bool ListInitialization) {
3500     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3501                                                RParenLoc, ListInitialization);
3502   }
3503 
3504   /// Build a new member reference expression.
3505   ///
3506   /// By default, performs semantic analysis to build the new expression.
3507   /// Subclasses may override this routine to provide different behavior.
3508   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3509                                                 QualType BaseType,
3510                                                 bool IsArrow,
3511                                                 SourceLocation OperatorLoc,
3512                                           NestedNameSpecifierLoc QualifierLoc,
3513                                                 SourceLocation TemplateKWLoc,
3514                                             NamedDecl *FirstQualifierInScope,
3515                                    const DeclarationNameInfo &MemberNameInfo,
3516                               const TemplateArgumentListInfo *TemplateArgs) {
3517     CXXScopeSpec SS;
3518     SS.Adopt(QualifierLoc);
3519 
3520     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3521                                             OperatorLoc, IsArrow,
3522                                             SS, TemplateKWLoc,
3523                                             FirstQualifierInScope,
3524                                             MemberNameInfo,
3525                                             TemplateArgs, /*S*/nullptr);
3526   }
3527 
3528   /// Build a new member reference expression.
3529   ///
3530   /// By default, performs semantic analysis to build the new expression.
3531   /// Subclasses may override this routine to provide different behavior.
3532   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3533                                          SourceLocation OperatorLoc,
3534                                          bool IsArrow,
3535                                          NestedNameSpecifierLoc QualifierLoc,
3536                                          SourceLocation TemplateKWLoc,
3537                                          NamedDecl *FirstQualifierInScope,
3538                                          LookupResult &R,
3539                                 const TemplateArgumentListInfo *TemplateArgs) {
3540     CXXScopeSpec SS;
3541     SS.Adopt(QualifierLoc);
3542 
3543     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3544                                             OperatorLoc, IsArrow,
3545                                             SS, TemplateKWLoc,
3546                                             FirstQualifierInScope,
3547                                             R, TemplateArgs, /*S*/nullptr);
3548   }
3549 
3550   /// Build a new noexcept expression.
3551   ///
3552   /// By default, performs semantic analysis to build the new expression.
3553   /// Subclasses may override this routine to provide different behavior.
3554   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3555     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3556   }
3557 
3558   /// Build a new expression to compute the length of a parameter pack.
3559   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
3560                                    SourceLocation PackLoc,
3561                                    SourceLocation RParenLoc,
3562                                    std::optional<unsigned> Length,
3563                                    ArrayRef<TemplateArgument> PartialArgs) {
3564     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3565                                   RParenLoc, Length, PartialArgs);
3566   }
3567 
3568   /// Build a new expression representing a call to a source location
3569   ///  builtin.
3570   ///
3571   /// By default, performs semantic analysis to build the new expression.
3572   /// Subclasses may override this routine to provide different behavior.
3573   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3574                                   QualType ResultTy, SourceLocation BuiltinLoc,
3575                                   SourceLocation RPLoc,
3576                                   DeclContext *ParentContext) {
3577     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3578                                         ParentContext);
3579   }
3580 
3581   /// Build a new Objective-C boxed expression.
3582   ///
3583   /// By default, performs semantic analysis to build the new expression.
3584   /// Subclasses may override this routine to provide different behavior.
3585   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3586       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3587       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3588       TemplateArgumentListInfo *TALI) {
3589     CXXScopeSpec SS;
3590     SS.Adopt(NNS);
3591     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3592                                                          ConceptNameInfo,
3593                                                          FoundDecl,
3594                                                          NamedConcept, TALI);
3595     if (Result.isInvalid())
3596       return ExprError();
3597     return Result;
3598   }
3599 
3600   /// \brief Build a new requires expression.
3601   ///
3602   /// By default, performs semantic analysis to build the new expression.
3603   /// Subclasses may override this routine to provide different behavior.
3604   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3605                                  RequiresExprBodyDecl *Body,
3606                                  ArrayRef<ParmVarDecl *> LocalParameters,
3607                                  ArrayRef<concepts::Requirement *> Requirements,
3608                                  SourceLocation ClosingBraceLoc) {
3609     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3610                                 LocalParameters, Requirements, ClosingBraceLoc);
3611   }
3612 
3613   concepts::TypeRequirement *
3614   RebuildTypeRequirement(
3615       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3616     return SemaRef.BuildTypeRequirement(SubstDiag);
3617   }
3618 
3619   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3620     return SemaRef.BuildTypeRequirement(T);
3621   }
3622 
3623   concepts::ExprRequirement *
3624   RebuildExprRequirement(
3625       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3626       SourceLocation NoexceptLoc,
3627       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3628     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3629                                         std::move(Ret));
3630   }
3631 
3632   concepts::ExprRequirement *
3633   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3634                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3635     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3636                                         std::move(Ret));
3637   }
3638 
3639   concepts::NestedRequirement *
3640   RebuildNestedRequirement(StringRef InvalidConstraintEntity,
3641                            const ASTConstraintSatisfaction &Satisfaction) {
3642     return SemaRef.BuildNestedRequirement(InvalidConstraintEntity,
3643                                           Satisfaction);
3644   }
3645 
3646   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3647     return SemaRef.BuildNestedRequirement(Constraint);
3648   }
3649 
3650   /// \brief Build a new Objective-C boxed expression.
3651   ///
3652   /// By default, performs semantic analysis to build the new expression.
3653   /// Subclasses may override this routine to provide different behavior.
3654   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3655     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3656   }
3657 
3658   /// Build a new Objective-C array literal.
3659   ///
3660   /// By default, performs semantic analysis to build the new expression.
3661   /// Subclasses may override this routine to provide different behavior.
3662   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3663                                      Expr **Elements, unsigned NumElements) {
3664     return getSema().BuildObjCArrayLiteral(Range,
3665                                            MultiExprArg(Elements, NumElements));
3666   }
3667 
3668   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3669                                          Expr *Base, Expr *Key,
3670                                          ObjCMethodDecl *getterMethod,
3671                                          ObjCMethodDecl *setterMethod) {
3672     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3673                                                    getterMethod, setterMethod);
3674   }
3675 
3676   /// Build a new Objective-C dictionary literal.
3677   ///
3678   /// By default, performs semantic analysis to build the new expression.
3679   /// Subclasses may override this routine to provide different behavior.
3680   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3681                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3682     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3683   }
3684 
3685   /// Build a new Objective-C \@encode expression.
3686   ///
3687   /// By default, performs semantic analysis to build the new expression.
3688   /// Subclasses may override this routine to provide different behavior.
3689   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3690                                          TypeSourceInfo *EncodeTypeInfo,
3691                                          SourceLocation RParenLoc) {
3692     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3693   }
3694 
3695   /// Build a new Objective-C class message.
3696   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3697                                           Selector Sel,
3698                                           ArrayRef<SourceLocation> SelectorLocs,
3699                                           ObjCMethodDecl *Method,
3700                                           SourceLocation LBracLoc,
3701                                           MultiExprArg Args,
3702                                           SourceLocation RBracLoc) {
3703     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3704                                      ReceiverTypeInfo->getType(),
3705                                      /*SuperLoc=*/SourceLocation(),
3706                                      Sel, Method, LBracLoc, SelectorLocs,
3707                                      RBracLoc, Args);
3708   }
3709 
3710   /// Build a new Objective-C instance message.
3711   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3712                                           Selector Sel,
3713                                           ArrayRef<SourceLocation> SelectorLocs,
3714                                           ObjCMethodDecl *Method,
3715                                           SourceLocation LBracLoc,
3716                                           MultiExprArg Args,
3717                                           SourceLocation RBracLoc) {
3718     return SemaRef.BuildInstanceMessage(Receiver,
3719                                         Receiver->getType(),
3720                                         /*SuperLoc=*/SourceLocation(),
3721                                         Sel, Method, LBracLoc, SelectorLocs,
3722                                         RBracLoc, Args);
3723   }
3724 
3725   /// Build a new Objective-C instance/class message to 'super'.
3726   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3727                                     Selector Sel,
3728                                     ArrayRef<SourceLocation> SelectorLocs,
3729                                     QualType SuperType,
3730                                     ObjCMethodDecl *Method,
3731                                     SourceLocation LBracLoc,
3732                                     MultiExprArg Args,
3733                                     SourceLocation RBracLoc) {
3734     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3735                                           SuperType,
3736                                           SuperLoc,
3737                                           Sel, Method, LBracLoc, SelectorLocs,
3738                                           RBracLoc, Args)
3739                                       : SemaRef.BuildClassMessage(nullptr,
3740                                           SuperType,
3741                                           SuperLoc,
3742                                           Sel, Method, LBracLoc, SelectorLocs,
3743                                           RBracLoc, Args);
3744 
3745 
3746   }
3747 
3748   /// Build a new Objective-C ivar reference expression.
3749   ///
3750   /// By default, performs semantic analysis to build the new expression.
3751   /// Subclasses may override this routine to provide different behavior.
3752   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3753                                           SourceLocation IvarLoc,
3754                                           bool IsArrow, bool IsFreeIvar) {
3755     CXXScopeSpec SS;
3756     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3757     ExprResult Result = getSema().BuildMemberReferenceExpr(
3758         BaseArg, BaseArg->getType(),
3759         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3760         /*FirstQualifierInScope=*/nullptr, NameInfo,
3761         /*TemplateArgs=*/nullptr,
3762         /*S=*/nullptr);
3763     if (IsFreeIvar && Result.isUsable())
3764       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3765     return Result;
3766   }
3767 
3768   /// Build a new Objective-C property 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 RebuildObjCPropertyRefExpr(Expr *BaseArg,
3773                                         ObjCPropertyDecl *Property,
3774                                         SourceLocation PropertyLoc) {
3775     CXXScopeSpec SS;
3776     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3777     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3778                                               /*FIXME:*/PropertyLoc,
3779                                               /*IsArrow=*/false,
3780                                               SS, SourceLocation(),
3781                                               /*FirstQualifierInScope=*/nullptr,
3782                                               NameInfo,
3783                                               /*TemplateArgs=*/nullptr,
3784                                               /*S=*/nullptr);
3785   }
3786 
3787   /// Build a new Objective-C property reference expression.
3788   ///
3789   /// By default, performs semantic analysis to build the new expression.
3790   /// Subclasses may override this routine to provide different behavior.
3791   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3792                                         ObjCMethodDecl *Getter,
3793                                         ObjCMethodDecl *Setter,
3794                                         SourceLocation PropertyLoc) {
3795     // Since these expressions can only be value-dependent, we do not
3796     // need to perform semantic analysis again.
3797     return Owned(
3798       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3799                                                   VK_LValue, OK_ObjCProperty,
3800                                                   PropertyLoc, Base));
3801   }
3802 
3803   /// Build a new Objective-C "isa" expression.
3804   ///
3805   /// By default, performs semantic analysis to build the new expression.
3806   /// Subclasses may override this routine to provide different behavior.
3807   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3808                                 SourceLocation OpLoc, bool IsArrow) {
3809     CXXScopeSpec SS;
3810     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3811     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3812                                               OpLoc, IsArrow,
3813                                               SS, SourceLocation(),
3814                                               /*FirstQualifierInScope=*/nullptr,
3815                                               NameInfo,
3816                                               /*TemplateArgs=*/nullptr,
3817                                               /*S=*/nullptr);
3818   }
3819 
3820   /// Build a new shuffle vector expression.
3821   ///
3822   /// By default, performs semantic analysis to build the new expression.
3823   /// Subclasses may override this routine to provide different behavior.
3824   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3825                                       MultiExprArg SubExprs,
3826                                       SourceLocation RParenLoc) {
3827     // Find the declaration for __builtin_shufflevector
3828     const IdentifierInfo &Name
3829       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3830     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3831     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3832     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3833 
3834     // Build a reference to the __builtin_shufflevector builtin
3835     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3836     Expr *Callee = new (SemaRef.Context)
3837         DeclRefExpr(SemaRef.Context, Builtin, false,
3838                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3839     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3840     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3841                                        CK_BuiltinFnToFnPtr).get();
3842 
3843     // Build the CallExpr
3844     ExprResult TheCall = CallExpr::Create(
3845         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3846         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3847         FPOptionsOverride());
3848 
3849     // Type-check the __builtin_shufflevector expression.
3850     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3851   }
3852 
3853   /// Build a new convert vector expression.
3854   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3855                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3856                                       SourceLocation RParenLoc) {
3857     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3858                                          BuiltinLoc, RParenLoc);
3859   }
3860 
3861   /// Build a new template argument pack expansion.
3862   ///
3863   /// By default, performs semantic analysis to build a new pack expansion
3864   /// for a template argument. Subclasses may override this routine to provide
3865   /// different behavior.
3866   TemplateArgumentLoc
3867   RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc,
3868                        std::optional<unsigned> NumExpansions) {
3869     switch (Pattern.getArgument().getKind()) {
3870     case TemplateArgument::Expression: {
3871       ExprResult Result
3872         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3873                                        EllipsisLoc, NumExpansions);
3874       if (Result.isInvalid())
3875         return TemplateArgumentLoc();
3876 
3877       return TemplateArgumentLoc(Result.get(), Result.get());
3878     }
3879 
3880     case TemplateArgument::Template:
3881       return TemplateArgumentLoc(
3882           SemaRef.Context,
3883           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3884                            NumExpansions),
3885           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3886           EllipsisLoc);
3887 
3888     case TemplateArgument::Null:
3889     case TemplateArgument::Integral:
3890     case TemplateArgument::Declaration:
3891     case TemplateArgument::Pack:
3892     case TemplateArgument::TemplateExpansion:
3893     case TemplateArgument::NullPtr:
3894       llvm_unreachable("Pack expansion pattern has no parameter packs");
3895 
3896     case TemplateArgument::Type:
3897       if (TypeSourceInfo *Expansion
3898             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3899                                            EllipsisLoc,
3900                                            NumExpansions))
3901         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3902                                    Expansion);
3903       break;
3904     }
3905 
3906     return TemplateArgumentLoc();
3907   }
3908 
3909   /// Build a new expression pack expansion.
3910   ///
3911   /// By default, performs semantic analysis to build a new pack expansion
3912   /// for an expression. Subclasses may override this routine to provide
3913   /// different behavior.
3914   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3915                                   std::optional<unsigned> NumExpansions) {
3916     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3917   }
3918 
3919   /// Build a new C++1z fold-expression.
3920   ///
3921   /// By default, performs semantic analysis in order to build a new fold
3922   /// expression.
3923   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3924                                 SourceLocation LParenLoc, Expr *LHS,
3925                                 BinaryOperatorKind Operator,
3926                                 SourceLocation EllipsisLoc, Expr *RHS,
3927                                 SourceLocation RParenLoc,
3928                                 std::optional<unsigned> NumExpansions) {
3929     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3930                                       EllipsisLoc, RHS, RParenLoc,
3931                                       NumExpansions);
3932   }
3933 
3934   /// Build an empty C++1z fold-expression with the given operator.
3935   ///
3936   /// By default, produces the fallback value for the fold-expression, or
3937   /// produce an error if there is no fallback value.
3938   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3939                                      BinaryOperatorKind Operator) {
3940     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3941   }
3942 
3943   /// Build a new atomic operation expression.
3944   ///
3945   /// By default, performs semantic analysis to build the new expression.
3946   /// Subclasses may override this routine to provide different behavior.
3947   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3948                                AtomicExpr::AtomicOp Op,
3949                                SourceLocation RParenLoc) {
3950     // Use this for all of the locations, since we don't know the difference
3951     // between the call and the expr at this point.
3952     SourceRange Range{BuiltinLoc, RParenLoc};
3953     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3954                                      Sema::AtomicArgumentOrder::AST);
3955   }
3956 
3957   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3958                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3959     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3960   }
3961 
3962 private:
3963   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3964                                      QualType ObjectType,
3965                                      NamedDecl *FirstQualifierInScope,
3966                                      CXXScopeSpec &SS);
3967 
3968   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3969                                              QualType ObjectType,
3970                                              NamedDecl *FirstQualifierInScope,
3971                                              CXXScopeSpec &SS);
3972 
3973   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3974                                             NamedDecl *FirstQualifierInScope,
3975                                             CXXScopeSpec &SS);
3976 
3977   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3978                                       DependentNameTypeLoc TL,
3979                                       bool DeducibleTSTContext);
3980 };
3981 
3982 template <typename Derived>
3983 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3984   if (!S)
3985     return S;
3986 
3987   switch (S->getStmtClass()) {
3988   case Stmt::NoStmtClass: break;
3989 
3990   // Transform individual statement nodes
3991   // Pass SDK into statements that can produce a value
3992 #define STMT(Node, Parent)                                              \
3993   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3994 #define VALUESTMT(Node, Parent)                                         \
3995   case Stmt::Node##Class:                                               \
3996     return getDerived().Transform##Node(cast<Node>(S), SDK);
3997 #define ABSTRACT_STMT(Node)
3998 #define EXPR(Node, Parent)
3999 #include "clang/AST/StmtNodes.inc"
4000 
4001   // Transform expressions by calling TransformExpr.
4002 #define STMT(Node, Parent)
4003 #define ABSTRACT_STMT(Stmt)
4004 #define EXPR(Node, Parent) case Stmt::Node##Class:
4005 #include "clang/AST/StmtNodes.inc"
4006     {
4007       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
4008 
4009       if (SDK == SDK_StmtExprResult)
4010         E = getSema().ActOnStmtExprResult(E);
4011       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
4012     }
4013   }
4014 
4015   return S;
4016 }
4017 
4018 template<typename Derived>
4019 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
4020   if (!S)
4021     return S;
4022 
4023   switch (S->getClauseKind()) {
4024   default: break;
4025   // Transform individual clause nodes
4026 #define GEN_CLANG_CLAUSE_CLASS
4027 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
4028   case Enum:                                                                   \
4029     return getDerived().Transform##Class(cast<Class>(S));
4030 #include "llvm/Frontend/OpenMP/OMP.inc"
4031   }
4032 
4033   return S;
4034 }
4035 
4036 
4037 template<typename Derived>
4038 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
4039   if (!E)
4040     return E;
4041 
4042   switch (E->getStmtClass()) {
4043     case Stmt::NoStmtClass: break;
4044 #define STMT(Node, Parent) case Stmt::Node##Class: break;
4045 #define ABSTRACT_STMT(Stmt)
4046 #define EXPR(Node, Parent)                                              \
4047     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
4048 #include "clang/AST/StmtNodes.inc"
4049   }
4050 
4051   return E;
4052 }
4053 
4054 template<typename Derived>
4055 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
4056                                                         bool NotCopyInit) {
4057   // Initializers are instantiated like expressions, except that various outer
4058   // layers are stripped.
4059   if (!Init)
4060     return Init;
4061 
4062   if (auto *FE = dyn_cast<FullExpr>(Init))
4063     Init = FE->getSubExpr();
4064 
4065   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
4066     OpaqueValueExpr *OVE = AIL->getCommonExpr();
4067     Init = OVE->getSourceExpr();
4068   }
4069 
4070   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
4071     Init = MTE->getSubExpr();
4072 
4073   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
4074     Init = Binder->getSubExpr();
4075 
4076   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
4077     Init = ICE->getSubExprAsWritten();
4078 
4079   if (CXXStdInitializerListExpr *ILE =
4080           dyn_cast<CXXStdInitializerListExpr>(Init))
4081     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4082 
4083   // If this is copy-initialization, we only need to reconstruct
4084   // InitListExprs. Other forms of copy-initialization will be a no-op if
4085   // the initializer is already the right type.
4086   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
4087   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
4088     return getDerived().TransformExpr(Init);
4089 
4090   // Revert value-initialization back to empty parens.
4091   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
4092     SourceRange Parens = VIE->getSourceRange();
4093     return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt,
4094                                              Parens.getEnd());
4095   }
4096 
4097   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
4098   if (isa<ImplicitValueInitExpr>(Init))
4099     return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt,
4100                                              SourceLocation());
4101 
4102   // Revert initialization by constructor back to a parenthesized or braced list
4103   // of expressions. Any other form of initializer can just be reused directly.
4104   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4105     return getDerived().TransformExpr(Init);
4106 
4107   // If the initialization implicitly converted an initializer list to a
4108   // std::initializer_list object, unwrap the std::initializer_list too.
4109   if (Construct && Construct->isStdInitListInitialization())
4110     return TransformInitializer(Construct->getArg(0), NotCopyInit);
4111 
4112   // Enter a list-init context if this was list initialization.
4113   EnterExpressionEvaluationContext Context(
4114       getSema(), EnterExpressionEvaluationContext::InitList,
4115       Construct->isListInitialization());
4116 
4117   SmallVector<Expr*, 8> NewArgs;
4118   bool ArgChanged = false;
4119   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
4120                                   /*IsCall*/true, NewArgs, &ArgChanged))
4121     return ExprError();
4122 
4123   // If this was list initialization, revert to syntactic list form.
4124   if (Construct->isListInitialization())
4125     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
4126                                         Construct->getEndLoc());
4127 
4128   // Build a ParenListExpr to represent anything else.
4129   SourceRange Parens = Construct->getParenOrBraceRange();
4130   if (Parens.isInvalid()) {
4131     // This was a variable declaration's initialization for which no initializer
4132     // was specified.
4133     assert(NewArgs.empty() &&
4134            "no parens or braces but have direct init with arguments?");
4135     return ExprEmpty();
4136   }
4137   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
4138                                            Parens.getEnd());
4139 }
4140 
4141 template<typename Derived>
4142 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
4143                                             unsigned NumInputs,
4144                                             bool IsCall,
4145                                       SmallVectorImpl<Expr *> &Outputs,
4146                                             bool *ArgChanged) {
4147   for (unsigned I = 0; I != NumInputs; ++I) {
4148     // If requested, drop call arguments that need to be dropped.
4149     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4150       if (ArgChanged)
4151         *ArgChanged = true;
4152 
4153       break;
4154     }
4155 
4156     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
4157       Expr *Pattern = Expansion->getPattern();
4158 
4159       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4160       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4161       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4162 
4163       // Determine whether the set of unexpanded parameter packs can and should
4164       // be expanded.
4165       bool Expand = true;
4166       bool RetainExpansion = false;
4167       std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4168       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4169       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4170                                                Pattern->getSourceRange(),
4171                                                Unexpanded,
4172                                                Expand, RetainExpansion,
4173                                                NumExpansions))
4174         return true;
4175 
4176       if (!Expand) {
4177         // The transform has determined that we should perform a simple
4178         // transformation on the pack expansion, producing another pack
4179         // expansion.
4180         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4181         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4182         if (OutPattern.isInvalid())
4183           return true;
4184 
4185         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4186                                                 Expansion->getEllipsisLoc(),
4187                                                            NumExpansions);
4188         if (Out.isInvalid())
4189           return true;
4190 
4191         if (ArgChanged)
4192           *ArgChanged = true;
4193         Outputs.push_back(Out.get());
4194         continue;
4195       }
4196 
4197       // Record right away that the argument was changed.  This needs
4198       // to happen even if the array expands to nothing.
4199       if (ArgChanged) *ArgChanged = true;
4200 
4201       // The transform has determined that we should perform an elementwise
4202       // expansion of the pattern. Do so.
4203       for (unsigned I = 0; I != *NumExpansions; ++I) {
4204         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4205         ExprResult Out = getDerived().TransformExpr(Pattern);
4206         if (Out.isInvalid())
4207           return true;
4208 
4209         if (Out.get()->containsUnexpandedParameterPack()) {
4210           Out = getDerived().RebuildPackExpansion(
4211               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4212           if (Out.isInvalid())
4213             return true;
4214         }
4215 
4216         Outputs.push_back(Out.get());
4217       }
4218 
4219       // If we're supposed to retain a pack expansion, do so by temporarily
4220       // forgetting the partially-substituted parameter pack.
4221       if (RetainExpansion) {
4222         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4223 
4224         ExprResult Out = getDerived().TransformExpr(Pattern);
4225         if (Out.isInvalid())
4226           return true;
4227 
4228         Out = getDerived().RebuildPackExpansion(
4229             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4230         if (Out.isInvalid())
4231           return true;
4232 
4233         Outputs.push_back(Out.get());
4234       }
4235 
4236       continue;
4237     }
4238 
4239     ExprResult Result =
4240       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4241              : getDerived().TransformExpr(Inputs[I]);
4242     if (Result.isInvalid())
4243       return true;
4244 
4245     if (Result.get() != Inputs[I] && ArgChanged)
4246       *ArgChanged = true;
4247 
4248     Outputs.push_back(Result.get());
4249   }
4250 
4251   return false;
4252 }
4253 
4254 template <typename Derived>
4255 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4256     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4257   if (Var) {
4258     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4259         getDerived().TransformDefinition(Var->getLocation(), Var));
4260 
4261     if (!ConditionVar)
4262       return Sema::ConditionError();
4263 
4264     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4265   }
4266 
4267   if (Expr) {
4268     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4269 
4270     if (CondExpr.isInvalid())
4271       return Sema::ConditionError();
4272 
4273     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4274                                     /*MissingOK=*/true);
4275   }
4276 
4277   return Sema::ConditionResult();
4278 }
4279 
4280 template <typename Derived>
4281 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4282     NestedNameSpecifierLoc NNS, QualType ObjectType,
4283     NamedDecl *FirstQualifierInScope) {
4284   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4285 
4286   auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) {
4287     for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4288          Qualifier = Qualifier.getPrefix())
4289       Qualifiers.push_back(Qualifier);
4290   };
4291   insertNNS(NNS);
4292 
4293   CXXScopeSpec SS;
4294   while (!Qualifiers.empty()) {
4295     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4296     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4297 
4298     switch (QNNS->getKind()) {
4299     case NestedNameSpecifier::Identifier: {
4300       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4301                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4302                                       ObjectType);
4303       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4304                                               SS, FirstQualifierInScope, false))
4305         return NestedNameSpecifierLoc();
4306       break;
4307     }
4308 
4309     case NestedNameSpecifier::Namespace: {
4310       NamespaceDecl *NS =
4311           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4312               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4313       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4314       break;
4315     }
4316 
4317     case NestedNameSpecifier::NamespaceAlias: {
4318       NamespaceAliasDecl *Alias =
4319           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4320               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4321       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4322                 Q.getLocalEndLoc());
4323       break;
4324     }
4325 
4326     case NestedNameSpecifier::Global:
4327       // There is no meaningful transformation that one could perform on the
4328       // global scope.
4329       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4330       break;
4331 
4332     case NestedNameSpecifier::Super: {
4333       CXXRecordDecl *RD =
4334           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4335               SourceLocation(), QNNS->getAsRecordDecl()));
4336       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4337       break;
4338     }
4339 
4340     case NestedNameSpecifier::TypeSpecWithTemplate:
4341     case NestedNameSpecifier::TypeSpec: {
4342       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4343                                               FirstQualifierInScope, SS);
4344 
4345       if (!TL)
4346         return NestedNameSpecifierLoc();
4347 
4348       QualType T = TL.getType();
4349       if (T->isDependentType() || T->isRecordType() ||
4350           (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) {
4351         if (T->isEnumeralType())
4352           SemaRef.Diag(TL.getBeginLoc(),
4353                        diag::warn_cxx98_compat_enum_nested_name_spec);
4354 
4355         if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) {
4356           SS.Adopt(ETL.getQualifierLoc());
4357           TL = ETL.getNamedTypeLoc();
4358         }
4359         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4360                   Q.getLocalEndLoc());
4361         break;
4362       }
4363       // If the nested-name-specifier is an invalid type def, don't emit an
4364       // error because a previous error should have already been emitted.
4365       TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>();
4366       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4367         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4368             << T << SS.getRange();
4369       }
4370       return NestedNameSpecifierLoc();
4371     }
4372     }
4373 
4374     // The qualifier-in-scope and object type only apply to the leftmost entity.
4375     FirstQualifierInScope = nullptr;
4376     ObjectType = QualType();
4377   }
4378 
4379   // Don't rebuild the nested-name-specifier if we don't have to.
4380   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4381       !getDerived().AlwaysRebuild())
4382     return NNS;
4383 
4384   // If we can re-use the source-location data from the original
4385   // nested-name-specifier, do so.
4386   if (SS.location_size() == NNS.getDataLength() &&
4387       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4388     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4389 
4390   // Allocate new nested-name-specifier location information.
4391   return SS.getWithLocInContext(SemaRef.Context);
4392 }
4393 
4394 template<typename Derived>
4395 DeclarationNameInfo
4396 TreeTransform<Derived>
4397 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4398   DeclarationName Name = NameInfo.getName();
4399   if (!Name)
4400     return DeclarationNameInfo();
4401 
4402   switch (Name.getNameKind()) {
4403   case DeclarationName::Identifier:
4404   case DeclarationName::ObjCZeroArgSelector:
4405   case DeclarationName::ObjCOneArgSelector:
4406   case DeclarationName::ObjCMultiArgSelector:
4407   case DeclarationName::CXXOperatorName:
4408   case DeclarationName::CXXLiteralOperatorName:
4409   case DeclarationName::CXXUsingDirective:
4410     return NameInfo;
4411 
4412   case DeclarationName::CXXDeductionGuideName: {
4413     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4414     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4415         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4416     if (!NewTemplate)
4417       return DeclarationNameInfo();
4418 
4419     DeclarationNameInfo NewNameInfo(NameInfo);
4420     NewNameInfo.setName(
4421         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4422     return NewNameInfo;
4423   }
4424 
4425   case DeclarationName::CXXConstructorName:
4426   case DeclarationName::CXXDestructorName:
4427   case DeclarationName::CXXConversionFunctionName: {
4428     TypeSourceInfo *NewTInfo;
4429     CanQualType NewCanTy;
4430     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4431       NewTInfo = getDerived().TransformType(OldTInfo);
4432       if (!NewTInfo)
4433         return DeclarationNameInfo();
4434       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4435     }
4436     else {
4437       NewTInfo = nullptr;
4438       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4439       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4440       if (NewT.isNull())
4441         return DeclarationNameInfo();
4442       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4443     }
4444 
4445     DeclarationName NewName
4446       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4447                                                            NewCanTy);
4448     DeclarationNameInfo NewNameInfo(NameInfo);
4449     NewNameInfo.setName(NewName);
4450     NewNameInfo.setNamedTypeInfo(NewTInfo);
4451     return NewNameInfo;
4452   }
4453   }
4454 
4455   llvm_unreachable("Unknown name kind.");
4456 }
4457 
4458 template<typename Derived>
4459 TemplateName
4460 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4461                                               TemplateName Name,
4462                                               SourceLocation NameLoc,
4463                                               QualType ObjectType,
4464                                               NamedDecl *FirstQualifierInScope,
4465                                               bool AllowInjectedClassName) {
4466   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4467     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4468     assert(Template && "qualified template name must refer to a template");
4469 
4470     TemplateDecl *TransTemplate
4471       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4472                                                               Template));
4473     if (!TransTemplate)
4474       return TemplateName();
4475 
4476     if (!getDerived().AlwaysRebuild() &&
4477         SS.getScopeRep() == QTN->getQualifier() &&
4478         TransTemplate == Template)
4479       return Name;
4480 
4481     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4482                                             TransTemplate);
4483   }
4484 
4485   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4486     if (SS.getScopeRep()) {
4487       // These apply to the scope specifier, not the template.
4488       ObjectType = QualType();
4489       FirstQualifierInScope = nullptr;
4490     }
4491 
4492     if (!getDerived().AlwaysRebuild() &&
4493         SS.getScopeRep() == DTN->getQualifier() &&
4494         ObjectType.isNull())
4495       return Name;
4496 
4497     // FIXME: Preserve the location of the "template" keyword.
4498     SourceLocation TemplateKWLoc = NameLoc;
4499 
4500     if (DTN->isIdentifier()) {
4501       return getDerived().RebuildTemplateName(SS,
4502                                               TemplateKWLoc,
4503                                               *DTN->getIdentifier(),
4504                                               NameLoc,
4505                                               ObjectType,
4506                                               FirstQualifierInScope,
4507                                               AllowInjectedClassName);
4508     }
4509 
4510     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4511                                             DTN->getOperator(), NameLoc,
4512                                             ObjectType, AllowInjectedClassName);
4513   }
4514 
4515   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4516     TemplateDecl *TransTemplate
4517       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4518                                                               Template));
4519     if (!TransTemplate)
4520       return TemplateName();
4521 
4522     if (!getDerived().AlwaysRebuild() &&
4523         TransTemplate == Template)
4524       return Name;
4525 
4526     return TemplateName(TransTemplate);
4527   }
4528 
4529   if (SubstTemplateTemplateParmPackStorage *SubstPack
4530       = Name.getAsSubstTemplateTemplateParmPack()) {
4531     return getDerived().RebuildTemplateName(
4532         SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4533         SubstPack->getIndex(), SubstPack->getFinal());
4534   }
4535 
4536   // These should be getting filtered out before they reach the AST.
4537   llvm_unreachable("overloaded function decl survived to here");
4538 }
4539 
4540 template<typename Derived>
4541 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4542                                          const TemplateArgument &Arg,
4543                                          TemplateArgumentLoc &Output) {
4544   Output = getSema().getTrivialTemplateArgumentLoc(
4545       Arg, QualType(), getDerived().getBaseLocation());
4546 }
4547 
4548 template <typename Derived>
4549 bool TreeTransform<Derived>::TransformTemplateArgument(
4550     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4551     bool Uneval) {
4552   const TemplateArgument &Arg = Input.getArgument();
4553   switch (Arg.getKind()) {
4554   case TemplateArgument::Null:
4555   case TemplateArgument::Pack:
4556     llvm_unreachable("Unexpected TemplateArgument");
4557 
4558   case TemplateArgument::Integral:
4559   case TemplateArgument::NullPtr:
4560   case TemplateArgument::Declaration: {
4561     // Transform a resolved template argument straight to a resolved template
4562     // argument. We get here when substituting into an already-substituted
4563     // template type argument during concept satisfaction checking.
4564     QualType T = Arg.getNonTypeTemplateArgumentType();
4565     QualType NewT = getDerived().TransformType(T);
4566     if (NewT.isNull())
4567       return true;
4568 
4569     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4570                        ? Arg.getAsDecl()
4571                        : nullptr;
4572     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4573                               getDerived().getBaseLocation(), D))
4574                         : nullptr;
4575     if (D && !NewD)
4576       return true;
4577 
4578     if (NewT == T && D == NewD)
4579       Output = Input;
4580     else if (Arg.getKind() == TemplateArgument::Integral)
4581       Output = TemplateArgumentLoc(
4582           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4583           TemplateArgumentLocInfo());
4584     else if (Arg.getKind() == TemplateArgument::NullPtr)
4585       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4586                                    TemplateArgumentLocInfo());
4587     else
4588       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4589                                    TemplateArgumentLocInfo());
4590 
4591     return false;
4592   }
4593 
4594   case TemplateArgument::Type: {
4595     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4596     if (!DI)
4597       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4598 
4599     DI = getDerived().TransformType(DI);
4600     if (!DI)
4601       return true;
4602 
4603     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4604     return false;
4605   }
4606 
4607   case TemplateArgument::Template: {
4608     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4609     if (QualifierLoc) {
4610       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4611       if (!QualifierLoc)
4612         return true;
4613     }
4614 
4615     CXXScopeSpec SS;
4616     SS.Adopt(QualifierLoc);
4617     TemplateName Template = getDerived().TransformTemplateName(
4618         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4619     if (Template.isNull())
4620       return true;
4621 
4622     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4623                                  QualifierLoc, Input.getTemplateNameLoc());
4624     return false;
4625   }
4626 
4627   case TemplateArgument::TemplateExpansion:
4628     llvm_unreachable("Caller should expand pack expansions");
4629 
4630   case TemplateArgument::Expression: {
4631     // Template argument expressions are constant expressions.
4632     EnterExpressionEvaluationContext Unevaluated(
4633         getSema(),
4634         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4635                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4636         Sema::ReuseLambdaContextDecl, /*ExprContext=*/
4637         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4638 
4639     Expr *InputExpr = Input.getSourceExpression();
4640     if (!InputExpr)
4641       InputExpr = Input.getArgument().getAsExpr();
4642 
4643     ExprResult E = getDerived().TransformExpr(InputExpr);
4644     E = SemaRef.ActOnConstantExpression(E);
4645     if (E.isInvalid())
4646       return true;
4647     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4648     return false;
4649   }
4650   }
4651 
4652   // Work around bogus GCC warning
4653   return true;
4654 }
4655 
4656 /// Iterator adaptor that invents template argument location information
4657 /// for each of the template arguments in its underlying iterator.
4658 template<typename Derived, typename InputIterator>
4659 class TemplateArgumentLocInventIterator {
4660   TreeTransform<Derived> &Self;
4661   InputIterator Iter;
4662 
4663 public:
4664   typedef TemplateArgumentLoc value_type;
4665   typedef TemplateArgumentLoc reference;
4666   typedef typename std::iterator_traits<InputIterator>::difference_type
4667     difference_type;
4668   typedef std::input_iterator_tag iterator_category;
4669 
4670   class pointer {
4671     TemplateArgumentLoc Arg;
4672 
4673   public:
4674     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4675 
4676     const TemplateArgumentLoc *operator->() const { return &Arg; }
4677   };
4678 
4679   TemplateArgumentLocInventIterator() { }
4680 
4681   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4682                                              InputIterator Iter)
4683     : Self(Self), Iter(Iter) { }
4684 
4685   TemplateArgumentLocInventIterator &operator++() {
4686     ++Iter;
4687     return *this;
4688   }
4689 
4690   TemplateArgumentLocInventIterator operator++(int) {
4691     TemplateArgumentLocInventIterator Old(*this);
4692     ++(*this);
4693     return Old;
4694   }
4695 
4696   reference operator*() const {
4697     TemplateArgumentLoc Result;
4698     Self.InventTemplateArgumentLoc(*Iter, Result);
4699     return Result;
4700   }
4701 
4702   pointer operator->() const { return pointer(**this); }
4703 
4704   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4705                          const TemplateArgumentLocInventIterator &Y) {
4706     return X.Iter == Y.Iter;
4707   }
4708 
4709   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4710                          const TemplateArgumentLocInventIterator &Y) {
4711     return X.Iter != Y.Iter;
4712   }
4713 };
4714 
4715 template<typename Derived>
4716 template<typename InputIterator>
4717 bool TreeTransform<Derived>::TransformTemplateArguments(
4718     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4719     bool Uneval) {
4720   for (; First != Last; ++First) {
4721     TemplateArgumentLoc Out;
4722     TemplateArgumentLoc In = *First;
4723 
4724     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4725       // Unpack argument packs, which we translate them into separate
4726       // arguments.
4727       // FIXME: We could do much better if we could guarantee that the
4728       // TemplateArgumentLocInfo for the pack expansion would be usable for
4729       // all of the template arguments in the argument pack.
4730       typedef TemplateArgumentLocInventIterator<Derived,
4731                                                 TemplateArgument::pack_iterator>
4732         PackLocIterator;
4733       if (TransformTemplateArguments(PackLocIterator(*this,
4734                                                  In.getArgument().pack_begin()),
4735                                      PackLocIterator(*this,
4736                                                    In.getArgument().pack_end()),
4737                                      Outputs, Uneval))
4738         return true;
4739 
4740       continue;
4741     }
4742 
4743     if (In.getArgument().isPackExpansion()) {
4744       // We have a pack expansion, for which we will be substituting into
4745       // the pattern.
4746       SourceLocation Ellipsis;
4747       std::optional<unsigned> OrigNumExpansions;
4748       TemplateArgumentLoc Pattern
4749         = getSema().getTemplateArgumentPackExpansionPattern(
4750               In, Ellipsis, OrigNumExpansions);
4751 
4752       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4753       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4754       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4755 
4756       // Determine whether the set of unexpanded parameter packs can and should
4757       // be expanded.
4758       bool Expand = true;
4759       bool RetainExpansion = false;
4760       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4761       if (getDerived().TryExpandParameterPacks(Ellipsis,
4762                                                Pattern.getSourceRange(),
4763                                                Unexpanded,
4764                                                Expand,
4765                                                RetainExpansion,
4766                                                NumExpansions))
4767         return true;
4768 
4769       if (!Expand) {
4770         // The transform has determined that we should perform a simple
4771         // transformation on the pack expansion, producing another pack
4772         // expansion.
4773         TemplateArgumentLoc OutPattern;
4774         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4775         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4776           return true;
4777 
4778         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4779                                                 NumExpansions);
4780         if (Out.getArgument().isNull())
4781           return true;
4782 
4783         Outputs.addArgument(Out);
4784         continue;
4785       }
4786 
4787       // The transform has determined that we should perform an elementwise
4788       // expansion of the pattern. Do so.
4789       for (unsigned I = 0; I != *NumExpansions; ++I) {
4790         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4791 
4792         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4793           return true;
4794 
4795         if (Out.getArgument().containsUnexpandedParameterPack()) {
4796           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4797                                                   OrigNumExpansions);
4798           if (Out.getArgument().isNull())
4799             return true;
4800         }
4801 
4802         Outputs.addArgument(Out);
4803       }
4804 
4805       // If we're supposed to retain a pack expansion, do so by temporarily
4806       // forgetting the partially-substituted parameter pack.
4807       if (RetainExpansion) {
4808         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4809 
4810         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4811           return true;
4812 
4813         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4814                                                 OrigNumExpansions);
4815         if (Out.getArgument().isNull())
4816           return true;
4817 
4818         Outputs.addArgument(Out);
4819       }
4820 
4821       continue;
4822     }
4823 
4824     // The simple case:
4825     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4826       return true;
4827 
4828     Outputs.addArgument(Out);
4829   }
4830 
4831   return false;
4832 
4833 }
4834 
4835 //===----------------------------------------------------------------------===//
4836 // Type transformation
4837 //===----------------------------------------------------------------------===//
4838 
4839 template<typename Derived>
4840 QualType TreeTransform<Derived>::TransformType(QualType T) {
4841   if (getDerived().AlreadyTransformed(T))
4842     return T;
4843 
4844   // Temporary workaround.  All of these transformations should
4845   // eventually turn into transformations on TypeLocs.
4846   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4847                                                 getDerived().getBaseLocation());
4848 
4849   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4850 
4851   if (!NewDI)
4852     return QualType();
4853 
4854   return NewDI->getType();
4855 }
4856 
4857 template<typename Derived>
4858 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4859   // Refine the base location to the type's location.
4860   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4861                        getDerived().getBaseEntity());
4862   if (getDerived().AlreadyTransformed(DI->getType()))
4863     return DI;
4864 
4865   TypeLocBuilder TLB;
4866 
4867   TypeLoc TL = DI->getTypeLoc();
4868   TLB.reserve(TL.getFullDataSize());
4869 
4870   QualType Result = getDerived().TransformType(TLB, TL);
4871   if (Result.isNull())
4872     return nullptr;
4873 
4874   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4875 }
4876 
4877 template<typename Derived>
4878 QualType
4879 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4880   switch (T.getTypeLocClass()) {
4881 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4882 #define TYPELOC(CLASS, PARENT)                                                 \
4883   case TypeLoc::CLASS:                                                         \
4884     return getDerived().Transform##CLASS##Type(TLB,                            \
4885                                                T.castAs<CLASS##TypeLoc>());
4886 #include "clang/AST/TypeLocNodes.def"
4887   }
4888 
4889   llvm_unreachable("unhandled type loc!");
4890 }
4891 
4892 template<typename Derived>
4893 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4894   if (!isa<DependentNameType>(T))
4895     return TransformType(T);
4896 
4897   if (getDerived().AlreadyTransformed(T))
4898     return T;
4899   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4900                                                 getDerived().getBaseLocation());
4901   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4902   return NewDI ? NewDI->getType() : QualType();
4903 }
4904 
4905 template<typename Derived>
4906 TypeSourceInfo *
4907 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4908   if (!isa<DependentNameType>(DI->getType()))
4909     return TransformType(DI);
4910 
4911   // Refine the base location to the type's location.
4912   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4913                        getDerived().getBaseEntity());
4914   if (getDerived().AlreadyTransformed(DI->getType()))
4915     return DI;
4916 
4917   TypeLocBuilder TLB;
4918 
4919   TypeLoc TL = DI->getTypeLoc();
4920   TLB.reserve(TL.getFullDataSize());
4921 
4922   auto QTL = TL.getAs<QualifiedTypeLoc>();
4923   if (QTL)
4924     TL = QTL.getUnqualifiedLoc();
4925 
4926   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4927 
4928   QualType Result = getDerived().TransformDependentNameType(
4929       TLB, DNTL, /*DeducedTSTContext*/true);
4930   if (Result.isNull())
4931     return nullptr;
4932 
4933   if (QTL) {
4934     Result = getDerived().RebuildQualifiedType(Result, QTL);
4935     if (Result.isNull())
4936       return nullptr;
4937     TLB.TypeWasModifiedSafely(Result);
4938   }
4939 
4940   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4941 }
4942 
4943 template<typename Derived>
4944 QualType
4945 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4946                                                QualifiedTypeLoc T) {
4947   QualType Result;
4948   TypeLoc UnqualTL = T.getUnqualifiedLoc();
4949   auto SuppressObjCLifetime =
4950       T.getType().getLocalQualifiers().hasObjCLifetime();
4951   if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) {
4952     Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
4953                                                         SuppressObjCLifetime);
4954   } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) {
4955     Result = getDerived().TransformSubstTemplateTypeParmPackType(
4956         TLB, STTP, SuppressObjCLifetime);
4957   } else {
4958     Result = getDerived().TransformType(TLB, UnqualTL);
4959   }
4960 
4961   if (Result.isNull())
4962     return QualType();
4963 
4964   Result = getDerived().RebuildQualifiedType(Result, T);
4965 
4966   if (Result.isNull())
4967     return QualType();
4968 
4969   // RebuildQualifiedType might have updated the type, but not in a way
4970   // that invalidates the TypeLoc. (There's no location information for
4971   // qualifiers.)
4972   TLB.TypeWasModifiedSafely(Result);
4973 
4974   return Result;
4975 }
4976 
4977 template <typename Derived>
4978 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4979                                                       QualifiedTypeLoc TL) {
4980 
4981   SourceLocation Loc = TL.getBeginLoc();
4982   Qualifiers Quals = TL.getType().getLocalQualifiers();
4983 
4984   if ((T.getAddressSpace() != LangAS::Default &&
4985        Quals.getAddressSpace() != LangAS::Default) &&
4986       T.getAddressSpace() != Quals.getAddressSpace()) {
4987     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4988         << TL.getType() << T;
4989     return QualType();
4990   }
4991 
4992   // C++ [dcl.fct]p7:
4993   //   [When] adding cv-qualifications on top of the function type [...] the
4994   //   cv-qualifiers are ignored.
4995   if (T->isFunctionType()) {
4996     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4997                                                      Quals.getAddressSpace());
4998     return T;
4999   }
5000 
5001   // C++ [dcl.ref]p1:
5002   //   when the cv-qualifiers are introduced through the use of a typedef-name
5003   //   or decltype-specifier [...] the cv-qualifiers are ignored.
5004   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
5005   // applied to a reference type.
5006   if (T->isReferenceType()) {
5007     // The only qualifier that applies to a reference type is restrict.
5008     if (!Quals.hasRestrict())
5009       return T;
5010     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
5011   }
5012 
5013   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
5014   // resulting type.
5015   if (Quals.hasObjCLifetime()) {
5016     if (!T->isObjCLifetimeType() && !T->isDependentType())
5017       Quals.removeObjCLifetime();
5018     else if (T.getObjCLifetime()) {
5019       // Objective-C ARC:
5020       //   A lifetime qualifier applied to a substituted template parameter
5021       //   overrides the lifetime qualifier from the template argument.
5022       const AutoType *AutoTy;
5023       if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
5024         // 'auto' types behave the same way as template parameters.
5025         QualType Deduced = AutoTy->getDeducedType();
5026         Qualifiers Qs = Deduced.getQualifiers();
5027         Qs.removeObjCLifetime();
5028         Deduced =
5029             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
5030         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
5031                                         AutoTy->isDependentType(),
5032                                         /*isPack=*/false,
5033                                         AutoTy->getTypeConstraintConcept(),
5034                                         AutoTy->getTypeConstraintArguments());
5035       } else {
5036         // Otherwise, complain about the addition of a qualifier to an
5037         // already-qualified type.
5038         // FIXME: Why is this check not in Sema::BuildQualifiedType?
5039         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
5040         Quals.removeObjCLifetime();
5041       }
5042     }
5043   }
5044 
5045   return SemaRef.BuildQualifiedType(T, Loc, Quals);
5046 }
5047 
5048 template<typename Derived>
5049 TypeLoc
5050 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
5051                                                    QualType ObjectType,
5052                                                    NamedDecl *UnqualLookup,
5053                                                    CXXScopeSpec &SS) {
5054   if (getDerived().AlreadyTransformed(TL.getType()))
5055     return TL;
5056 
5057   TypeSourceInfo *TSI =
5058       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
5059   if (TSI)
5060     return TSI->getTypeLoc();
5061   return TypeLoc();
5062 }
5063 
5064 template<typename Derived>
5065 TypeSourceInfo *
5066 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5067                                                    QualType ObjectType,
5068                                                    NamedDecl *UnqualLookup,
5069                                                    CXXScopeSpec &SS) {
5070   if (getDerived().AlreadyTransformed(TSInfo->getType()))
5071     return TSInfo;
5072 
5073   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5074                                    UnqualLookup, SS);
5075 }
5076 
5077 template <typename Derived>
5078 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5079     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5080     CXXScopeSpec &SS) {
5081   QualType T = TL.getType();
5082   assert(!getDerived().AlreadyTransformed(T));
5083 
5084   TypeLocBuilder TLB;
5085   QualType Result;
5086 
5087   if (isa<TemplateSpecializationType>(T)) {
5088     TemplateSpecializationTypeLoc SpecTL =
5089         TL.castAs<TemplateSpecializationTypeLoc>();
5090 
5091     TemplateName Template = getDerived().TransformTemplateName(
5092         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5093         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
5094     if (Template.isNull())
5095       return nullptr;
5096 
5097     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5098                                                               Template);
5099   } else if (isa<DependentTemplateSpecializationType>(T)) {
5100     DependentTemplateSpecializationTypeLoc SpecTL =
5101         TL.castAs<DependentTemplateSpecializationTypeLoc>();
5102 
5103     TemplateName Template
5104       = getDerived().RebuildTemplateName(SS,
5105                                          SpecTL.getTemplateKeywordLoc(),
5106                                          *SpecTL.getTypePtr()->getIdentifier(),
5107                                          SpecTL.getTemplateNameLoc(),
5108                                          ObjectType, UnqualLookup,
5109                                          /*AllowInjectedClassName*/true);
5110     if (Template.isNull())
5111       return nullptr;
5112 
5113     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5114                                                                        SpecTL,
5115                                                                        Template,
5116                                                                        SS);
5117   } else {
5118     // Nothing special needs to be done for these.
5119     Result = getDerived().TransformType(TLB, TL);
5120   }
5121 
5122   if (Result.isNull())
5123     return nullptr;
5124 
5125   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5126 }
5127 
5128 template <class TyLoc> static inline
5129 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
5130   TyLoc NewT = TLB.push<TyLoc>(T.getType());
5131   NewT.setNameLoc(T.getNameLoc());
5132   return T.getType();
5133 }
5134 
5135 template<typename Derived>
5136 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5137                                                       BuiltinTypeLoc T) {
5138   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
5139   NewT.setBuiltinLoc(T.getBuiltinLoc());
5140   if (T.needsExtraLocalData())
5141     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
5142   return T.getType();
5143 }
5144 
5145 template<typename Derived>
5146 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5147                                                       ComplexTypeLoc T) {
5148   // FIXME: recurse?
5149   return TransformTypeSpecType(TLB, T);
5150 }
5151 
5152 template <typename Derived>
5153 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5154                                                        AdjustedTypeLoc TL) {
5155   // Adjustments applied during transformation are handled elsewhere.
5156   return getDerived().TransformType(TLB, TL.getOriginalLoc());
5157 }
5158 
5159 template<typename Derived>
5160 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5161                                                       DecayedTypeLoc TL) {
5162   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5163   if (OriginalType.isNull())
5164     return QualType();
5165 
5166   QualType Result = TL.getType();
5167   if (getDerived().AlwaysRebuild() ||
5168       OriginalType != TL.getOriginalLoc().getType())
5169     Result = SemaRef.Context.getDecayedType(OriginalType);
5170   TLB.push<DecayedTypeLoc>(Result);
5171   // Nothing to set for DecayedTypeLoc.
5172   return Result;
5173 }
5174 
5175 template<typename Derived>
5176 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5177                                                       PointerTypeLoc TL) {
5178   QualType PointeeType
5179     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5180   if (PointeeType.isNull())
5181     return QualType();
5182 
5183   QualType Result = TL.getType();
5184   if (PointeeType->getAs<ObjCObjectType>()) {
5185     // A dependent pointer type 'T *' has is being transformed such
5186     // that an Objective-C class type is being replaced for 'T'. The
5187     // resulting pointer type is an ObjCObjectPointerType, not a
5188     // PointerType.
5189     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5190 
5191     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5192     NewT.setStarLoc(TL.getStarLoc());
5193     return Result;
5194   }
5195 
5196   if (getDerived().AlwaysRebuild() ||
5197       PointeeType != TL.getPointeeLoc().getType()) {
5198     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5199     if (Result.isNull())
5200       return QualType();
5201   }
5202 
5203   // Objective-C ARC can add lifetime qualifiers to the type that we're
5204   // pointing to.
5205   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5206 
5207   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5208   NewT.setSigilLoc(TL.getSigilLoc());
5209   return Result;
5210 }
5211 
5212 template<typename Derived>
5213 QualType
5214 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5215                                                   BlockPointerTypeLoc TL) {
5216   QualType PointeeType
5217     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5218   if (PointeeType.isNull())
5219     return QualType();
5220 
5221   QualType Result = TL.getType();
5222   if (getDerived().AlwaysRebuild() ||
5223       PointeeType != TL.getPointeeLoc().getType()) {
5224     Result = getDerived().RebuildBlockPointerType(PointeeType,
5225                                                   TL.getSigilLoc());
5226     if (Result.isNull())
5227       return QualType();
5228   }
5229 
5230   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5231   NewT.setSigilLoc(TL.getSigilLoc());
5232   return Result;
5233 }
5234 
5235 /// Transforms a reference type.  Note that somewhat paradoxically we
5236 /// don't care whether the type itself is an l-value type or an r-value
5237 /// type;  we only care if the type was *written* as an l-value type
5238 /// or an r-value type.
5239 template<typename Derived>
5240 QualType
5241 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5242                                                ReferenceTypeLoc TL) {
5243   const ReferenceType *T = TL.getTypePtr();
5244 
5245   // Note that this works with the pointee-as-written.
5246   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5247   if (PointeeType.isNull())
5248     return QualType();
5249 
5250   QualType Result = TL.getType();
5251   if (getDerived().AlwaysRebuild() ||
5252       PointeeType != T->getPointeeTypeAsWritten()) {
5253     Result = getDerived().RebuildReferenceType(PointeeType,
5254                                                T->isSpelledAsLValue(),
5255                                                TL.getSigilLoc());
5256     if (Result.isNull())
5257       return QualType();
5258   }
5259 
5260   // Objective-C ARC can add lifetime qualifiers to the type that we're
5261   // referring to.
5262   TLB.TypeWasModifiedSafely(
5263       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5264 
5265   // r-value references can be rebuilt as l-value references.
5266   ReferenceTypeLoc NewTL;
5267   if (isa<LValueReferenceType>(Result))
5268     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5269   else
5270     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5271   NewTL.setSigilLoc(TL.getSigilLoc());
5272 
5273   return Result;
5274 }
5275 
5276 template<typename Derived>
5277 QualType
5278 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5279                                                  LValueReferenceTypeLoc TL) {
5280   return TransformReferenceType(TLB, TL);
5281 }
5282 
5283 template<typename Derived>
5284 QualType
5285 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5286                                                  RValueReferenceTypeLoc TL) {
5287   return TransformReferenceType(TLB, TL);
5288 }
5289 
5290 template<typename Derived>
5291 QualType
5292 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5293                                                    MemberPointerTypeLoc TL) {
5294   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5295   if (PointeeType.isNull())
5296     return QualType();
5297 
5298   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5299   TypeSourceInfo *NewClsTInfo = nullptr;
5300   if (OldClsTInfo) {
5301     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5302     if (!NewClsTInfo)
5303       return QualType();
5304   }
5305 
5306   const MemberPointerType *T = TL.getTypePtr();
5307   QualType OldClsType = QualType(T->getClass(), 0);
5308   QualType NewClsType;
5309   if (NewClsTInfo)
5310     NewClsType = NewClsTInfo->getType();
5311   else {
5312     NewClsType = getDerived().TransformType(OldClsType);
5313     if (NewClsType.isNull())
5314       return QualType();
5315   }
5316 
5317   QualType Result = TL.getType();
5318   if (getDerived().AlwaysRebuild() ||
5319       PointeeType != T->getPointeeType() ||
5320       NewClsType != OldClsType) {
5321     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5322                                                    TL.getStarLoc());
5323     if (Result.isNull())
5324       return QualType();
5325   }
5326 
5327   // If we had to adjust the pointee type when building a member pointer, make
5328   // sure to push TypeLoc info for it.
5329   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5330   if (MPT && PointeeType != MPT->getPointeeType()) {
5331     assert(isa<AdjustedType>(MPT->getPointeeType()));
5332     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5333   }
5334 
5335   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5336   NewTL.setSigilLoc(TL.getSigilLoc());
5337   NewTL.setClassTInfo(NewClsTInfo);
5338 
5339   return Result;
5340 }
5341 
5342 template<typename Derived>
5343 QualType
5344 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5345                                                    ConstantArrayTypeLoc TL) {
5346   const ConstantArrayType *T = TL.getTypePtr();
5347   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5348   if (ElementType.isNull())
5349     return QualType();
5350 
5351   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5352   Expr *OldSize = TL.getSizeExpr();
5353   if (!OldSize)
5354     OldSize = const_cast<Expr*>(T->getSizeExpr());
5355   Expr *NewSize = nullptr;
5356   if (OldSize) {
5357     EnterExpressionEvaluationContext Unevaluated(
5358         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5359     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5360     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5361   }
5362 
5363   QualType Result = TL.getType();
5364   if (getDerived().AlwaysRebuild() ||
5365       ElementType != T->getElementType() ||
5366       (T->getSizeExpr() && NewSize != OldSize)) {
5367     Result = getDerived().RebuildConstantArrayType(ElementType,
5368                                                    T->getSizeModifier(),
5369                                                    T->getSize(), NewSize,
5370                                              T->getIndexTypeCVRQualifiers(),
5371                                                    TL.getBracketsRange());
5372     if (Result.isNull())
5373       return QualType();
5374   }
5375 
5376   // We might have either a ConstantArrayType or a VariableArrayType now:
5377   // a ConstantArrayType is allowed to have an element type which is a
5378   // VariableArrayType if the type is dependent.  Fortunately, all array
5379   // types have the same location layout.
5380   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5381   NewTL.setLBracketLoc(TL.getLBracketLoc());
5382   NewTL.setRBracketLoc(TL.getRBracketLoc());
5383   NewTL.setSizeExpr(NewSize);
5384 
5385   return Result;
5386 }
5387 
5388 template<typename Derived>
5389 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5390                                               TypeLocBuilder &TLB,
5391                                               IncompleteArrayTypeLoc TL) {
5392   const IncompleteArrayType *T = TL.getTypePtr();
5393   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5394   if (ElementType.isNull())
5395     return QualType();
5396 
5397   QualType Result = TL.getType();
5398   if (getDerived().AlwaysRebuild() ||
5399       ElementType != T->getElementType()) {
5400     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5401                                                      T->getSizeModifier(),
5402                                            T->getIndexTypeCVRQualifiers(),
5403                                                      TL.getBracketsRange());
5404     if (Result.isNull())
5405       return QualType();
5406   }
5407 
5408   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5409   NewTL.setLBracketLoc(TL.getLBracketLoc());
5410   NewTL.setRBracketLoc(TL.getRBracketLoc());
5411   NewTL.setSizeExpr(nullptr);
5412 
5413   return Result;
5414 }
5415 
5416 template<typename Derived>
5417 QualType
5418 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5419                                                    VariableArrayTypeLoc TL) {
5420   const VariableArrayType *T = TL.getTypePtr();
5421   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5422   if (ElementType.isNull())
5423     return QualType();
5424 
5425   ExprResult SizeResult;
5426   {
5427     EnterExpressionEvaluationContext Context(
5428         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5429     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5430   }
5431   if (SizeResult.isInvalid())
5432     return QualType();
5433   SizeResult =
5434       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5435   if (SizeResult.isInvalid())
5436     return QualType();
5437 
5438   Expr *Size = SizeResult.get();
5439 
5440   QualType Result = TL.getType();
5441   if (getDerived().AlwaysRebuild() ||
5442       ElementType != T->getElementType() ||
5443       Size != T->getSizeExpr()) {
5444     Result = getDerived().RebuildVariableArrayType(ElementType,
5445                                                    T->getSizeModifier(),
5446                                                    Size,
5447                                              T->getIndexTypeCVRQualifiers(),
5448                                                    TL.getBracketsRange());
5449     if (Result.isNull())
5450       return QualType();
5451   }
5452 
5453   // We might have constant size array now, but fortunately it has the same
5454   // location layout.
5455   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5456   NewTL.setLBracketLoc(TL.getLBracketLoc());
5457   NewTL.setRBracketLoc(TL.getRBracketLoc());
5458   NewTL.setSizeExpr(Size);
5459 
5460   return Result;
5461 }
5462 
5463 template<typename Derived>
5464 QualType
5465 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5466                                              DependentSizedArrayTypeLoc TL) {
5467   const DependentSizedArrayType *T = TL.getTypePtr();
5468   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5469   if (ElementType.isNull())
5470     return QualType();
5471 
5472   // Array bounds are constant expressions.
5473   EnterExpressionEvaluationContext Unevaluated(
5474       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5475 
5476   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5477   Expr *origSize = TL.getSizeExpr();
5478   if (!origSize) origSize = T->getSizeExpr();
5479 
5480   ExprResult sizeResult
5481     = getDerived().TransformExpr(origSize);
5482   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5483   if (sizeResult.isInvalid())
5484     return QualType();
5485 
5486   Expr *size = sizeResult.get();
5487 
5488   QualType Result = TL.getType();
5489   if (getDerived().AlwaysRebuild() ||
5490       ElementType != T->getElementType() ||
5491       size != origSize) {
5492     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5493                                                          T->getSizeModifier(),
5494                                                          size,
5495                                                 T->getIndexTypeCVRQualifiers(),
5496                                                         TL.getBracketsRange());
5497     if (Result.isNull())
5498       return QualType();
5499   }
5500 
5501   // We might have any sort of array type now, but fortunately they
5502   // all have the same location layout.
5503   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5504   NewTL.setLBracketLoc(TL.getLBracketLoc());
5505   NewTL.setRBracketLoc(TL.getRBracketLoc());
5506   NewTL.setSizeExpr(size);
5507 
5508   return Result;
5509 }
5510 
5511 template <typename Derived>
5512 QualType TreeTransform<Derived>::TransformDependentVectorType(
5513     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5514   const DependentVectorType *T = TL.getTypePtr();
5515   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5516   if (ElementType.isNull())
5517     return QualType();
5518 
5519   EnterExpressionEvaluationContext Unevaluated(
5520       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5521 
5522   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5523   Size = SemaRef.ActOnConstantExpression(Size);
5524   if (Size.isInvalid())
5525     return QualType();
5526 
5527   QualType Result = TL.getType();
5528   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5529       Size.get() != T->getSizeExpr()) {
5530     Result = getDerived().RebuildDependentVectorType(
5531         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5532     if (Result.isNull())
5533       return QualType();
5534   }
5535 
5536   // Result might be dependent or not.
5537   if (isa<DependentVectorType>(Result)) {
5538     DependentVectorTypeLoc NewTL =
5539         TLB.push<DependentVectorTypeLoc>(Result);
5540     NewTL.setNameLoc(TL.getNameLoc());
5541   } else {
5542     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5543     NewTL.setNameLoc(TL.getNameLoc());
5544   }
5545 
5546   return Result;
5547 }
5548 
5549 template<typename Derived>
5550 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5551                                       TypeLocBuilder &TLB,
5552                                       DependentSizedExtVectorTypeLoc TL) {
5553   const DependentSizedExtVectorType *T = TL.getTypePtr();
5554 
5555   // FIXME: ext vector locs should be nested
5556   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5557   if (ElementType.isNull())
5558     return QualType();
5559 
5560   // Vector sizes are constant expressions.
5561   EnterExpressionEvaluationContext Unevaluated(
5562       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5563 
5564   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5565   Size = SemaRef.ActOnConstantExpression(Size);
5566   if (Size.isInvalid())
5567     return QualType();
5568 
5569   QualType Result = TL.getType();
5570   if (getDerived().AlwaysRebuild() ||
5571       ElementType != T->getElementType() ||
5572       Size.get() != T->getSizeExpr()) {
5573     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5574                                                              Size.get(),
5575                                                          T->getAttributeLoc());
5576     if (Result.isNull())
5577       return QualType();
5578   }
5579 
5580   // Result might be dependent or not.
5581   if (isa<DependentSizedExtVectorType>(Result)) {
5582     DependentSizedExtVectorTypeLoc NewTL
5583       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5584     NewTL.setNameLoc(TL.getNameLoc());
5585   } else {
5586     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5587     NewTL.setNameLoc(TL.getNameLoc());
5588   }
5589 
5590   return Result;
5591 }
5592 
5593 template <typename Derived>
5594 QualType
5595 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5596                                                     ConstantMatrixTypeLoc TL) {
5597   const ConstantMatrixType *T = TL.getTypePtr();
5598   QualType ElementType = getDerived().TransformType(T->getElementType());
5599   if (ElementType.isNull())
5600     return QualType();
5601 
5602   QualType Result = TL.getType();
5603   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5604     Result = getDerived().RebuildConstantMatrixType(
5605         ElementType, T->getNumRows(), T->getNumColumns());
5606     if (Result.isNull())
5607       return QualType();
5608   }
5609 
5610   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5611   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5612   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5613   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5614   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5615 
5616   return Result;
5617 }
5618 
5619 template <typename Derived>
5620 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5621     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5622   const DependentSizedMatrixType *T = TL.getTypePtr();
5623 
5624   QualType ElementType = getDerived().TransformType(T->getElementType());
5625   if (ElementType.isNull()) {
5626     return QualType();
5627   }
5628 
5629   // Matrix dimensions are constant expressions.
5630   EnterExpressionEvaluationContext Unevaluated(
5631       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5632 
5633   Expr *origRows = TL.getAttrRowOperand();
5634   if (!origRows)
5635     origRows = T->getRowExpr();
5636   Expr *origColumns = TL.getAttrColumnOperand();
5637   if (!origColumns)
5638     origColumns = T->getColumnExpr();
5639 
5640   ExprResult rowResult = getDerived().TransformExpr(origRows);
5641   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5642   if (rowResult.isInvalid())
5643     return QualType();
5644 
5645   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5646   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5647   if (columnResult.isInvalid())
5648     return QualType();
5649 
5650   Expr *rows = rowResult.get();
5651   Expr *columns = columnResult.get();
5652 
5653   QualType Result = TL.getType();
5654   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5655       rows != origRows || columns != origColumns) {
5656     Result = getDerived().RebuildDependentSizedMatrixType(
5657         ElementType, rows, columns, T->getAttributeLoc());
5658 
5659     if (Result.isNull())
5660       return QualType();
5661   }
5662 
5663   // We might have any sort of matrix type now, but fortunately they
5664   // all have the same location layout.
5665   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5666   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5667   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5668   NewTL.setAttrRowOperand(rows);
5669   NewTL.setAttrColumnOperand(columns);
5670   return Result;
5671 }
5672 
5673 template <typename Derived>
5674 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5675     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5676   const DependentAddressSpaceType *T = TL.getTypePtr();
5677 
5678   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5679 
5680   if (pointeeType.isNull())
5681     return QualType();
5682 
5683   // Address spaces are constant expressions.
5684   EnterExpressionEvaluationContext Unevaluated(
5685       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5686 
5687   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5688   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5689   if (AddrSpace.isInvalid())
5690     return QualType();
5691 
5692   QualType Result = TL.getType();
5693   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5694       AddrSpace.get() != T->getAddrSpaceExpr()) {
5695     Result = getDerived().RebuildDependentAddressSpaceType(
5696         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5697     if (Result.isNull())
5698       return QualType();
5699   }
5700 
5701   // Result might be dependent or not.
5702   if (isa<DependentAddressSpaceType>(Result)) {
5703     DependentAddressSpaceTypeLoc NewTL =
5704         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5705 
5706     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5707     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5708     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5709 
5710   } else {
5711     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5712         Result, getDerived().getBaseLocation());
5713     TransformType(TLB, DI->getTypeLoc());
5714   }
5715 
5716   return Result;
5717 }
5718 
5719 template <typename Derived>
5720 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5721                                                      VectorTypeLoc TL) {
5722   const VectorType *T = TL.getTypePtr();
5723   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5724   if (ElementType.isNull())
5725     return QualType();
5726 
5727   QualType Result = TL.getType();
5728   if (getDerived().AlwaysRebuild() ||
5729       ElementType != T->getElementType()) {
5730     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5731                                             T->getVectorKind());
5732     if (Result.isNull())
5733       return QualType();
5734   }
5735 
5736   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5737   NewTL.setNameLoc(TL.getNameLoc());
5738 
5739   return Result;
5740 }
5741 
5742 template<typename Derived>
5743 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5744                                                         ExtVectorTypeLoc 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().RebuildExtVectorType(ElementType,
5754                                                T->getNumElements(),
5755                                                /*FIXME*/ SourceLocation());
5756     if (Result.isNull())
5757       return QualType();
5758   }
5759 
5760   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5761   NewTL.setNameLoc(TL.getNameLoc());
5762 
5763   return Result;
5764 }
5765 
5766 template <typename Derived>
5767 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5768     ParmVarDecl *OldParm, int indexAdjustment,
5769     std::optional<unsigned> NumExpansions, bool ExpectParameterPack) {
5770   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5771   TypeSourceInfo *NewDI = nullptr;
5772 
5773   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5774     // If we're substituting into a pack expansion type and we know the
5775     // length we want to expand to, just substitute for the pattern.
5776     TypeLoc OldTL = OldDI->getTypeLoc();
5777     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5778 
5779     TypeLocBuilder TLB;
5780     TypeLoc NewTL = OldDI->getTypeLoc();
5781     TLB.reserve(NewTL.getFullDataSize());
5782 
5783     QualType Result = getDerived().TransformType(TLB,
5784                                                OldExpansionTL.getPatternLoc());
5785     if (Result.isNull())
5786       return nullptr;
5787 
5788     Result = RebuildPackExpansionType(Result,
5789                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5790                                       OldExpansionTL.getEllipsisLoc(),
5791                                       NumExpansions);
5792     if (Result.isNull())
5793       return nullptr;
5794 
5795     PackExpansionTypeLoc NewExpansionTL
5796       = TLB.push<PackExpansionTypeLoc>(Result);
5797     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5798     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5799   } else
5800     NewDI = getDerived().TransformType(OldDI);
5801   if (!NewDI)
5802     return nullptr;
5803 
5804   if (NewDI == OldDI && indexAdjustment == 0)
5805     return OldParm;
5806 
5807   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5808                                              OldParm->getDeclContext(),
5809                                              OldParm->getInnerLocStart(),
5810                                              OldParm->getLocation(),
5811                                              OldParm->getIdentifier(),
5812                                              NewDI->getType(),
5813                                              NewDI,
5814                                              OldParm->getStorageClass(),
5815                                              /* DefArg */ nullptr);
5816   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5817                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5818   transformedLocalDecl(OldParm, {newParm});
5819   return newParm;
5820 }
5821 
5822 template <typename Derived>
5823 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5824     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5825     const QualType *ParamTypes,
5826     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5827     SmallVectorImpl<QualType> &OutParamTypes,
5828     SmallVectorImpl<ParmVarDecl *> *PVars,
5829     Sema::ExtParameterInfoBuilder &PInfos,
5830     unsigned *LastParamTransformed) {
5831   int indexAdjustment = 0;
5832 
5833   unsigned NumParams = Params.size();
5834   for (unsigned i = 0; i != NumParams; ++i) {
5835     if (LastParamTransformed)
5836       *LastParamTransformed = i;
5837     if (ParmVarDecl *OldParm = Params[i]) {
5838       assert(OldParm->getFunctionScopeIndex() == i);
5839 
5840       std::optional<unsigned> NumExpansions;
5841       ParmVarDecl *NewParm = nullptr;
5842       if (OldParm->isParameterPack()) {
5843         // We have a function parameter pack that may need to be expanded.
5844         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5845 
5846         // Find the parameter packs that could be expanded.
5847         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5848         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5849         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5850         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5851 
5852         // Determine whether we should expand the parameter packs.
5853         bool ShouldExpand = false;
5854         bool RetainExpansion = false;
5855         std::optional<unsigned> OrigNumExpansions;
5856         if (Unexpanded.size() > 0) {
5857           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5858           NumExpansions = OrigNumExpansions;
5859           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5860                                                    Pattern.getSourceRange(),
5861                                                    Unexpanded,
5862                                                    ShouldExpand,
5863                                                    RetainExpansion,
5864                                                    NumExpansions)) {
5865             return true;
5866           }
5867         } else {
5868 #ifndef NDEBUG
5869           const AutoType *AT =
5870               Pattern.getType().getTypePtr()->getContainedAutoType();
5871           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5872                  "Could not find parameter packs or undeduced auto type!");
5873 #endif
5874         }
5875 
5876         if (ShouldExpand) {
5877           // Expand the function parameter pack into multiple, separate
5878           // parameters.
5879           getDerived().ExpandingFunctionParameterPack(OldParm);
5880           for (unsigned I = 0; I != *NumExpansions; ++I) {
5881             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5882             ParmVarDecl *NewParm
5883               = getDerived().TransformFunctionTypeParam(OldParm,
5884                                                         indexAdjustment++,
5885                                                         OrigNumExpansions,
5886                                                 /*ExpectParameterPack=*/false);
5887             if (!NewParm)
5888               return true;
5889 
5890             if (ParamInfos)
5891               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5892             OutParamTypes.push_back(NewParm->getType());
5893             if (PVars)
5894               PVars->push_back(NewParm);
5895           }
5896 
5897           // If we're supposed to retain a pack expansion, do so by temporarily
5898           // forgetting the partially-substituted parameter pack.
5899           if (RetainExpansion) {
5900             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5901             ParmVarDecl *NewParm
5902               = getDerived().TransformFunctionTypeParam(OldParm,
5903                                                         indexAdjustment++,
5904                                                         OrigNumExpansions,
5905                                                 /*ExpectParameterPack=*/false);
5906             if (!NewParm)
5907               return true;
5908 
5909             if (ParamInfos)
5910               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5911             OutParamTypes.push_back(NewParm->getType());
5912             if (PVars)
5913               PVars->push_back(NewParm);
5914           }
5915 
5916           // The next parameter should have the same adjustment as the
5917           // last thing we pushed, but we post-incremented indexAdjustment
5918           // on every push.  Also, if we push nothing, the adjustment should
5919           // go down by one.
5920           indexAdjustment--;
5921 
5922           // We're done with the pack expansion.
5923           continue;
5924         }
5925 
5926         // We'll substitute the parameter now without expanding the pack
5927         // expansion.
5928         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5929         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5930                                                           indexAdjustment,
5931                                                           NumExpansions,
5932                                                   /*ExpectParameterPack=*/true);
5933         assert(NewParm->isParameterPack() &&
5934                "Parameter pack no longer a parameter pack after "
5935                "transformation.");
5936       } else {
5937         NewParm = getDerived().TransformFunctionTypeParam(
5938             OldParm, indexAdjustment, std::nullopt,
5939             /*ExpectParameterPack=*/false);
5940       }
5941 
5942       if (!NewParm)
5943         return true;
5944 
5945       if (ParamInfos)
5946         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5947       OutParamTypes.push_back(NewParm->getType());
5948       if (PVars)
5949         PVars->push_back(NewParm);
5950       continue;
5951     }
5952 
5953     // Deal with the possibility that we don't have a parameter
5954     // declaration for this parameter.
5955     assert(ParamTypes);
5956     QualType OldType = ParamTypes[i];
5957     bool IsPackExpansion = false;
5958     std::optional<unsigned> NumExpansions;
5959     QualType NewType;
5960     if (const PackExpansionType *Expansion
5961                                        = dyn_cast<PackExpansionType>(OldType)) {
5962       // We have a function parameter pack that may need to be expanded.
5963       QualType Pattern = Expansion->getPattern();
5964       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5965       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5966 
5967       // Determine whether we should expand the parameter packs.
5968       bool ShouldExpand = false;
5969       bool RetainExpansion = false;
5970       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5971                                                Unexpanded,
5972                                                ShouldExpand,
5973                                                RetainExpansion,
5974                                                NumExpansions)) {
5975         return true;
5976       }
5977 
5978       if (ShouldExpand) {
5979         // Expand the function parameter pack into multiple, separate
5980         // parameters.
5981         for (unsigned I = 0; I != *NumExpansions; ++I) {
5982           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5983           QualType NewType = getDerived().TransformType(Pattern);
5984           if (NewType.isNull())
5985             return true;
5986 
5987           if (NewType->containsUnexpandedParameterPack()) {
5988             NewType = getSema().getASTContext().getPackExpansionType(
5989                 NewType, std::nullopt);
5990 
5991             if (NewType.isNull())
5992               return true;
5993           }
5994 
5995           if (ParamInfos)
5996             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5997           OutParamTypes.push_back(NewType);
5998           if (PVars)
5999             PVars->push_back(nullptr);
6000         }
6001 
6002         // We're done with the pack expansion.
6003         continue;
6004       }
6005 
6006       // If we're supposed to retain a pack expansion, do so by temporarily
6007       // forgetting the partially-substituted parameter pack.
6008       if (RetainExpansion) {
6009         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
6010         QualType NewType = getDerived().TransformType(Pattern);
6011         if (NewType.isNull())
6012           return true;
6013 
6014         if (ParamInfos)
6015           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6016         OutParamTypes.push_back(NewType);
6017         if (PVars)
6018           PVars->push_back(nullptr);
6019       }
6020 
6021       // We'll substitute the parameter now without expanding the pack
6022       // expansion.
6023       OldType = Expansion->getPattern();
6024       IsPackExpansion = true;
6025       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6026       NewType = getDerived().TransformType(OldType);
6027     } else {
6028       NewType = getDerived().TransformType(OldType);
6029     }
6030 
6031     if (NewType.isNull())
6032       return true;
6033 
6034     if (IsPackExpansion)
6035       NewType = getSema().Context.getPackExpansionType(NewType,
6036                                                        NumExpansions);
6037 
6038     if (ParamInfos)
6039       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
6040     OutParamTypes.push_back(NewType);
6041     if (PVars)
6042       PVars->push_back(nullptr);
6043   }
6044 
6045 #ifndef NDEBUG
6046   if (PVars) {
6047     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
6048       if (ParmVarDecl *parm = (*PVars)[i])
6049         assert(parm->getFunctionScopeIndex() == i);
6050   }
6051 #endif
6052 
6053   return false;
6054 }
6055 
6056 template<typename Derived>
6057 QualType
6058 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
6059                                                    FunctionProtoTypeLoc TL) {
6060   SmallVector<QualType, 4> ExceptionStorage;
6061   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
6062   return getDerived().TransformFunctionProtoType(
6063       TLB, TL, nullptr, Qualifiers(),
6064       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
6065         return This->getDerived().TransformExceptionSpec(
6066             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
6067       });
6068 }
6069 
6070 template<typename Derived> template<typename Fn>
6071 QualType TreeTransform<Derived>::TransformFunctionProtoType(
6072     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
6073     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6074 
6075   // Transform the parameters and return type.
6076   //
6077   // We are required to instantiate the params and return type in source order.
6078   // When the function has a trailing return type, we instantiate the
6079   // parameters before the return type,  since the return type can then refer
6080   // to the parameters themselves (via decltype, sizeof, etc.).
6081   //
6082   SmallVector<QualType, 4> ParamTypes;
6083   SmallVector<ParmVarDecl*, 4> ParamDecls;
6084   Sema::ExtParameterInfoBuilder ExtParamInfos;
6085   const FunctionProtoType *T = TL.getTypePtr();
6086 
6087   QualType ResultType;
6088 
6089   if (T->hasTrailingReturn()) {
6090     if (getDerived().TransformFunctionTypeParams(
6091             TL.getBeginLoc(), TL.getParams(),
6092             TL.getTypePtr()->param_type_begin(),
6093             T->getExtParameterInfosOrNull(),
6094             ParamTypes, &ParamDecls, ExtParamInfos))
6095       return QualType();
6096 
6097     {
6098       // C++11 [expr.prim.general]p3:
6099       //   If a declaration declares a member function or member function
6100       //   template of a class X, the expression this is a prvalue of type
6101       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6102       //   and the end of the function-definition, member-declarator, or
6103       //   declarator.
6104       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
6105 
6106       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6107       if (ResultType.isNull())
6108         return QualType();
6109     }
6110   }
6111   else {
6112     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6113     if (ResultType.isNull())
6114       return QualType();
6115 
6116     if (getDerived().TransformFunctionTypeParams(
6117             TL.getBeginLoc(), TL.getParams(),
6118             TL.getTypePtr()->param_type_begin(),
6119             T->getExtParameterInfosOrNull(),
6120             ParamTypes, &ParamDecls, ExtParamInfos))
6121       return QualType();
6122   }
6123 
6124   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
6125 
6126   bool EPIChanged = false;
6127   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
6128     return QualType();
6129 
6130   // Handle extended parameter information.
6131   if (auto NewExtParamInfos =
6132         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
6133     if (!EPI.ExtParameterInfos ||
6134         llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) !=
6135             llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) {
6136       EPIChanged = true;
6137     }
6138     EPI.ExtParameterInfos = NewExtParamInfos;
6139   } else if (EPI.ExtParameterInfos) {
6140     EPIChanged = true;
6141     EPI.ExtParameterInfos = nullptr;
6142   }
6143 
6144   QualType Result = TL.getType();
6145   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
6146       T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) {
6147     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6148     if (Result.isNull())
6149       return QualType();
6150   }
6151 
6152   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
6153   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6154   NewTL.setLParenLoc(TL.getLParenLoc());
6155   NewTL.setRParenLoc(TL.getRParenLoc());
6156   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
6157   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6158   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
6159     NewTL.setParam(i, ParamDecls[i]);
6160 
6161   return Result;
6162 }
6163 
6164 template<typename Derived>
6165 bool TreeTransform<Derived>::TransformExceptionSpec(
6166     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
6167     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
6168   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
6169 
6170   // Instantiate a dynamic noexcept expression, if any.
6171   if (isComputedNoexcept(ESI.Type)) {
6172     EnterExpressionEvaluationContext Unevaluated(
6173         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6174     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
6175     if (NoexceptExpr.isInvalid())
6176       return true;
6177 
6178     ExceptionSpecificationType EST = ESI.Type;
6179     NoexceptExpr =
6180         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
6181     if (NoexceptExpr.isInvalid())
6182       return true;
6183 
6184     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6185       Changed = true;
6186     ESI.NoexceptExpr = NoexceptExpr.get();
6187     ESI.Type = EST;
6188   }
6189 
6190   if (ESI.Type != EST_Dynamic)
6191     return false;
6192 
6193   // Instantiate a dynamic exception specification's type.
6194   for (QualType T : ESI.Exceptions) {
6195     if (const PackExpansionType *PackExpansion =
6196             T->getAs<PackExpansionType>()) {
6197       Changed = true;
6198 
6199       // We have a pack expansion. Instantiate it.
6200       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6201       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6202                                               Unexpanded);
6203       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6204 
6205       // Determine whether the set of unexpanded parameter packs can and
6206       // should
6207       // be expanded.
6208       bool Expand = false;
6209       bool RetainExpansion = false;
6210       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6211       // FIXME: Track the location of the ellipsis (and track source location
6212       // information for the types in the exception specification in general).
6213       if (getDerived().TryExpandParameterPacks(
6214               Loc, SourceRange(), Unexpanded, Expand,
6215               RetainExpansion, NumExpansions))
6216         return true;
6217 
6218       if (!Expand) {
6219         // We can't expand this pack expansion into separate arguments yet;
6220         // just substitute into the pattern and create a new pack expansion
6221         // type.
6222         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6223         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6224         if (U.isNull())
6225           return true;
6226 
6227         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6228         Exceptions.push_back(U);
6229         continue;
6230       }
6231 
6232       // Substitute into the pack expansion pattern for each slice of the
6233       // pack.
6234       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6235         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6236 
6237         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6238         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6239           return true;
6240 
6241         Exceptions.push_back(U);
6242       }
6243     } else {
6244       QualType U = getDerived().TransformType(T);
6245       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6246         return true;
6247       if (T != U)
6248         Changed = true;
6249 
6250       Exceptions.push_back(U);
6251     }
6252   }
6253 
6254   ESI.Exceptions = Exceptions;
6255   if (ESI.Exceptions.empty())
6256     ESI.Type = EST_DynamicNone;
6257   return false;
6258 }
6259 
6260 template<typename Derived>
6261 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6262                                                  TypeLocBuilder &TLB,
6263                                                  FunctionNoProtoTypeLoc TL) {
6264   const FunctionNoProtoType *T = TL.getTypePtr();
6265   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6266   if (ResultType.isNull())
6267     return QualType();
6268 
6269   QualType Result = TL.getType();
6270   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6271     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6272 
6273   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6274   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6275   NewTL.setLParenLoc(TL.getLParenLoc());
6276   NewTL.setRParenLoc(TL.getRParenLoc());
6277   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6278 
6279   return Result;
6280 }
6281 
6282 template <typename Derived>
6283 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6284     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6285   const UnresolvedUsingType *T = TL.getTypePtr();
6286   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6287   if (!D)
6288     return QualType();
6289 
6290   QualType Result = TL.getType();
6291   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6292     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6293     if (Result.isNull())
6294       return QualType();
6295   }
6296 
6297   // We might get an arbitrary type spec type back.  We should at
6298   // least always get a type spec type, though.
6299   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6300   NewTL.setNameLoc(TL.getNameLoc());
6301 
6302   return Result;
6303 }
6304 
6305 template <typename Derived>
6306 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6307                                                     UsingTypeLoc TL) {
6308   const UsingType *T = TL.getTypePtr();
6309 
6310   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6311       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6312   if (!Found)
6313     return QualType();
6314 
6315   QualType Underlying = getDerived().TransformType(T->desugar());
6316   if (Underlying.isNull())
6317     return QualType();
6318 
6319   QualType Result = TL.getType();
6320   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6321       Underlying != T->getUnderlyingType()) {
6322     Result = getDerived().RebuildUsingType(Found, Underlying);
6323     if (Result.isNull())
6324       return QualType();
6325   }
6326 
6327   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6328   return Result;
6329 }
6330 
6331 template<typename Derived>
6332 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6333                                                       TypedefTypeLoc TL) {
6334   const TypedefType *T = TL.getTypePtr();
6335   TypedefNameDecl *Typedef
6336     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6337                                                                T->getDecl()));
6338   if (!Typedef)
6339     return QualType();
6340 
6341   QualType Result = TL.getType();
6342   if (getDerived().AlwaysRebuild() ||
6343       Typedef != T->getDecl()) {
6344     Result = getDerived().RebuildTypedefType(Typedef);
6345     if (Result.isNull())
6346       return QualType();
6347   }
6348 
6349   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6350   NewTL.setNameLoc(TL.getNameLoc());
6351 
6352   return Result;
6353 }
6354 
6355 template<typename Derived>
6356 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6357                                                       TypeOfExprTypeLoc TL) {
6358   // typeof expressions are not potentially evaluated contexts
6359   EnterExpressionEvaluationContext Unevaluated(
6360       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6361       Sema::ReuseLambdaContextDecl);
6362 
6363   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6364   if (E.isInvalid())
6365     return QualType();
6366 
6367   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6368   if (E.isInvalid())
6369     return QualType();
6370 
6371   QualType Result = TL.getType();
6372   TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind();
6373   if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) {
6374     Result =
6375         getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind);
6376     if (Result.isNull())
6377       return QualType();
6378   }
6379 
6380   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6381   NewTL.setTypeofLoc(TL.getTypeofLoc());
6382   NewTL.setLParenLoc(TL.getLParenLoc());
6383   NewTL.setRParenLoc(TL.getRParenLoc());
6384 
6385   return Result;
6386 }
6387 
6388 template<typename Derived>
6389 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6390                                                      TypeOfTypeLoc TL) {
6391   TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6392   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6393   if (!New_Under_TI)
6394     return QualType();
6395 
6396   QualType Result = TL.getType();
6397   TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind();
6398   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6399     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6400     if (Result.isNull())
6401       return QualType();
6402   }
6403 
6404   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6405   NewTL.setTypeofLoc(TL.getTypeofLoc());
6406   NewTL.setLParenLoc(TL.getLParenLoc());
6407   NewTL.setRParenLoc(TL.getRParenLoc());
6408   NewTL.setUnmodifiedTInfo(New_Under_TI);
6409 
6410   return Result;
6411 }
6412 
6413 template<typename Derived>
6414 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6415                                                        DecltypeTypeLoc TL) {
6416   const DecltypeType *T = TL.getTypePtr();
6417 
6418   // decltype expressions are not potentially evaluated contexts
6419   EnterExpressionEvaluationContext Unevaluated(
6420       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6421       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6422 
6423   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6424   if (E.isInvalid())
6425     return QualType();
6426 
6427   E = getSema().ActOnDecltypeExpression(E.get());
6428   if (E.isInvalid())
6429     return QualType();
6430 
6431   QualType Result = TL.getType();
6432   if (getDerived().AlwaysRebuild() ||
6433       E.get() != T->getUnderlyingExpr()) {
6434     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6435     if (Result.isNull())
6436       return QualType();
6437   }
6438   else E.get();
6439 
6440   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6441   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6442   NewTL.setRParenLoc(TL.getRParenLoc());
6443   return Result;
6444 }
6445 
6446 template<typename Derived>
6447 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6448                                                             TypeLocBuilder &TLB,
6449                                                      UnaryTransformTypeLoc TL) {
6450   QualType Result = TL.getType();
6451   if (Result->isDependentType()) {
6452     const UnaryTransformType *T = TL.getTypePtr();
6453     QualType NewBase =
6454       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6455     Result = getDerived().RebuildUnaryTransformType(NewBase,
6456                                                     T->getUTTKind(),
6457                                                     TL.getKWLoc());
6458     if (Result.isNull())
6459       return QualType();
6460   }
6461 
6462   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6463   NewTL.setKWLoc(TL.getKWLoc());
6464   NewTL.setParensRange(TL.getParensRange());
6465   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6466   return Result;
6467 }
6468 
6469 template<typename Derived>
6470 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6471     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6472   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6473 
6474   CXXScopeSpec SS;
6475   TemplateName TemplateName = getDerived().TransformTemplateName(
6476       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6477   if (TemplateName.isNull())
6478     return QualType();
6479 
6480   QualType OldDeduced = T->getDeducedType();
6481   QualType NewDeduced;
6482   if (!OldDeduced.isNull()) {
6483     NewDeduced = getDerived().TransformType(OldDeduced);
6484     if (NewDeduced.isNull())
6485       return QualType();
6486   }
6487 
6488   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6489       TemplateName, NewDeduced);
6490   if (Result.isNull())
6491     return QualType();
6492 
6493   DeducedTemplateSpecializationTypeLoc NewTL =
6494       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6495   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6496 
6497   return Result;
6498 }
6499 
6500 template<typename Derived>
6501 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6502                                                      RecordTypeLoc TL) {
6503   const RecordType *T = TL.getTypePtr();
6504   RecordDecl *Record
6505     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6506                                                           T->getDecl()));
6507   if (!Record)
6508     return QualType();
6509 
6510   QualType Result = TL.getType();
6511   if (getDerived().AlwaysRebuild() ||
6512       Record != T->getDecl()) {
6513     Result = getDerived().RebuildRecordType(Record);
6514     if (Result.isNull())
6515       return QualType();
6516   }
6517 
6518   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6519   NewTL.setNameLoc(TL.getNameLoc());
6520 
6521   return Result;
6522 }
6523 
6524 template<typename Derived>
6525 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6526                                                    EnumTypeLoc TL) {
6527   const EnumType *T = TL.getTypePtr();
6528   EnumDecl *Enum
6529     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6530                                                         T->getDecl()));
6531   if (!Enum)
6532     return QualType();
6533 
6534   QualType Result = TL.getType();
6535   if (getDerived().AlwaysRebuild() ||
6536       Enum != T->getDecl()) {
6537     Result = getDerived().RebuildEnumType(Enum);
6538     if (Result.isNull())
6539       return QualType();
6540   }
6541 
6542   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6543   NewTL.setNameLoc(TL.getNameLoc());
6544 
6545   return Result;
6546 }
6547 
6548 template<typename Derived>
6549 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6550                                          TypeLocBuilder &TLB,
6551                                          InjectedClassNameTypeLoc TL) {
6552   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6553                                        TL.getTypePtr()->getDecl());
6554   if (!D) return QualType();
6555 
6556   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6557   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6558   return T;
6559 }
6560 
6561 template<typename Derived>
6562 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6563                                                 TypeLocBuilder &TLB,
6564                                                 TemplateTypeParmTypeLoc TL) {
6565   return getDerived().TransformTemplateTypeParmType(
6566       TLB, TL,
6567       /*SuppressObjCLifetime=*/false);
6568 }
6569 
6570 template <typename Derived>
6571 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6572     TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) {
6573   return TransformTypeSpecType(TLB, TL);
6574 }
6575 
6576 template<typename Derived>
6577 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6578                                          TypeLocBuilder &TLB,
6579                                          SubstTemplateTypeParmTypeLoc TL) {
6580   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6581 
6582   Decl *NewReplaced =
6583       getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
6584 
6585   // Substitute into the replacement type, which itself might involve something
6586   // that needs to be transformed. This only tends to occur with default
6587   // template arguments of template template parameters.
6588   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6589   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6590   if (Replacement.isNull())
6591     return QualType();
6592 
6593   QualType Result = SemaRef.Context.getSubstTemplateTypeParmType(
6594       Replacement, NewReplaced, T->getIndex(), T->getPackIndex());
6595 
6596   // Propagate type-source information.
6597   SubstTemplateTypeParmTypeLoc NewTL
6598     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6599   NewTL.setNameLoc(TL.getNameLoc());
6600   return Result;
6601 
6602 }
6603 
6604 template<typename Derived>
6605 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6606                                           TypeLocBuilder &TLB,
6607                                           SubstTemplateTypeParmPackTypeLoc TL) {
6608   return getDerived().TransformSubstTemplateTypeParmPackType(
6609       TLB, TL, /*SuppressObjCLifetime=*/false);
6610 }
6611 
6612 template <typename Derived>
6613 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6614     TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) {
6615   return TransformTypeSpecType(TLB, TL);
6616 }
6617 
6618 template<typename Derived>
6619 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6620                                                         TypeLocBuilder &TLB,
6621                                            TemplateSpecializationTypeLoc TL) {
6622   const TemplateSpecializationType *T = TL.getTypePtr();
6623 
6624   // The nested-name-specifier never matters in a TemplateSpecializationType,
6625   // because we can't have a dependent nested-name-specifier anyway.
6626   CXXScopeSpec SS;
6627   TemplateName Template
6628     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6629                                          TL.getTemplateNameLoc());
6630   if (Template.isNull())
6631     return QualType();
6632 
6633   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6634 }
6635 
6636 template<typename Derived>
6637 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6638                                                      AtomicTypeLoc TL) {
6639   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6640   if (ValueType.isNull())
6641     return QualType();
6642 
6643   QualType Result = TL.getType();
6644   if (getDerived().AlwaysRebuild() ||
6645       ValueType != TL.getValueLoc().getType()) {
6646     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6647     if (Result.isNull())
6648       return QualType();
6649   }
6650 
6651   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6652   NewTL.setKWLoc(TL.getKWLoc());
6653   NewTL.setLParenLoc(TL.getLParenLoc());
6654   NewTL.setRParenLoc(TL.getRParenLoc());
6655 
6656   return Result;
6657 }
6658 
6659 template <typename Derived>
6660 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6661                                                    PipeTypeLoc TL) {
6662   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6663   if (ValueType.isNull())
6664     return QualType();
6665 
6666   QualType Result = TL.getType();
6667   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6668     const PipeType *PT = Result->castAs<PipeType>();
6669     bool isReadPipe = PT->isReadOnly();
6670     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6671     if (Result.isNull())
6672       return QualType();
6673   }
6674 
6675   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6676   NewTL.setKWLoc(TL.getKWLoc());
6677 
6678   return Result;
6679 }
6680 
6681 template <typename Derived>
6682 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6683                                                      BitIntTypeLoc TL) {
6684   const BitIntType *EIT = TL.getTypePtr();
6685   QualType Result = TL.getType();
6686 
6687   if (getDerived().AlwaysRebuild()) {
6688     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6689                                             EIT->getNumBits(), TL.getNameLoc());
6690     if (Result.isNull())
6691       return QualType();
6692   }
6693 
6694   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6695   NewTL.setNameLoc(TL.getNameLoc());
6696   return Result;
6697 }
6698 
6699 template <typename Derived>
6700 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6701     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6702   const DependentBitIntType *EIT = TL.getTypePtr();
6703 
6704   EnterExpressionEvaluationContext Unevaluated(
6705       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6706   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6707   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6708 
6709   if (BitsExpr.isInvalid())
6710     return QualType();
6711 
6712   QualType Result = TL.getType();
6713 
6714   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6715     Result = getDerived().RebuildDependentBitIntType(
6716         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6717 
6718     if (Result.isNull())
6719       return QualType();
6720   }
6721 
6722   if (isa<DependentBitIntType>(Result)) {
6723     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6724     NewTL.setNameLoc(TL.getNameLoc());
6725   } else {
6726     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6727     NewTL.setNameLoc(TL.getNameLoc());
6728   }
6729   return Result;
6730 }
6731 
6732   /// Simple iterator that traverses the template arguments in a
6733   /// container that provides a \c getArgLoc() member function.
6734   ///
6735   /// This iterator is intended to be used with the iterator form of
6736   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6737   template<typename ArgLocContainer>
6738   class TemplateArgumentLocContainerIterator {
6739     ArgLocContainer *Container;
6740     unsigned Index;
6741 
6742   public:
6743     typedef TemplateArgumentLoc value_type;
6744     typedef TemplateArgumentLoc reference;
6745     typedef int difference_type;
6746     typedef std::input_iterator_tag iterator_category;
6747 
6748     class pointer {
6749       TemplateArgumentLoc Arg;
6750 
6751     public:
6752       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6753 
6754       const TemplateArgumentLoc *operator->() const {
6755         return &Arg;
6756       }
6757     };
6758 
6759 
6760     TemplateArgumentLocContainerIterator() {}
6761 
6762     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6763                                  unsigned Index)
6764       : Container(&Container), Index(Index) { }
6765 
6766     TemplateArgumentLocContainerIterator &operator++() {
6767       ++Index;
6768       return *this;
6769     }
6770 
6771     TemplateArgumentLocContainerIterator operator++(int) {
6772       TemplateArgumentLocContainerIterator Old(*this);
6773       ++(*this);
6774       return Old;
6775     }
6776 
6777     TemplateArgumentLoc operator*() const {
6778       return Container->getArgLoc(Index);
6779     }
6780 
6781     pointer operator->() const {
6782       return pointer(Container->getArgLoc(Index));
6783     }
6784 
6785     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6786                            const TemplateArgumentLocContainerIterator &Y) {
6787       return X.Container == Y.Container && X.Index == Y.Index;
6788     }
6789 
6790     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6791                            const TemplateArgumentLocContainerIterator &Y) {
6792       return !(X == Y);
6793     }
6794   };
6795 
6796 template<typename Derived>
6797 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6798                                                    AutoTypeLoc TL) {
6799   const AutoType *T = TL.getTypePtr();
6800   QualType OldDeduced = T->getDeducedType();
6801   QualType NewDeduced;
6802   if (!OldDeduced.isNull()) {
6803     NewDeduced = getDerived().TransformType(OldDeduced);
6804     if (NewDeduced.isNull())
6805       return QualType();
6806   }
6807 
6808   ConceptDecl *NewCD = nullptr;
6809   TemplateArgumentListInfo NewTemplateArgs;
6810   NestedNameSpecifierLoc NewNestedNameSpec;
6811   if (T->isConstrained()) {
6812     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6813         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6814 
6815     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6816     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6817     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6818     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6819                                                 ArgIterator(TL,
6820                                                             TL.getNumArgs()),
6821                                                 NewTemplateArgs))
6822       return QualType();
6823 
6824     if (TL.getNestedNameSpecifierLoc()) {
6825       NewNestedNameSpec
6826         = getDerived().TransformNestedNameSpecifierLoc(
6827             TL.getNestedNameSpecifierLoc());
6828       if (!NewNestedNameSpec)
6829         return QualType();
6830     }
6831   }
6832 
6833   QualType Result = TL.getType();
6834   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6835       T->isDependentType() || T->isConstrained()) {
6836     // FIXME: Maybe don't rebuild if all template arguments are the same.
6837     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6838     NewArgList.reserve(NewTemplateArgs.size());
6839     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6840       NewArgList.push_back(ArgLoc.getArgument());
6841     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6842                                           NewArgList);
6843     if (Result.isNull())
6844       return QualType();
6845   }
6846 
6847   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6848   NewTL.setNameLoc(TL.getNameLoc());
6849   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6850   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6851   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6852   NewTL.setFoundDecl(TL.getFoundDecl());
6853   NewTL.setLAngleLoc(TL.getLAngleLoc());
6854   NewTL.setRAngleLoc(TL.getRAngleLoc());
6855   NewTL.setRParenLoc(TL.getRParenLoc());
6856   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6857     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6858 
6859   return Result;
6860 }
6861 
6862 template <typename Derived>
6863 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6864                                                         TypeLocBuilder &TLB,
6865                                            TemplateSpecializationTypeLoc TL,
6866                                                       TemplateName Template) {
6867   TemplateArgumentListInfo NewTemplateArgs;
6868   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6869   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6870   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6871     ArgIterator;
6872   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6873                                               ArgIterator(TL, TL.getNumArgs()),
6874                                               NewTemplateArgs))
6875     return QualType();
6876 
6877   // FIXME: maybe don't rebuild if all the template arguments are the same.
6878 
6879   QualType Result =
6880     getDerived().RebuildTemplateSpecializationType(Template,
6881                                                    TL.getTemplateNameLoc(),
6882                                                    NewTemplateArgs);
6883 
6884   if (!Result.isNull()) {
6885     // Specializations of template template parameters are represented as
6886     // TemplateSpecializationTypes, and substitution of type alias templates
6887     // within a dependent context can transform them into
6888     // DependentTemplateSpecializationTypes.
6889     if (isa<DependentTemplateSpecializationType>(Result)) {
6890       DependentTemplateSpecializationTypeLoc NewTL
6891         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6892       NewTL.setElaboratedKeywordLoc(SourceLocation());
6893       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6894       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6895       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6896       NewTL.setLAngleLoc(TL.getLAngleLoc());
6897       NewTL.setRAngleLoc(TL.getRAngleLoc());
6898       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6899         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6900       return Result;
6901     }
6902 
6903     TemplateSpecializationTypeLoc NewTL
6904       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6905     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6906     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6907     NewTL.setLAngleLoc(TL.getLAngleLoc());
6908     NewTL.setRAngleLoc(TL.getRAngleLoc());
6909     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6910       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6911   }
6912 
6913   return Result;
6914 }
6915 
6916 template <typename Derived>
6917 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6918                                      TypeLocBuilder &TLB,
6919                                      DependentTemplateSpecializationTypeLoc TL,
6920                                      TemplateName Template,
6921                                      CXXScopeSpec &SS) {
6922   TemplateArgumentListInfo NewTemplateArgs;
6923   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6924   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6925   typedef TemplateArgumentLocContainerIterator<
6926             DependentTemplateSpecializationTypeLoc> ArgIterator;
6927   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6928                                               ArgIterator(TL, TL.getNumArgs()),
6929                                               NewTemplateArgs))
6930     return QualType();
6931 
6932   // FIXME: maybe don't rebuild if all the template arguments are the same.
6933 
6934   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6935     QualType Result = getSema().Context.getDependentTemplateSpecializationType(
6936         TL.getTypePtr()->getKeyword(), DTN->getQualifier(),
6937         DTN->getIdentifier(), NewTemplateArgs.arguments());
6938 
6939     DependentTemplateSpecializationTypeLoc NewTL
6940       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6941     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6942     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6943     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6944     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6945     NewTL.setLAngleLoc(TL.getLAngleLoc());
6946     NewTL.setRAngleLoc(TL.getRAngleLoc());
6947     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6948       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6949     return Result;
6950   }
6951 
6952   QualType Result
6953     = getDerived().RebuildTemplateSpecializationType(Template,
6954                                                      TL.getTemplateNameLoc(),
6955                                                      NewTemplateArgs);
6956 
6957   if (!Result.isNull()) {
6958     /// FIXME: Wrap this in an elaborated-type-specifier?
6959     TemplateSpecializationTypeLoc NewTL
6960       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6961     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6962     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6963     NewTL.setLAngleLoc(TL.getLAngleLoc());
6964     NewTL.setRAngleLoc(TL.getRAngleLoc());
6965     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6966       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6967   }
6968 
6969   return Result;
6970 }
6971 
6972 template<typename Derived>
6973 QualType
6974 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6975                                                 ElaboratedTypeLoc TL) {
6976   const ElaboratedType *T = TL.getTypePtr();
6977 
6978   NestedNameSpecifierLoc QualifierLoc;
6979   // NOTE: the qualifier in an ElaboratedType is optional.
6980   if (TL.getQualifierLoc()) {
6981     QualifierLoc
6982       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6983     if (!QualifierLoc)
6984       return QualType();
6985   }
6986 
6987   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6988   if (NamedT.isNull())
6989     return QualType();
6990 
6991   // C++0x [dcl.type.elab]p2:
6992   //   If the identifier resolves to a typedef-name or the simple-template-id
6993   //   resolves to an alias template specialization, the
6994   //   elaborated-type-specifier is ill-formed.
6995   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6996     if (const TemplateSpecializationType *TST =
6997           NamedT->getAs<TemplateSpecializationType>()) {
6998       TemplateName Template = TST->getTemplateName();
6999       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
7000               Template.getAsTemplateDecl())) {
7001         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
7002                      diag::err_tag_reference_non_tag)
7003             << TAT << Sema::NTK_TypeAliasTemplate
7004             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
7005         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
7006       }
7007     }
7008   }
7009 
7010   QualType Result = TL.getType();
7011   if (getDerived().AlwaysRebuild() ||
7012       QualifierLoc != TL.getQualifierLoc() ||
7013       NamedT != T->getNamedType()) {
7014     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
7015                                                 T->getKeyword(),
7016                                                 QualifierLoc, NamedT);
7017     if (Result.isNull())
7018       return QualType();
7019   }
7020 
7021   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7022   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7023   NewTL.setQualifierLoc(QualifierLoc);
7024   return Result;
7025 }
7026 
7027 template<typename Derived>
7028 QualType TreeTransform<Derived>::TransformAttributedType(
7029                                                 TypeLocBuilder &TLB,
7030                                                 AttributedTypeLoc TL) {
7031   const AttributedType *oldType = TL.getTypePtr();
7032   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
7033   if (modifiedType.isNull())
7034     return QualType();
7035 
7036   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
7037   const Attr *oldAttr = TL.getAttr();
7038   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
7039   if (oldAttr && !newAttr)
7040     return QualType();
7041 
7042   QualType result = TL.getType();
7043 
7044   // FIXME: dependent operand expressions?
7045   if (getDerived().AlwaysRebuild() ||
7046       modifiedType != oldType->getModifiedType()) {
7047     // TODO: this is really lame; we should really be rebuilding the
7048     // equivalent type from first principles.
7049     QualType equivalentType
7050       = getDerived().TransformType(oldType->getEquivalentType());
7051     if (equivalentType.isNull())
7052       return QualType();
7053 
7054     // Check whether we can add nullability; it is only represented as
7055     // type sugar, and therefore cannot be diagnosed in any other way.
7056     if (auto nullability = oldType->getImmediateNullability()) {
7057       if (!modifiedType->canHaveNullability()) {
7058         SemaRef.Diag((TL.getAttr() ? TL.getAttr()->getLocation()
7059                                    : TL.getModifiedLoc().getBeginLoc()),
7060                      diag::err_nullability_nonpointer)
7061             << DiagNullabilityKind(*nullability, false) << modifiedType;
7062         return QualType();
7063       }
7064     }
7065 
7066     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
7067                                                modifiedType,
7068                                                equivalentType);
7069   }
7070 
7071   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7072   newTL.setAttr(newAttr);
7073   return result;
7074 }
7075 
7076 template <typename Derived>
7077 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7078     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7079   // The BTFTagAttributedType is available for C only.
7080   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
7081 }
7082 
7083 template<typename Derived>
7084 QualType
7085 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7086                                            ParenTypeLoc TL) {
7087   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7088   if (Inner.isNull())
7089     return QualType();
7090 
7091   QualType Result = TL.getType();
7092   if (getDerived().AlwaysRebuild() ||
7093       Inner != TL.getInnerLoc().getType()) {
7094     Result = getDerived().RebuildParenType(Inner);
7095     if (Result.isNull())
7096       return QualType();
7097   }
7098 
7099   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
7100   NewTL.setLParenLoc(TL.getLParenLoc());
7101   NewTL.setRParenLoc(TL.getRParenLoc());
7102   return Result;
7103 }
7104 
7105 template <typename Derived>
7106 QualType
7107 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7108                                                     MacroQualifiedTypeLoc TL) {
7109   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7110   if (Inner.isNull())
7111     return QualType();
7112 
7113   QualType Result = TL.getType();
7114   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7115     Result =
7116         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7117     if (Result.isNull())
7118       return QualType();
7119   }
7120 
7121   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
7122   NewTL.setExpansionLoc(TL.getExpansionLoc());
7123   return Result;
7124 }
7125 
7126 template<typename Derived>
7127 QualType TreeTransform<Derived>::TransformDependentNameType(
7128     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7129   return TransformDependentNameType(TLB, TL, false);
7130 }
7131 
7132 template<typename Derived>
7133 QualType TreeTransform<Derived>::TransformDependentNameType(
7134     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
7135   const DependentNameType *T = TL.getTypePtr();
7136 
7137   NestedNameSpecifierLoc QualifierLoc
7138     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7139   if (!QualifierLoc)
7140     return QualType();
7141 
7142   QualType Result
7143     = getDerived().RebuildDependentNameType(T->getKeyword(),
7144                                             TL.getElaboratedKeywordLoc(),
7145                                             QualifierLoc,
7146                                             T->getIdentifier(),
7147                                             TL.getNameLoc(),
7148                                             DeducedTSTContext);
7149   if (Result.isNull())
7150     return QualType();
7151 
7152   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
7153     QualType NamedT = ElabT->getNamedType();
7154     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7155 
7156     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7157     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7158     NewTL.setQualifierLoc(QualifierLoc);
7159   } else {
7160     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
7161     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7162     NewTL.setQualifierLoc(QualifierLoc);
7163     NewTL.setNameLoc(TL.getNameLoc());
7164   }
7165   return Result;
7166 }
7167 
7168 template<typename Derived>
7169 QualType TreeTransform<Derived>::
7170           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7171                                  DependentTemplateSpecializationTypeLoc TL) {
7172   NestedNameSpecifierLoc QualifierLoc;
7173   if (TL.getQualifierLoc()) {
7174     QualifierLoc
7175       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7176     if (!QualifierLoc)
7177       return QualType();
7178   }
7179 
7180   return getDerived()
7181            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7182 }
7183 
7184 template<typename Derived>
7185 QualType TreeTransform<Derived>::
7186 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7187                                    DependentTemplateSpecializationTypeLoc TL,
7188                                        NestedNameSpecifierLoc QualifierLoc) {
7189   const DependentTemplateSpecializationType *T = TL.getTypePtr();
7190 
7191   TemplateArgumentListInfo NewTemplateArgs;
7192   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7193   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7194 
7195   typedef TemplateArgumentLocContainerIterator<
7196   DependentTemplateSpecializationTypeLoc> ArgIterator;
7197   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7198                                               ArgIterator(TL, TL.getNumArgs()),
7199                                               NewTemplateArgs))
7200     return QualType();
7201 
7202   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7203       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7204       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7205       /*AllowInjectedClassName*/ false);
7206   if (Result.isNull())
7207     return QualType();
7208 
7209   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7210     QualType NamedT = ElabT->getNamedType();
7211 
7212     // Copy information relevant to the template specialization.
7213     TemplateSpecializationTypeLoc NamedTL
7214       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7215     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7216     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7217     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7218     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7219     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7220       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7221 
7222     // Copy information relevant to the elaborated type.
7223     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7224     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7225     NewTL.setQualifierLoc(QualifierLoc);
7226   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7227     DependentTemplateSpecializationTypeLoc SpecTL
7228       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7229     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7230     SpecTL.setQualifierLoc(QualifierLoc);
7231     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7232     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7233     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7234     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7235     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7236       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7237   } else {
7238     TemplateSpecializationTypeLoc SpecTL
7239       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7240     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7241     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7242     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7243     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7244     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7245       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7246   }
7247   return Result;
7248 }
7249 
7250 template<typename Derived>
7251 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7252                                                       PackExpansionTypeLoc TL) {
7253   QualType Pattern
7254     = getDerived().TransformType(TLB, TL.getPatternLoc());
7255   if (Pattern.isNull())
7256     return QualType();
7257 
7258   QualType Result = TL.getType();
7259   if (getDerived().AlwaysRebuild() ||
7260       Pattern != TL.getPatternLoc().getType()) {
7261     Result = getDerived().RebuildPackExpansionType(Pattern,
7262                                            TL.getPatternLoc().getSourceRange(),
7263                                                    TL.getEllipsisLoc(),
7264                                            TL.getTypePtr()->getNumExpansions());
7265     if (Result.isNull())
7266       return QualType();
7267   }
7268 
7269   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7270   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7271   return Result;
7272 }
7273 
7274 template<typename Derived>
7275 QualType
7276 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7277                                                    ObjCInterfaceTypeLoc TL) {
7278   // ObjCInterfaceType is never dependent.
7279   TLB.pushFullCopy(TL);
7280   return TL.getType();
7281 }
7282 
7283 template<typename Derived>
7284 QualType
7285 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7286                                                    ObjCTypeParamTypeLoc TL) {
7287   const ObjCTypeParamType *T = TL.getTypePtr();
7288   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7289       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7290   if (!OTP)
7291     return QualType();
7292 
7293   QualType Result = TL.getType();
7294   if (getDerived().AlwaysRebuild() ||
7295       OTP != T->getDecl()) {
7296     Result = getDerived().RebuildObjCTypeParamType(
7297         OTP, TL.getProtocolLAngleLoc(),
7298         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7299         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7300     if (Result.isNull())
7301       return QualType();
7302   }
7303 
7304   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7305   if (TL.getNumProtocols()) {
7306     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7307     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7308       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7309     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7310   }
7311   return Result;
7312 }
7313 
7314 template<typename Derived>
7315 QualType
7316 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7317                                                 ObjCObjectTypeLoc TL) {
7318   // Transform base type.
7319   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7320   if (BaseType.isNull())
7321     return QualType();
7322 
7323   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7324 
7325   // Transform type arguments.
7326   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7327   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7328     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7329     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7330     QualType TypeArg = TypeArgInfo->getType();
7331     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7332       AnyChanged = true;
7333 
7334       // We have a pack expansion. Instantiate it.
7335       const auto *PackExpansion = PackExpansionLoc.getType()
7336                                     ->castAs<PackExpansionType>();
7337       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7338       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7339                                               Unexpanded);
7340       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7341 
7342       // Determine whether the set of unexpanded parameter packs can
7343       // and should be expanded.
7344       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7345       bool Expand = false;
7346       bool RetainExpansion = false;
7347       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7348       if (getDerived().TryExpandParameterPacks(
7349             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7350             Unexpanded, Expand, RetainExpansion, NumExpansions))
7351         return QualType();
7352 
7353       if (!Expand) {
7354         // We can't expand this pack expansion into separate arguments yet;
7355         // just substitute into the pattern and create a new pack expansion
7356         // type.
7357         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7358 
7359         TypeLocBuilder TypeArgBuilder;
7360         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7361         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7362                                                              PatternLoc);
7363         if (NewPatternType.isNull())
7364           return QualType();
7365 
7366         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7367                                       NewPatternType, NumExpansions);
7368         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7369         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7370         NewTypeArgInfos.push_back(
7371           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7372         continue;
7373       }
7374 
7375       // Substitute into the pack expansion pattern for each slice of the
7376       // pack.
7377       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7378         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7379 
7380         TypeLocBuilder TypeArgBuilder;
7381         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7382 
7383         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7384                                                          PatternLoc);
7385         if (NewTypeArg.isNull())
7386           return QualType();
7387 
7388         NewTypeArgInfos.push_back(
7389           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7390       }
7391 
7392       continue;
7393     }
7394 
7395     TypeLocBuilder TypeArgBuilder;
7396     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7397     QualType NewTypeArg =
7398         getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7399     if (NewTypeArg.isNull())
7400       return QualType();
7401 
7402     // If nothing changed, just keep the old TypeSourceInfo.
7403     if (NewTypeArg == TypeArg) {
7404       NewTypeArgInfos.push_back(TypeArgInfo);
7405       continue;
7406     }
7407 
7408     NewTypeArgInfos.push_back(
7409       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7410     AnyChanged = true;
7411   }
7412 
7413   QualType Result = TL.getType();
7414   if (getDerived().AlwaysRebuild() || AnyChanged) {
7415     // Rebuild the type.
7416     Result = getDerived().RebuildObjCObjectType(
7417         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7418         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7419         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7420         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7421 
7422     if (Result.isNull())
7423       return QualType();
7424   }
7425 
7426   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7427   NewT.setHasBaseTypeAsWritten(true);
7428   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7429   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7430     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7431   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7432   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7433   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7434     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7435   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7436   return Result;
7437 }
7438 
7439 template<typename Derived>
7440 QualType
7441 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7442                                                ObjCObjectPointerTypeLoc TL) {
7443   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7444   if (PointeeType.isNull())
7445     return QualType();
7446 
7447   QualType Result = TL.getType();
7448   if (getDerived().AlwaysRebuild() ||
7449       PointeeType != TL.getPointeeLoc().getType()) {
7450     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7451                                                        TL.getStarLoc());
7452     if (Result.isNull())
7453       return QualType();
7454   }
7455 
7456   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7457   NewT.setStarLoc(TL.getStarLoc());
7458   return Result;
7459 }
7460 
7461 //===----------------------------------------------------------------------===//
7462 // Statement transformation
7463 //===----------------------------------------------------------------------===//
7464 template<typename Derived>
7465 StmtResult
7466 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7467   return S;
7468 }
7469 
7470 template<typename Derived>
7471 StmtResult
7472 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7473   return getDerived().TransformCompoundStmt(S, false);
7474 }
7475 
7476 template<typename Derived>
7477 StmtResult
7478 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7479                                               bool IsStmtExpr) {
7480   Sema::CompoundScopeRAII CompoundScope(getSema());
7481   Sema::FPFeaturesStateRAII FPSave(getSema());
7482   if (S->hasStoredFPFeatures())
7483     getSema().resetFPOptions(
7484         S->getStoredFPFeatures().applyOverrides(getSema().getLangOpts()));
7485 
7486   const Stmt *ExprResult = S->getStmtExprResult();
7487   bool SubStmtInvalid = false;
7488   bool SubStmtChanged = false;
7489   SmallVector<Stmt*, 8> Statements;
7490   for (auto *B : S->body()) {
7491     StmtResult Result = getDerived().TransformStmt(
7492         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7493 
7494     if (Result.isInvalid()) {
7495       // Immediately fail if this was a DeclStmt, since it's very
7496       // likely that this will cause problems for future statements.
7497       if (isa<DeclStmt>(B))
7498         return StmtError();
7499 
7500       // Otherwise, just keep processing substatements and fail later.
7501       SubStmtInvalid = true;
7502       continue;
7503     }
7504 
7505     SubStmtChanged = SubStmtChanged || Result.get() != B;
7506     Statements.push_back(Result.getAs<Stmt>());
7507   }
7508 
7509   if (SubStmtInvalid)
7510     return StmtError();
7511 
7512   if (!getDerived().AlwaysRebuild() &&
7513       !SubStmtChanged)
7514     return S;
7515 
7516   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7517                                           Statements,
7518                                           S->getRBracLoc(),
7519                                           IsStmtExpr);
7520 }
7521 
7522 template<typename Derived>
7523 StmtResult
7524 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7525   ExprResult LHS, RHS;
7526   {
7527     EnterExpressionEvaluationContext Unevaluated(
7528         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7529 
7530     // Transform the left-hand case value.
7531     LHS = getDerived().TransformExpr(S->getLHS());
7532     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7533     if (LHS.isInvalid())
7534       return StmtError();
7535 
7536     // Transform the right-hand case value (for the GNU case-range extension).
7537     RHS = getDerived().TransformExpr(S->getRHS());
7538     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7539     if (RHS.isInvalid())
7540       return StmtError();
7541   }
7542 
7543   // Build the case statement.
7544   // Case statements are always rebuilt so that they will attached to their
7545   // transformed switch statement.
7546   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7547                                                        LHS.get(),
7548                                                        S->getEllipsisLoc(),
7549                                                        RHS.get(),
7550                                                        S->getColonLoc());
7551   if (Case.isInvalid())
7552     return StmtError();
7553 
7554   // Transform the statement following the case
7555   StmtResult SubStmt =
7556       getDerived().TransformStmt(S->getSubStmt());
7557   if (SubStmt.isInvalid())
7558     return StmtError();
7559 
7560   // Attach the body to the case statement
7561   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7562 }
7563 
7564 template <typename Derived>
7565 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7566   // Transform the statement following the default case
7567   StmtResult SubStmt =
7568       getDerived().TransformStmt(S->getSubStmt());
7569   if (SubStmt.isInvalid())
7570     return StmtError();
7571 
7572   // Default statements are always rebuilt
7573   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7574                                          SubStmt.get());
7575 }
7576 
7577 template<typename Derived>
7578 StmtResult
7579 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7580   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7581   if (SubStmt.isInvalid())
7582     return StmtError();
7583 
7584   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7585                                         S->getDecl());
7586   if (!LD)
7587     return StmtError();
7588 
7589   // If we're transforming "in-place" (we're not creating new local
7590   // declarations), assume we're replacing the old label statement
7591   // and clear out the reference to it.
7592   if (LD == S->getDecl())
7593     S->getDecl()->setStmt(nullptr);
7594 
7595   // FIXME: Pass the real colon location in.
7596   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7597                                        cast<LabelDecl>(LD), SourceLocation(),
7598                                        SubStmt.get());
7599 }
7600 
7601 template <typename Derived>
7602 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7603   if (!R)
7604     return R;
7605 
7606   switch (R->getKind()) {
7607 // Transform attributes by calling TransformXXXAttr.
7608 #define ATTR(X)                                                                \
7609   case attr::X:                                                                \
7610     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7611 #include "clang/Basic/AttrList.inc"
7612   }
7613   return R;
7614 }
7615 
7616 template <typename Derived>
7617 const Attr *TreeTransform<Derived>::TransformStmtAttr(const Stmt *OrigS,
7618                                                       const Stmt *InstS,
7619                                                       const Attr *R) {
7620   if (!R)
7621     return R;
7622 
7623   switch (R->getKind()) {
7624 // Transform attributes by calling TransformStmtXXXAttr.
7625 #define ATTR(X)                                                                \
7626   case attr::X:                                                                \
7627     return getDerived().TransformStmt##X##Attr(OrigS, InstS, cast<X##Attr>(R));
7628 #include "clang/Basic/AttrList.inc"
7629   }
7630   return TransformAttr(R);
7631 }
7632 
7633 template <typename Derived>
7634 StmtResult
7635 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7636                                                 StmtDiscardKind SDK) {
7637   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7638   if (SubStmt.isInvalid())
7639     return StmtError();
7640 
7641   bool AttrsChanged = false;
7642   SmallVector<const Attr *, 1> Attrs;
7643 
7644   // Visit attributes and keep track if any are transformed.
7645   for (const auto *I : S->getAttrs()) {
7646     const Attr *R =
7647         getDerived().TransformStmtAttr(S->getSubStmt(), SubStmt.get(), I);
7648     AttrsChanged |= (I != R);
7649     if (R)
7650       Attrs.push_back(R);
7651   }
7652 
7653   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7654     return S;
7655 
7656   // If transforming the attributes failed for all of the attributes in the
7657   // statement, don't make an AttributedStmt without attributes.
7658   if (Attrs.empty())
7659     return SubStmt;
7660 
7661   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7662                                             SubStmt.get());
7663 }
7664 
7665 template<typename Derived>
7666 StmtResult
7667 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7668   // Transform the initialization statement
7669   StmtResult Init = getDerived().TransformStmt(S->getInit());
7670   if (Init.isInvalid())
7671     return StmtError();
7672 
7673   Sema::ConditionResult Cond;
7674   if (!S->isConsteval()) {
7675     // Transform the condition
7676     Cond = getDerived().TransformCondition(
7677         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7678         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7679                          : Sema::ConditionKind::Boolean);
7680     if (Cond.isInvalid())
7681       return StmtError();
7682   }
7683 
7684   // If this is a constexpr if, determine which arm we should instantiate.
7685   std::optional<bool> ConstexprConditionValue;
7686   if (S->isConstexpr())
7687     ConstexprConditionValue = Cond.getKnownValue();
7688 
7689   // Transform the "then" branch.
7690   StmtResult Then;
7691   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7692     Then = getDerived().TransformStmt(S->getThen());
7693     if (Then.isInvalid())
7694       return StmtError();
7695   } else {
7696     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7697   }
7698 
7699   // Transform the "else" branch.
7700   StmtResult Else;
7701   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7702     Else = getDerived().TransformStmt(S->getElse());
7703     if (Else.isInvalid())
7704       return StmtError();
7705   }
7706 
7707   if (!getDerived().AlwaysRebuild() &&
7708       Init.get() == S->getInit() &&
7709       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7710       Then.get() == S->getThen() &&
7711       Else.get() == S->getElse())
7712     return S;
7713 
7714   return getDerived().RebuildIfStmt(
7715       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7716       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7717 }
7718 
7719 template<typename Derived>
7720 StmtResult
7721 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7722   // Transform the initialization statement
7723   StmtResult Init = getDerived().TransformStmt(S->getInit());
7724   if (Init.isInvalid())
7725     return StmtError();
7726 
7727   // Transform the condition.
7728   Sema::ConditionResult Cond = getDerived().TransformCondition(
7729       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7730       Sema::ConditionKind::Switch);
7731   if (Cond.isInvalid())
7732     return StmtError();
7733 
7734   // Rebuild the switch statement.
7735   StmtResult Switch =
7736       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7737                                           Init.get(), Cond, S->getRParenLoc());
7738   if (Switch.isInvalid())
7739     return StmtError();
7740 
7741   // Transform the body of the switch statement.
7742   StmtResult Body = getDerived().TransformStmt(S->getBody());
7743   if (Body.isInvalid())
7744     return StmtError();
7745 
7746   // Complete the switch statement.
7747   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7748                                             Body.get());
7749 }
7750 
7751 template<typename Derived>
7752 StmtResult
7753 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7754   // Transform the condition
7755   Sema::ConditionResult Cond = getDerived().TransformCondition(
7756       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7757       Sema::ConditionKind::Boolean);
7758   if (Cond.isInvalid())
7759     return StmtError();
7760 
7761   // Transform the body
7762   StmtResult Body = getDerived().TransformStmt(S->getBody());
7763   if (Body.isInvalid())
7764     return StmtError();
7765 
7766   if (!getDerived().AlwaysRebuild() &&
7767       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7768       Body.get() == S->getBody())
7769     return Owned(S);
7770 
7771   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7772                                        Cond, S->getRParenLoc(), Body.get());
7773 }
7774 
7775 template<typename Derived>
7776 StmtResult
7777 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7778   // Transform the body
7779   StmtResult Body = getDerived().TransformStmt(S->getBody());
7780   if (Body.isInvalid())
7781     return StmtError();
7782 
7783   // Transform the condition
7784   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7785   if (Cond.isInvalid())
7786     return StmtError();
7787 
7788   if (!getDerived().AlwaysRebuild() &&
7789       Cond.get() == S->getCond() &&
7790       Body.get() == S->getBody())
7791     return S;
7792 
7793   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7794                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7795                                     S->getRParenLoc());
7796 }
7797 
7798 template<typename Derived>
7799 StmtResult
7800 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7801   if (getSema().getLangOpts().OpenMP)
7802     getSema().startOpenMPLoop();
7803 
7804   // Transform the initialization statement
7805   StmtResult Init = getDerived().TransformStmt(S->getInit());
7806   if (Init.isInvalid())
7807     return StmtError();
7808 
7809   // In OpenMP loop region loop control variable must be captured and be
7810   // private. Perform analysis of first part (if any).
7811   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7812     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7813 
7814   // Transform the condition
7815   Sema::ConditionResult Cond = getDerived().TransformCondition(
7816       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7817       Sema::ConditionKind::Boolean);
7818   if (Cond.isInvalid())
7819     return StmtError();
7820 
7821   // Transform the increment
7822   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7823   if (Inc.isInvalid())
7824     return StmtError();
7825 
7826   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7827   if (S->getInc() && !FullInc.get())
7828     return StmtError();
7829 
7830   // Transform the body
7831   StmtResult Body = getDerived().TransformStmt(S->getBody());
7832   if (Body.isInvalid())
7833     return StmtError();
7834 
7835   if (!getDerived().AlwaysRebuild() &&
7836       Init.get() == S->getInit() &&
7837       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7838       Inc.get() == S->getInc() &&
7839       Body.get() == S->getBody())
7840     return S;
7841 
7842   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7843                                      Init.get(), Cond, FullInc,
7844                                      S->getRParenLoc(), Body.get());
7845 }
7846 
7847 template<typename Derived>
7848 StmtResult
7849 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7850   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7851                                         S->getLabel());
7852   if (!LD)
7853     return StmtError();
7854 
7855   // Goto statements must always be rebuilt, to resolve the label.
7856   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7857                                       cast<LabelDecl>(LD));
7858 }
7859 
7860 template<typename Derived>
7861 StmtResult
7862 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7863   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7864   if (Target.isInvalid())
7865     return StmtError();
7866   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7867 
7868   if (!getDerived().AlwaysRebuild() &&
7869       Target.get() == S->getTarget())
7870     return S;
7871 
7872   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7873                                               Target.get());
7874 }
7875 
7876 template<typename Derived>
7877 StmtResult
7878 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7879   return S;
7880 }
7881 
7882 template<typename Derived>
7883 StmtResult
7884 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7885   return S;
7886 }
7887 
7888 template<typename Derived>
7889 StmtResult
7890 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7891   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7892                                                         /*NotCopyInit*/false);
7893   if (Result.isInvalid())
7894     return StmtError();
7895 
7896   // FIXME: We always rebuild the return statement because there is no way
7897   // to tell whether the return type of the function has changed.
7898   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7899 }
7900 
7901 template<typename Derived>
7902 StmtResult
7903 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7904   bool DeclChanged = false;
7905   SmallVector<Decl *, 4> Decls;
7906   for (auto *D : S->decls()) {
7907     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7908     if (!Transformed)
7909       return StmtError();
7910 
7911     if (Transformed != D)
7912       DeclChanged = true;
7913 
7914     Decls.push_back(Transformed);
7915   }
7916 
7917   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7918     return S;
7919 
7920   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7921 }
7922 
7923 template<typename Derived>
7924 StmtResult
7925 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7926 
7927   SmallVector<Expr*, 8> Constraints;
7928   SmallVector<Expr*, 8> Exprs;
7929   SmallVector<IdentifierInfo *, 4> Names;
7930 
7931   ExprResult AsmString;
7932   SmallVector<Expr*, 8> Clobbers;
7933 
7934   bool ExprsChanged = false;
7935 
7936   // Go through the outputs.
7937   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7938     Names.push_back(S->getOutputIdentifier(I));
7939 
7940     // No need to transform the constraint literal.
7941     Constraints.push_back(S->getOutputConstraintLiteral(I));
7942 
7943     // Transform the output expr.
7944     Expr *OutputExpr = S->getOutputExpr(I);
7945     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7946     if (Result.isInvalid())
7947       return StmtError();
7948 
7949     ExprsChanged |= Result.get() != OutputExpr;
7950 
7951     Exprs.push_back(Result.get());
7952   }
7953 
7954   // Go through the inputs.
7955   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7956     Names.push_back(S->getInputIdentifier(I));
7957 
7958     // No need to transform the constraint literal.
7959     Constraints.push_back(S->getInputConstraintLiteral(I));
7960 
7961     // Transform the input expr.
7962     Expr *InputExpr = S->getInputExpr(I);
7963     ExprResult Result = getDerived().TransformExpr(InputExpr);
7964     if (Result.isInvalid())
7965       return StmtError();
7966 
7967     ExprsChanged |= Result.get() != InputExpr;
7968 
7969     Exprs.push_back(Result.get());
7970   }
7971 
7972   // Go through the Labels.
7973   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7974     Names.push_back(S->getLabelIdentifier(I));
7975 
7976     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7977     if (Result.isInvalid())
7978       return StmtError();
7979     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7980     Exprs.push_back(Result.get());
7981   }
7982   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7983     return S;
7984 
7985   // Go through the clobbers.
7986   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7987     Clobbers.push_back(S->getClobberStringLiteral(I));
7988 
7989   // No need to transform the asm string literal.
7990   AsmString = S->getAsmString();
7991   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7992                                         S->isVolatile(), S->getNumOutputs(),
7993                                         S->getNumInputs(), Names.data(),
7994                                         Constraints, Exprs, AsmString.get(),
7995                                         Clobbers, S->getNumLabels(),
7996                                         S->getRParenLoc());
7997 }
7998 
7999 template<typename Derived>
8000 StmtResult
8001 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
8002   ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks());
8003 
8004   bool HadError = false, HadChange = false;
8005 
8006   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
8007   SmallVector<Expr*, 8> TransformedExprs;
8008   TransformedExprs.reserve(SrcExprs.size());
8009   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
8010     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
8011     if (!Result.isUsable()) {
8012       HadError = true;
8013     } else {
8014       HadChange |= (Result.get() != SrcExprs[i]);
8015       TransformedExprs.push_back(Result.get());
8016     }
8017   }
8018 
8019   if (HadError) return StmtError();
8020   if (!HadChange && !getDerived().AlwaysRebuild())
8021     return Owned(S);
8022 
8023   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
8024                                        AsmToks, S->getAsmString(),
8025                                        S->getNumOutputs(), S->getNumInputs(),
8026                                        S->getAllConstraints(), S->getClobbers(),
8027                                        TransformedExprs, S->getEndLoc());
8028 }
8029 
8030 // C++ Coroutines
8031 template<typename Derived>
8032 StmtResult
8033 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
8034   auto *ScopeInfo = SemaRef.getCurFunction();
8035   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
8036   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
8037          ScopeInfo->NeedsCoroutineSuspends &&
8038          ScopeInfo->CoroutineSuspends.first == nullptr &&
8039          ScopeInfo->CoroutineSuspends.second == nullptr &&
8040          "expected clean scope info");
8041 
8042   // Set that we have (possibly-invalid) suspend points before we do anything
8043   // that may fail.
8044   ScopeInfo->setNeedsCoroutineSuspends(false);
8045 
8046   // We re-build the coroutine promise object (and the coroutine parameters its
8047   // type and constructor depend on) based on the types used in our current
8048   // function. We must do so, and set it on the current FunctionScopeInfo,
8049   // before attempting to transform the other parts of the coroutine body
8050   // statement, such as the implicit suspend statements (because those
8051   // statements reference the FunctionScopeInfo::CoroutinePromise).
8052   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
8053     return StmtError();
8054   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
8055   if (!Promise)
8056     return StmtError();
8057   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
8058   ScopeInfo->CoroutinePromise = Promise;
8059 
8060   // Transform the implicit coroutine statements constructed using dependent
8061   // types during the previous parse: initial and final suspensions, the return
8062   // object, and others. We also transform the coroutine function's body.
8063   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
8064   if (InitSuspend.isInvalid())
8065     return StmtError();
8066   StmtResult FinalSuspend =
8067       getDerived().TransformStmt(S->getFinalSuspendStmt());
8068   if (FinalSuspend.isInvalid() ||
8069       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
8070     return StmtError();
8071   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
8072   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
8073 
8074   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
8075   if (BodyRes.isInvalid())
8076     return StmtError();
8077 
8078   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
8079   if (Builder.isInvalid())
8080     return StmtError();
8081 
8082   Expr *ReturnObject = S->getReturnValueInit();
8083   assert(ReturnObject && "the return object is expected to be valid");
8084   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8085                                                      /*NoCopyInit*/ false);
8086   if (Res.isInvalid())
8087     return StmtError();
8088   Builder.ReturnValue = Res.get();
8089 
8090   // If during the previous parse the coroutine still had a dependent promise
8091   // statement, we may need to build some implicit coroutine statements
8092   // (such as exception and fallthrough handlers) for the first time.
8093   if (S->hasDependentPromiseType()) {
8094     // We can only build these statements, however, if the current promise type
8095     // is not dependent.
8096     if (!Promise->getType()->isDependentType()) {
8097       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8098              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8099              "these nodes should not have been built yet");
8100       if (!Builder.buildDependentStatements())
8101         return StmtError();
8102     }
8103   } else {
8104     if (auto *OnFallthrough = S->getFallthroughHandler()) {
8105       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8106       if (Res.isInvalid())
8107         return StmtError();
8108       Builder.OnFallthrough = Res.get();
8109     }
8110 
8111     if (auto *OnException = S->getExceptionHandler()) {
8112       StmtResult Res = getDerived().TransformStmt(OnException);
8113       if (Res.isInvalid())
8114         return StmtError();
8115       Builder.OnException = Res.get();
8116     }
8117 
8118     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8119       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8120       if (Res.isInvalid())
8121         return StmtError();
8122       Builder.ReturnStmtOnAllocFailure = Res.get();
8123     }
8124 
8125     // Transform any additional statements we may have already built
8126     assert(S->getAllocate() && S->getDeallocate() &&
8127            "allocation and deallocation calls must already be built");
8128     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8129     if (AllocRes.isInvalid())
8130       return StmtError();
8131     Builder.Allocate = AllocRes.get();
8132 
8133     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8134     if (DeallocRes.isInvalid())
8135       return StmtError();
8136     Builder.Deallocate = DeallocRes.get();
8137 
8138     if (auto *ResultDecl = S->getResultDecl()) {
8139       StmtResult Res = getDerived().TransformStmt(ResultDecl);
8140       if (Res.isInvalid())
8141         return StmtError();
8142       Builder.ResultDecl = Res.get();
8143     }
8144 
8145     if (auto *ReturnStmt = S->getReturnStmt()) {
8146       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8147       if (Res.isInvalid())
8148         return StmtError();
8149       Builder.ReturnStmt = Res.get();
8150     }
8151   }
8152 
8153   return getDerived().RebuildCoroutineBodyStmt(Builder);
8154 }
8155 
8156 template<typename Derived>
8157 StmtResult
8158 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8159   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
8160                                                         /*NotCopyInit*/false);
8161   if (Result.isInvalid())
8162     return StmtError();
8163 
8164   // Always rebuild; we don't know if this needs to be injected into a new
8165   // context or if the promise type has changed.
8166   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
8167                                           S->isImplicit());
8168 }
8169 
8170 template <typename Derived>
8171 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
8172   ExprResult Operand = getDerived().TransformInitializer(E->getOperand(),
8173                                                          /*NotCopyInit*/ false);
8174   if (Operand.isInvalid())
8175     return ExprError();
8176 
8177   // Rebuild the common-expr from the operand rather than transforming it
8178   // separately.
8179 
8180   // FIXME: getCurScope() should not be used during template instantiation.
8181   // We should pick up the set of unqualified lookup results for operator
8182   // co_await during the initial parse.
8183   ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8184       getSema().getCurScope(), E->getKeywordLoc());
8185 
8186   // Always rebuild; we don't know if this needs to be injected into a new
8187   // context or if the promise type has changed.
8188   return getDerived().RebuildCoawaitExpr(
8189       E->getKeywordLoc(), Operand.get(),
8190       cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit());
8191 }
8192 
8193 template <typename Derived>
8194 ExprResult
8195 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
8196   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
8197                                                         /*NotCopyInit*/ false);
8198   if (OperandResult.isInvalid())
8199     return ExprError();
8200 
8201   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8202           E->getOperatorCoawaitLookup());
8203 
8204   if (LookupResult.isInvalid())
8205     return ExprError();
8206 
8207   // Always rebuild; we don't know if this needs to be injected into a new
8208   // context or if the promise type has changed.
8209   return getDerived().RebuildDependentCoawaitExpr(
8210       E->getKeywordLoc(), OperandResult.get(),
8211       cast<UnresolvedLookupExpr>(LookupResult.get()));
8212 }
8213 
8214 template<typename Derived>
8215 ExprResult
8216 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
8217   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
8218                                                         /*NotCopyInit*/false);
8219   if (Result.isInvalid())
8220     return ExprError();
8221 
8222   // Always rebuild; we don't know if this needs to be injected into a new
8223   // context or if the promise type has changed.
8224   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
8225 }
8226 
8227 // Objective-C Statements.
8228 
8229 template<typename Derived>
8230 StmtResult
8231 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8232   // Transform the body of the @try.
8233   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8234   if (TryBody.isInvalid())
8235     return StmtError();
8236 
8237   // Transform the @catch statements (if present).
8238   bool AnyCatchChanged = false;
8239   SmallVector<Stmt*, 8> CatchStmts;
8240   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8241     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8242     if (Catch.isInvalid())
8243       return StmtError();
8244     if (Catch.get() != S->getCatchStmt(I))
8245       AnyCatchChanged = true;
8246     CatchStmts.push_back(Catch.get());
8247   }
8248 
8249   // Transform the @finally statement (if present).
8250   StmtResult Finally;
8251   if (S->getFinallyStmt()) {
8252     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8253     if (Finally.isInvalid())
8254       return StmtError();
8255   }
8256 
8257   // If nothing changed, just retain this statement.
8258   if (!getDerived().AlwaysRebuild() &&
8259       TryBody.get() == S->getTryBody() &&
8260       !AnyCatchChanged &&
8261       Finally.get() == S->getFinallyStmt())
8262     return S;
8263 
8264   // Build a new statement.
8265   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8266                                            CatchStmts, Finally.get());
8267 }
8268 
8269 template<typename Derived>
8270 StmtResult
8271 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8272   // Transform the @catch parameter, if there is one.
8273   VarDecl *Var = nullptr;
8274   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8275     TypeSourceInfo *TSInfo = nullptr;
8276     if (FromVar->getTypeSourceInfo()) {
8277       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8278       if (!TSInfo)
8279         return StmtError();
8280     }
8281 
8282     QualType T;
8283     if (TSInfo)
8284       T = TSInfo->getType();
8285     else {
8286       T = getDerived().TransformType(FromVar->getType());
8287       if (T.isNull())
8288         return StmtError();
8289     }
8290 
8291     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8292     if (!Var)
8293       return StmtError();
8294   }
8295 
8296   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8297   if (Body.isInvalid())
8298     return StmtError();
8299 
8300   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8301                                              S->getRParenLoc(),
8302                                              Var, Body.get());
8303 }
8304 
8305 template<typename Derived>
8306 StmtResult
8307 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8308   // Transform the body.
8309   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8310   if (Body.isInvalid())
8311     return StmtError();
8312 
8313   // If nothing changed, just retain this statement.
8314   if (!getDerived().AlwaysRebuild() &&
8315       Body.get() == S->getFinallyBody())
8316     return S;
8317 
8318   // Build a new statement.
8319   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8320                                                Body.get());
8321 }
8322 
8323 template<typename Derived>
8324 StmtResult
8325 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8326   ExprResult Operand;
8327   if (S->getThrowExpr()) {
8328     Operand = getDerived().TransformExpr(S->getThrowExpr());
8329     if (Operand.isInvalid())
8330       return StmtError();
8331   }
8332 
8333   if (!getDerived().AlwaysRebuild() &&
8334       Operand.get() == S->getThrowExpr())
8335     return S;
8336 
8337   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8338 }
8339 
8340 template<typename Derived>
8341 StmtResult
8342 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8343                                                   ObjCAtSynchronizedStmt *S) {
8344   // Transform the object we are locking.
8345   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8346   if (Object.isInvalid())
8347     return StmtError();
8348   Object =
8349     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8350                                                   Object.get());
8351   if (Object.isInvalid())
8352     return StmtError();
8353 
8354   // Transform the body.
8355   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8356   if (Body.isInvalid())
8357     return StmtError();
8358 
8359   // If nothing change, just retain the current statement.
8360   if (!getDerived().AlwaysRebuild() &&
8361       Object.get() == S->getSynchExpr() &&
8362       Body.get() == S->getSynchBody())
8363     return S;
8364 
8365   // Build a new statement.
8366   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8367                                                     Object.get(), Body.get());
8368 }
8369 
8370 template<typename Derived>
8371 StmtResult
8372 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8373                                               ObjCAutoreleasePoolStmt *S) {
8374   // Transform the body.
8375   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8376   if (Body.isInvalid())
8377     return StmtError();
8378 
8379   // If nothing changed, just retain this statement.
8380   if (!getDerived().AlwaysRebuild() &&
8381       Body.get() == S->getSubStmt())
8382     return S;
8383 
8384   // Build a new statement.
8385   return getDerived().RebuildObjCAutoreleasePoolStmt(
8386                         S->getAtLoc(), Body.get());
8387 }
8388 
8389 template<typename Derived>
8390 StmtResult
8391 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8392                                                   ObjCForCollectionStmt *S) {
8393   // Transform the element statement.
8394   StmtResult Element =
8395       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8396   if (Element.isInvalid())
8397     return StmtError();
8398 
8399   // Transform the collection expression.
8400   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8401   if (Collection.isInvalid())
8402     return StmtError();
8403 
8404   // Transform the body.
8405   StmtResult Body = getDerived().TransformStmt(S->getBody());
8406   if (Body.isInvalid())
8407     return StmtError();
8408 
8409   // If nothing changed, just retain this statement.
8410   if (!getDerived().AlwaysRebuild() &&
8411       Element.get() == S->getElement() &&
8412       Collection.get() == S->getCollection() &&
8413       Body.get() == S->getBody())
8414     return S;
8415 
8416   // Build a new statement.
8417   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8418                                                    Element.get(),
8419                                                    Collection.get(),
8420                                                    S->getRParenLoc(),
8421                                                    Body.get());
8422 }
8423 
8424 template <typename Derived>
8425 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8426   // Transform the exception declaration, if any.
8427   VarDecl *Var = nullptr;
8428   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8429     TypeSourceInfo *T =
8430         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8431     if (!T)
8432       return StmtError();
8433 
8434     Var = getDerived().RebuildExceptionDecl(
8435         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8436         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8437     if (!Var || Var->isInvalidDecl())
8438       return StmtError();
8439   }
8440 
8441   // Transform the actual exception handler.
8442   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8443   if (Handler.isInvalid())
8444     return StmtError();
8445 
8446   if (!getDerived().AlwaysRebuild() && !Var &&
8447       Handler.get() == S->getHandlerBlock())
8448     return S;
8449 
8450   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8451 }
8452 
8453 template <typename Derived>
8454 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8455   // Transform the try block itself.
8456   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8457   if (TryBlock.isInvalid())
8458     return StmtError();
8459 
8460   // Transform the handlers.
8461   bool HandlerChanged = false;
8462   SmallVector<Stmt *, 8> Handlers;
8463   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8464     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8465     if (Handler.isInvalid())
8466       return StmtError();
8467 
8468     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8469     Handlers.push_back(Handler.getAs<Stmt>());
8470   }
8471 
8472   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8473       !HandlerChanged)
8474     return S;
8475 
8476   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8477                                         Handlers);
8478 }
8479 
8480 template<typename Derived>
8481 StmtResult
8482 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8483   StmtResult Init =
8484       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8485   if (Init.isInvalid())
8486     return StmtError();
8487 
8488   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8489   if (Range.isInvalid())
8490     return StmtError();
8491 
8492   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8493   if (Begin.isInvalid())
8494     return StmtError();
8495   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8496   if (End.isInvalid())
8497     return StmtError();
8498 
8499   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8500   if (Cond.isInvalid())
8501     return StmtError();
8502   if (Cond.get())
8503     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8504   if (Cond.isInvalid())
8505     return StmtError();
8506   if (Cond.get())
8507     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8508 
8509   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8510   if (Inc.isInvalid())
8511     return StmtError();
8512   if (Inc.get())
8513     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8514 
8515   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8516   if (LoopVar.isInvalid())
8517     return StmtError();
8518 
8519   StmtResult NewStmt = S;
8520   if (getDerived().AlwaysRebuild() ||
8521       Init.get() != S->getInit() ||
8522       Range.get() != S->getRangeStmt() ||
8523       Begin.get() != S->getBeginStmt() ||
8524       End.get() != S->getEndStmt() ||
8525       Cond.get() != S->getCond() ||
8526       Inc.get() != S->getInc() ||
8527       LoopVar.get() != S->getLoopVarStmt()) {
8528     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8529                                                   S->getCoawaitLoc(), Init.get(),
8530                                                   S->getColonLoc(), Range.get(),
8531                                                   Begin.get(), End.get(),
8532                                                   Cond.get(),
8533                                                   Inc.get(), LoopVar.get(),
8534                                                   S->getRParenLoc());
8535     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8536       // Might not have attached any initializer to the loop variable.
8537       getSema().ActOnInitializerError(
8538           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8539       return StmtError();
8540     }
8541   }
8542 
8543   StmtResult Body = getDerived().TransformStmt(S->getBody());
8544   if (Body.isInvalid())
8545     return StmtError();
8546 
8547   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8548   // it now so we have a new statement to attach the body to.
8549   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8550     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8551                                                   S->getCoawaitLoc(), Init.get(),
8552                                                   S->getColonLoc(), Range.get(),
8553                                                   Begin.get(), End.get(),
8554                                                   Cond.get(),
8555                                                   Inc.get(), LoopVar.get(),
8556                                                   S->getRParenLoc());
8557     if (NewStmt.isInvalid())
8558       return StmtError();
8559   }
8560 
8561   if (NewStmt.get() == S)
8562     return S;
8563 
8564   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8565 }
8566 
8567 template<typename Derived>
8568 StmtResult
8569 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8570                                                     MSDependentExistsStmt *S) {
8571   // Transform the nested-name-specifier, if any.
8572   NestedNameSpecifierLoc QualifierLoc;
8573   if (S->getQualifierLoc()) {
8574     QualifierLoc
8575       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8576     if (!QualifierLoc)
8577       return StmtError();
8578   }
8579 
8580   // Transform the declaration name.
8581   DeclarationNameInfo NameInfo = S->getNameInfo();
8582   if (NameInfo.getName()) {
8583     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8584     if (!NameInfo.getName())
8585       return StmtError();
8586   }
8587 
8588   // Check whether anything changed.
8589   if (!getDerived().AlwaysRebuild() &&
8590       QualifierLoc == S->getQualifierLoc() &&
8591       NameInfo.getName() == S->getNameInfo().getName())
8592     return S;
8593 
8594   // Determine whether this name exists, if we can.
8595   CXXScopeSpec SS;
8596   SS.Adopt(QualifierLoc);
8597   bool Dependent = false;
8598   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8599   case Sema::IER_Exists:
8600     if (S->isIfExists())
8601       break;
8602 
8603     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8604 
8605   case Sema::IER_DoesNotExist:
8606     if (S->isIfNotExists())
8607       break;
8608 
8609     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8610 
8611   case Sema::IER_Dependent:
8612     Dependent = true;
8613     break;
8614 
8615   case Sema::IER_Error:
8616     return StmtError();
8617   }
8618 
8619   // We need to continue with the instantiation, so do so now.
8620   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8621   if (SubStmt.isInvalid())
8622     return StmtError();
8623 
8624   // If we have resolved the name, just transform to the substatement.
8625   if (!Dependent)
8626     return SubStmt;
8627 
8628   // The name is still dependent, so build a dependent expression again.
8629   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8630                                                    S->isIfExists(),
8631                                                    QualifierLoc,
8632                                                    NameInfo,
8633                                                    SubStmt.get());
8634 }
8635 
8636 template<typename Derived>
8637 ExprResult
8638 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8639   NestedNameSpecifierLoc QualifierLoc;
8640   if (E->getQualifierLoc()) {
8641     QualifierLoc
8642     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8643     if (!QualifierLoc)
8644       return ExprError();
8645   }
8646 
8647   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8648     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8649   if (!PD)
8650     return ExprError();
8651 
8652   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8653   if (Base.isInvalid())
8654     return ExprError();
8655 
8656   return new (SemaRef.getASTContext())
8657       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8658                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8659                         QualifierLoc, E->getMemberLoc());
8660 }
8661 
8662 template <typename Derived>
8663 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8664     MSPropertySubscriptExpr *E) {
8665   auto BaseRes = getDerived().TransformExpr(E->getBase());
8666   if (BaseRes.isInvalid())
8667     return ExprError();
8668   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8669   if (IdxRes.isInvalid())
8670     return ExprError();
8671 
8672   if (!getDerived().AlwaysRebuild() &&
8673       BaseRes.get() == E->getBase() &&
8674       IdxRes.get() == E->getIdx())
8675     return E;
8676 
8677   return getDerived().RebuildArraySubscriptExpr(
8678       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8679 }
8680 
8681 template <typename Derived>
8682 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8683   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8684   if (TryBlock.isInvalid())
8685     return StmtError();
8686 
8687   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8688   if (Handler.isInvalid())
8689     return StmtError();
8690 
8691   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8692       Handler.get() == S->getHandler())
8693     return S;
8694 
8695   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8696                                         TryBlock.get(), Handler.get());
8697 }
8698 
8699 template <typename Derived>
8700 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8701   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8702   if (Block.isInvalid())
8703     return StmtError();
8704 
8705   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8706 }
8707 
8708 template <typename Derived>
8709 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8710   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8711   if (FilterExpr.isInvalid())
8712     return StmtError();
8713 
8714   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8715   if (Block.isInvalid())
8716     return StmtError();
8717 
8718   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8719                                            Block.get());
8720 }
8721 
8722 template <typename Derived>
8723 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8724   if (isa<SEHFinallyStmt>(Handler))
8725     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8726   else
8727     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8728 }
8729 
8730 template<typename Derived>
8731 StmtResult
8732 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8733   return S;
8734 }
8735 
8736 //===----------------------------------------------------------------------===//
8737 // OpenMP directive transformation
8738 //===----------------------------------------------------------------------===//
8739 
8740 template <typename Derived>
8741 StmtResult
8742 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8743   // OMPCanonicalLoops are eliminated during transformation, since they will be
8744   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8745   // after transformation.
8746   return getDerived().TransformStmt(L->getLoopStmt());
8747 }
8748 
8749 template <typename Derived>
8750 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8751     OMPExecutableDirective *D) {
8752 
8753   // Transform the clauses
8754   llvm::SmallVector<OMPClause *, 16> TClauses;
8755   ArrayRef<OMPClause *> Clauses = D->clauses();
8756   TClauses.reserve(Clauses.size());
8757   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8758        I != E; ++I) {
8759     if (*I) {
8760       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8761       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8762       getDerived().getSema().EndOpenMPClause();
8763       if (Clause)
8764         TClauses.push_back(Clause);
8765     } else {
8766       TClauses.push_back(nullptr);
8767     }
8768   }
8769   StmtResult AssociatedStmt;
8770   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8771     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8772                                                   /*CurScope=*/nullptr);
8773     StmtResult Body;
8774     {
8775       Sema::CompoundScopeRAII CompoundScope(getSema());
8776       Stmt *CS;
8777       if (D->getDirectiveKind() == OMPD_atomic ||
8778           D->getDirectiveKind() == OMPD_critical ||
8779           D->getDirectiveKind() == OMPD_section ||
8780           D->getDirectiveKind() == OMPD_master)
8781         CS = D->getAssociatedStmt();
8782       else
8783         CS = D->getRawStmt();
8784       Body = getDerived().TransformStmt(CS);
8785       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8786           getSema().getLangOpts().OpenMPIRBuilder)
8787         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8788     }
8789     AssociatedStmt =
8790         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8791     if (AssociatedStmt.isInvalid()) {
8792       return StmtError();
8793     }
8794   }
8795   if (TClauses.size() != Clauses.size()) {
8796     return StmtError();
8797   }
8798 
8799   // Transform directive name for 'omp critical' directive.
8800   DeclarationNameInfo DirName;
8801   if (D->getDirectiveKind() == OMPD_critical) {
8802     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8803     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8804   }
8805   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8806   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8807     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8808   } else if (D->getDirectiveKind() == OMPD_cancel) {
8809     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8810   }
8811 
8812   return getDerived().RebuildOMPExecutableDirective(
8813       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8814       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8815 }
8816 
8817 template <typename Derived>
8818 StmtResult
8819 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8820   // TODO: Fix This
8821   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8822       << getOpenMPDirectiveName(D->getDirectiveKind());
8823   return StmtError();
8824 }
8825 
8826 template <typename Derived>
8827 StmtResult
8828 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8829   DeclarationNameInfo DirName;
8830   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8831                                              D->getBeginLoc());
8832   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8833   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8834   return Res;
8835 }
8836 
8837 template <typename Derived>
8838 StmtResult
8839 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8840   DeclarationNameInfo DirName;
8841   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8842                                              D->getBeginLoc());
8843   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8844   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8845   return Res;
8846 }
8847 
8848 template <typename Derived>
8849 StmtResult
8850 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8851   DeclarationNameInfo DirName;
8852   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8853                                              nullptr, D->getBeginLoc());
8854   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8855   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8856   return Res;
8857 }
8858 
8859 template <typename Derived>
8860 StmtResult
8861 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8862   DeclarationNameInfo DirName;
8863   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8864                                              nullptr, D->getBeginLoc());
8865   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8866   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8867   return Res;
8868 }
8869 
8870 template <typename Derived>
8871 StmtResult
8872 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8873   DeclarationNameInfo DirName;
8874   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8875                                              D->getBeginLoc());
8876   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8877   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8878   return Res;
8879 }
8880 
8881 template <typename Derived>
8882 StmtResult
8883 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8884   DeclarationNameInfo DirName;
8885   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8886                                              D->getBeginLoc());
8887   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8888   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8889   return Res;
8890 }
8891 
8892 template <typename Derived>
8893 StmtResult
8894 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8895   DeclarationNameInfo DirName;
8896   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8897                                              D->getBeginLoc());
8898   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8899   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8900   return Res;
8901 }
8902 
8903 template <typename Derived>
8904 StmtResult
8905 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8906   DeclarationNameInfo DirName;
8907   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8908                                              D->getBeginLoc());
8909   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8910   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8911   return Res;
8912 }
8913 
8914 template <typename Derived>
8915 StmtResult
8916 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8917   DeclarationNameInfo DirName;
8918   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8919                                              D->getBeginLoc());
8920   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8921   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8922   return Res;
8923 }
8924 
8925 template <typename Derived>
8926 StmtResult
8927 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8928   DeclarationNameInfo DirName;
8929   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8930                                              D->getBeginLoc());
8931   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8932   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8933   return Res;
8934 }
8935 
8936 template <typename Derived>
8937 StmtResult
8938 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8939   getDerived().getSema().StartOpenMPDSABlock(
8940       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8941   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8942   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8943   return Res;
8944 }
8945 
8946 template <typename Derived>
8947 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8948     OMPParallelForDirective *D) {
8949   DeclarationNameInfo DirName;
8950   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8951                                              nullptr, D->getBeginLoc());
8952   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8953   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8954   return Res;
8955 }
8956 
8957 template <typename Derived>
8958 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8959     OMPParallelForSimdDirective *D) {
8960   DeclarationNameInfo DirName;
8961   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8962                                              nullptr, D->getBeginLoc());
8963   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8964   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8965   return Res;
8966 }
8967 
8968 template <typename Derived>
8969 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8970     OMPParallelMasterDirective *D) {
8971   DeclarationNameInfo DirName;
8972   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8973                                              nullptr, D->getBeginLoc());
8974   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8975   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8976   return Res;
8977 }
8978 
8979 template <typename Derived>
8980 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
8981     OMPParallelMaskedDirective *D) {
8982   DeclarationNameInfo DirName;
8983   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName,
8984                                              nullptr, D->getBeginLoc());
8985   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8986   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8987   return Res;
8988 }
8989 
8990 template <typename Derived>
8991 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8992     OMPParallelSectionsDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8995                                              nullptr, D->getBeginLoc());
8996   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8997   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8998   return Res;
8999 }
9000 
9001 template <typename Derived>
9002 StmtResult
9003 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
9004   DeclarationNameInfo DirName;
9005   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
9006                                              D->getBeginLoc());
9007   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9008   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9009   return Res;
9010 }
9011 
9012 template <typename Derived>
9013 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
9014     OMPTaskyieldDirective *D) {
9015   DeclarationNameInfo DirName;
9016   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
9017                                              D->getBeginLoc());
9018   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9019   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9020   return Res;
9021 }
9022 
9023 template <typename Derived>
9024 StmtResult
9025 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
9026   DeclarationNameInfo DirName;
9027   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
9028                                              D->getBeginLoc());
9029   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9030   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9031   return Res;
9032 }
9033 
9034 template <typename Derived>
9035 StmtResult
9036 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
9037   DeclarationNameInfo DirName;
9038   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
9039                                              D->getBeginLoc());
9040   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9041   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9042   return Res;
9043 }
9044 
9045 template <typename Derived>
9046 StmtResult
9047 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) {
9048   DeclarationNameInfo DirName;
9049   getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr,
9050                                              D->getBeginLoc());
9051   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9052   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9053   return Res;
9054 }
9055 
9056 template <typename Derived>
9057 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
9058     OMPTaskgroupDirective *D) {
9059   DeclarationNameInfo DirName;
9060   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
9061                                              D->getBeginLoc());
9062   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9063   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9064   return Res;
9065 }
9066 
9067 template <typename Derived>
9068 StmtResult
9069 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
9070   DeclarationNameInfo DirName;
9071   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
9072                                              D->getBeginLoc());
9073   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9074   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9075   return Res;
9076 }
9077 
9078 template <typename Derived>
9079 StmtResult
9080 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
9081   DeclarationNameInfo DirName;
9082   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
9083                                              D->getBeginLoc());
9084   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9085   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9086   return Res;
9087 }
9088 
9089 template <typename Derived>
9090 StmtResult
9091 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
9092   DeclarationNameInfo DirName;
9093   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
9094                                              D->getBeginLoc());
9095   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9096   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9097   return Res;
9098 }
9099 
9100 template <typename Derived>
9101 StmtResult
9102 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
9103   DeclarationNameInfo DirName;
9104   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
9105                                              D->getBeginLoc());
9106   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9107   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9108   return Res;
9109 }
9110 
9111 template <typename Derived>
9112 StmtResult
9113 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
9114   DeclarationNameInfo DirName;
9115   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
9116                                              D->getBeginLoc());
9117   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9118   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9119   return Res;
9120 }
9121 
9122 template <typename Derived>
9123 StmtResult
9124 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
9125   DeclarationNameInfo DirName;
9126   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
9127                                              D->getBeginLoc());
9128   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9129   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9130   return Res;
9131 }
9132 
9133 template <typename Derived>
9134 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9135     OMPTargetDataDirective *D) {
9136   DeclarationNameInfo DirName;
9137   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
9138                                              D->getBeginLoc());
9139   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9140   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9141   return Res;
9142 }
9143 
9144 template <typename Derived>
9145 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9146     OMPTargetEnterDataDirective *D) {
9147   DeclarationNameInfo DirName;
9148   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
9149                                              nullptr, D->getBeginLoc());
9150   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9151   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9152   return Res;
9153 }
9154 
9155 template <typename Derived>
9156 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9157     OMPTargetExitDataDirective *D) {
9158   DeclarationNameInfo DirName;
9159   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
9160                                              nullptr, D->getBeginLoc());
9161   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9162   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9163   return Res;
9164 }
9165 
9166 template <typename Derived>
9167 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9168     OMPTargetParallelDirective *D) {
9169   DeclarationNameInfo DirName;
9170   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
9171                                              nullptr, D->getBeginLoc());
9172   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9173   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9174   return Res;
9175 }
9176 
9177 template <typename Derived>
9178 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9179     OMPTargetParallelForDirective *D) {
9180   DeclarationNameInfo DirName;
9181   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
9182                                              nullptr, D->getBeginLoc());
9183   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9184   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9185   return Res;
9186 }
9187 
9188 template <typename Derived>
9189 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9190     OMPTargetUpdateDirective *D) {
9191   DeclarationNameInfo DirName;
9192   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
9193                                              nullptr, D->getBeginLoc());
9194   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9195   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9196   return Res;
9197 }
9198 
9199 template <typename Derived>
9200 StmtResult
9201 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
9202   DeclarationNameInfo DirName;
9203   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
9204                                              D->getBeginLoc());
9205   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9206   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9207   return Res;
9208 }
9209 
9210 template <typename Derived>
9211 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9212     OMPCancellationPointDirective *D) {
9213   DeclarationNameInfo DirName;
9214   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
9215                                              nullptr, D->getBeginLoc());
9216   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9217   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9218   return Res;
9219 }
9220 
9221 template <typename Derived>
9222 StmtResult
9223 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
9224   DeclarationNameInfo DirName;
9225   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
9226                                              D->getBeginLoc());
9227   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9228   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9229   return Res;
9230 }
9231 
9232 template <typename Derived>
9233 StmtResult
9234 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
9235   DeclarationNameInfo DirName;
9236   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
9237                                              D->getBeginLoc());
9238   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9239   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9240   return Res;
9241 }
9242 
9243 template <typename Derived>
9244 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9245     OMPTaskLoopSimdDirective *D) {
9246   DeclarationNameInfo DirName;
9247   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
9248                                              nullptr, D->getBeginLoc());
9249   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9250   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9251   return Res;
9252 }
9253 
9254 template <typename Derived>
9255 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9256     OMPMasterTaskLoopDirective *D) {
9257   DeclarationNameInfo DirName;
9258   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
9259                                              nullptr, D->getBeginLoc());
9260   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9261   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9262   return Res;
9263 }
9264 
9265 template <typename Derived>
9266 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9267     OMPMaskedTaskLoopDirective *D) {
9268   DeclarationNameInfo DirName;
9269   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName,
9270                                              nullptr, D->getBeginLoc());
9271   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9272   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9273   return Res;
9274 }
9275 
9276 template <typename Derived>
9277 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9278     OMPMasterTaskLoopSimdDirective *D) {
9279   DeclarationNameInfo DirName;
9280   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9281                                              nullptr, D->getBeginLoc());
9282   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9283   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9284   return Res;
9285 }
9286 
9287 template <typename Derived>
9288 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
9289     OMPMaskedTaskLoopSimdDirective *D) {
9290   DeclarationNameInfo DirName;
9291   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName,
9292                                              nullptr, D->getBeginLoc());
9293   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9294   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9295   return Res;
9296 }
9297 
9298 template <typename Derived>
9299 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9300     OMPParallelMasterTaskLoopDirective *D) {
9301   DeclarationNameInfo DirName;
9302   getDerived().getSema().StartOpenMPDSABlock(
9303       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9304   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9305   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9306   return Res;
9307 }
9308 
9309 template <typename Derived>
9310 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
9311     OMPParallelMaskedTaskLoopDirective *D) {
9312   DeclarationNameInfo DirName;
9313   getDerived().getSema().StartOpenMPDSABlock(
9314       OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc());
9315   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9316   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9317   return Res;
9318 }
9319 
9320 template <typename Derived>
9321 StmtResult
9322 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9323     OMPParallelMasterTaskLoopSimdDirective *D) {
9324   DeclarationNameInfo DirName;
9325   getDerived().getSema().StartOpenMPDSABlock(
9326       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9327   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9328   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9329   return Res;
9330 }
9331 
9332 template <typename Derived>
9333 StmtResult
9334 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
9335     OMPParallelMaskedTaskLoopSimdDirective *D) {
9336   DeclarationNameInfo DirName;
9337   getDerived().getSema().StartOpenMPDSABlock(
9338       OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9339   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9340   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9341   return Res;
9342 }
9343 
9344 template <typename Derived>
9345 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9346     OMPDistributeDirective *D) {
9347   DeclarationNameInfo DirName;
9348   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9349                                              D->getBeginLoc());
9350   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9351   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9352   return Res;
9353 }
9354 
9355 template <typename Derived>
9356 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9357     OMPDistributeParallelForDirective *D) {
9358   DeclarationNameInfo DirName;
9359   getDerived().getSema().StartOpenMPDSABlock(
9360       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9361   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9362   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9363   return Res;
9364 }
9365 
9366 template <typename Derived>
9367 StmtResult
9368 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9369     OMPDistributeParallelForSimdDirective *D) {
9370   DeclarationNameInfo DirName;
9371   getDerived().getSema().StartOpenMPDSABlock(
9372       OMPD_distribute_parallel_for_simd, 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>::TransformOMPDistributeSimdDirective(
9380     OMPDistributeSimdDirective *D) {
9381   DeclarationNameInfo DirName;
9382   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9383                                              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 TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9391     OMPTargetParallelForSimdDirective *D) {
9392   DeclarationNameInfo DirName;
9393   getDerived().getSema().StartOpenMPDSABlock(
9394       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9395   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9396   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9397   return Res;
9398 }
9399 
9400 template <typename Derived>
9401 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9402     OMPTargetSimdDirective *D) {
9403   DeclarationNameInfo DirName;
9404   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9405                                              D->getBeginLoc());
9406   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9407   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9408   return Res;
9409 }
9410 
9411 template <typename Derived>
9412 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9413     OMPTeamsDistributeDirective *D) {
9414   DeclarationNameInfo DirName;
9415   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9416                                              nullptr, D->getBeginLoc());
9417   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9418   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9419   return Res;
9420 }
9421 
9422 template <typename Derived>
9423 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9424     OMPTeamsDistributeSimdDirective *D) {
9425   DeclarationNameInfo DirName;
9426   getDerived().getSema().StartOpenMPDSABlock(
9427       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9428   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9429   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9430   return Res;
9431 }
9432 
9433 template <typename Derived>
9434 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9435     OMPTeamsDistributeParallelForSimdDirective *D) {
9436   DeclarationNameInfo DirName;
9437   getDerived().getSema().StartOpenMPDSABlock(
9438       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9439       D->getBeginLoc());
9440   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9441   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9442   return Res;
9443 }
9444 
9445 template <typename Derived>
9446 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9447     OMPTeamsDistributeParallelForDirective *D) {
9448   DeclarationNameInfo DirName;
9449   getDerived().getSema().StartOpenMPDSABlock(
9450       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9451   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9452   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9453   return Res;
9454 }
9455 
9456 template <typename Derived>
9457 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9458     OMPTargetTeamsDirective *D) {
9459   DeclarationNameInfo DirName;
9460   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9461                                              nullptr, D->getBeginLoc());
9462   auto Res = getDerived().TransformOMPExecutableDirective(D);
9463   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9464   return Res;
9465 }
9466 
9467 template <typename Derived>
9468 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9469     OMPTargetTeamsDistributeDirective *D) {
9470   DeclarationNameInfo DirName;
9471   getDerived().getSema().StartOpenMPDSABlock(
9472       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9473   auto Res = getDerived().TransformOMPExecutableDirective(D);
9474   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9475   return Res;
9476 }
9477 
9478 template <typename Derived>
9479 StmtResult
9480 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9481     OMPTargetTeamsDistributeParallelForDirective *D) {
9482   DeclarationNameInfo DirName;
9483   getDerived().getSema().StartOpenMPDSABlock(
9484       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9485       D->getBeginLoc());
9486   auto Res = getDerived().TransformOMPExecutableDirective(D);
9487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9488   return Res;
9489 }
9490 
9491 template <typename Derived>
9492 StmtResult TreeTransform<Derived>::
9493     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9494         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9495   DeclarationNameInfo DirName;
9496   getDerived().getSema().StartOpenMPDSABlock(
9497       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9498       D->getBeginLoc());
9499   auto Res = getDerived().TransformOMPExecutableDirective(D);
9500   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9501   return Res;
9502 }
9503 
9504 template <typename Derived>
9505 StmtResult
9506 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9507     OMPTargetTeamsDistributeSimdDirective *D) {
9508   DeclarationNameInfo DirName;
9509   getDerived().getSema().StartOpenMPDSABlock(
9510       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9511   auto Res = getDerived().TransformOMPExecutableDirective(D);
9512   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9513   return Res;
9514 }
9515 
9516 template <typename Derived>
9517 StmtResult
9518 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9519   DeclarationNameInfo DirName;
9520   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9521                                              D->getBeginLoc());
9522   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9523   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9524   return Res;
9525 }
9526 
9527 template <typename Derived>
9528 StmtResult
9529 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9530   DeclarationNameInfo DirName;
9531   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9532                                              D->getBeginLoc());
9533   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9534   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9535   return Res;
9536 }
9537 
9538 template <typename Derived>
9539 StmtResult
9540 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9541   DeclarationNameInfo DirName;
9542   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9543                                              D->getBeginLoc());
9544   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9545   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9546   return Res;
9547 }
9548 
9549 template <typename Derived>
9550 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9551     OMPGenericLoopDirective *D) {
9552   DeclarationNameInfo DirName;
9553   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9554                                              D->getBeginLoc());
9555   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9556   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9557   return Res;
9558 }
9559 
9560 template <typename Derived>
9561 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9562     OMPTeamsGenericLoopDirective *D) {
9563   DeclarationNameInfo DirName;
9564   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9565                                              D->getBeginLoc());
9566   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9567   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9568   return Res;
9569 }
9570 
9571 template <typename Derived>
9572 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9573     OMPTargetTeamsGenericLoopDirective *D) {
9574   DeclarationNameInfo DirName;
9575   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9576                                              nullptr, D->getBeginLoc());
9577   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9578   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9579   return Res;
9580 }
9581 
9582 template <typename Derived>
9583 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9584     OMPParallelGenericLoopDirective *D) {
9585   DeclarationNameInfo DirName;
9586   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9587                                              nullptr, D->getBeginLoc());
9588   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9589   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9590   return Res;
9591 }
9592 
9593 template <typename Derived>
9594 StmtResult
9595 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9596     OMPTargetParallelGenericLoopDirective *D) {
9597   DeclarationNameInfo DirName;
9598   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9599                                              nullptr, D->getBeginLoc());
9600   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9601   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9602   return Res;
9603 }
9604 
9605 //===----------------------------------------------------------------------===//
9606 // OpenMP clause transformation
9607 //===----------------------------------------------------------------------===//
9608 template <typename Derived>
9609 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9610   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9611   if (Cond.isInvalid())
9612     return nullptr;
9613   return getDerived().RebuildOMPIfClause(
9614       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9615       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9616 }
9617 
9618 template <typename Derived>
9619 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9620   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9621   if (Cond.isInvalid())
9622     return nullptr;
9623   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9624                                             C->getLParenLoc(), C->getEndLoc());
9625 }
9626 
9627 template <typename Derived>
9628 OMPClause *
9629 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9630   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9631   if (NumThreads.isInvalid())
9632     return nullptr;
9633   return getDerived().RebuildOMPNumThreadsClause(
9634       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9635 }
9636 
9637 template <typename Derived>
9638 OMPClause *
9639 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9640   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9641   if (E.isInvalid())
9642     return nullptr;
9643   return getDerived().RebuildOMPSafelenClause(
9644       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9645 }
9646 
9647 template <typename Derived>
9648 OMPClause *
9649 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9650   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9651   if (E.isInvalid())
9652     return nullptr;
9653   return getDerived().RebuildOMPAllocatorClause(
9654       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9655 }
9656 
9657 template <typename Derived>
9658 OMPClause *
9659 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9660   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9661   if (E.isInvalid())
9662     return nullptr;
9663   return getDerived().RebuildOMPSimdlenClause(
9664       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9665 }
9666 
9667 template <typename Derived>
9668 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9669   SmallVector<Expr *, 4> TransformedSizes;
9670   TransformedSizes.reserve(C->getNumSizes());
9671   bool Changed = false;
9672   for (Expr *E : C->getSizesRefs()) {
9673     if (!E) {
9674       TransformedSizes.push_back(nullptr);
9675       continue;
9676     }
9677 
9678     ExprResult T = getDerived().TransformExpr(E);
9679     if (T.isInvalid())
9680       return nullptr;
9681     if (E != T.get())
9682       Changed = true;
9683     TransformedSizes.push_back(T.get());
9684   }
9685 
9686   if (!Changed && !getDerived().AlwaysRebuild())
9687     return C;
9688   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9689                                C->getLParenLoc(), C->getEndLoc());
9690 }
9691 
9692 template <typename Derived>
9693 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9694   if (!getDerived().AlwaysRebuild())
9695     return C;
9696   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9697 }
9698 
9699 template <typename Derived>
9700 OMPClause *
9701 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9702   ExprResult T = getDerived().TransformExpr(C->getFactor());
9703   if (T.isInvalid())
9704     return nullptr;
9705   Expr *Factor = T.get();
9706   bool Changed = Factor != C->getFactor();
9707 
9708   if (!Changed && !getDerived().AlwaysRebuild())
9709     return C;
9710   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9711                                  C->getEndLoc());
9712 }
9713 
9714 template <typename Derived>
9715 OMPClause *
9716 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9717   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9718   if (E.isInvalid())
9719     return nullptr;
9720   return getDerived().RebuildOMPCollapseClause(
9721       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9722 }
9723 
9724 template <typename Derived>
9725 OMPClause *
9726 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9727   return getDerived().RebuildOMPDefaultClause(
9728       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9729       C->getLParenLoc(), C->getEndLoc());
9730 }
9731 
9732 template <typename Derived>
9733 OMPClause *
9734 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9735   return getDerived().RebuildOMPProcBindClause(
9736       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9737       C->getLParenLoc(), C->getEndLoc());
9738 }
9739 
9740 template <typename Derived>
9741 OMPClause *
9742 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9743   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9744   if (E.isInvalid())
9745     return nullptr;
9746   return getDerived().RebuildOMPScheduleClause(
9747       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9748       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9749       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9750       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9751 }
9752 
9753 template <typename Derived>
9754 OMPClause *
9755 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9756   ExprResult E;
9757   if (auto *Num = C->getNumForLoops()) {
9758     E = getDerived().TransformExpr(Num);
9759     if (E.isInvalid())
9760       return nullptr;
9761   }
9762   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9763                                               C->getLParenLoc(), E.get());
9764 }
9765 
9766 template <typename Derived>
9767 OMPClause *
9768 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9769   ExprResult E;
9770   if (Expr *Evt = C->getEventHandler()) {
9771     E = getDerived().TransformExpr(Evt);
9772     if (E.isInvalid())
9773       return nullptr;
9774   }
9775   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9776                                              C->getLParenLoc(), C->getEndLoc());
9777 }
9778 
9779 template <typename Derived>
9780 OMPClause *
9781 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9782   // No need to rebuild this clause, no template-dependent parameters.
9783   return C;
9784 }
9785 
9786 template <typename Derived>
9787 OMPClause *
9788 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9789   // No need to rebuild this clause, no template-dependent parameters.
9790   return C;
9791 }
9792 
9793 template <typename Derived>
9794 OMPClause *
9795 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9796   // No need to rebuild this clause, no template-dependent parameters.
9797   return C;
9798 }
9799 
9800 template <typename Derived>
9801 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9802   // No need to rebuild this clause, no template-dependent parameters.
9803   return C;
9804 }
9805 
9806 template <typename Derived>
9807 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9808   // No need to rebuild this clause, no template-dependent parameters.
9809   return C;
9810 }
9811 
9812 template <typename Derived>
9813 OMPClause *
9814 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9815   // No need to rebuild this clause, no template-dependent parameters.
9816   return C;
9817 }
9818 
9819 template <typename Derived>
9820 OMPClause *
9821 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9822   // No need to rebuild this clause, no template-dependent parameters.
9823   return C;
9824 }
9825 
9826 template <typename Derived>
9827 OMPClause *
9828 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9829   // No need to rebuild this clause, no template-dependent parameters.
9830   return C;
9831 }
9832 
9833 template <typename Derived>
9834 OMPClause *
9835 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9836   // No need to rebuild this clause, no template-dependent parameters.
9837   return C;
9838 }
9839 
9840 template <typename Derived>
9841 OMPClause *
9842 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9843   // No need to rebuild this clause, no template-dependent parameters.
9844   return C;
9845 }
9846 
9847 template <typename Derived>
9848 OMPClause *
9849 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9850   // No need to rebuild this clause, no template-dependent parameters.
9851   return C;
9852 }
9853 
9854 template <typename Derived>
9855 OMPClause *
9856 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9857   // No need to rebuild this clause, no template-dependent parameters.
9858   return C;
9859 }
9860 
9861 template <typename Derived>
9862 OMPClause *
9863 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9864   // No need to rebuild this clause, no template-dependent parameters.
9865   return C;
9866 }
9867 
9868 template <typename Derived>
9869 OMPClause *
9870 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *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>::TransformOMPSIMDClause(OMPSIMDClause *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>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9884   // No need to rebuild this clause, no template-dependent parameters.
9885   return C;
9886 }
9887 
9888 template <typename Derived>
9889 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9890   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9891   if (IVR.isInvalid())
9892     return nullptr;
9893 
9894   OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
9895   InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
9896   for (Expr *E : llvm::drop_begin(C->varlists())) {
9897     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9898     if (ER.isInvalid())
9899       return nullptr;
9900     InteropInfo.PreferTypes.push_back(ER.get());
9901   }
9902   return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
9903                                            C->getBeginLoc(), C->getLParenLoc(),
9904                                            C->getVarLoc(), C->getEndLoc());
9905 }
9906 
9907 template <typename Derived>
9908 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9909   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9910   if (ER.isInvalid())
9911     return nullptr;
9912   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9913                                           C->getLParenLoc(), C->getVarLoc(),
9914                                           C->getEndLoc());
9915 }
9916 
9917 template <typename Derived>
9918 OMPClause *
9919 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9920   ExprResult ER;
9921   if (Expr *IV = C->getInteropVar()) {
9922     ER = getDerived().TransformExpr(IV);
9923     if (ER.isInvalid())
9924       return nullptr;
9925   }
9926   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9927                                               C->getLParenLoc(), C->getVarLoc(),
9928                                               C->getEndLoc());
9929 }
9930 
9931 template <typename Derived>
9932 OMPClause *
9933 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9934   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9935   if (Cond.isInvalid())
9936     return nullptr;
9937   return getDerived().RebuildOMPNovariantsClause(
9938       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9939 }
9940 
9941 template <typename Derived>
9942 OMPClause *
9943 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9944   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9945   if (Cond.isInvalid())
9946     return nullptr;
9947   return getDerived().RebuildOMPNocontextClause(
9948       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9949 }
9950 
9951 template <typename Derived>
9952 OMPClause *
9953 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9954   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9955   if (ThreadID.isInvalid())
9956     return nullptr;
9957   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9958                                              C->getLParenLoc(), C->getEndLoc());
9959 }
9960 
9961 template <typename Derived>
9962 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9963   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9964   if (E.isInvalid())
9965     return nullptr;
9966   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9967                                             C->getLParenLoc(), C->getEndLoc());
9968 }
9969 
9970 template <typename Derived>
9971 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9972     OMPUnifiedAddressClause *C) {
9973   llvm_unreachable("unified_address clause cannot appear in dependent context");
9974 }
9975 
9976 template <typename Derived>
9977 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9978     OMPUnifiedSharedMemoryClause *C) {
9979   llvm_unreachable(
9980       "unified_shared_memory clause cannot appear in dependent context");
9981 }
9982 
9983 template <typename Derived>
9984 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9985     OMPReverseOffloadClause *C) {
9986   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9987 }
9988 
9989 template <typename Derived>
9990 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9991     OMPDynamicAllocatorsClause *C) {
9992   llvm_unreachable(
9993       "dynamic_allocators clause cannot appear in dependent context");
9994 }
9995 
9996 template <typename Derived>
9997 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9998     OMPAtomicDefaultMemOrderClause *C) {
9999   llvm_unreachable(
10000       "atomic_default_mem_order clause cannot appear in dependent context");
10001 }
10002 
10003 template <typename Derived>
10004 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) {
10005   return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(),
10006                                          C->getBeginLoc(), C->getLParenLoc(),
10007                                          C->getEndLoc());
10008 }
10009 
10010 template <typename Derived>
10011 OMPClause *
10012 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) {
10013   return getDerived().RebuildOMPSeverityClause(
10014       C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(),
10015       C->getLParenLoc(), C->getEndLoc());
10016 }
10017 
10018 template <typename Derived>
10019 OMPClause *
10020 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) {
10021   ExprResult E = getDerived().TransformExpr(C->getMessageString());
10022   if (E.isInvalid())
10023     return nullptr;
10024   return getDerived().RebuildOMPMessageClause(
10025       C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(),
10026       C->getEndLoc());
10027 }
10028 
10029 template <typename Derived>
10030 OMPClause *
10031 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
10032   llvm::SmallVector<Expr *, 16> Vars;
10033   Vars.reserve(C->varlist_size());
10034   for (auto *VE : C->varlists()) {
10035     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10036     if (EVar.isInvalid())
10037       return nullptr;
10038     Vars.push_back(EVar.get());
10039   }
10040   return getDerived().RebuildOMPPrivateClause(
10041       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10042 }
10043 
10044 template <typename Derived>
10045 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
10046     OMPFirstprivateClause *C) {
10047   llvm::SmallVector<Expr *, 16> Vars;
10048   Vars.reserve(C->varlist_size());
10049   for (auto *VE : C->varlists()) {
10050     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10051     if (EVar.isInvalid())
10052       return nullptr;
10053     Vars.push_back(EVar.get());
10054   }
10055   return getDerived().RebuildOMPFirstprivateClause(
10056       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10057 }
10058 
10059 template <typename Derived>
10060 OMPClause *
10061 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
10062   llvm::SmallVector<Expr *, 16> Vars;
10063   Vars.reserve(C->varlist_size());
10064   for (auto *VE : C->varlists()) {
10065     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10066     if (EVar.isInvalid())
10067       return nullptr;
10068     Vars.push_back(EVar.get());
10069   }
10070   return getDerived().RebuildOMPLastprivateClause(
10071       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
10072       C->getLParenLoc(), C->getEndLoc());
10073 }
10074 
10075 template <typename Derived>
10076 OMPClause *
10077 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
10078   llvm::SmallVector<Expr *, 16> Vars;
10079   Vars.reserve(C->varlist_size());
10080   for (auto *VE : C->varlists()) {
10081     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10082     if (EVar.isInvalid())
10083       return nullptr;
10084     Vars.push_back(EVar.get());
10085   }
10086   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
10087                                              C->getLParenLoc(), C->getEndLoc());
10088 }
10089 
10090 template <typename Derived>
10091 OMPClause *
10092 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
10093   llvm::SmallVector<Expr *, 16> Vars;
10094   Vars.reserve(C->varlist_size());
10095   for (auto *VE : C->varlists()) {
10096     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10097     if (EVar.isInvalid())
10098       return nullptr;
10099     Vars.push_back(EVar.get());
10100   }
10101   CXXScopeSpec ReductionIdScopeSpec;
10102   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10103 
10104   DeclarationNameInfo NameInfo = C->getNameInfo();
10105   if (NameInfo.getName()) {
10106     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10107     if (!NameInfo.getName())
10108       return nullptr;
10109   }
10110   // Build a list of all UDR decls with the same names ranged by the Scopes.
10111   // The Scope boundary is a duplication of the previous decl.
10112   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10113   for (auto *E : C->reduction_ops()) {
10114     // Transform all the decls.
10115     if (E) {
10116       auto *ULE = cast<UnresolvedLookupExpr>(E);
10117       UnresolvedSet<8> Decls;
10118       for (auto *D : ULE->decls()) {
10119         NamedDecl *InstD =
10120             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10121         Decls.addDecl(InstD, InstD->getAccess());
10122       }
10123       UnresolvedReductions.push_back(
10124        UnresolvedLookupExpr::Create(
10125           SemaRef.Context, /*NamingClass=*/nullptr,
10126           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
10127           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
10128           Decls.begin(), Decls.end()));
10129     } else
10130       UnresolvedReductions.push_back(nullptr);
10131   }
10132   return getDerived().RebuildOMPReductionClause(
10133       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10134       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10135       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10136 }
10137 
10138 template <typename Derived>
10139 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10140     OMPTaskReductionClause *C) {
10141   llvm::SmallVector<Expr *, 16> Vars;
10142   Vars.reserve(C->varlist_size());
10143   for (auto *VE : C->varlists()) {
10144     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10145     if (EVar.isInvalid())
10146       return nullptr;
10147     Vars.push_back(EVar.get());
10148   }
10149   CXXScopeSpec ReductionIdScopeSpec;
10150   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10151 
10152   DeclarationNameInfo NameInfo = C->getNameInfo();
10153   if (NameInfo.getName()) {
10154     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10155     if (!NameInfo.getName())
10156       return nullptr;
10157   }
10158   // Build a list of all UDR decls with the same names ranged by the Scopes.
10159   // The Scope boundary is a duplication of the previous decl.
10160   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10161   for (auto *E : C->reduction_ops()) {
10162     // Transform all the decls.
10163     if (E) {
10164       auto *ULE = cast<UnresolvedLookupExpr>(E);
10165       UnresolvedSet<8> Decls;
10166       for (auto *D : ULE->decls()) {
10167         NamedDecl *InstD =
10168             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10169         Decls.addDecl(InstD, InstD->getAccess());
10170       }
10171       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10172           SemaRef.Context, /*NamingClass=*/nullptr,
10173           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10174           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10175     } else
10176       UnresolvedReductions.push_back(nullptr);
10177   }
10178   return getDerived().RebuildOMPTaskReductionClause(
10179       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10180       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10181 }
10182 
10183 template <typename Derived>
10184 OMPClause *
10185 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
10186   llvm::SmallVector<Expr *, 16> Vars;
10187   Vars.reserve(C->varlist_size());
10188   for (auto *VE : C->varlists()) {
10189     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10190     if (EVar.isInvalid())
10191       return nullptr;
10192     Vars.push_back(EVar.get());
10193   }
10194   CXXScopeSpec ReductionIdScopeSpec;
10195   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10196 
10197   DeclarationNameInfo NameInfo = C->getNameInfo();
10198   if (NameInfo.getName()) {
10199     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10200     if (!NameInfo.getName())
10201       return nullptr;
10202   }
10203   // Build a list of all UDR decls with the same names ranged by the Scopes.
10204   // The Scope boundary is a duplication of the previous decl.
10205   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10206   for (auto *E : C->reduction_ops()) {
10207     // Transform all the decls.
10208     if (E) {
10209       auto *ULE = cast<UnresolvedLookupExpr>(E);
10210       UnresolvedSet<8> Decls;
10211       for (auto *D : ULE->decls()) {
10212         NamedDecl *InstD =
10213             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10214         Decls.addDecl(InstD, InstD->getAccess());
10215       }
10216       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10217           SemaRef.Context, /*NamingClass=*/nullptr,
10218           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10219           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10220     } else
10221       UnresolvedReductions.push_back(nullptr);
10222   }
10223   return getDerived().RebuildOMPInReductionClause(
10224       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10225       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10226 }
10227 
10228 template <typename Derived>
10229 OMPClause *
10230 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
10231   llvm::SmallVector<Expr *, 16> Vars;
10232   Vars.reserve(C->varlist_size());
10233   for (auto *VE : C->varlists()) {
10234     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10235     if (EVar.isInvalid())
10236       return nullptr;
10237     Vars.push_back(EVar.get());
10238   }
10239   ExprResult Step = getDerived().TransformExpr(C->getStep());
10240   if (Step.isInvalid())
10241     return nullptr;
10242   return getDerived().RebuildOMPLinearClause(
10243       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
10244       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
10245 }
10246 
10247 template <typename Derived>
10248 OMPClause *
10249 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
10250   llvm::SmallVector<Expr *, 16> Vars;
10251   Vars.reserve(C->varlist_size());
10252   for (auto *VE : C->varlists()) {
10253     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10254     if (EVar.isInvalid())
10255       return nullptr;
10256     Vars.push_back(EVar.get());
10257   }
10258   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
10259   if (Alignment.isInvalid())
10260     return nullptr;
10261   return getDerived().RebuildOMPAlignedClause(
10262       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
10263       C->getColonLoc(), C->getEndLoc());
10264 }
10265 
10266 template <typename Derived>
10267 OMPClause *
10268 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
10269   llvm::SmallVector<Expr *, 16> Vars;
10270   Vars.reserve(C->varlist_size());
10271   for (auto *VE : C->varlists()) {
10272     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10273     if (EVar.isInvalid())
10274       return nullptr;
10275     Vars.push_back(EVar.get());
10276   }
10277   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
10278                                              C->getLParenLoc(), C->getEndLoc());
10279 }
10280 
10281 template <typename Derived>
10282 OMPClause *
10283 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
10284   llvm::SmallVector<Expr *, 16> Vars;
10285   Vars.reserve(C->varlist_size());
10286   for (auto *VE : C->varlists()) {
10287     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10288     if (EVar.isInvalid())
10289       return nullptr;
10290     Vars.push_back(EVar.get());
10291   }
10292   return getDerived().RebuildOMPCopyprivateClause(
10293       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10294 }
10295 
10296 template <typename Derived>
10297 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
10298   llvm::SmallVector<Expr *, 16> Vars;
10299   Vars.reserve(C->varlist_size());
10300   for (auto *VE : C->varlists()) {
10301     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10302     if (EVar.isInvalid())
10303       return nullptr;
10304     Vars.push_back(EVar.get());
10305   }
10306   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
10307                                             C->getLParenLoc(), C->getEndLoc());
10308 }
10309 
10310 template <typename Derived>
10311 OMPClause *
10312 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
10313   ExprResult E = getDerived().TransformExpr(C->getDepobj());
10314   if (E.isInvalid())
10315     return nullptr;
10316   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
10317                                              C->getLParenLoc(), C->getEndLoc());
10318 }
10319 
10320 template <typename Derived>
10321 OMPClause *
10322 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
10323   llvm::SmallVector<Expr *, 16> Vars;
10324   Expr *DepModifier = C->getModifier();
10325   if (DepModifier) {
10326     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
10327     if (DepModRes.isInvalid())
10328       return nullptr;
10329     DepModifier = DepModRes.get();
10330   }
10331   Vars.reserve(C->varlist_size());
10332   for (auto *VE : C->varlists()) {
10333     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10334     if (EVar.isInvalid())
10335       return nullptr;
10336     Vars.push_back(EVar.get());
10337   }
10338   return getDerived().RebuildOMPDependClause(
10339       {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(),
10340        C->getOmpAllMemoryLoc()},
10341       DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10342 }
10343 
10344 template <typename Derived>
10345 OMPClause *
10346 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10347   ExprResult E = getDerived().TransformExpr(C->getDevice());
10348   if (E.isInvalid())
10349     return nullptr;
10350   return getDerived().RebuildOMPDeviceClause(
10351       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10352       C->getModifierLoc(), C->getEndLoc());
10353 }
10354 
10355 template <typename Derived, class T>
10356 bool transformOMPMappableExprListClause(
10357     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10358     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10359     DeclarationNameInfo &MapperIdInfo,
10360     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10361   // Transform expressions in the list.
10362   Vars.reserve(C->varlist_size());
10363   for (auto *VE : C->varlists()) {
10364     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10365     if (EVar.isInvalid())
10366       return true;
10367     Vars.push_back(EVar.get());
10368   }
10369   // Transform mapper scope specifier and identifier.
10370   NestedNameSpecifierLoc QualifierLoc;
10371   if (C->getMapperQualifierLoc()) {
10372     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10373         C->getMapperQualifierLoc());
10374     if (!QualifierLoc)
10375       return true;
10376   }
10377   MapperIdScopeSpec.Adopt(QualifierLoc);
10378   MapperIdInfo = C->getMapperIdInfo();
10379   if (MapperIdInfo.getName()) {
10380     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10381     if (!MapperIdInfo.getName())
10382       return true;
10383   }
10384   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10385   // the previous user-defined mapper lookup in dependent environment.
10386   for (auto *E : C->mapperlists()) {
10387     // Transform all the decls.
10388     if (E) {
10389       auto *ULE = cast<UnresolvedLookupExpr>(E);
10390       UnresolvedSet<8> Decls;
10391       for (auto *D : ULE->decls()) {
10392         NamedDecl *InstD =
10393             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10394         Decls.addDecl(InstD, InstD->getAccess());
10395       }
10396       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10397           TT.getSema().Context, /*NamingClass=*/nullptr,
10398           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10399           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10400           Decls.end()));
10401     } else {
10402       UnresolvedMappers.push_back(nullptr);
10403     }
10404   }
10405   return false;
10406 }
10407 
10408 template <typename Derived>
10409 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10410   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10411   llvm::SmallVector<Expr *, 16> Vars;
10412   Expr *IteratorModifier = C->getIteratorModifier();
10413   if (IteratorModifier) {
10414     ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
10415     if (MapModRes.isInvalid())
10416       return nullptr;
10417     IteratorModifier = MapModRes.get();
10418   }
10419   CXXScopeSpec MapperIdScopeSpec;
10420   DeclarationNameInfo MapperIdInfo;
10421   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10422   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10423           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10424     return nullptr;
10425   return getDerived().RebuildOMPMapClause(
10426       IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(),
10427       MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(),
10428       C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10429 }
10430 
10431 template <typename Derived>
10432 OMPClause *
10433 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10434   Expr *Allocator = C->getAllocator();
10435   if (Allocator) {
10436     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10437     if (AllocatorRes.isInvalid())
10438       return nullptr;
10439     Allocator = AllocatorRes.get();
10440   }
10441   llvm::SmallVector<Expr *, 16> Vars;
10442   Vars.reserve(C->varlist_size());
10443   for (auto *VE : C->varlists()) {
10444     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10445     if (EVar.isInvalid())
10446       return nullptr;
10447     Vars.push_back(EVar.get());
10448   }
10449   return getDerived().RebuildOMPAllocateClause(
10450       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10451       C->getEndLoc());
10452 }
10453 
10454 template <typename Derived>
10455 OMPClause *
10456 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10457   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10458   if (E.isInvalid())
10459     return nullptr;
10460   return getDerived().RebuildOMPNumTeamsClause(
10461       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10462 }
10463 
10464 template <typename Derived>
10465 OMPClause *
10466 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10467   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10468   if (E.isInvalid())
10469     return nullptr;
10470   return getDerived().RebuildOMPThreadLimitClause(
10471       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10472 }
10473 
10474 template <typename Derived>
10475 OMPClause *
10476 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10477   ExprResult E = getDerived().TransformExpr(C->getPriority());
10478   if (E.isInvalid())
10479     return nullptr;
10480   return getDerived().RebuildOMPPriorityClause(
10481       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10482 }
10483 
10484 template <typename Derived>
10485 OMPClause *
10486 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10487   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10488   if (E.isInvalid())
10489     return nullptr;
10490   return getDerived().RebuildOMPGrainsizeClause(
10491       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10492       C->getModifierLoc(), C->getEndLoc());
10493 }
10494 
10495 template <typename Derived>
10496 OMPClause *
10497 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10498   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10499   if (E.isInvalid())
10500     return nullptr;
10501   return getDerived().RebuildOMPNumTasksClause(
10502       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10503       C->getModifierLoc(), C->getEndLoc());
10504 }
10505 
10506 template <typename Derived>
10507 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10508   ExprResult E = getDerived().TransformExpr(C->getHint());
10509   if (E.isInvalid())
10510     return nullptr;
10511   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10512                                            C->getLParenLoc(), C->getEndLoc());
10513 }
10514 
10515 template <typename Derived>
10516 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10517     OMPDistScheduleClause *C) {
10518   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10519   if (E.isInvalid())
10520     return nullptr;
10521   return getDerived().RebuildOMPDistScheduleClause(
10522       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10523       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10524 }
10525 
10526 template <typename Derived>
10527 OMPClause *
10528 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10529   // Rebuild Defaultmap Clause since we need to invoke the checking of
10530   // defaultmap(none:variable-category) after template initialization.
10531   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10532                                                  C->getDefaultmapKind(),
10533                                                  C->getBeginLoc(),
10534                                                  C->getLParenLoc(),
10535                                                  C->getDefaultmapModifierLoc(),
10536                                                  C->getDefaultmapKindLoc(),
10537                                                  C->getEndLoc());
10538 }
10539 
10540 template <typename Derived>
10541 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10542   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10543   llvm::SmallVector<Expr *, 16> Vars;
10544   CXXScopeSpec MapperIdScopeSpec;
10545   DeclarationNameInfo MapperIdInfo;
10546   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10547   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10548           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10549     return nullptr;
10550   return getDerived().RebuildOMPToClause(
10551       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10552       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10553 }
10554 
10555 template <typename Derived>
10556 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10557   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10558   llvm::SmallVector<Expr *, 16> Vars;
10559   CXXScopeSpec MapperIdScopeSpec;
10560   DeclarationNameInfo MapperIdInfo;
10561   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10562   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10563           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10564     return nullptr;
10565   return getDerived().RebuildOMPFromClause(
10566       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10567       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10568 }
10569 
10570 template <typename Derived>
10571 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10572     OMPUseDevicePtrClause *C) {
10573   llvm::SmallVector<Expr *, 16> Vars;
10574   Vars.reserve(C->varlist_size());
10575   for (auto *VE : C->varlists()) {
10576     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10577     if (EVar.isInvalid())
10578       return nullptr;
10579     Vars.push_back(EVar.get());
10580   }
10581   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10582   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10583 }
10584 
10585 template <typename Derived>
10586 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10587     OMPUseDeviceAddrClause *C) {
10588   llvm::SmallVector<Expr *, 16> Vars;
10589   Vars.reserve(C->varlist_size());
10590   for (auto *VE : C->varlists()) {
10591     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10592     if (EVar.isInvalid())
10593       return nullptr;
10594     Vars.push_back(EVar.get());
10595   }
10596   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10597   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10598 }
10599 
10600 template <typename Derived>
10601 OMPClause *
10602 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10603   llvm::SmallVector<Expr *, 16> Vars;
10604   Vars.reserve(C->varlist_size());
10605   for (auto *VE : C->varlists()) {
10606     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10607     if (EVar.isInvalid())
10608       return nullptr;
10609     Vars.push_back(EVar.get());
10610   }
10611   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10612   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10613 }
10614 
10615 template <typename Derived>
10616 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
10617     OMPHasDeviceAddrClause *C) {
10618   llvm::SmallVector<Expr *, 16> Vars;
10619   Vars.reserve(C->varlist_size());
10620   for (auto *VE : C->varlists()) {
10621     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10622     if (EVar.isInvalid())
10623       return nullptr;
10624     Vars.push_back(EVar.get());
10625   }
10626   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10627   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
10628 }
10629 
10630 template <typename Derived>
10631 OMPClause *
10632 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10633   llvm::SmallVector<Expr *, 16> Vars;
10634   Vars.reserve(C->varlist_size());
10635   for (auto *VE : C->varlists()) {
10636     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10637     if (EVar.isInvalid())
10638       return nullptr;
10639     Vars.push_back(EVar.get());
10640   }
10641   return getDerived().RebuildOMPNontemporalClause(
10642       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10643 }
10644 
10645 template <typename Derived>
10646 OMPClause *
10647 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10648   llvm::SmallVector<Expr *, 16> Vars;
10649   Vars.reserve(C->varlist_size());
10650   for (auto *VE : C->varlists()) {
10651     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10652     if (EVar.isInvalid())
10653       return nullptr;
10654     Vars.push_back(EVar.get());
10655   }
10656   return getDerived().RebuildOMPInclusiveClause(
10657       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10658 }
10659 
10660 template <typename Derived>
10661 OMPClause *
10662 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10663   llvm::SmallVector<Expr *, 16> Vars;
10664   Vars.reserve(C->varlist_size());
10665   for (auto *VE : C->varlists()) {
10666     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10667     if (EVar.isInvalid())
10668       return nullptr;
10669     Vars.push_back(EVar.get());
10670   }
10671   return getDerived().RebuildOMPExclusiveClause(
10672       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10673 }
10674 
10675 template <typename Derived>
10676 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10677     OMPUsesAllocatorsClause *C) {
10678   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10679   Data.reserve(C->getNumberOfAllocators());
10680   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10681     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10682     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10683     if (Allocator.isInvalid())
10684       continue;
10685     ExprResult AllocatorTraits;
10686     if (Expr *AT = D.AllocatorTraits) {
10687       AllocatorTraits = getDerived().TransformExpr(AT);
10688       if (AllocatorTraits.isInvalid())
10689         continue;
10690     }
10691     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10692     NewD.Allocator = Allocator.get();
10693     NewD.AllocatorTraits = AllocatorTraits.get();
10694     NewD.LParenLoc = D.LParenLoc;
10695     NewD.RParenLoc = D.RParenLoc;
10696   }
10697   return getDerived().RebuildOMPUsesAllocatorsClause(
10698       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10699 }
10700 
10701 template <typename Derived>
10702 OMPClause *
10703 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10704   SmallVector<Expr *, 4> Locators;
10705   Locators.reserve(C->varlist_size());
10706   ExprResult ModifierRes;
10707   if (Expr *Modifier = C->getModifier()) {
10708     ModifierRes = getDerived().TransformExpr(Modifier);
10709     if (ModifierRes.isInvalid())
10710       return nullptr;
10711   }
10712   for (Expr *E : C->varlists()) {
10713     ExprResult Locator = getDerived().TransformExpr(E);
10714     if (Locator.isInvalid())
10715       continue;
10716     Locators.push_back(Locator.get());
10717   }
10718   return getDerived().RebuildOMPAffinityClause(
10719       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10720       ModifierRes.get(), Locators);
10721 }
10722 
10723 template <typename Derived>
10724 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10725   return getDerived().RebuildOMPOrderClause(
10726       C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(),
10727       C->getEndLoc(), C->getModifier(), C->getModifierKwLoc());
10728 }
10729 
10730 template <typename Derived>
10731 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10732   return getDerived().RebuildOMPBindClause(
10733       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10734       C->getLParenLoc(), C->getEndLoc());
10735 }
10736 
10737 template <typename Derived>
10738 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
10739     OMPXDynCGroupMemClause *C) {
10740   ExprResult Size = getDerived().TransformExpr(C->getSize());
10741   if (Size.isInvalid())
10742     return nullptr;
10743   return getDerived().RebuildOMPXDynCGroupMemClause(
10744       Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10745 }
10746 
10747 template <typename Derived>
10748 OMPClause *
10749 TreeTransform<Derived>::TransformOMPDoacrossClause(OMPDoacrossClause *C) {
10750   llvm::SmallVector<Expr *, 16> Vars;
10751   Vars.reserve(C->varlist_size());
10752   for (auto *VE : C->varlists()) {
10753     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10754     if (EVar.isInvalid())
10755       return nullptr;
10756     Vars.push_back(EVar.get());
10757   }
10758   return getDerived().RebuildOMPDoacrossClause(
10759       C->getDependenceType(), C->getDependenceLoc(), C->getColonLoc(), Vars,
10760       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10761 }
10762 
10763 //===----------------------------------------------------------------------===//
10764 // Expression transformation
10765 //===----------------------------------------------------------------------===//
10766 template<typename Derived>
10767 ExprResult
10768 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10769   return TransformExpr(E->getSubExpr());
10770 }
10771 
10772 template <typename Derived>
10773 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10774     SYCLUniqueStableNameExpr *E) {
10775   if (!E->isTypeDependent())
10776     return E;
10777 
10778   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10779 
10780   if (!NewT)
10781     return ExprError();
10782 
10783   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10784     return E;
10785 
10786   return getDerived().RebuildSYCLUniqueStableNameExpr(
10787       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10788 }
10789 
10790 template<typename Derived>
10791 ExprResult
10792 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10793   if (!E->isTypeDependent())
10794     return E;
10795 
10796   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10797                                             E->getIdentKind());
10798 }
10799 
10800 template<typename Derived>
10801 ExprResult
10802 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10803   NestedNameSpecifierLoc QualifierLoc;
10804   if (E->getQualifierLoc()) {
10805     QualifierLoc
10806       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10807     if (!QualifierLoc)
10808       return ExprError();
10809   }
10810 
10811   ValueDecl *ND
10812     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10813                                                          E->getDecl()));
10814   if (!ND)
10815     return ExprError();
10816 
10817   NamedDecl *Found = ND;
10818   if (E->getFoundDecl() != E->getDecl()) {
10819     Found = cast_or_null<NamedDecl>(
10820         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10821     if (!Found)
10822       return ExprError();
10823   }
10824 
10825   DeclarationNameInfo NameInfo = E->getNameInfo();
10826   if (NameInfo.getName()) {
10827     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10828     if (!NameInfo.getName())
10829       return ExprError();
10830   }
10831 
10832   if (!getDerived().AlwaysRebuild() &&
10833       QualifierLoc == E->getQualifierLoc() &&
10834       ND == E->getDecl() &&
10835       Found == E->getFoundDecl() &&
10836       NameInfo.getName() == E->getDecl()->getDeclName() &&
10837       !E->hasExplicitTemplateArgs()) {
10838 
10839     // Mark it referenced in the new context regardless.
10840     // FIXME: this is a bit instantiation-specific.
10841     SemaRef.MarkDeclRefReferenced(E);
10842 
10843     return E;
10844   }
10845 
10846   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10847   if (E->hasExplicitTemplateArgs()) {
10848     TemplateArgs = &TransArgs;
10849     TransArgs.setLAngleLoc(E->getLAngleLoc());
10850     TransArgs.setRAngleLoc(E->getRAngleLoc());
10851     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10852                                                 E->getNumTemplateArgs(),
10853                                                 TransArgs))
10854       return ExprError();
10855   }
10856 
10857   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10858                                          Found, TemplateArgs);
10859 }
10860 
10861 template<typename Derived>
10862 ExprResult
10863 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10864   return E;
10865 }
10866 
10867 template <typename Derived>
10868 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10869     FixedPointLiteral *E) {
10870   return E;
10871 }
10872 
10873 template<typename Derived>
10874 ExprResult
10875 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10876   return E;
10877 }
10878 
10879 template<typename Derived>
10880 ExprResult
10881 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10882   return E;
10883 }
10884 
10885 template<typename Derived>
10886 ExprResult
10887 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10888   return E;
10889 }
10890 
10891 template<typename Derived>
10892 ExprResult
10893 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10894   return E;
10895 }
10896 
10897 template<typename Derived>
10898 ExprResult
10899 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10900   return getDerived().TransformCallExpr(E);
10901 }
10902 
10903 template<typename Derived>
10904 ExprResult
10905 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10906   ExprResult ControllingExpr;
10907   TypeSourceInfo *ControllingType = nullptr;
10908   if (E->isExprPredicate())
10909     ControllingExpr = getDerived().TransformExpr(E->getControllingExpr());
10910   else
10911     ControllingType = getDerived().TransformType(E->getControllingType());
10912 
10913   if (ControllingExpr.isInvalid() && !ControllingType)
10914     return ExprError();
10915 
10916   SmallVector<Expr *, 4> AssocExprs;
10917   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10918   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10919     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10920     if (TSI) {
10921       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10922       if (!AssocType)
10923         return ExprError();
10924       AssocTypes.push_back(AssocType);
10925     } else {
10926       AssocTypes.push_back(nullptr);
10927     }
10928 
10929     ExprResult AssocExpr =
10930         getDerived().TransformExpr(Assoc.getAssociationExpr());
10931     if (AssocExpr.isInvalid())
10932       return ExprError();
10933     AssocExprs.push_back(AssocExpr.get());
10934   }
10935 
10936   if (!ControllingType)
10937   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10938                                                   E->getDefaultLoc(),
10939                                                   E->getRParenLoc(),
10940                                                   ControllingExpr.get(),
10941                                                   AssocTypes,
10942                                                   AssocExprs);
10943   return getDerived().RebuildGenericSelectionExpr(
10944       E->getGenericLoc(), E->getDefaultLoc(), E->getRParenLoc(),
10945       ControllingType, AssocTypes, AssocExprs);
10946 }
10947 
10948 template<typename Derived>
10949 ExprResult
10950 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10951   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10952   if (SubExpr.isInvalid())
10953     return ExprError();
10954 
10955   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10956     return E;
10957 
10958   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10959                                        E->getRParen());
10960 }
10961 
10962 /// The operand of a unary address-of operator has special rules: it's
10963 /// allowed to refer to a non-static member of a class even if there's no 'this'
10964 /// object available.
10965 template<typename Derived>
10966 ExprResult
10967 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10968   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10969     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10970   else
10971     return getDerived().TransformExpr(E);
10972 }
10973 
10974 template<typename Derived>
10975 ExprResult
10976 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10977   ExprResult SubExpr;
10978   if (E->getOpcode() == UO_AddrOf)
10979     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10980   else
10981     SubExpr = TransformExpr(E->getSubExpr());
10982   if (SubExpr.isInvalid())
10983     return ExprError();
10984 
10985   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10986     return E;
10987 
10988   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10989                                            E->getOpcode(),
10990                                            SubExpr.get());
10991 }
10992 
10993 template<typename Derived>
10994 ExprResult
10995 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10996   // Transform the type.
10997   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10998   if (!Type)
10999     return ExprError();
11000 
11001   // Transform all of the components into components similar to what the
11002   // parser uses.
11003   // FIXME: It would be slightly more efficient in the non-dependent case to
11004   // just map FieldDecls, rather than requiring the rebuilder to look for
11005   // the fields again. However, __builtin_offsetof is rare enough in
11006   // template code that we don't care.
11007   bool ExprChanged = false;
11008   typedef Sema::OffsetOfComponent Component;
11009   SmallVector<Component, 4> Components;
11010   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
11011     const OffsetOfNode &ON = E->getComponent(I);
11012     Component Comp;
11013     Comp.isBrackets = true;
11014     Comp.LocStart = ON.getSourceRange().getBegin();
11015     Comp.LocEnd = ON.getSourceRange().getEnd();
11016     switch (ON.getKind()) {
11017     case OffsetOfNode::Array: {
11018       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
11019       ExprResult Index = getDerived().TransformExpr(FromIndex);
11020       if (Index.isInvalid())
11021         return ExprError();
11022 
11023       ExprChanged = ExprChanged || Index.get() != FromIndex;
11024       Comp.isBrackets = true;
11025       Comp.U.E = Index.get();
11026       break;
11027     }
11028 
11029     case OffsetOfNode::Field:
11030     case OffsetOfNode::Identifier:
11031       Comp.isBrackets = false;
11032       Comp.U.IdentInfo = ON.getFieldName();
11033       if (!Comp.U.IdentInfo)
11034         continue;
11035 
11036       break;
11037 
11038     case OffsetOfNode::Base:
11039       // Will be recomputed during the rebuild.
11040       continue;
11041     }
11042 
11043     Components.push_back(Comp);
11044   }
11045 
11046   // If nothing changed, retain the existing expression.
11047   if (!getDerived().AlwaysRebuild() &&
11048       Type == E->getTypeSourceInfo() &&
11049       !ExprChanged)
11050     return E;
11051 
11052   // Build a new offsetof expression.
11053   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
11054                                           Components, E->getRParenLoc());
11055 }
11056 
11057 template<typename Derived>
11058 ExprResult
11059 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
11060   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
11061          "opaque value expression requires transformation");
11062   return E;
11063 }
11064 
11065 template<typename Derived>
11066 ExprResult
11067 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
11068   return E;
11069 }
11070 
11071 template <typename Derived>
11072 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
11073   llvm::SmallVector<Expr *, 8> Children;
11074   bool Changed = false;
11075   for (Expr *C : E->subExpressions()) {
11076     ExprResult NewC = getDerived().TransformExpr(C);
11077     if (NewC.isInvalid())
11078       return ExprError();
11079     Children.push_back(NewC.get());
11080 
11081     Changed |= NewC.get() != C;
11082   }
11083   if (!getDerived().AlwaysRebuild() && !Changed)
11084     return E;
11085   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
11086                                           Children, E->getType());
11087 }
11088 
11089 template<typename Derived>
11090 ExprResult
11091 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
11092   // Rebuild the syntactic form.  The original syntactic form has
11093   // opaque-value expressions in it, so strip those away and rebuild
11094   // the result.  This is a really awful way of doing this, but the
11095   // better solution (rebuilding the semantic expressions and
11096   // rebinding OVEs as necessary) doesn't work; we'd need
11097   // TreeTransform to not strip away implicit conversions.
11098   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
11099   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
11100   if (result.isInvalid()) return ExprError();
11101 
11102   // If that gives us a pseudo-object result back, the pseudo-object
11103   // expression must have been an lvalue-to-rvalue conversion which we
11104   // should reapply.
11105   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
11106     result = SemaRef.checkPseudoObjectRValue(result.get());
11107 
11108   return result;
11109 }
11110 
11111 template<typename Derived>
11112 ExprResult
11113 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
11114                                                 UnaryExprOrTypeTraitExpr *E) {
11115   if (E->isArgumentType()) {
11116     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
11117 
11118     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11119     if (!NewT)
11120       return ExprError();
11121 
11122     if (!getDerived().AlwaysRebuild() && OldT == NewT)
11123       return E;
11124 
11125     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
11126                                                     E->getKind(),
11127                                                     E->getSourceRange());
11128   }
11129 
11130   // C++0x [expr.sizeof]p1:
11131   //   The operand is either an expression, which is an unevaluated operand
11132   //   [...]
11133   EnterExpressionEvaluationContext Unevaluated(
11134       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11135       Sema::ReuseLambdaContextDecl);
11136 
11137   // Try to recover if we have something like sizeof(T::X) where X is a type.
11138   // Notably, there must be *exactly* one set of parens if X is a type.
11139   TypeSourceInfo *RecoveryTSI = nullptr;
11140   ExprResult SubExpr;
11141   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
11142   if (auto *DRE =
11143           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
11144     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
11145         PE, DRE, false, &RecoveryTSI);
11146   else
11147     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
11148 
11149   if (RecoveryTSI) {
11150     return getDerived().RebuildUnaryExprOrTypeTrait(
11151         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
11152   } else if (SubExpr.isInvalid())
11153     return ExprError();
11154 
11155   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
11156     return E;
11157 
11158   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
11159                                                   E->getOperatorLoc(),
11160                                                   E->getKind(),
11161                                                   E->getSourceRange());
11162 }
11163 
11164 template<typename Derived>
11165 ExprResult
11166 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
11167   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11168   if (LHS.isInvalid())
11169     return ExprError();
11170 
11171   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11172   if (RHS.isInvalid())
11173     return ExprError();
11174 
11175 
11176   if (!getDerived().AlwaysRebuild() &&
11177       LHS.get() == E->getLHS() &&
11178       RHS.get() == E->getRHS())
11179     return E;
11180 
11181   return getDerived().RebuildArraySubscriptExpr(
11182       LHS.get(),
11183       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
11184 }
11185 
11186 template <typename Derived>
11187 ExprResult
11188 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
11189   ExprResult Base = getDerived().TransformExpr(E->getBase());
11190   if (Base.isInvalid())
11191     return ExprError();
11192 
11193   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
11194   if (RowIdx.isInvalid())
11195     return ExprError();
11196 
11197   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
11198   if (ColumnIdx.isInvalid())
11199     return ExprError();
11200 
11201   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11202       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
11203     return E;
11204 
11205   return getDerived().RebuildMatrixSubscriptExpr(
11206       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
11207 }
11208 
11209 template <typename Derived>
11210 ExprResult
11211 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
11212   ExprResult Base = getDerived().TransformExpr(E->getBase());
11213   if (Base.isInvalid())
11214     return ExprError();
11215 
11216   ExprResult LowerBound;
11217   if (E->getLowerBound()) {
11218     LowerBound = getDerived().TransformExpr(E->getLowerBound());
11219     if (LowerBound.isInvalid())
11220       return ExprError();
11221   }
11222 
11223   ExprResult Length;
11224   if (E->getLength()) {
11225     Length = getDerived().TransformExpr(E->getLength());
11226     if (Length.isInvalid())
11227       return ExprError();
11228   }
11229 
11230   ExprResult Stride;
11231   if (Expr *Str = E->getStride()) {
11232     Stride = getDerived().TransformExpr(Str);
11233     if (Stride.isInvalid())
11234       return ExprError();
11235   }
11236 
11237   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11238       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
11239     return E;
11240 
11241   return getDerived().RebuildOMPArraySectionExpr(
11242       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
11243       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
11244       E->getRBracketLoc());
11245 }
11246 
11247 template <typename Derived>
11248 ExprResult
11249 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
11250   ExprResult Base = getDerived().TransformExpr(E->getBase());
11251   if (Base.isInvalid())
11252     return ExprError();
11253 
11254   SmallVector<Expr *, 4> Dims;
11255   bool ErrorFound = false;
11256   for (Expr *Dim : E->getDimensions()) {
11257     ExprResult DimRes = getDerived().TransformExpr(Dim);
11258     if (DimRes.isInvalid()) {
11259       ErrorFound = true;
11260       continue;
11261     }
11262     Dims.push_back(DimRes.get());
11263   }
11264 
11265   if (ErrorFound)
11266     return ExprError();
11267   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
11268                                                  E->getRParenLoc(), Dims,
11269                                                  E->getBracketsRanges());
11270 }
11271 
11272 template <typename Derived>
11273 ExprResult
11274 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
11275   unsigned NumIterators = E->numOfIterators();
11276   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
11277 
11278   bool ErrorFound = false;
11279   bool NeedToRebuild = getDerived().AlwaysRebuild();
11280   for (unsigned I = 0; I < NumIterators; ++I) {
11281     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
11282     Data[I].DeclIdent = D->getIdentifier();
11283     Data[I].DeclIdentLoc = D->getLocation();
11284     if (D->getLocation() == D->getBeginLoc()) {
11285       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
11286              "Implicit type must be int.");
11287     } else {
11288       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
11289       QualType DeclTy = getDerived().TransformType(D->getType());
11290       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
11291     }
11292     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
11293     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
11294     ExprResult End = getDerived().TransformExpr(Range.End);
11295     ExprResult Step = getDerived().TransformExpr(Range.Step);
11296     ErrorFound = ErrorFound ||
11297                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
11298                                                !Data[I].Type.get().isNull())) ||
11299                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
11300     if (ErrorFound)
11301       continue;
11302     Data[I].Range.Begin = Begin.get();
11303     Data[I].Range.End = End.get();
11304     Data[I].Range.Step = Step.get();
11305     Data[I].AssignLoc = E->getAssignLoc(I);
11306     Data[I].ColonLoc = E->getColonLoc(I);
11307     Data[I].SecColonLoc = E->getSecondColonLoc(I);
11308     NeedToRebuild =
11309         NeedToRebuild ||
11310         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
11311                                        D->getType().getTypePtrOrNull()) ||
11312         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
11313         Range.Step != Data[I].Range.Step;
11314   }
11315   if (ErrorFound)
11316     return ExprError();
11317   if (!NeedToRebuild)
11318     return E;
11319 
11320   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
11321       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
11322   if (!Res.isUsable())
11323     return Res;
11324   auto *IE = cast<OMPIteratorExpr>(Res.get());
11325   for (unsigned I = 0; I < NumIterators; ++I)
11326     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
11327                                       IE->getIteratorDecl(I));
11328   return Res;
11329 }
11330 
11331 template<typename Derived>
11332 ExprResult
11333 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
11334   // Transform the callee.
11335   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11336   if (Callee.isInvalid())
11337     return ExprError();
11338 
11339   // Transform arguments.
11340   bool ArgChanged = false;
11341   SmallVector<Expr*, 8> Args;
11342   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11343                                   &ArgChanged))
11344     return ExprError();
11345 
11346   if (!getDerived().AlwaysRebuild() &&
11347       Callee.get() == E->getCallee() &&
11348       !ArgChanged)
11349     return SemaRef.MaybeBindToTemporary(E);
11350 
11351   // FIXME: Wrong source location information for the '('.
11352   SourceLocation FakeLParenLoc
11353     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11354 
11355   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11356   if (E->hasStoredFPFeatures()) {
11357     FPOptionsOverride NewOverrides = E->getFPFeatures();
11358     getSema().CurFPFeatures =
11359         NewOverrides.applyOverrides(getSema().getLangOpts());
11360     getSema().FpPragmaStack.CurrentValue = NewOverrides;
11361   }
11362 
11363   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11364                                       Args,
11365                                       E->getRParenLoc());
11366 }
11367 
11368 template<typename Derived>
11369 ExprResult
11370 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
11371   ExprResult Base = getDerived().TransformExpr(E->getBase());
11372   if (Base.isInvalid())
11373     return ExprError();
11374 
11375   NestedNameSpecifierLoc QualifierLoc;
11376   if (E->hasQualifier()) {
11377     QualifierLoc
11378       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11379 
11380     if (!QualifierLoc)
11381       return ExprError();
11382   }
11383   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11384 
11385   ValueDecl *Member
11386     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
11387                                                          E->getMemberDecl()));
11388   if (!Member)
11389     return ExprError();
11390 
11391   NamedDecl *FoundDecl = E->getFoundDecl();
11392   if (FoundDecl == E->getMemberDecl()) {
11393     FoundDecl = Member;
11394   } else {
11395     FoundDecl = cast_or_null<NamedDecl>(
11396                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11397     if (!FoundDecl)
11398       return ExprError();
11399   }
11400 
11401   if (!getDerived().AlwaysRebuild() &&
11402       Base.get() == E->getBase() &&
11403       QualifierLoc == E->getQualifierLoc() &&
11404       Member == E->getMemberDecl() &&
11405       FoundDecl == E->getFoundDecl() &&
11406       !E->hasExplicitTemplateArgs()) {
11407 
11408     // Skip for member expression of (this->f), rebuilt thisi->f is needed
11409     // for Openmp where the field need to be privatizized in the case.
11410     if (!(isa<CXXThisExpr>(E->getBase()) &&
11411           getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) {
11412       // Mark it referenced in the new context regardless.
11413       // FIXME: this is a bit instantiation-specific.
11414       SemaRef.MarkMemberReferenced(E);
11415       return E;
11416     }
11417   }
11418 
11419   TemplateArgumentListInfo TransArgs;
11420   if (E->hasExplicitTemplateArgs()) {
11421     TransArgs.setLAngleLoc(E->getLAngleLoc());
11422     TransArgs.setRAngleLoc(E->getRAngleLoc());
11423     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11424                                                 E->getNumTemplateArgs(),
11425                                                 TransArgs))
11426       return ExprError();
11427   }
11428 
11429   // FIXME: Bogus source location for the operator
11430   SourceLocation FakeOperatorLoc =
11431       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11432 
11433   // FIXME: to do this check properly, we will need to preserve the
11434   // first-qualifier-in-scope here, just in case we had a dependent
11435   // base (and therefore couldn't do the check) and a
11436   // nested-name-qualifier (and therefore could do the lookup).
11437   NamedDecl *FirstQualifierInScope = nullptr;
11438   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11439   if (MemberNameInfo.getName()) {
11440     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11441     if (!MemberNameInfo.getName())
11442       return ExprError();
11443   }
11444 
11445   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11446                                         E->isArrow(),
11447                                         QualifierLoc,
11448                                         TemplateKWLoc,
11449                                         MemberNameInfo,
11450                                         Member,
11451                                         FoundDecl,
11452                                         (E->hasExplicitTemplateArgs()
11453                                            ? &TransArgs : nullptr),
11454                                         FirstQualifierInScope);
11455 }
11456 
11457 template<typename Derived>
11458 ExprResult
11459 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11460   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11461   if (LHS.isInvalid())
11462     return ExprError();
11463 
11464   ExprResult RHS =
11465       getDerived().TransformInitializer(E->getRHS(), /*NotCopyInit=*/false);
11466   if (RHS.isInvalid())
11467     return ExprError();
11468 
11469   if (!getDerived().AlwaysRebuild() &&
11470       LHS.get() == E->getLHS() &&
11471       RHS.get() == E->getRHS())
11472     return E;
11473 
11474   if (E->isCompoundAssignmentOp())
11475     // FPFeatures has already been established from trailing storage
11476     return getDerived().RebuildBinaryOperator(
11477         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11478   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11479   FPOptionsOverride NewOverrides(E->getFPFeatures());
11480   getSema().CurFPFeatures =
11481       NewOverrides.applyOverrides(getSema().getLangOpts());
11482   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11483   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11484                                             LHS.get(), RHS.get());
11485 }
11486 
11487 template <typename Derived>
11488 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11489     CXXRewrittenBinaryOperator *E) {
11490   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11491 
11492   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11493   if (LHS.isInvalid())
11494     return ExprError();
11495 
11496   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11497   if (RHS.isInvalid())
11498     return ExprError();
11499 
11500   // Extract the already-resolved callee declarations so that we can restrict
11501   // ourselves to using them as the unqualified lookup results when rebuilding.
11502   UnresolvedSet<2> UnqualLookups;
11503   bool ChangedAnyLookups = false;
11504   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11505                             const_cast<Expr *>(Decomp.InnerBinOp)};
11506   for (Expr *PossibleBinOp : PossibleBinOps) {
11507     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11508     if (!Op)
11509       continue;
11510     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11511     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11512       continue;
11513 
11514     // Transform the callee in case we built a call to a local extern
11515     // declaration.
11516     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11517         E->getOperatorLoc(), Callee->getFoundDecl()));
11518     if (!Found)
11519       return ExprError();
11520     if (Found != Callee->getFoundDecl())
11521       ChangedAnyLookups = true;
11522     UnqualLookups.addDecl(Found);
11523   }
11524 
11525   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11526       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11527     // Mark all functions used in the rewrite as referenced. Note that when
11528     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11529     // function calls, and/or there might be a user-defined conversion sequence
11530     // applied to the operands of the <.
11531     // FIXME: this is a bit instantiation-specific.
11532     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11533     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11534     return E;
11535   }
11536 
11537   return getDerived().RebuildCXXRewrittenBinaryOperator(
11538       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11539 }
11540 
11541 template<typename Derived>
11542 ExprResult
11543 TreeTransform<Derived>::TransformCompoundAssignOperator(
11544                                                       CompoundAssignOperator *E) {
11545   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11546   FPOptionsOverride NewOverrides(E->getFPFeatures());
11547   getSema().CurFPFeatures =
11548       NewOverrides.applyOverrides(getSema().getLangOpts());
11549   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11550   return getDerived().TransformBinaryOperator(E);
11551 }
11552 
11553 template<typename Derived>
11554 ExprResult TreeTransform<Derived>::
11555 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11556   // Just rebuild the common and RHS expressions and see whether we
11557   // get any changes.
11558 
11559   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11560   if (commonExpr.isInvalid())
11561     return ExprError();
11562 
11563   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11564   if (rhs.isInvalid())
11565     return ExprError();
11566 
11567   if (!getDerived().AlwaysRebuild() &&
11568       commonExpr.get() == e->getCommon() &&
11569       rhs.get() == e->getFalseExpr())
11570     return e;
11571 
11572   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11573                                                  e->getQuestionLoc(),
11574                                                  nullptr,
11575                                                  e->getColonLoc(),
11576                                                  rhs.get());
11577 }
11578 
11579 template<typename Derived>
11580 ExprResult
11581 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11582   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11583   if (Cond.isInvalid())
11584     return ExprError();
11585 
11586   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11587   if (LHS.isInvalid())
11588     return ExprError();
11589 
11590   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11591   if (RHS.isInvalid())
11592     return ExprError();
11593 
11594   if (!getDerived().AlwaysRebuild() &&
11595       Cond.get() == E->getCond() &&
11596       LHS.get() == E->getLHS() &&
11597       RHS.get() == E->getRHS())
11598     return E;
11599 
11600   return getDerived().RebuildConditionalOperator(Cond.get(),
11601                                                  E->getQuestionLoc(),
11602                                                  LHS.get(),
11603                                                  E->getColonLoc(),
11604                                                  RHS.get());
11605 }
11606 
11607 template<typename Derived>
11608 ExprResult
11609 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11610   // Implicit casts are eliminated during transformation, since they
11611   // will be recomputed by semantic analysis after transformation.
11612   return getDerived().TransformExpr(E->getSubExprAsWritten());
11613 }
11614 
11615 template<typename Derived>
11616 ExprResult
11617 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11618   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11619   if (!Type)
11620     return ExprError();
11621 
11622   ExprResult SubExpr
11623     = getDerived().TransformExpr(E->getSubExprAsWritten());
11624   if (SubExpr.isInvalid())
11625     return ExprError();
11626 
11627   if (!getDerived().AlwaysRebuild() &&
11628       Type == E->getTypeInfoAsWritten() &&
11629       SubExpr.get() == E->getSubExpr())
11630     return E;
11631 
11632   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11633                                             Type,
11634                                             E->getRParenLoc(),
11635                                             SubExpr.get());
11636 }
11637 
11638 template<typename Derived>
11639 ExprResult
11640 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11641   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11642   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11643   if (!NewT)
11644     return ExprError();
11645 
11646   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11647   if (Init.isInvalid())
11648     return ExprError();
11649 
11650   if (!getDerived().AlwaysRebuild() &&
11651       OldT == NewT &&
11652       Init.get() == E->getInitializer())
11653     return SemaRef.MaybeBindToTemporary(E);
11654 
11655   // Note: the expression type doesn't necessarily match the
11656   // type-as-written, but that's okay, because it should always be
11657   // derivable from the initializer.
11658 
11659   return getDerived().RebuildCompoundLiteralExpr(
11660       E->getLParenLoc(), NewT,
11661       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11662 }
11663 
11664 template<typename Derived>
11665 ExprResult
11666 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11667   ExprResult Base = getDerived().TransformExpr(E->getBase());
11668   if (Base.isInvalid())
11669     return ExprError();
11670 
11671   if (!getDerived().AlwaysRebuild() &&
11672       Base.get() == E->getBase())
11673     return E;
11674 
11675   // FIXME: Bad source location
11676   SourceLocation FakeOperatorLoc =
11677       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11678   return getDerived().RebuildExtVectorElementExpr(
11679       Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
11680       E->getAccessor());
11681 }
11682 
11683 template<typename Derived>
11684 ExprResult
11685 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11686   if (InitListExpr *Syntactic = E->getSyntacticForm())
11687     E = Syntactic;
11688 
11689   bool InitChanged = false;
11690 
11691   EnterExpressionEvaluationContext Context(
11692       getSema(), EnterExpressionEvaluationContext::InitList);
11693 
11694   SmallVector<Expr*, 4> Inits;
11695   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11696                                   Inits, &InitChanged))
11697     return ExprError();
11698 
11699   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11700     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11701     // in some cases. We can't reuse it in general, because the syntactic and
11702     // semantic forms are linked, and we can't know that semantic form will
11703     // match even if the syntactic form does.
11704   }
11705 
11706   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11707                                       E->getRBraceLoc());
11708 }
11709 
11710 template<typename Derived>
11711 ExprResult
11712 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11713   Designation Desig;
11714 
11715   // transform the initializer value
11716   ExprResult Init = getDerived().TransformExpr(E->getInit());
11717   if (Init.isInvalid())
11718     return ExprError();
11719 
11720   // transform the designators.
11721   SmallVector<Expr*, 4> ArrayExprs;
11722   bool ExprChanged = false;
11723   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11724     if (D.isFieldDesignator()) {
11725       Desig.AddDesignator(Designator::CreateFieldDesignator(
11726           D.getFieldName(), D.getDotLoc(), D.getFieldLoc()));
11727       if (D.getFieldDecl()) {
11728         FieldDecl *Field = cast_or_null<FieldDecl>(
11729             getDerived().TransformDecl(D.getFieldLoc(), D.getFieldDecl()));
11730         if (Field != D.getFieldDecl())
11731           // Rebuild the expression when the transformed FieldDecl is
11732           // different to the already assigned FieldDecl.
11733           ExprChanged = true;
11734       } else {
11735         // Ensure that the designator expression is rebuilt when there isn't
11736         // a resolved FieldDecl in the designator as we don't want to assign
11737         // a FieldDecl to a pattern designator that will be instantiated again.
11738         ExprChanged = true;
11739       }
11740       continue;
11741     }
11742 
11743     if (D.isArrayDesignator()) {
11744       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11745       if (Index.isInvalid())
11746         return ExprError();
11747 
11748       Desig.AddDesignator(
11749           Designator::CreateArrayDesignator(Index.get(), D.getLBracketLoc()));
11750 
11751       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11752       ArrayExprs.push_back(Index.get());
11753       continue;
11754     }
11755 
11756     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11757     ExprResult Start
11758       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11759     if (Start.isInvalid())
11760       return ExprError();
11761 
11762     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11763     if (End.isInvalid())
11764       return ExprError();
11765 
11766     Desig.AddDesignator(Designator::CreateArrayRangeDesignator(
11767         Start.get(), End.get(), D.getLBracketLoc(), D.getEllipsisLoc()));
11768 
11769     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11770                   End.get() != E->getArrayRangeEnd(D);
11771 
11772     ArrayExprs.push_back(Start.get());
11773     ArrayExprs.push_back(End.get());
11774   }
11775 
11776   if (!getDerived().AlwaysRebuild() &&
11777       Init.get() == E->getInit() &&
11778       !ExprChanged)
11779     return E;
11780 
11781   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11782                                                 E->getEqualOrColonLoc(),
11783                                                 E->usesGNUSyntax(), Init.get());
11784 }
11785 
11786 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11787 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11788 template<typename Derived>
11789 ExprResult
11790 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11791     DesignatedInitUpdateExpr *E) {
11792   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11793                    "initializer");
11794   return ExprError();
11795 }
11796 
11797 template<typename Derived>
11798 ExprResult
11799 TreeTransform<Derived>::TransformNoInitExpr(
11800     NoInitExpr *E) {
11801   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11802   return ExprError();
11803 }
11804 
11805 template<typename Derived>
11806 ExprResult
11807 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11808   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11809   return ExprError();
11810 }
11811 
11812 template<typename Derived>
11813 ExprResult
11814 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11815   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11816   return ExprError();
11817 }
11818 
11819 template<typename Derived>
11820 ExprResult
11821 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11822                                                      ImplicitValueInitExpr *E) {
11823   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11824 
11825   // FIXME: Will we ever have proper type location here? Will we actually
11826   // need to transform the type?
11827   QualType T = getDerived().TransformType(E->getType());
11828   if (T.isNull())
11829     return ExprError();
11830 
11831   if (!getDerived().AlwaysRebuild() &&
11832       T == E->getType())
11833     return E;
11834 
11835   return getDerived().RebuildImplicitValueInitExpr(T);
11836 }
11837 
11838 template<typename Derived>
11839 ExprResult
11840 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11841   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11842   if (!TInfo)
11843     return ExprError();
11844 
11845   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11846   if (SubExpr.isInvalid())
11847     return ExprError();
11848 
11849   if (!getDerived().AlwaysRebuild() &&
11850       TInfo == E->getWrittenTypeInfo() &&
11851       SubExpr.get() == E->getSubExpr())
11852     return E;
11853 
11854   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11855                                        TInfo, E->getRParenLoc());
11856 }
11857 
11858 template<typename Derived>
11859 ExprResult
11860 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11861   bool ArgumentChanged = false;
11862   SmallVector<Expr*, 4> Inits;
11863   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11864                      &ArgumentChanged))
11865     return ExprError();
11866 
11867   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11868                                            Inits,
11869                                            E->getRParenLoc());
11870 }
11871 
11872 /// Transform an address-of-label expression.
11873 ///
11874 /// By default, the transformation of an address-of-label expression always
11875 /// rebuilds the expression, so that the label identifier can be resolved to
11876 /// the corresponding label statement by semantic analysis.
11877 template<typename Derived>
11878 ExprResult
11879 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11880   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11881                                         E->getLabel());
11882   if (!LD)
11883     return ExprError();
11884 
11885   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11886                                            cast<LabelDecl>(LD));
11887 }
11888 
11889 template<typename Derived>
11890 ExprResult
11891 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11892   SemaRef.ActOnStartStmtExpr();
11893   StmtResult SubStmt
11894     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11895   if (SubStmt.isInvalid()) {
11896     SemaRef.ActOnStmtExprError();
11897     return ExprError();
11898   }
11899 
11900   unsigned OldDepth = E->getTemplateDepth();
11901   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11902 
11903   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11904       SubStmt.get() == E->getSubStmt()) {
11905     // Calling this an 'error' is unintuitive, but it does the right thing.
11906     SemaRef.ActOnStmtExprError();
11907     return SemaRef.MaybeBindToTemporary(E);
11908   }
11909 
11910   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11911                                       E->getRParenLoc(), NewDepth);
11912 }
11913 
11914 template<typename Derived>
11915 ExprResult
11916 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11917   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11918   if (Cond.isInvalid())
11919     return ExprError();
11920 
11921   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11922   if (LHS.isInvalid())
11923     return ExprError();
11924 
11925   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11926   if (RHS.isInvalid())
11927     return ExprError();
11928 
11929   if (!getDerived().AlwaysRebuild() &&
11930       Cond.get() == E->getCond() &&
11931       LHS.get() == E->getLHS() &&
11932       RHS.get() == E->getRHS())
11933     return E;
11934 
11935   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11936                                         Cond.get(), LHS.get(), RHS.get(),
11937                                         E->getRParenLoc());
11938 }
11939 
11940 template<typename Derived>
11941 ExprResult
11942 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11943   return E;
11944 }
11945 
11946 template<typename Derived>
11947 ExprResult
11948 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11949   switch (E->getOperator()) {
11950   case OO_New:
11951   case OO_Delete:
11952   case OO_Array_New:
11953   case OO_Array_Delete:
11954     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11955 
11956   case OO_Subscript:
11957   case OO_Call: {
11958     // This is a call to an object's operator().
11959     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11960 
11961     // Transform the object itself.
11962     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11963     if (Object.isInvalid())
11964       return ExprError();
11965 
11966     // FIXME: Poor location information
11967     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11968         static_cast<Expr *>(Object.get())->getEndLoc());
11969 
11970     // Transform the call arguments.
11971     SmallVector<Expr*, 8> Args;
11972     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11973                                     Args))
11974       return ExprError();
11975 
11976     if (E->getOperator() == OO_Subscript)
11977       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11978                                                   Args, E->getEndLoc());
11979 
11980     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11981                                         E->getEndLoc());
11982   }
11983 
11984 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11985   case OO_##Name:                                                              \
11986     break;
11987 
11988 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11989 #include "clang/Basic/OperatorKinds.def"
11990 
11991   case OO_Conditional:
11992     llvm_unreachable("conditional operator is not actually overloadable");
11993 
11994   case OO_None:
11995   case NUM_OVERLOADED_OPERATORS:
11996     llvm_unreachable("not an overloaded operator?");
11997   }
11998 
11999   ExprResult First;
12000   if (E->getOperator() == OO_Amp)
12001     First = getDerived().TransformAddressOfOperand(E->getArg(0));
12002   else
12003     First = getDerived().TransformExpr(E->getArg(0));
12004   if (First.isInvalid())
12005     return ExprError();
12006 
12007   ExprResult Second;
12008   if (E->getNumArgs() == 2) {
12009     Second =
12010         getDerived().TransformInitializer(E->getArg(1), /*NotCopyInit=*/false);
12011     if (Second.isInvalid())
12012       return ExprError();
12013   }
12014 
12015   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
12016   FPOptionsOverride NewOverrides(E->getFPFeatures());
12017   getSema().CurFPFeatures =
12018       NewOverrides.applyOverrides(getSema().getLangOpts());
12019   getSema().FpPragmaStack.CurrentValue = NewOverrides;
12020 
12021   Expr *Callee = E->getCallee();
12022   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12023     LookupResult R(SemaRef, ULE->getName(), ULE->getNameLoc(),
12024                    Sema::LookupOrdinaryName);
12025     if (getDerived().TransformOverloadExprDecls(ULE, ULE->requiresADL(), R))
12026       return ExprError();
12027 
12028     return getDerived().RebuildCXXOperatorCallExpr(
12029         E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
12030         ULE->requiresADL(), R.asUnresolvedSet(), First.get(), Second.get());
12031   }
12032 
12033   UnresolvedSet<1> Functions;
12034   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
12035     Callee = ICE->getSubExprAsWritten();
12036   NamedDecl *DR = cast<DeclRefExpr>(Callee)->getDecl();
12037   ValueDecl *VD = cast_or_null<ValueDecl>(
12038       getDerived().TransformDecl(DR->getLocation(), DR));
12039   if (!VD)
12040     return ExprError();
12041 
12042   if (!isa<CXXMethodDecl>(VD))
12043     Functions.addDecl(VD);
12044 
12045   return getDerived().RebuildCXXOperatorCallExpr(
12046       E->getOperator(), E->getOperatorLoc(), Callee->getBeginLoc(),
12047       /*RequiresADL=*/false, Functions, First.get(), Second.get());
12048 }
12049 
12050 template<typename Derived>
12051 ExprResult
12052 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
12053   return getDerived().TransformCallExpr(E);
12054 }
12055 
12056 template <typename Derived>
12057 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
12058   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
12059                          getSema().CurContext != E->getParentContext();
12060 
12061   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
12062     return E;
12063 
12064   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
12065                                            E->getBeginLoc(), E->getEndLoc(),
12066                                            getSema().CurContext);
12067 }
12068 
12069 template<typename Derived>
12070 ExprResult
12071 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
12072   // Transform the callee.
12073   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
12074   if (Callee.isInvalid())
12075     return ExprError();
12076 
12077   // Transform exec config.
12078   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
12079   if (EC.isInvalid())
12080     return ExprError();
12081 
12082   // Transform arguments.
12083   bool ArgChanged = false;
12084   SmallVector<Expr*, 8> Args;
12085   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12086                                   &ArgChanged))
12087     return ExprError();
12088 
12089   if (!getDerived().AlwaysRebuild() &&
12090       Callee.get() == E->getCallee() &&
12091       !ArgChanged)
12092     return SemaRef.MaybeBindToTemporary(E);
12093 
12094   // FIXME: Wrong source location information for the '('.
12095   SourceLocation FakeLParenLoc
12096     = ((Expr *)Callee.get())->getSourceRange().getBegin();
12097   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
12098                                       Args,
12099                                       E->getRParenLoc(), EC.get());
12100 }
12101 
12102 template<typename Derived>
12103 ExprResult
12104 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
12105   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
12106   if (!Type)
12107     return ExprError();
12108 
12109   ExprResult SubExpr
12110     = getDerived().TransformExpr(E->getSubExprAsWritten());
12111   if (SubExpr.isInvalid())
12112     return ExprError();
12113 
12114   if (!getDerived().AlwaysRebuild() &&
12115       Type == E->getTypeInfoAsWritten() &&
12116       SubExpr.get() == E->getSubExpr())
12117     return E;
12118   return getDerived().RebuildCXXNamedCastExpr(
12119       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
12120       Type, E->getAngleBrackets().getEnd(),
12121       // FIXME. this should be '(' location
12122       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
12123 }
12124 
12125 template<typename Derived>
12126 ExprResult
12127 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
12128   TypeSourceInfo *TSI =
12129       getDerived().TransformType(BCE->getTypeInfoAsWritten());
12130   if (!TSI)
12131     return ExprError();
12132 
12133   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
12134   if (Sub.isInvalid())
12135     return ExprError();
12136 
12137   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
12138                                                 Sub.get(), BCE->getEndLoc());
12139 }
12140 
12141 template<typename Derived>
12142 ExprResult
12143 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
12144   return getDerived().TransformCXXNamedCastExpr(E);
12145 }
12146 
12147 template<typename Derived>
12148 ExprResult
12149 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
12150   return getDerived().TransformCXXNamedCastExpr(E);
12151 }
12152 
12153 template<typename Derived>
12154 ExprResult
12155 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
12156                                                       CXXReinterpretCastExpr *E) {
12157   return getDerived().TransformCXXNamedCastExpr(E);
12158 }
12159 
12160 template<typename Derived>
12161 ExprResult
12162 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
12163   return getDerived().TransformCXXNamedCastExpr(E);
12164 }
12165 
12166 template<typename Derived>
12167 ExprResult
12168 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
12169   return getDerived().TransformCXXNamedCastExpr(E);
12170 }
12171 
12172 template<typename Derived>
12173 ExprResult
12174 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
12175                                                      CXXFunctionalCastExpr *E) {
12176   TypeSourceInfo *Type =
12177       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
12178   if (!Type)
12179     return ExprError();
12180 
12181   ExprResult SubExpr
12182     = getDerived().TransformExpr(E->getSubExprAsWritten());
12183   if (SubExpr.isInvalid())
12184     return ExprError();
12185 
12186   if (!getDerived().AlwaysRebuild() &&
12187       Type == E->getTypeInfoAsWritten() &&
12188       SubExpr.get() == E->getSubExpr())
12189     return E;
12190 
12191   return getDerived().RebuildCXXFunctionalCastExpr(Type,
12192                                                    E->getLParenLoc(),
12193                                                    SubExpr.get(),
12194                                                    E->getRParenLoc(),
12195                                                    E->isListInitialization());
12196 }
12197 
12198 template<typename Derived>
12199 ExprResult
12200 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
12201   if (E->isTypeOperand()) {
12202     TypeSourceInfo *TInfo
12203       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12204     if (!TInfo)
12205       return ExprError();
12206 
12207     if (!getDerived().AlwaysRebuild() &&
12208         TInfo == E->getTypeOperandSourceInfo())
12209       return E;
12210 
12211     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12212                                              TInfo, E->getEndLoc());
12213   }
12214 
12215   // Typeid's operand is an unevaluated context, unless it's a polymorphic
12216   // type.  We must not unilaterally enter unevaluated context here, as then
12217   // semantic processing can re-transform an already transformed operand.
12218   Expr *Op = E->getExprOperand();
12219   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
12220   if (E->isGLValue())
12221     if (auto *RecordT = Op->getType()->getAs<RecordType>())
12222       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
12223         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
12224 
12225   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
12226                                                Sema::ReuseLambdaContextDecl);
12227 
12228   ExprResult SubExpr = getDerived().TransformExpr(Op);
12229   if (SubExpr.isInvalid())
12230     return ExprError();
12231 
12232   if (!getDerived().AlwaysRebuild() &&
12233       SubExpr.get() == E->getExprOperand())
12234     return E;
12235 
12236   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12237                                            SubExpr.get(), E->getEndLoc());
12238 }
12239 
12240 template<typename Derived>
12241 ExprResult
12242 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
12243   if (E->isTypeOperand()) {
12244     TypeSourceInfo *TInfo
12245       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12246     if (!TInfo)
12247       return ExprError();
12248 
12249     if (!getDerived().AlwaysRebuild() &&
12250         TInfo == E->getTypeOperandSourceInfo())
12251       return E;
12252 
12253     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12254                                              TInfo, E->getEndLoc());
12255   }
12256 
12257   EnterExpressionEvaluationContext Unevaluated(
12258       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12259 
12260   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
12261   if (SubExpr.isInvalid())
12262     return ExprError();
12263 
12264   if (!getDerived().AlwaysRebuild() &&
12265       SubExpr.get() == E->getExprOperand())
12266     return E;
12267 
12268   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12269                                            SubExpr.get(), E->getEndLoc());
12270 }
12271 
12272 template<typename Derived>
12273 ExprResult
12274 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
12275   return E;
12276 }
12277 
12278 template<typename Derived>
12279 ExprResult
12280 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
12281                                                      CXXNullPtrLiteralExpr *E) {
12282   return E;
12283 }
12284 
12285 template<typename Derived>
12286 ExprResult
12287 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
12288   QualType T = getSema().getCurrentThisType();
12289 
12290   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
12291     // Mark it referenced in the new context regardless.
12292     // FIXME: this is a bit instantiation-specific.
12293     getSema().MarkThisReferenced(E);
12294     return E;
12295   }
12296 
12297   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
12298 }
12299 
12300 template<typename Derived>
12301 ExprResult
12302 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
12303   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12304   if (SubExpr.isInvalid())
12305     return ExprError();
12306 
12307   if (!getDerived().AlwaysRebuild() &&
12308       SubExpr.get() == E->getSubExpr())
12309     return E;
12310 
12311   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
12312                                           E->isThrownVariableInScope());
12313 }
12314 
12315 template<typename Derived>
12316 ExprResult
12317 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
12318   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
12319       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
12320   if (!Param)
12321     return ExprError();
12322 
12323   ExprResult InitRes;
12324   if (E->hasRewrittenInit()) {
12325     InitRes = getDerived().TransformExpr(E->getRewrittenExpr());
12326     if (InitRes.isInvalid())
12327       return ExprError();
12328   }
12329 
12330   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
12331       E->getUsedContext() == SemaRef.CurContext &&
12332       InitRes.get() == E->getRewrittenExpr())
12333     return E;
12334 
12335   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
12336                                                InitRes.get());
12337 }
12338 
12339 template<typename Derived>
12340 ExprResult
12341 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
12342   FieldDecl *Field = cast_or_null<FieldDecl>(
12343       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
12344   if (!Field)
12345     return ExprError();
12346 
12347   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
12348       E->getUsedContext() == SemaRef.CurContext)
12349     return E;
12350 
12351   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
12352 }
12353 
12354 template<typename Derived>
12355 ExprResult
12356 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
12357                                                     CXXScalarValueInitExpr *E) {
12358   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
12359   if (!T)
12360     return ExprError();
12361 
12362   if (!getDerived().AlwaysRebuild() &&
12363       T == E->getTypeSourceInfo())
12364     return E;
12365 
12366   return getDerived().RebuildCXXScalarValueInitExpr(T,
12367                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
12368                                                     E->getRParenLoc());
12369 }
12370 
12371 template<typename Derived>
12372 ExprResult
12373 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
12374   // Transform the type that we're allocating
12375   TypeSourceInfo *AllocTypeInfo =
12376       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
12377   if (!AllocTypeInfo)
12378     return ExprError();
12379 
12380   // Transform the size of the array we're allocating (if any).
12381   std::optional<Expr *> ArraySize;
12382   if (E->isArray()) {
12383     ExprResult NewArraySize;
12384     if (std::optional<Expr *> OldArraySize = E->getArraySize()) {
12385       NewArraySize = getDerived().TransformExpr(*OldArraySize);
12386       if (NewArraySize.isInvalid())
12387         return ExprError();
12388     }
12389     ArraySize = NewArraySize.get();
12390   }
12391 
12392   // Transform the placement arguments (if any).
12393   bool ArgumentChanged = false;
12394   SmallVector<Expr*, 8> PlacementArgs;
12395   if (getDerived().TransformExprs(E->getPlacementArgs(),
12396                                   E->getNumPlacementArgs(), true,
12397                                   PlacementArgs, &ArgumentChanged))
12398     return ExprError();
12399 
12400   // Transform the initializer (if any).
12401   Expr *OldInit = E->getInitializer();
12402   ExprResult NewInit;
12403   if (OldInit)
12404     NewInit = getDerived().TransformInitializer(OldInit, true);
12405   if (NewInit.isInvalid())
12406     return ExprError();
12407 
12408   // Transform new operator and delete operator.
12409   FunctionDecl *OperatorNew = nullptr;
12410   if (E->getOperatorNew()) {
12411     OperatorNew = cast_or_null<FunctionDecl>(
12412         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
12413     if (!OperatorNew)
12414       return ExprError();
12415   }
12416 
12417   FunctionDecl *OperatorDelete = nullptr;
12418   if (E->getOperatorDelete()) {
12419     OperatorDelete = cast_or_null<FunctionDecl>(
12420         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12421     if (!OperatorDelete)
12422       return ExprError();
12423   }
12424 
12425   if (!getDerived().AlwaysRebuild() &&
12426       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12427       ArraySize == E->getArraySize() &&
12428       NewInit.get() == OldInit &&
12429       OperatorNew == E->getOperatorNew() &&
12430       OperatorDelete == E->getOperatorDelete() &&
12431       !ArgumentChanged) {
12432     // Mark any declarations we need as referenced.
12433     // FIXME: instantiation-specific.
12434     if (OperatorNew)
12435       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12436     if (OperatorDelete)
12437       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12438 
12439     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12440       QualType ElementType
12441         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12442       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12443         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12444         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12445           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12446         }
12447       }
12448     }
12449 
12450     return E;
12451   }
12452 
12453   QualType AllocType = AllocTypeInfo->getType();
12454   if (!ArraySize) {
12455     // If no array size was specified, but the new expression was
12456     // instantiated with an array type (e.g., "new T" where T is
12457     // instantiated with "int[4]"), extract the outer bound from the
12458     // array type as our array size. We do this with constant and
12459     // dependently-sized array types.
12460     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12461     if (!ArrayT) {
12462       // Do nothing
12463     } else if (const ConstantArrayType *ConsArrayT
12464                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12465       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12466                                          SemaRef.Context.getSizeType(),
12467                                          /*FIXME:*/ E->getBeginLoc());
12468       AllocType = ConsArrayT->getElementType();
12469     } else if (const DependentSizedArrayType *DepArrayT
12470                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12471       if (DepArrayT->getSizeExpr()) {
12472         ArraySize = DepArrayT->getSizeExpr();
12473         AllocType = DepArrayT->getElementType();
12474       }
12475     }
12476   }
12477 
12478   return getDerived().RebuildCXXNewExpr(
12479       E->getBeginLoc(), E->isGlobalNew(),
12480       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12481       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12482       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12483 }
12484 
12485 template<typename Derived>
12486 ExprResult
12487 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12488   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12489   if (Operand.isInvalid())
12490     return ExprError();
12491 
12492   // Transform the delete operator, if known.
12493   FunctionDecl *OperatorDelete = nullptr;
12494   if (E->getOperatorDelete()) {
12495     OperatorDelete = cast_or_null<FunctionDecl>(
12496         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12497     if (!OperatorDelete)
12498       return ExprError();
12499   }
12500 
12501   if (!getDerived().AlwaysRebuild() &&
12502       Operand.get() == E->getArgument() &&
12503       OperatorDelete == E->getOperatorDelete()) {
12504     // Mark any declarations we need as referenced.
12505     // FIXME: instantiation-specific.
12506     if (OperatorDelete)
12507       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12508 
12509     if (!E->getArgument()->isTypeDependent()) {
12510       QualType Destroyed = SemaRef.Context.getBaseElementType(
12511                                                          E->getDestroyedType());
12512       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12513         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12514         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12515                                        SemaRef.LookupDestructor(Record));
12516       }
12517     }
12518 
12519     return E;
12520   }
12521 
12522   return getDerived().RebuildCXXDeleteExpr(
12523       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12524 }
12525 
12526 template<typename Derived>
12527 ExprResult
12528 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12529                                                      CXXPseudoDestructorExpr *E) {
12530   ExprResult Base = getDerived().TransformExpr(E->getBase());
12531   if (Base.isInvalid())
12532     return ExprError();
12533 
12534   ParsedType ObjectTypePtr;
12535   bool MayBePseudoDestructor = false;
12536   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12537                                               E->getOperatorLoc(),
12538                                         E->isArrow()? tok::arrow : tok::period,
12539                                               ObjectTypePtr,
12540                                               MayBePseudoDestructor);
12541   if (Base.isInvalid())
12542     return ExprError();
12543 
12544   QualType ObjectType = ObjectTypePtr.get();
12545   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12546   if (QualifierLoc) {
12547     QualifierLoc
12548       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12549     if (!QualifierLoc)
12550       return ExprError();
12551   }
12552   CXXScopeSpec SS;
12553   SS.Adopt(QualifierLoc);
12554 
12555   PseudoDestructorTypeStorage Destroyed;
12556   if (E->getDestroyedTypeInfo()) {
12557     TypeSourceInfo *DestroyedTypeInfo
12558       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12559                                                 ObjectType, nullptr, SS);
12560     if (!DestroyedTypeInfo)
12561       return ExprError();
12562     Destroyed = DestroyedTypeInfo;
12563   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12564     // We aren't likely to be able to resolve the identifier down to a type
12565     // now anyway, so just retain the identifier.
12566     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12567                                             E->getDestroyedTypeLoc());
12568   } else {
12569     // Look for a destructor known with the given name.
12570     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12571                                               *E->getDestroyedTypeIdentifier(),
12572                                                 E->getDestroyedTypeLoc(),
12573                                                 /*Scope=*/nullptr,
12574                                                 SS, ObjectTypePtr,
12575                                                 false);
12576     if (!T)
12577       return ExprError();
12578 
12579     Destroyed
12580       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12581                                                  E->getDestroyedTypeLoc());
12582   }
12583 
12584   TypeSourceInfo *ScopeTypeInfo = nullptr;
12585   if (E->getScopeTypeInfo()) {
12586     CXXScopeSpec EmptySS;
12587     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12588                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12589     if (!ScopeTypeInfo)
12590       return ExprError();
12591   }
12592 
12593   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12594                                                      E->getOperatorLoc(),
12595                                                      E->isArrow(),
12596                                                      SS,
12597                                                      ScopeTypeInfo,
12598                                                      E->getColonColonLoc(),
12599                                                      E->getTildeLoc(),
12600                                                      Destroyed);
12601 }
12602 
12603 template <typename Derived>
12604 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12605                                                         bool RequiresADL,
12606                                                         LookupResult &R) {
12607   // Transform all the decls.
12608   bool AllEmptyPacks = true;
12609   for (auto *OldD : Old->decls()) {
12610     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12611     if (!InstD) {
12612       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12613       // This can happen because of dependent hiding.
12614       if (isa<UsingShadowDecl>(OldD))
12615         continue;
12616       else {
12617         R.clear();
12618         return true;
12619       }
12620     }
12621 
12622     // Expand using pack declarations.
12623     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12624     ArrayRef<NamedDecl*> Decls = SingleDecl;
12625     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12626       Decls = UPD->expansions();
12627 
12628     // Expand using declarations.
12629     for (auto *D : Decls) {
12630       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12631         for (auto *SD : UD->shadows())
12632           R.addDecl(SD);
12633       } else {
12634         R.addDecl(D);
12635       }
12636     }
12637 
12638     AllEmptyPacks &= Decls.empty();
12639   };
12640 
12641   // C++ [temp.res]/8.4.2:
12642   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12643   //   a name in the template definition found a using-declaration, but the
12644   //   lookup in the corresponding scope in the instantiation odoes not find
12645   //   any declarations because the using-declaration was a pack expansion and
12646   //   the corresponding pack is empty
12647   if (AllEmptyPacks && !RequiresADL) {
12648     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12649         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12650     return true;
12651   }
12652 
12653   // Resolve a kind, but don't do any further analysis.  If it's
12654   // ambiguous, the callee needs to deal with it.
12655   R.resolveKind();
12656   return false;
12657 }
12658 
12659 template<typename Derived>
12660 ExprResult
12661 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12662                                                   UnresolvedLookupExpr *Old) {
12663   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12664                  Sema::LookupOrdinaryName);
12665 
12666   // Transform the declaration set.
12667   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12668     return ExprError();
12669 
12670   // Rebuild the nested-name qualifier, if present.
12671   CXXScopeSpec SS;
12672   if (Old->getQualifierLoc()) {
12673     NestedNameSpecifierLoc QualifierLoc
12674       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12675     if (!QualifierLoc)
12676       return ExprError();
12677 
12678     SS.Adopt(QualifierLoc);
12679   }
12680 
12681   if (Old->getNamingClass()) {
12682     CXXRecordDecl *NamingClass
12683       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12684                                                             Old->getNameLoc(),
12685                                                         Old->getNamingClass()));
12686     if (!NamingClass) {
12687       R.clear();
12688       return ExprError();
12689     }
12690 
12691     R.setNamingClass(NamingClass);
12692   }
12693 
12694   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12695 
12696   // If we have neither explicit template arguments, nor the template keyword,
12697   // it's a normal declaration name or member reference.
12698   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12699     NamedDecl *D = R.getAsSingle<NamedDecl>();
12700     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12701     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12702     // give a good diagnostic.
12703     if (D && D->isCXXInstanceMember()) {
12704       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12705                                                      /*TemplateArgs=*/nullptr,
12706                                                      /*Scope=*/nullptr);
12707     }
12708 
12709     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12710   }
12711 
12712   // If we have template arguments, rebuild them, then rebuild the
12713   // templateid expression.
12714   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12715   if (Old->hasExplicitTemplateArgs() &&
12716       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12717                                               Old->getNumTemplateArgs(),
12718                                               TransArgs)) {
12719     R.clear();
12720     return ExprError();
12721   }
12722 
12723   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12724                                             Old->requiresADL(), &TransArgs);
12725 }
12726 
12727 template<typename Derived>
12728 ExprResult
12729 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12730   bool ArgChanged = false;
12731   SmallVector<TypeSourceInfo *, 4> Args;
12732   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12733     TypeSourceInfo *From = E->getArg(I);
12734     TypeLoc FromTL = From->getTypeLoc();
12735     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12736       TypeLocBuilder TLB;
12737       TLB.reserve(FromTL.getFullDataSize());
12738       QualType To = getDerived().TransformType(TLB, FromTL);
12739       if (To.isNull())
12740         return ExprError();
12741 
12742       if (To == From->getType())
12743         Args.push_back(From);
12744       else {
12745         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12746         ArgChanged = true;
12747       }
12748       continue;
12749     }
12750 
12751     ArgChanged = true;
12752 
12753     // We have a pack expansion. Instantiate it.
12754     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12755     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12756     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12757     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12758 
12759     // Determine whether the set of unexpanded parameter packs can and should
12760     // be expanded.
12761     bool Expand = true;
12762     bool RetainExpansion = false;
12763     std::optional<unsigned> OrigNumExpansions =
12764         ExpansionTL.getTypePtr()->getNumExpansions();
12765     std::optional<unsigned> NumExpansions = OrigNumExpansions;
12766     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12767                                              PatternTL.getSourceRange(),
12768                                              Unexpanded,
12769                                              Expand, RetainExpansion,
12770                                              NumExpansions))
12771       return ExprError();
12772 
12773     if (!Expand) {
12774       // The transform has determined that we should perform a simple
12775       // transformation on the pack expansion, producing another pack
12776       // expansion.
12777       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12778 
12779       TypeLocBuilder TLB;
12780       TLB.reserve(From->getTypeLoc().getFullDataSize());
12781 
12782       QualType To = getDerived().TransformType(TLB, PatternTL);
12783       if (To.isNull())
12784         return ExprError();
12785 
12786       To = getDerived().RebuildPackExpansionType(To,
12787                                                  PatternTL.getSourceRange(),
12788                                                  ExpansionTL.getEllipsisLoc(),
12789                                                  NumExpansions);
12790       if (To.isNull())
12791         return ExprError();
12792 
12793       PackExpansionTypeLoc ToExpansionTL
12794         = TLB.push<PackExpansionTypeLoc>(To);
12795       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12796       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12797       continue;
12798     }
12799 
12800     // Expand the pack expansion by substituting for each argument in the
12801     // pack(s).
12802     for (unsigned I = 0; I != *NumExpansions; ++I) {
12803       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12804       TypeLocBuilder TLB;
12805       TLB.reserve(PatternTL.getFullDataSize());
12806       QualType To = getDerived().TransformType(TLB, PatternTL);
12807       if (To.isNull())
12808         return ExprError();
12809 
12810       if (To->containsUnexpandedParameterPack()) {
12811         To = getDerived().RebuildPackExpansionType(To,
12812                                                    PatternTL.getSourceRange(),
12813                                                    ExpansionTL.getEllipsisLoc(),
12814                                                    NumExpansions);
12815         if (To.isNull())
12816           return ExprError();
12817 
12818         PackExpansionTypeLoc ToExpansionTL
12819           = TLB.push<PackExpansionTypeLoc>(To);
12820         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12821       }
12822 
12823       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12824     }
12825 
12826     if (!RetainExpansion)
12827       continue;
12828 
12829     // If we're supposed to retain a pack expansion, do so by temporarily
12830     // forgetting the partially-substituted parameter pack.
12831     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12832 
12833     TypeLocBuilder TLB;
12834     TLB.reserve(From->getTypeLoc().getFullDataSize());
12835 
12836     QualType To = getDerived().TransformType(TLB, PatternTL);
12837     if (To.isNull())
12838       return ExprError();
12839 
12840     To = getDerived().RebuildPackExpansionType(To,
12841                                                PatternTL.getSourceRange(),
12842                                                ExpansionTL.getEllipsisLoc(),
12843                                                NumExpansions);
12844     if (To.isNull())
12845       return ExprError();
12846 
12847     PackExpansionTypeLoc ToExpansionTL
12848       = TLB.push<PackExpansionTypeLoc>(To);
12849     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12850     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12851   }
12852 
12853   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12854     return E;
12855 
12856   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12857                                        E->getEndLoc());
12858 }
12859 
12860 template<typename Derived>
12861 ExprResult
12862 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12863                                                  ConceptSpecializationExpr *E) {
12864   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12865   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12866   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12867                                               Old->NumTemplateArgs, TransArgs))
12868     return ExprError();
12869 
12870   return getDerived().RebuildConceptSpecializationExpr(
12871       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12872       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12873       &TransArgs);
12874 }
12875 
12876 template<typename Derived>
12877 ExprResult
12878 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12879   SmallVector<ParmVarDecl*, 4> TransParams;
12880   SmallVector<QualType, 4> TransParamTypes;
12881   Sema::ExtParameterInfoBuilder ExtParamInfos;
12882 
12883   // C++2a [expr.prim.req]p2
12884   // Expressions appearing within a requirement-body are unevaluated operands.
12885   EnterExpressionEvaluationContext Ctx(
12886       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
12887       Sema::ReuseLambdaContextDecl);
12888 
12889   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12890       getSema().Context, getSema().CurContext,
12891       E->getBody()->getBeginLoc());
12892 
12893   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12894 
12895   ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
12896       E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body,
12897       E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
12898 
12899   for (ParmVarDecl *Param : TransParams)
12900     if (Param)
12901       Param->setDeclContext(Body);
12902 
12903   // On failure to transform, TransformRequiresTypeParams returns an expression
12904   // in the event that the transformation of the type params failed in some way.
12905   // It is expected that this will result in a 'not satisfied' Requires clause
12906   // when instantiating.
12907   if (!TypeParamResult.isUnset())
12908     return TypeParamResult;
12909 
12910   SmallVector<concepts::Requirement *, 4> TransReqs;
12911   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12912                                                      TransReqs))
12913     return ExprError();
12914 
12915   for (concepts::Requirement *Req : TransReqs) {
12916     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12917       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12918         ER->getReturnTypeRequirement()
12919                 .getTypeConstraintTemplateParameterList()->getParam(0)
12920                 ->setDeclContext(Body);
12921       }
12922     }
12923   }
12924 
12925   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12926                                           TransParams, TransReqs,
12927                                           E->getRBraceLoc());
12928 }
12929 
12930 template<typename Derived>
12931 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12932     ArrayRef<concepts::Requirement *> Reqs,
12933     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12934   for (concepts::Requirement *Req : Reqs) {
12935     concepts::Requirement *TransReq = nullptr;
12936     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12937       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12938     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12939       TransReq = getDerived().TransformExprRequirement(ExprReq);
12940     else
12941       TransReq = getDerived().TransformNestedRequirement(
12942                      cast<concepts::NestedRequirement>(Req));
12943     if (!TransReq)
12944       return true;
12945     Transformed.push_back(TransReq);
12946   }
12947   return false;
12948 }
12949 
12950 template<typename Derived>
12951 concepts::TypeRequirement *
12952 TreeTransform<Derived>::TransformTypeRequirement(
12953     concepts::TypeRequirement *Req) {
12954   if (Req->isSubstitutionFailure()) {
12955     if (getDerived().AlwaysRebuild())
12956       return getDerived().RebuildTypeRequirement(
12957               Req->getSubstitutionDiagnostic());
12958     return Req;
12959   }
12960   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12961   if (!TransType)
12962     return nullptr;
12963   return getDerived().RebuildTypeRequirement(TransType);
12964 }
12965 
12966 template<typename Derived>
12967 concepts::ExprRequirement *
12968 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12969   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12970   if (Req->isExprSubstitutionFailure())
12971     TransExpr = Req->getExprSubstitutionDiagnostic();
12972   else {
12973     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12974     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12975       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12976     if (TransExprRes.isInvalid())
12977       return nullptr;
12978     TransExpr = TransExprRes.get();
12979   }
12980 
12981   std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12982   const auto &RetReq = Req->getReturnTypeRequirement();
12983   if (RetReq.isEmpty())
12984     TransRetReq.emplace();
12985   else if (RetReq.isSubstitutionFailure())
12986     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12987   else if (RetReq.isTypeConstraint()) {
12988     TemplateParameterList *OrigTPL =
12989         RetReq.getTypeConstraintTemplateParameterList();
12990     TemplateParameterList *TPL =
12991         getDerived().TransformTemplateParameterList(OrigTPL);
12992     if (!TPL)
12993       return nullptr;
12994     TransRetReq.emplace(TPL);
12995   }
12996   assert(TransRetReq && "All code paths leading here must set TransRetReq");
12997   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12998     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12999                                                Req->getNoexceptLoc(),
13000                                                std::move(*TransRetReq));
13001   return getDerived().RebuildExprRequirement(
13002       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
13003       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
13004 }
13005 
13006 template<typename Derived>
13007 concepts::NestedRequirement *
13008 TreeTransform<Derived>::TransformNestedRequirement(
13009     concepts::NestedRequirement *Req) {
13010   if (Req->hasInvalidConstraint()) {
13011     if (getDerived().AlwaysRebuild())
13012       return getDerived().RebuildNestedRequirement(
13013           Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction());
13014     return Req;
13015   }
13016   ExprResult TransConstraint =
13017       getDerived().TransformExpr(Req->getConstraintExpr());
13018   if (TransConstraint.isInvalid())
13019     return nullptr;
13020   return getDerived().RebuildNestedRequirement(TransConstraint.get());
13021 }
13022 
13023 template<typename Derived>
13024 ExprResult
13025 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
13026   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
13027   if (!T)
13028     return ExprError();
13029 
13030   if (!getDerived().AlwaysRebuild() &&
13031       T == E->getQueriedTypeSourceInfo())
13032     return E;
13033 
13034   ExprResult SubExpr;
13035   {
13036     EnterExpressionEvaluationContext Unevaluated(
13037         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13038     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
13039     if (SubExpr.isInvalid())
13040       return ExprError();
13041 
13042     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
13043       return E;
13044   }
13045 
13046   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
13047                                             SubExpr.get(), E->getEndLoc());
13048 }
13049 
13050 template<typename Derived>
13051 ExprResult
13052 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
13053   ExprResult SubExpr;
13054   {
13055     EnterExpressionEvaluationContext Unevaluated(
13056         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13057     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
13058     if (SubExpr.isInvalid())
13059       return ExprError();
13060 
13061     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
13062       return E;
13063   }
13064 
13065   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
13066                                              SubExpr.get(), E->getEndLoc());
13067 }
13068 
13069 template <typename Derived>
13070 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
13071     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
13072     TypeSourceInfo **RecoveryTSI) {
13073   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
13074       DRE, AddrTaken, RecoveryTSI);
13075 
13076   // Propagate both errors and recovered types, which return ExprEmpty.
13077   if (!NewDRE.isUsable())
13078     return NewDRE;
13079 
13080   // We got an expr, wrap it up in parens.
13081   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
13082     return PE;
13083   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
13084                                        PE->getRParen());
13085 }
13086 
13087 template <typename Derived>
13088 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
13089     DependentScopeDeclRefExpr *E) {
13090   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
13091                                             nullptr);
13092 }
13093 
13094 template <typename Derived>
13095 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
13096     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
13097     TypeSourceInfo **RecoveryTSI) {
13098   assert(E->getQualifierLoc());
13099   NestedNameSpecifierLoc QualifierLoc =
13100       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
13101   if (!QualifierLoc)
13102     return ExprError();
13103   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13104 
13105   // TODO: If this is a conversion-function-id, verify that the
13106   // destination type name (if present) resolves the same way after
13107   // instantiation as it did in the local scope.
13108 
13109   DeclarationNameInfo NameInfo =
13110       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
13111   if (!NameInfo.getName())
13112     return ExprError();
13113 
13114   if (!E->hasExplicitTemplateArgs()) {
13115     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
13116         // Note: it is sufficient to compare the Name component of NameInfo:
13117         // if name has not changed, DNLoc has not changed either.
13118         NameInfo.getName() == E->getDeclName())
13119       return E;
13120 
13121     return getDerived().RebuildDependentScopeDeclRefExpr(
13122         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
13123         IsAddressOfOperand, RecoveryTSI);
13124   }
13125 
13126   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13127   if (getDerived().TransformTemplateArguments(
13128           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
13129     return ExprError();
13130 
13131   return getDerived().RebuildDependentScopeDeclRefExpr(
13132       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
13133       RecoveryTSI);
13134 }
13135 
13136 template<typename Derived>
13137 ExprResult
13138 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
13139   // CXXConstructExprs other than for list-initialization and
13140   // CXXTemporaryObjectExpr are always implicit, so when we have
13141   // a 1-argument construction we just transform that argument.
13142   if (getDerived().AllowSkippingCXXConstructExpr() &&
13143       ((E->getNumArgs() == 1 ||
13144         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
13145        (!getDerived().DropCallArgument(E->getArg(0))) &&
13146        !E->isListInitialization()))
13147     return getDerived().TransformInitializer(E->getArg(0),
13148                                              /*DirectInit*/ false);
13149 
13150   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
13151 
13152   QualType T = getDerived().TransformType(E->getType());
13153   if (T.isNull())
13154     return ExprError();
13155 
13156   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13157       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13158   if (!Constructor)
13159     return ExprError();
13160 
13161   bool ArgumentChanged = false;
13162   SmallVector<Expr*, 8> Args;
13163   {
13164     EnterExpressionEvaluationContext Context(
13165         getSema(), EnterExpressionEvaluationContext::InitList,
13166         E->isListInitialization());
13167     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13168                                     &ArgumentChanged))
13169       return ExprError();
13170   }
13171 
13172   if (!getDerived().AlwaysRebuild() &&
13173       T == E->getType() &&
13174       Constructor == E->getConstructor() &&
13175       !ArgumentChanged) {
13176     // Mark the constructor as referenced.
13177     // FIXME: Instantiation-specific
13178     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13179     return E;
13180   }
13181 
13182   return getDerived().RebuildCXXConstructExpr(
13183       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
13184       E->hadMultipleCandidates(), E->isListInitialization(),
13185       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
13186       E->getConstructionKind(), E->getParenOrBraceRange());
13187 }
13188 
13189 template<typename Derived>
13190 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
13191     CXXInheritedCtorInitExpr *E) {
13192   QualType T = getDerived().TransformType(E->getType());
13193   if (T.isNull())
13194     return ExprError();
13195 
13196   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13197       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13198   if (!Constructor)
13199     return ExprError();
13200 
13201   if (!getDerived().AlwaysRebuild() &&
13202       T == E->getType() &&
13203       Constructor == E->getConstructor()) {
13204     // Mark the constructor as referenced.
13205     // FIXME: Instantiation-specific
13206     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13207     return E;
13208   }
13209 
13210   return getDerived().RebuildCXXInheritedCtorInitExpr(
13211       T, E->getLocation(), Constructor,
13212       E->constructsVBase(), E->inheritedFromVBase());
13213 }
13214 
13215 /// Transform a C++ temporary-binding expression.
13216 ///
13217 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
13218 /// transform the subexpression and return that.
13219 template<typename Derived>
13220 ExprResult
13221 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
13222   if (auto *Dtor = E->getTemporary()->getDestructor())
13223     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
13224                                    const_cast<CXXDestructorDecl *>(Dtor));
13225   return getDerived().TransformExpr(E->getSubExpr());
13226 }
13227 
13228 /// Transform a C++ expression that contains cleanups that should
13229 /// be run after the expression is evaluated.
13230 ///
13231 /// Since ExprWithCleanups nodes are implicitly generated, we
13232 /// just transform the subexpression and return that.
13233 template<typename Derived>
13234 ExprResult
13235 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
13236   return getDerived().TransformExpr(E->getSubExpr());
13237 }
13238 
13239 template<typename Derived>
13240 ExprResult
13241 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
13242                                                     CXXTemporaryObjectExpr *E) {
13243   TypeSourceInfo *T =
13244       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13245   if (!T)
13246     return ExprError();
13247 
13248   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13249       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13250   if (!Constructor)
13251     return ExprError();
13252 
13253   bool ArgumentChanged = false;
13254   SmallVector<Expr*, 8> Args;
13255   Args.reserve(E->getNumArgs());
13256   {
13257     EnterExpressionEvaluationContext Context(
13258         getSema(), EnterExpressionEvaluationContext::InitList,
13259         E->isListInitialization());
13260     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13261                        &ArgumentChanged))
13262       return ExprError();
13263   }
13264 
13265   if (!getDerived().AlwaysRebuild() &&
13266       T == E->getTypeSourceInfo() &&
13267       Constructor == E->getConstructor() &&
13268       !ArgumentChanged) {
13269     // FIXME: Instantiation-specific
13270     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13271     return SemaRef.MaybeBindToTemporary(E);
13272   }
13273 
13274   // FIXME: We should just pass E->isListInitialization(), but we're not
13275   // prepared to handle list-initialization without a child InitListExpr.
13276   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
13277   return getDerived().RebuildCXXTemporaryObjectExpr(
13278       T, LParenLoc, Args, E->getEndLoc(),
13279       /*ListInitialization=*/LParenLoc.isInvalid());
13280 }
13281 
13282 template<typename Derived>
13283 ExprResult
13284 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
13285   // Transform any init-capture expressions before entering the scope of the
13286   // lambda body, because they are not semantically within that scope.
13287   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
13288   struct TransformedInitCapture {
13289     // The location of the ... if the result is retaining a pack expansion.
13290     SourceLocation EllipsisLoc;
13291     // Zero or more expansions of the init-capture.
13292     SmallVector<InitCaptureInfoTy, 4> Expansions;
13293   };
13294   SmallVector<TransformedInitCapture, 4> InitCaptures;
13295   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
13296   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13297                                     CEnd = E->capture_end();
13298        C != CEnd; ++C) {
13299     if (!E->isInitCapture(C))
13300       continue;
13301 
13302     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
13303     auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13304 
13305     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
13306                                 std::optional<unsigned> NumExpansions) {
13307       ExprResult NewExprInitResult = getDerived().TransformInitializer(
13308           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
13309 
13310       if (NewExprInitResult.isInvalid()) {
13311         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
13312         return;
13313       }
13314       Expr *NewExprInit = NewExprInitResult.get();
13315 
13316       QualType NewInitCaptureType =
13317           getSema().buildLambdaInitCaptureInitialization(
13318               C->getLocation(), C->getCaptureKind() == LCK_ByRef,
13319               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
13320               cast<VarDecl>(C->getCapturedVar())->getInitStyle() !=
13321                   VarDecl::CInit,
13322               NewExprInit);
13323       Result.Expansions.push_back(
13324           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
13325     };
13326 
13327     // If this is an init-capture pack, consider expanding the pack now.
13328     if (OldVD->isParameterPack()) {
13329       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
13330                                              ->getTypeLoc()
13331                                              .castAs<PackExpansionTypeLoc>();
13332       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13333       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
13334 
13335       // Determine whether the set of unexpanded parameter packs can and should
13336       // be expanded.
13337       bool Expand = true;
13338       bool RetainExpansion = false;
13339       std::optional<unsigned> OrigNumExpansions =
13340           ExpansionTL.getTypePtr()->getNumExpansions();
13341       std::optional<unsigned> NumExpansions = OrigNumExpansions;
13342       if (getDerived().TryExpandParameterPacks(
13343               ExpansionTL.getEllipsisLoc(),
13344               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
13345               RetainExpansion, NumExpansions))
13346         return ExprError();
13347       if (Expand) {
13348         for (unsigned I = 0; I != *NumExpansions; ++I) {
13349           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13350           SubstInitCapture(SourceLocation(), std::nullopt);
13351         }
13352       }
13353       if (!Expand || RetainExpansion) {
13354         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13355         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
13356         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
13357       }
13358     } else {
13359       SubstInitCapture(SourceLocation(), std::nullopt);
13360     }
13361   }
13362 
13363   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
13364   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
13365 
13366   // Create the local class that will describe the lambda.
13367 
13368   // FIXME: DependencyKind below is wrong when substituting inside a templated
13369   // context that isn't a DeclContext (such as a variable template), or when
13370   // substituting an unevaluated lambda inside of a function's parameter's type
13371   // - as parameter types are not instantiated from within a function's DC. We
13372   // use evaluation contexts to distinguish the function parameter case.
13373   CXXRecordDecl::LambdaDependencyKind DependencyKind =
13374       CXXRecordDecl::LDK_Unknown;
13375   if ((getSema().isUnevaluatedContext() ||
13376        getSema().isConstantEvaluatedContext()) &&
13377       (getSema().CurContext->isFileContext() ||
13378        !getSema().CurContext->getParent()->isDependentContext()))
13379     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
13380 
13381   CXXRecordDecl *OldClass = E->getLambdaClass();
13382   CXXRecordDecl *Class = getSema().createLambdaClosureType(
13383       E->getIntroducerRange(), /*Info=*/nullptr, DependencyKind,
13384       E->getCaptureDefault());
13385   getDerived().transformedLocalDecl(OldClass, {Class});
13386 
13387   CXXMethodDecl *NewCallOperator =
13388       getSema().CreateLambdaCallOperator(E->getIntroducerRange(), Class);
13389   NewCallOperator->setLexicalDeclContext(getSema().CurContext);
13390 
13391   // Enter the scope of the lambda.
13392   getSema().buildLambdaScope(LSI, NewCallOperator, E->getIntroducerRange(),
13393                              E->getCaptureDefault(), E->getCaptureDefaultLoc(),
13394                              E->hasExplicitParameters(), E->isMutable());
13395 
13396   // Introduce the context of the call operator.
13397   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13398                                  /*NewThisContext*/false);
13399 
13400   bool Invalid = false;
13401 
13402   // Transform captures.
13403   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13404                                  CEnd = E->capture_end();
13405        C != CEnd; ++C) {
13406     // When we hit the first implicit capture, tell Sema that we've finished
13407     // the list of explicit captures.
13408     if (C->isImplicit())
13409       break;
13410 
13411     // Capturing 'this' is trivial.
13412     if (C->capturesThis()) {
13413       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13414                                     /*BuildAndDiagnose*/ true, nullptr,
13415                                     C->getCaptureKind() == LCK_StarThis);
13416       continue;
13417     }
13418     // Captured expression will be recaptured during captured variables
13419     // rebuilding.
13420     if (C->capturesVLAType())
13421       continue;
13422 
13423     // Rebuild init-captures, including the implied field declaration.
13424     if (E->isInitCapture(C)) {
13425       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13426 
13427       auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13428       llvm::SmallVector<Decl*, 4> NewVDs;
13429 
13430       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13431         ExprResult Init = Info.first;
13432         QualType InitQualType = Info.second;
13433         if (Init.isInvalid() || InitQualType.isNull()) {
13434           Invalid = true;
13435           break;
13436         }
13437         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13438             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13439             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get(),
13440             getSema().CurContext);
13441         if (!NewVD) {
13442           Invalid = true;
13443           break;
13444         }
13445         NewVDs.push_back(NewVD);
13446         getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef);
13447       }
13448 
13449       if (Invalid)
13450         break;
13451 
13452       getDerived().transformedLocalDecl(OldVD, NewVDs);
13453       continue;
13454     }
13455 
13456     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13457 
13458     // Determine the capture kind for Sema.
13459     Sema::TryCaptureKind Kind
13460       = C->isImplicit()? Sema::TryCapture_Implicit
13461                        : C->getCaptureKind() == LCK_ByCopy
13462                            ? Sema::TryCapture_ExplicitByVal
13463                            : Sema::TryCapture_ExplicitByRef;
13464     SourceLocation EllipsisLoc;
13465     if (C->isPackExpansion()) {
13466       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13467       bool ShouldExpand = false;
13468       bool RetainExpansion = false;
13469       std::optional<unsigned> NumExpansions;
13470       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13471                                                C->getLocation(),
13472                                                Unexpanded,
13473                                                ShouldExpand, RetainExpansion,
13474                                                NumExpansions)) {
13475         Invalid = true;
13476         continue;
13477       }
13478 
13479       if (ShouldExpand) {
13480         // The transform has determined that we should perform an expansion;
13481         // transform and capture each of the arguments.
13482         // expansion of the pattern. Do so.
13483         auto *Pack = cast<VarDecl>(C->getCapturedVar());
13484         for (unsigned I = 0; I != *NumExpansions; ++I) {
13485           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13486           VarDecl *CapturedVar
13487             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13488                                                                Pack));
13489           if (!CapturedVar) {
13490             Invalid = true;
13491             continue;
13492           }
13493 
13494           // Capture the transformed variable.
13495           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13496         }
13497 
13498         // FIXME: Retain a pack expansion if RetainExpansion is true.
13499 
13500         continue;
13501       }
13502 
13503       EllipsisLoc = C->getEllipsisLoc();
13504     }
13505 
13506     // Transform the captured variable.
13507     auto *CapturedVar = cast_or_null<ValueDecl>(
13508         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13509     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13510       Invalid = true;
13511       continue;
13512     }
13513 
13514     // Capture the transformed variable.
13515     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13516                                  EllipsisLoc);
13517   }
13518   getSema().finishLambdaExplicitCaptures(LSI);
13519 
13520   // Transform the template parameters, and add them to the current
13521   // instantiation scope. The null case is handled correctly.
13522   auto TPL = getDerived().TransformTemplateParameterList(
13523       E->getTemplateParameterList());
13524   LSI->GLTemplateParameterList = TPL;
13525 
13526   // Transform the type of the original lambda's call operator.
13527   // The transformation MUST be done in the CurrentInstantiationScope since
13528   // it introduces a mapping of the original to the newly created
13529   // transformed parameters.
13530   TypeSourceInfo *NewCallOpTSI = nullptr;
13531   {
13532     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
13533     auto OldCallOpFPTL =
13534         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
13535 
13536     TypeLocBuilder NewCallOpTLBuilder;
13537     SmallVector<QualType, 4> ExceptionStorage;
13538     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
13539     QualType NewCallOpType = TransformFunctionProtoType(
13540         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
13541         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13542           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
13543                                               ExceptionStorage, Changed);
13544         });
13545     if (NewCallOpType.isNull())
13546       return ExprError();
13547     NewCallOpTSI =
13548         NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, NewCallOpType);
13549   }
13550 
13551   getSema().CompleteLambdaCallOperator(
13552       NewCallOperator, E->getCallOperator()->getLocation(),
13553       E->getCallOperator()->getInnerLocStart(),
13554       E->getCallOperator()->getTrailingRequiresClause(), NewCallOpTSI,
13555       E->getCallOperator()->getConstexprKind(),
13556       E->getCallOperator()->getStorageClass(),
13557       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
13558       E->hasExplicitResultType());
13559 
13560   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13561   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13562 
13563   {
13564     // Number the lambda for linkage purposes if necessary.
13565     Sema::ContextRAII ManglingContext(getSema(), Class->getDeclContext());
13566 
13567     std::optional<CXXRecordDecl::LambdaNumbering> Numbering;
13568     if (getDerived().ReplacingOriginal()) {
13569       Numbering = OldClass->getLambdaNumbering();
13570     }
13571 
13572     getSema().handleLambdaNumbering(Class, NewCallOperator, Numbering);
13573   }
13574 
13575   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13576   // evaluation context even if we're not transforming the function body.
13577   getSema().PushExpressionEvaluationContext(
13578       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13579 
13580   // Instantiate the body of the lambda expression.
13581   StmtResult Body =
13582       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13583 
13584   // ActOnLambda* will pop the function scope for us.
13585   FuncScopeCleanup.disable();
13586 
13587   if (Body.isInvalid()) {
13588     SavedContext.pop();
13589     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13590                                /*IsInstantiation=*/true);
13591     return ExprError();
13592   }
13593 
13594   // Copy the LSI before ActOnFinishFunctionBody removes it.
13595   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13596   // the call operator.
13597   auto LSICopy = *LSI;
13598   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13599                                     /*IsInstantiation*/ true);
13600   SavedContext.pop();
13601 
13602   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13603                                    &LSICopy);
13604 }
13605 
13606 template<typename Derived>
13607 StmtResult
13608 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13609   return TransformStmt(S);
13610 }
13611 
13612 template<typename Derived>
13613 StmtResult
13614 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13615   // Transform captures.
13616   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13617                                  CEnd = E->capture_end();
13618        C != CEnd; ++C) {
13619     // When we hit the first implicit capture, tell Sema that we've finished
13620     // the list of explicit captures.
13621     if (!C->isImplicit())
13622       continue;
13623 
13624     // Capturing 'this' is trivial.
13625     if (C->capturesThis()) {
13626       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13627                                     /*BuildAndDiagnose*/ true, nullptr,
13628                                     C->getCaptureKind() == LCK_StarThis);
13629       continue;
13630     }
13631     // Captured expression will be recaptured during captured variables
13632     // rebuilding.
13633     if (C->capturesVLAType())
13634       continue;
13635 
13636     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13637     assert(!E->isInitCapture(C) && "implicit init-capture?");
13638 
13639     // Transform the captured variable.
13640     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13641         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13642     if (!CapturedVar || CapturedVar->isInvalidDecl())
13643       return StmtError();
13644 
13645     // Capture the transformed variable.
13646     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13647   }
13648 
13649   return S;
13650 }
13651 
13652 template<typename Derived>
13653 ExprResult
13654 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13655                                                   CXXUnresolvedConstructExpr *E) {
13656   TypeSourceInfo *T =
13657       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13658   if (!T)
13659     return ExprError();
13660 
13661   bool ArgumentChanged = false;
13662   SmallVector<Expr*, 8> Args;
13663   Args.reserve(E->getNumArgs());
13664   {
13665     EnterExpressionEvaluationContext Context(
13666         getSema(), EnterExpressionEvaluationContext::InitList,
13667         E->isListInitialization());
13668     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13669                                     &ArgumentChanged))
13670       return ExprError();
13671   }
13672 
13673   if (!getDerived().AlwaysRebuild() &&
13674       T == E->getTypeSourceInfo() &&
13675       !ArgumentChanged)
13676     return E;
13677 
13678   // FIXME: we're faking the locations of the commas
13679   return getDerived().RebuildCXXUnresolvedConstructExpr(
13680       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13681 }
13682 
13683 template<typename Derived>
13684 ExprResult
13685 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13686                                              CXXDependentScopeMemberExpr *E) {
13687   // Transform the base of the expression.
13688   ExprResult Base((Expr*) nullptr);
13689   Expr *OldBase;
13690   QualType BaseType;
13691   QualType ObjectType;
13692   if (!E->isImplicitAccess()) {
13693     OldBase = E->getBase();
13694     Base = getDerived().TransformExpr(OldBase);
13695     if (Base.isInvalid())
13696       return ExprError();
13697 
13698     // Start the member reference and compute the object's type.
13699     ParsedType ObjectTy;
13700     bool MayBePseudoDestructor = false;
13701     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13702                                                 E->getOperatorLoc(),
13703                                       E->isArrow()? tok::arrow : tok::period,
13704                                                 ObjectTy,
13705                                                 MayBePseudoDestructor);
13706     if (Base.isInvalid())
13707       return ExprError();
13708 
13709     ObjectType = ObjectTy.get();
13710     BaseType = ((Expr*) Base.get())->getType();
13711   } else {
13712     OldBase = nullptr;
13713     BaseType = getDerived().TransformType(E->getBaseType());
13714     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13715   }
13716 
13717   // Transform the first part of the nested-name-specifier that qualifies
13718   // the member name.
13719   NamedDecl *FirstQualifierInScope
13720     = getDerived().TransformFirstQualifierInScope(
13721                                             E->getFirstQualifierFoundInScope(),
13722                                             E->getQualifierLoc().getBeginLoc());
13723 
13724   NestedNameSpecifierLoc QualifierLoc;
13725   if (E->getQualifier()) {
13726     QualifierLoc
13727       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13728                                                      ObjectType,
13729                                                      FirstQualifierInScope);
13730     if (!QualifierLoc)
13731       return ExprError();
13732   }
13733 
13734   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13735 
13736   // TODO: If this is a conversion-function-id, verify that the
13737   // destination type name (if present) resolves the same way after
13738   // instantiation as it did in the local scope.
13739 
13740   DeclarationNameInfo NameInfo
13741     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13742   if (!NameInfo.getName())
13743     return ExprError();
13744 
13745   if (!E->hasExplicitTemplateArgs()) {
13746     // This is a reference to a member without an explicitly-specified
13747     // template argument list. Optimize for this common case.
13748     if (!getDerived().AlwaysRebuild() &&
13749         Base.get() == OldBase &&
13750         BaseType == E->getBaseType() &&
13751         QualifierLoc == E->getQualifierLoc() &&
13752         NameInfo.getName() == E->getMember() &&
13753         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13754       return E;
13755 
13756     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13757                                                        BaseType,
13758                                                        E->isArrow(),
13759                                                        E->getOperatorLoc(),
13760                                                        QualifierLoc,
13761                                                        TemplateKWLoc,
13762                                                        FirstQualifierInScope,
13763                                                        NameInfo,
13764                                                        /*TemplateArgs*/nullptr);
13765   }
13766 
13767   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13768   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13769                                               E->getNumTemplateArgs(),
13770                                               TransArgs))
13771     return ExprError();
13772 
13773   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13774                                                      BaseType,
13775                                                      E->isArrow(),
13776                                                      E->getOperatorLoc(),
13777                                                      QualifierLoc,
13778                                                      TemplateKWLoc,
13779                                                      FirstQualifierInScope,
13780                                                      NameInfo,
13781                                                      &TransArgs);
13782 }
13783 
13784 template <typename Derived>
13785 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13786     UnresolvedMemberExpr *Old) {
13787   // Transform the base of the expression.
13788   ExprResult Base((Expr *)nullptr);
13789   QualType BaseType;
13790   if (!Old->isImplicitAccess()) {
13791     Base = getDerived().TransformExpr(Old->getBase());
13792     if (Base.isInvalid())
13793       return ExprError();
13794     Base =
13795         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13796     if (Base.isInvalid())
13797       return ExprError();
13798     BaseType = Base.get()->getType();
13799   } else {
13800     BaseType = getDerived().TransformType(Old->getBaseType());
13801   }
13802 
13803   NestedNameSpecifierLoc QualifierLoc;
13804   if (Old->getQualifierLoc()) {
13805     QualifierLoc =
13806         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13807     if (!QualifierLoc)
13808       return ExprError();
13809   }
13810 
13811   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13812 
13813   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13814 
13815   // Transform the declaration set.
13816   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13817     return ExprError();
13818 
13819   // Determine the naming class.
13820   if (Old->getNamingClass()) {
13821     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13822         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13823     if (!NamingClass)
13824       return ExprError();
13825 
13826     R.setNamingClass(NamingClass);
13827   }
13828 
13829   TemplateArgumentListInfo TransArgs;
13830   if (Old->hasExplicitTemplateArgs()) {
13831     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13832     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13833     if (getDerived().TransformTemplateArguments(
13834             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13835       return ExprError();
13836   }
13837 
13838   // FIXME: to do this check properly, we will need to preserve the
13839   // first-qualifier-in-scope here, just in case we had a dependent
13840   // base (and therefore couldn't do the check) and a
13841   // nested-name-qualifier (and therefore could do the lookup).
13842   NamedDecl *FirstQualifierInScope = nullptr;
13843 
13844   return getDerived().RebuildUnresolvedMemberExpr(
13845       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13846       TemplateKWLoc, FirstQualifierInScope, R,
13847       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13848 }
13849 
13850 template<typename Derived>
13851 ExprResult
13852 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13853   EnterExpressionEvaluationContext Unevaluated(
13854       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13855   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13856   if (SubExpr.isInvalid())
13857     return ExprError();
13858 
13859   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13860     return E;
13861 
13862   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13863 }
13864 
13865 template<typename Derived>
13866 ExprResult
13867 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13868   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13869   if (Pattern.isInvalid())
13870     return ExprError();
13871 
13872   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13873     return E;
13874 
13875   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13876                                            E->getNumExpansions());
13877 }
13878 
13879 template<typename Derived>
13880 ExprResult
13881 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13882   // If E is not value-dependent, then nothing will change when we transform it.
13883   // Note: This is an instantiation-centric view.
13884   if (!E->isValueDependent())
13885     return E;
13886 
13887   EnterExpressionEvaluationContext Unevaluated(
13888       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13889 
13890   ArrayRef<TemplateArgument> PackArgs;
13891   TemplateArgument ArgStorage;
13892 
13893   // Find the argument list to transform.
13894   if (E->isPartiallySubstituted()) {
13895     PackArgs = E->getPartialArguments();
13896   } else if (E->isValueDependent()) {
13897     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13898     bool ShouldExpand = false;
13899     bool RetainExpansion = false;
13900     std::optional<unsigned> NumExpansions;
13901     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13902                                              Unexpanded,
13903                                              ShouldExpand, RetainExpansion,
13904                                              NumExpansions))
13905       return ExprError();
13906 
13907     // If we need to expand the pack, build a template argument from it and
13908     // expand that.
13909     if (ShouldExpand) {
13910       auto *Pack = E->getPack();
13911       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13912         ArgStorage = getSema().Context.getPackExpansionType(
13913             getSema().Context.getTypeDeclType(TTPD), std::nullopt);
13914       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13915         ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
13916       } else {
13917         auto *VD = cast<ValueDecl>(Pack);
13918         ExprResult DRE = getSema().BuildDeclRefExpr(
13919             VD, VD->getType().getNonLValueExprType(getSema().Context),
13920             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13921             E->getPackLoc());
13922         if (DRE.isInvalid())
13923           return ExprError();
13924         ArgStorage = new (getSema().Context)
13925             PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
13926                               E->getPackLoc(), std::nullopt);
13927       }
13928       PackArgs = ArgStorage;
13929     }
13930   }
13931 
13932   // If we're not expanding the pack, just transform the decl.
13933   if (!PackArgs.size()) {
13934     auto *Pack = cast_or_null<NamedDecl>(
13935         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13936     if (!Pack)
13937       return ExprError();
13938     return getDerived().RebuildSizeOfPackExpr(
13939         E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(),
13940         std::nullopt, std::nullopt);
13941   }
13942 
13943   // Try to compute the result without performing a partial substitution.
13944   std::optional<unsigned> Result = 0;
13945   for (const TemplateArgument &Arg : PackArgs) {
13946     if (!Arg.isPackExpansion()) {
13947       Result = *Result + 1;
13948       continue;
13949     }
13950 
13951     TemplateArgumentLoc ArgLoc;
13952     InventTemplateArgumentLoc(Arg, ArgLoc);
13953 
13954     // Find the pattern of the pack expansion.
13955     SourceLocation Ellipsis;
13956     std::optional<unsigned> OrigNumExpansions;
13957     TemplateArgumentLoc Pattern =
13958         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13959                                                           OrigNumExpansions);
13960 
13961     // Substitute under the pack expansion. Do not expand the pack (yet).
13962     TemplateArgumentLoc OutPattern;
13963     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13964     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13965                                                /*Uneval*/ true))
13966       return true;
13967 
13968     // See if we can determine the number of arguments from the result.
13969     std::optional<unsigned> NumExpansions =
13970         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13971     if (!NumExpansions) {
13972       // No: we must be in an alias template expansion, and we're going to need
13973       // to actually expand the packs.
13974       Result = std::nullopt;
13975       break;
13976     }
13977 
13978     Result = *Result + *NumExpansions;
13979   }
13980 
13981   // Common case: we could determine the number of expansions without
13982   // substituting.
13983   if (Result)
13984     return getDerived().RebuildSizeOfPackExpr(
13985         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
13986         *Result, std::nullopt);
13987 
13988   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13989                                                E->getPackLoc());
13990   {
13991     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13992     typedef TemplateArgumentLocInventIterator<
13993         Derived, const TemplateArgument*> PackLocIterator;
13994     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13995                                    PackLocIterator(*this, PackArgs.end()),
13996                                    TransformedPackArgs, /*Uneval*/true))
13997       return ExprError();
13998   }
13999 
14000   // Check whether we managed to fully-expand the pack.
14001   // FIXME: Is it possible for us to do so and not hit the early exit path?
14002   SmallVector<TemplateArgument, 8> Args;
14003   bool PartialSubstitution = false;
14004   for (auto &Loc : TransformedPackArgs.arguments()) {
14005     Args.push_back(Loc.getArgument());
14006     if (Loc.getArgument().isPackExpansion())
14007       PartialSubstitution = true;
14008   }
14009 
14010   if (PartialSubstitution)
14011     return getDerived().RebuildSizeOfPackExpr(
14012         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
14013         std::nullopt, Args);
14014 
14015   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
14016                                             E->getPackLoc(), E->getRParenLoc(),
14017                                             Args.size(), std::nullopt);
14018 }
14019 
14020 template<typename Derived>
14021 ExprResult
14022 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
14023                                           SubstNonTypeTemplateParmPackExpr *E) {
14024   // Default behavior is to do nothing with this transformation.
14025   return E;
14026 }
14027 
14028 template<typename Derived>
14029 ExprResult
14030 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
14031                                           SubstNonTypeTemplateParmExpr *E) {
14032   // Default behavior is to do nothing with this transformation.
14033   return E;
14034 }
14035 
14036 template<typename Derived>
14037 ExprResult
14038 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
14039   // Default behavior is to do nothing with this transformation.
14040   return E;
14041 }
14042 
14043 template<typename Derived>
14044 ExprResult
14045 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
14046                                                   MaterializeTemporaryExpr *E) {
14047   return getDerived().TransformExpr(E->getSubExpr());
14048 }
14049 
14050 template<typename Derived>
14051 ExprResult
14052 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
14053   UnresolvedLookupExpr *Callee = nullptr;
14054   if (Expr *OldCallee = E->getCallee()) {
14055     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
14056     if (CalleeResult.isInvalid())
14057       return ExprError();
14058     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
14059   }
14060 
14061   Expr *Pattern = E->getPattern();
14062 
14063   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14064   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
14065   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14066 
14067   // Determine whether the set of unexpanded parameter packs can and should
14068   // be expanded.
14069   bool Expand = true;
14070   bool RetainExpansion = false;
14071   std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
14072                           NumExpansions = OrigNumExpansions;
14073   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
14074                                            Pattern->getSourceRange(),
14075                                            Unexpanded,
14076                                            Expand, RetainExpansion,
14077                                            NumExpansions))
14078     return true;
14079 
14080   if (!Expand) {
14081     // Do not expand any packs here, just transform and rebuild a fold
14082     // expression.
14083     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14084 
14085     ExprResult LHS =
14086         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
14087     if (LHS.isInvalid())
14088       return true;
14089 
14090     ExprResult RHS =
14091         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
14092     if (RHS.isInvalid())
14093       return true;
14094 
14095     if (!getDerived().AlwaysRebuild() &&
14096         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
14097       return E;
14098 
14099     return getDerived().RebuildCXXFoldExpr(
14100         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
14101         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
14102   }
14103 
14104   // Formally a fold expression expands to nested parenthesized expressions.
14105   // Enforce this limit to avoid creating trees so deep we can't safely traverse
14106   // them.
14107   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
14108     SemaRef.Diag(E->getEllipsisLoc(),
14109                  clang::diag::err_fold_expression_limit_exceeded)
14110         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
14111         << E->getSourceRange();
14112     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
14113     return ExprError();
14114   }
14115 
14116   // The transform has determined that we should perform an elementwise
14117   // expansion of the pattern. Do so.
14118   ExprResult Result = getDerived().TransformExpr(E->getInit());
14119   if (Result.isInvalid())
14120     return true;
14121   bool LeftFold = E->isLeftFold();
14122 
14123   // If we're retaining an expansion for a right fold, it is the innermost
14124   // component and takes the init (if any).
14125   if (!LeftFold && RetainExpansion) {
14126     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14127 
14128     ExprResult Out = getDerived().TransformExpr(Pattern);
14129     if (Out.isInvalid())
14130       return true;
14131 
14132     Result = getDerived().RebuildCXXFoldExpr(
14133         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
14134         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
14135     if (Result.isInvalid())
14136       return true;
14137   }
14138 
14139   for (unsigned I = 0; I != *NumExpansions; ++I) {
14140     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
14141         getSema(), LeftFold ? I : *NumExpansions - I - 1);
14142     ExprResult Out = getDerived().TransformExpr(Pattern);
14143     if (Out.isInvalid())
14144       return true;
14145 
14146     if (Out.get()->containsUnexpandedParameterPack()) {
14147       // We still have a pack; retain a pack expansion for this slice.
14148       Result = getDerived().RebuildCXXFoldExpr(
14149           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
14150           E->getOperator(), E->getEllipsisLoc(),
14151           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
14152           OrigNumExpansions);
14153     } else if (Result.isUsable()) {
14154       // We've got down to a single element; build a binary operator.
14155       Expr *LHS = LeftFold ? Result.get() : Out.get();
14156       Expr *RHS = LeftFold ? Out.get() : Result.get();
14157       if (Callee) {
14158         UnresolvedSet<16> Functions;
14159         Functions.append(Callee->decls_begin(), Callee->decls_end());
14160         Result = getDerived().RebuildCXXOperatorCallExpr(
14161             BinaryOperator::getOverloadedOperator(E->getOperator()),
14162             E->getEllipsisLoc(), Callee->getBeginLoc(), Callee->requiresADL(),
14163             Functions, LHS, RHS);
14164       } else {
14165         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
14166                                                     E->getOperator(), LHS, RHS);
14167       }
14168     } else
14169       Result = Out;
14170 
14171     if (Result.isInvalid())
14172       return true;
14173   }
14174 
14175   // If we're retaining an expansion for a left fold, it is the outermost
14176   // component and takes the complete expansion so far as its init (if any).
14177   if (LeftFold && RetainExpansion) {
14178     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14179 
14180     ExprResult Out = getDerived().TransformExpr(Pattern);
14181     if (Out.isInvalid())
14182       return true;
14183 
14184     Result = getDerived().RebuildCXXFoldExpr(
14185         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
14186         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
14187     if (Result.isInvalid())
14188       return true;
14189   }
14190 
14191   // If we had no init and an empty pack, and we're not retaining an expansion,
14192   // then produce a fallback value or error.
14193   if (Result.isUnset())
14194     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
14195                                                 E->getOperator());
14196 
14197   return Result;
14198 }
14199 
14200 template <typename Derived>
14201 ExprResult
14202 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) {
14203   SmallVector<Expr *, 4> TransformedInits;
14204   ArrayRef<Expr *> InitExprs = E->getInitExprs();
14205   if (TransformExprs(InitExprs.data(), InitExprs.size(), true,
14206                      TransformedInits))
14207     return ExprError();
14208 
14209   return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits,
14210                                            E->getEndLoc());
14211 }
14212 
14213 template<typename Derived>
14214 ExprResult
14215 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
14216     CXXStdInitializerListExpr *E) {
14217   return getDerived().TransformExpr(E->getSubExpr());
14218 }
14219 
14220 template<typename Derived>
14221 ExprResult
14222 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
14223   return SemaRef.MaybeBindToTemporary(E);
14224 }
14225 
14226 template<typename Derived>
14227 ExprResult
14228 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
14229   return E;
14230 }
14231 
14232 template<typename Derived>
14233 ExprResult
14234 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
14235   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
14236   if (SubExpr.isInvalid())
14237     return ExprError();
14238 
14239   if (!getDerived().AlwaysRebuild() &&
14240       SubExpr.get() == E->getSubExpr())
14241     return E;
14242 
14243   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
14244 }
14245 
14246 template<typename Derived>
14247 ExprResult
14248 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
14249   // Transform each of the elements.
14250   SmallVector<Expr *, 8> Elements;
14251   bool ArgChanged = false;
14252   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
14253                                   /*IsCall=*/false, Elements, &ArgChanged))
14254     return ExprError();
14255 
14256   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14257     return SemaRef.MaybeBindToTemporary(E);
14258 
14259   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
14260                                               Elements.data(),
14261                                               Elements.size());
14262 }
14263 
14264 template<typename Derived>
14265 ExprResult
14266 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
14267                                                     ObjCDictionaryLiteral *E) {
14268   // Transform each of the elements.
14269   SmallVector<ObjCDictionaryElement, 8> Elements;
14270   bool ArgChanged = false;
14271   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
14272     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
14273 
14274     if (OrigElement.isPackExpansion()) {
14275       // This key/value element is a pack expansion.
14276       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14277       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
14278       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
14279       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14280 
14281       // Determine whether the set of unexpanded parameter packs can
14282       // and should be expanded.
14283       bool Expand = true;
14284       bool RetainExpansion = false;
14285       std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
14286       std::optional<unsigned> NumExpansions = OrigNumExpansions;
14287       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
14288                                OrigElement.Value->getEndLoc());
14289       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
14290                                                PatternRange, Unexpanded, Expand,
14291                                                RetainExpansion, NumExpansions))
14292         return ExprError();
14293 
14294       if (!Expand) {
14295         // The transform has determined that we should perform a simple
14296         // transformation on the pack expansion, producing another pack
14297         // expansion.
14298         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14299         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14300         if (Key.isInvalid())
14301           return ExprError();
14302 
14303         if (Key.get() != OrigElement.Key)
14304           ArgChanged = true;
14305 
14306         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14307         if (Value.isInvalid())
14308           return ExprError();
14309 
14310         if (Value.get() != OrigElement.Value)
14311           ArgChanged = true;
14312 
14313         ObjCDictionaryElement Expansion = {
14314           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
14315         };
14316         Elements.push_back(Expansion);
14317         continue;
14318       }
14319 
14320       // Record right away that the argument was changed.  This needs
14321       // to happen even if the array expands to nothing.
14322       ArgChanged = true;
14323 
14324       // The transform has determined that we should perform an elementwise
14325       // expansion of the pattern. Do so.
14326       for (unsigned I = 0; I != *NumExpansions; ++I) {
14327         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
14328         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14329         if (Key.isInvalid())
14330           return ExprError();
14331 
14332         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14333         if (Value.isInvalid())
14334           return ExprError();
14335 
14336         ObjCDictionaryElement Element = {
14337           Key.get(), Value.get(), SourceLocation(), NumExpansions
14338         };
14339 
14340         // If any unexpanded parameter packs remain, we still have a
14341         // pack expansion.
14342         // FIXME: Can this really happen?
14343         if (Key.get()->containsUnexpandedParameterPack() ||
14344             Value.get()->containsUnexpandedParameterPack())
14345           Element.EllipsisLoc = OrigElement.EllipsisLoc;
14346 
14347         Elements.push_back(Element);
14348       }
14349 
14350       // FIXME: Retain a pack expansion if RetainExpansion is true.
14351 
14352       // We've finished with this pack expansion.
14353       continue;
14354     }
14355 
14356     // Transform and check key.
14357     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14358     if (Key.isInvalid())
14359       return ExprError();
14360 
14361     if (Key.get() != OrigElement.Key)
14362       ArgChanged = true;
14363 
14364     // Transform and check value.
14365     ExprResult Value
14366       = getDerived().TransformExpr(OrigElement.Value);
14367     if (Value.isInvalid())
14368       return ExprError();
14369 
14370     if (Value.get() != OrigElement.Value)
14371       ArgChanged = true;
14372 
14373     ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(),
14374                                      std::nullopt};
14375     Elements.push_back(Element);
14376   }
14377 
14378   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14379     return SemaRef.MaybeBindToTemporary(E);
14380 
14381   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
14382                                                    Elements);
14383 }
14384 
14385 template<typename Derived>
14386 ExprResult
14387 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
14388   TypeSourceInfo *EncodedTypeInfo
14389     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
14390   if (!EncodedTypeInfo)
14391     return ExprError();
14392 
14393   if (!getDerived().AlwaysRebuild() &&
14394       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
14395     return E;
14396 
14397   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
14398                                             EncodedTypeInfo,
14399                                             E->getRParenLoc());
14400 }
14401 
14402 template<typename Derived>
14403 ExprResult TreeTransform<Derived>::
14404 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
14405   // This is a kind of implicit conversion, and it needs to get dropped
14406   // and recomputed for the same general reasons that ImplicitCastExprs
14407   // do, as well a more specific one: this expression is only valid when
14408   // it appears *immediately* as an argument expression.
14409   return getDerived().TransformExpr(E->getSubExpr());
14410 }
14411 
14412 template<typename Derived>
14413 ExprResult TreeTransform<Derived>::
14414 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
14415   TypeSourceInfo *TSInfo
14416     = getDerived().TransformType(E->getTypeInfoAsWritten());
14417   if (!TSInfo)
14418     return ExprError();
14419 
14420   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
14421   if (Result.isInvalid())
14422     return ExprError();
14423 
14424   if (!getDerived().AlwaysRebuild() &&
14425       TSInfo == E->getTypeInfoAsWritten() &&
14426       Result.get() == E->getSubExpr())
14427     return E;
14428 
14429   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
14430                                       E->getBridgeKeywordLoc(), TSInfo,
14431                                       Result.get());
14432 }
14433 
14434 template <typename Derived>
14435 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14436     ObjCAvailabilityCheckExpr *E) {
14437   return E;
14438 }
14439 
14440 template<typename Derived>
14441 ExprResult
14442 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14443   // Transform arguments.
14444   bool ArgChanged = false;
14445   SmallVector<Expr*, 8> Args;
14446   Args.reserve(E->getNumArgs());
14447   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14448                                   &ArgChanged))
14449     return ExprError();
14450 
14451   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14452     // Class message: transform the receiver type.
14453     TypeSourceInfo *ReceiverTypeInfo
14454       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14455     if (!ReceiverTypeInfo)
14456       return ExprError();
14457 
14458     // If nothing changed, just retain the existing message send.
14459     if (!getDerived().AlwaysRebuild() &&
14460         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14461       return SemaRef.MaybeBindToTemporary(E);
14462 
14463     // Build a new class message send.
14464     SmallVector<SourceLocation, 16> SelLocs;
14465     E->getSelectorLocs(SelLocs);
14466     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14467                                                E->getSelector(),
14468                                                SelLocs,
14469                                                E->getMethodDecl(),
14470                                                E->getLeftLoc(),
14471                                                Args,
14472                                                E->getRightLoc());
14473   }
14474   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14475            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14476     if (!E->getMethodDecl())
14477       return ExprError();
14478 
14479     // Build a new class message send to 'super'.
14480     SmallVector<SourceLocation, 16> SelLocs;
14481     E->getSelectorLocs(SelLocs);
14482     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14483                                                E->getSelector(),
14484                                                SelLocs,
14485                                                E->getReceiverType(),
14486                                                E->getMethodDecl(),
14487                                                E->getLeftLoc(),
14488                                                Args,
14489                                                E->getRightLoc());
14490   }
14491 
14492   // Instance message: transform the receiver
14493   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14494          "Only class and instance messages may be instantiated");
14495   ExprResult Receiver
14496     = getDerived().TransformExpr(E->getInstanceReceiver());
14497   if (Receiver.isInvalid())
14498     return ExprError();
14499 
14500   // If nothing changed, just retain the existing message send.
14501   if (!getDerived().AlwaysRebuild() &&
14502       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14503     return SemaRef.MaybeBindToTemporary(E);
14504 
14505   // Build a new instance message send.
14506   SmallVector<SourceLocation, 16> SelLocs;
14507   E->getSelectorLocs(SelLocs);
14508   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14509                                              E->getSelector(),
14510                                              SelLocs,
14511                                              E->getMethodDecl(),
14512                                              E->getLeftLoc(),
14513                                              Args,
14514                                              E->getRightLoc());
14515 }
14516 
14517 template<typename Derived>
14518 ExprResult
14519 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14520   return E;
14521 }
14522 
14523 template<typename Derived>
14524 ExprResult
14525 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14526   return E;
14527 }
14528 
14529 template<typename Derived>
14530 ExprResult
14531 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14532   // Transform the base expression.
14533   ExprResult Base = getDerived().TransformExpr(E->getBase());
14534   if (Base.isInvalid())
14535     return ExprError();
14536 
14537   // We don't need to transform the ivar; it will never change.
14538 
14539   // If nothing changed, just retain the existing expression.
14540   if (!getDerived().AlwaysRebuild() &&
14541       Base.get() == E->getBase())
14542     return E;
14543 
14544   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14545                                              E->getLocation(),
14546                                              E->isArrow(), E->isFreeIvar());
14547 }
14548 
14549 template<typename Derived>
14550 ExprResult
14551 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14552   // 'super' and types never change. Property never changes. Just
14553   // retain the existing expression.
14554   if (!E->isObjectReceiver())
14555     return E;
14556 
14557   // Transform the base expression.
14558   ExprResult Base = getDerived().TransformExpr(E->getBase());
14559   if (Base.isInvalid())
14560     return ExprError();
14561 
14562   // We don't need to transform the property; it will never change.
14563 
14564   // If nothing changed, just retain the existing expression.
14565   if (!getDerived().AlwaysRebuild() &&
14566       Base.get() == E->getBase())
14567     return E;
14568 
14569   if (E->isExplicitProperty())
14570     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14571                                                    E->getExplicitProperty(),
14572                                                    E->getLocation());
14573 
14574   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14575                                                  SemaRef.Context.PseudoObjectTy,
14576                                                  E->getImplicitPropertyGetter(),
14577                                                  E->getImplicitPropertySetter(),
14578                                                  E->getLocation());
14579 }
14580 
14581 template<typename Derived>
14582 ExprResult
14583 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14584   // Transform the base expression.
14585   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14586   if (Base.isInvalid())
14587     return ExprError();
14588 
14589   // Transform the key expression.
14590   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14591   if (Key.isInvalid())
14592     return ExprError();
14593 
14594   // If nothing changed, just retain the existing expression.
14595   if (!getDerived().AlwaysRebuild() &&
14596       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14597     return E;
14598 
14599   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14600                                                   Base.get(), Key.get(),
14601                                                   E->getAtIndexMethodDecl(),
14602                                                   E->setAtIndexMethodDecl());
14603 }
14604 
14605 template<typename Derived>
14606 ExprResult
14607 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14608   // Transform the base expression.
14609   ExprResult Base = getDerived().TransformExpr(E->getBase());
14610   if (Base.isInvalid())
14611     return ExprError();
14612 
14613   // If nothing changed, just retain the existing expression.
14614   if (!getDerived().AlwaysRebuild() &&
14615       Base.get() == E->getBase())
14616     return E;
14617 
14618   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14619                                          E->getOpLoc(),
14620                                          E->isArrow());
14621 }
14622 
14623 template<typename Derived>
14624 ExprResult
14625 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14626   bool ArgumentChanged = false;
14627   SmallVector<Expr*, 8> SubExprs;
14628   SubExprs.reserve(E->getNumSubExprs());
14629   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14630                                   SubExprs, &ArgumentChanged))
14631     return ExprError();
14632 
14633   if (!getDerived().AlwaysRebuild() &&
14634       !ArgumentChanged)
14635     return E;
14636 
14637   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14638                                                SubExprs,
14639                                                E->getRParenLoc());
14640 }
14641 
14642 template<typename Derived>
14643 ExprResult
14644 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14645   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14646   if (SrcExpr.isInvalid())
14647     return ExprError();
14648 
14649   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14650   if (!Type)
14651     return ExprError();
14652 
14653   if (!getDerived().AlwaysRebuild() &&
14654       Type == E->getTypeSourceInfo() &&
14655       SrcExpr.get() == E->getSrcExpr())
14656     return E;
14657 
14658   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14659                                                SrcExpr.get(), Type,
14660                                                E->getRParenLoc());
14661 }
14662 
14663 template<typename Derived>
14664 ExprResult
14665 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14666   BlockDecl *oldBlock = E->getBlockDecl();
14667 
14668   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14669   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14670 
14671   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14672   blockScope->TheDecl->setBlockMissingReturnType(
14673                          oldBlock->blockMissingReturnType());
14674 
14675   SmallVector<ParmVarDecl*, 4> params;
14676   SmallVector<QualType, 4> paramTypes;
14677 
14678   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14679 
14680   // Parameter substitution.
14681   Sema::ExtParameterInfoBuilder extParamInfos;
14682   if (getDerived().TransformFunctionTypeParams(
14683           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14684           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14685           extParamInfos)) {
14686     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14687     return ExprError();
14688   }
14689 
14690   QualType exprResultType =
14691       getDerived().TransformType(exprFunctionType->getReturnType());
14692 
14693   auto epi = exprFunctionType->getExtProtoInfo();
14694   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14695 
14696   QualType functionType =
14697     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14698   blockScope->FunctionType = functionType;
14699 
14700   // Set the parameters on the block decl.
14701   if (!params.empty())
14702     blockScope->TheDecl->setParams(params);
14703 
14704   if (!oldBlock->blockMissingReturnType()) {
14705     blockScope->HasImplicitReturnType = false;
14706     blockScope->ReturnType = exprResultType;
14707   }
14708 
14709   // Transform the body
14710   StmtResult body = getDerived().TransformStmt(E->getBody());
14711   if (body.isInvalid()) {
14712     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14713     return ExprError();
14714   }
14715 
14716 #ifndef NDEBUG
14717   // In builds with assertions, make sure that we captured everything we
14718   // captured before.
14719   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14720     for (const auto &I : oldBlock->captures()) {
14721       VarDecl *oldCapture = I.getVariable();
14722 
14723       // Ignore parameter packs.
14724       if (oldCapture->isParameterPack())
14725         continue;
14726 
14727       VarDecl *newCapture =
14728         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14729                                                  oldCapture));
14730       assert(blockScope->CaptureMap.count(newCapture));
14731     }
14732 
14733     // The this pointer may not be captured by the instantiated block, even when
14734     // it's captured by the original block, if the expression causing the
14735     // capture is in the discarded branch of a constexpr if statement.
14736     assert((!blockScope->isCXXThisCaptured() || oldBlock->capturesCXXThis()) &&
14737            "this pointer isn't captured in the old block");
14738   }
14739 #endif
14740 
14741   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14742                                     /*Scope=*/nullptr);
14743 }
14744 
14745 template<typename Derived>
14746 ExprResult
14747 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14748   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14749   if (SrcExpr.isInvalid())
14750     return ExprError();
14751 
14752   QualType Type = getDerived().TransformType(E->getType());
14753 
14754   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14755                                  E->getRParenLoc());
14756 }
14757 
14758 template<typename Derived>
14759 ExprResult
14760 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14761   bool ArgumentChanged = false;
14762   SmallVector<Expr*, 8> SubExprs;
14763   SubExprs.reserve(E->getNumSubExprs());
14764   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14765                                   SubExprs, &ArgumentChanged))
14766     return ExprError();
14767 
14768   if (!getDerived().AlwaysRebuild() &&
14769       !ArgumentChanged)
14770     return E;
14771 
14772   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14773                                         E->getOp(), E->getRParenLoc());
14774 }
14775 
14776 //===----------------------------------------------------------------------===//
14777 // Type reconstruction
14778 //===----------------------------------------------------------------------===//
14779 
14780 template<typename Derived>
14781 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14782                                                     SourceLocation Star) {
14783   return SemaRef.BuildPointerType(PointeeType, Star,
14784                                   getDerived().getBaseEntity());
14785 }
14786 
14787 template<typename Derived>
14788 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14789                                                          SourceLocation Star) {
14790   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14791                                        getDerived().getBaseEntity());
14792 }
14793 
14794 template<typename Derived>
14795 QualType
14796 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14797                                              bool WrittenAsLValue,
14798                                              SourceLocation Sigil) {
14799   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14800                                     Sigil, getDerived().getBaseEntity());
14801 }
14802 
14803 template<typename Derived>
14804 QualType
14805 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14806                                                  QualType ClassType,
14807                                                  SourceLocation Sigil) {
14808   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14809                                         getDerived().getBaseEntity());
14810 }
14811 
14812 template<typename Derived>
14813 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14814            const ObjCTypeParamDecl *Decl,
14815            SourceLocation ProtocolLAngleLoc,
14816            ArrayRef<ObjCProtocolDecl *> Protocols,
14817            ArrayRef<SourceLocation> ProtocolLocs,
14818            SourceLocation ProtocolRAngleLoc) {
14819   return SemaRef.BuildObjCTypeParamType(Decl,
14820                                         ProtocolLAngleLoc, Protocols,
14821                                         ProtocolLocs, ProtocolRAngleLoc,
14822                                         /*FailOnError=*/true);
14823 }
14824 
14825 template<typename Derived>
14826 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14827            QualType BaseType,
14828            SourceLocation Loc,
14829            SourceLocation TypeArgsLAngleLoc,
14830            ArrayRef<TypeSourceInfo *> TypeArgs,
14831            SourceLocation TypeArgsRAngleLoc,
14832            SourceLocation ProtocolLAngleLoc,
14833            ArrayRef<ObjCProtocolDecl *> Protocols,
14834            ArrayRef<SourceLocation> ProtocolLocs,
14835            SourceLocation ProtocolRAngleLoc) {
14836   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs,
14837                                      TypeArgsRAngleLoc, ProtocolLAngleLoc,
14838                                      Protocols, ProtocolLocs, ProtocolRAngleLoc,
14839                                      /*FailOnError=*/true,
14840                                      /*Rebuilding=*/true);
14841 }
14842 
14843 template<typename Derived>
14844 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14845            QualType PointeeType,
14846            SourceLocation Star) {
14847   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14848 }
14849 
14850 template<typename Derived>
14851 QualType
14852 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14853                                          ArrayType::ArraySizeModifier SizeMod,
14854                                          const llvm::APInt *Size,
14855                                          Expr *SizeExpr,
14856                                          unsigned IndexTypeQuals,
14857                                          SourceRange BracketsRange) {
14858   if (SizeExpr || !Size)
14859     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14860                                   IndexTypeQuals, BracketsRange,
14861                                   getDerived().getBaseEntity());
14862 
14863   QualType Types[] = {
14864     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14865     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14866     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14867   };
14868   QualType SizeType;
14869   for (const auto &T : Types)
14870     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) {
14871       SizeType = T;
14872       break;
14873     }
14874 
14875   // Note that we can return a VariableArrayType here in the case where
14876   // the element type was a dependent VariableArrayType.
14877   IntegerLiteral *ArraySize
14878       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14879                                /*FIXME*/BracketsRange.getBegin());
14880   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14881                                 IndexTypeQuals, BracketsRange,
14882                                 getDerived().getBaseEntity());
14883 }
14884 
14885 template<typename Derived>
14886 QualType
14887 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14888                                                  ArrayType::ArraySizeModifier SizeMod,
14889                                                  const llvm::APInt &Size,
14890                                                  Expr *SizeExpr,
14891                                                  unsigned IndexTypeQuals,
14892                                                  SourceRange BracketsRange) {
14893   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14894                                         IndexTypeQuals, BracketsRange);
14895 }
14896 
14897 template<typename Derived>
14898 QualType
14899 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14900                                           ArrayType::ArraySizeModifier SizeMod,
14901                                                  unsigned IndexTypeQuals,
14902                                                    SourceRange BracketsRange) {
14903   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14904                                        IndexTypeQuals, BracketsRange);
14905 }
14906 
14907 template<typename Derived>
14908 QualType
14909 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14910                                           ArrayType::ArraySizeModifier SizeMod,
14911                                                  Expr *SizeExpr,
14912                                                  unsigned IndexTypeQuals,
14913                                                  SourceRange BracketsRange) {
14914   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14915                                        SizeExpr,
14916                                        IndexTypeQuals, BracketsRange);
14917 }
14918 
14919 template<typename Derived>
14920 QualType
14921 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14922                                           ArrayType::ArraySizeModifier SizeMod,
14923                                                        Expr *SizeExpr,
14924                                                        unsigned IndexTypeQuals,
14925                                                    SourceRange BracketsRange) {
14926   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14927                                        SizeExpr,
14928                                        IndexTypeQuals, BracketsRange);
14929 }
14930 
14931 template <typename Derived>
14932 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14933     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14934   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14935                                           AttributeLoc);
14936 }
14937 
14938 template <typename Derived>
14939 QualType
14940 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14941                                           unsigned NumElements,
14942                                           VectorType::VectorKind VecKind) {
14943   // FIXME: semantic checking!
14944   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14945 }
14946 
14947 template <typename Derived>
14948 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14949     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14950     VectorType::VectorKind VecKind) {
14951   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14952 }
14953 
14954 template<typename Derived>
14955 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14956                                                       unsigned NumElements,
14957                                                  SourceLocation AttributeLoc) {
14958   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14959                           NumElements, true);
14960   IntegerLiteral *VectorSize
14961     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14962                              AttributeLoc);
14963   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14964 }
14965 
14966 template<typename Derived>
14967 QualType
14968 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14969                                                            Expr *SizeExpr,
14970                                                   SourceLocation AttributeLoc) {
14971   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14972 }
14973 
14974 template <typename Derived>
14975 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14976     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14977   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14978                                                NumColumns);
14979 }
14980 
14981 template <typename Derived>
14982 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14983     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14984     SourceLocation AttributeLoc) {
14985   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14986                                  AttributeLoc);
14987 }
14988 
14989 template<typename Derived>
14990 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14991     QualType T,
14992     MutableArrayRef<QualType> ParamTypes,
14993     const FunctionProtoType::ExtProtoInfo &EPI) {
14994   return SemaRef.BuildFunctionType(T, ParamTypes,
14995                                    getDerived().getBaseLocation(),
14996                                    getDerived().getBaseEntity(),
14997                                    EPI);
14998 }
14999 
15000 template<typename Derived>
15001 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
15002   return SemaRef.Context.getFunctionNoProtoType(T);
15003 }
15004 
15005 template<typename Derived>
15006 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
15007                                                             Decl *D) {
15008   assert(D && "no decl found");
15009   if (D->isInvalidDecl()) return QualType();
15010 
15011   // FIXME: Doesn't account for ObjCInterfaceDecl!
15012   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
15013     // A valid resolved using typename pack expansion decl can have multiple
15014     // UsingDecls, but they must each have exactly one type, and it must be
15015     // the same type in every case. But we must have at least one expansion!
15016     if (UPD->expansions().empty()) {
15017       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
15018           << UPD->isCXXClassMember() << UPD;
15019       return QualType();
15020     }
15021 
15022     // We might still have some unresolved types. Try to pick a resolved type
15023     // if we can. The final instantiation will check that the remaining
15024     // unresolved types instantiate to the type we pick.
15025     QualType FallbackT;
15026     QualType T;
15027     for (auto *E : UPD->expansions()) {
15028       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
15029       if (ThisT.isNull())
15030         continue;
15031       else if (ThisT->getAs<UnresolvedUsingType>())
15032         FallbackT = ThisT;
15033       else if (T.isNull())
15034         T = ThisT;
15035       else
15036         assert(getSema().Context.hasSameType(ThisT, T) &&
15037                "mismatched resolved types in using pack expansion");
15038     }
15039     return T.isNull() ? FallbackT : T;
15040   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
15041     assert(Using->hasTypename() &&
15042            "UnresolvedUsingTypenameDecl transformed to non-typename using");
15043 
15044     // A valid resolved using typename decl points to exactly one type decl.
15045     assert(++Using->shadow_begin() == Using->shadow_end());
15046 
15047     UsingShadowDecl *Shadow = *Using->shadow_begin();
15048     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
15049       return QualType();
15050     return SemaRef.Context.getUsingType(
15051         Shadow, SemaRef.Context.getTypeDeclType(
15052                     cast<TypeDecl>(Shadow->getTargetDecl())));
15053   } else {
15054     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
15055            "UnresolvedUsingTypenameDecl transformed to non-using decl");
15056     return SemaRef.Context.getTypeDeclType(
15057         cast<UnresolvedUsingTypenameDecl>(D));
15058   }
15059 }
15060 
15061 template <typename Derived>
15062 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation,
15063                                                        TypeOfKind Kind) {
15064   return SemaRef.BuildTypeofExprType(E, Kind);
15065 }
15066 
15067 template<typename Derived>
15068 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying,
15069                                                    TypeOfKind Kind) {
15070   return SemaRef.Context.getTypeOfType(Underlying, Kind);
15071 }
15072 
15073 template <typename Derived>
15074 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
15075   return SemaRef.BuildDecltypeType(E);
15076 }
15077 
15078 template<typename Derived>
15079 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
15080                                             UnaryTransformType::UTTKind UKind,
15081                                             SourceLocation Loc) {
15082   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
15083 }
15084 
15085 template<typename Derived>
15086 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
15087                                                       TemplateName Template,
15088                                              SourceLocation TemplateNameLoc,
15089                                      TemplateArgumentListInfo &TemplateArgs) {
15090   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
15091 }
15092 
15093 template<typename Derived>
15094 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
15095                                                    SourceLocation KWLoc) {
15096   return SemaRef.BuildAtomicType(ValueType, KWLoc);
15097 }
15098 
15099 template<typename Derived>
15100 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
15101                                                  SourceLocation KWLoc,
15102                                                  bool isReadPipe) {
15103   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
15104                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
15105 }
15106 
15107 template <typename Derived>
15108 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
15109                                                    unsigned NumBits,
15110                                                    SourceLocation Loc) {
15111   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
15112                         NumBits, true);
15113   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
15114                                                 SemaRef.Context.IntTy, Loc);
15115   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
15116 }
15117 
15118 template <typename Derived>
15119 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
15120     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
15121   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
15122 }
15123 
15124 template<typename Derived>
15125 TemplateName
15126 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15127                                             bool TemplateKW,
15128                                             TemplateDecl *Template) {
15129   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
15130                                                   TemplateName(Template));
15131 }
15132 
15133 template<typename Derived>
15134 TemplateName
15135 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15136                                             SourceLocation TemplateKWLoc,
15137                                             const IdentifierInfo &Name,
15138                                             SourceLocation NameLoc,
15139                                             QualType ObjectType,
15140                                             NamedDecl *FirstQualifierInScope,
15141                                             bool AllowInjectedClassName) {
15142   UnqualifiedId TemplateName;
15143   TemplateName.setIdentifier(&Name, NameLoc);
15144   Sema::TemplateTy Template;
15145   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
15146                               TemplateName, ParsedType::make(ObjectType),
15147                               /*EnteringContext=*/false, Template,
15148                               AllowInjectedClassName);
15149   return Template.get();
15150 }
15151 
15152 template<typename Derived>
15153 TemplateName
15154 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15155                                             SourceLocation TemplateKWLoc,
15156                                             OverloadedOperatorKind Operator,
15157                                             SourceLocation NameLoc,
15158                                             QualType ObjectType,
15159                                             bool AllowInjectedClassName) {
15160   UnqualifiedId Name;
15161   // FIXME: Bogus location information.
15162   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
15163   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
15164   Sema::TemplateTy Template;
15165   getSema().ActOnTemplateName(
15166       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
15167       /*EnteringContext=*/false, Template, AllowInjectedClassName);
15168   return Template.get();
15169 }
15170 
15171 template <typename Derived>
15172 ExprResult TreeTransform<Derived>::RebuildCXXOperatorCallExpr(
15173     OverloadedOperatorKind Op, SourceLocation OpLoc, SourceLocation CalleeLoc,
15174     bool RequiresADL, const UnresolvedSetImpl &Functions, Expr *First,
15175     Expr *Second) {
15176   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
15177 
15178   if (First->getObjectKind() == OK_ObjCProperty) {
15179     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15180     if (BinaryOperator::isAssignmentOp(Opc))
15181       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
15182                                                  First, Second);
15183     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
15184     if (Result.isInvalid())
15185       return ExprError();
15186     First = Result.get();
15187   }
15188 
15189   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
15190     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
15191     if (Result.isInvalid())
15192       return ExprError();
15193     Second = Result.get();
15194   }
15195 
15196   // Determine whether this should be a builtin operation.
15197   if (Op == OO_Subscript) {
15198     if (!First->getType()->isOverloadableType() &&
15199         !Second->getType()->isOverloadableType())
15200       return getSema().CreateBuiltinArraySubscriptExpr(First, CalleeLoc, Second,
15201                                                        OpLoc);
15202   } else if (Op == OO_Arrow) {
15203     // It is possible that the type refers to a RecoveryExpr created earlier
15204     // in the tree transformation.
15205     if (First->getType()->isDependentType())
15206       return ExprError();
15207     // -> is never a builtin operation.
15208     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
15209   } else if (Second == nullptr || isPostIncDec) {
15210     if (!First->getType()->isOverloadableType() ||
15211         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
15212       // The argument is not of overloadable type, or this is an expression
15213       // of the form &Class::member, so try to create a built-in unary
15214       // operation.
15215       UnaryOperatorKind Opc
15216         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15217 
15218       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
15219     }
15220   } else {
15221     if (!First->getType()->isOverloadableType() &&
15222         !Second->getType()->isOverloadableType()) {
15223       // Neither of the arguments is an overloadable type, so try to
15224       // create a built-in binary operation.
15225       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15226       ExprResult Result
15227         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
15228       if (Result.isInvalid())
15229         return ExprError();
15230 
15231       return Result;
15232     }
15233   }
15234 
15235   // Add any functions found via argument-dependent lookup.
15236   Expr *Args[2] = { First, Second };
15237   unsigned NumArgs = 1 + (Second != nullptr);
15238 
15239   // Create the overloaded operator invocation for unary operators.
15240   if (NumArgs == 1 || isPostIncDec) {
15241     UnaryOperatorKind Opc
15242       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15243     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
15244                                            RequiresADL);
15245   }
15246 
15247   // Create the overloaded operator invocation for binary operators.
15248   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15249   ExprResult Result = SemaRef.CreateOverloadedBinOp(
15250       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
15251   if (Result.isInvalid())
15252     return ExprError();
15253 
15254   return Result;
15255 }
15256 
15257 template<typename Derived>
15258 ExprResult
15259 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
15260                                                      SourceLocation OperatorLoc,
15261                                                        bool isArrow,
15262                                                        CXXScopeSpec &SS,
15263                                                      TypeSourceInfo *ScopeType,
15264                                                        SourceLocation CCLoc,
15265                                                        SourceLocation TildeLoc,
15266                                         PseudoDestructorTypeStorage Destroyed) {
15267   QualType BaseType = Base->getType();
15268   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
15269       (!isArrow && !BaseType->getAs<RecordType>()) ||
15270       (isArrow && BaseType->getAs<PointerType>() &&
15271        !BaseType->castAs<PointerType>()->getPointeeType()
15272                                               ->template getAs<RecordType>())){
15273     // This pseudo-destructor expression is still a pseudo-destructor.
15274     return SemaRef.BuildPseudoDestructorExpr(
15275         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
15276         CCLoc, TildeLoc, Destroyed);
15277   }
15278 
15279   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
15280   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
15281                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
15282   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
15283   NameInfo.setNamedTypeInfo(DestroyedType);
15284 
15285   // The scope type is now known to be a valid nested name specifier
15286   // component. Tack it on to the end of the nested name specifier.
15287   if (ScopeType) {
15288     if (!ScopeType->getType()->getAs<TagType>()) {
15289       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
15290                      diag::err_expected_class_or_namespace)
15291           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
15292       return ExprError();
15293     }
15294     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
15295               CCLoc);
15296   }
15297 
15298   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
15299   return getSema().BuildMemberReferenceExpr(Base, BaseType,
15300                                             OperatorLoc, isArrow,
15301                                             SS, TemplateKWLoc,
15302                                             /*FIXME: FirstQualifier*/ nullptr,
15303                                             NameInfo,
15304                                             /*TemplateArgs*/ nullptr,
15305                                             /*S*/nullptr);
15306 }
15307 
15308 template<typename Derived>
15309 StmtResult
15310 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
15311   SourceLocation Loc = S->getBeginLoc();
15312   CapturedDecl *CD = S->getCapturedDecl();
15313   unsigned NumParams = CD->getNumParams();
15314   unsigned ContextParamPos = CD->getContextParamPosition();
15315   SmallVector<Sema::CapturedParamNameType, 4> Params;
15316   for (unsigned I = 0; I < NumParams; ++I) {
15317     if (I != ContextParamPos) {
15318       Params.push_back(
15319              std::make_pair(
15320                   CD->getParam(I)->getName(),
15321                   getDerived().TransformType(CD->getParam(I)->getType())));
15322     } else {
15323       Params.push_back(std::make_pair(StringRef(), QualType()));
15324     }
15325   }
15326   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
15327                                      S->getCapturedRegionKind(), Params);
15328   StmtResult Body;
15329   {
15330     Sema::CompoundScopeRAII CompoundScope(getSema());
15331     Body = getDerived().TransformStmt(S->getCapturedStmt());
15332   }
15333 
15334   if (Body.isInvalid()) {
15335     getSema().ActOnCapturedRegionError();
15336     return StmtError();
15337   }
15338 
15339   return getSema().ActOnCapturedRegionEnd(Body.get());
15340 }
15341 
15342 } // end namespace clang
15343 
15344 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15345