xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 1ac55f4cb0001fed92329746c730aa9a947c09a5)
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/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.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/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 #include <optional>
44 
45 using namespace llvm::omp;
46 
47 namespace clang {
48 using namespace sema;
49 
50 /// A semantic tree transformation that allows one to transform one
51 /// abstract syntax tree into another.
52 ///
53 /// A new tree transformation is defined by creating a new subclass \c X of
54 /// \c TreeTransform<X> and then overriding certain operations to provide
55 /// behavior specific to that transformation. For example, template
56 /// instantiation is implemented as a tree transformation where the
57 /// transformation of TemplateTypeParmType nodes involves substituting the
58 /// template arguments for their corresponding template parameters; a similar
59 /// transformation is performed for non-type template parameters and
60 /// template template parameters.
61 ///
62 /// This tree-transformation template uses static polymorphism to allow
63 /// subclasses to customize any of its operations. Thus, a subclass can
64 /// override any of the transformation or rebuild operators by providing an
65 /// operation with the same signature as the default implementation. The
66 /// overriding function should not be virtual.
67 ///
68 /// Semantic tree transformations are split into two stages, either of which
69 /// can be replaced by a subclass. The "transform" step transforms an AST node
70 /// or the parts of an AST node using the various transformation functions,
71 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
72 /// node of the appropriate kind from the pieces. The default transformation
73 /// routines recursively transform the operands to composite AST nodes (e.g.,
74 /// the pointee type of a PointerType node) and, if any of those operand nodes
75 /// were changed by the transformation, invokes the rebuild operation to create
76 /// a new AST node.
77 ///
78 /// Subclasses can customize the transformation at various levels. The
79 /// most coarse-grained transformations involve replacing TransformType(),
80 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
81 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
82 /// new implementations.
83 ///
84 /// For more fine-grained transformations, subclasses can replace any of the
85 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
86 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
87 /// replacing TransformTemplateTypeParmType() allows template instantiation
88 /// to substitute template arguments for their corresponding template
89 /// parameters. Additionally, subclasses can override the \c RebuildXXX
90 /// functions to control how AST nodes are rebuilt when their operands change.
91 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
92 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
93 /// be able to use more efficient rebuild steps.
94 ///
95 /// There are a handful of other functions that can be overridden, allowing one
96 /// to avoid traversing nodes that don't need any transformation
97 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
98 /// operands have not changed (\c AlwaysRebuild()), and customize the
99 /// default locations and entity names used for type-checking
100 /// (\c getBaseLocation(), \c getBaseEntity()).
101 template<typename Derived>
102 class TreeTransform {
103   /// Private RAII object that helps us forget and then re-remember
104   /// the template argument corresponding to a partially-substituted parameter
105   /// pack.
106   class ForgetPartiallySubstitutedPackRAII {
107     Derived &Self;
108     TemplateArgument Old;
109 
110   public:
111     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
112       Old = Self.ForgetPartiallySubstitutedPack();
113     }
114 
115     ~ForgetPartiallySubstitutedPackRAII() {
116       Self.RememberPartiallySubstitutedPack(Old);
117     }
118   };
119 
120 protected:
121   Sema &SemaRef;
122 
123   /// The set of local declarations that have been transformed, for
124   /// cases where we are forced to build new declarations within the transformer
125   /// rather than in the subclass (e.g., lambda closure types).
126   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
127 
128 public:
129   /// Initializes a new tree transformer.
130   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
131 
132   /// Retrieves a reference to the derived class.
133   Derived &getDerived() { return static_cast<Derived&>(*this); }
134 
135   /// Retrieves a reference to the derived class.
136   const Derived &getDerived() const {
137     return static_cast<const Derived&>(*this);
138   }
139 
140   static inline ExprResult Owned(Expr *E) { return E; }
141   static inline StmtResult Owned(Stmt *S) { return S; }
142 
143   /// Retrieves a reference to the semantic analysis object used for
144   /// this tree transform.
145   Sema &getSema() const { return SemaRef; }
146 
147   /// Whether the transformation should always rebuild AST nodes, even
148   /// if none of the children have changed.
149   ///
150   /// Subclasses may override this function to specify when the transformation
151   /// should rebuild all AST nodes.
152   ///
153   /// We must always rebuild all AST nodes when performing variadic template
154   /// pack expansion, in order to avoid violating the AST invariant that each
155   /// statement node appears at most once in its containing declaration.
156   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
157 
158   /// Whether the transformation is forming an expression or statement that
159   /// replaces the original. In this case, we'll reuse mangling numbers from
160   /// existing lambdas.
161   bool ReplacingOriginal() { return false; }
162 
163   /// Wether CXXConstructExpr can be skipped when they are implicit.
164   /// They will be reconstructed when used if needed.
165   /// This is useful when the user that cause rebuilding of the
166   /// CXXConstructExpr is outside of the expression at which the TreeTransform
167   /// started.
168   bool AllowSkippingCXXConstructExpr() { return true; }
169 
170   /// Returns the location of the entity being transformed, if that
171   /// information was not available elsewhere in the AST.
172   ///
173   /// By default, returns no source-location information. Subclasses can
174   /// provide an alternative implementation that provides better location
175   /// information.
176   SourceLocation getBaseLocation() { return SourceLocation(); }
177 
178   /// Returns the name of the entity being transformed, if that
179   /// information was not available elsewhere in the AST.
180   ///
181   /// By default, returns an empty name. Subclasses can provide an alternative
182   /// implementation with a more precise name.
183   DeclarationName getBaseEntity() { return DeclarationName(); }
184 
185   /// Sets the "base" location and entity when that
186   /// information is known based on another transformation.
187   ///
188   /// By default, the source location and entity are ignored. Subclasses can
189   /// override this function to provide a customized implementation.
190   void setBase(SourceLocation Loc, DeclarationName Entity) { }
191 
192   /// RAII object that temporarily sets the base location and entity
193   /// used for reporting diagnostics in types.
194   class TemporaryBase {
195     TreeTransform &Self;
196     SourceLocation OldLocation;
197     DeclarationName OldEntity;
198 
199   public:
200     TemporaryBase(TreeTransform &Self, SourceLocation Location,
201                   DeclarationName Entity) : Self(Self) {
202       OldLocation = Self.getDerived().getBaseLocation();
203       OldEntity = Self.getDerived().getBaseEntity();
204 
205       if (Location.isValid())
206         Self.getDerived().setBase(Location, Entity);
207     }
208 
209     ~TemporaryBase() {
210       Self.getDerived().setBase(OldLocation, OldEntity);
211     }
212   };
213 
214   /// Determine whether the given type \p T has already been
215   /// transformed.
216   ///
217   /// Subclasses can provide an alternative implementation of this routine
218   /// to short-circuit evaluation when it is known that a given type will
219   /// not change. For example, template instantiation need not traverse
220   /// non-dependent types.
221   bool AlreadyTransformed(QualType T) {
222     return T.isNull();
223   }
224 
225   /// Transform a template parameter depth level.
226   ///
227   /// During a transformation that transforms template parameters, this maps
228   /// an old template parameter depth to a new depth.
229   unsigned TransformTemplateDepth(unsigned Depth) {
230     return Depth;
231   }
232 
233   /// Determine whether the given call argument should be dropped, e.g.,
234   /// because it is a default argument.
235   ///
236   /// Subclasses can provide an alternative implementation of this routine to
237   /// determine which kinds of call arguments get dropped. By default,
238   /// CXXDefaultArgument nodes are dropped (prior to transformation).
239   bool DropCallArgument(Expr *E) {
240     return E->isDefaultArgument();
241   }
242 
243   /// Determine whether we should expand a pack expansion with the
244   /// given set of parameter packs into separate arguments by repeatedly
245   /// transforming the pattern.
246   ///
247   /// By default, the transformer never tries to expand pack expansions.
248   /// Subclasses can override this routine to provide different behavior.
249   ///
250   /// \param EllipsisLoc The location of the ellipsis that identifies the
251   /// pack expansion.
252   ///
253   /// \param PatternRange The source range that covers the entire pattern of
254   /// the pack expansion.
255   ///
256   /// \param Unexpanded The set of unexpanded parameter packs within the
257   /// pattern.
258   ///
259   /// \param ShouldExpand Will be set to \c true if the transformer should
260   /// expand the corresponding pack expansions into separate arguments. When
261   /// set, \c NumExpansions must also be set.
262   ///
263   /// \param RetainExpansion Whether the caller should add an unexpanded
264   /// pack expansion after all of the expanded arguments. This is used
265   /// when extending explicitly-specified template argument packs per
266   /// C++0x [temp.arg.explicit]p9.
267   ///
268   /// \param NumExpansions The number of separate arguments that will be in
269   /// the expanded form of the corresponding pack expansion. This is both an
270   /// input and an output parameter, which can be set by the caller if the
271   /// number of expansions is known a priori (e.g., due to a prior substitution)
272   /// and will be set by the callee when the number of expansions is known.
273   /// The callee must set this value when \c ShouldExpand is \c true; it may
274   /// set this value in other cases.
275   ///
276   /// \returns true if an error occurred (e.g., because the parameter packs
277   /// are to be instantiated with arguments of different lengths), false
278   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
279   /// must be set.
280   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
281                                SourceRange PatternRange,
282                                ArrayRef<UnexpandedParameterPack> Unexpanded,
283                                bool &ShouldExpand, bool &RetainExpansion,
284                                std::optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Subclasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
640                                          TemplateTypeParmTypeLoc TL,
641                                          bool SuppressObjCLifetime);
642   QualType
643   TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
644                                          SubstTemplateTypeParmPackTypeLoc TL,
645                                          bool SuppressObjCLifetime);
646 
647   template<typename Fn>
648   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
649                                       FunctionProtoTypeLoc TL,
650                                       CXXRecordDecl *ThisContext,
651                                       Qualifiers ThisTypeQuals,
652                                       Fn TransformExceptionSpec);
653 
654   bool TransformExceptionSpec(SourceLocation Loc,
655                               FunctionProtoType::ExceptionSpecInfo &ESI,
656                               SmallVectorImpl<QualType> &Exceptions,
657                               bool &Changed);
658 
659   StmtResult TransformSEHHandler(Stmt *Handler);
660 
661   QualType
662   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
663                                       TemplateSpecializationTypeLoc TL,
664                                       TemplateName Template);
665 
666   QualType
667   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
668                                       DependentTemplateSpecializationTypeLoc TL,
669                                                TemplateName Template,
670                                                CXXScopeSpec &SS);
671 
672   QualType TransformDependentTemplateSpecializationType(
673       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
674       NestedNameSpecifierLoc QualifierLoc);
675 
676   /// Transforms the parameters of a function type into the
677   /// given vectors.
678   ///
679   /// The result vectors should be kept in sync; null entries in the
680   /// variables vector are acceptable.
681   ///
682   /// LastParamTransformed, if non-null, will be set to the index of the last
683   /// parameter on which transfromation was started. In the event of an error,
684   /// this will contain the parameter which failed to instantiate.
685   ///
686   /// Return true on error.
687   bool TransformFunctionTypeParams(
688       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
689       const QualType *ParamTypes,
690       const FunctionProtoType::ExtParameterInfo *ParamInfos,
691       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
692       Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed);
693 
694   bool TransformFunctionTypeParams(
695       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
696       const QualType *ParamTypes,
697       const FunctionProtoType::ExtParameterInfo *ParamInfos,
698       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
699       Sema::ExtParameterInfoBuilder &PInfos) {
700     return getDerived().TransformFunctionTypeParams(
701         Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr);
702   }
703 
704   /// Transforms the parameters of a requires expresison into the given vectors.
705   ///
706   /// The result vectors should be kept in sync; null entries in the
707   /// variables vector are acceptable.
708   ///
709   /// Returns an unset ExprResult on success.  Returns an ExprResult the 'not
710   /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of
711   /// which are cases where transformation shouldn't continue.
712   ExprResult TransformRequiresTypeParams(
713       SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
714       RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
715       SmallVectorImpl<QualType> &PTypes,
716       SmallVectorImpl<ParmVarDecl *> &TransParams,
717       Sema::ExtParameterInfoBuilder &PInfos) {
718     if (getDerived().TransformFunctionTypeParams(
719             KWLoc, Params, /*ParamTypes=*/nullptr,
720             /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos))
721       return ExprError();
722 
723     return ExprResult{};
724   }
725 
726   /// Transforms a single function-type parameter.  Return null
727   /// on error.
728   ///
729   /// \param indexAdjustment - A number to add to the parameter's
730   ///   scope index;  can be negative
731   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
732                                           int indexAdjustment,
733                                           std::optional<unsigned> NumExpansions,
734                                           bool ExpectParameterPack);
735 
736   /// Transform the body of a lambda-expression.
737   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
738   /// Alternative implementation of TransformLambdaBody that skips transforming
739   /// the body.
740   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
741 
742   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
743 
744   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
745   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
746 
747   TemplateParameterList *TransformTemplateParameterList(
748         TemplateParameterList *TPL) {
749     return TPL;
750   }
751 
752   ExprResult TransformAddressOfOperand(Expr *E);
753 
754   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
755                                                 bool IsAddressOfOperand,
756                                                 TypeSourceInfo **RecoveryTSI);
757 
758   ExprResult TransformParenDependentScopeDeclRefExpr(
759       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
760       TypeSourceInfo **RecoveryTSI);
761 
762   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
763 
764 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
765 // amount of stack usage with clang.
766 #define STMT(Node, Parent)                        \
767   LLVM_ATTRIBUTE_NOINLINE \
768   StmtResult Transform##Node(Node *S);
769 #define VALUESTMT(Node, Parent)                   \
770   LLVM_ATTRIBUTE_NOINLINE \
771   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
772 #define EXPR(Node, Parent)                        \
773   LLVM_ATTRIBUTE_NOINLINE \
774   ExprResult Transform##Node(Node *E);
775 #define ABSTRACT_STMT(Stmt)
776 #include "clang/AST/StmtNodes.inc"
777 
778 #define GEN_CLANG_CLAUSE_CLASS
779 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
780   LLVM_ATTRIBUTE_NOINLINE                                                      \
781   OMPClause *Transform##Class(Class *S);
782 #include "llvm/Frontend/OpenMP/OMP.inc"
783 
784   /// Build a new qualified type given its unqualified type and type location.
785   ///
786   /// By default, this routine adds type qualifiers only to types that can
787   /// have qualifiers, and silently suppresses those qualifiers that are not
788   /// permitted. Subclasses may override this routine to provide different
789   /// behavior.
790   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
791 
792   /// Build a new pointer type given its pointee type.
793   ///
794   /// By default, performs semantic analysis when building the pointer type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
797 
798   /// Build a new block pointer type given its pointee type.
799   ///
800   /// By default, performs semantic analysis when building the block pointer
801   /// type. Subclasses may override this routine to provide different behavior.
802   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
803 
804   /// Build a new reference type given the type it references.
805   ///
806   /// By default, performs semantic analysis when building the
807   /// reference type. Subclasses may override this routine to provide
808   /// different behavior.
809   ///
810   /// \param LValue whether the type was written with an lvalue sigil
811   /// or an rvalue sigil.
812   QualType RebuildReferenceType(QualType ReferentType,
813                                 bool LValue,
814                                 SourceLocation Sigil);
815 
816   /// Build a new member pointer type given the pointee type and the
817   /// class type it refers into.
818   ///
819   /// By default, performs semantic analysis when building the member pointer
820   /// type. Subclasses may override this routine to provide different behavior.
821   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
822                                     SourceLocation Sigil);
823 
824   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
825                                     SourceLocation ProtocolLAngleLoc,
826                                     ArrayRef<ObjCProtocolDecl *> Protocols,
827                                     ArrayRef<SourceLocation> ProtocolLocs,
828                                     SourceLocation ProtocolRAngleLoc);
829 
830   /// Build an Objective-C object type.
831   ///
832   /// By default, performs semantic analysis when building the object type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildObjCObjectType(QualType BaseType,
835                                  SourceLocation Loc,
836                                  SourceLocation TypeArgsLAngleLoc,
837                                  ArrayRef<TypeSourceInfo *> TypeArgs,
838                                  SourceLocation TypeArgsRAngleLoc,
839                                  SourceLocation ProtocolLAngleLoc,
840                                  ArrayRef<ObjCProtocolDecl *> Protocols,
841                                  ArrayRef<SourceLocation> ProtocolLocs,
842                                  SourceLocation ProtocolRAngleLoc);
843 
844   /// Build a new Objective-C object pointer type given the pointee type.
845   ///
846   /// By default, directly builds the pointer type, with no additional semantic
847   /// analysis.
848   QualType RebuildObjCObjectPointerType(QualType PointeeType,
849                                         SourceLocation Star);
850 
851   /// Build a new array type given the element type, size
852   /// modifier, size of the array (if known), size expression, and index type
853   /// qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   /// Also by default, all of the other Rebuild*Array
858   QualType RebuildArrayType(QualType ElementType,
859                             ArrayType::ArraySizeModifier SizeMod,
860                             const llvm::APInt *Size,
861                             Expr *SizeExpr,
862                             unsigned IndexTypeQuals,
863                             SourceRange BracketsRange);
864 
865   /// Build a new constant array type given the element type, size
866   /// modifier, (known) size of the array, and index type qualifiers.
867   ///
868   /// By default, performs semantic analysis when building the array type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildConstantArrayType(QualType ElementType,
871                                     ArrayType::ArraySizeModifier SizeMod,
872                                     const llvm::APInt &Size,
873                                     Expr *SizeExpr,
874                                     unsigned IndexTypeQuals,
875                                     SourceRange BracketsRange);
876 
877   /// Build a new incomplete array type given the element type, size
878   /// modifier, and index type qualifiers.
879   ///
880   /// By default, performs semantic analysis when building the array type.
881   /// Subclasses may override this routine to provide different behavior.
882   QualType RebuildIncompleteArrayType(QualType ElementType,
883                                       ArrayType::ArraySizeModifier SizeMod,
884                                       unsigned IndexTypeQuals,
885                                       SourceRange BracketsRange);
886 
887   /// Build a new variable-length array type given the element type,
888   /// size modifier, size expression, 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 RebuildVariableArrayType(QualType ElementType,
893                                     ArrayType::ArraySizeModifier SizeMod,
894                                     Expr *SizeExpr,
895                                     unsigned IndexTypeQuals,
896                                     SourceRange BracketsRange);
897 
898   /// Build a new dependent-sized array type given the element type,
899   /// size modifier, size expression, and index type qualifiers.
900   ///
901   /// By default, performs semantic analysis when building the array type.
902   /// Subclasses may override this routine to provide different behavior.
903   QualType RebuildDependentSizedArrayType(QualType ElementType,
904                                           ArrayType::ArraySizeModifier SizeMod,
905                                           Expr *SizeExpr,
906                                           unsigned IndexTypeQuals,
907                                           SourceRange BracketsRange);
908 
909   /// Build a new vector type given the element type and
910   /// number of elements.
911   ///
912   /// By default, performs semantic analysis when building the vector type.
913   /// Subclasses may override this routine to provide different behavior.
914   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
915                              VectorType::VectorKind VecKind);
916 
917   /// Build a new potentially dependently-sized extended vector type
918   /// given the element type and number of elements.
919   ///
920   /// By default, performs semantic analysis when building the vector type.
921   /// Subclasses may override this routine to provide different behavior.
922   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
923                                            SourceLocation AttributeLoc,
924                                            VectorType::VectorKind);
925 
926   /// Build a new extended vector type given the element type and
927   /// number of elements.
928   ///
929   /// By default, performs semantic analysis when building the vector type.
930   /// Subclasses may override this routine to provide different behavior.
931   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
932                                 SourceLocation AttributeLoc);
933 
934   /// Build a new potentially dependently-sized extended vector type
935   /// given the element type and number of elements.
936   ///
937   /// By default, performs semantic analysis when building the vector type.
938   /// Subclasses may override this routine to provide different behavior.
939   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
940                                               Expr *SizeExpr,
941                                               SourceLocation AttributeLoc);
942 
943   /// Build a new matrix type given the element type and dimensions.
944   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
945                                      unsigned NumColumns);
946 
947   /// Build a new matrix type given the type and dependently-defined
948   /// dimensions.
949   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
950                                            Expr *ColumnExpr,
951                                            SourceLocation AttributeLoc);
952 
953   /// Build a new DependentAddressSpaceType or return the pointee
954   /// type variable with the correct address space (retrieved from
955   /// AddrSpaceExpr) applied to it. The former will be returned in cases
956   /// where the address space remains dependent.
957   ///
958   /// By default, performs semantic analysis when building the type with address
959   /// space applied. Subclasses may override this routine to provide different
960   /// behavior.
961   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
962                                             Expr *AddrSpaceExpr,
963                                             SourceLocation AttributeLoc);
964 
965   /// Build a new function type.
966   ///
967   /// By default, performs semantic analysis when building the function type.
968   /// Subclasses may override this routine to provide different behavior.
969   QualType RebuildFunctionProtoType(QualType T,
970                                     MutableArrayRef<QualType> ParamTypes,
971                                     const FunctionProtoType::ExtProtoInfo &EPI);
972 
973   /// Build a new unprototyped function type.
974   QualType RebuildFunctionNoProtoType(QualType ResultType);
975 
976   /// Rebuild an unresolved typename type, given the decl that
977   /// the UnresolvedUsingTypenameDecl was transformed to.
978   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
979 
980   /// Build a new type found via an alias.
981   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
982     return SemaRef.Context.getUsingType(Found, Underlying);
983   }
984 
985   /// Build a new typedef type.
986   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
987     return SemaRef.Context.getTypeDeclType(Typedef);
988   }
989 
990   /// Build a new MacroDefined type.
991   QualType RebuildMacroQualifiedType(QualType T,
992                                      const IdentifierInfo *MacroII) {
993     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
994   }
995 
996   /// Build a new class/struct/union type.
997   QualType RebuildRecordType(RecordDecl *Record) {
998     return SemaRef.Context.getTypeDeclType(Record);
999   }
1000 
1001   /// Build a new Enum type.
1002   QualType RebuildEnumType(EnumDecl *Enum) {
1003     return SemaRef.Context.getTypeDeclType(Enum);
1004   }
1005 
1006   /// Build a new typeof(expr) type.
1007   ///
1008   /// By default, performs semantic analysis when building the typeof type.
1009   /// Subclasses may override this routine to provide different behavior.
1010   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc,
1011                                  TypeOfKind Kind);
1012 
1013   /// Build a new typeof(type) type.
1014   ///
1015   /// By default, builds a new TypeOfType with the given underlying type.
1016   QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind);
1017 
1018   /// Build a new unary transform type.
1019   QualType RebuildUnaryTransformType(QualType BaseType,
1020                                      UnaryTransformType::UTTKind UKind,
1021                                      SourceLocation Loc);
1022 
1023   /// Build a new C++11 decltype type.
1024   ///
1025   /// By default, performs semantic analysis when building the decltype type.
1026   /// Subclasses may override this routine to provide different behavior.
1027   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
1028 
1029   /// Build a new C++11 auto type.
1030   ///
1031   /// By default, builds a new AutoType with the given deduced type.
1032   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
1033                            ConceptDecl *TypeConstraintConcept,
1034                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
1035     // Note, IsDependent is always false here: we implicitly convert an 'auto'
1036     // which has been deduced to a dependent type into an undeduced 'auto', so
1037     // that we'll retry deduction after the transformation.
1038     return SemaRef.Context.getAutoType(Deduced, Keyword,
1039                                        /*IsDependent*/ false, /*IsPack=*/false,
1040                                        TypeConstraintConcept,
1041                                        TypeConstraintArgs);
1042   }
1043 
1044   /// By default, builds a new DeducedTemplateSpecializationType with the given
1045   /// deduced type.
1046   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1047       QualType Deduced) {
1048     return SemaRef.Context.getDeducedTemplateSpecializationType(
1049         Template, Deduced, /*IsDependent*/ false);
1050   }
1051 
1052   /// Build a new template specialization type.
1053   ///
1054   /// By default, performs semantic analysis when building the template
1055   /// specialization type. Subclasses may override this routine to provide
1056   /// different behavior.
1057   QualType RebuildTemplateSpecializationType(TemplateName Template,
1058                                              SourceLocation TemplateLoc,
1059                                              TemplateArgumentListInfo &Args);
1060 
1061   /// Build a new parenthesized type.
1062   ///
1063   /// By default, builds a new ParenType type from the inner type.
1064   /// Subclasses may override this routine to provide different behavior.
1065   QualType RebuildParenType(QualType InnerType) {
1066     return SemaRef.BuildParenType(InnerType);
1067   }
1068 
1069   /// Build a new qualified name type.
1070   ///
1071   /// By default, builds a new ElaboratedType type from the keyword,
1072   /// the nested-name-specifier and the named type.
1073   /// Subclasses may override this routine to provide different behavior.
1074   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1075                                  ElaboratedTypeKeyword Keyword,
1076                                  NestedNameSpecifierLoc QualifierLoc,
1077                                  QualType Named) {
1078     return SemaRef.Context.getElaboratedType(Keyword,
1079                                          QualifierLoc.getNestedNameSpecifier(),
1080                                              Named);
1081   }
1082 
1083   /// Build a new typename type that refers to a template-id.
1084   ///
1085   /// By default, builds a new DependentNameType type from the
1086   /// nested-name-specifier and the given type. Subclasses may override
1087   /// this routine to provide different behavior.
1088   QualType RebuildDependentTemplateSpecializationType(
1089                                           ElaboratedTypeKeyword Keyword,
1090                                           NestedNameSpecifierLoc QualifierLoc,
1091                                           SourceLocation TemplateKWLoc,
1092                                           const IdentifierInfo *Name,
1093                                           SourceLocation NameLoc,
1094                                           TemplateArgumentListInfo &Args,
1095                                           bool AllowInjectedClassName) {
1096     // Rebuild the template name.
1097     // TODO: avoid TemplateName abstraction
1098     CXXScopeSpec SS;
1099     SS.Adopt(QualifierLoc);
1100     TemplateName InstName = getDerived().RebuildTemplateName(
1101         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1102         AllowInjectedClassName);
1103 
1104     if (InstName.isNull())
1105       return QualType();
1106 
1107     // If it's still dependent, make a dependent specialization.
1108     if (InstName.getAsDependentTemplateName())
1109       return SemaRef.Context.getDependentTemplateSpecializationType(
1110           Keyword, QualifierLoc.getNestedNameSpecifier(), Name,
1111           Args.arguments());
1112 
1113     // Otherwise, make an elaborated type wrapping a non-dependent
1114     // specialization.
1115     QualType T =
1116         getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1117     if (T.isNull())
1118       return QualType();
1119     return SemaRef.Context.getElaboratedType(
1120         Keyword, QualifierLoc.getNestedNameSpecifier(), T);
1121   }
1122 
1123   /// Build a new typename type that refers to an identifier.
1124   ///
1125   /// By default, performs semantic analysis when building the typename type
1126   /// (or elaborated type). Subclasses may override this routine to provide
1127   /// different behavior.
1128   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1129                                     SourceLocation KeywordLoc,
1130                                     NestedNameSpecifierLoc QualifierLoc,
1131                                     const IdentifierInfo *Id,
1132                                     SourceLocation IdLoc,
1133                                     bool DeducedTSTContext) {
1134     CXXScopeSpec SS;
1135     SS.Adopt(QualifierLoc);
1136 
1137     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1138       // If the name is still dependent, just build a new dependent name type.
1139       if (!SemaRef.computeDeclContext(SS))
1140         return SemaRef.Context.getDependentNameType(Keyword,
1141                                           QualifierLoc.getNestedNameSpecifier(),
1142                                                     Id);
1143     }
1144 
1145     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1146       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1147                                        *Id, IdLoc, DeducedTSTContext);
1148     }
1149 
1150     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1151 
1152     // We had a dependent elaborated-type-specifier that has been transformed
1153     // into a non-dependent elaborated-type-specifier. Find the tag we're
1154     // referring to.
1155     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1156     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1157     if (!DC)
1158       return QualType();
1159 
1160     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1161       return QualType();
1162 
1163     TagDecl *Tag = nullptr;
1164     SemaRef.LookupQualifiedName(Result, DC);
1165     switch (Result.getResultKind()) {
1166       case LookupResult::NotFound:
1167       case LookupResult::NotFoundInCurrentInstantiation:
1168         break;
1169 
1170       case LookupResult::Found:
1171         Tag = Result.getAsSingle<TagDecl>();
1172         break;
1173 
1174       case LookupResult::FoundOverloaded:
1175       case LookupResult::FoundUnresolvedValue:
1176         llvm_unreachable("Tag lookup cannot find non-tags");
1177 
1178       case LookupResult::Ambiguous:
1179         // Let the LookupResult structure handle ambiguities.
1180         return QualType();
1181     }
1182 
1183     if (!Tag) {
1184       // Check where the name exists but isn't a tag type and use that to emit
1185       // better diagnostics.
1186       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1187       SemaRef.LookupQualifiedName(Result, DC);
1188       switch (Result.getResultKind()) {
1189         case LookupResult::Found:
1190         case LookupResult::FoundOverloaded:
1191         case LookupResult::FoundUnresolvedValue: {
1192           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1193           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1194           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1195                                                                << NTK << Kind;
1196           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1197           break;
1198         }
1199         default:
1200           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1201               << Kind << Id << DC << QualifierLoc.getSourceRange();
1202           break;
1203       }
1204       return QualType();
1205     }
1206 
1207     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1208                                               IdLoc, Id)) {
1209       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1210       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1211       return QualType();
1212     }
1213 
1214     // Build the elaborated-type-specifier type.
1215     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1216     return SemaRef.Context.getElaboratedType(Keyword,
1217                                          QualifierLoc.getNestedNameSpecifier(),
1218                                              T);
1219   }
1220 
1221   /// Build a new pack expansion type.
1222   ///
1223   /// By default, builds a new PackExpansionType type from the given pattern.
1224   /// Subclasses may override this routine to provide different behavior.
1225   QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange,
1226                                     SourceLocation EllipsisLoc,
1227                                     std::optional<unsigned> NumExpansions) {
1228     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1229                                         NumExpansions);
1230   }
1231 
1232   /// Build a new atomic type given its value type.
1233   ///
1234   /// By default, performs semantic analysis when building the atomic type.
1235   /// Subclasses may override this routine to provide different behavior.
1236   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1237 
1238   /// Build a new pipe type given its value type.
1239   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1240                            bool isReadPipe);
1241 
1242   /// Build a bit-precise int given its value type.
1243   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1244                              SourceLocation Loc);
1245 
1246   /// Build a dependent bit-precise int given its value type.
1247   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1248                                       SourceLocation Loc);
1249 
1250   /// Build a new template name given a nested name specifier, a flag
1251   /// indicating whether the "template" keyword was provided, and the template
1252   /// that the template name refers to.
1253   ///
1254   /// By default, builds the new template name directly. Subclasses may override
1255   /// this routine to provide different behavior.
1256   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1257                                    bool TemplateKW,
1258                                    TemplateDecl *Template);
1259 
1260   /// Build a new template name given a nested name specifier and the
1261   /// name that is referred to as a template.
1262   ///
1263   /// By default, performs semantic analysis to determine whether the name can
1264   /// be resolved to a specific template, then builds the appropriate kind of
1265   /// template name. Subclasses may override this routine to provide different
1266   /// behavior.
1267   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1268                                    SourceLocation TemplateKWLoc,
1269                                    const IdentifierInfo &Name,
1270                                    SourceLocation NameLoc, QualType ObjectType,
1271                                    NamedDecl *FirstQualifierInScope,
1272                                    bool AllowInjectedClassName);
1273 
1274   /// Build a new template name given a nested name specifier and the
1275   /// overloaded operator name that is referred to as a template.
1276   ///
1277   /// By default, performs semantic analysis to determine whether the name can
1278   /// be resolved to a specific template, then builds the appropriate kind of
1279   /// template name. Subclasses may override this routine to provide different
1280   /// behavior.
1281   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1282                                    SourceLocation TemplateKWLoc,
1283                                    OverloadedOperatorKind Operator,
1284                                    SourceLocation NameLoc, QualType ObjectType,
1285                                    bool AllowInjectedClassName);
1286 
1287   /// Build a new template name given a template template parameter pack
1288   /// and the
1289   ///
1290   /// By default, performs semantic analysis to determine whether the name can
1291   /// be resolved to a specific template, then builds the appropriate kind of
1292   /// template name. Subclasses may override this routine to provide different
1293   /// behavior.
1294   TemplateName RebuildTemplateName(const TemplateArgument &ArgPack,
1295                                    Decl *AssociatedDecl, unsigned Index,
1296                                    bool Final) {
1297     return getSema().Context.getSubstTemplateTemplateParmPack(
1298         ArgPack, AssociatedDecl, Index, Final);
1299   }
1300 
1301   /// Build a new compound statement.
1302   ///
1303   /// By default, performs semantic analysis to build the new statement.
1304   /// Subclasses may override this routine to provide different behavior.
1305   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1306                                        MultiStmtArg Statements,
1307                                        SourceLocation RBraceLoc,
1308                                        bool IsStmtExpr) {
1309     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1310                                        IsStmtExpr);
1311   }
1312 
1313   /// Build a new case statement.
1314   ///
1315   /// By default, performs semantic analysis to build the new statement.
1316   /// Subclasses may override this routine to provide different behavior.
1317   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1318                                    Expr *LHS,
1319                                    SourceLocation EllipsisLoc,
1320                                    Expr *RHS,
1321                                    SourceLocation ColonLoc) {
1322     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1323                                    ColonLoc);
1324   }
1325 
1326   /// Attach the body to a new case statement.
1327   ///
1328   /// By default, performs semantic analysis to build the new statement.
1329   /// Subclasses may override this routine to provide different behavior.
1330   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1331     getSema().ActOnCaseStmtBody(S, Body);
1332     return S;
1333   }
1334 
1335   /// Build a new default 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 RebuildDefaultStmt(SourceLocation DefaultLoc,
1340                                       SourceLocation ColonLoc,
1341                                       Stmt *SubStmt) {
1342     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1343                                       /*CurScope=*/nullptr);
1344   }
1345 
1346   /// Build a new label statement.
1347   ///
1348   /// By default, performs semantic analysis to build the new statement.
1349   /// Subclasses may override this routine to provide different behavior.
1350   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1351                               SourceLocation ColonLoc, Stmt *SubStmt) {
1352     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1353   }
1354 
1355   /// Build a new attributed statement.
1356   ///
1357   /// By default, performs semantic analysis to build the new statement.
1358   /// Subclasses may override this routine to provide different behavior.
1359   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1360                                    ArrayRef<const Attr *> Attrs,
1361                                    Stmt *SubStmt) {
1362     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1363   }
1364 
1365   /// Build a new "if" statement.
1366   ///
1367   /// By default, performs semantic analysis to build the new statement.
1368   /// Subclasses may override this routine to provide different behavior.
1369   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1370                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1371                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1372                            SourceLocation ElseLoc, Stmt *Else) {
1373     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1374                                  Then, ElseLoc, Else);
1375   }
1376 
1377   /// Start building a new switch 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 RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1382                                     SourceLocation LParenLoc, Stmt *Init,
1383                                     Sema::ConditionResult Cond,
1384                                     SourceLocation RParenLoc) {
1385     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1386                                             RParenLoc);
1387   }
1388 
1389   /// Attach the body to the switch statement.
1390   ///
1391   /// By default, performs semantic analysis to build the new statement.
1392   /// Subclasses may override this routine to provide different behavior.
1393   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1394                                    Stmt *Switch, Stmt *Body) {
1395     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1396   }
1397 
1398   /// Build a new while statement.
1399   ///
1400   /// By default, performs semantic analysis to build the new statement.
1401   /// Subclasses may override this routine to provide different behavior.
1402   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1403                               Sema::ConditionResult Cond,
1404                               SourceLocation RParenLoc, Stmt *Body) {
1405     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1406   }
1407 
1408   /// Build a new do-while statement.
1409   ///
1410   /// By default, performs semantic analysis to build the new statement.
1411   /// Subclasses may override this routine to provide different behavior.
1412   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1413                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1414                            Expr *Cond, SourceLocation RParenLoc) {
1415     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1416                                  Cond, RParenLoc);
1417   }
1418 
1419   /// Build a new for statement.
1420   ///
1421   /// By default, performs semantic analysis to build the new statement.
1422   /// Subclasses may override this routine to provide different behavior.
1423   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1424                             Stmt *Init, Sema::ConditionResult Cond,
1425                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1426                             Stmt *Body) {
1427     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1428                                   Inc, RParenLoc, Body);
1429   }
1430 
1431   /// Build a new goto statement.
1432   ///
1433   /// By default, performs semantic analysis to build the new statement.
1434   /// Subclasses may override this routine to provide different behavior.
1435   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1436                              LabelDecl *Label) {
1437     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1438   }
1439 
1440   /// Build a new indirect goto statement.
1441   ///
1442   /// By default, performs semantic analysis to build the new statement.
1443   /// Subclasses may override this routine to provide different behavior.
1444   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1445                                      SourceLocation StarLoc,
1446                                      Expr *Target) {
1447     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1448   }
1449 
1450   /// Build a new return statement.
1451   ///
1452   /// By default, performs semantic analysis to build the new statement.
1453   /// Subclasses may override this routine to provide different behavior.
1454   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1455     return getSema().BuildReturnStmt(ReturnLoc, Result);
1456   }
1457 
1458   /// Build a new declaration statement.
1459   ///
1460   /// By default, performs semantic analysis to build the new statement.
1461   /// Subclasses may override this routine to provide different behavior.
1462   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1463                              SourceLocation StartLoc, SourceLocation EndLoc) {
1464     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1465     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1466   }
1467 
1468   /// Build a new inline asm statement.
1469   ///
1470   /// By default, performs semantic analysis to build the new statement.
1471   /// Subclasses may override this routine to provide different behavior.
1472   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1473                                bool IsVolatile, unsigned NumOutputs,
1474                                unsigned NumInputs, IdentifierInfo **Names,
1475                                MultiExprArg Constraints, MultiExprArg Exprs,
1476                                Expr *AsmString, MultiExprArg Clobbers,
1477                                unsigned NumLabels,
1478                                SourceLocation RParenLoc) {
1479     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1480                                      NumInputs, Names, Constraints, Exprs,
1481                                      AsmString, Clobbers, NumLabels, RParenLoc);
1482   }
1483 
1484   /// Build a new MS style inline asm statement.
1485   ///
1486   /// By default, performs semantic analysis to build the new statement.
1487   /// Subclasses may override this routine to provide different behavior.
1488   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1489                               ArrayRef<Token> AsmToks,
1490                               StringRef AsmString,
1491                               unsigned NumOutputs, unsigned NumInputs,
1492                               ArrayRef<StringRef> Constraints,
1493                               ArrayRef<StringRef> Clobbers,
1494                               ArrayRef<Expr*> Exprs,
1495                               SourceLocation EndLoc) {
1496     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1497                                     NumOutputs, NumInputs,
1498                                     Constraints, Clobbers, Exprs, EndLoc);
1499   }
1500 
1501   /// Build a new co_return statement.
1502   ///
1503   /// By default, performs semantic analysis to build the new statement.
1504   /// Subclasses may override this routine to provide different behavior.
1505   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1506                                  bool IsImplicit) {
1507     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1508   }
1509 
1510   /// Build a new co_await expression.
1511   ///
1512   /// By default, performs semantic analysis to build the new expression.
1513   /// Subclasses may override this routine to provide different behavior.
1514   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand,
1515                                 UnresolvedLookupExpr *OpCoawaitLookup,
1516                                 bool IsImplicit) {
1517     // This function rebuilds a coawait-expr given its operator.
1518     // For an explicit coawait-expr, the rebuild involves the full set
1519     // of transformations performed by BuildUnresolvedCoawaitExpr(),
1520     // including calling await_transform().
1521     // For an implicit coawait-expr, we need to rebuild the "operator
1522     // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr().
1523     // This mirrors how the implicit CoawaitExpr is originally created
1524     // in Sema::ActOnCoroutineBodyStart().
1525     if (IsImplicit) {
1526       ExprResult Suspend = getSema().BuildOperatorCoawaitCall(
1527           CoawaitLoc, Operand, OpCoawaitLookup);
1528       if (Suspend.isInvalid())
1529         return ExprError();
1530       return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand,
1531                                                 Suspend.get(), true);
1532     }
1533 
1534     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand,
1535                                                 OpCoawaitLookup);
1536   }
1537 
1538   /// Build a new co_await expression.
1539   ///
1540   /// By default, performs semantic analysis to build the new expression.
1541   /// Subclasses may override this routine to provide different behavior.
1542   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1543                                          Expr *Result,
1544                                          UnresolvedLookupExpr *Lookup) {
1545     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1546   }
1547 
1548   /// Build a new co_yield expression.
1549   ///
1550   /// By default, performs semantic analysis to build the new expression.
1551   /// Subclasses may override this routine to provide different behavior.
1552   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1553     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1554   }
1555 
1556   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1557     return getSema().BuildCoroutineBodyStmt(Args);
1558   }
1559 
1560   /// Build a new Objective-C \@try statement.
1561   ///
1562   /// By default, performs semantic analysis to build the new statement.
1563   /// Subclasses may override this routine to provide different behavior.
1564   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1565                                         Stmt *TryBody,
1566                                         MultiStmtArg CatchStmts,
1567                                         Stmt *Finally) {
1568     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1569                                         Finally);
1570   }
1571 
1572   /// Rebuild an Objective-C exception declaration.
1573   ///
1574   /// By default, performs semantic analysis to build the new declaration.
1575   /// Subclasses may override this routine to provide different behavior.
1576   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1577                                     TypeSourceInfo *TInfo, QualType T) {
1578     return getSema().BuildObjCExceptionDecl(TInfo, T,
1579                                             ExceptionDecl->getInnerLocStart(),
1580                                             ExceptionDecl->getLocation(),
1581                                             ExceptionDecl->getIdentifier());
1582   }
1583 
1584   /// Build a new Objective-C \@catch statement.
1585   ///
1586   /// By default, performs semantic analysis to build the new statement.
1587   /// Subclasses may override this routine to provide different behavior.
1588   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1589                                           SourceLocation RParenLoc,
1590                                           VarDecl *Var,
1591                                           Stmt *Body) {
1592     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1593                                           Var, Body);
1594   }
1595 
1596   /// Build a new Objective-C \@finally statement.
1597   ///
1598   /// By default, performs semantic analysis to build the new statement.
1599   /// Subclasses may override this routine to provide different behavior.
1600   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1601                                             Stmt *Body) {
1602     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1603   }
1604 
1605   /// Build a new Objective-C \@throw statement.
1606   ///
1607   /// By default, performs semantic analysis to build the new statement.
1608   /// Subclasses may override this routine to provide different behavior.
1609   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1610                                           Expr *Operand) {
1611     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1612   }
1613 
1614   /// Build a new OpenMP Canonical loop.
1615   ///
1616   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1617   /// OMPCanonicalLoop.
1618   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1619     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1620   }
1621 
1622   /// Build a new OpenMP executable directive.
1623   ///
1624   /// By default, performs semantic analysis to build the new statement.
1625   /// Subclasses may override this routine to provide different behavior.
1626   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1627                                            DeclarationNameInfo DirName,
1628                                            OpenMPDirectiveKind CancelRegion,
1629                                            ArrayRef<OMPClause *> Clauses,
1630                                            Stmt *AStmt, SourceLocation StartLoc,
1631                                            SourceLocation EndLoc) {
1632     return getSema().ActOnOpenMPExecutableDirective(
1633         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'if' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1641                                 Expr *Condition, SourceLocation StartLoc,
1642                                 SourceLocation LParenLoc,
1643                                 SourceLocation NameModifierLoc,
1644                                 SourceLocation ColonLoc,
1645                                 SourceLocation EndLoc) {
1646     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1647                                          LParenLoc, NameModifierLoc, ColonLoc,
1648                                          EndLoc);
1649   }
1650 
1651   /// Build a new OpenMP 'final' clause.
1652   ///
1653   /// By default, performs semantic analysis to build the new OpenMP clause.
1654   /// Subclasses may override this routine to provide different behavior.
1655   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1656                                    SourceLocation LParenLoc,
1657                                    SourceLocation EndLoc) {
1658     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1659                                             EndLoc);
1660   }
1661 
1662   /// Build a new OpenMP 'num_threads' clause.
1663   ///
1664   /// By default, performs semantic analysis to build the new OpenMP clause.
1665   /// Subclasses may override this routine to provide different behavior.
1666   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1667                                         SourceLocation StartLoc,
1668                                         SourceLocation LParenLoc,
1669                                         SourceLocation EndLoc) {
1670     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1671                                                  LParenLoc, EndLoc);
1672   }
1673 
1674   /// Build a new OpenMP 'safelen' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
1678   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1679                                      SourceLocation LParenLoc,
1680                                      SourceLocation EndLoc) {
1681     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1682   }
1683 
1684   /// Build a new OpenMP 'simdlen' 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 *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1689                                      SourceLocation LParenLoc,
1690                                      SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1692   }
1693 
1694   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1695                                    SourceLocation StartLoc,
1696                                    SourceLocation LParenLoc,
1697                                    SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'full' clause.
1702   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1703                                   SourceLocation EndLoc) {
1704     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1705   }
1706 
1707   /// Build a new OpenMP 'partial' clause.
1708   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1709                                      SourceLocation LParenLoc,
1710                                      SourceLocation EndLoc) {
1711     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1712                                               EndLoc);
1713   }
1714 
1715   /// Build a new OpenMP 'allocator' clause.
1716   ///
1717   /// By default, performs semantic analysis to build the new OpenMP clause.
1718   /// Subclasses may override this routine to provide different behavior.
1719   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1720                                        SourceLocation LParenLoc,
1721                                        SourceLocation EndLoc) {
1722     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1723   }
1724 
1725   /// Build a new OpenMP 'collapse' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new OpenMP clause.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1730                                       SourceLocation LParenLoc,
1731                                       SourceLocation EndLoc) {
1732     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1733                                                EndLoc);
1734   }
1735 
1736   /// Build a new OpenMP 'default' clause.
1737   ///
1738   /// By default, performs semantic analysis to build the new OpenMP clause.
1739   /// Subclasses may override this routine to provide different behavior.
1740   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1741                                      SourceLocation StartLoc,
1742                                      SourceLocation LParenLoc,
1743                                      SourceLocation EndLoc) {
1744     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1745                                               StartLoc, LParenLoc, EndLoc);
1746   }
1747 
1748   /// Build a new OpenMP 'proc_bind' clause.
1749   ///
1750   /// By default, performs semantic analysis to build the new OpenMP clause.
1751   /// Subclasses may override this routine to provide different behavior.
1752   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1753                                       SourceLocation KindKwLoc,
1754                                       SourceLocation StartLoc,
1755                                       SourceLocation LParenLoc,
1756                                       SourceLocation EndLoc) {
1757     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1758                                                StartLoc, LParenLoc, EndLoc);
1759   }
1760 
1761   /// Build a new OpenMP 'schedule' clause.
1762   ///
1763   /// By default, performs semantic analysis to build the new OpenMP clause.
1764   /// Subclasses may override this routine to provide different behavior.
1765   OMPClause *RebuildOMPScheduleClause(
1766       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1767       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1768       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1769       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1770     return getSema().ActOnOpenMPScheduleClause(
1771         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1772         CommaLoc, EndLoc);
1773   }
1774 
1775   /// Build a new OpenMP 'ordered' clause.
1776   ///
1777   /// By default, performs semantic analysis to build the new OpenMP clause.
1778   /// Subclasses may override this routine to provide different behavior.
1779   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1780                                      SourceLocation EndLoc,
1781                                      SourceLocation LParenLoc, Expr *Num) {
1782     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1783   }
1784 
1785   /// Build a new OpenMP 'private' clause.
1786   ///
1787   /// By default, performs semantic analysis to build the new OpenMP clause.
1788   /// Subclasses may override this routine to provide different behavior.
1789   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1790                                      SourceLocation StartLoc,
1791                                      SourceLocation LParenLoc,
1792                                      SourceLocation EndLoc) {
1793     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1794                                               EndLoc);
1795   }
1796 
1797   /// Build a new OpenMP 'firstprivate' 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 *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1802                                           SourceLocation StartLoc,
1803                                           SourceLocation LParenLoc,
1804                                           SourceLocation EndLoc) {
1805     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1806                                                    EndLoc);
1807   }
1808 
1809   /// Build a new OpenMP 'lastprivate' clause.
1810   ///
1811   /// By default, performs semantic analysis to build the new OpenMP clause.
1812   /// Subclasses may override this routine to provide different behavior.
1813   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1814                                          OpenMPLastprivateModifier LPKind,
1815                                          SourceLocation LPKindLoc,
1816                                          SourceLocation ColonLoc,
1817                                          SourceLocation StartLoc,
1818                                          SourceLocation LParenLoc,
1819                                          SourceLocation EndLoc) {
1820     return getSema().ActOnOpenMPLastprivateClause(
1821         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1822   }
1823 
1824   /// Build a new OpenMP 'shared' clause.
1825   ///
1826   /// By default, performs semantic analysis to build the new OpenMP clause.
1827   /// Subclasses may override this routine to provide different behavior.
1828   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1829                                     SourceLocation StartLoc,
1830                                     SourceLocation LParenLoc,
1831                                     SourceLocation EndLoc) {
1832     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1833                                              EndLoc);
1834   }
1835 
1836   /// Build a new OpenMP 'reduction' clause.
1837   ///
1838   /// By default, performs semantic analysis to build the new statement.
1839   /// Subclasses may override this routine to provide different behavior.
1840   OMPClause *RebuildOMPReductionClause(
1841       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1842       SourceLocation StartLoc, SourceLocation LParenLoc,
1843       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1844       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1845       const DeclarationNameInfo &ReductionId,
1846       ArrayRef<Expr *> UnresolvedReductions) {
1847     return getSema().ActOnOpenMPReductionClause(
1848         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1849         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1850   }
1851 
1852   /// Build a new OpenMP 'task_reduction' clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new statement.
1855   /// Subclasses may override this routine to provide different behavior.
1856   OMPClause *RebuildOMPTaskReductionClause(
1857       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1858       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1859       CXXScopeSpec &ReductionIdScopeSpec,
1860       const DeclarationNameInfo &ReductionId,
1861       ArrayRef<Expr *> UnresolvedReductions) {
1862     return getSema().ActOnOpenMPTaskReductionClause(
1863         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1864         ReductionId, UnresolvedReductions);
1865   }
1866 
1867   /// Build a new OpenMP 'in_reduction' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new statement.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *
1872   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1873                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1874                               SourceLocation EndLoc,
1875                               CXXScopeSpec &ReductionIdScopeSpec,
1876                               const DeclarationNameInfo &ReductionId,
1877                               ArrayRef<Expr *> UnresolvedReductions) {
1878     return getSema().ActOnOpenMPInReductionClause(
1879         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1880         ReductionId, UnresolvedReductions);
1881   }
1882 
1883   /// Build a new OpenMP 'linear' clause.
1884   ///
1885   /// By default, performs semantic analysis to build the new OpenMP clause.
1886   /// Subclasses may override this routine to provide different behavior.
1887   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1888                                     SourceLocation StartLoc,
1889                                     SourceLocation LParenLoc,
1890                                     OpenMPLinearClauseKind Modifier,
1891                                     SourceLocation ModifierLoc,
1892                                     SourceLocation ColonLoc,
1893                                     SourceLocation EndLoc) {
1894     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1895                                              Modifier, ModifierLoc, ColonLoc,
1896                                              EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'aligned' clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1904                                      SourceLocation StartLoc,
1905                                      SourceLocation LParenLoc,
1906                                      SourceLocation ColonLoc,
1907                                      SourceLocation EndLoc) {
1908     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1909                                               LParenLoc, ColonLoc, EndLoc);
1910   }
1911 
1912   /// Build a new OpenMP 'copyin' clause.
1913   ///
1914   /// By default, performs semantic analysis to build the new OpenMP clause.
1915   /// Subclasses may override this routine to provide different behavior.
1916   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1917                                     SourceLocation StartLoc,
1918                                     SourceLocation LParenLoc,
1919                                     SourceLocation EndLoc) {
1920     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1921                                              EndLoc);
1922   }
1923 
1924   /// Build a new OpenMP 'copyprivate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1929                                          SourceLocation StartLoc,
1930                                          SourceLocation LParenLoc,
1931                                          SourceLocation EndLoc) {
1932     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1933                                                   EndLoc);
1934   }
1935 
1936   /// Build a new OpenMP 'flush' pseudo clause.
1937   ///
1938   /// By default, performs semantic analysis to build the new OpenMP clause.
1939   /// Subclasses may override this routine to provide different behavior.
1940   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1941                                    SourceLocation StartLoc,
1942                                    SourceLocation LParenLoc,
1943                                    SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1945                                             EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'depobj' pseudo clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new OpenMP clause.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1953                                     SourceLocation LParenLoc,
1954                                     SourceLocation EndLoc) {
1955     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1956                                              EndLoc);
1957   }
1958 
1959   /// Build a new OpenMP 'depend' pseudo clause.
1960   ///
1961   /// By default, performs semantic analysis to build the new OpenMP clause.
1962   /// Subclasses may override this routine to provide different behavior.
1963   OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data,
1964                                     Expr *DepModifier, ArrayRef<Expr *> VarList,
1965                                     SourceLocation StartLoc,
1966                                     SourceLocation LParenLoc,
1967                                     SourceLocation EndLoc) {
1968     return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList,
1969                                              StartLoc, LParenLoc, EndLoc);
1970   }
1971 
1972   /// Build a new OpenMP 'device' clause.
1973   ///
1974   /// By default, performs semantic analysis to build the new statement.
1975   /// Subclasses may override this routine to provide different behavior.
1976   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1977                                     Expr *Device, SourceLocation StartLoc,
1978                                     SourceLocation LParenLoc,
1979                                     SourceLocation ModifierLoc,
1980                                     SourceLocation EndLoc) {
1981     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1982                                              LParenLoc, ModifierLoc, EndLoc);
1983   }
1984 
1985   /// Build a new OpenMP 'map' clause.
1986   ///
1987   /// By default, performs semantic analysis to build the new OpenMP clause.
1988   /// Subclasses may override this routine to provide different behavior.
1989   OMPClause *RebuildOMPMapClause(
1990       Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1991       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1992       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1993       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1994       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1995       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1996     return getSema().ActOnOpenMPMapClause(
1997         IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc,
1998         MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc,
1999         ColonLoc, VarList, Locs,
2000         /*NoDiagnose=*/false, UnresolvedMappers);
2001   }
2002 
2003   /// Build a new OpenMP 'allocate' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new OpenMP clause.
2006   /// Subclasses may override this routine to provide different behavior.
2007   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
2008                                       SourceLocation StartLoc,
2009                                       SourceLocation LParenLoc,
2010                                       SourceLocation ColonLoc,
2011                                       SourceLocation EndLoc) {
2012     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
2013                                                LParenLoc, ColonLoc, EndLoc);
2014   }
2015 
2016   /// Build a new OpenMP 'num_teams' clause.
2017   ///
2018   /// By default, performs semantic analysis to build the new statement.
2019   /// Subclasses may override this routine to provide different behavior.
2020   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
2021                                       SourceLocation LParenLoc,
2022                                       SourceLocation EndLoc) {
2023     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
2024                                                EndLoc);
2025   }
2026 
2027   /// Build a new OpenMP 'thread_limit' clause.
2028   ///
2029   /// By default, performs semantic analysis to build the new statement.
2030   /// Subclasses may override this routine to provide different behavior.
2031   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
2032                                          SourceLocation StartLoc,
2033                                          SourceLocation LParenLoc,
2034                                          SourceLocation EndLoc) {
2035     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
2036                                                   LParenLoc, EndLoc);
2037   }
2038 
2039   /// Build a new OpenMP 'priority' clause.
2040   ///
2041   /// By default, performs semantic analysis to build the new statement.
2042   /// Subclasses may override this routine to provide different behavior.
2043   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
2044                                       SourceLocation LParenLoc,
2045                                       SourceLocation EndLoc) {
2046     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
2047                                                EndLoc);
2048   }
2049 
2050   /// Build a new OpenMP 'grainsize' clause.
2051   ///
2052   /// By default, performs semantic analysis to build the new statement.
2053   /// Subclasses may override this routine to provide different behavior.
2054   OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier,
2055                                        Expr *Device, SourceLocation StartLoc,
2056                                        SourceLocation LParenLoc,
2057                                        SourceLocation ModifierLoc,
2058                                        SourceLocation EndLoc) {
2059     return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc,
2060                                                 LParenLoc, ModifierLoc, EndLoc);
2061   }
2062 
2063   /// Build a new OpenMP 'num_tasks' clause.
2064   ///
2065   /// By default, performs semantic analysis to build the new statement.
2066   /// Subclasses may override this routine to provide different behavior.
2067   OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier,
2068                                       Expr *NumTasks, SourceLocation StartLoc,
2069                                       SourceLocation LParenLoc,
2070                                       SourceLocation ModifierLoc,
2071                                       SourceLocation EndLoc) {
2072     return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc,
2073                                                LParenLoc, ModifierLoc, EndLoc);
2074   }
2075 
2076   /// Build a new OpenMP 'hint' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new statement.
2079   /// Subclasses may override this routine to provide different behavior.
2080   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2081                                   SourceLocation LParenLoc,
2082                                   SourceLocation EndLoc) {
2083     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2084   }
2085 
2086   /// Build a new OpenMP 'detach' clause.
2087   ///
2088   /// By default, performs semantic analysis to build the new statement.
2089   /// Subclasses may override this routine to provide different behavior.
2090   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2091                                     SourceLocation LParenLoc,
2092                                     SourceLocation EndLoc) {
2093     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2094   }
2095 
2096   /// Build a new OpenMP 'dist_schedule' clause.
2097   ///
2098   /// By default, performs semantic analysis to build the new OpenMP clause.
2099   /// Subclasses may override this routine to provide different behavior.
2100   OMPClause *
2101   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2102                                Expr *ChunkSize, SourceLocation StartLoc,
2103                                SourceLocation LParenLoc, SourceLocation KindLoc,
2104                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2105     return getSema().ActOnOpenMPDistScheduleClause(
2106         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2107   }
2108 
2109   /// Build a new OpenMP 'to' clause.
2110   ///
2111   /// By default, performs semantic analysis to build the new statement.
2112   /// Subclasses may override this routine to provide different behavior.
2113   OMPClause *
2114   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2115                      ArrayRef<SourceLocation> MotionModifiersLoc,
2116                      CXXScopeSpec &MapperIdScopeSpec,
2117                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2118                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2119                      ArrayRef<Expr *> UnresolvedMappers) {
2120     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2121                                          MapperIdScopeSpec, MapperId, ColonLoc,
2122                                          VarList, Locs, UnresolvedMappers);
2123   }
2124 
2125   /// Build a new OpenMP 'from' clause.
2126   ///
2127   /// By default, performs semantic analysis to build the new statement.
2128   /// Subclasses may override this routine to provide different behavior.
2129   OMPClause *
2130   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2131                        ArrayRef<SourceLocation> MotionModifiersLoc,
2132                        CXXScopeSpec &MapperIdScopeSpec,
2133                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2134                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2135                        ArrayRef<Expr *> UnresolvedMappers) {
2136     return getSema().ActOnOpenMPFromClause(
2137         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2138         ColonLoc, VarList, Locs, UnresolvedMappers);
2139   }
2140 
2141   /// Build a new OpenMP 'use_device_ptr' clause.
2142   ///
2143   /// By default, performs semantic analysis to build the new OpenMP clause.
2144   /// Subclasses may override this routine to provide different behavior.
2145   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2146                                           const OMPVarListLocTy &Locs) {
2147     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2148   }
2149 
2150   /// Build a new OpenMP 'use_device_addr' clause.
2151   ///
2152   /// By default, performs semantic analysis to build the new OpenMP clause.
2153   /// Subclasses may override this routine to provide different behavior.
2154   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2155                                            const OMPVarListLocTy &Locs) {
2156     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2157   }
2158 
2159   /// Build a new OpenMP 'is_device_ptr' clause.
2160   ///
2161   /// By default, performs semantic analysis to build the new OpenMP clause.
2162   /// Subclasses may override this routine to provide different behavior.
2163   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2164                                          const OMPVarListLocTy &Locs) {
2165     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2166   }
2167 
2168   /// Build a new OpenMP 'has_device_addr' clause.
2169   ///
2170   /// By default, performs semantic analysis to build the new OpenMP clause.
2171   /// Subclasses may override this routine to provide different behavior.
2172   OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList,
2173                                            const OMPVarListLocTy &Locs) {
2174     return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs);
2175   }
2176 
2177   /// Build a new OpenMP 'defaultmap' clause.
2178   ///
2179   /// By default, performs semantic analysis to build the new OpenMP clause.
2180   /// Subclasses may override this routine to provide different behavior.
2181   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2182                                         OpenMPDefaultmapClauseKind Kind,
2183                                         SourceLocation StartLoc,
2184                                         SourceLocation LParenLoc,
2185                                         SourceLocation MLoc,
2186                                         SourceLocation KindLoc,
2187                                         SourceLocation EndLoc) {
2188     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2189                                                  MLoc, KindLoc, EndLoc);
2190   }
2191 
2192   /// Build a new OpenMP 'nontemporal' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
2196   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2197                                          SourceLocation StartLoc,
2198                                          SourceLocation LParenLoc,
2199                                          SourceLocation EndLoc) {
2200     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2201                                                   EndLoc);
2202   }
2203 
2204   /// Build a new OpenMP 'inclusive' clause.
2205   ///
2206   /// By default, performs semantic analysis to build the new OpenMP clause.
2207   /// Subclasses may override this routine to provide different behavior.
2208   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2209                                        SourceLocation StartLoc,
2210                                        SourceLocation LParenLoc,
2211                                        SourceLocation EndLoc) {
2212     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2213                                                 EndLoc);
2214   }
2215 
2216   /// Build a new OpenMP 'exclusive' clause.
2217   ///
2218   /// By default, performs semantic analysis to build the new OpenMP clause.
2219   /// Subclasses may override this routine to provide different behavior.
2220   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2221                                        SourceLocation StartLoc,
2222                                        SourceLocation LParenLoc,
2223                                        SourceLocation EndLoc) {
2224     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2225                                                 EndLoc);
2226   }
2227 
2228   /// Build a new OpenMP 'uses_allocators' clause.
2229   ///
2230   /// By default, performs semantic analysis to build the new OpenMP clause.
2231   /// Subclasses may override this routine to provide different behavior.
2232   OMPClause *RebuildOMPUsesAllocatorsClause(
2233       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2234       SourceLocation LParenLoc, SourceLocation EndLoc) {
2235     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2236                                                     Data);
2237   }
2238 
2239   /// Build a new OpenMP 'affinity' clause.
2240   ///
2241   /// By default, performs semantic analysis to build the new OpenMP clause.
2242   /// Subclasses may override this routine to provide different behavior.
2243   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2244                                       SourceLocation LParenLoc,
2245                                       SourceLocation ColonLoc,
2246                                       SourceLocation EndLoc, Expr *Modifier,
2247                                       ArrayRef<Expr *> Locators) {
2248     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2249                                                EndLoc, Modifier, Locators);
2250   }
2251 
2252   /// Build a new OpenMP 'order' clause.
2253   ///
2254   /// By default, performs semantic analysis to build the new OpenMP clause.
2255   /// Subclasses may override this routine to provide different behavior.
2256   OMPClause *RebuildOMPOrderClause(
2257       OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc,
2258       SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc,
2259       OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) {
2260     return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc,
2261                                             ModifierKwLoc, KindKwLoc, EndLoc);
2262   }
2263 
2264   /// Build a new OpenMP 'init' clause.
2265   ///
2266   /// By default, performs semantic analysis to build the new OpenMP clause.
2267   /// Subclasses may override this routine to provide different behavior.
2268   OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo,
2269                                   SourceLocation StartLoc,
2270                                   SourceLocation LParenLoc,
2271                                   SourceLocation VarLoc,
2272                                   SourceLocation EndLoc) {
2273     return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc,
2274                                            LParenLoc, VarLoc, EndLoc);
2275   }
2276 
2277   /// Build a new OpenMP 'use' clause.
2278   ///
2279   /// By default, performs semantic analysis to build the new OpenMP clause.
2280   /// Subclasses may override this routine to provide different behavior.
2281   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2282                                  SourceLocation LParenLoc,
2283                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2284     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2285                                           VarLoc, EndLoc);
2286   }
2287 
2288   /// Build a new OpenMP 'destroy' clause.
2289   ///
2290   /// By default, performs semantic analysis to build the new OpenMP clause.
2291   /// Subclasses may override this routine to provide different behavior.
2292   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2293                                      SourceLocation LParenLoc,
2294                                      SourceLocation VarLoc,
2295                                      SourceLocation EndLoc) {
2296     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2297                                               VarLoc, EndLoc);
2298   }
2299 
2300   /// Build a new OpenMP 'novariants' clause.
2301   ///
2302   /// By default, performs semantic analysis to build the new OpenMP clause.
2303   /// Subclasses may override this routine to provide different behavior.
2304   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2305                                         SourceLocation StartLoc,
2306                                         SourceLocation LParenLoc,
2307                                         SourceLocation EndLoc) {
2308     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2309                                                  EndLoc);
2310   }
2311 
2312   /// Build a new OpenMP 'nocontext' clause.
2313   ///
2314   /// By default, performs semantic analysis to build the new OpenMP clause.
2315   /// Subclasses may override this routine to provide different behavior.
2316   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2317                                        SourceLocation LParenLoc,
2318                                        SourceLocation EndLoc) {
2319     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2320                                                 EndLoc);
2321   }
2322 
2323   /// Build a new OpenMP 'filter' clause.
2324   ///
2325   /// By default, performs semantic analysis to build the new OpenMP clause.
2326   /// Subclasses may override this routine to provide different behavior.
2327   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2328                                     SourceLocation LParenLoc,
2329                                     SourceLocation EndLoc) {
2330     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2331                                              EndLoc);
2332   }
2333 
2334   /// Build a new OpenMP 'bind' 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 *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2339                                   SourceLocation KindLoc,
2340                                   SourceLocation StartLoc,
2341                                   SourceLocation LParenLoc,
2342                                   SourceLocation EndLoc) {
2343     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2344                                            EndLoc);
2345   }
2346 
2347   /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause.
2348   ///
2349   /// By default, performs semantic analysis to build the new OpenMP clause.
2350   /// Subclasses may override this routine to provide different behavior.
2351   OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc,
2352                                            SourceLocation LParenLoc,
2353                                            SourceLocation EndLoc) {
2354     return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc,
2355                                                     EndLoc);
2356   }
2357 
2358   /// Build a new OpenMP 'align' clause.
2359   ///
2360   /// By default, performs semantic analysis to build the new OpenMP clause.
2361   /// Subclasses may override this routine to provide different behavior.
2362   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2363                                    SourceLocation LParenLoc,
2364                                    SourceLocation EndLoc) {
2365     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2366   }
2367 
2368   /// Build a new OpenMP 'at' clause.
2369   ///
2370   /// By default, performs semantic analysis to build the new OpenMP clause.
2371   /// Subclasses may override this routine to provide different behavior.
2372   OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc,
2373                                 SourceLocation StartLoc,
2374                                 SourceLocation LParenLoc,
2375                                 SourceLocation EndLoc) {
2376     return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc,
2377                                          EndLoc);
2378   }
2379 
2380   /// Build a new OpenMP 'severity' 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 *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind,
2385                                       SourceLocation KwLoc,
2386                                       SourceLocation StartLoc,
2387                                       SourceLocation LParenLoc,
2388                                       SourceLocation EndLoc) {
2389     return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc,
2390                                                EndLoc);
2391   }
2392 
2393   /// Build a new OpenMP 'message' clause.
2394   ///
2395   /// By default, performs semantic analysis to build the new OpenMP clause.
2396   /// Subclasses may override this routine to provide different behavior.
2397   OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc,
2398                                      SourceLocation LParenLoc,
2399                                      SourceLocation EndLoc) {
2400     return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc);
2401   }
2402 
2403   /// Rebuild the operand to an Objective-C \@synchronized statement.
2404   ///
2405   /// By default, performs semantic analysis to build the new statement.
2406   /// Subclasses may override this routine to provide different behavior.
2407   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2408                                               Expr *object) {
2409     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2410   }
2411 
2412   /// Build a new Objective-C \@synchronized statement.
2413   ///
2414   /// By default, performs semantic analysis to build the new statement.
2415   /// Subclasses may override this routine to provide different behavior.
2416   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2417                                            Expr *Object, Stmt *Body) {
2418     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2419   }
2420 
2421   /// Build a new Objective-C \@autoreleasepool statement.
2422   ///
2423   /// By default, performs semantic analysis to build the new statement.
2424   /// Subclasses may override this routine to provide different behavior.
2425   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2426                                             Stmt *Body) {
2427     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2428   }
2429 
2430   /// Build a new Objective-C fast enumeration statement.
2431   ///
2432   /// By default, performs semantic analysis to build the new statement.
2433   /// Subclasses may override this routine to provide different behavior.
2434   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2435                                           Stmt *Element,
2436                                           Expr *Collection,
2437                                           SourceLocation RParenLoc,
2438                                           Stmt *Body) {
2439     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2440                                                 Element,
2441                                                 Collection,
2442                                                 RParenLoc);
2443     if (ForEachStmt.isInvalid())
2444       return StmtError();
2445 
2446     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2447   }
2448 
2449   /// Build a new C++ exception declaration.
2450   ///
2451   /// By default, performs semantic analysis to build the new decaration.
2452   /// Subclasses may override this routine to provide different behavior.
2453   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2454                                 TypeSourceInfo *Declarator,
2455                                 SourceLocation StartLoc,
2456                                 SourceLocation IdLoc,
2457                                 IdentifierInfo *Id) {
2458     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2459                                                        StartLoc, IdLoc, Id);
2460     if (Var)
2461       getSema().CurContext->addDecl(Var);
2462     return Var;
2463   }
2464 
2465   /// Build a new C++ catch 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 RebuildCXXCatchStmt(SourceLocation CatchLoc,
2470                                  VarDecl *ExceptionDecl,
2471                                  Stmt *Handler) {
2472     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2473                                                       Handler));
2474   }
2475 
2476   /// Build a new C++ try statement.
2477   ///
2478   /// By default, performs semantic analysis to build the new statement.
2479   /// Subclasses may override this routine to provide different behavior.
2480   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2481                                ArrayRef<Stmt *> Handlers) {
2482     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2483   }
2484 
2485   /// Build a new C++0x range-based for statement.
2486   ///
2487   /// By default, performs semantic analysis to build the new statement.
2488   /// Subclasses may override this routine to provide different behavior.
2489   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2490                                     SourceLocation CoawaitLoc, Stmt *Init,
2491                                     SourceLocation ColonLoc, Stmt *Range,
2492                                     Stmt *Begin, Stmt *End, Expr *Cond,
2493                                     Expr *Inc, Stmt *LoopVar,
2494                                     SourceLocation RParenLoc) {
2495     // If we've just learned that the range is actually an Objective-C
2496     // collection, treat this as an Objective-C fast enumeration loop.
2497     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2498       if (RangeStmt->isSingleDecl()) {
2499         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2500           if (RangeVar->isInvalidDecl())
2501             return StmtError();
2502 
2503           Expr *RangeExpr = RangeVar->getInit();
2504           if (!RangeExpr->isTypeDependent() &&
2505               RangeExpr->getType()->isObjCObjectPointerType()) {
2506             // FIXME: Support init-statements in Objective-C++20 ranged for
2507             // statement.
2508             if (Init) {
2509               return SemaRef.Diag(Init->getBeginLoc(),
2510                                   diag::err_objc_for_range_init_stmt)
2511                          << Init->getSourceRange();
2512             }
2513             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2514                                                         RangeExpr, RParenLoc);
2515           }
2516         }
2517       }
2518     }
2519 
2520     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2521                                           Range, Begin, End, Cond, Inc, LoopVar,
2522                                           RParenLoc, Sema::BFRK_Rebuild);
2523   }
2524 
2525   /// Build a new C++0x range-based for statement.
2526   ///
2527   /// By default, performs semantic analysis to build the new statement.
2528   /// Subclasses may override this routine to provide different behavior.
2529   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2530                                           bool IsIfExists,
2531                                           NestedNameSpecifierLoc QualifierLoc,
2532                                           DeclarationNameInfo NameInfo,
2533                                           Stmt *Nested) {
2534     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2535                                                 QualifierLoc, NameInfo, Nested);
2536   }
2537 
2538   /// Attach body to a C++0x range-based for statement.
2539   ///
2540   /// By default, performs semantic analysis to finish the new statement.
2541   /// Subclasses may override this routine to provide different behavior.
2542   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2543     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2544   }
2545 
2546   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2547                                Stmt *TryBlock, Stmt *Handler) {
2548     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2549   }
2550 
2551   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2552                                   Stmt *Block) {
2553     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2554   }
2555 
2556   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2557     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2558   }
2559 
2560   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2561                                              SourceLocation LParen,
2562                                              SourceLocation RParen,
2563                                              TypeSourceInfo *TSI) {
2564     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2565   }
2566 
2567   /// Build a new predefined expression.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
2571   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2572                                    PredefinedExpr::IdentKind IK) {
2573     return getSema().BuildPredefinedExpr(Loc, IK);
2574   }
2575 
2576   /// Build a new expression that references a declaration.
2577   ///
2578   /// By default, performs semantic analysis to build the new expression.
2579   /// Subclasses may override this routine to provide different behavior.
2580   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2581                                         LookupResult &R,
2582                                         bool RequiresADL) {
2583     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2584   }
2585 
2586 
2587   /// Build a new expression that references a declaration.
2588   ///
2589   /// By default, performs semantic analysis to build the new expression.
2590   /// Subclasses may override this routine to provide different behavior.
2591   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2592                                 ValueDecl *VD,
2593                                 const DeclarationNameInfo &NameInfo,
2594                                 NamedDecl *Found,
2595                                 TemplateArgumentListInfo *TemplateArgs) {
2596     CXXScopeSpec SS;
2597     SS.Adopt(QualifierLoc);
2598     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2599                                               TemplateArgs);
2600   }
2601 
2602   /// Build a new expression in parentheses.
2603   ///
2604   /// By default, performs semantic analysis to build the new expression.
2605   /// Subclasses may override this routine to provide different behavior.
2606   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2607                                     SourceLocation RParen) {
2608     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2609   }
2610 
2611   /// Build a new pseudo-destructor expression.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2616                                             SourceLocation OperatorLoc,
2617                                             bool isArrow,
2618                                             CXXScopeSpec &SS,
2619                                             TypeSourceInfo *ScopeType,
2620                                             SourceLocation CCLoc,
2621                                             SourceLocation TildeLoc,
2622                                         PseudoDestructorTypeStorage Destroyed);
2623 
2624   /// Build a new unary operator expression.
2625   ///
2626   /// By default, performs semantic analysis to build the new expression.
2627   /// Subclasses may override this routine to provide different behavior.
2628   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2629                                         UnaryOperatorKind Opc,
2630                                         Expr *SubExpr) {
2631     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2632   }
2633 
2634   /// Build a new builtin offsetof expression.
2635   ///
2636   /// By default, performs semantic analysis to build the new expression.
2637   /// Subclasses may override this routine to provide different behavior.
2638   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2639                                  TypeSourceInfo *Type,
2640                                  ArrayRef<Sema::OffsetOfComponent> Components,
2641                                  SourceLocation RParenLoc) {
2642     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2643                                           RParenLoc);
2644   }
2645 
2646   /// Build a new sizeof, alignof or vec_step expression with a
2647   /// type argument.
2648   ///
2649   /// By default, performs semantic analysis to build the new expression.
2650   /// Subclasses may override this routine to provide different behavior.
2651   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2652                                          SourceLocation OpLoc,
2653                                          UnaryExprOrTypeTrait ExprKind,
2654                                          SourceRange R) {
2655     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2656   }
2657 
2658   /// Build a new sizeof, alignof or vec step expression with an
2659   /// expression argument.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// Subclasses may override this routine to provide different behavior.
2663   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2664                                          UnaryExprOrTypeTrait ExprKind,
2665                                          SourceRange R) {
2666     ExprResult Result
2667       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2668     if (Result.isInvalid())
2669       return ExprError();
2670 
2671     return Result;
2672   }
2673 
2674   /// Build a new array subscript expression.
2675   ///
2676   /// By default, performs semantic analysis to build the new expression.
2677   /// Subclasses may override this routine to provide different behavior.
2678   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2679                                              SourceLocation LBracketLoc,
2680                                              Expr *RHS,
2681                                              SourceLocation RBracketLoc) {
2682     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2683                                              LBracketLoc, RHS,
2684                                              RBracketLoc);
2685   }
2686 
2687   /// Build a new matrix subscript expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
2691   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2692                                         Expr *ColumnIdx,
2693                                         SourceLocation RBracketLoc) {
2694     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2695                                                       RBracketLoc);
2696   }
2697 
2698   /// Build a new array section expression.
2699   ///
2700   /// By default, performs semantic analysis to build the new expression.
2701   /// Subclasses may override this routine to provide different behavior.
2702   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2703                                         Expr *LowerBound,
2704                                         SourceLocation ColonLocFirst,
2705                                         SourceLocation ColonLocSecond,
2706                                         Expr *Length, Expr *Stride,
2707                                         SourceLocation RBracketLoc) {
2708     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2709                                               ColonLocFirst, ColonLocSecond,
2710                                               Length, Stride, RBracketLoc);
2711   }
2712 
2713   /// Build a new array shaping expression.
2714   ///
2715   /// By default, performs semantic analysis to build the new expression.
2716   /// Subclasses may override this routine to provide different behavior.
2717   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2718                                         SourceLocation RParenLoc,
2719                                         ArrayRef<Expr *> Dims,
2720                                         ArrayRef<SourceRange> BracketsRanges) {
2721     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2722                                               BracketsRanges);
2723   }
2724 
2725   /// Build a new iterator expression.
2726   ///
2727   /// By default, performs semantic analysis to build the new expression.
2728   /// Subclasses may override this routine to provide different behavior.
2729   ExprResult RebuildOMPIteratorExpr(
2730       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2731       ArrayRef<Sema::OMPIteratorData> Data) {
2732     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2733                                           LLoc, RLoc, Data);
2734   }
2735 
2736   /// Build a new call expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// Subclasses may override this routine to provide different behavior.
2740   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2741                                    MultiExprArg Args,
2742                                    SourceLocation RParenLoc,
2743                                    Expr *ExecConfig = nullptr) {
2744     return getSema().ActOnCallExpr(
2745         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2746   }
2747 
2748   ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc,
2749                                      MultiExprArg Args,
2750                                      SourceLocation RParenLoc) {
2751     return getSema().ActOnArraySubscriptExpr(
2752         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc);
2753   }
2754 
2755   /// Build a new member access expression.
2756   ///
2757   /// By default, performs semantic analysis to build the new expression.
2758   /// Subclasses may override this routine to provide different behavior.
2759   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2760                                bool isArrow,
2761                                NestedNameSpecifierLoc QualifierLoc,
2762                                SourceLocation TemplateKWLoc,
2763                                const DeclarationNameInfo &MemberNameInfo,
2764                                ValueDecl *Member,
2765                                NamedDecl *FoundDecl,
2766                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2767                                NamedDecl *FirstQualifierInScope) {
2768     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2769                                                                       isArrow);
2770     if (!Member->getDeclName()) {
2771       // We have a reference to an unnamed field.  This is always the
2772       // base of an anonymous struct/union member access, i.e. the
2773       // field is always of record type.
2774       assert(Member->getType()->isRecordType() &&
2775              "unnamed member not of record type?");
2776 
2777       BaseResult =
2778         getSema().PerformObjectMemberConversion(BaseResult.get(),
2779                                                 QualifierLoc.getNestedNameSpecifier(),
2780                                                 FoundDecl, Member);
2781       if (BaseResult.isInvalid())
2782         return ExprError();
2783       Base = BaseResult.get();
2784 
2785       CXXScopeSpec EmptySS;
2786       return getSema().BuildFieldReferenceExpr(
2787           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2788           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2789     }
2790 
2791     CXXScopeSpec SS;
2792     SS.Adopt(QualifierLoc);
2793 
2794     Base = BaseResult.get();
2795     QualType BaseType = Base->getType();
2796 
2797     if (isArrow && !BaseType->isPointerType())
2798       return ExprError();
2799 
2800     // FIXME: this involves duplicating earlier analysis in a lot of
2801     // cases; we should avoid this when possible.
2802     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2803     R.addDecl(FoundDecl);
2804     R.resolveKind();
2805 
2806     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2807                                               SS, TemplateKWLoc,
2808                                               FirstQualifierInScope,
2809                                               R, ExplicitTemplateArgs,
2810                                               /*S*/nullptr);
2811   }
2812 
2813   /// Build a new binary operator expression.
2814   ///
2815   /// By default, performs semantic analysis to build the new expression.
2816   /// Subclasses may override this routine to provide different behavior.
2817   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2818                                          BinaryOperatorKind Opc,
2819                                          Expr *LHS, Expr *RHS) {
2820     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2821   }
2822 
2823   /// Build a new rewritten operator expression.
2824   ///
2825   /// By default, performs semantic analysis to build the new expression.
2826   /// Subclasses may override this routine to provide different behavior.
2827   ExprResult RebuildCXXRewrittenBinaryOperator(
2828       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2829       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2830     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2831                                            RHS, /*RequiresADL*/false);
2832   }
2833 
2834   /// Build a new conditional operator expression.
2835   ///
2836   /// By default, performs semantic analysis to build the new expression.
2837   /// Subclasses may override this routine to provide different behavior.
2838   ExprResult RebuildConditionalOperator(Expr *Cond,
2839                                         SourceLocation QuestionLoc,
2840                                         Expr *LHS,
2841                                         SourceLocation ColonLoc,
2842                                         Expr *RHS) {
2843     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2844                                         LHS, RHS);
2845   }
2846 
2847   /// Build a new C-style cast expression.
2848   ///
2849   /// By default, performs semantic analysis to build the new expression.
2850   /// Subclasses may override this routine to provide different behavior.
2851   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2852                                          TypeSourceInfo *TInfo,
2853                                          SourceLocation RParenLoc,
2854                                          Expr *SubExpr) {
2855     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2856                                          SubExpr);
2857   }
2858 
2859   /// Build a new compound literal expression.
2860   ///
2861   /// By default, performs semantic analysis to build the new expression.
2862   /// Subclasses may override this routine to provide different behavior.
2863   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2864                                               TypeSourceInfo *TInfo,
2865                                               SourceLocation RParenLoc,
2866                                               Expr *Init) {
2867     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2868                                               Init);
2869   }
2870 
2871   /// Build a new extended vector element access expression.
2872   ///
2873   /// By default, performs semantic analysis to build the new expression.
2874   /// Subclasses may override this routine to provide different behavior.
2875   ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
2876                                          bool IsArrow,
2877                                          SourceLocation AccessorLoc,
2878                                          IdentifierInfo &Accessor) {
2879 
2880     CXXScopeSpec SS;
2881     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2882     return getSema().BuildMemberReferenceExpr(
2883         Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
2884         /*FirstQualifierInScope*/ nullptr, NameInfo,
2885         /* TemplateArgs */ nullptr,
2886         /*S*/ nullptr);
2887   }
2888 
2889   /// Build a new initializer list expression.
2890   ///
2891   /// By default, performs semantic analysis to build the new expression.
2892   /// Subclasses may override this routine to provide different behavior.
2893   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2894                              MultiExprArg Inits,
2895                              SourceLocation RBraceLoc) {
2896     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2897   }
2898 
2899   /// Build a new designated initializer expression.
2900   ///
2901   /// By default, performs semantic analysis to build the new expression.
2902   /// Subclasses may override this routine to provide different behavior.
2903   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2904                                              MultiExprArg ArrayExprs,
2905                                              SourceLocation EqualOrColonLoc,
2906                                              bool GNUSyntax,
2907                                              Expr *Init) {
2908     ExprResult Result
2909       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2910                                            Init);
2911     if (Result.isInvalid())
2912       return ExprError();
2913 
2914     return Result;
2915   }
2916 
2917   /// Build a new value-initialized expression.
2918   ///
2919   /// By default, builds the implicit value initialization without performing
2920   /// any semantic analysis. Subclasses may override this routine to provide
2921   /// different behavior.
2922   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2923     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2924   }
2925 
2926   /// Build a new \c va_arg expression.
2927   ///
2928   /// By default, performs semantic analysis to build the new expression.
2929   /// Subclasses may override this routine to provide different behavior.
2930   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2931                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2932                                     SourceLocation RParenLoc) {
2933     return getSema().BuildVAArgExpr(BuiltinLoc,
2934                                     SubExpr, TInfo,
2935                                     RParenLoc);
2936   }
2937 
2938   /// Build a new expression list in parentheses.
2939   ///
2940   /// By default, performs semantic analysis to build the new expression.
2941   /// Subclasses may override this routine to provide different behavior.
2942   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2943                                   MultiExprArg SubExprs,
2944                                   SourceLocation RParenLoc) {
2945     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2946   }
2947 
2948   /// Build a new address-of-label expression.
2949   ///
2950   /// By default, performs semantic analysis, using the name of the label
2951   /// rather than attempting to map the label statement itself.
2952   /// Subclasses may override this routine to provide different behavior.
2953   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2954                                   SourceLocation LabelLoc, LabelDecl *Label) {
2955     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2956   }
2957 
2958   /// Build a new GNU statement expression.
2959   ///
2960   /// By default, performs semantic analysis to build the new expression.
2961   /// Subclasses may override this routine to provide different behavior.
2962   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2963                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2964     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2965                                    TemplateDepth);
2966   }
2967 
2968   /// Build a new __builtin_choose_expr expression.
2969   ///
2970   /// By default, performs semantic analysis to build the new expression.
2971   /// Subclasses may override this routine to provide different behavior.
2972   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2973                                      Expr *Cond, Expr *LHS, Expr *RHS,
2974                                      SourceLocation RParenLoc) {
2975     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2976                                    Cond, LHS, RHS,
2977                                    RParenLoc);
2978   }
2979 
2980   /// Build a new generic selection expression.
2981   ///
2982   /// By default, performs semantic analysis to build the new expression.
2983   /// Subclasses may override this routine to provide different behavior.
2984   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2985                                          SourceLocation DefaultLoc,
2986                                          SourceLocation RParenLoc,
2987                                          Expr *ControllingExpr,
2988                                          ArrayRef<TypeSourceInfo *> Types,
2989                                          ArrayRef<Expr *> Exprs) {
2990     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2991                                                 ControllingExpr, Types, Exprs);
2992   }
2993 
2994   /// Build a new overloaded operator call expression.
2995   ///
2996   /// By default, performs semantic analysis to build the new expression.
2997   /// The semantic analysis provides the behavior of template instantiation,
2998   /// copying with transformations that turn what looks like an overloaded
2999   /// operator call into a use of a builtin operator, performing
3000   /// argument-dependent lookup, etc. Subclasses may override this routine to
3001   /// provide different behavior.
3002   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
3003                                               SourceLocation OpLoc,
3004                                               Expr *Callee,
3005                                               Expr *First,
3006                                               Expr *Second);
3007 
3008   /// Build a new C++ "named" cast expression, such as static_cast or
3009   /// reinterpret_cast.
3010   ///
3011   /// By default, this routine dispatches to one of the more-specific routines
3012   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
3013   /// Subclasses may override this routine to provide different behavior.
3014   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
3015                                            Stmt::StmtClass Class,
3016                                            SourceLocation LAngleLoc,
3017                                            TypeSourceInfo *TInfo,
3018                                            SourceLocation RAngleLoc,
3019                                            SourceLocation LParenLoc,
3020                                            Expr *SubExpr,
3021                                            SourceLocation RParenLoc) {
3022     switch (Class) {
3023     case Stmt::CXXStaticCastExprClass:
3024       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
3025                                                    RAngleLoc, LParenLoc,
3026                                                    SubExpr, RParenLoc);
3027 
3028     case Stmt::CXXDynamicCastExprClass:
3029       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
3030                                                     RAngleLoc, LParenLoc,
3031                                                     SubExpr, RParenLoc);
3032 
3033     case Stmt::CXXReinterpretCastExprClass:
3034       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
3035                                                         RAngleLoc, LParenLoc,
3036                                                         SubExpr,
3037                                                         RParenLoc);
3038 
3039     case Stmt::CXXConstCastExprClass:
3040       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
3041                                                    RAngleLoc, LParenLoc,
3042                                                    SubExpr, RParenLoc);
3043 
3044     case Stmt::CXXAddrspaceCastExprClass:
3045       return getDerived().RebuildCXXAddrspaceCastExpr(
3046           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
3047 
3048     default:
3049       llvm_unreachable("Invalid C++ named cast");
3050     }
3051   }
3052 
3053   /// Build a new C++ static_cast expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
3057   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
3058                                             SourceLocation LAngleLoc,
3059                                             TypeSourceInfo *TInfo,
3060                                             SourceLocation RAngleLoc,
3061                                             SourceLocation LParenLoc,
3062                                             Expr *SubExpr,
3063                                             SourceLocation RParenLoc) {
3064     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
3065                                        TInfo, SubExpr,
3066                                        SourceRange(LAngleLoc, RAngleLoc),
3067                                        SourceRange(LParenLoc, RParenLoc));
3068   }
3069 
3070   /// Build a new C++ dynamic_cast expression.
3071   ///
3072   /// By default, performs semantic analysis to build the new expression.
3073   /// Subclasses may override this routine to provide different behavior.
3074   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
3075                                              SourceLocation LAngleLoc,
3076                                              TypeSourceInfo *TInfo,
3077                                              SourceLocation RAngleLoc,
3078                                              SourceLocation LParenLoc,
3079                                              Expr *SubExpr,
3080                                              SourceLocation RParenLoc) {
3081     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
3082                                        TInfo, SubExpr,
3083                                        SourceRange(LAngleLoc, RAngleLoc),
3084                                        SourceRange(LParenLoc, RParenLoc));
3085   }
3086 
3087   /// Build a new C++ reinterpret_cast expression.
3088   ///
3089   /// By default, performs semantic analysis to build the new expression.
3090   /// Subclasses may override this routine to provide different behavior.
3091   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
3092                                                  SourceLocation LAngleLoc,
3093                                                  TypeSourceInfo *TInfo,
3094                                                  SourceLocation RAngleLoc,
3095                                                  SourceLocation LParenLoc,
3096                                                  Expr *SubExpr,
3097                                                  SourceLocation RParenLoc) {
3098     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
3099                                        TInfo, SubExpr,
3100                                        SourceRange(LAngleLoc, RAngleLoc),
3101                                        SourceRange(LParenLoc, RParenLoc));
3102   }
3103 
3104   /// Build a new C++ const_cast expression.
3105   ///
3106   /// By default, performs semantic analysis to build the new expression.
3107   /// Subclasses may override this routine to provide different behavior.
3108   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
3109                                            SourceLocation LAngleLoc,
3110                                            TypeSourceInfo *TInfo,
3111                                            SourceLocation RAngleLoc,
3112                                            SourceLocation LParenLoc,
3113                                            Expr *SubExpr,
3114                                            SourceLocation RParenLoc) {
3115     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
3116                                        TInfo, SubExpr,
3117                                        SourceRange(LAngleLoc, RAngleLoc),
3118                                        SourceRange(LParenLoc, RParenLoc));
3119   }
3120 
3121   ExprResult
3122   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3123                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3124                               SourceLocation LParenLoc, Expr *SubExpr,
3125                               SourceLocation RParenLoc) {
3126     return getSema().BuildCXXNamedCast(
3127         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3128         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3129   }
3130 
3131   /// Build a new C++ functional-style cast expression.
3132   ///
3133   /// By default, performs semantic analysis to build the new expression.
3134   /// Subclasses may override this routine to provide different behavior.
3135   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3136                                           SourceLocation LParenLoc,
3137                                           Expr *Sub,
3138                                           SourceLocation RParenLoc,
3139                                           bool ListInitialization) {
3140     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3141                                                MultiExprArg(&Sub, 1), RParenLoc,
3142                                                ListInitialization);
3143   }
3144 
3145   /// Build a new C++ __builtin_bit_cast expression.
3146   ///
3147   /// By default, performs semantic analysis to build the new expression.
3148   /// Subclasses may override this routine to provide different behavior.
3149   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3150                                        TypeSourceInfo *TSI, Expr *Sub,
3151                                        SourceLocation RParenLoc) {
3152     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3153   }
3154 
3155   /// Build a new C++ typeid(type) expression.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
3159   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3160                                         SourceLocation TypeidLoc,
3161                                         TypeSourceInfo *Operand,
3162                                         SourceLocation RParenLoc) {
3163     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3164                                     RParenLoc);
3165   }
3166 
3167 
3168   /// Build a new C++ typeid(expr) expression.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3173                                         SourceLocation TypeidLoc,
3174                                         Expr *Operand,
3175                                         SourceLocation RParenLoc) {
3176     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3177                                     RParenLoc);
3178   }
3179 
3180   /// Build a new C++ __uuidof(type) expression.
3181   ///
3182   /// By default, performs semantic analysis to build the new expression.
3183   /// Subclasses may override this routine to provide different behavior.
3184   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3185                                   TypeSourceInfo *Operand,
3186                                   SourceLocation RParenLoc) {
3187     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3188   }
3189 
3190   /// Build a new C++ __uuidof(expr) expression.
3191   ///
3192   /// By default, performs semantic analysis to build the new expression.
3193   /// Subclasses may override this routine to provide different behavior.
3194   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3195                                   Expr *Operand, SourceLocation RParenLoc) {
3196     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3197   }
3198 
3199   /// Build a new C++ "this" expression.
3200   ///
3201   /// By default, builds a new "this" expression without performing any
3202   /// semantic analysis. Subclasses may override this routine to provide
3203   /// different behavior.
3204   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3205                                 QualType ThisType,
3206                                 bool isImplicit) {
3207     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3208   }
3209 
3210   /// Build a new C++ throw expression.
3211   ///
3212   /// By default, performs semantic analysis to build the new expression.
3213   /// Subclasses may override this routine to provide different behavior.
3214   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3215                                  bool IsThrownVariableInScope) {
3216     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3217   }
3218 
3219   /// Build a new C++ default-argument expression.
3220   ///
3221   /// By default, builds a new default-argument expression, which does not
3222   /// require any semantic analysis. Subclasses may override this routine to
3223   /// provide different behavior.
3224   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param,
3225                                       Expr *RewrittenExpr) {
3226     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3227                                      RewrittenExpr, getSema().CurContext);
3228   }
3229 
3230   /// Build a new C++11 default-initialization expression.
3231   ///
3232   /// By default, builds a new default field initialization expression, which
3233   /// does not require any semantic analysis. Subclasses may override this
3234   /// routine to provide different behavior.
3235   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3236                                        FieldDecl *Field) {
3237     return getSema().BuildCXXDefaultInitExpr(Loc, Field);
3238   }
3239 
3240   /// Build a new C++ zero-initialization expression.
3241   ///
3242   /// By default, performs semantic analysis to build the new expression.
3243   /// Subclasses may override this routine to provide different behavior.
3244   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3245                                            SourceLocation LParenLoc,
3246                                            SourceLocation RParenLoc) {
3247     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt,
3248                                                RParenLoc,
3249                                                /*ListInitialization=*/false);
3250   }
3251 
3252   /// Build a new C++ "new" expression.
3253   ///
3254   /// By default, performs semantic analysis to build the new expression.
3255   /// Subclasses may override this routine to provide different behavior.
3256   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal,
3257                                SourceLocation PlacementLParen,
3258                                MultiExprArg PlacementArgs,
3259                                SourceLocation PlacementRParen,
3260                                SourceRange TypeIdParens, QualType AllocatedType,
3261                                TypeSourceInfo *AllocatedTypeInfo,
3262                                std::optional<Expr *> ArraySize,
3263                                SourceRange DirectInitRange, Expr *Initializer) {
3264     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3265                                  PlacementLParen,
3266                                  PlacementArgs,
3267                                  PlacementRParen,
3268                                  TypeIdParens,
3269                                  AllocatedType,
3270                                  AllocatedTypeInfo,
3271                                  ArraySize,
3272                                  DirectInitRange,
3273                                  Initializer);
3274   }
3275 
3276   /// Build a new C++ "delete" expression.
3277   ///
3278   /// By default, performs semantic analysis to build the new expression.
3279   /// Subclasses may override this routine to provide different behavior.
3280   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3281                                         bool IsGlobalDelete,
3282                                         bool IsArrayForm,
3283                                         Expr *Operand) {
3284     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3285                                     Operand);
3286   }
3287 
3288   /// Build a new type trait expression.
3289   ///
3290   /// By default, performs semantic analysis to build the new expression.
3291   /// Subclasses may override this routine to provide different behavior.
3292   ExprResult RebuildTypeTrait(TypeTrait Trait,
3293                               SourceLocation StartLoc,
3294                               ArrayRef<TypeSourceInfo *> Args,
3295                               SourceLocation RParenLoc) {
3296     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3297   }
3298 
3299   /// Build a new array type trait expression.
3300   ///
3301   /// By default, performs semantic analysis to build the new expression.
3302   /// Subclasses may override this routine to provide different behavior.
3303   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3304                                    SourceLocation StartLoc,
3305                                    TypeSourceInfo *TSInfo,
3306                                    Expr *DimExpr,
3307                                    SourceLocation RParenLoc) {
3308     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3309   }
3310 
3311   /// Build a new expression trait expression.
3312   ///
3313   /// By default, performs semantic analysis to build the new expression.
3314   /// Subclasses may override this routine to provide different behavior.
3315   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3316                                    SourceLocation StartLoc,
3317                                    Expr *Queried,
3318                                    SourceLocation RParenLoc) {
3319     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3320   }
3321 
3322   /// Build a new (previously unresolved) declaration reference
3323   /// expression.
3324   ///
3325   /// By default, performs semantic analysis to build the new expression.
3326   /// Subclasses may override this routine to provide different behavior.
3327   ExprResult RebuildDependentScopeDeclRefExpr(
3328                                           NestedNameSpecifierLoc QualifierLoc,
3329                                           SourceLocation TemplateKWLoc,
3330                                        const DeclarationNameInfo &NameInfo,
3331                               const TemplateArgumentListInfo *TemplateArgs,
3332                                           bool IsAddressOfOperand,
3333                                           TypeSourceInfo **RecoveryTSI) {
3334     CXXScopeSpec SS;
3335     SS.Adopt(QualifierLoc);
3336 
3337     if (TemplateArgs || TemplateKWLoc.isValid())
3338       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3339                                                     TemplateArgs);
3340 
3341     return getSema().BuildQualifiedDeclarationNameExpr(
3342         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3343   }
3344 
3345   /// Build a new template-id expression.
3346   ///
3347   /// By default, performs semantic analysis to build the new expression.
3348   /// Subclasses may override this routine to provide different behavior.
3349   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3350                                    SourceLocation TemplateKWLoc,
3351                                    LookupResult &R,
3352                                    bool RequiresADL,
3353                               const TemplateArgumentListInfo *TemplateArgs) {
3354     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3355                                          TemplateArgs);
3356   }
3357 
3358   /// Build a new object-construction expression.
3359   ///
3360   /// By default, performs semantic analysis to build the new expression.
3361   /// Subclasses may override this routine to provide different behavior.
3362   ExprResult RebuildCXXConstructExpr(QualType T,
3363                                      SourceLocation Loc,
3364                                      CXXConstructorDecl *Constructor,
3365                                      bool IsElidable,
3366                                      MultiExprArg Args,
3367                                      bool HadMultipleCandidates,
3368                                      bool ListInitialization,
3369                                      bool StdInitListInitialization,
3370                                      bool RequiresZeroInit,
3371                              CXXConstructExpr::ConstructionKind ConstructKind,
3372                                      SourceRange ParenRange) {
3373     // Reconstruct the constructor we originally found, which might be
3374     // different if this is a call to an inherited constructor.
3375     CXXConstructorDecl *FoundCtor = Constructor;
3376     if (Constructor->isInheritingConstructor())
3377       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3378 
3379     SmallVector<Expr *, 8> ConvertedArgs;
3380     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3381                                           ConvertedArgs))
3382       return ExprError();
3383 
3384     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3385                                            IsElidable,
3386                                            ConvertedArgs,
3387                                            HadMultipleCandidates,
3388                                            ListInitialization,
3389                                            StdInitListInitialization,
3390                                            RequiresZeroInit, ConstructKind,
3391                                            ParenRange);
3392   }
3393 
3394   /// Build a new implicit construction via inherited constructor
3395   /// expression.
3396   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3397                                              CXXConstructorDecl *Constructor,
3398                                              bool ConstructsVBase,
3399                                              bool InheritedFromVBase) {
3400     return new (getSema().Context) CXXInheritedCtorInitExpr(
3401         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3402   }
3403 
3404   /// Build a new object-construction expression.
3405   ///
3406   /// By default, performs semantic analysis to build the new expression.
3407   /// Subclasses may override this routine to provide different behavior.
3408   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3409                                            SourceLocation LParenOrBraceLoc,
3410                                            MultiExprArg Args,
3411                                            SourceLocation RParenOrBraceLoc,
3412                                            bool ListInitialization) {
3413     return getSema().BuildCXXTypeConstructExpr(
3414         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3415   }
3416 
3417   /// Build a new object-construction expression.
3418   ///
3419   /// By default, performs semantic analysis to build the new expression.
3420   /// Subclasses may override this routine to provide different behavior.
3421   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3422                                                SourceLocation LParenLoc,
3423                                                MultiExprArg Args,
3424                                                SourceLocation RParenLoc,
3425                                                bool ListInitialization) {
3426     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3427                                                RParenLoc, ListInitialization);
3428   }
3429 
3430   /// Build a new member reference expression.
3431   ///
3432   /// By default, performs semantic analysis to build the new expression.
3433   /// Subclasses may override this routine to provide different behavior.
3434   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3435                                                 QualType BaseType,
3436                                                 bool IsArrow,
3437                                                 SourceLocation OperatorLoc,
3438                                           NestedNameSpecifierLoc QualifierLoc,
3439                                                 SourceLocation TemplateKWLoc,
3440                                             NamedDecl *FirstQualifierInScope,
3441                                    const DeclarationNameInfo &MemberNameInfo,
3442                               const TemplateArgumentListInfo *TemplateArgs) {
3443     CXXScopeSpec SS;
3444     SS.Adopt(QualifierLoc);
3445 
3446     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3447                                             OperatorLoc, IsArrow,
3448                                             SS, TemplateKWLoc,
3449                                             FirstQualifierInScope,
3450                                             MemberNameInfo,
3451                                             TemplateArgs, /*S*/nullptr);
3452   }
3453 
3454   /// Build a new member reference expression.
3455   ///
3456   /// By default, performs semantic analysis to build the new expression.
3457   /// Subclasses may override this routine to provide different behavior.
3458   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3459                                          SourceLocation OperatorLoc,
3460                                          bool IsArrow,
3461                                          NestedNameSpecifierLoc QualifierLoc,
3462                                          SourceLocation TemplateKWLoc,
3463                                          NamedDecl *FirstQualifierInScope,
3464                                          LookupResult &R,
3465                                 const TemplateArgumentListInfo *TemplateArgs) {
3466     CXXScopeSpec SS;
3467     SS.Adopt(QualifierLoc);
3468 
3469     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3470                                             OperatorLoc, IsArrow,
3471                                             SS, TemplateKWLoc,
3472                                             FirstQualifierInScope,
3473                                             R, TemplateArgs, /*S*/nullptr);
3474   }
3475 
3476   /// Build a new noexcept expression.
3477   ///
3478   /// By default, performs semantic analysis to build the new expression.
3479   /// Subclasses may override this routine to provide different behavior.
3480   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3481     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3482   }
3483 
3484   /// Build a new expression to compute the length of a parameter pack.
3485   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
3486                                    SourceLocation PackLoc,
3487                                    SourceLocation RParenLoc,
3488                                    std::optional<unsigned> Length,
3489                                    ArrayRef<TemplateArgument> PartialArgs) {
3490     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3491                                   RParenLoc, Length, PartialArgs);
3492   }
3493 
3494   /// Build a new expression representing a call to a source location
3495   ///  builtin.
3496   ///
3497   /// By default, performs semantic analysis to build the new expression.
3498   /// Subclasses may override this routine to provide different behavior.
3499   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3500                                   QualType ResultTy, SourceLocation BuiltinLoc,
3501                                   SourceLocation RPLoc,
3502                                   DeclContext *ParentContext) {
3503     return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc,
3504                                         ParentContext);
3505   }
3506 
3507   /// Build a new Objective-C boxed expression.
3508   ///
3509   /// By default, performs semantic analysis to build the new expression.
3510   /// Subclasses may override this routine to provide different behavior.
3511   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3512       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3513       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3514       TemplateArgumentListInfo *TALI) {
3515     CXXScopeSpec SS;
3516     SS.Adopt(NNS);
3517     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3518                                                          ConceptNameInfo,
3519                                                          FoundDecl,
3520                                                          NamedConcept, TALI);
3521     if (Result.isInvalid())
3522       return ExprError();
3523     return Result;
3524   }
3525 
3526   /// \brief Build a new requires expression.
3527   ///
3528   /// By default, performs semantic analysis to build the new expression.
3529   /// Subclasses may override this routine to provide different behavior.
3530   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3531                                  RequiresExprBodyDecl *Body,
3532                                  ArrayRef<ParmVarDecl *> LocalParameters,
3533                                  ArrayRef<concepts::Requirement *> Requirements,
3534                                  SourceLocation ClosingBraceLoc) {
3535     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3536                                 LocalParameters, Requirements, ClosingBraceLoc);
3537   }
3538 
3539   concepts::TypeRequirement *
3540   RebuildTypeRequirement(
3541       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3542     return SemaRef.BuildTypeRequirement(SubstDiag);
3543   }
3544 
3545   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3546     return SemaRef.BuildTypeRequirement(T);
3547   }
3548 
3549   concepts::ExprRequirement *
3550   RebuildExprRequirement(
3551       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3552       SourceLocation NoexceptLoc,
3553       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3554     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3555                                         std::move(Ret));
3556   }
3557 
3558   concepts::ExprRequirement *
3559   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3560                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3561     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3562                                         std::move(Ret));
3563   }
3564 
3565   concepts::NestedRequirement *
3566   RebuildNestedRequirement(StringRef InvalidConstraintEntity,
3567                            const ASTConstraintSatisfaction &Satisfaction) {
3568     return SemaRef.BuildNestedRequirement(InvalidConstraintEntity,
3569                                           Satisfaction);
3570   }
3571 
3572   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3573     return SemaRef.BuildNestedRequirement(Constraint);
3574   }
3575 
3576   /// \brief Build a new Objective-C boxed expression.
3577   ///
3578   /// By default, performs semantic analysis to build the new expression.
3579   /// Subclasses may override this routine to provide different behavior.
3580   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3581     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3582   }
3583 
3584   /// Build a new Objective-C array literal.
3585   ///
3586   /// By default, performs semantic analysis to build the new expression.
3587   /// Subclasses may override this routine to provide different behavior.
3588   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3589                                      Expr **Elements, unsigned NumElements) {
3590     return getSema().BuildObjCArrayLiteral(Range,
3591                                            MultiExprArg(Elements, NumElements));
3592   }
3593 
3594   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3595                                          Expr *Base, Expr *Key,
3596                                          ObjCMethodDecl *getterMethod,
3597                                          ObjCMethodDecl *setterMethod) {
3598     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3599                                                    getterMethod, setterMethod);
3600   }
3601 
3602   /// Build a new Objective-C dictionary literal.
3603   ///
3604   /// By default, performs semantic analysis to build the new expression.
3605   /// Subclasses may override this routine to provide different behavior.
3606   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3607                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3608     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3609   }
3610 
3611   /// Build a new Objective-C \@encode expression.
3612   ///
3613   /// By default, performs semantic analysis to build the new expression.
3614   /// Subclasses may override this routine to provide different behavior.
3615   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3616                                          TypeSourceInfo *EncodeTypeInfo,
3617                                          SourceLocation RParenLoc) {
3618     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3619   }
3620 
3621   /// Build a new Objective-C class message.
3622   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3623                                           Selector Sel,
3624                                           ArrayRef<SourceLocation> SelectorLocs,
3625                                           ObjCMethodDecl *Method,
3626                                           SourceLocation LBracLoc,
3627                                           MultiExprArg Args,
3628                                           SourceLocation RBracLoc) {
3629     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3630                                      ReceiverTypeInfo->getType(),
3631                                      /*SuperLoc=*/SourceLocation(),
3632                                      Sel, Method, LBracLoc, SelectorLocs,
3633                                      RBracLoc, Args);
3634   }
3635 
3636   /// Build a new Objective-C instance message.
3637   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3638                                           Selector Sel,
3639                                           ArrayRef<SourceLocation> SelectorLocs,
3640                                           ObjCMethodDecl *Method,
3641                                           SourceLocation LBracLoc,
3642                                           MultiExprArg Args,
3643                                           SourceLocation RBracLoc) {
3644     return SemaRef.BuildInstanceMessage(Receiver,
3645                                         Receiver->getType(),
3646                                         /*SuperLoc=*/SourceLocation(),
3647                                         Sel, Method, LBracLoc, SelectorLocs,
3648                                         RBracLoc, Args);
3649   }
3650 
3651   /// Build a new Objective-C instance/class message to 'super'.
3652   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3653                                     Selector Sel,
3654                                     ArrayRef<SourceLocation> SelectorLocs,
3655                                     QualType SuperType,
3656                                     ObjCMethodDecl *Method,
3657                                     SourceLocation LBracLoc,
3658                                     MultiExprArg Args,
3659                                     SourceLocation RBracLoc) {
3660     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3661                                           SuperType,
3662                                           SuperLoc,
3663                                           Sel, Method, LBracLoc, SelectorLocs,
3664                                           RBracLoc, Args)
3665                                       : SemaRef.BuildClassMessage(nullptr,
3666                                           SuperType,
3667                                           SuperLoc,
3668                                           Sel, Method, LBracLoc, SelectorLocs,
3669                                           RBracLoc, Args);
3670 
3671 
3672   }
3673 
3674   /// Build a new Objective-C ivar reference expression.
3675   ///
3676   /// By default, performs semantic analysis to build the new expression.
3677   /// Subclasses may override this routine to provide different behavior.
3678   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3679                                           SourceLocation IvarLoc,
3680                                           bool IsArrow, bool IsFreeIvar) {
3681     CXXScopeSpec SS;
3682     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3683     ExprResult Result = getSema().BuildMemberReferenceExpr(
3684         BaseArg, BaseArg->getType(),
3685         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3686         /*FirstQualifierInScope=*/nullptr, NameInfo,
3687         /*TemplateArgs=*/nullptr,
3688         /*S=*/nullptr);
3689     if (IsFreeIvar && Result.isUsable())
3690       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3691     return Result;
3692   }
3693 
3694   /// Build a new Objective-C property reference expression.
3695   ///
3696   /// By default, performs semantic analysis to build the new expression.
3697   /// Subclasses may override this routine to provide different behavior.
3698   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3699                                         ObjCPropertyDecl *Property,
3700                                         SourceLocation PropertyLoc) {
3701     CXXScopeSpec SS;
3702     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3703     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3704                                               /*FIXME:*/PropertyLoc,
3705                                               /*IsArrow=*/false,
3706                                               SS, SourceLocation(),
3707                                               /*FirstQualifierInScope=*/nullptr,
3708                                               NameInfo,
3709                                               /*TemplateArgs=*/nullptr,
3710                                               /*S=*/nullptr);
3711   }
3712 
3713   /// Build a new Objective-C property reference expression.
3714   ///
3715   /// By default, performs semantic analysis to build the new expression.
3716   /// Subclasses may override this routine to provide different behavior.
3717   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3718                                         ObjCMethodDecl *Getter,
3719                                         ObjCMethodDecl *Setter,
3720                                         SourceLocation PropertyLoc) {
3721     // Since these expressions can only be value-dependent, we do not
3722     // need to perform semantic analysis again.
3723     return Owned(
3724       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3725                                                   VK_LValue, OK_ObjCProperty,
3726                                                   PropertyLoc, Base));
3727   }
3728 
3729   /// Build a new Objective-C "isa" expression.
3730   ///
3731   /// By default, performs semantic analysis to build the new expression.
3732   /// Subclasses may override this routine to provide different behavior.
3733   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3734                                 SourceLocation OpLoc, bool IsArrow) {
3735     CXXScopeSpec SS;
3736     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3737     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3738                                               OpLoc, IsArrow,
3739                                               SS, SourceLocation(),
3740                                               /*FirstQualifierInScope=*/nullptr,
3741                                               NameInfo,
3742                                               /*TemplateArgs=*/nullptr,
3743                                               /*S=*/nullptr);
3744   }
3745 
3746   /// Build a new shuffle vector expression.
3747   ///
3748   /// By default, performs semantic analysis to build the new expression.
3749   /// Subclasses may override this routine to provide different behavior.
3750   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3751                                       MultiExprArg SubExprs,
3752                                       SourceLocation RParenLoc) {
3753     // Find the declaration for __builtin_shufflevector
3754     const IdentifierInfo &Name
3755       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3756     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3757     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3758     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3759 
3760     // Build a reference to the __builtin_shufflevector builtin
3761     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3762     Expr *Callee = new (SemaRef.Context)
3763         DeclRefExpr(SemaRef.Context, Builtin, false,
3764                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3765     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3766     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3767                                        CK_BuiltinFnToFnPtr).get();
3768 
3769     // Build the CallExpr
3770     ExprResult TheCall = CallExpr::Create(
3771         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3772         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3773         FPOptionsOverride());
3774 
3775     // Type-check the __builtin_shufflevector expression.
3776     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3777   }
3778 
3779   /// Build a new convert vector expression.
3780   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3781                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3782                                       SourceLocation RParenLoc) {
3783     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3784                                          BuiltinLoc, RParenLoc);
3785   }
3786 
3787   /// Build a new template argument pack expansion.
3788   ///
3789   /// By default, performs semantic analysis to build a new pack expansion
3790   /// for a template argument. Subclasses may override this routine to provide
3791   /// different behavior.
3792   TemplateArgumentLoc
3793   RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc,
3794                        std::optional<unsigned> NumExpansions) {
3795     switch (Pattern.getArgument().getKind()) {
3796     case TemplateArgument::Expression: {
3797       ExprResult Result
3798         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3799                                        EllipsisLoc, NumExpansions);
3800       if (Result.isInvalid())
3801         return TemplateArgumentLoc();
3802 
3803       return TemplateArgumentLoc(Result.get(), Result.get());
3804     }
3805 
3806     case TemplateArgument::Template:
3807       return TemplateArgumentLoc(
3808           SemaRef.Context,
3809           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3810                            NumExpansions),
3811           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3812           EllipsisLoc);
3813 
3814     case TemplateArgument::Null:
3815     case TemplateArgument::Integral:
3816     case TemplateArgument::Declaration:
3817     case TemplateArgument::Pack:
3818     case TemplateArgument::TemplateExpansion:
3819     case TemplateArgument::NullPtr:
3820       llvm_unreachable("Pack expansion pattern has no parameter packs");
3821 
3822     case TemplateArgument::Type:
3823       if (TypeSourceInfo *Expansion
3824             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3825                                            EllipsisLoc,
3826                                            NumExpansions))
3827         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3828                                    Expansion);
3829       break;
3830     }
3831 
3832     return TemplateArgumentLoc();
3833   }
3834 
3835   /// Build a new expression pack expansion.
3836   ///
3837   /// By default, performs semantic analysis to build a new pack expansion
3838   /// for an expression. Subclasses may override this routine to provide
3839   /// different behavior.
3840   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3841                                   std::optional<unsigned> NumExpansions) {
3842     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3843   }
3844 
3845   /// Build a new C++1z fold-expression.
3846   ///
3847   /// By default, performs semantic analysis in order to build a new fold
3848   /// expression.
3849   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3850                                 SourceLocation LParenLoc, Expr *LHS,
3851                                 BinaryOperatorKind Operator,
3852                                 SourceLocation EllipsisLoc, Expr *RHS,
3853                                 SourceLocation RParenLoc,
3854                                 std::optional<unsigned> NumExpansions) {
3855     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3856                                       EllipsisLoc, RHS, RParenLoc,
3857                                       NumExpansions);
3858   }
3859 
3860   /// Build an empty C++1z fold-expression with the given operator.
3861   ///
3862   /// By default, produces the fallback value for the fold-expression, or
3863   /// produce an error if there is no fallback value.
3864   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3865                                      BinaryOperatorKind Operator) {
3866     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3867   }
3868 
3869   ExprResult RebuildCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T,
3870                                          unsigned NumUserSpecifiedExprs,
3871                                          SourceLocation InitLoc,
3872                                          SourceLocation LParenLoc,
3873                                          SourceLocation RParenLoc) {
3874     return CXXParenListInitExpr::Create(getSema().Context, Args, T,
3875                                         NumUserSpecifiedExprs, InitLoc,
3876                                         LParenLoc, RParenLoc);
3877   }
3878 
3879   /// Build a new atomic operation expression.
3880   ///
3881   /// By default, performs semantic analysis to build the new expression.
3882   /// Subclasses may override this routine to provide different behavior.
3883   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3884                                AtomicExpr::AtomicOp Op,
3885                                SourceLocation RParenLoc) {
3886     // Use this for all of the locations, since we don't know the difference
3887     // between the call and the expr at this point.
3888     SourceRange Range{BuiltinLoc, RParenLoc};
3889     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3890                                      Sema::AtomicArgumentOrder::AST);
3891   }
3892 
3893   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3894                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3895     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3896   }
3897 
3898 private:
3899   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3900                                      QualType ObjectType,
3901                                      NamedDecl *FirstQualifierInScope,
3902                                      CXXScopeSpec &SS);
3903 
3904   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3905                                              QualType ObjectType,
3906                                              NamedDecl *FirstQualifierInScope,
3907                                              CXXScopeSpec &SS);
3908 
3909   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3910                                             NamedDecl *FirstQualifierInScope,
3911                                             CXXScopeSpec &SS);
3912 
3913   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3914                                       DependentNameTypeLoc TL,
3915                                       bool DeducibleTSTContext);
3916 };
3917 
3918 template <typename Derived>
3919 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3920   if (!S)
3921     return S;
3922 
3923   switch (S->getStmtClass()) {
3924   case Stmt::NoStmtClass: break;
3925 
3926   // Transform individual statement nodes
3927   // Pass SDK into statements that can produce a value
3928 #define STMT(Node, Parent)                                              \
3929   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3930 #define VALUESTMT(Node, Parent)                                         \
3931   case Stmt::Node##Class:                                               \
3932     return getDerived().Transform##Node(cast<Node>(S), SDK);
3933 #define ABSTRACT_STMT(Node)
3934 #define EXPR(Node, Parent)
3935 #include "clang/AST/StmtNodes.inc"
3936 
3937   // Transform expressions by calling TransformExpr.
3938 #define STMT(Node, Parent)
3939 #define ABSTRACT_STMT(Stmt)
3940 #define EXPR(Node, Parent) case Stmt::Node##Class:
3941 #include "clang/AST/StmtNodes.inc"
3942     {
3943       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3944 
3945       if (SDK == SDK_StmtExprResult)
3946         E = getSema().ActOnStmtExprResult(E);
3947       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3948     }
3949   }
3950 
3951   return S;
3952 }
3953 
3954 template<typename Derived>
3955 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3956   if (!S)
3957     return S;
3958 
3959   switch (S->getClauseKind()) {
3960   default: break;
3961   // Transform individual clause nodes
3962 #define GEN_CLANG_CLAUSE_CLASS
3963 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3964   case Enum:                                                                   \
3965     return getDerived().Transform##Class(cast<Class>(S));
3966 #include "llvm/Frontend/OpenMP/OMP.inc"
3967   }
3968 
3969   return S;
3970 }
3971 
3972 
3973 template<typename Derived>
3974 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3975   if (!E)
3976     return E;
3977 
3978   switch (E->getStmtClass()) {
3979     case Stmt::NoStmtClass: break;
3980 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3981 #define ABSTRACT_STMT(Stmt)
3982 #define EXPR(Node, Parent)                                              \
3983     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3984 #include "clang/AST/StmtNodes.inc"
3985   }
3986 
3987   return E;
3988 }
3989 
3990 template<typename Derived>
3991 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3992                                                         bool NotCopyInit) {
3993   // Initializers are instantiated like expressions, except that various outer
3994   // layers are stripped.
3995   if (!Init)
3996     return Init;
3997 
3998   if (auto *FE = dyn_cast<FullExpr>(Init))
3999     Init = FE->getSubExpr();
4000 
4001   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
4002     OpaqueValueExpr *OVE = AIL->getCommonExpr();
4003     Init = OVE->getSourceExpr();
4004   }
4005 
4006   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
4007     Init = MTE->getSubExpr();
4008 
4009   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
4010     Init = Binder->getSubExpr();
4011 
4012   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
4013     Init = ICE->getSubExprAsWritten();
4014 
4015   if (CXXStdInitializerListExpr *ILE =
4016           dyn_cast<CXXStdInitializerListExpr>(Init))
4017     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
4018 
4019   // If this is copy-initialization, we only need to reconstruct
4020   // InitListExprs. Other forms of copy-initialization will be a no-op if
4021   // the initializer is already the right type.
4022   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
4023   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
4024     return getDerived().TransformExpr(Init);
4025 
4026   // Revert value-initialization back to empty parens.
4027   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
4028     SourceRange Parens = VIE->getSourceRange();
4029     return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt,
4030                                              Parens.getEnd());
4031   }
4032 
4033   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
4034   if (isa<ImplicitValueInitExpr>(Init))
4035     return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt,
4036                                              SourceLocation());
4037 
4038   // Revert initialization by constructor back to a parenthesized or braced list
4039   // of expressions. Any other form of initializer can just be reused directly.
4040   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
4041     return getDerived().TransformExpr(Init);
4042 
4043   // If the initialization implicitly converted an initializer list to a
4044   // std::initializer_list object, unwrap the std::initializer_list too.
4045   if (Construct && Construct->isStdInitListInitialization())
4046     return TransformInitializer(Construct->getArg(0), NotCopyInit);
4047 
4048   // Enter a list-init context if this was list initialization.
4049   EnterExpressionEvaluationContext Context(
4050       getSema(), EnterExpressionEvaluationContext::InitList,
4051       Construct->isListInitialization());
4052 
4053   SmallVector<Expr*, 8> NewArgs;
4054   bool ArgChanged = false;
4055   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
4056                                   /*IsCall*/true, NewArgs, &ArgChanged))
4057     return ExprError();
4058 
4059   // If this was list initialization, revert to syntactic list form.
4060   if (Construct->isListInitialization())
4061     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
4062                                         Construct->getEndLoc());
4063 
4064   // Build a ParenListExpr to represent anything else.
4065   SourceRange Parens = Construct->getParenOrBraceRange();
4066   if (Parens.isInvalid()) {
4067     // This was a variable declaration's initialization for which no initializer
4068     // was specified.
4069     assert(NewArgs.empty() &&
4070            "no parens or braces but have direct init with arguments?");
4071     return ExprEmpty();
4072   }
4073   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
4074                                            Parens.getEnd());
4075 }
4076 
4077 template<typename Derived>
4078 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
4079                                             unsigned NumInputs,
4080                                             bool IsCall,
4081                                       SmallVectorImpl<Expr *> &Outputs,
4082                                             bool *ArgChanged) {
4083   for (unsigned I = 0; I != NumInputs; ++I) {
4084     // If requested, drop call arguments that need to be dropped.
4085     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
4086       if (ArgChanged)
4087         *ArgChanged = true;
4088 
4089       break;
4090     }
4091 
4092     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
4093       Expr *Pattern = Expansion->getPattern();
4094 
4095       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4096       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4097       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4098 
4099       // Determine whether the set of unexpanded parameter packs can and should
4100       // be expanded.
4101       bool Expand = true;
4102       bool RetainExpansion = false;
4103       std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
4104       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4105       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
4106                                                Pattern->getSourceRange(),
4107                                                Unexpanded,
4108                                                Expand, RetainExpansion,
4109                                                NumExpansions))
4110         return true;
4111 
4112       if (!Expand) {
4113         // The transform has determined that we should perform a simple
4114         // transformation on the pack expansion, producing another pack
4115         // expansion.
4116         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4117         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
4118         if (OutPattern.isInvalid())
4119           return true;
4120 
4121         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
4122                                                 Expansion->getEllipsisLoc(),
4123                                                            NumExpansions);
4124         if (Out.isInvalid())
4125           return true;
4126 
4127         if (ArgChanged)
4128           *ArgChanged = true;
4129         Outputs.push_back(Out.get());
4130         continue;
4131       }
4132 
4133       // Record right away that the argument was changed.  This needs
4134       // to happen even if the array expands to nothing.
4135       if (ArgChanged) *ArgChanged = true;
4136 
4137       // The transform has determined that we should perform an elementwise
4138       // expansion of the pattern. Do so.
4139       for (unsigned I = 0; I != *NumExpansions; ++I) {
4140         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4141         ExprResult Out = getDerived().TransformExpr(Pattern);
4142         if (Out.isInvalid())
4143           return true;
4144 
4145         if (Out.get()->containsUnexpandedParameterPack()) {
4146           Out = getDerived().RebuildPackExpansion(
4147               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4148           if (Out.isInvalid())
4149             return true;
4150         }
4151 
4152         Outputs.push_back(Out.get());
4153       }
4154 
4155       // If we're supposed to retain a pack expansion, do so by temporarily
4156       // forgetting the partially-substituted parameter pack.
4157       if (RetainExpansion) {
4158         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4159 
4160         ExprResult Out = getDerived().TransformExpr(Pattern);
4161         if (Out.isInvalid())
4162           return true;
4163 
4164         Out = getDerived().RebuildPackExpansion(
4165             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4166         if (Out.isInvalid())
4167           return true;
4168 
4169         Outputs.push_back(Out.get());
4170       }
4171 
4172       continue;
4173     }
4174 
4175     ExprResult Result =
4176       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4177              : getDerived().TransformExpr(Inputs[I]);
4178     if (Result.isInvalid())
4179       return true;
4180 
4181     if (Result.get() != Inputs[I] && ArgChanged)
4182       *ArgChanged = true;
4183 
4184     Outputs.push_back(Result.get());
4185   }
4186 
4187   return false;
4188 }
4189 
4190 template <typename Derived>
4191 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4192     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4193   if (Var) {
4194     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4195         getDerived().TransformDefinition(Var->getLocation(), Var));
4196 
4197     if (!ConditionVar)
4198       return Sema::ConditionError();
4199 
4200     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4201   }
4202 
4203   if (Expr) {
4204     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4205 
4206     if (CondExpr.isInvalid())
4207       return Sema::ConditionError();
4208 
4209     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind,
4210                                     /*MissingOK=*/true);
4211   }
4212 
4213   return Sema::ConditionResult();
4214 }
4215 
4216 template <typename Derived>
4217 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4218     NestedNameSpecifierLoc NNS, QualType ObjectType,
4219     NamedDecl *FirstQualifierInScope) {
4220   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4221 
4222   auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) {
4223     for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4224          Qualifier = Qualifier.getPrefix())
4225       Qualifiers.push_back(Qualifier);
4226   };
4227   insertNNS(NNS);
4228 
4229   CXXScopeSpec SS;
4230   while (!Qualifiers.empty()) {
4231     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4232     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4233 
4234     switch (QNNS->getKind()) {
4235     case NestedNameSpecifier::Identifier: {
4236       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4237                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4238                                       ObjectType);
4239       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4240                                               SS, FirstQualifierInScope, false))
4241         return NestedNameSpecifierLoc();
4242       break;
4243     }
4244 
4245     case NestedNameSpecifier::Namespace: {
4246       NamespaceDecl *NS =
4247           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4248               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4249       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4250       break;
4251     }
4252 
4253     case NestedNameSpecifier::NamespaceAlias: {
4254       NamespaceAliasDecl *Alias =
4255           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4256               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4257       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4258                 Q.getLocalEndLoc());
4259       break;
4260     }
4261 
4262     case NestedNameSpecifier::Global:
4263       // There is no meaningful transformation that one could perform on the
4264       // global scope.
4265       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4266       break;
4267 
4268     case NestedNameSpecifier::Super: {
4269       CXXRecordDecl *RD =
4270           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4271               SourceLocation(), QNNS->getAsRecordDecl()));
4272       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4273       break;
4274     }
4275 
4276     case NestedNameSpecifier::TypeSpecWithTemplate:
4277     case NestedNameSpecifier::TypeSpec: {
4278       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4279                                               FirstQualifierInScope, SS);
4280 
4281       if (!TL)
4282         return NestedNameSpecifierLoc();
4283 
4284       QualType T = TL.getType();
4285       if (T->isDependentType() || T->isRecordType() ||
4286           (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) {
4287         if (T->isEnumeralType())
4288           SemaRef.Diag(TL.getBeginLoc(),
4289                        diag::warn_cxx98_compat_enum_nested_name_spec);
4290 
4291         if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) {
4292           SS.Adopt(ETL.getQualifierLoc());
4293           TL = ETL.getNamedTypeLoc();
4294         }
4295         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4296                   Q.getLocalEndLoc());
4297         break;
4298       }
4299       // If the nested-name-specifier is an invalid type def, don't emit an
4300       // error because a previous error should have already been emitted.
4301       TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>();
4302       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4303         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4304             << T << SS.getRange();
4305       }
4306       return NestedNameSpecifierLoc();
4307     }
4308     }
4309 
4310     // The qualifier-in-scope and object type only apply to the leftmost entity.
4311     FirstQualifierInScope = nullptr;
4312     ObjectType = QualType();
4313   }
4314 
4315   // Don't rebuild the nested-name-specifier if we don't have to.
4316   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4317       !getDerived().AlwaysRebuild())
4318     return NNS;
4319 
4320   // If we can re-use the source-location data from the original
4321   // nested-name-specifier, do so.
4322   if (SS.location_size() == NNS.getDataLength() &&
4323       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4324     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4325 
4326   // Allocate new nested-name-specifier location information.
4327   return SS.getWithLocInContext(SemaRef.Context);
4328 }
4329 
4330 template<typename Derived>
4331 DeclarationNameInfo
4332 TreeTransform<Derived>
4333 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4334   DeclarationName Name = NameInfo.getName();
4335   if (!Name)
4336     return DeclarationNameInfo();
4337 
4338   switch (Name.getNameKind()) {
4339   case DeclarationName::Identifier:
4340   case DeclarationName::ObjCZeroArgSelector:
4341   case DeclarationName::ObjCOneArgSelector:
4342   case DeclarationName::ObjCMultiArgSelector:
4343   case DeclarationName::CXXOperatorName:
4344   case DeclarationName::CXXLiteralOperatorName:
4345   case DeclarationName::CXXUsingDirective:
4346     return NameInfo;
4347 
4348   case DeclarationName::CXXDeductionGuideName: {
4349     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4350     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4351         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4352     if (!NewTemplate)
4353       return DeclarationNameInfo();
4354 
4355     DeclarationNameInfo NewNameInfo(NameInfo);
4356     NewNameInfo.setName(
4357         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4358     return NewNameInfo;
4359   }
4360 
4361   case DeclarationName::CXXConstructorName:
4362   case DeclarationName::CXXDestructorName:
4363   case DeclarationName::CXXConversionFunctionName: {
4364     TypeSourceInfo *NewTInfo;
4365     CanQualType NewCanTy;
4366     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4367       NewTInfo = getDerived().TransformType(OldTInfo);
4368       if (!NewTInfo)
4369         return DeclarationNameInfo();
4370       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4371     }
4372     else {
4373       NewTInfo = nullptr;
4374       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4375       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4376       if (NewT.isNull())
4377         return DeclarationNameInfo();
4378       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4379     }
4380 
4381     DeclarationName NewName
4382       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4383                                                            NewCanTy);
4384     DeclarationNameInfo NewNameInfo(NameInfo);
4385     NewNameInfo.setName(NewName);
4386     NewNameInfo.setNamedTypeInfo(NewTInfo);
4387     return NewNameInfo;
4388   }
4389   }
4390 
4391   llvm_unreachable("Unknown name kind.");
4392 }
4393 
4394 template<typename Derived>
4395 TemplateName
4396 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4397                                               TemplateName Name,
4398                                               SourceLocation NameLoc,
4399                                               QualType ObjectType,
4400                                               NamedDecl *FirstQualifierInScope,
4401                                               bool AllowInjectedClassName) {
4402   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4403     TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4404     assert(Template && "qualified template name must refer to a template");
4405 
4406     TemplateDecl *TransTemplate
4407       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4408                                                               Template));
4409     if (!TransTemplate)
4410       return TemplateName();
4411 
4412     if (!getDerived().AlwaysRebuild() &&
4413         SS.getScopeRep() == QTN->getQualifier() &&
4414         TransTemplate == Template)
4415       return Name;
4416 
4417     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4418                                             TransTemplate);
4419   }
4420 
4421   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4422     if (SS.getScopeRep()) {
4423       // These apply to the scope specifier, not the template.
4424       ObjectType = QualType();
4425       FirstQualifierInScope = nullptr;
4426     }
4427 
4428     if (!getDerived().AlwaysRebuild() &&
4429         SS.getScopeRep() == DTN->getQualifier() &&
4430         ObjectType.isNull())
4431       return Name;
4432 
4433     // FIXME: Preserve the location of the "template" keyword.
4434     SourceLocation TemplateKWLoc = NameLoc;
4435 
4436     if (DTN->isIdentifier()) {
4437       return getDerived().RebuildTemplateName(SS,
4438                                               TemplateKWLoc,
4439                                               *DTN->getIdentifier(),
4440                                               NameLoc,
4441                                               ObjectType,
4442                                               FirstQualifierInScope,
4443                                               AllowInjectedClassName);
4444     }
4445 
4446     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4447                                             DTN->getOperator(), NameLoc,
4448                                             ObjectType, AllowInjectedClassName);
4449   }
4450 
4451   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4452     TemplateDecl *TransTemplate
4453       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4454                                                               Template));
4455     if (!TransTemplate)
4456       return TemplateName();
4457 
4458     if (!getDerived().AlwaysRebuild() &&
4459         TransTemplate == Template)
4460       return Name;
4461 
4462     return TemplateName(TransTemplate);
4463   }
4464 
4465   if (SubstTemplateTemplateParmPackStorage *SubstPack
4466       = Name.getAsSubstTemplateTemplateParmPack()) {
4467     return getDerived().RebuildTemplateName(
4468         SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4469         SubstPack->getIndex(), SubstPack->getFinal());
4470   }
4471 
4472   // These should be getting filtered out before they reach the AST.
4473   llvm_unreachable("overloaded function decl survived to here");
4474 }
4475 
4476 template<typename Derived>
4477 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4478                                          const TemplateArgument &Arg,
4479                                          TemplateArgumentLoc &Output) {
4480   Output = getSema().getTrivialTemplateArgumentLoc(
4481       Arg, QualType(), getDerived().getBaseLocation());
4482 }
4483 
4484 template <typename Derived>
4485 bool TreeTransform<Derived>::TransformTemplateArgument(
4486     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4487     bool Uneval) {
4488   const TemplateArgument &Arg = Input.getArgument();
4489   switch (Arg.getKind()) {
4490   case TemplateArgument::Null:
4491   case TemplateArgument::Pack:
4492     llvm_unreachable("Unexpected TemplateArgument");
4493 
4494   case TemplateArgument::Integral:
4495   case TemplateArgument::NullPtr:
4496   case TemplateArgument::Declaration: {
4497     // Transform a resolved template argument straight to a resolved template
4498     // argument. We get here when substituting into an already-substituted
4499     // template type argument during concept satisfaction checking.
4500     QualType T = Arg.getNonTypeTemplateArgumentType();
4501     QualType NewT = getDerived().TransformType(T);
4502     if (NewT.isNull())
4503       return true;
4504 
4505     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4506                        ? Arg.getAsDecl()
4507                        : nullptr;
4508     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4509                               getDerived().getBaseLocation(), D))
4510                         : nullptr;
4511     if (D && !NewD)
4512       return true;
4513 
4514     if (NewT == T && D == NewD)
4515       Output = Input;
4516     else if (Arg.getKind() == TemplateArgument::Integral)
4517       Output = TemplateArgumentLoc(
4518           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4519           TemplateArgumentLocInfo());
4520     else if (Arg.getKind() == TemplateArgument::NullPtr)
4521       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4522                                    TemplateArgumentLocInfo());
4523     else
4524       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4525                                    TemplateArgumentLocInfo());
4526 
4527     return false;
4528   }
4529 
4530   case TemplateArgument::Type: {
4531     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4532     if (!DI)
4533       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4534 
4535     DI = getDerived().TransformType(DI);
4536     if (!DI)
4537       return true;
4538 
4539     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4540     return false;
4541   }
4542 
4543   case TemplateArgument::Template: {
4544     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4545     if (QualifierLoc) {
4546       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4547       if (!QualifierLoc)
4548         return true;
4549     }
4550 
4551     CXXScopeSpec SS;
4552     SS.Adopt(QualifierLoc);
4553     TemplateName Template = getDerived().TransformTemplateName(
4554         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4555     if (Template.isNull())
4556       return true;
4557 
4558     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4559                                  QualifierLoc, Input.getTemplateNameLoc());
4560     return false;
4561   }
4562 
4563   case TemplateArgument::TemplateExpansion:
4564     llvm_unreachable("Caller should expand pack expansions");
4565 
4566   case TemplateArgument::Expression: {
4567     // Template argument expressions are constant expressions.
4568     EnterExpressionEvaluationContext Unevaluated(
4569         getSema(),
4570         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4571                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4572         Sema::ReuseLambdaContextDecl, /*ExprContext=*/
4573         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4574 
4575     Expr *InputExpr = Input.getSourceExpression();
4576     if (!InputExpr)
4577       InputExpr = Input.getArgument().getAsExpr();
4578 
4579     ExprResult E = getDerived().TransformExpr(InputExpr);
4580     E = SemaRef.ActOnConstantExpression(E);
4581     if (E.isInvalid())
4582       return true;
4583     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4584     return false;
4585   }
4586   }
4587 
4588   // Work around bogus GCC warning
4589   return true;
4590 }
4591 
4592 /// Iterator adaptor that invents template argument location information
4593 /// for each of the template arguments in its underlying iterator.
4594 template<typename Derived, typename InputIterator>
4595 class TemplateArgumentLocInventIterator {
4596   TreeTransform<Derived> &Self;
4597   InputIterator Iter;
4598 
4599 public:
4600   typedef TemplateArgumentLoc value_type;
4601   typedef TemplateArgumentLoc reference;
4602   typedef typename std::iterator_traits<InputIterator>::difference_type
4603     difference_type;
4604   typedef std::input_iterator_tag iterator_category;
4605 
4606   class pointer {
4607     TemplateArgumentLoc Arg;
4608 
4609   public:
4610     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4611 
4612     const TemplateArgumentLoc *operator->() const { return &Arg; }
4613   };
4614 
4615   TemplateArgumentLocInventIterator() { }
4616 
4617   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4618                                              InputIterator Iter)
4619     : Self(Self), Iter(Iter) { }
4620 
4621   TemplateArgumentLocInventIterator &operator++() {
4622     ++Iter;
4623     return *this;
4624   }
4625 
4626   TemplateArgumentLocInventIterator operator++(int) {
4627     TemplateArgumentLocInventIterator Old(*this);
4628     ++(*this);
4629     return Old;
4630   }
4631 
4632   reference operator*() const {
4633     TemplateArgumentLoc Result;
4634     Self.InventTemplateArgumentLoc(*Iter, Result);
4635     return Result;
4636   }
4637 
4638   pointer operator->() const { return pointer(**this); }
4639 
4640   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4641                          const TemplateArgumentLocInventIterator &Y) {
4642     return X.Iter == Y.Iter;
4643   }
4644 
4645   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4646                          const TemplateArgumentLocInventIterator &Y) {
4647     return X.Iter != Y.Iter;
4648   }
4649 };
4650 
4651 template<typename Derived>
4652 template<typename InputIterator>
4653 bool TreeTransform<Derived>::TransformTemplateArguments(
4654     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4655     bool Uneval) {
4656   for (; First != Last; ++First) {
4657     TemplateArgumentLoc Out;
4658     TemplateArgumentLoc In = *First;
4659 
4660     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4661       // Unpack argument packs, which we translate them into separate
4662       // arguments.
4663       // FIXME: We could do much better if we could guarantee that the
4664       // TemplateArgumentLocInfo for the pack expansion would be usable for
4665       // all of the template arguments in the argument pack.
4666       typedef TemplateArgumentLocInventIterator<Derived,
4667                                                 TemplateArgument::pack_iterator>
4668         PackLocIterator;
4669       if (TransformTemplateArguments(PackLocIterator(*this,
4670                                                  In.getArgument().pack_begin()),
4671                                      PackLocIterator(*this,
4672                                                    In.getArgument().pack_end()),
4673                                      Outputs, Uneval))
4674         return true;
4675 
4676       continue;
4677     }
4678 
4679     if (In.getArgument().isPackExpansion()) {
4680       // We have a pack expansion, for which we will be substituting into
4681       // the pattern.
4682       SourceLocation Ellipsis;
4683       std::optional<unsigned> OrigNumExpansions;
4684       TemplateArgumentLoc Pattern
4685         = getSema().getTemplateArgumentPackExpansionPattern(
4686               In, Ellipsis, OrigNumExpansions);
4687 
4688       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4689       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4690       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4691 
4692       // Determine whether the set of unexpanded parameter packs can and should
4693       // be expanded.
4694       bool Expand = true;
4695       bool RetainExpansion = false;
4696       std::optional<unsigned> NumExpansions = OrigNumExpansions;
4697       if (getDerived().TryExpandParameterPacks(Ellipsis,
4698                                                Pattern.getSourceRange(),
4699                                                Unexpanded,
4700                                                Expand,
4701                                                RetainExpansion,
4702                                                NumExpansions))
4703         return true;
4704 
4705       if (!Expand) {
4706         // The transform has determined that we should perform a simple
4707         // transformation on the pack expansion, producing another pack
4708         // expansion.
4709         TemplateArgumentLoc OutPattern;
4710         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4711         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4712           return true;
4713 
4714         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4715                                                 NumExpansions);
4716         if (Out.getArgument().isNull())
4717           return true;
4718 
4719         Outputs.addArgument(Out);
4720         continue;
4721       }
4722 
4723       // The transform has determined that we should perform an elementwise
4724       // expansion of the pattern. Do so.
4725       for (unsigned I = 0; I != *NumExpansions; ++I) {
4726         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4727 
4728         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4729           return true;
4730 
4731         if (Out.getArgument().containsUnexpandedParameterPack()) {
4732           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4733                                                   OrigNumExpansions);
4734           if (Out.getArgument().isNull())
4735             return true;
4736         }
4737 
4738         Outputs.addArgument(Out);
4739       }
4740 
4741       // If we're supposed to retain a pack expansion, do so by temporarily
4742       // forgetting the partially-substituted parameter pack.
4743       if (RetainExpansion) {
4744         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4745 
4746         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4747           return true;
4748 
4749         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4750                                                 OrigNumExpansions);
4751         if (Out.getArgument().isNull())
4752           return true;
4753 
4754         Outputs.addArgument(Out);
4755       }
4756 
4757       continue;
4758     }
4759 
4760     // The simple case:
4761     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4762       return true;
4763 
4764     Outputs.addArgument(Out);
4765   }
4766 
4767   return false;
4768 
4769 }
4770 
4771 //===----------------------------------------------------------------------===//
4772 // Type transformation
4773 //===----------------------------------------------------------------------===//
4774 
4775 template<typename Derived>
4776 QualType TreeTransform<Derived>::TransformType(QualType T) {
4777   if (getDerived().AlreadyTransformed(T))
4778     return T;
4779 
4780   // Temporary workaround.  All of these transformations should
4781   // eventually turn into transformations on TypeLocs.
4782   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4783                                                 getDerived().getBaseLocation());
4784 
4785   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4786 
4787   if (!NewDI)
4788     return QualType();
4789 
4790   return NewDI->getType();
4791 }
4792 
4793 template<typename Derived>
4794 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4795   // Refine the base location to the type's location.
4796   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4797                        getDerived().getBaseEntity());
4798   if (getDerived().AlreadyTransformed(DI->getType()))
4799     return DI;
4800 
4801   TypeLocBuilder TLB;
4802 
4803   TypeLoc TL = DI->getTypeLoc();
4804   TLB.reserve(TL.getFullDataSize());
4805 
4806   QualType Result = getDerived().TransformType(TLB, TL);
4807   if (Result.isNull())
4808     return nullptr;
4809 
4810   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4811 }
4812 
4813 template<typename Derived>
4814 QualType
4815 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4816   switch (T.getTypeLocClass()) {
4817 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4818 #define TYPELOC(CLASS, PARENT)                                                 \
4819   case TypeLoc::CLASS:                                                         \
4820     return getDerived().Transform##CLASS##Type(TLB,                            \
4821                                                T.castAs<CLASS##TypeLoc>());
4822 #include "clang/AST/TypeLocNodes.def"
4823   }
4824 
4825   llvm_unreachable("unhandled type loc!");
4826 }
4827 
4828 template<typename Derived>
4829 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4830   if (!isa<DependentNameType>(T))
4831     return TransformType(T);
4832 
4833   if (getDerived().AlreadyTransformed(T))
4834     return T;
4835   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4836                                                 getDerived().getBaseLocation());
4837   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4838   return NewDI ? NewDI->getType() : QualType();
4839 }
4840 
4841 template<typename Derived>
4842 TypeSourceInfo *
4843 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4844   if (!isa<DependentNameType>(DI->getType()))
4845     return TransformType(DI);
4846 
4847   // Refine the base location to the type's location.
4848   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4849                        getDerived().getBaseEntity());
4850   if (getDerived().AlreadyTransformed(DI->getType()))
4851     return DI;
4852 
4853   TypeLocBuilder TLB;
4854 
4855   TypeLoc TL = DI->getTypeLoc();
4856   TLB.reserve(TL.getFullDataSize());
4857 
4858   auto QTL = TL.getAs<QualifiedTypeLoc>();
4859   if (QTL)
4860     TL = QTL.getUnqualifiedLoc();
4861 
4862   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4863 
4864   QualType Result = getDerived().TransformDependentNameType(
4865       TLB, DNTL, /*DeducedTSTContext*/true);
4866   if (Result.isNull())
4867     return nullptr;
4868 
4869   if (QTL) {
4870     Result = getDerived().RebuildQualifiedType(Result, QTL);
4871     if (Result.isNull())
4872       return nullptr;
4873     TLB.TypeWasModifiedSafely(Result);
4874   }
4875 
4876   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4877 }
4878 
4879 template<typename Derived>
4880 QualType
4881 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4882                                                QualifiedTypeLoc T) {
4883   QualType Result;
4884   TypeLoc UnqualTL = T.getUnqualifiedLoc();
4885   auto SuppressObjCLifetime =
4886       T.getType().getLocalQualifiers().hasObjCLifetime();
4887   if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) {
4888     Result = getDerived().TransformTemplateTypeParmType(TLB, TTP,
4889                                                         SuppressObjCLifetime);
4890   } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) {
4891     Result = getDerived().TransformSubstTemplateTypeParmPackType(
4892         TLB, STTP, SuppressObjCLifetime);
4893   } else {
4894     Result = getDerived().TransformType(TLB, UnqualTL);
4895   }
4896 
4897   if (Result.isNull())
4898     return QualType();
4899 
4900   Result = getDerived().RebuildQualifiedType(Result, T);
4901 
4902   if (Result.isNull())
4903     return QualType();
4904 
4905   // RebuildQualifiedType might have updated the type, but not in a way
4906   // that invalidates the TypeLoc. (There's no location information for
4907   // qualifiers.)
4908   TLB.TypeWasModifiedSafely(Result);
4909 
4910   return Result;
4911 }
4912 
4913 template <typename Derived>
4914 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4915                                                       QualifiedTypeLoc TL) {
4916 
4917   SourceLocation Loc = TL.getBeginLoc();
4918   Qualifiers Quals = TL.getType().getLocalQualifiers();
4919 
4920   if ((T.getAddressSpace() != LangAS::Default &&
4921        Quals.getAddressSpace() != LangAS::Default) &&
4922       T.getAddressSpace() != Quals.getAddressSpace()) {
4923     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4924         << TL.getType() << T;
4925     return QualType();
4926   }
4927 
4928   // C++ [dcl.fct]p7:
4929   //   [When] adding cv-qualifications on top of the function type [...] the
4930   //   cv-qualifiers are ignored.
4931   if (T->isFunctionType()) {
4932     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4933                                                      Quals.getAddressSpace());
4934     return T;
4935   }
4936 
4937   // C++ [dcl.ref]p1:
4938   //   when the cv-qualifiers are introduced through the use of a typedef-name
4939   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4940   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4941   // applied to a reference type.
4942   if (T->isReferenceType()) {
4943     // The only qualifier that applies to a reference type is restrict.
4944     if (!Quals.hasRestrict())
4945       return T;
4946     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4947   }
4948 
4949   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4950   // resulting type.
4951   if (Quals.hasObjCLifetime()) {
4952     if (!T->isObjCLifetimeType() && !T->isDependentType())
4953       Quals.removeObjCLifetime();
4954     else if (T.getObjCLifetime()) {
4955       // Objective-C ARC:
4956       //   A lifetime qualifier applied to a substituted template parameter
4957       //   overrides the lifetime qualifier from the template argument.
4958       const AutoType *AutoTy;
4959       if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4960         // 'auto' types behave the same way as template parameters.
4961         QualType Deduced = AutoTy->getDeducedType();
4962         Qualifiers Qs = Deduced.getQualifiers();
4963         Qs.removeObjCLifetime();
4964         Deduced =
4965             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4966         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4967                                         AutoTy->isDependentType(),
4968                                         /*isPack=*/false,
4969                                         AutoTy->getTypeConstraintConcept(),
4970                                         AutoTy->getTypeConstraintArguments());
4971       } else {
4972         // Otherwise, complain about the addition of a qualifier to an
4973         // already-qualified type.
4974         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4975         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4976         Quals.removeObjCLifetime();
4977       }
4978     }
4979   }
4980 
4981   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4982 }
4983 
4984 template<typename Derived>
4985 TypeLoc
4986 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4987                                                    QualType ObjectType,
4988                                                    NamedDecl *UnqualLookup,
4989                                                    CXXScopeSpec &SS) {
4990   if (getDerived().AlreadyTransformed(TL.getType()))
4991     return TL;
4992 
4993   TypeSourceInfo *TSI =
4994       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4995   if (TSI)
4996     return TSI->getTypeLoc();
4997   return TypeLoc();
4998 }
4999 
5000 template<typename Derived>
5001 TypeSourceInfo *
5002 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
5003                                                    QualType ObjectType,
5004                                                    NamedDecl *UnqualLookup,
5005                                                    CXXScopeSpec &SS) {
5006   if (getDerived().AlreadyTransformed(TSInfo->getType()))
5007     return TSInfo;
5008 
5009   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
5010                                    UnqualLookup, SS);
5011 }
5012 
5013 template <typename Derived>
5014 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
5015     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
5016     CXXScopeSpec &SS) {
5017   QualType T = TL.getType();
5018   assert(!getDerived().AlreadyTransformed(T));
5019 
5020   TypeLocBuilder TLB;
5021   QualType Result;
5022 
5023   if (isa<TemplateSpecializationType>(T)) {
5024     TemplateSpecializationTypeLoc SpecTL =
5025         TL.castAs<TemplateSpecializationTypeLoc>();
5026 
5027     TemplateName Template = getDerived().TransformTemplateName(
5028         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
5029         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
5030     if (Template.isNull())
5031       return nullptr;
5032 
5033     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
5034                                                               Template);
5035   } else if (isa<DependentTemplateSpecializationType>(T)) {
5036     DependentTemplateSpecializationTypeLoc SpecTL =
5037         TL.castAs<DependentTemplateSpecializationTypeLoc>();
5038 
5039     TemplateName Template
5040       = getDerived().RebuildTemplateName(SS,
5041                                          SpecTL.getTemplateKeywordLoc(),
5042                                          *SpecTL.getTypePtr()->getIdentifier(),
5043                                          SpecTL.getTemplateNameLoc(),
5044                                          ObjectType, UnqualLookup,
5045                                          /*AllowInjectedClassName*/true);
5046     if (Template.isNull())
5047       return nullptr;
5048 
5049     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
5050                                                                        SpecTL,
5051                                                                        Template,
5052                                                                        SS);
5053   } else {
5054     // Nothing special needs to be done for these.
5055     Result = getDerived().TransformType(TLB, TL);
5056   }
5057 
5058   if (Result.isNull())
5059     return nullptr;
5060 
5061   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
5062 }
5063 
5064 template <class TyLoc> static inline
5065 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
5066   TyLoc NewT = TLB.push<TyLoc>(T.getType());
5067   NewT.setNameLoc(T.getNameLoc());
5068   return T.getType();
5069 }
5070 
5071 template<typename Derived>
5072 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
5073                                                       BuiltinTypeLoc T) {
5074   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
5075   NewT.setBuiltinLoc(T.getBuiltinLoc());
5076   if (T.needsExtraLocalData())
5077     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
5078   return T.getType();
5079 }
5080 
5081 template<typename Derived>
5082 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
5083                                                       ComplexTypeLoc T) {
5084   // FIXME: recurse?
5085   return TransformTypeSpecType(TLB, T);
5086 }
5087 
5088 template <typename Derived>
5089 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
5090                                                        AdjustedTypeLoc TL) {
5091   // Adjustments applied during transformation are handled elsewhere.
5092   return getDerived().TransformType(TLB, TL.getOriginalLoc());
5093 }
5094 
5095 template<typename Derived>
5096 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
5097                                                       DecayedTypeLoc TL) {
5098   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
5099   if (OriginalType.isNull())
5100     return QualType();
5101 
5102   QualType Result = TL.getType();
5103   if (getDerived().AlwaysRebuild() ||
5104       OriginalType != TL.getOriginalLoc().getType())
5105     Result = SemaRef.Context.getDecayedType(OriginalType);
5106   TLB.push<DecayedTypeLoc>(Result);
5107   // Nothing to set for DecayedTypeLoc.
5108   return Result;
5109 }
5110 
5111 template<typename Derived>
5112 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
5113                                                       PointerTypeLoc TL) {
5114   QualType PointeeType
5115     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5116   if (PointeeType.isNull())
5117     return QualType();
5118 
5119   QualType Result = TL.getType();
5120   if (PointeeType->getAs<ObjCObjectType>()) {
5121     // A dependent pointer type 'T *' has is being transformed such
5122     // that an Objective-C class type is being replaced for 'T'. The
5123     // resulting pointer type is an ObjCObjectPointerType, not a
5124     // PointerType.
5125     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
5126 
5127     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
5128     NewT.setStarLoc(TL.getStarLoc());
5129     return Result;
5130   }
5131 
5132   if (getDerived().AlwaysRebuild() ||
5133       PointeeType != TL.getPointeeLoc().getType()) {
5134     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5135     if (Result.isNull())
5136       return QualType();
5137   }
5138 
5139   // Objective-C ARC can add lifetime qualifiers to the type that we're
5140   // pointing to.
5141   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5142 
5143   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5144   NewT.setSigilLoc(TL.getSigilLoc());
5145   return Result;
5146 }
5147 
5148 template<typename Derived>
5149 QualType
5150 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5151                                                   BlockPointerTypeLoc TL) {
5152   QualType PointeeType
5153     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5154   if (PointeeType.isNull())
5155     return QualType();
5156 
5157   QualType Result = TL.getType();
5158   if (getDerived().AlwaysRebuild() ||
5159       PointeeType != TL.getPointeeLoc().getType()) {
5160     Result = getDerived().RebuildBlockPointerType(PointeeType,
5161                                                   TL.getSigilLoc());
5162     if (Result.isNull())
5163       return QualType();
5164   }
5165 
5166   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5167   NewT.setSigilLoc(TL.getSigilLoc());
5168   return Result;
5169 }
5170 
5171 /// Transforms a reference type.  Note that somewhat paradoxically we
5172 /// don't care whether the type itself is an l-value type or an r-value
5173 /// type;  we only care if the type was *written* as an l-value type
5174 /// or an r-value type.
5175 template<typename Derived>
5176 QualType
5177 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5178                                                ReferenceTypeLoc TL) {
5179   const ReferenceType *T = TL.getTypePtr();
5180 
5181   // Note that this works with the pointee-as-written.
5182   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5183   if (PointeeType.isNull())
5184     return QualType();
5185 
5186   QualType Result = TL.getType();
5187   if (getDerived().AlwaysRebuild() ||
5188       PointeeType != T->getPointeeTypeAsWritten()) {
5189     Result = getDerived().RebuildReferenceType(PointeeType,
5190                                                T->isSpelledAsLValue(),
5191                                                TL.getSigilLoc());
5192     if (Result.isNull())
5193       return QualType();
5194   }
5195 
5196   // Objective-C ARC can add lifetime qualifiers to the type that we're
5197   // referring to.
5198   TLB.TypeWasModifiedSafely(
5199       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5200 
5201   // r-value references can be rebuilt as l-value references.
5202   ReferenceTypeLoc NewTL;
5203   if (isa<LValueReferenceType>(Result))
5204     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5205   else
5206     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5207   NewTL.setSigilLoc(TL.getSigilLoc());
5208 
5209   return Result;
5210 }
5211 
5212 template<typename Derived>
5213 QualType
5214 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5215                                                  LValueReferenceTypeLoc TL) {
5216   return TransformReferenceType(TLB, TL);
5217 }
5218 
5219 template<typename Derived>
5220 QualType
5221 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5222                                                  RValueReferenceTypeLoc TL) {
5223   return TransformReferenceType(TLB, TL);
5224 }
5225 
5226 template<typename Derived>
5227 QualType
5228 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5229                                                    MemberPointerTypeLoc TL) {
5230   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5231   if (PointeeType.isNull())
5232     return QualType();
5233 
5234   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5235   TypeSourceInfo *NewClsTInfo = nullptr;
5236   if (OldClsTInfo) {
5237     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5238     if (!NewClsTInfo)
5239       return QualType();
5240   }
5241 
5242   const MemberPointerType *T = TL.getTypePtr();
5243   QualType OldClsType = QualType(T->getClass(), 0);
5244   QualType NewClsType;
5245   if (NewClsTInfo)
5246     NewClsType = NewClsTInfo->getType();
5247   else {
5248     NewClsType = getDerived().TransformType(OldClsType);
5249     if (NewClsType.isNull())
5250       return QualType();
5251   }
5252 
5253   QualType Result = TL.getType();
5254   if (getDerived().AlwaysRebuild() ||
5255       PointeeType != T->getPointeeType() ||
5256       NewClsType != OldClsType) {
5257     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5258                                                    TL.getStarLoc());
5259     if (Result.isNull())
5260       return QualType();
5261   }
5262 
5263   // If we had to adjust the pointee type when building a member pointer, make
5264   // sure to push TypeLoc info for it.
5265   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5266   if (MPT && PointeeType != MPT->getPointeeType()) {
5267     assert(isa<AdjustedType>(MPT->getPointeeType()));
5268     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5269   }
5270 
5271   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5272   NewTL.setSigilLoc(TL.getSigilLoc());
5273   NewTL.setClassTInfo(NewClsTInfo);
5274 
5275   return Result;
5276 }
5277 
5278 template<typename Derived>
5279 QualType
5280 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5281                                                    ConstantArrayTypeLoc TL) {
5282   const ConstantArrayType *T = TL.getTypePtr();
5283   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5284   if (ElementType.isNull())
5285     return QualType();
5286 
5287   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5288   Expr *OldSize = TL.getSizeExpr();
5289   if (!OldSize)
5290     OldSize = const_cast<Expr*>(T->getSizeExpr());
5291   Expr *NewSize = nullptr;
5292   if (OldSize) {
5293     EnterExpressionEvaluationContext Unevaluated(
5294         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5295     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5296     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5297   }
5298 
5299   QualType Result = TL.getType();
5300   if (getDerived().AlwaysRebuild() ||
5301       ElementType != T->getElementType() ||
5302       (T->getSizeExpr() && NewSize != OldSize)) {
5303     Result = getDerived().RebuildConstantArrayType(ElementType,
5304                                                    T->getSizeModifier(),
5305                                                    T->getSize(), NewSize,
5306                                              T->getIndexTypeCVRQualifiers(),
5307                                                    TL.getBracketsRange());
5308     if (Result.isNull())
5309       return QualType();
5310   }
5311 
5312   // We might have either a ConstantArrayType or a VariableArrayType now:
5313   // a ConstantArrayType is allowed to have an element type which is a
5314   // VariableArrayType if the type is dependent.  Fortunately, all array
5315   // types have the same location layout.
5316   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5317   NewTL.setLBracketLoc(TL.getLBracketLoc());
5318   NewTL.setRBracketLoc(TL.getRBracketLoc());
5319   NewTL.setSizeExpr(NewSize);
5320 
5321   return Result;
5322 }
5323 
5324 template<typename Derived>
5325 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5326                                               TypeLocBuilder &TLB,
5327                                               IncompleteArrayTypeLoc TL) {
5328   const IncompleteArrayType *T = TL.getTypePtr();
5329   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5330   if (ElementType.isNull())
5331     return QualType();
5332 
5333   QualType Result = TL.getType();
5334   if (getDerived().AlwaysRebuild() ||
5335       ElementType != T->getElementType()) {
5336     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5337                                                      T->getSizeModifier(),
5338                                            T->getIndexTypeCVRQualifiers(),
5339                                                      TL.getBracketsRange());
5340     if (Result.isNull())
5341       return QualType();
5342   }
5343 
5344   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5345   NewTL.setLBracketLoc(TL.getLBracketLoc());
5346   NewTL.setRBracketLoc(TL.getRBracketLoc());
5347   NewTL.setSizeExpr(nullptr);
5348 
5349   return Result;
5350 }
5351 
5352 template<typename Derived>
5353 QualType
5354 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5355                                                    VariableArrayTypeLoc TL) {
5356   const VariableArrayType *T = TL.getTypePtr();
5357   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5358   if (ElementType.isNull())
5359     return QualType();
5360 
5361   ExprResult SizeResult;
5362   {
5363     EnterExpressionEvaluationContext Context(
5364         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5365     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5366   }
5367   if (SizeResult.isInvalid())
5368     return QualType();
5369   SizeResult =
5370       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5371   if (SizeResult.isInvalid())
5372     return QualType();
5373 
5374   Expr *Size = SizeResult.get();
5375 
5376   QualType Result = TL.getType();
5377   if (getDerived().AlwaysRebuild() ||
5378       ElementType != T->getElementType() ||
5379       Size != T->getSizeExpr()) {
5380     Result = getDerived().RebuildVariableArrayType(ElementType,
5381                                                    T->getSizeModifier(),
5382                                                    Size,
5383                                              T->getIndexTypeCVRQualifiers(),
5384                                                    TL.getBracketsRange());
5385     if (Result.isNull())
5386       return QualType();
5387   }
5388 
5389   // We might have constant size array now, but fortunately it has the same
5390   // location layout.
5391   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5392   NewTL.setLBracketLoc(TL.getLBracketLoc());
5393   NewTL.setRBracketLoc(TL.getRBracketLoc());
5394   NewTL.setSizeExpr(Size);
5395 
5396   return Result;
5397 }
5398 
5399 template<typename Derived>
5400 QualType
5401 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5402                                              DependentSizedArrayTypeLoc TL) {
5403   const DependentSizedArrayType *T = TL.getTypePtr();
5404   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5405   if (ElementType.isNull())
5406     return QualType();
5407 
5408   // Array bounds are constant expressions.
5409   EnterExpressionEvaluationContext Unevaluated(
5410       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5411 
5412   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5413   Expr *origSize = TL.getSizeExpr();
5414   if (!origSize) origSize = T->getSizeExpr();
5415 
5416   ExprResult sizeResult
5417     = getDerived().TransformExpr(origSize);
5418   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5419   if (sizeResult.isInvalid())
5420     return QualType();
5421 
5422   Expr *size = sizeResult.get();
5423 
5424   QualType Result = TL.getType();
5425   if (getDerived().AlwaysRebuild() ||
5426       ElementType != T->getElementType() ||
5427       size != origSize) {
5428     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5429                                                          T->getSizeModifier(),
5430                                                          size,
5431                                                 T->getIndexTypeCVRQualifiers(),
5432                                                         TL.getBracketsRange());
5433     if (Result.isNull())
5434       return QualType();
5435   }
5436 
5437   // We might have any sort of array type now, but fortunately they
5438   // all have the same location layout.
5439   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5440   NewTL.setLBracketLoc(TL.getLBracketLoc());
5441   NewTL.setRBracketLoc(TL.getRBracketLoc());
5442   NewTL.setSizeExpr(size);
5443 
5444   return Result;
5445 }
5446 
5447 template <typename Derived>
5448 QualType TreeTransform<Derived>::TransformDependentVectorType(
5449     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5450   const DependentVectorType *T = TL.getTypePtr();
5451   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5452   if (ElementType.isNull())
5453     return QualType();
5454 
5455   EnterExpressionEvaluationContext Unevaluated(
5456       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5457 
5458   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5459   Size = SemaRef.ActOnConstantExpression(Size);
5460   if (Size.isInvalid())
5461     return QualType();
5462 
5463   QualType Result = TL.getType();
5464   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5465       Size.get() != T->getSizeExpr()) {
5466     Result = getDerived().RebuildDependentVectorType(
5467         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5468     if (Result.isNull())
5469       return QualType();
5470   }
5471 
5472   // Result might be dependent or not.
5473   if (isa<DependentVectorType>(Result)) {
5474     DependentVectorTypeLoc NewTL =
5475         TLB.push<DependentVectorTypeLoc>(Result);
5476     NewTL.setNameLoc(TL.getNameLoc());
5477   } else {
5478     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5479     NewTL.setNameLoc(TL.getNameLoc());
5480   }
5481 
5482   return Result;
5483 }
5484 
5485 template<typename Derived>
5486 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5487                                       TypeLocBuilder &TLB,
5488                                       DependentSizedExtVectorTypeLoc TL) {
5489   const DependentSizedExtVectorType *T = TL.getTypePtr();
5490 
5491   // FIXME: ext vector locs should be nested
5492   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5493   if (ElementType.isNull())
5494     return QualType();
5495 
5496   // Vector sizes are constant expressions.
5497   EnterExpressionEvaluationContext Unevaluated(
5498       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5499 
5500   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5501   Size = SemaRef.ActOnConstantExpression(Size);
5502   if (Size.isInvalid())
5503     return QualType();
5504 
5505   QualType Result = TL.getType();
5506   if (getDerived().AlwaysRebuild() ||
5507       ElementType != T->getElementType() ||
5508       Size.get() != T->getSizeExpr()) {
5509     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5510                                                              Size.get(),
5511                                                          T->getAttributeLoc());
5512     if (Result.isNull())
5513       return QualType();
5514   }
5515 
5516   // Result might be dependent or not.
5517   if (isa<DependentSizedExtVectorType>(Result)) {
5518     DependentSizedExtVectorTypeLoc NewTL
5519       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5520     NewTL.setNameLoc(TL.getNameLoc());
5521   } else {
5522     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5523     NewTL.setNameLoc(TL.getNameLoc());
5524   }
5525 
5526   return Result;
5527 }
5528 
5529 template <typename Derived>
5530 QualType
5531 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5532                                                     ConstantMatrixTypeLoc TL) {
5533   const ConstantMatrixType *T = TL.getTypePtr();
5534   QualType ElementType = getDerived().TransformType(T->getElementType());
5535   if (ElementType.isNull())
5536     return QualType();
5537 
5538   QualType Result = TL.getType();
5539   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5540     Result = getDerived().RebuildConstantMatrixType(
5541         ElementType, T->getNumRows(), T->getNumColumns());
5542     if (Result.isNull())
5543       return QualType();
5544   }
5545 
5546   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5547   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5548   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5549   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5550   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5551 
5552   return Result;
5553 }
5554 
5555 template <typename Derived>
5556 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5557     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5558   const DependentSizedMatrixType *T = TL.getTypePtr();
5559 
5560   QualType ElementType = getDerived().TransformType(T->getElementType());
5561   if (ElementType.isNull()) {
5562     return QualType();
5563   }
5564 
5565   // Matrix dimensions are constant expressions.
5566   EnterExpressionEvaluationContext Unevaluated(
5567       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5568 
5569   Expr *origRows = TL.getAttrRowOperand();
5570   if (!origRows)
5571     origRows = T->getRowExpr();
5572   Expr *origColumns = TL.getAttrColumnOperand();
5573   if (!origColumns)
5574     origColumns = T->getColumnExpr();
5575 
5576   ExprResult rowResult = getDerived().TransformExpr(origRows);
5577   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5578   if (rowResult.isInvalid())
5579     return QualType();
5580 
5581   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5582   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5583   if (columnResult.isInvalid())
5584     return QualType();
5585 
5586   Expr *rows = rowResult.get();
5587   Expr *columns = columnResult.get();
5588 
5589   QualType Result = TL.getType();
5590   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5591       rows != origRows || columns != origColumns) {
5592     Result = getDerived().RebuildDependentSizedMatrixType(
5593         ElementType, rows, columns, T->getAttributeLoc());
5594 
5595     if (Result.isNull())
5596       return QualType();
5597   }
5598 
5599   // We might have any sort of matrix type now, but fortunately they
5600   // all have the same location layout.
5601   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5602   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5603   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5604   NewTL.setAttrRowOperand(rows);
5605   NewTL.setAttrColumnOperand(columns);
5606   return Result;
5607 }
5608 
5609 template <typename Derived>
5610 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5611     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5612   const DependentAddressSpaceType *T = TL.getTypePtr();
5613 
5614   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5615 
5616   if (pointeeType.isNull())
5617     return QualType();
5618 
5619   // Address spaces are constant expressions.
5620   EnterExpressionEvaluationContext Unevaluated(
5621       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5622 
5623   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5624   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5625   if (AddrSpace.isInvalid())
5626     return QualType();
5627 
5628   QualType Result = TL.getType();
5629   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5630       AddrSpace.get() != T->getAddrSpaceExpr()) {
5631     Result = getDerived().RebuildDependentAddressSpaceType(
5632         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5633     if (Result.isNull())
5634       return QualType();
5635   }
5636 
5637   // Result might be dependent or not.
5638   if (isa<DependentAddressSpaceType>(Result)) {
5639     DependentAddressSpaceTypeLoc NewTL =
5640         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5641 
5642     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5643     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5644     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5645 
5646   } else {
5647     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5648         Result, getDerived().getBaseLocation());
5649     TransformType(TLB, DI->getTypeLoc());
5650   }
5651 
5652   return Result;
5653 }
5654 
5655 template <typename Derived>
5656 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5657                                                      VectorTypeLoc TL) {
5658   const VectorType *T = TL.getTypePtr();
5659   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5660   if (ElementType.isNull())
5661     return QualType();
5662 
5663   QualType Result = TL.getType();
5664   if (getDerived().AlwaysRebuild() ||
5665       ElementType != T->getElementType()) {
5666     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5667                                             T->getVectorKind());
5668     if (Result.isNull())
5669       return QualType();
5670   }
5671 
5672   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5673   NewTL.setNameLoc(TL.getNameLoc());
5674 
5675   return Result;
5676 }
5677 
5678 template<typename Derived>
5679 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5680                                                         ExtVectorTypeLoc TL) {
5681   const VectorType *T = TL.getTypePtr();
5682   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5683   if (ElementType.isNull())
5684     return QualType();
5685 
5686   QualType Result = TL.getType();
5687   if (getDerived().AlwaysRebuild() ||
5688       ElementType != T->getElementType()) {
5689     Result = getDerived().RebuildExtVectorType(ElementType,
5690                                                T->getNumElements(),
5691                                                /*FIXME*/ SourceLocation());
5692     if (Result.isNull())
5693       return QualType();
5694   }
5695 
5696   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5697   NewTL.setNameLoc(TL.getNameLoc());
5698 
5699   return Result;
5700 }
5701 
5702 template <typename Derived>
5703 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5704     ParmVarDecl *OldParm, int indexAdjustment,
5705     std::optional<unsigned> NumExpansions, bool ExpectParameterPack) {
5706   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5707   TypeSourceInfo *NewDI = nullptr;
5708 
5709   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5710     // If we're substituting into a pack expansion type and we know the
5711     // length we want to expand to, just substitute for the pattern.
5712     TypeLoc OldTL = OldDI->getTypeLoc();
5713     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5714 
5715     TypeLocBuilder TLB;
5716     TypeLoc NewTL = OldDI->getTypeLoc();
5717     TLB.reserve(NewTL.getFullDataSize());
5718 
5719     QualType Result = getDerived().TransformType(TLB,
5720                                                OldExpansionTL.getPatternLoc());
5721     if (Result.isNull())
5722       return nullptr;
5723 
5724     Result = RebuildPackExpansionType(Result,
5725                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5726                                       OldExpansionTL.getEllipsisLoc(),
5727                                       NumExpansions);
5728     if (Result.isNull())
5729       return nullptr;
5730 
5731     PackExpansionTypeLoc NewExpansionTL
5732       = TLB.push<PackExpansionTypeLoc>(Result);
5733     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5734     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5735   } else
5736     NewDI = getDerived().TransformType(OldDI);
5737   if (!NewDI)
5738     return nullptr;
5739 
5740   if (NewDI == OldDI && indexAdjustment == 0)
5741     return OldParm;
5742 
5743   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5744                                              OldParm->getDeclContext(),
5745                                              OldParm->getInnerLocStart(),
5746                                              OldParm->getLocation(),
5747                                              OldParm->getIdentifier(),
5748                                              NewDI->getType(),
5749                                              NewDI,
5750                                              OldParm->getStorageClass(),
5751                                              /* DefArg */ nullptr);
5752   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5753                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5754   transformedLocalDecl(OldParm, {newParm});
5755   return newParm;
5756 }
5757 
5758 template <typename Derived>
5759 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5760     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5761     const QualType *ParamTypes,
5762     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5763     SmallVectorImpl<QualType> &OutParamTypes,
5764     SmallVectorImpl<ParmVarDecl *> *PVars,
5765     Sema::ExtParameterInfoBuilder &PInfos,
5766     unsigned *LastParamTransformed) {
5767   int indexAdjustment = 0;
5768 
5769   unsigned NumParams = Params.size();
5770   for (unsigned i = 0; i != NumParams; ++i) {
5771     if (LastParamTransformed)
5772       *LastParamTransformed = i;
5773     if (ParmVarDecl *OldParm = Params[i]) {
5774       assert(OldParm->getFunctionScopeIndex() == i);
5775 
5776       std::optional<unsigned> NumExpansions;
5777       ParmVarDecl *NewParm = nullptr;
5778       if (OldParm->isParameterPack()) {
5779         // We have a function parameter pack that may need to be expanded.
5780         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5781 
5782         // Find the parameter packs that could be expanded.
5783         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5784         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5785         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5786         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5787 
5788         // Determine whether we should expand the parameter packs.
5789         bool ShouldExpand = false;
5790         bool RetainExpansion = false;
5791         std::optional<unsigned> OrigNumExpansions;
5792         if (Unexpanded.size() > 0) {
5793           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5794           NumExpansions = OrigNumExpansions;
5795           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5796                                                    Pattern.getSourceRange(),
5797                                                    Unexpanded,
5798                                                    ShouldExpand,
5799                                                    RetainExpansion,
5800                                                    NumExpansions)) {
5801             return true;
5802           }
5803         } else {
5804 #ifndef NDEBUG
5805           const AutoType *AT =
5806               Pattern.getType().getTypePtr()->getContainedAutoType();
5807           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5808                  "Could not find parameter packs or undeduced auto type!");
5809 #endif
5810         }
5811 
5812         if (ShouldExpand) {
5813           // Expand the function parameter pack into multiple, separate
5814           // parameters.
5815           getDerived().ExpandingFunctionParameterPack(OldParm);
5816           for (unsigned I = 0; I != *NumExpansions; ++I) {
5817             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5818             ParmVarDecl *NewParm
5819               = getDerived().TransformFunctionTypeParam(OldParm,
5820                                                         indexAdjustment++,
5821                                                         OrigNumExpansions,
5822                                                 /*ExpectParameterPack=*/false);
5823             if (!NewParm)
5824               return true;
5825 
5826             if (ParamInfos)
5827               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5828             OutParamTypes.push_back(NewParm->getType());
5829             if (PVars)
5830               PVars->push_back(NewParm);
5831           }
5832 
5833           // If we're supposed to retain a pack expansion, do so by temporarily
5834           // forgetting the partially-substituted parameter pack.
5835           if (RetainExpansion) {
5836             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5837             ParmVarDecl *NewParm
5838               = getDerived().TransformFunctionTypeParam(OldParm,
5839                                                         indexAdjustment++,
5840                                                         OrigNumExpansions,
5841                                                 /*ExpectParameterPack=*/false);
5842             if (!NewParm)
5843               return true;
5844 
5845             if (ParamInfos)
5846               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5847             OutParamTypes.push_back(NewParm->getType());
5848             if (PVars)
5849               PVars->push_back(NewParm);
5850           }
5851 
5852           // The next parameter should have the same adjustment as the
5853           // last thing we pushed, but we post-incremented indexAdjustment
5854           // on every push.  Also, if we push nothing, the adjustment should
5855           // go down by one.
5856           indexAdjustment--;
5857 
5858           // We're done with the pack expansion.
5859           continue;
5860         }
5861 
5862         // We'll substitute the parameter now without expanding the pack
5863         // expansion.
5864         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5865         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5866                                                           indexAdjustment,
5867                                                           NumExpansions,
5868                                                   /*ExpectParameterPack=*/true);
5869         assert(NewParm->isParameterPack() &&
5870                "Parameter pack no longer a parameter pack after "
5871                "transformation.");
5872       } else {
5873         NewParm = getDerived().TransformFunctionTypeParam(
5874             OldParm, indexAdjustment, std::nullopt,
5875             /*ExpectParameterPack=*/false);
5876       }
5877 
5878       if (!NewParm)
5879         return true;
5880 
5881       if (ParamInfos)
5882         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5883       OutParamTypes.push_back(NewParm->getType());
5884       if (PVars)
5885         PVars->push_back(NewParm);
5886       continue;
5887     }
5888 
5889     // Deal with the possibility that we don't have a parameter
5890     // declaration for this parameter.
5891     assert(ParamTypes);
5892     QualType OldType = ParamTypes[i];
5893     bool IsPackExpansion = false;
5894     std::optional<unsigned> NumExpansions;
5895     QualType NewType;
5896     if (const PackExpansionType *Expansion
5897                                        = dyn_cast<PackExpansionType>(OldType)) {
5898       // We have a function parameter pack that may need to be expanded.
5899       QualType Pattern = Expansion->getPattern();
5900       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5901       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5902 
5903       // Determine whether we should expand the parameter packs.
5904       bool ShouldExpand = false;
5905       bool RetainExpansion = false;
5906       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5907                                                Unexpanded,
5908                                                ShouldExpand,
5909                                                RetainExpansion,
5910                                                NumExpansions)) {
5911         return true;
5912       }
5913 
5914       if (ShouldExpand) {
5915         // Expand the function parameter pack into multiple, separate
5916         // parameters.
5917         for (unsigned I = 0; I != *NumExpansions; ++I) {
5918           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5919           QualType NewType = getDerived().TransformType(Pattern);
5920           if (NewType.isNull())
5921             return true;
5922 
5923           if (NewType->containsUnexpandedParameterPack()) {
5924             NewType = getSema().getASTContext().getPackExpansionType(
5925                 NewType, std::nullopt);
5926 
5927             if (NewType.isNull())
5928               return true;
5929           }
5930 
5931           if (ParamInfos)
5932             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5933           OutParamTypes.push_back(NewType);
5934           if (PVars)
5935             PVars->push_back(nullptr);
5936         }
5937 
5938         // We're done with the pack expansion.
5939         continue;
5940       }
5941 
5942       // If we're supposed to retain a pack expansion, do so by temporarily
5943       // forgetting the partially-substituted parameter pack.
5944       if (RetainExpansion) {
5945         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5946         QualType NewType = getDerived().TransformType(Pattern);
5947         if (NewType.isNull())
5948           return true;
5949 
5950         if (ParamInfos)
5951           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5952         OutParamTypes.push_back(NewType);
5953         if (PVars)
5954           PVars->push_back(nullptr);
5955       }
5956 
5957       // We'll substitute the parameter now without expanding the pack
5958       // expansion.
5959       OldType = Expansion->getPattern();
5960       IsPackExpansion = true;
5961       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5962       NewType = getDerived().TransformType(OldType);
5963     } else {
5964       NewType = getDerived().TransformType(OldType);
5965     }
5966 
5967     if (NewType.isNull())
5968       return true;
5969 
5970     if (IsPackExpansion)
5971       NewType = getSema().Context.getPackExpansionType(NewType,
5972                                                        NumExpansions);
5973 
5974     if (ParamInfos)
5975       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5976     OutParamTypes.push_back(NewType);
5977     if (PVars)
5978       PVars->push_back(nullptr);
5979   }
5980 
5981 #ifndef NDEBUG
5982   if (PVars) {
5983     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5984       if (ParmVarDecl *parm = (*PVars)[i])
5985         assert(parm->getFunctionScopeIndex() == i);
5986   }
5987 #endif
5988 
5989   return false;
5990 }
5991 
5992 template<typename Derived>
5993 QualType
5994 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5995                                                    FunctionProtoTypeLoc TL) {
5996   SmallVector<QualType, 4> ExceptionStorage;
5997   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5998   return getDerived().TransformFunctionProtoType(
5999       TLB, TL, nullptr, Qualifiers(),
6000       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
6001         return This->getDerived().TransformExceptionSpec(
6002             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
6003       });
6004 }
6005 
6006 template<typename Derived> template<typename Fn>
6007 QualType TreeTransform<Derived>::TransformFunctionProtoType(
6008     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
6009     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
6010 
6011   // Transform the parameters and return type.
6012   //
6013   // We are required to instantiate the params and return type in source order.
6014   // When the function has a trailing return type, we instantiate the
6015   // parameters before the return type,  since the return type can then refer
6016   // to the parameters themselves (via decltype, sizeof, etc.).
6017   //
6018   SmallVector<QualType, 4> ParamTypes;
6019   SmallVector<ParmVarDecl*, 4> ParamDecls;
6020   Sema::ExtParameterInfoBuilder ExtParamInfos;
6021   const FunctionProtoType *T = TL.getTypePtr();
6022 
6023   QualType ResultType;
6024 
6025   if (T->hasTrailingReturn()) {
6026     if (getDerived().TransformFunctionTypeParams(
6027             TL.getBeginLoc(), TL.getParams(),
6028             TL.getTypePtr()->param_type_begin(),
6029             T->getExtParameterInfosOrNull(),
6030             ParamTypes, &ParamDecls, ExtParamInfos))
6031       return QualType();
6032 
6033     {
6034       // C++11 [expr.prim.general]p3:
6035       //   If a declaration declares a member function or member function
6036       //   template of a class X, the expression this is a prvalue of type
6037       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
6038       //   and the end of the function-definition, member-declarator, or
6039       //   declarator.
6040       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
6041 
6042       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6043       if (ResultType.isNull())
6044         return QualType();
6045     }
6046   }
6047   else {
6048     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6049     if (ResultType.isNull())
6050       return QualType();
6051 
6052     if (getDerived().TransformFunctionTypeParams(
6053             TL.getBeginLoc(), TL.getParams(),
6054             TL.getTypePtr()->param_type_begin(),
6055             T->getExtParameterInfosOrNull(),
6056             ParamTypes, &ParamDecls, ExtParamInfos))
6057       return QualType();
6058   }
6059 
6060   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
6061 
6062   bool EPIChanged = false;
6063   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
6064     return QualType();
6065 
6066   // Handle extended parameter information.
6067   if (auto NewExtParamInfos =
6068         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
6069     if (!EPI.ExtParameterInfos ||
6070         llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) !=
6071             llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) {
6072       EPIChanged = true;
6073     }
6074     EPI.ExtParameterInfos = NewExtParamInfos;
6075   } else if (EPI.ExtParameterInfos) {
6076     EPIChanged = true;
6077     EPI.ExtParameterInfos = nullptr;
6078   }
6079 
6080   QualType Result = TL.getType();
6081   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
6082       T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) {
6083     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
6084     if (Result.isNull())
6085       return QualType();
6086   }
6087 
6088   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
6089   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6090   NewTL.setLParenLoc(TL.getLParenLoc());
6091   NewTL.setRParenLoc(TL.getRParenLoc());
6092   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
6093   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6094   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
6095     NewTL.setParam(i, ParamDecls[i]);
6096 
6097   return Result;
6098 }
6099 
6100 template<typename Derived>
6101 bool TreeTransform<Derived>::TransformExceptionSpec(
6102     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
6103     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
6104   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
6105 
6106   // Instantiate a dynamic noexcept expression, if any.
6107   if (isComputedNoexcept(ESI.Type)) {
6108     EnterExpressionEvaluationContext Unevaluated(
6109         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
6110     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
6111     if (NoexceptExpr.isInvalid())
6112       return true;
6113 
6114     ExceptionSpecificationType EST = ESI.Type;
6115     NoexceptExpr =
6116         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
6117     if (NoexceptExpr.isInvalid())
6118       return true;
6119 
6120     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
6121       Changed = true;
6122     ESI.NoexceptExpr = NoexceptExpr.get();
6123     ESI.Type = EST;
6124   }
6125 
6126   if (ESI.Type != EST_Dynamic)
6127     return false;
6128 
6129   // Instantiate a dynamic exception specification's type.
6130   for (QualType T : ESI.Exceptions) {
6131     if (const PackExpansionType *PackExpansion =
6132             T->getAs<PackExpansionType>()) {
6133       Changed = true;
6134 
6135       // We have a pack expansion. Instantiate it.
6136       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6137       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6138                                               Unexpanded);
6139       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6140 
6141       // Determine whether the set of unexpanded parameter packs can and
6142       // should
6143       // be expanded.
6144       bool Expand = false;
6145       bool RetainExpansion = false;
6146       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6147       // FIXME: Track the location of the ellipsis (and track source location
6148       // information for the types in the exception specification in general).
6149       if (getDerived().TryExpandParameterPacks(
6150               Loc, SourceRange(), Unexpanded, Expand,
6151               RetainExpansion, NumExpansions))
6152         return true;
6153 
6154       if (!Expand) {
6155         // We can't expand this pack expansion into separate arguments yet;
6156         // just substitute into the pattern and create a new pack expansion
6157         // type.
6158         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6159         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6160         if (U.isNull())
6161           return true;
6162 
6163         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6164         Exceptions.push_back(U);
6165         continue;
6166       }
6167 
6168       // Substitute into the pack expansion pattern for each slice of the
6169       // pack.
6170       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6171         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6172 
6173         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6174         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6175           return true;
6176 
6177         Exceptions.push_back(U);
6178       }
6179     } else {
6180       QualType U = getDerived().TransformType(T);
6181       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6182         return true;
6183       if (T != U)
6184         Changed = true;
6185 
6186       Exceptions.push_back(U);
6187     }
6188   }
6189 
6190   ESI.Exceptions = Exceptions;
6191   if (ESI.Exceptions.empty())
6192     ESI.Type = EST_DynamicNone;
6193   return false;
6194 }
6195 
6196 template<typename Derived>
6197 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6198                                                  TypeLocBuilder &TLB,
6199                                                  FunctionNoProtoTypeLoc TL) {
6200   const FunctionNoProtoType *T = TL.getTypePtr();
6201   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6202   if (ResultType.isNull())
6203     return QualType();
6204 
6205   QualType Result = TL.getType();
6206   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6207     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6208 
6209   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6210   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6211   NewTL.setLParenLoc(TL.getLParenLoc());
6212   NewTL.setRParenLoc(TL.getRParenLoc());
6213   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6214 
6215   return Result;
6216 }
6217 
6218 template <typename Derived>
6219 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6220     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6221   const UnresolvedUsingType *T = TL.getTypePtr();
6222   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6223   if (!D)
6224     return QualType();
6225 
6226   QualType Result = TL.getType();
6227   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6228     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6229     if (Result.isNull())
6230       return QualType();
6231   }
6232 
6233   // We might get an arbitrary type spec type back.  We should at
6234   // least always get a type spec type, though.
6235   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6236   NewTL.setNameLoc(TL.getNameLoc());
6237 
6238   return Result;
6239 }
6240 
6241 template <typename Derived>
6242 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6243                                                     UsingTypeLoc TL) {
6244   const UsingType *T = TL.getTypePtr();
6245 
6246   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6247       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6248   if (!Found)
6249     return QualType();
6250 
6251   QualType Underlying = getDerived().TransformType(T->desugar());
6252   if (Underlying.isNull())
6253     return QualType();
6254 
6255   QualType Result = TL.getType();
6256   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6257       Underlying != T->getUnderlyingType()) {
6258     Result = getDerived().RebuildUsingType(Found, Underlying);
6259     if (Result.isNull())
6260       return QualType();
6261   }
6262 
6263   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6264   return Result;
6265 }
6266 
6267 template<typename Derived>
6268 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6269                                                       TypedefTypeLoc TL) {
6270   const TypedefType *T = TL.getTypePtr();
6271   TypedefNameDecl *Typedef
6272     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6273                                                                T->getDecl()));
6274   if (!Typedef)
6275     return QualType();
6276 
6277   QualType Result = TL.getType();
6278   if (getDerived().AlwaysRebuild() ||
6279       Typedef != T->getDecl()) {
6280     Result = getDerived().RebuildTypedefType(Typedef);
6281     if (Result.isNull())
6282       return QualType();
6283   }
6284 
6285   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6286   NewTL.setNameLoc(TL.getNameLoc());
6287 
6288   return Result;
6289 }
6290 
6291 template<typename Derived>
6292 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6293                                                       TypeOfExprTypeLoc TL) {
6294   // typeof expressions are not potentially evaluated contexts
6295   EnterExpressionEvaluationContext Unevaluated(
6296       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6297       Sema::ReuseLambdaContextDecl);
6298 
6299   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6300   if (E.isInvalid())
6301     return QualType();
6302 
6303   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6304   if (E.isInvalid())
6305     return QualType();
6306 
6307   QualType Result = TL.getType();
6308   TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind();
6309   if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) {
6310     Result =
6311         getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind);
6312     if (Result.isNull())
6313       return QualType();
6314   }
6315 
6316   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6317   NewTL.setTypeofLoc(TL.getTypeofLoc());
6318   NewTL.setLParenLoc(TL.getLParenLoc());
6319   NewTL.setRParenLoc(TL.getRParenLoc());
6320 
6321   return Result;
6322 }
6323 
6324 template<typename Derived>
6325 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6326                                                      TypeOfTypeLoc TL) {
6327   TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo();
6328   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6329   if (!New_Under_TI)
6330     return QualType();
6331 
6332   QualType Result = TL.getType();
6333   TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind();
6334   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6335     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind);
6336     if (Result.isNull())
6337       return QualType();
6338   }
6339 
6340   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6341   NewTL.setTypeofLoc(TL.getTypeofLoc());
6342   NewTL.setLParenLoc(TL.getLParenLoc());
6343   NewTL.setRParenLoc(TL.getRParenLoc());
6344   NewTL.setUnmodifiedTInfo(New_Under_TI);
6345 
6346   return Result;
6347 }
6348 
6349 template<typename Derived>
6350 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6351                                                        DecltypeTypeLoc TL) {
6352   const DecltypeType *T = TL.getTypePtr();
6353 
6354   // decltype expressions are not potentially evaluated contexts
6355   EnterExpressionEvaluationContext Unevaluated(
6356       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6357       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6358 
6359   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6360   if (E.isInvalid())
6361     return QualType();
6362 
6363   E = getSema().ActOnDecltypeExpression(E.get());
6364   if (E.isInvalid())
6365     return QualType();
6366 
6367   QualType Result = TL.getType();
6368   if (getDerived().AlwaysRebuild() ||
6369       E.get() != T->getUnderlyingExpr()) {
6370     Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc());
6371     if (Result.isNull())
6372       return QualType();
6373   }
6374   else E.get();
6375 
6376   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6377   NewTL.setDecltypeLoc(TL.getDecltypeLoc());
6378   NewTL.setRParenLoc(TL.getRParenLoc());
6379   return Result;
6380 }
6381 
6382 template<typename Derived>
6383 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6384                                                             TypeLocBuilder &TLB,
6385                                                      UnaryTransformTypeLoc TL) {
6386   QualType Result = TL.getType();
6387   if (Result->isDependentType()) {
6388     const UnaryTransformType *T = TL.getTypePtr();
6389     QualType NewBase =
6390       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6391     Result = getDerived().RebuildUnaryTransformType(NewBase,
6392                                                     T->getUTTKind(),
6393                                                     TL.getKWLoc());
6394     if (Result.isNull())
6395       return QualType();
6396   }
6397 
6398   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6399   NewTL.setKWLoc(TL.getKWLoc());
6400   NewTL.setParensRange(TL.getParensRange());
6401   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6402   return Result;
6403 }
6404 
6405 template<typename Derived>
6406 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6407     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6408   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6409 
6410   CXXScopeSpec SS;
6411   TemplateName TemplateName = getDerived().TransformTemplateName(
6412       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6413   if (TemplateName.isNull())
6414     return QualType();
6415 
6416   QualType OldDeduced = T->getDeducedType();
6417   QualType NewDeduced;
6418   if (!OldDeduced.isNull()) {
6419     NewDeduced = getDerived().TransformType(OldDeduced);
6420     if (NewDeduced.isNull())
6421       return QualType();
6422   }
6423 
6424   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6425       TemplateName, NewDeduced);
6426   if (Result.isNull())
6427     return QualType();
6428 
6429   DeducedTemplateSpecializationTypeLoc NewTL =
6430       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6431   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6432 
6433   return Result;
6434 }
6435 
6436 template<typename Derived>
6437 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6438                                                      RecordTypeLoc TL) {
6439   const RecordType *T = TL.getTypePtr();
6440   RecordDecl *Record
6441     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6442                                                           T->getDecl()));
6443   if (!Record)
6444     return QualType();
6445 
6446   QualType Result = TL.getType();
6447   if (getDerived().AlwaysRebuild() ||
6448       Record != T->getDecl()) {
6449     Result = getDerived().RebuildRecordType(Record);
6450     if (Result.isNull())
6451       return QualType();
6452   }
6453 
6454   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6455   NewTL.setNameLoc(TL.getNameLoc());
6456 
6457   return Result;
6458 }
6459 
6460 template<typename Derived>
6461 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6462                                                    EnumTypeLoc TL) {
6463   const EnumType *T = TL.getTypePtr();
6464   EnumDecl *Enum
6465     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6466                                                         T->getDecl()));
6467   if (!Enum)
6468     return QualType();
6469 
6470   QualType Result = TL.getType();
6471   if (getDerived().AlwaysRebuild() ||
6472       Enum != T->getDecl()) {
6473     Result = getDerived().RebuildEnumType(Enum);
6474     if (Result.isNull())
6475       return QualType();
6476   }
6477 
6478   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6479   NewTL.setNameLoc(TL.getNameLoc());
6480 
6481   return Result;
6482 }
6483 
6484 template<typename Derived>
6485 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6486                                          TypeLocBuilder &TLB,
6487                                          InjectedClassNameTypeLoc TL) {
6488   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6489                                        TL.getTypePtr()->getDecl());
6490   if (!D) return QualType();
6491 
6492   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6493   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6494   return T;
6495 }
6496 
6497 template<typename Derived>
6498 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6499                                                 TypeLocBuilder &TLB,
6500                                                 TemplateTypeParmTypeLoc TL) {
6501   return getDerived().TransformTemplateTypeParmType(
6502       TLB, TL,
6503       /*SuppressObjCLifetime=*/false);
6504 }
6505 
6506 template <typename Derived>
6507 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6508     TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) {
6509   return TransformTypeSpecType(TLB, TL);
6510 }
6511 
6512 template<typename Derived>
6513 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6514                                          TypeLocBuilder &TLB,
6515                                          SubstTemplateTypeParmTypeLoc TL) {
6516   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6517 
6518   Decl *NewReplaced =
6519       getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
6520 
6521   // Substitute into the replacement type, which itself might involve something
6522   // that needs to be transformed. This only tends to occur with default
6523   // template arguments of template template parameters.
6524   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6525   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6526   if (Replacement.isNull())
6527     return QualType();
6528 
6529   QualType Result = SemaRef.Context.getSubstTemplateTypeParmType(
6530       Replacement, NewReplaced, T->getIndex(), T->getPackIndex());
6531 
6532   // Propagate type-source information.
6533   SubstTemplateTypeParmTypeLoc NewTL
6534     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6535   NewTL.setNameLoc(TL.getNameLoc());
6536   return Result;
6537 
6538 }
6539 
6540 template<typename Derived>
6541 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6542                                           TypeLocBuilder &TLB,
6543                                           SubstTemplateTypeParmPackTypeLoc TL) {
6544   return getDerived().TransformSubstTemplateTypeParmPackType(
6545       TLB, TL, /*SuppressObjCLifetime=*/false);
6546 }
6547 
6548 template <typename Derived>
6549 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6550     TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) {
6551   return TransformTypeSpecType(TLB, TL);
6552 }
6553 
6554 template<typename Derived>
6555 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6556                                                         TypeLocBuilder &TLB,
6557                                            TemplateSpecializationTypeLoc TL) {
6558   const TemplateSpecializationType *T = TL.getTypePtr();
6559 
6560   // The nested-name-specifier never matters in a TemplateSpecializationType,
6561   // because we can't have a dependent nested-name-specifier anyway.
6562   CXXScopeSpec SS;
6563   TemplateName Template
6564     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6565                                          TL.getTemplateNameLoc());
6566   if (Template.isNull())
6567     return QualType();
6568 
6569   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6570 }
6571 
6572 template<typename Derived>
6573 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6574                                                      AtomicTypeLoc TL) {
6575   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6576   if (ValueType.isNull())
6577     return QualType();
6578 
6579   QualType Result = TL.getType();
6580   if (getDerived().AlwaysRebuild() ||
6581       ValueType != TL.getValueLoc().getType()) {
6582     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6583     if (Result.isNull())
6584       return QualType();
6585   }
6586 
6587   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6588   NewTL.setKWLoc(TL.getKWLoc());
6589   NewTL.setLParenLoc(TL.getLParenLoc());
6590   NewTL.setRParenLoc(TL.getRParenLoc());
6591 
6592   return Result;
6593 }
6594 
6595 template <typename Derived>
6596 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6597                                                    PipeTypeLoc TL) {
6598   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6599   if (ValueType.isNull())
6600     return QualType();
6601 
6602   QualType Result = TL.getType();
6603   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6604     const PipeType *PT = Result->castAs<PipeType>();
6605     bool isReadPipe = PT->isReadOnly();
6606     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6607     if (Result.isNull())
6608       return QualType();
6609   }
6610 
6611   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6612   NewTL.setKWLoc(TL.getKWLoc());
6613 
6614   return Result;
6615 }
6616 
6617 template <typename Derived>
6618 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6619                                                      BitIntTypeLoc TL) {
6620   const BitIntType *EIT = TL.getTypePtr();
6621   QualType Result = TL.getType();
6622 
6623   if (getDerived().AlwaysRebuild()) {
6624     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6625                                             EIT->getNumBits(), TL.getNameLoc());
6626     if (Result.isNull())
6627       return QualType();
6628   }
6629 
6630   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6631   NewTL.setNameLoc(TL.getNameLoc());
6632   return Result;
6633 }
6634 
6635 template <typename Derived>
6636 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6637     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6638   const DependentBitIntType *EIT = TL.getTypePtr();
6639 
6640   EnterExpressionEvaluationContext Unevaluated(
6641       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6642   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6643   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6644 
6645   if (BitsExpr.isInvalid())
6646     return QualType();
6647 
6648   QualType Result = TL.getType();
6649 
6650   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6651     Result = getDerived().RebuildDependentBitIntType(
6652         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6653 
6654     if (Result.isNull())
6655       return QualType();
6656   }
6657 
6658   if (isa<DependentBitIntType>(Result)) {
6659     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6660     NewTL.setNameLoc(TL.getNameLoc());
6661   } else {
6662     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6663     NewTL.setNameLoc(TL.getNameLoc());
6664   }
6665   return Result;
6666 }
6667 
6668   /// Simple iterator that traverses the template arguments in a
6669   /// container that provides a \c getArgLoc() member function.
6670   ///
6671   /// This iterator is intended to be used with the iterator form of
6672   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6673   template<typename ArgLocContainer>
6674   class TemplateArgumentLocContainerIterator {
6675     ArgLocContainer *Container;
6676     unsigned Index;
6677 
6678   public:
6679     typedef TemplateArgumentLoc value_type;
6680     typedef TemplateArgumentLoc reference;
6681     typedef int difference_type;
6682     typedef std::input_iterator_tag iterator_category;
6683 
6684     class pointer {
6685       TemplateArgumentLoc Arg;
6686 
6687     public:
6688       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6689 
6690       const TemplateArgumentLoc *operator->() const {
6691         return &Arg;
6692       }
6693     };
6694 
6695 
6696     TemplateArgumentLocContainerIterator() {}
6697 
6698     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6699                                  unsigned Index)
6700       : Container(&Container), Index(Index) { }
6701 
6702     TemplateArgumentLocContainerIterator &operator++() {
6703       ++Index;
6704       return *this;
6705     }
6706 
6707     TemplateArgumentLocContainerIterator operator++(int) {
6708       TemplateArgumentLocContainerIterator Old(*this);
6709       ++(*this);
6710       return Old;
6711     }
6712 
6713     TemplateArgumentLoc operator*() const {
6714       return Container->getArgLoc(Index);
6715     }
6716 
6717     pointer operator->() const {
6718       return pointer(Container->getArgLoc(Index));
6719     }
6720 
6721     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6722                            const TemplateArgumentLocContainerIterator &Y) {
6723       return X.Container == Y.Container && X.Index == Y.Index;
6724     }
6725 
6726     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6727                            const TemplateArgumentLocContainerIterator &Y) {
6728       return !(X == Y);
6729     }
6730   };
6731 
6732 template<typename Derived>
6733 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6734                                                    AutoTypeLoc TL) {
6735   const AutoType *T = TL.getTypePtr();
6736   QualType OldDeduced = T->getDeducedType();
6737   QualType NewDeduced;
6738   if (!OldDeduced.isNull()) {
6739     NewDeduced = getDerived().TransformType(OldDeduced);
6740     if (NewDeduced.isNull())
6741       return QualType();
6742   }
6743 
6744   ConceptDecl *NewCD = nullptr;
6745   TemplateArgumentListInfo NewTemplateArgs;
6746   NestedNameSpecifierLoc NewNestedNameSpec;
6747   if (T->isConstrained()) {
6748     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6749         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6750 
6751     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6752     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6753     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6754     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6755                                                 ArgIterator(TL,
6756                                                             TL.getNumArgs()),
6757                                                 NewTemplateArgs))
6758       return QualType();
6759 
6760     if (TL.getNestedNameSpecifierLoc()) {
6761       NewNestedNameSpec
6762         = getDerived().TransformNestedNameSpecifierLoc(
6763             TL.getNestedNameSpecifierLoc());
6764       if (!NewNestedNameSpec)
6765         return QualType();
6766     }
6767   }
6768 
6769   QualType Result = TL.getType();
6770   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6771       T->isDependentType() || T->isConstrained()) {
6772     // FIXME: Maybe don't rebuild if all template arguments are the same.
6773     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6774     NewArgList.reserve(NewTemplateArgs.size());
6775     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6776       NewArgList.push_back(ArgLoc.getArgument());
6777     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6778                                           NewArgList);
6779     if (Result.isNull())
6780       return QualType();
6781   }
6782 
6783   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6784   NewTL.setNameLoc(TL.getNameLoc());
6785   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6786   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6787   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6788   NewTL.setFoundDecl(TL.getFoundDecl());
6789   NewTL.setLAngleLoc(TL.getLAngleLoc());
6790   NewTL.setRAngleLoc(TL.getRAngleLoc());
6791   NewTL.setRParenLoc(TL.getRParenLoc());
6792   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6793     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6794 
6795   return Result;
6796 }
6797 
6798 template <typename Derived>
6799 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6800                                                         TypeLocBuilder &TLB,
6801                                            TemplateSpecializationTypeLoc TL,
6802                                                       TemplateName Template) {
6803   TemplateArgumentListInfo NewTemplateArgs;
6804   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6805   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6806   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6807     ArgIterator;
6808   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6809                                               ArgIterator(TL, TL.getNumArgs()),
6810                                               NewTemplateArgs))
6811     return QualType();
6812 
6813   // FIXME: maybe don't rebuild if all the template arguments are the same.
6814 
6815   QualType Result =
6816     getDerived().RebuildTemplateSpecializationType(Template,
6817                                                    TL.getTemplateNameLoc(),
6818                                                    NewTemplateArgs);
6819 
6820   if (!Result.isNull()) {
6821     // Specializations of template template parameters are represented as
6822     // TemplateSpecializationTypes, and substitution of type alias templates
6823     // within a dependent context can transform them into
6824     // DependentTemplateSpecializationTypes.
6825     if (isa<DependentTemplateSpecializationType>(Result)) {
6826       DependentTemplateSpecializationTypeLoc NewTL
6827         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6828       NewTL.setElaboratedKeywordLoc(SourceLocation());
6829       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6830       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6831       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6832       NewTL.setLAngleLoc(TL.getLAngleLoc());
6833       NewTL.setRAngleLoc(TL.getRAngleLoc());
6834       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6835         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6836       return Result;
6837     }
6838 
6839     TemplateSpecializationTypeLoc NewTL
6840       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6841     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6842     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6843     NewTL.setLAngleLoc(TL.getLAngleLoc());
6844     NewTL.setRAngleLoc(TL.getRAngleLoc());
6845     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6846       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6847   }
6848 
6849   return Result;
6850 }
6851 
6852 template <typename Derived>
6853 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6854                                      TypeLocBuilder &TLB,
6855                                      DependentTemplateSpecializationTypeLoc TL,
6856                                      TemplateName Template,
6857                                      CXXScopeSpec &SS) {
6858   TemplateArgumentListInfo NewTemplateArgs;
6859   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6860   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6861   typedef TemplateArgumentLocContainerIterator<
6862             DependentTemplateSpecializationTypeLoc> ArgIterator;
6863   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6864                                               ArgIterator(TL, TL.getNumArgs()),
6865                                               NewTemplateArgs))
6866     return QualType();
6867 
6868   // FIXME: maybe don't rebuild if all the template arguments are the same.
6869 
6870   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6871     QualType Result = getSema().Context.getDependentTemplateSpecializationType(
6872         TL.getTypePtr()->getKeyword(), DTN->getQualifier(),
6873         DTN->getIdentifier(), NewTemplateArgs.arguments());
6874 
6875     DependentTemplateSpecializationTypeLoc NewTL
6876       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6877     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6878     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6879     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6880     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6881     NewTL.setLAngleLoc(TL.getLAngleLoc());
6882     NewTL.setRAngleLoc(TL.getRAngleLoc());
6883     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6884       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6885     return Result;
6886   }
6887 
6888   QualType Result
6889     = getDerived().RebuildTemplateSpecializationType(Template,
6890                                                      TL.getTemplateNameLoc(),
6891                                                      NewTemplateArgs);
6892 
6893   if (!Result.isNull()) {
6894     /// FIXME: Wrap this in an elaborated-type-specifier?
6895     TemplateSpecializationTypeLoc NewTL
6896       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6897     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6898     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6899     NewTL.setLAngleLoc(TL.getLAngleLoc());
6900     NewTL.setRAngleLoc(TL.getRAngleLoc());
6901     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6902       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6903   }
6904 
6905   return Result;
6906 }
6907 
6908 template<typename Derived>
6909 QualType
6910 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6911                                                 ElaboratedTypeLoc TL) {
6912   const ElaboratedType *T = TL.getTypePtr();
6913 
6914   NestedNameSpecifierLoc QualifierLoc;
6915   // NOTE: the qualifier in an ElaboratedType is optional.
6916   if (TL.getQualifierLoc()) {
6917     QualifierLoc
6918       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6919     if (!QualifierLoc)
6920       return QualType();
6921   }
6922 
6923   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6924   if (NamedT.isNull())
6925     return QualType();
6926 
6927   // C++0x [dcl.type.elab]p2:
6928   //   If the identifier resolves to a typedef-name or the simple-template-id
6929   //   resolves to an alias template specialization, the
6930   //   elaborated-type-specifier is ill-formed.
6931   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6932     if (const TemplateSpecializationType *TST =
6933           NamedT->getAs<TemplateSpecializationType>()) {
6934       TemplateName Template = TST->getTemplateName();
6935       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6936               Template.getAsTemplateDecl())) {
6937         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6938                      diag::err_tag_reference_non_tag)
6939             << TAT << Sema::NTK_TypeAliasTemplate
6940             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6941         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6942       }
6943     }
6944   }
6945 
6946   QualType Result = TL.getType();
6947   if (getDerived().AlwaysRebuild() ||
6948       QualifierLoc != TL.getQualifierLoc() ||
6949       NamedT != T->getNamedType()) {
6950     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6951                                                 T->getKeyword(),
6952                                                 QualifierLoc, NamedT);
6953     if (Result.isNull())
6954       return QualType();
6955   }
6956 
6957   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6958   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6959   NewTL.setQualifierLoc(QualifierLoc);
6960   return Result;
6961 }
6962 
6963 template<typename Derived>
6964 QualType TreeTransform<Derived>::TransformAttributedType(
6965                                                 TypeLocBuilder &TLB,
6966                                                 AttributedTypeLoc TL) {
6967   const AttributedType *oldType = TL.getTypePtr();
6968   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6969   if (modifiedType.isNull())
6970     return QualType();
6971 
6972   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6973   const Attr *oldAttr = TL.getAttr();
6974   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6975   if (oldAttr && !newAttr)
6976     return QualType();
6977 
6978   QualType result = TL.getType();
6979 
6980   // FIXME: dependent operand expressions?
6981   if (getDerived().AlwaysRebuild() ||
6982       modifiedType != oldType->getModifiedType()) {
6983     // TODO: this is really lame; we should really be rebuilding the
6984     // equivalent type from first principles.
6985     QualType equivalentType
6986       = getDerived().TransformType(oldType->getEquivalentType());
6987     if (equivalentType.isNull())
6988       return QualType();
6989 
6990     // Check whether we can add nullability; it is only represented as
6991     // type sugar, and therefore cannot be diagnosed in any other way.
6992     if (auto nullability = oldType->getImmediateNullability()) {
6993       if (!modifiedType->canHaveNullability()) {
6994         SemaRef.Diag(TL.getAttr()->getLocation(),
6995                      diag::err_nullability_nonpointer)
6996             << DiagNullabilityKind(*nullability, false) << modifiedType;
6997         return QualType();
6998       }
6999     }
7000 
7001     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
7002                                                modifiedType,
7003                                                equivalentType);
7004   }
7005 
7006   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
7007   newTL.setAttr(newAttr);
7008   return result;
7009 }
7010 
7011 template <typename Derived>
7012 QualType TreeTransform<Derived>::TransformBTFTagAttributedType(
7013     TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) {
7014   // The BTFTagAttributedType is available for C only.
7015   llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType");
7016 }
7017 
7018 template<typename Derived>
7019 QualType
7020 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
7021                                            ParenTypeLoc TL) {
7022   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7023   if (Inner.isNull())
7024     return QualType();
7025 
7026   QualType Result = TL.getType();
7027   if (getDerived().AlwaysRebuild() ||
7028       Inner != TL.getInnerLoc().getType()) {
7029     Result = getDerived().RebuildParenType(Inner);
7030     if (Result.isNull())
7031       return QualType();
7032   }
7033 
7034   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
7035   NewTL.setLParenLoc(TL.getLParenLoc());
7036   NewTL.setRParenLoc(TL.getRParenLoc());
7037   return Result;
7038 }
7039 
7040 template <typename Derived>
7041 QualType
7042 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
7043                                                     MacroQualifiedTypeLoc TL) {
7044   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
7045   if (Inner.isNull())
7046     return QualType();
7047 
7048   QualType Result = TL.getType();
7049   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
7050     Result =
7051         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
7052     if (Result.isNull())
7053       return QualType();
7054   }
7055 
7056   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
7057   NewTL.setExpansionLoc(TL.getExpansionLoc());
7058   return Result;
7059 }
7060 
7061 template<typename Derived>
7062 QualType TreeTransform<Derived>::TransformDependentNameType(
7063     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
7064   return TransformDependentNameType(TLB, TL, false);
7065 }
7066 
7067 template<typename Derived>
7068 QualType TreeTransform<Derived>::TransformDependentNameType(
7069     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
7070   const DependentNameType *T = TL.getTypePtr();
7071 
7072   NestedNameSpecifierLoc QualifierLoc
7073     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7074   if (!QualifierLoc)
7075     return QualType();
7076 
7077   QualType Result
7078     = getDerived().RebuildDependentNameType(T->getKeyword(),
7079                                             TL.getElaboratedKeywordLoc(),
7080                                             QualifierLoc,
7081                                             T->getIdentifier(),
7082                                             TL.getNameLoc(),
7083                                             DeducedTSTContext);
7084   if (Result.isNull())
7085     return QualType();
7086 
7087   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
7088     QualType NamedT = ElabT->getNamedType();
7089     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
7090 
7091     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7092     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7093     NewTL.setQualifierLoc(QualifierLoc);
7094   } else {
7095     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
7096     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7097     NewTL.setQualifierLoc(QualifierLoc);
7098     NewTL.setNameLoc(TL.getNameLoc());
7099   }
7100   return Result;
7101 }
7102 
7103 template<typename Derived>
7104 QualType TreeTransform<Derived>::
7105           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7106                                  DependentTemplateSpecializationTypeLoc TL) {
7107   NestedNameSpecifierLoc QualifierLoc;
7108   if (TL.getQualifierLoc()) {
7109     QualifierLoc
7110       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
7111     if (!QualifierLoc)
7112       return QualType();
7113   }
7114 
7115   return getDerived()
7116            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
7117 }
7118 
7119 template<typename Derived>
7120 QualType TreeTransform<Derived>::
7121 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
7122                                    DependentTemplateSpecializationTypeLoc TL,
7123                                        NestedNameSpecifierLoc QualifierLoc) {
7124   const DependentTemplateSpecializationType *T = TL.getTypePtr();
7125 
7126   TemplateArgumentListInfo NewTemplateArgs;
7127   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
7128   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
7129 
7130   typedef TemplateArgumentLocContainerIterator<
7131   DependentTemplateSpecializationTypeLoc> ArgIterator;
7132   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7133                                               ArgIterator(TL, TL.getNumArgs()),
7134                                               NewTemplateArgs))
7135     return QualType();
7136 
7137   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
7138       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
7139       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
7140       /*AllowInjectedClassName*/ false);
7141   if (Result.isNull())
7142     return QualType();
7143 
7144   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
7145     QualType NamedT = ElabT->getNamedType();
7146 
7147     // Copy information relevant to the template specialization.
7148     TemplateSpecializationTypeLoc NamedTL
7149       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
7150     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7151     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7152     NamedTL.setLAngleLoc(TL.getLAngleLoc());
7153     NamedTL.setRAngleLoc(TL.getRAngleLoc());
7154     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7155       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7156 
7157     // Copy information relevant to the elaborated type.
7158     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7159     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7160     NewTL.setQualifierLoc(QualifierLoc);
7161   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7162     DependentTemplateSpecializationTypeLoc SpecTL
7163       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7164     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7165     SpecTL.setQualifierLoc(QualifierLoc);
7166     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7167     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7168     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7169     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7170     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7171       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7172   } else {
7173     TemplateSpecializationTypeLoc SpecTL
7174       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7175     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7176     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7177     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7178     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7179     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7180       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7181   }
7182   return Result;
7183 }
7184 
7185 template<typename Derived>
7186 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7187                                                       PackExpansionTypeLoc TL) {
7188   QualType Pattern
7189     = getDerived().TransformType(TLB, TL.getPatternLoc());
7190   if (Pattern.isNull())
7191     return QualType();
7192 
7193   QualType Result = TL.getType();
7194   if (getDerived().AlwaysRebuild() ||
7195       Pattern != TL.getPatternLoc().getType()) {
7196     Result = getDerived().RebuildPackExpansionType(Pattern,
7197                                            TL.getPatternLoc().getSourceRange(),
7198                                                    TL.getEllipsisLoc(),
7199                                            TL.getTypePtr()->getNumExpansions());
7200     if (Result.isNull())
7201       return QualType();
7202   }
7203 
7204   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7205   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7206   return Result;
7207 }
7208 
7209 template<typename Derived>
7210 QualType
7211 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7212                                                    ObjCInterfaceTypeLoc TL) {
7213   // ObjCInterfaceType is never dependent.
7214   TLB.pushFullCopy(TL);
7215   return TL.getType();
7216 }
7217 
7218 template<typename Derived>
7219 QualType
7220 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7221                                                    ObjCTypeParamTypeLoc TL) {
7222   const ObjCTypeParamType *T = TL.getTypePtr();
7223   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7224       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7225   if (!OTP)
7226     return QualType();
7227 
7228   QualType Result = TL.getType();
7229   if (getDerived().AlwaysRebuild() ||
7230       OTP != T->getDecl()) {
7231     Result = getDerived().RebuildObjCTypeParamType(
7232         OTP, TL.getProtocolLAngleLoc(),
7233         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7234         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7235     if (Result.isNull())
7236       return QualType();
7237   }
7238 
7239   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7240   if (TL.getNumProtocols()) {
7241     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7242     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7243       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7244     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7245   }
7246   return Result;
7247 }
7248 
7249 template<typename Derived>
7250 QualType
7251 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7252                                                 ObjCObjectTypeLoc TL) {
7253   // Transform base type.
7254   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7255   if (BaseType.isNull())
7256     return QualType();
7257 
7258   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7259 
7260   // Transform type arguments.
7261   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7262   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7263     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7264     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7265     QualType TypeArg = TypeArgInfo->getType();
7266     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7267       AnyChanged = true;
7268 
7269       // We have a pack expansion. Instantiate it.
7270       const auto *PackExpansion = PackExpansionLoc.getType()
7271                                     ->castAs<PackExpansionType>();
7272       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7273       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7274                                               Unexpanded);
7275       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7276 
7277       // Determine whether the set of unexpanded parameter packs can
7278       // and should be expanded.
7279       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7280       bool Expand = false;
7281       bool RetainExpansion = false;
7282       std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7283       if (getDerived().TryExpandParameterPacks(
7284             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7285             Unexpanded, Expand, RetainExpansion, NumExpansions))
7286         return QualType();
7287 
7288       if (!Expand) {
7289         // We can't expand this pack expansion into separate arguments yet;
7290         // just substitute into the pattern and create a new pack expansion
7291         // type.
7292         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7293 
7294         TypeLocBuilder TypeArgBuilder;
7295         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7296         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7297                                                              PatternLoc);
7298         if (NewPatternType.isNull())
7299           return QualType();
7300 
7301         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7302                                       NewPatternType, NumExpansions);
7303         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7304         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7305         NewTypeArgInfos.push_back(
7306           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7307         continue;
7308       }
7309 
7310       // Substitute into the pack expansion pattern for each slice of the
7311       // pack.
7312       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7313         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7314 
7315         TypeLocBuilder TypeArgBuilder;
7316         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7317 
7318         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7319                                                          PatternLoc);
7320         if (NewTypeArg.isNull())
7321           return QualType();
7322 
7323         NewTypeArgInfos.push_back(
7324           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7325       }
7326 
7327       continue;
7328     }
7329 
7330     TypeLocBuilder TypeArgBuilder;
7331     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7332     QualType NewTypeArg =
7333         getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7334     if (NewTypeArg.isNull())
7335       return QualType();
7336 
7337     // If nothing changed, just keep the old TypeSourceInfo.
7338     if (NewTypeArg == TypeArg) {
7339       NewTypeArgInfos.push_back(TypeArgInfo);
7340       continue;
7341     }
7342 
7343     NewTypeArgInfos.push_back(
7344       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7345     AnyChanged = true;
7346   }
7347 
7348   QualType Result = TL.getType();
7349   if (getDerived().AlwaysRebuild() || AnyChanged) {
7350     // Rebuild the type.
7351     Result = getDerived().RebuildObjCObjectType(
7352         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7353         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7354         llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7355         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7356 
7357     if (Result.isNull())
7358       return QualType();
7359   }
7360 
7361   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7362   NewT.setHasBaseTypeAsWritten(true);
7363   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7364   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7365     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7366   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7367   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7368   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7369     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7370   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7371   return Result;
7372 }
7373 
7374 template<typename Derived>
7375 QualType
7376 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7377                                                ObjCObjectPointerTypeLoc TL) {
7378   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7379   if (PointeeType.isNull())
7380     return QualType();
7381 
7382   QualType Result = TL.getType();
7383   if (getDerived().AlwaysRebuild() ||
7384       PointeeType != TL.getPointeeLoc().getType()) {
7385     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7386                                                        TL.getStarLoc());
7387     if (Result.isNull())
7388       return QualType();
7389   }
7390 
7391   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7392   NewT.setStarLoc(TL.getStarLoc());
7393   return Result;
7394 }
7395 
7396 //===----------------------------------------------------------------------===//
7397 // Statement transformation
7398 //===----------------------------------------------------------------------===//
7399 template<typename Derived>
7400 StmtResult
7401 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7402   return S;
7403 }
7404 
7405 template<typename Derived>
7406 StmtResult
7407 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7408   return getDerived().TransformCompoundStmt(S, false);
7409 }
7410 
7411 template<typename Derived>
7412 StmtResult
7413 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7414                                               bool IsStmtExpr) {
7415   Sema::CompoundScopeRAII CompoundScope(getSema());
7416 
7417   const Stmt *ExprResult = S->getStmtExprResult();
7418   bool SubStmtInvalid = false;
7419   bool SubStmtChanged = false;
7420   SmallVector<Stmt*, 8> Statements;
7421   for (auto *B : S->body()) {
7422     StmtResult Result = getDerived().TransformStmt(
7423         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7424 
7425     if (Result.isInvalid()) {
7426       // Immediately fail if this was a DeclStmt, since it's very
7427       // likely that this will cause problems for future statements.
7428       if (isa<DeclStmt>(B))
7429         return StmtError();
7430 
7431       // Otherwise, just keep processing substatements and fail later.
7432       SubStmtInvalid = true;
7433       continue;
7434     }
7435 
7436     SubStmtChanged = SubStmtChanged || Result.get() != B;
7437     Statements.push_back(Result.getAs<Stmt>());
7438   }
7439 
7440   if (SubStmtInvalid)
7441     return StmtError();
7442 
7443   if (!getDerived().AlwaysRebuild() &&
7444       !SubStmtChanged)
7445     return S;
7446 
7447   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7448                                           Statements,
7449                                           S->getRBracLoc(),
7450                                           IsStmtExpr);
7451 }
7452 
7453 template<typename Derived>
7454 StmtResult
7455 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7456   ExprResult LHS, RHS;
7457   {
7458     EnterExpressionEvaluationContext Unevaluated(
7459         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7460 
7461     // Transform the left-hand case value.
7462     LHS = getDerived().TransformExpr(S->getLHS());
7463     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7464     if (LHS.isInvalid())
7465       return StmtError();
7466 
7467     // Transform the right-hand case value (for the GNU case-range extension).
7468     RHS = getDerived().TransformExpr(S->getRHS());
7469     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7470     if (RHS.isInvalid())
7471       return StmtError();
7472   }
7473 
7474   // Build the case statement.
7475   // Case statements are always rebuilt so that they will attached to their
7476   // transformed switch statement.
7477   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7478                                                        LHS.get(),
7479                                                        S->getEllipsisLoc(),
7480                                                        RHS.get(),
7481                                                        S->getColonLoc());
7482   if (Case.isInvalid())
7483     return StmtError();
7484 
7485   // Transform the statement following the case
7486   StmtResult SubStmt =
7487       getDerived().TransformStmt(S->getSubStmt());
7488   if (SubStmt.isInvalid())
7489     return StmtError();
7490 
7491   // Attach the body to the case statement
7492   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7493 }
7494 
7495 template <typename Derived>
7496 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7497   // Transform the statement following the default case
7498   StmtResult SubStmt =
7499       getDerived().TransformStmt(S->getSubStmt());
7500   if (SubStmt.isInvalid())
7501     return StmtError();
7502 
7503   // Default statements are always rebuilt
7504   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7505                                          SubStmt.get());
7506 }
7507 
7508 template<typename Derived>
7509 StmtResult
7510 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7511   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7512   if (SubStmt.isInvalid())
7513     return StmtError();
7514 
7515   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7516                                         S->getDecl());
7517   if (!LD)
7518     return StmtError();
7519 
7520   // If we're transforming "in-place" (we're not creating new local
7521   // declarations), assume we're replacing the old label statement
7522   // and clear out the reference to it.
7523   if (LD == S->getDecl())
7524     S->getDecl()->setStmt(nullptr);
7525 
7526   // FIXME: Pass the real colon location in.
7527   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7528                                        cast<LabelDecl>(LD), SourceLocation(),
7529                                        SubStmt.get());
7530 }
7531 
7532 template <typename Derived>
7533 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7534   if (!R)
7535     return R;
7536 
7537   switch (R->getKind()) {
7538 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7539 #define ATTR(X)
7540 #define PRAGMA_SPELLING_ATTR(X)                                                \
7541   case attr::X:                                                                \
7542     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7543 #include "clang/Basic/AttrList.inc"
7544   default:
7545     return R;
7546   }
7547 }
7548 
7549 template <typename Derived>
7550 StmtResult
7551 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7552                                                 StmtDiscardKind SDK) {
7553   bool AttrsChanged = false;
7554   SmallVector<const Attr *, 1> Attrs;
7555 
7556   // Visit attributes and keep track if any are transformed.
7557   for (const auto *I : S->getAttrs()) {
7558     const Attr *R = getDerived().TransformAttr(I);
7559     AttrsChanged |= (I != R);
7560     if (R)
7561       Attrs.push_back(R);
7562   }
7563 
7564   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7565   if (SubStmt.isInvalid())
7566     return StmtError();
7567 
7568   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7569     return S;
7570 
7571   // If transforming the attributes failed for all of the attributes in the
7572   // statement, don't make an AttributedStmt without attributes.
7573   if (Attrs.empty())
7574     return SubStmt;
7575 
7576   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7577                                             SubStmt.get());
7578 }
7579 
7580 template<typename Derived>
7581 StmtResult
7582 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7583   // Transform the initialization statement
7584   StmtResult Init = getDerived().TransformStmt(S->getInit());
7585   if (Init.isInvalid())
7586     return StmtError();
7587 
7588   Sema::ConditionResult Cond;
7589   if (!S->isConsteval()) {
7590     // Transform the condition
7591     Cond = getDerived().TransformCondition(
7592         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7593         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7594                          : Sema::ConditionKind::Boolean);
7595     if (Cond.isInvalid())
7596       return StmtError();
7597   }
7598 
7599   // If this is a constexpr if, determine which arm we should instantiate.
7600   std::optional<bool> ConstexprConditionValue;
7601   if (S->isConstexpr())
7602     ConstexprConditionValue = Cond.getKnownValue();
7603 
7604   // Transform the "then" branch.
7605   StmtResult Then;
7606   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7607     Then = getDerived().TransformStmt(S->getThen());
7608     if (Then.isInvalid())
7609       return StmtError();
7610   } else {
7611     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7612   }
7613 
7614   // Transform the "else" branch.
7615   StmtResult Else;
7616   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7617     Else = getDerived().TransformStmt(S->getElse());
7618     if (Else.isInvalid())
7619       return StmtError();
7620   }
7621 
7622   if (!getDerived().AlwaysRebuild() &&
7623       Init.get() == S->getInit() &&
7624       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7625       Then.get() == S->getThen() &&
7626       Else.get() == S->getElse())
7627     return S;
7628 
7629   return getDerived().RebuildIfStmt(
7630       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7631       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7632 }
7633 
7634 template<typename Derived>
7635 StmtResult
7636 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7637   // Transform the initialization statement
7638   StmtResult Init = getDerived().TransformStmt(S->getInit());
7639   if (Init.isInvalid())
7640     return StmtError();
7641 
7642   // Transform the condition.
7643   Sema::ConditionResult Cond = getDerived().TransformCondition(
7644       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7645       Sema::ConditionKind::Switch);
7646   if (Cond.isInvalid())
7647     return StmtError();
7648 
7649   // Rebuild the switch statement.
7650   StmtResult Switch =
7651       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7652                                           Init.get(), Cond, S->getRParenLoc());
7653   if (Switch.isInvalid())
7654     return StmtError();
7655 
7656   // Transform the body of the switch statement.
7657   StmtResult Body = getDerived().TransformStmt(S->getBody());
7658   if (Body.isInvalid())
7659     return StmtError();
7660 
7661   // Complete the switch statement.
7662   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7663                                             Body.get());
7664 }
7665 
7666 template<typename Derived>
7667 StmtResult
7668 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7669   // Transform the condition
7670   Sema::ConditionResult Cond = getDerived().TransformCondition(
7671       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7672       Sema::ConditionKind::Boolean);
7673   if (Cond.isInvalid())
7674     return StmtError();
7675 
7676   // Transform the body
7677   StmtResult Body = getDerived().TransformStmt(S->getBody());
7678   if (Body.isInvalid())
7679     return StmtError();
7680 
7681   if (!getDerived().AlwaysRebuild() &&
7682       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7683       Body.get() == S->getBody())
7684     return Owned(S);
7685 
7686   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7687                                        Cond, S->getRParenLoc(), Body.get());
7688 }
7689 
7690 template<typename Derived>
7691 StmtResult
7692 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7693   // Transform the body
7694   StmtResult Body = getDerived().TransformStmt(S->getBody());
7695   if (Body.isInvalid())
7696     return StmtError();
7697 
7698   // Transform the condition
7699   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7700   if (Cond.isInvalid())
7701     return StmtError();
7702 
7703   if (!getDerived().AlwaysRebuild() &&
7704       Cond.get() == S->getCond() &&
7705       Body.get() == S->getBody())
7706     return S;
7707 
7708   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7709                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7710                                     S->getRParenLoc());
7711 }
7712 
7713 template<typename Derived>
7714 StmtResult
7715 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7716   if (getSema().getLangOpts().OpenMP)
7717     getSema().startOpenMPLoop();
7718 
7719   // Transform the initialization statement
7720   StmtResult Init = getDerived().TransformStmt(S->getInit());
7721   if (Init.isInvalid())
7722     return StmtError();
7723 
7724   // In OpenMP loop region loop control variable must be captured and be
7725   // private. Perform analysis of first part (if any).
7726   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7727     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7728 
7729   // Transform the condition
7730   Sema::ConditionResult Cond = getDerived().TransformCondition(
7731       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7732       Sema::ConditionKind::Boolean);
7733   if (Cond.isInvalid())
7734     return StmtError();
7735 
7736   // Transform the increment
7737   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7738   if (Inc.isInvalid())
7739     return StmtError();
7740 
7741   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7742   if (S->getInc() && !FullInc.get())
7743     return StmtError();
7744 
7745   // Transform the body
7746   StmtResult Body = getDerived().TransformStmt(S->getBody());
7747   if (Body.isInvalid())
7748     return StmtError();
7749 
7750   if (!getDerived().AlwaysRebuild() &&
7751       Init.get() == S->getInit() &&
7752       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7753       Inc.get() == S->getInc() &&
7754       Body.get() == S->getBody())
7755     return S;
7756 
7757   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7758                                      Init.get(), Cond, FullInc,
7759                                      S->getRParenLoc(), Body.get());
7760 }
7761 
7762 template<typename Derived>
7763 StmtResult
7764 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7765   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7766                                         S->getLabel());
7767   if (!LD)
7768     return StmtError();
7769 
7770   // Goto statements must always be rebuilt, to resolve the label.
7771   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7772                                       cast<LabelDecl>(LD));
7773 }
7774 
7775 template<typename Derived>
7776 StmtResult
7777 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7778   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7779   if (Target.isInvalid())
7780     return StmtError();
7781   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7782 
7783   if (!getDerived().AlwaysRebuild() &&
7784       Target.get() == S->getTarget())
7785     return S;
7786 
7787   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7788                                               Target.get());
7789 }
7790 
7791 template<typename Derived>
7792 StmtResult
7793 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7794   return S;
7795 }
7796 
7797 template<typename Derived>
7798 StmtResult
7799 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7800   return S;
7801 }
7802 
7803 template<typename Derived>
7804 StmtResult
7805 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7806   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7807                                                         /*NotCopyInit*/false);
7808   if (Result.isInvalid())
7809     return StmtError();
7810 
7811   // FIXME: We always rebuild the return statement because there is no way
7812   // to tell whether the return type of the function has changed.
7813   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7814 }
7815 
7816 template<typename Derived>
7817 StmtResult
7818 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7819   bool DeclChanged = false;
7820   SmallVector<Decl *, 4> Decls;
7821   for (auto *D : S->decls()) {
7822     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7823     if (!Transformed)
7824       return StmtError();
7825 
7826     if (Transformed != D)
7827       DeclChanged = true;
7828 
7829     Decls.push_back(Transformed);
7830   }
7831 
7832   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7833     return S;
7834 
7835   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7836 }
7837 
7838 template<typename Derived>
7839 StmtResult
7840 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7841 
7842   SmallVector<Expr*, 8> Constraints;
7843   SmallVector<Expr*, 8> Exprs;
7844   SmallVector<IdentifierInfo *, 4> Names;
7845 
7846   ExprResult AsmString;
7847   SmallVector<Expr*, 8> Clobbers;
7848 
7849   bool ExprsChanged = false;
7850 
7851   // Go through the outputs.
7852   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7853     Names.push_back(S->getOutputIdentifier(I));
7854 
7855     // No need to transform the constraint literal.
7856     Constraints.push_back(S->getOutputConstraintLiteral(I));
7857 
7858     // Transform the output expr.
7859     Expr *OutputExpr = S->getOutputExpr(I);
7860     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7861     if (Result.isInvalid())
7862       return StmtError();
7863 
7864     ExprsChanged |= Result.get() != OutputExpr;
7865 
7866     Exprs.push_back(Result.get());
7867   }
7868 
7869   // Go through the inputs.
7870   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7871     Names.push_back(S->getInputIdentifier(I));
7872 
7873     // No need to transform the constraint literal.
7874     Constraints.push_back(S->getInputConstraintLiteral(I));
7875 
7876     // Transform the input expr.
7877     Expr *InputExpr = S->getInputExpr(I);
7878     ExprResult Result = getDerived().TransformExpr(InputExpr);
7879     if (Result.isInvalid())
7880       return StmtError();
7881 
7882     ExprsChanged |= Result.get() != InputExpr;
7883 
7884     Exprs.push_back(Result.get());
7885   }
7886 
7887   // Go through the Labels.
7888   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7889     Names.push_back(S->getLabelIdentifier(I));
7890 
7891     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7892     if (Result.isInvalid())
7893       return StmtError();
7894     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7895     Exprs.push_back(Result.get());
7896   }
7897   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7898     return S;
7899 
7900   // Go through the clobbers.
7901   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7902     Clobbers.push_back(S->getClobberStringLiteral(I));
7903 
7904   // No need to transform the asm string literal.
7905   AsmString = S->getAsmString();
7906   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7907                                         S->isVolatile(), S->getNumOutputs(),
7908                                         S->getNumInputs(), Names.data(),
7909                                         Constraints, Exprs, AsmString.get(),
7910                                         Clobbers, S->getNumLabels(),
7911                                         S->getRParenLoc());
7912 }
7913 
7914 template<typename Derived>
7915 StmtResult
7916 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7917   ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks());
7918 
7919   bool HadError = false, HadChange = false;
7920 
7921   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7922   SmallVector<Expr*, 8> TransformedExprs;
7923   TransformedExprs.reserve(SrcExprs.size());
7924   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7925     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7926     if (!Result.isUsable()) {
7927       HadError = true;
7928     } else {
7929       HadChange |= (Result.get() != SrcExprs[i]);
7930       TransformedExprs.push_back(Result.get());
7931     }
7932   }
7933 
7934   if (HadError) return StmtError();
7935   if (!HadChange && !getDerived().AlwaysRebuild())
7936     return Owned(S);
7937 
7938   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7939                                        AsmToks, S->getAsmString(),
7940                                        S->getNumOutputs(), S->getNumInputs(),
7941                                        S->getAllConstraints(), S->getClobbers(),
7942                                        TransformedExprs, S->getEndLoc());
7943 }
7944 
7945 // C++ Coroutines TS
7946 
7947 template<typename Derived>
7948 StmtResult
7949 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7950   auto *ScopeInfo = SemaRef.getCurFunction();
7951   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7952   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7953          ScopeInfo->NeedsCoroutineSuspends &&
7954          ScopeInfo->CoroutineSuspends.first == nullptr &&
7955          ScopeInfo->CoroutineSuspends.second == nullptr &&
7956          "expected clean scope info");
7957 
7958   // Set that we have (possibly-invalid) suspend points before we do anything
7959   // that may fail.
7960   ScopeInfo->setNeedsCoroutineSuspends(false);
7961 
7962   // We re-build the coroutine promise object (and the coroutine parameters its
7963   // type and constructor depend on) based on the types used in our current
7964   // function. We must do so, and set it on the current FunctionScopeInfo,
7965   // before attempting to transform the other parts of the coroutine body
7966   // statement, such as the implicit suspend statements (because those
7967   // statements reference the FunctionScopeInfo::CoroutinePromise).
7968   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7969     return StmtError();
7970   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7971   if (!Promise)
7972     return StmtError();
7973   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7974   ScopeInfo->CoroutinePromise = Promise;
7975 
7976   // Transform the implicit coroutine statements constructed using dependent
7977   // types during the previous parse: initial and final suspensions, the return
7978   // object, and others. We also transform the coroutine function's body.
7979   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7980   if (InitSuspend.isInvalid())
7981     return StmtError();
7982   StmtResult FinalSuspend =
7983       getDerived().TransformStmt(S->getFinalSuspendStmt());
7984   if (FinalSuspend.isInvalid() ||
7985       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7986     return StmtError();
7987   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7988   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7989 
7990   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7991   if (BodyRes.isInvalid())
7992     return StmtError();
7993 
7994   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7995   if (Builder.isInvalid())
7996     return StmtError();
7997 
7998   Expr *ReturnObject = S->getReturnValueInit();
7999   assert(ReturnObject && "the return object is expected to be valid");
8000   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
8001                                                      /*NoCopyInit*/ false);
8002   if (Res.isInvalid())
8003     return StmtError();
8004   Builder.ReturnValue = Res.get();
8005 
8006   // If during the previous parse the coroutine still had a dependent promise
8007   // statement, we may need to build some implicit coroutine statements
8008   // (such as exception and fallthrough handlers) for the first time.
8009   if (S->hasDependentPromiseType()) {
8010     // We can only build these statements, however, if the current promise type
8011     // is not dependent.
8012     if (!Promise->getType()->isDependentType()) {
8013       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
8014              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
8015              "these nodes should not have been built yet");
8016       if (!Builder.buildDependentStatements())
8017         return StmtError();
8018     }
8019   } else {
8020     if (auto *OnFallthrough = S->getFallthroughHandler()) {
8021       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
8022       if (Res.isInvalid())
8023         return StmtError();
8024       Builder.OnFallthrough = Res.get();
8025     }
8026 
8027     if (auto *OnException = S->getExceptionHandler()) {
8028       StmtResult Res = getDerived().TransformStmt(OnException);
8029       if (Res.isInvalid())
8030         return StmtError();
8031       Builder.OnException = Res.get();
8032     }
8033 
8034     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
8035       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
8036       if (Res.isInvalid())
8037         return StmtError();
8038       Builder.ReturnStmtOnAllocFailure = Res.get();
8039     }
8040 
8041     // Transform any additional statements we may have already built
8042     assert(S->getAllocate() && S->getDeallocate() &&
8043            "allocation and deallocation calls must already be built");
8044     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
8045     if (AllocRes.isInvalid())
8046       return StmtError();
8047     Builder.Allocate = AllocRes.get();
8048 
8049     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
8050     if (DeallocRes.isInvalid())
8051       return StmtError();
8052     Builder.Deallocate = DeallocRes.get();
8053 
8054     if (auto *ReturnStmt = S->getReturnStmt()) {
8055       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
8056       if (Res.isInvalid())
8057         return StmtError();
8058       Builder.ReturnStmt = Res.get();
8059     }
8060   }
8061 
8062   return getDerived().RebuildCoroutineBodyStmt(Builder);
8063 }
8064 
8065 template<typename Derived>
8066 StmtResult
8067 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
8068   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
8069                                                         /*NotCopyInit*/false);
8070   if (Result.isInvalid())
8071     return StmtError();
8072 
8073   // Always rebuild; we don't know if this needs to be injected into a new
8074   // context or if the promise type has changed.
8075   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
8076                                           S->isImplicit());
8077 }
8078 
8079 template <typename Derived>
8080 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
8081   ExprResult Operand = getDerived().TransformInitializer(E->getOperand(),
8082                                                          /*NotCopyInit*/ false);
8083   if (Operand.isInvalid())
8084     return ExprError();
8085 
8086   // Rebuild the common-expr from the operand rather than transforming it
8087   // separately.
8088 
8089   // FIXME: getCurScope() should not be used during template instantiation.
8090   // We should pick up the set of unqualified lookup results for operator
8091   // co_await during the initial parse.
8092   ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr(
8093       getSema().getCurScope(), E->getKeywordLoc());
8094 
8095   // Always rebuild; we don't know if this needs to be injected into a new
8096   // context or if the promise type has changed.
8097   return getDerived().RebuildCoawaitExpr(
8098       E->getKeywordLoc(), Operand.get(),
8099       cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit());
8100 }
8101 
8102 template <typename Derived>
8103 ExprResult
8104 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
8105   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
8106                                                         /*NotCopyInit*/ false);
8107   if (OperandResult.isInvalid())
8108     return ExprError();
8109 
8110   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
8111           E->getOperatorCoawaitLookup());
8112 
8113   if (LookupResult.isInvalid())
8114     return ExprError();
8115 
8116   // Always rebuild; we don't know if this needs to be injected into a new
8117   // context or if the promise type has changed.
8118   return getDerived().RebuildDependentCoawaitExpr(
8119       E->getKeywordLoc(), OperandResult.get(),
8120       cast<UnresolvedLookupExpr>(LookupResult.get()));
8121 }
8122 
8123 template<typename Derived>
8124 ExprResult
8125 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
8126   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
8127                                                         /*NotCopyInit*/false);
8128   if (Result.isInvalid())
8129     return ExprError();
8130 
8131   // Always rebuild; we don't know if this needs to be injected into a new
8132   // context or if the promise type has changed.
8133   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
8134 }
8135 
8136 // Objective-C Statements.
8137 
8138 template<typename Derived>
8139 StmtResult
8140 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
8141   // Transform the body of the @try.
8142   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
8143   if (TryBody.isInvalid())
8144     return StmtError();
8145 
8146   // Transform the @catch statements (if present).
8147   bool AnyCatchChanged = false;
8148   SmallVector<Stmt*, 8> CatchStmts;
8149   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
8150     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
8151     if (Catch.isInvalid())
8152       return StmtError();
8153     if (Catch.get() != S->getCatchStmt(I))
8154       AnyCatchChanged = true;
8155     CatchStmts.push_back(Catch.get());
8156   }
8157 
8158   // Transform the @finally statement (if present).
8159   StmtResult Finally;
8160   if (S->getFinallyStmt()) {
8161     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8162     if (Finally.isInvalid())
8163       return StmtError();
8164   }
8165 
8166   // If nothing changed, just retain this statement.
8167   if (!getDerived().AlwaysRebuild() &&
8168       TryBody.get() == S->getTryBody() &&
8169       !AnyCatchChanged &&
8170       Finally.get() == S->getFinallyStmt())
8171     return S;
8172 
8173   // Build a new statement.
8174   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8175                                            CatchStmts, Finally.get());
8176 }
8177 
8178 template<typename Derived>
8179 StmtResult
8180 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8181   // Transform the @catch parameter, if there is one.
8182   VarDecl *Var = nullptr;
8183   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8184     TypeSourceInfo *TSInfo = nullptr;
8185     if (FromVar->getTypeSourceInfo()) {
8186       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8187       if (!TSInfo)
8188         return StmtError();
8189     }
8190 
8191     QualType T;
8192     if (TSInfo)
8193       T = TSInfo->getType();
8194     else {
8195       T = getDerived().TransformType(FromVar->getType());
8196       if (T.isNull())
8197         return StmtError();
8198     }
8199 
8200     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8201     if (!Var)
8202       return StmtError();
8203   }
8204 
8205   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8206   if (Body.isInvalid())
8207     return StmtError();
8208 
8209   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8210                                              S->getRParenLoc(),
8211                                              Var, Body.get());
8212 }
8213 
8214 template<typename Derived>
8215 StmtResult
8216 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8217   // Transform the body.
8218   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8219   if (Body.isInvalid())
8220     return StmtError();
8221 
8222   // If nothing changed, just retain this statement.
8223   if (!getDerived().AlwaysRebuild() &&
8224       Body.get() == S->getFinallyBody())
8225     return S;
8226 
8227   // Build a new statement.
8228   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8229                                                Body.get());
8230 }
8231 
8232 template<typename Derived>
8233 StmtResult
8234 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8235   ExprResult Operand;
8236   if (S->getThrowExpr()) {
8237     Operand = getDerived().TransformExpr(S->getThrowExpr());
8238     if (Operand.isInvalid())
8239       return StmtError();
8240   }
8241 
8242   if (!getDerived().AlwaysRebuild() &&
8243       Operand.get() == S->getThrowExpr())
8244     return S;
8245 
8246   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8247 }
8248 
8249 template<typename Derived>
8250 StmtResult
8251 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8252                                                   ObjCAtSynchronizedStmt *S) {
8253   // Transform the object we are locking.
8254   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8255   if (Object.isInvalid())
8256     return StmtError();
8257   Object =
8258     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8259                                                   Object.get());
8260   if (Object.isInvalid())
8261     return StmtError();
8262 
8263   // Transform the body.
8264   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8265   if (Body.isInvalid())
8266     return StmtError();
8267 
8268   // If nothing change, just retain the current statement.
8269   if (!getDerived().AlwaysRebuild() &&
8270       Object.get() == S->getSynchExpr() &&
8271       Body.get() == S->getSynchBody())
8272     return S;
8273 
8274   // Build a new statement.
8275   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8276                                                     Object.get(), Body.get());
8277 }
8278 
8279 template<typename Derived>
8280 StmtResult
8281 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8282                                               ObjCAutoreleasePoolStmt *S) {
8283   // Transform the body.
8284   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8285   if (Body.isInvalid())
8286     return StmtError();
8287 
8288   // If nothing changed, just retain this statement.
8289   if (!getDerived().AlwaysRebuild() &&
8290       Body.get() == S->getSubStmt())
8291     return S;
8292 
8293   // Build a new statement.
8294   return getDerived().RebuildObjCAutoreleasePoolStmt(
8295                         S->getAtLoc(), Body.get());
8296 }
8297 
8298 template<typename Derived>
8299 StmtResult
8300 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8301                                                   ObjCForCollectionStmt *S) {
8302   // Transform the element statement.
8303   StmtResult Element =
8304       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8305   if (Element.isInvalid())
8306     return StmtError();
8307 
8308   // Transform the collection expression.
8309   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8310   if (Collection.isInvalid())
8311     return StmtError();
8312 
8313   // Transform the body.
8314   StmtResult Body = getDerived().TransformStmt(S->getBody());
8315   if (Body.isInvalid())
8316     return StmtError();
8317 
8318   // If nothing changed, just retain this statement.
8319   if (!getDerived().AlwaysRebuild() &&
8320       Element.get() == S->getElement() &&
8321       Collection.get() == S->getCollection() &&
8322       Body.get() == S->getBody())
8323     return S;
8324 
8325   // Build a new statement.
8326   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8327                                                    Element.get(),
8328                                                    Collection.get(),
8329                                                    S->getRParenLoc(),
8330                                                    Body.get());
8331 }
8332 
8333 template <typename Derived>
8334 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8335   // Transform the exception declaration, if any.
8336   VarDecl *Var = nullptr;
8337   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8338     TypeSourceInfo *T =
8339         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8340     if (!T)
8341       return StmtError();
8342 
8343     Var = getDerived().RebuildExceptionDecl(
8344         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8345         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8346     if (!Var || Var->isInvalidDecl())
8347       return StmtError();
8348   }
8349 
8350   // Transform the actual exception handler.
8351   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8352   if (Handler.isInvalid())
8353     return StmtError();
8354 
8355   if (!getDerived().AlwaysRebuild() && !Var &&
8356       Handler.get() == S->getHandlerBlock())
8357     return S;
8358 
8359   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8360 }
8361 
8362 template <typename Derived>
8363 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8364   // Transform the try block itself.
8365   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8366   if (TryBlock.isInvalid())
8367     return StmtError();
8368 
8369   // Transform the handlers.
8370   bool HandlerChanged = false;
8371   SmallVector<Stmt *, 8> Handlers;
8372   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8373     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8374     if (Handler.isInvalid())
8375       return StmtError();
8376 
8377     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8378     Handlers.push_back(Handler.getAs<Stmt>());
8379   }
8380 
8381   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8382       !HandlerChanged)
8383     return S;
8384 
8385   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8386                                         Handlers);
8387 }
8388 
8389 template<typename Derived>
8390 StmtResult
8391 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8392   StmtResult Init =
8393       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8394   if (Init.isInvalid())
8395     return StmtError();
8396 
8397   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8398   if (Range.isInvalid())
8399     return StmtError();
8400 
8401   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8402   if (Begin.isInvalid())
8403     return StmtError();
8404   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8405   if (End.isInvalid())
8406     return StmtError();
8407 
8408   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8409   if (Cond.isInvalid())
8410     return StmtError();
8411   if (Cond.get())
8412     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8413   if (Cond.isInvalid())
8414     return StmtError();
8415   if (Cond.get())
8416     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8417 
8418   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8419   if (Inc.isInvalid())
8420     return StmtError();
8421   if (Inc.get())
8422     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8423 
8424   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8425   if (LoopVar.isInvalid())
8426     return StmtError();
8427 
8428   StmtResult NewStmt = S;
8429   if (getDerived().AlwaysRebuild() ||
8430       Init.get() != S->getInit() ||
8431       Range.get() != S->getRangeStmt() ||
8432       Begin.get() != S->getBeginStmt() ||
8433       End.get() != S->getEndStmt() ||
8434       Cond.get() != S->getCond() ||
8435       Inc.get() != S->getInc() ||
8436       LoopVar.get() != S->getLoopVarStmt()) {
8437     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8438                                                   S->getCoawaitLoc(), Init.get(),
8439                                                   S->getColonLoc(), Range.get(),
8440                                                   Begin.get(), End.get(),
8441                                                   Cond.get(),
8442                                                   Inc.get(), LoopVar.get(),
8443                                                   S->getRParenLoc());
8444     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8445       // Might not have attached any initializer to the loop variable.
8446       getSema().ActOnInitializerError(
8447           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8448       return StmtError();
8449     }
8450   }
8451 
8452   StmtResult Body = getDerived().TransformStmt(S->getBody());
8453   if (Body.isInvalid())
8454     return StmtError();
8455 
8456   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8457   // it now so we have a new statement to attach the body to.
8458   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8459     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8460                                                   S->getCoawaitLoc(), Init.get(),
8461                                                   S->getColonLoc(), Range.get(),
8462                                                   Begin.get(), End.get(),
8463                                                   Cond.get(),
8464                                                   Inc.get(), LoopVar.get(),
8465                                                   S->getRParenLoc());
8466     if (NewStmt.isInvalid())
8467       return StmtError();
8468   }
8469 
8470   if (NewStmt.get() == S)
8471     return S;
8472 
8473   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8474 }
8475 
8476 template<typename Derived>
8477 StmtResult
8478 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8479                                                     MSDependentExistsStmt *S) {
8480   // Transform the nested-name-specifier, if any.
8481   NestedNameSpecifierLoc QualifierLoc;
8482   if (S->getQualifierLoc()) {
8483     QualifierLoc
8484       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8485     if (!QualifierLoc)
8486       return StmtError();
8487   }
8488 
8489   // Transform the declaration name.
8490   DeclarationNameInfo NameInfo = S->getNameInfo();
8491   if (NameInfo.getName()) {
8492     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8493     if (!NameInfo.getName())
8494       return StmtError();
8495   }
8496 
8497   // Check whether anything changed.
8498   if (!getDerived().AlwaysRebuild() &&
8499       QualifierLoc == S->getQualifierLoc() &&
8500       NameInfo.getName() == S->getNameInfo().getName())
8501     return S;
8502 
8503   // Determine whether this name exists, if we can.
8504   CXXScopeSpec SS;
8505   SS.Adopt(QualifierLoc);
8506   bool Dependent = false;
8507   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8508   case Sema::IER_Exists:
8509     if (S->isIfExists())
8510       break;
8511 
8512     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8513 
8514   case Sema::IER_DoesNotExist:
8515     if (S->isIfNotExists())
8516       break;
8517 
8518     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8519 
8520   case Sema::IER_Dependent:
8521     Dependent = true;
8522     break;
8523 
8524   case Sema::IER_Error:
8525     return StmtError();
8526   }
8527 
8528   // We need to continue with the instantiation, so do so now.
8529   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8530   if (SubStmt.isInvalid())
8531     return StmtError();
8532 
8533   // If we have resolved the name, just transform to the substatement.
8534   if (!Dependent)
8535     return SubStmt;
8536 
8537   // The name is still dependent, so build a dependent expression again.
8538   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8539                                                    S->isIfExists(),
8540                                                    QualifierLoc,
8541                                                    NameInfo,
8542                                                    SubStmt.get());
8543 }
8544 
8545 template<typename Derived>
8546 ExprResult
8547 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8548   NestedNameSpecifierLoc QualifierLoc;
8549   if (E->getQualifierLoc()) {
8550     QualifierLoc
8551     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8552     if (!QualifierLoc)
8553       return ExprError();
8554   }
8555 
8556   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8557     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8558   if (!PD)
8559     return ExprError();
8560 
8561   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8562   if (Base.isInvalid())
8563     return ExprError();
8564 
8565   return new (SemaRef.getASTContext())
8566       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8567                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8568                         QualifierLoc, E->getMemberLoc());
8569 }
8570 
8571 template <typename Derived>
8572 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8573     MSPropertySubscriptExpr *E) {
8574   auto BaseRes = getDerived().TransformExpr(E->getBase());
8575   if (BaseRes.isInvalid())
8576     return ExprError();
8577   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8578   if (IdxRes.isInvalid())
8579     return ExprError();
8580 
8581   if (!getDerived().AlwaysRebuild() &&
8582       BaseRes.get() == E->getBase() &&
8583       IdxRes.get() == E->getIdx())
8584     return E;
8585 
8586   return getDerived().RebuildArraySubscriptExpr(
8587       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8588 }
8589 
8590 template <typename Derived>
8591 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8592   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8593   if (TryBlock.isInvalid())
8594     return StmtError();
8595 
8596   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8597   if (Handler.isInvalid())
8598     return StmtError();
8599 
8600   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8601       Handler.get() == S->getHandler())
8602     return S;
8603 
8604   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8605                                         TryBlock.get(), Handler.get());
8606 }
8607 
8608 template <typename Derived>
8609 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8610   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8611   if (Block.isInvalid())
8612     return StmtError();
8613 
8614   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8615 }
8616 
8617 template <typename Derived>
8618 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8619   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8620   if (FilterExpr.isInvalid())
8621     return StmtError();
8622 
8623   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8624   if (Block.isInvalid())
8625     return StmtError();
8626 
8627   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8628                                            Block.get());
8629 }
8630 
8631 template <typename Derived>
8632 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8633   if (isa<SEHFinallyStmt>(Handler))
8634     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8635   else
8636     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8637 }
8638 
8639 template<typename Derived>
8640 StmtResult
8641 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8642   return S;
8643 }
8644 
8645 //===----------------------------------------------------------------------===//
8646 // OpenMP directive transformation
8647 //===----------------------------------------------------------------------===//
8648 
8649 template <typename Derived>
8650 StmtResult
8651 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8652   // OMPCanonicalLoops are eliminated during transformation, since they will be
8653   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8654   // after transformation.
8655   return getDerived().TransformStmt(L->getLoopStmt());
8656 }
8657 
8658 template <typename Derived>
8659 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8660     OMPExecutableDirective *D) {
8661 
8662   // Transform the clauses
8663   llvm::SmallVector<OMPClause *, 16> TClauses;
8664   ArrayRef<OMPClause *> Clauses = D->clauses();
8665   TClauses.reserve(Clauses.size());
8666   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8667        I != E; ++I) {
8668     if (*I) {
8669       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8670       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8671       getDerived().getSema().EndOpenMPClause();
8672       if (Clause)
8673         TClauses.push_back(Clause);
8674     } else {
8675       TClauses.push_back(nullptr);
8676     }
8677   }
8678   StmtResult AssociatedStmt;
8679   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8680     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8681                                                   /*CurScope=*/nullptr);
8682     StmtResult Body;
8683     {
8684       Sema::CompoundScopeRAII CompoundScope(getSema());
8685       Stmt *CS;
8686       if (D->getDirectiveKind() == OMPD_atomic ||
8687           D->getDirectiveKind() == OMPD_critical ||
8688           D->getDirectiveKind() == OMPD_section ||
8689           D->getDirectiveKind() == OMPD_master)
8690         CS = D->getAssociatedStmt();
8691       else
8692         CS = D->getRawStmt();
8693       Body = getDerived().TransformStmt(CS);
8694       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8695           getSema().getLangOpts().OpenMPIRBuilder)
8696         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8697     }
8698     AssociatedStmt =
8699         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8700     if (AssociatedStmt.isInvalid()) {
8701       return StmtError();
8702     }
8703   }
8704   if (TClauses.size() != Clauses.size()) {
8705     return StmtError();
8706   }
8707 
8708   // Transform directive name for 'omp critical' directive.
8709   DeclarationNameInfo DirName;
8710   if (D->getDirectiveKind() == OMPD_critical) {
8711     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8712     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8713   }
8714   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8715   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8716     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8717   } else if (D->getDirectiveKind() == OMPD_cancel) {
8718     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8719   }
8720 
8721   return getDerived().RebuildOMPExecutableDirective(
8722       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8723       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8724 }
8725 
8726 template <typename Derived>
8727 StmtResult
8728 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8729   // TODO: Fix This
8730   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8731       << getOpenMPDirectiveName(D->getDirectiveKind());
8732   return StmtError();
8733 }
8734 
8735 template <typename Derived>
8736 StmtResult
8737 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8738   DeclarationNameInfo DirName;
8739   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8740                                              D->getBeginLoc());
8741   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8742   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8743   return Res;
8744 }
8745 
8746 template <typename Derived>
8747 StmtResult
8748 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8749   DeclarationNameInfo DirName;
8750   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8751                                              D->getBeginLoc());
8752   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8753   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8754   return Res;
8755 }
8756 
8757 template <typename Derived>
8758 StmtResult
8759 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8760   DeclarationNameInfo DirName;
8761   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8762                                              nullptr, D->getBeginLoc());
8763   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8764   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8765   return Res;
8766 }
8767 
8768 template <typename Derived>
8769 StmtResult
8770 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8771   DeclarationNameInfo DirName;
8772   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8773                                              nullptr, D->getBeginLoc());
8774   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8775   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8776   return Res;
8777 }
8778 
8779 template <typename Derived>
8780 StmtResult
8781 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8782   DeclarationNameInfo DirName;
8783   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8784                                              D->getBeginLoc());
8785   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8786   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8787   return Res;
8788 }
8789 
8790 template <typename Derived>
8791 StmtResult
8792 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8793   DeclarationNameInfo DirName;
8794   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8795                                              D->getBeginLoc());
8796   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8797   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8798   return Res;
8799 }
8800 
8801 template <typename Derived>
8802 StmtResult
8803 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8804   DeclarationNameInfo DirName;
8805   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8806                                              D->getBeginLoc());
8807   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8808   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8809   return Res;
8810 }
8811 
8812 template <typename Derived>
8813 StmtResult
8814 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8815   DeclarationNameInfo DirName;
8816   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8817                                              D->getBeginLoc());
8818   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8819   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8820   return Res;
8821 }
8822 
8823 template <typename Derived>
8824 StmtResult
8825 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8826   DeclarationNameInfo DirName;
8827   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8828                                              D->getBeginLoc());
8829   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8830   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8831   return Res;
8832 }
8833 
8834 template <typename Derived>
8835 StmtResult
8836 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8837   DeclarationNameInfo DirName;
8838   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8839                                              D->getBeginLoc());
8840   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8841   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8842   return Res;
8843 }
8844 
8845 template <typename Derived>
8846 StmtResult
8847 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8848   getDerived().getSema().StartOpenMPDSABlock(
8849       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8850   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8851   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8852   return Res;
8853 }
8854 
8855 template <typename Derived>
8856 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8857     OMPParallelForDirective *D) {
8858   DeclarationNameInfo DirName;
8859   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8860                                              nullptr, D->getBeginLoc());
8861   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8862   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8863   return Res;
8864 }
8865 
8866 template <typename Derived>
8867 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8868     OMPParallelForSimdDirective *D) {
8869   DeclarationNameInfo DirName;
8870   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8871                                              nullptr, D->getBeginLoc());
8872   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8873   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8874   return Res;
8875 }
8876 
8877 template <typename Derived>
8878 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8879     OMPParallelMasterDirective *D) {
8880   DeclarationNameInfo DirName;
8881   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8882                                              nullptr, D->getBeginLoc());
8883   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8884   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8885   return Res;
8886 }
8887 
8888 template <typename Derived>
8889 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective(
8890     OMPParallelMaskedDirective *D) {
8891   DeclarationNameInfo DirName;
8892   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName,
8893                                              nullptr, D->getBeginLoc());
8894   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8895   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8896   return Res;
8897 }
8898 
8899 template <typename Derived>
8900 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8901     OMPParallelSectionsDirective *D) {
8902   DeclarationNameInfo DirName;
8903   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8904                                              nullptr, D->getBeginLoc());
8905   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8906   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8907   return Res;
8908 }
8909 
8910 template <typename Derived>
8911 StmtResult
8912 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8913   DeclarationNameInfo DirName;
8914   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8915                                              D->getBeginLoc());
8916   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8917   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8918   return Res;
8919 }
8920 
8921 template <typename Derived>
8922 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8923     OMPTaskyieldDirective *D) {
8924   DeclarationNameInfo DirName;
8925   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8926                                              D->getBeginLoc());
8927   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8928   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8929   return Res;
8930 }
8931 
8932 template <typename Derived>
8933 StmtResult
8934 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8935   DeclarationNameInfo DirName;
8936   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8937                                              D->getBeginLoc());
8938   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8939   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8940   return Res;
8941 }
8942 
8943 template <typename Derived>
8944 StmtResult
8945 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8946   DeclarationNameInfo DirName;
8947   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8948                                              D->getBeginLoc());
8949   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8950   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8951   return Res;
8952 }
8953 
8954 template <typename Derived>
8955 StmtResult
8956 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) {
8957   DeclarationNameInfo DirName;
8958   getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr,
8959                                              D->getBeginLoc());
8960   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8961   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8962   return Res;
8963 }
8964 
8965 template <typename Derived>
8966 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8967     OMPTaskgroupDirective *D) {
8968   DeclarationNameInfo DirName;
8969   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8970                                              D->getBeginLoc());
8971   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8972   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8973   return Res;
8974 }
8975 
8976 template <typename Derived>
8977 StmtResult
8978 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8979   DeclarationNameInfo DirName;
8980   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8981                                              D->getBeginLoc());
8982   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8983   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8984   return Res;
8985 }
8986 
8987 template <typename Derived>
8988 StmtResult
8989 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8990   DeclarationNameInfo DirName;
8991   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8992                                              D->getBeginLoc());
8993   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8994   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8995   return Res;
8996 }
8997 
8998 template <typename Derived>
8999 StmtResult
9000 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
9001   DeclarationNameInfo DirName;
9002   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
9003                                              D->getBeginLoc());
9004   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9005   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9006   return Res;
9007 }
9008 
9009 template <typename Derived>
9010 StmtResult
9011 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
9012   DeclarationNameInfo DirName;
9013   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
9014                                              D->getBeginLoc());
9015   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9016   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9017   return Res;
9018 }
9019 
9020 template <typename Derived>
9021 StmtResult
9022 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
9023   DeclarationNameInfo DirName;
9024   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
9025                                              D->getBeginLoc());
9026   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9027   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9028   return Res;
9029 }
9030 
9031 template <typename Derived>
9032 StmtResult
9033 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
9034   DeclarationNameInfo DirName;
9035   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
9036                                              D->getBeginLoc());
9037   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9038   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9039   return Res;
9040 }
9041 
9042 template <typename Derived>
9043 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
9044     OMPTargetDataDirective *D) {
9045   DeclarationNameInfo DirName;
9046   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
9047                                              D->getBeginLoc());
9048   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9049   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9050   return Res;
9051 }
9052 
9053 template <typename Derived>
9054 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
9055     OMPTargetEnterDataDirective *D) {
9056   DeclarationNameInfo DirName;
9057   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
9058                                              nullptr, D->getBeginLoc());
9059   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9060   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9061   return Res;
9062 }
9063 
9064 template <typename Derived>
9065 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
9066     OMPTargetExitDataDirective *D) {
9067   DeclarationNameInfo DirName;
9068   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
9069                                              nullptr, D->getBeginLoc());
9070   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9071   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9072   return Res;
9073 }
9074 
9075 template <typename Derived>
9076 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
9077     OMPTargetParallelDirective *D) {
9078   DeclarationNameInfo DirName;
9079   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
9080                                              nullptr, D->getBeginLoc());
9081   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9082   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9083   return Res;
9084 }
9085 
9086 template <typename Derived>
9087 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
9088     OMPTargetParallelForDirective *D) {
9089   DeclarationNameInfo DirName;
9090   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
9091                                              nullptr, D->getBeginLoc());
9092   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9093   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9094   return Res;
9095 }
9096 
9097 template <typename Derived>
9098 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
9099     OMPTargetUpdateDirective *D) {
9100   DeclarationNameInfo DirName;
9101   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
9102                                              nullptr, D->getBeginLoc());
9103   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9104   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9105   return Res;
9106 }
9107 
9108 template <typename Derived>
9109 StmtResult
9110 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
9111   DeclarationNameInfo DirName;
9112   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
9113                                              D->getBeginLoc());
9114   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9115   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9116   return Res;
9117 }
9118 
9119 template <typename Derived>
9120 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
9121     OMPCancellationPointDirective *D) {
9122   DeclarationNameInfo DirName;
9123   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
9124                                              nullptr, D->getBeginLoc());
9125   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9126   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9127   return Res;
9128 }
9129 
9130 template <typename Derived>
9131 StmtResult
9132 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
9133   DeclarationNameInfo DirName;
9134   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
9135                                              D->getBeginLoc());
9136   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9137   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9138   return Res;
9139 }
9140 
9141 template <typename Derived>
9142 StmtResult
9143 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
9144   DeclarationNameInfo DirName;
9145   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
9146                                              D->getBeginLoc());
9147   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9148   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9149   return Res;
9150 }
9151 
9152 template <typename Derived>
9153 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
9154     OMPTaskLoopSimdDirective *D) {
9155   DeclarationNameInfo DirName;
9156   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
9157                                              nullptr, D->getBeginLoc());
9158   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9159   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9160   return Res;
9161 }
9162 
9163 template <typename Derived>
9164 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
9165     OMPMasterTaskLoopDirective *D) {
9166   DeclarationNameInfo DirName;
9167   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
9168                                              nullptr, D->getBeginLoc());
9169   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9170   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9171   return Res;
9172 }
9173 
9174 template <typename Derived>
9175 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective(
9176     OMPMaskedTaskLoopDirective *D) {
9177   DeclarationNameInfo DirName;
9178   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName,
9179                                              nullptr, D->getBeginLoc());
9180   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9181   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9182   return Res;
9183 }
9184 
9185 template <typename Derived>
9186 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
9187     OMPMasterTaskLoopSimdDirective *D) {
9188   DeclarationNameInfo DirName;
9189   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
9190                                              nullptr, D->getBeginLoc());
9191   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9192   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9193   return Res;
9194 }
9195 
9196 template <typename Derived>
9197 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective(
9198     OMPMaskedTaskLoopSimdDirective *D) {
9199   DeclarationNameInfo DirName;
9200   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName,
9201                                              nullptr, D->getBeginLoc());
9202   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9203   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9204   return Res;
9205 }
9206 
9207 template <typename Derived>
9208 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9209     OMPParallelMasterTaskLoopDirective *D) {
9210   DeclarationNameInfo DirName;
9211   getDerived().getSema().StartOpenMPDSABlock(
9212       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9213   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9214   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9215   return Res;
9216 }
9217 
9218 template <typename Derived>
9219 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective(
9220     OMPParallelMaskedTaskLoopDirective *D) {
9221   DeclarationNameInfo DirName;
9222   getDerived().getSema().StartOpenMPDSABlock(
9223       OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc());
9224   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9225   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9226   return Res;
9227 }
9228 
9229 template <typename Derived>
9230 StmtResult
9231 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9232     OMPParallelMasterTaskLoopSimdDirective *D) {
9233   DeclarationNameInfo DirName;
9234   getDerived().getSema().StartOpenMPDSABlock(
9235       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9236   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9237   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9238   return Res;
9239 }
9240 
9241 template <typename Derived>
9242 StmtResult
9243 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective(
9244     OMPParallelMaskedTaskLoopSimdDirective *D) {
9245   DeclarationNameInfo DirName;
9246   getDerived().getSema().StartOpenMPDSABlock(
9247       OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9248   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9249   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9250   return Res;
9251 }
9252 
9253 template <typename Derived>
9254 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9255     OMPDistributeDirective *D) {
9256   DeclarationNameInfo DirName;
9257   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9258                                              D->getBeginLoc());
9259   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9260   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9261   return Res;
9262 }
9263 
9264 template <typename Derived>
9265 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9266     OMPDistributeParallelForDirective *D) {
9267   DeclarationNameInfo DirName;
9268   getDerived().getSema().StartOpenMPDSABlock(
9269       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9270   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9271   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9272   return Res;
9273 }
9274 
9275 template <typename Derived>
9276 StmtResult
9277 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9278     OMPDistributeParallelForSimdDirective *D) {
9279   DeclarationNameInfo DirName;
9280   getDerived().getSema().StartOpenMPDSABlock(
9281       OMPD_distribute_parallel_for_simd, DirName, 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>::TransformOMPDistributeSimdDirective(
9289     OMPDistributeSimdDirective *D) {
9290   DeclarationNameInfo DirName;
9291   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_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>::TransformOMPTargetParallelForSimdDirective(
9300     OMPTargetParallelForSimdDirective *D) {
9301   DeclarationNameInfo DirName;
9302   getDerived().getSema().StartOpenMPDSABlock(
9303       OMPD_target_parallel_for_simd, 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>::TransformOMPTargetSimdDirective(
9311     OMPTargetSimdDirective *D) {
9312   DeclarationNameInfo DirName;
9313   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9314                                              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 TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9322     OMPTeamsDistributeDirective *D) {
9323   DeclarationNameInfo DirName;
9324   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9325                                              nullptr, D->getBeginLoc());
9326   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9327   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9328   return Res;
9329 }
9330 
9331 template <typename Derived>
9332 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9333     OMPTeamsDistributeSimdDirective *D) {
9334   DeclarationNameInfo DirName;
9335   getDerived().getSema().StartOpenMPDSABlock(
9336       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9337   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9338   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9339   return Res;
9340 }
9341 
9342 template <typename Derived>
9343 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9344     OMPTeamsDistributeParallelForSimdDirective *D) {
9345   DeclarationNameInfo DirName;
9346   getDerived().getSema().StartOpenMPDSABlock(
9347       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9348       D->getBeginLoc());
9349   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9350   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9351   return Res;
9352 }
9353 
9354 template <typename Derived>
9355 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9356     OMPTeamsDistributeParallelForDirective *D) {
9357   DeclarationNameInfo DirName;
9358   getDerived().getSema().StartOpenMPDSABlock(
9359       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9360   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9361   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9362   return Res;
9363 }
9364 
9365 template <typename Derived>
9366 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9367     OMPTargetTeamsDirective *D) {
9368   DeclarationNameInfo DirName;
9369   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9370                                              nullptr, D->getBeginLoc());
9371   auto Res = getDerived().TransformOMPExecutableDirective(D);
9372   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9373   return Res;
9374 }
9375 
9376 template <typename Derived>
9377 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9378     OMPTargetTeamsDistributeDirective *D) {
9379   DeclarationNameInfo DirName;
9380   getDerived().getSema().StartOpenMPDSABlock(
9381       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9382   auto Res = getDerived().TransformOMPExecutableDirective(D);
9383   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9384   return Res;
9385 }
9386 
9387 template <typename Derived>
9388 StmtResult
9389 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9390     OMPTargetTeamsDistributeParallelForDirective *D) {
9391   DeclarationNameInfo DirName;
9392   getDerived().getSema().StartOpenMPDSABlock(
9393       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9394       D->getBeginLoc());
9395   auto Res = getDerived().TransformOMPExecutableDirective(D);
9396   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9397   return Res;
9398 }
9399 
9400 template <typename Derived>
9401 StmtResult TreeTransform<Derived>::
9402     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9403         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9404   DeclarationNameInfo DirName;
9405   getDerived().getSema().StartOpenMPDSABlock(
9406       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9407       D->getBeginLoc());
9408   auto Res = getDerived().TransformOMPExecutableDirective(D);
9409   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9410   return Res;
9411 }
9412 
9413 template <typename Derived>
9414 StmtResult
9415 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9416     OMPTargetTeamsDistributeSimdDirective *D) {
9417   DeclarationNameInfo DirName;
9418   getDerived().getSema().StartOpenMPDSABlock(
9419       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9420   auto Res = getDerived().TransformOMPExecutableDirective(D);
9421   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9422   return Res;
9423 }
9424 
9425 template <typename Derived>
9426 StmtResult
9427 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9428   DeclarationNameInfo DirName;
9429   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9430                                              D->getBeginLoc());
9431   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9432   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9433   return Res;
9434 }
9435 
9436 template <typename Derived>
9437 StmtResult
9438 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9439   DeclarationNameInfo DirName;
9440   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9441                                              D->getBeginLoc());
9442   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9443   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9444   return Res;
9445 }
9446 
9447 template <typename Derived>
9448 StmtResult
9449 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9450   DeclarationNameInfo DirName;
9451   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9452                                              D->getBeginLoc());
9453   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9454   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9455   return Res;
9456 }
9457 
9458 template <typename Derived>
9459 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9460     OMPGenericLoopDirective *D) {
9461   DeclarationNameInfo DirName;
9462   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9463                                              D->getBeginLoc());
9464   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9465   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9466   return Res;
9467 }
9468 
9469 template <typename Derived>
9470 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective(
9471     OMPTeamsGenericLoopDirective *D) {
9472   DeclarationNameInfo DirName;
9473   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr,
9474                                              D->getBeginLoc());
9475   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9476   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9477   return Res;
9478 }
9479 
9480 template <typename Derived>
9481 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective(
9482     OMPTargetTeamsGenericLoopDirective *D) {
9483   DeclarationNameInfo DirName;
9484   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName,
9485                                              nullptr, D->getBeginLoc());
9486   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9488   return Res;
9489 }
9490 
9491 template <typename Derived>
9492 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective(
9493     OMPParallelGenericLoopDirective *D) {
9494   DeclarationNameInfo DirName;
9495   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName,
9496                                              nullptr, D->getBeginLoc());
9497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9499   return Res;
9500 }
9501 
9502 template <typename Derived>
9503 StmtResult
9504 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective(
9505     OMPTargetParallelGenericLoopDirective *D) {
9506   DeclarationNameInfo DirName;
9507   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName,
9508                                              nullptr, D->getBeginLoc());
9509   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9510   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9511   return Res;
9512 }
9513 
9514 //===----------------------------------------------------------------------===//
9515 // OpenMP clause transformation
9516 //===----------------------------------------------------------------------===//
9517 template <typename Derived>
9518 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9519   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9520   if (Cond.isInvalid())
9521     return nullptr;
9522   return getDerived().RebuildOMPIfClause(
9523       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9524       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9525 }
9526 
9527 template <typename Derived>
9528 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9529   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9530   if (Cond.isInvalid())
9531     return nullptr;
9532   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9533                                             C->getLParenLoc(), C->getEndLoc());
9534 }
9535 
9536 template <typename Derived>
9537 OMPClause *
9538 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9539   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9540   if (NumThreads.isInvalid())
9541     return nullptr;
9542   return getDerived().RebuildOMPNumThreadsClause(
9543       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9544 }
9545 
9546 template <typename Derived>
9547 OMPClause *
9548 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9549   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9550   if (E.isInvalid())
9551     return nullptr;
9552   return getDerived().RebuildOMPSafelenClause(
9553       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9554 }
9555 
9556 template <typename Derived>
9557 OMPClause *
9558 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9559   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9560   if (E.isInvalid())
9561     return nullptr;
9562   return getDerived().RebuildOMPAllocatorClause(
9563       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9564 }
9565 
9566 template <typename Derived>
9567 OMPClause *
9568 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9569   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9570   if (E.isInvalid())
9571     return nullptr;
9572   return getDerived().RebuildOMPSimdlenClause(
9573       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9574 }
9575 
9576 template <typename Derived>
9577 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9578   SmallVector<Expr *, 4> TransformedSizes;
9579   TransformedSizes.reserve(C->getNumSizes());
9580   bool Changed = false;
9581   for (Expr *E : C->getSizesRefs()) {
9582     if (!E) {
9583       TransformedSizes.push_back(nullptr);
9584       continue;
9585     }
9586 
9587     ExprResult T = getDerived().TransformExpr(E);
9588     if (T.isInvalid())
9589       return nullptr;
9590     if (E != T.get())
9591       Changed = true;
9592     TransformedSizes.push_back(T.get());
9593   }
9594 
9595   if (!Changed && !getDerived().AlwaysRebuild())
9596     return C;
9597   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9598                                C->getLParenLoc(), C->getEndLoc());
9599 }
9600 
9601 template <typename Derived>
9602 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9603   if (!getDerived().AlwaysRebuild())
9604     return C;
9605   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9606 }
9607 
9608 template <typename Derived>
9609 OMPClause *
9610 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9611   ExprResult T = getDerived().TransformExpr(C->getFactor());
9612   if (T.isInvalid())
9613     return nullptr;
9614   Expr *Factor = T.get();
9615   bool Changed = Factor != C->getFactor();
9616 
9617   if (!Changed && !getDerived().AlwaysRebuild())
9618     return C;
9619   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9620                                  C->getEndLoc());
9621 }
9622 
9623 template <typename Derived>
9624 OMPClause *
9625 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9626   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9627   if (E.isInvalid())
9628     return nullptr;
9629   return getDerived().RebuildOMPCollapseClause(
9630       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9631 }
9632 
9633 template <typename Derived>
9634 OMPClause *
9635 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9636   return getDerived().RebuildOMPDefaultClause(
9637       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9638       C->getLParenLoc(), C->getEndLoc());
9639 }
9640 
9641 template <typename Derived>
9642 OMPClause *
9643 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9644   return getDerived().RebuildOMPProcBindClause(
9645       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9646       C->getLParenLoc(), C->getEndLoc());
9647 }
9648 
9649 template <typename Derived>
9650 OMPClause *
9651 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9652   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9653   if (E.isInvalid())
9654     return nullptr;
9655   return getDerived().RebuildOMPScheduleClause(
9656       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9657       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9658       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9659       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9660 }
9661 
9662 template <typename Derived>
9663 OMPClause *
9664 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9665   ExprResult E;
9666   if (auto *Num = C->getNumForLoops()) {
9667     E = getDerived().TransformExpr(Num);
9668     if (E.isInvalid())
9669       return nullptr;
9670   }
9671   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9672                                               C->getLParenLoc(), E.get());
9673 }
9674 
9675 template <typename Derived>
9676 OMPClause *
9677 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9678   ExprResult E;
9679   if (Expr *Evt = C->getEventHandler()) {
9680     E = getDerived().TransformExpr(Evt);
9681     if (E.isInvalid())
9682       return nullptr;
9683   }
9684   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9685                                              C->getLParenLoc(), C->getEndLoc());
9686 }
9687 
9688 template <typename Derived>
9689 OMPClause *
9690 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9691   // No need to rebuild this clause, no template-dependent parameters.
9692   return C;
9693 }
9694 
9695 template <typename Derived>
9696 OMPClause *
9697 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9698   // No need to rebuild this clause, no template-dependent parameters.
9699   return C;
9700 }
9701 
9702 template <typename Derived>
9703 OMPClause *
9704 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9705   // No need to rebuild this clause, no template-dependent parameters.
9706   return C;
9707 }
9708 
9709 template <typename Derived>
9710 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9711   // No need to rebuild this clause, no template-dependent parameters.
9712   return C;
9713 }
9714 
9715 template <typename Derived>
9716 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9717   // No need to rebuild this clause, no template-dependent parameters.
9718   return C;
9719 }
9720 
9721 template <typename Derived>
9722 OMPClause *
9723 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9724   // No need to rebuild this clause, no template-dependent parameters.
9725   return C;
9726 }
9727 
9728 template <typename Derived>
9729 OMPClause *
9730 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9731   // No need to rebuild this clause, no template-dependent parameters.
9732   return C;
9733 }
9734 
9735 template <typename Derived>
9736 OMPClause *
9737 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9738   // No need to rebuild this clause, no template-dependent parameters.
9739   return C;
9740 }
9741 
9742 template <typename Derived>
9743 OMPClause *
9744 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9745   // No need to rebuild this clause, no template-dependent parameters.
9746   return C;
9747 }
9748 
9749 template <typename Derived>
9750 OMPClause *
9751 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9752   // No need to rebuild this clause, no template-dependent parameters.
9753   return C;
9754 }
9755 
9756 template <typename Derived>
9757 OMPClause *
9758 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9759   // No need to rebuild this clause, no template-dependent parameters.
9760   return C;
9761 }
9762 
9763 template <typename Derived>
9764 OMPClause *
9765 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9766   // No need to rebuild this clause, no template-dependent parameters.
9767   return C;
9768 }
9769 
9770 template <typename Derived>
9771 OMPClause *
9772 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9773   // No need to rebuild this clause, no template-dependent parameters.
9774   return C;
9775 }
9776 
9777 template <typename Derived>
9778 OMPClause *
9779 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9780   // No need to rebuild this clause, no template-dependent parameters.
9781   return C;
9782 }
9783 
9784 template <typename Derived>
9785 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9786   // No need to rebuild this clause, no template-dependent parameters.
9787   return C;
9788 }
9789 
9790 template <typename Derived>
9791 OMPClause *
9792 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9793   // No need to rebuild this clause, no template-dependent parameters.
9794   return C;
9795 }
9796 
9797 template <typename Derived>
9798 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9799   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9800   if (IVR.isInvalid())
9801     return nullptr;
9802 
9803   OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync());
9804   InteropInfo.PreferTypes.reserve(C->varlist_size() - 1);
9805   for (Expr *E : llvm::drop_begin(C->varlists())) {
9806     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9807     if (ER.isInvalid())
9808       return nullptr;
9809     InteropInfo.PreferTypes.push_back(ER.get());
9810   }
9811   return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo,
9812                                            C->getBeginLoc(), C->getLParenLoc(),
9813                                            C->getVarLoc(), C->getEndLoc());
9814 }
9815 
9816 template <typename Derived>
9817 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9818   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9819   if (ER.isInvalid())
9820     return nullptr;
9821   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9822                                           C->getLParenLoc(), C->getVarLoc(),
9823                                           C->getEndLoc());
9824 }
9825 
9826 template <typename Derived>
9827 OMPClause *
9828 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9829   ExprResult ER;
9830   if (Expr *IV = C->getInteropVar()) {
9831     ER = getDerived().TransformExpr(IV);
9832     if (ER.isInvalid())
9833       return nullptr;
9834   }
9835   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9836                                               C->getLParenLoc(), C->getVarLoc(),
9837                                               C->getEndLoc());
9838 }
9839 
9840 template <typename Derived>
9841 OMPClause *
9842 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9843   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9844   if (Cond.isInvalid())
9845     return nullptr;
9846   return getDerived().RebuildOMPNovariantsClause(
9847       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9848 }
9849 
9850 template <typename Derived>
9851 OMPClause *
9852 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9853   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9854   if (Cond.isInvalid())
9855     return nullptr;
9856   return getDerived().RebuildOMPNocontextClause(
9857       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9858 }
9859 
9860 template <typename Derived>
9861 OMPClause *
9862 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9863   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9864   if (ThreadID.isInvalid())
9865     return nullptr;
9866   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9867                                              C->getLParenLoc(), C->getEndLoc());
9868 }
9869 
9870 template <typename Derived>
9871 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9872   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9873   if (E.isInvalid())
9874     return nullptr;
9875   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9876                                             C->getLParenLoc(), C->getEndLoc());
9877 }
9878 
9879 template <typename Derived>
9880 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9881     OMPUnifiedAddressClause *C) {
9882   llvm_unreachable("unified_address clause cannot appear in dependent context");
9883 }
9884 
9885 template <typename Derived>
9886 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9887     OMPUnifiedSharedMemoryClause *C) {
9888   llvm_unreachable(
9889       "unified_shared_memory clause cannot appear in dependent context");
9890 }
9891 
9892 template <typename Derived>
9893 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9894     OMPReverseOffloadClause *C) {
9895   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9896 }
9897 
9898 template <typename Derived>
9899 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9900     OMPDynamicAllocatorsClause *C) {
9901   llvm_unreachable(
9902       "dynamic_allocators clause cannot appear in dependent context");
9903 }
9904 
9905 template <typename Derived>
9906 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9907     OMPAtomicDefaultMemOrderClause *C) {
9908   llvm_unreachable(
9909       "atomic_default_mem_order clause cannot appear in dependent context");
9910 }
9911 
9912 template <typename Derived>
9913 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) {
9914   return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(),
9915                                          C->getBeginLoc(), C->getLParenLoc(),
9916                                          C->getEndLoc());
9917 }
9918 
9919 template <typename Derived>
9920 OMPClause *
9921 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) {
9922   return getDerived().RebuildOMPSeverityClause(
9923       C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(),
9924       C->getLParenLoc(), C->getEndLoc());
9925 }
9926 
9927 template <typename Derived>
9928 OMPClause *
9929 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) {
9930   ExprResult E = getDerived().TransformExpr(C->getMessageString());
9931   if (E.isInvalid())
9932     return nullptr;
9933   return getDerived().RebuildOMPMessageClause(
9934       C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(),
9935       C->getEndLoc());
9936 }
9937 
9938 template <typename Derived>
9939 OMPClause *
9940 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9941   llvm::SmallVector<Expr *, 16> Vars;
9942   Vars.reserve(C->varlist_size());
9943   for (auto *VE : C->varlists()) {
9944     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9945     if (EVar.isInvalid())
9946       return nullptr;
9947     Vars.push_back(EVar.get());
9948   }
9949   return getDerived().RebuildOMPPrivateClause(
9950       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9951 }
9952 
9953 template <typename Derived>
9954 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9955     OMPFirstprivateClause *C) {
9956   llvm::SmallVector<Expr *, 16> Vars;
9957   Vars.reserve(C->varlist_size());
9958   for (auto *VE : C->varlists()) {
9959     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9960     if (EVar.isInvalid())
9961       return nullptr;
9962     Vars.push_back(EVar.get());
9963   }
9964   return getDerived().RebuildOMPFirstprivateClause(
9965       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9966 }
9967 
9968 template <typename Derived>
9969 OMPClause *
9970 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9971   llvm::SmallVector<Expr *, 16> Vars;
9972   Vars.reserve(C->varlist_size());
9973   for (auto *VE : C->varlists()) {
9974     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9975     if (EVar.isInvalid())
9976       return nullptr;
9977     Vars.push_back(EVar.get());
9978   }
9979   return getDerived().RebuildOMPLastprivateClause(
9980       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9981       C->getLParenLoc(), C->getEndLoc());
9982 }
9983 
9984 template <typename Derived>
9985 OMPClause *
9986 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9987   llvm::SmallVector<Expr *, 16> Vars;
9988   Vars.reserve(C->varlist_size());
9989   for (auto *VE : C->varlists()) {
9990     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9991     if (EVar.isInvalid())
9992       return nullptr;
9993     Vars.push_back(EVar.get());
9994   }
9995   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9996                                              C->getLParenLoc(), C->getEndLoc());
9997 }
9998 
9999 template <typename Derived>
10000 OMPClause *
10001 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
10002   llvm::SmallVector<Expr *, 16> Vars;
10003   Vars.reserve(C->varlist_size());
10004   for (auto *VE : C->varlists()) {
10005     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10006     if (EVar.isInvalid())
10007       return nullptr;
10008     Vars.push_back(EVar.get());
10009   }
10010   CXXScopeSpec ReductionIdScopeSpec;
10011   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10012 
10013   DeclarationNameInfo NameInfo = C->getNameInfo();
10014   if (NameInfo.getName()) {
10015     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10016     if (!NameInfo.getName())
10017       return nullptr;
10018   }
10019   // Build a list of all UDR decls with the same names ranged by the Scopes.
10020   // The Scope boundary is a duplication of the previous decl.
10021   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10022   for (auto *E : C->reduction_ops()) {
10023     // Transform all the decls.
10024     if (E) {
10025       auto *ULE = cast<UnresolvedLookupExpr>(E);
10026       UnresolvedSet<8> Decls;
10027       for (auto *D : ULE->decls()) {
10028         NamedDecl *InstD =
10029             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10030         Decls.addDecl(InstD, InstD->getAccess());
10031       }
10032       UnresolvedReductions.push_back(
10033        UnresolvedLookupExpr::Create(
10034           SemaRef.Context, /*NamingClass=*/nullptr,
10035           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
10036           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
10037           Decls.begin(), Decls.end()));
10038     } else
10039       UnresolvedReductions.push_back(nullptr);
10040   }
10041   return getDerived().RebuildOMPReductionClause(
10042       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
10043       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
10044       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10045 }
10046 
10047 template <typename Derived>
10048 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
10049     OMPTaskReductionClause *C) {
10050   llvm::SmallVector<Expr *, 16> Vars;
10051   Vars.reserve(C->varlist_size());
10052   for (auto *VE : C->varlists()) {
10053     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10054     if (EVar.isInvalid())
10055       return nullptr;
10056     Vars.push_back(EVar.get());
10057   }
10058   CXXScopeSpec ReductionIdScopeSpec;
10059   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10060 
10061   DeclarationNameInfo NameInfo = C->getNameInfo();
10062   if (NameInfo.getName()) {
10063     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10064     if (!NameInfo.getName())
10065       return nullptr;
10066   }
10067   // Build a list of all UDR decls with the same names ranged by the Scopes.
10068   // The Scope boundary is a duplication of the previous decl.
10069   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10070   for (auto *E : C->reduction_ops()) {
10071     // Transform all the decls.
10072     if (E) {
10073       auto *ULE = cast<UnresolvedLookupExpr>(E);
10074       UnresolvedSet<8> Decls;
10075       for (auto *D : ULE->decls()) {
10076         NamedDecl *InstD =
10077             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10078         Decls.addDecl(InstD, InstD->getAccess());
10079       }
10080       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10081           SemaRef.Context, /*NamingClass=*/nullptr,
10082           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10083           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10084     } else
10085       UnresolvedReductions.push_back(nullptr);
10086   }
10087   return getDerived().RebuildOMPTaskReductionClause(
10088       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10089       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10090 }
10091 
10092 template <typename Derived>
10093 OMPClause *
10094 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
10095   llvm::SmallVector<Expr *, 16> Vars;
10096   Vars.reserve(C->varlist_size());
10097   for (auto *VE : C->varlists()) {
10098     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10099     if (EVar.isInvalid())
10100       return nullptr;
10101     Vars.push_back(EVar.get());
10102   }
10103   CXXScopeSpec ReductionIdScopeSpec;
10104   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
10105 
10106   DeclarationNameInfo NameInfo = C->getNameInfo();
10107   if (NameInfo.getName()) {
10108     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10109     if (!NameInfo.getName())
10110       return nullptr;
10111   }
10112   // Build a list of all UDR decls with the same names ranged by the Scopes.
10113   // The Scope boundary is a duplication of the previous decl.
10114   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
10115   for (auto *E : C->reduction_ops()) {
10116     // Transform all the decls.
10117     if (E) {
10118       auto *ULE = cast<UnresolvedLookupExpr>(E);
10119       UnresolvedSet<8> Decls;
10120       for (auto *D : ULE->decls()) {
10121         NamedDecl *InstD =
10122             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
10123         Decls.addDecl(InstD, InstD->getAccess());
10124       }
10125       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
10126           SemaRef.Context, /*NamingClass=*/nullptr,
10127           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
10128           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
10129     } else
10130       UnresolvedReductions.push_back(nullptr);
10131   }
10132   return getDerived().RebuildOMPInReductionClause(
10133       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10134       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
10135 }
10136 
10137 template <typename Derived>
10138 OMPClause *
10139 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
10140   llvm::SmallVector<Expr *, 16> Vars;
10141   Vars.reserve(C->varlist_size());
10142   for (auto *VE : C->varlists()) {
10143     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10144     if (EVar.isInvalid())
10145       return nullptr;
10146     Vars.push_back(EVar.get());
10147   }
10148   ExprResult Step = getDerived().TransformExpr(C->getStep());
10149   if (Step.isInvalid())
10150     return nullptr;
10151   return getDerived().RebuildOMPLinearClause(
10152       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
10153       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
10154 }
10155 
10156 template <typename Derived>
10157 OMPClause *
10158 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
10159   llvm::SmallVector<Expr *, 16> Vars;
10160   Vars.reserve(C->varlist_size());
10161   for (auto *VE : C->varlists()) {
10162     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10163     if (EVar.isInvalid())
10164       return nullptr;
10165     Vars.push_back(EVar.get());
10166   }
10167   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
10168   if (Alignment.isInvalid())
10169     return nullptr;
10170   return getDerived().RebuildOMPAlignedClause(
10171       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
10172       C->getColonLoc(), C->getEndLoc());
10173 }
10174 
10175 template <typename Derived>
10176 OMPClause *
10177 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
10178   llvm::SmallVector<Expr *, 16> Vars;
10179   Vars.reserve(C->varlist_size());
10180   for (auto *VE : C->varlists()) {
10181     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10182     if (EVar.isInvalid())
10183       return nullptr;
10184     Vars.push_back(EVar.get());
10185   }
10186   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
10187                                              C->getLParenLoc(), C->getEndLoc());
10188 }
10189 
10190 template <typename Derived>
10191 OMPClause *
10192 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
10193   llvm::SmallVector<Expr *, 16> Vars;
10194   Vars.reserve(C->varlist_size());
10195   for (auto *VE : C->varlists()) {
10196     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10197     if (EVar.isInvalid())
10198       return nullptr;
10199     Vars.push_back(EVar.get());
10200   }
10201   return getDerived().RebuildOMPCopyprivateClause(
10202       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10203 }
10204 
10205 template <typename Derived>
10206 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
10207   llvm::SmallVector<Expr *, 16> Vars;
10208   Vars.reserve(C->varlist_size());
10209   for (auto *VE : C->varlists()) {
10210     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10211     if (EVar.isInvalid())
10212       return nullptr;
10213     Vars.push_back(EVar.get());
10214   }
10215   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
10216                                             C->getLParenLoc(), C->getEndLoc());
10217 }
10218 
10219 template <typename Derived>
10220 OMPClause *
10221 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
10222   ExprResult E = getDerived().TransformExpr(C->getDepobj());
10223   if (E.isInvalid())
10224     return nullptr;
10225   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
10226                                              C->getLParenLoc(), C->getEndLoc());
10227 }
10228 
10229 template <typename Derived>
10230 OMPClause *
10231 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
10232   llvm::SmallVector<Expr *, 16> Vars;
10233   Expr *DepModifier = C->getModifier();
10234   if (DepModifier) {
10235     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
10236     if (DepModRes.isInvalid())
10237       return nullptr;
10238     DepModifier = DepModRes.get();
10239   }
10240   Vars.reserve(C->varlist_size());
10241   for (auto *VE : C->varlists()) {
10242     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10243     if (EVar.isInvalid())
10244       return nullptr;
10245     Vars.push_back(EVar.get());
10246   }
10247   return getDerived().RebuildOMPDependClause(
10248       {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(),
10249        C->getOmpAllMemoryLoc()},
10250       DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10251 }
10252 
10253 template <typename Derived>
10254 OMPClause *
10255 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
10256   ExprResult E = getDerived().TransformExpr(C->getDevice());
10257   if (E.isInvalid())
10258     return nullptr;
10259   return getDerived().RebuildOMPDeviceClause(
10260       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10261       C->getModifierLoc(), C->getEndLoc());
10262 }
10263 
10264 template <typename Derived, class T>
10265 bool transformOMPMappableExprListClause(
10266     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
10267     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
10268     DeclarationNameInfo &MapperIdInfo,
10269     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
10270   // Transform expressions in the list.
10271   Vars.reserve(C->varlist_size());
10272   for (auto *VE : C->varlists()) {
10273     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
10274     if (EVar.isInvalid())
10275       return true;
10276     Vars.push_back(EVar.get());
10277   }
10278   // Transform mapper scope specifier and identifier.
10279   NestedNameSpecifierLoc QualifierLoc;
10280   if (C->getMapperQualifierLoc()) {
10281     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
10282         C->getMapperQualifierLoc());
10283     if (!QualifierLoc)
10284       return true;
10285   }
10286   MapperIdScopeSpec.Adopt(QualifierLoc);
10287   MapperIdInfo = C->getMapperIdInfo();
10288   if (MapperIdInfo.getName()) {
10289     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
10290     if (!MapperIdInfo.getName())
10291       return true;
10292   }
10293   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
10294   // the previous user-defined mapper lookup in dependent environment.
10295   for (auto *E : C->mapperlists()) {
10296     // Transform all the decls.
10297     if (E) {
10298       auto *ULE = cast<UnresolvedLookupExpr>(E);
10299       UnresolvedSet<8> Decls;
10300       for (auto *D : ULE->decls()) {
10301         NamedDecl *InstD =
10302             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10303         Decls.addDecl(InstD, InstD->getAccess());
10304       }
10305       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10306           TT.getSema().Context, /*NamingClass=*/nullptr,
10307           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10308           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10309           Decls.end()));
10310     } else {
10311       UnresolvedMappers.push_back(nullptr);
10312     }
10313   }
10314   return false;
10315 }
10316 
10317 template <typename Derived>
10318 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10319   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10320   llvm::SmallVector<Expr *, 16> Vars;
10321   Expr *IteratorModifier = C->getIteratorModifier();
10322   if (IteratorModifier) {
10323     ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier);
10324     if (MapModRes.isInvalid())
10325       return nullptr;
10326     IteratorModifier = MapModRes.get();
10327   }
10328   CXXScopeSpec MapperIdScopeSpec;
10329   DeclarationNameInfo MapperIdInfo;
10330   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10331   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10332           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10333     return nullptr;
10334   return getDerived().RebuildOMPMapClause(
10335       IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(),
10336       MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(),
10337       C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10338 }
10339 
10340 template <typename Derived>
10341 OMPClause *
10342 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10343   Expr *Allocator = C->getAllocator();
10344   if (Allocator) {
10345     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10346     if (AllocatorRes.isInvalid())
10347       return nullptr;
10348     Allocator = AllocatorRes.get();
10349   }
10350   llvm::SmallVector<Expr *, 16> Vars;
10351   Vars.reserve(C->varlist_size());
10352   for (auto *VE : C->varlists()) {
10353     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10354     if (EVar.isInvalid())
10355       return nullptr;
10356     Vars.push_back(EVar.get());
10357   }
10358   return getDerived().RebuildOMPAllocateClause(
10359       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10360       C->getEndLoc());
10361 }
10362 
10363 template <typename Derived>
10364 OMPClause *
10365 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10366   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10367   if (E.isInvalid())
10368     return nullptr;
10369   return getDerived().RebuildOMPNumTeamsClause(
10370       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10371 }
10372 
10373 template <typename Derived>
10374 OMPClause *
10375 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10376   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10377   if (E.isInvalid())
10378     return nullptr;
10379   return getDerived().RebuildOMPThreadLimitClause(
10380       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10381 }
10382 
10383 template <typename Derived>
10384 OMPClause *
10385 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10386   ExprResult E = getDerived().TransformExpr(C->getPriority());
10387   if (E.isInvalid())
10388     return nullptr;
10389   return getDerived().RebuildOMPPriorityClause(
10390       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10391 }
10392 
10393 template <typename Derived>
10394 OMPClause *
10395 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10396   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10397   if (E.isInvalid())
10398     return nullptr;
10399   return getDerived().RebuildOMPGrainsizeClause(
10400       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10401       C->getModifierLoc(), C->getEndLoc());
10402 }
10403 
10404 template <typename Derived>
10405 OMPClause *
10406 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10407   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10408   if (E.isInvalid())
10409     return nullptr;
10410   return getDerived().RebuildOMPNumTasksClause(
10411       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10412       C->getModifierLoc(), C->getEndLoc());
10413 }
10414 
10415 template <typename Derived>
10416 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10417   ExprResult E = getDerived().TransformExpr(C->getHint());
10418   if (E.isInvalid())
10419     return nullptr;
10420   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10421                                            C->getLParenLoc(), C->getEndLoc());
10422 }
10423 
10424 template <typename Derived>
10425 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10426     OMPDistScheduleClause *C) {
10427   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10428   if (E.isInvalid())
10429     return nullptr;
10430   return getDerived().RebuildOMPDistScheduleClause(
10431       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10432       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10433 }
10434 
10435 template <typename Derived>
10436 OMPClause *
10437 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10438   // Rebuild Defaultmap Clause since we need to invoke the checking of
10439   // defaultmap(none:variable-category) after template initialization.
10440   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10441                                                  C->getDefaultmapKind(),
10442                                                  C->getBeginLoc(),
10443                                                  C->getLParenLoc(),
10444                                                  C->getDefaultmapModifierLoc(),
10445                                                  C->getDefaultmapKindLoc(),
10446                                                  C->getEndLoc());
10447 }
10448 
10449 template <typename Derived>
10450 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10451   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10452   llvm::SmallVector<Expr *, 16> Vars;
10453   CXXScopeSpec MapperIdScopeSpec;
10454   DeclarationNameInfo MapperIdInfo;
10455   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10456   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10457           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10458     return nullptr;
10459   return getDerived().RebuildOMPToClause(
10460       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10461       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10462 }
10463 
10464 template <typename Derived>
10465 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10466   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10467   llvm::SmallVector<Expr *, 16> Vars;
10468   CXXScopeSpec MapperIdScopeSpec;
10469   DeclarationNameInfo MapperIdInfo;
10470   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10471   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10472           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10473     return nullptr;
10474   return getDerived().RebuildOMPFromClause(
10475       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10476       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10477 }
10478 
10479 template <typename Derived>
10480 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10481     OMPUseDevicePtrClause *C) {
10482   llvm::SmallVector<Expr *, 16> Vars;
10483   Vars.reserve(C->varlist_size());
10484   for (auto *VE : C->varlists()) {
10485     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10486     if (EVar.isInvalid())
10487       return nullptr;
10488     Vars.push_back(EVar.get());
10489   }
10490   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10491   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10492 }
10493 
10494 template <typename Derived>
10495 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10496     OMPUseDeviceAddrClause *C) {
10497   llvm::SmallVector<Expr *, 16> Vars;
10498   Vars.reserve(C->varlist_size());
10499   for (auto *VE : C->varlists()) {
10500     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10501     if (EVar.isInvalid())
10502       return nullptr;
10503     Vars.push_back(EVar.get());
10504   }
10505   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10506   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10507 }
10508 
10509 template <typename Derived>
10510 OMPClause *
10511 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10512   llvm::SmallVector<Expr *, 16> Vars;
10513   Vars.reserve(C->varlist_size());
10514   for (auto *VE : C->varlists()) {
10515     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10516     if (EVar.isInvalid())
10517       return nullptr;
10518     Vars.push_back(EVar.get());
10519   }
10520   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10521   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10522 }
10523 
10524 template <typename Derived>
10525 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause(
10526     OMPHasDeviceAddrClause *C) {
10527   llvm::SmallVector<Expr *, 16> Vars;
10528   Vars.reserve(C->varlist_size());
10529   for (auto *VE : C->varlists()) {
10530     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10531     if (EVar.isInvalid())
10532       return nullptr;
10533     Vars.push_back(EVar.get());
10534   }
10535   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10536   return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs);
10537 }
10538 
10539 template <typename Derived>
10540 OMPClause *
10541 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10542   llvm::SmallVector<Expr *, 16> Vars;
10543   Vars.reserve(C->varlist_size());
10544   for (auto *VE : C->varlists()) {
10545     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10546     if (EVar.isInvalid())
10547       return nullptr;
10548     Vars.push_back(EVar.get());
10549   }
10550   return getDerived().RebuildOMPNontemporalClause(
10551       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10552 }
10553 
10554 template <typename Derived>
10555 OMPClause *
10556 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10557   llvm::SmallVector<Expr *, 16> Vars;
10558   Vars.reserve(C->varlist_size());
10559   for (auto *VE : C->varlists()) {
10560     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10561     if (EVar.isInvalid())
10562       return nullptr;
10563     Vars.push_back(EVar.get());
10564   }
10565   return getDerived().RebuildOMPInclusiveClause(
10566       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10567 }
10568 
10569 template <typename Derived>
10570 OMPClause *
10571 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10572   llvm::SmallVector<Expr *, 16> Vars;
10573   Vars.reserve(C->varlist_size());
10574   for (auto *VE : C->varlists()) {
10575     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10576     if (EVar.isInvalid())
10577       return nullptr;
10578     Vars.push_back(EVar.get());
10579   }
10580   return getDerived().RebuildOMPExclusiveClause(
10581       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10582 }
10583 
10584 template <typename Derived>
10585 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10586     OMPUsesAllocatorsClause *C) {
10587   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10588   Data.reserve(C->getNumberOfAllocators());
10589   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10590     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10591     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10592     if (Allocator.isInvalid())
10593       continue;
10594     ExprResult AllocatorTraits;
10595     if (Expr *AT = D.AllocatorTraits) {
10596       AllocatorTraits = getDerived().TransformExpr(AT);
10597       if (AllocatorTraits.isInvalid())
10598         continue;
10599     }
10600     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10601     NewD.Allocator = Allocator.get();
10602     NewD.AllocatorTraits = AllocatorTraits.get();
10603     NewD.LParenLoc = D.LParenLoc;
10604     NewD.RParenLoc = D.RParenLoc;
10605   }
10606   return getDerived().RebuildOMPUsesAllocatorsClause(
10607       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10608 }
10609 
10610 template <typename Derived>
10611 OMPClause *
10612 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10613   SmallVector<Expr *, 4> Locators;
10614   Locators.reserve(C->varlist_size());
10615   ExprResult ModifierRes;
10616   if (Expr *Modifier = C->getModifier()) {
10617     ModifierRes = getDerived().TransformExpr(Modifier);
10618     if (ModifierRes.isInvalid())
10619       return nullptr;
10620   }
10621   for (Expr *E : C->varlists()) {
10622     ExprResult Locator = getDerived().TransformExpr(E);
10623     if (Locator.isInvalid())
10624       continue;
10625     Locators.push_back(Locator.get());
10626   }
10627   return getDerived().RebuildOMPAffinityClause(
10628       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10629       ModifierRes.get(), Locators);
10630 }
10631 
10632 template <typename Derived>
10633 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10634   return getDerived().RebuildOMPOrderClause(
10635       C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(),
10636       C->getEndLoc(), C->getModifier(), C->getModifierKwLoc());
10637 }
10638 
10639 template <typename Derived>
10640 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10641   return getDerived().RebuildOMPBindClause(
10642       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10643       C->getLParenLoc(), C->getEndLoc());
10644 }
10645 
10646 template <typename Derived>
10647 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause(
10648     OMPXDynCGroupMemClause *C) {
10649   ExprResult Size = getDerived().TransformExpr(C->getSize());
10650   if (Size.isInvalid())
10651     return nullptr;
10652   return getDerived().RebuildOMPXDynCGroupMemClause(
10653       Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10654 }
10655 
10656 //===----------------------------------------------------------------------===//
10657 // Expression transformation
10658 //===----------------------------------------------------------------------===//
10659 template<typename Derived>
10660 ExprResult
10661 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10662   return TransformExpr(E->getSubExpr());
10663 }
10664 
10665 template <typename Derived>
10666 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10667     SYCLUniqueStableNameExpr *E) {
10668   if (!E->isTypeDependent())
10669     return E;
10670 
10671   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10672 
10673   if (!NewT)
10674     return ExprError();
10675 
10676   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10677     return E;
10678 
10679   return getDerived().RebuildSYCLUniqueStableNameExpr(
10680       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10681 }
10682 
10683 template<typename Derived>
10684 ExprResult
10685 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10686   if (!E->isTypeDependent())
10687     return E;
10688 
10689   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10690                                             E->getIdentKind());
10691 }
10692 
10693 template<typename Derived>
10694 ExprResult
10695 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10696   NestedNameSpecifierLoc QualifierLoc;
10697   if (E->getQualifierLoc()) {
10698     QualifierLoc
10699       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10700     if (!QualifierLoc)
10701       return ExprError();
10702   }
10703 
10704   ValueDecl *ND
10705     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10706                                                          E->getDecl()));
10707   if (!ND)
10708     return ExprError();
10709 
10710   NamedDecl *Found = ND;
10711   if (E->getFoundDecl() != E->getDecl()) {
10712     Found = cast_or_null<NamedDecl>(
10713         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10714     if (!Found)
10715       return ExprError();
10716   }
10717 
10718   DeclarationNameInfo NameInfo = E->getNameInfo();
10719   if (NameInfo.getName()) {
10720     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10721     if (!NameInfo.getName())
10722       return ExprError();
10723   }
10724 
10725   if (!getDerived().AlwaysRebuild() &&
10726       QualifierLoc == E->getQualifierLoc() &&
10727       ND == E->getDecl() &&
10728       Found == E->getFoundDecl() &&
10729       NameInfo.getName() == E->getDecl()->getDeclName() &&
10730       !E->hasExplicitTemplateArgs()) {
10731 
10732     // Mark it referenced in the new context regardless.
10733     // FIXME: this is a bit instantiation-specific.
10734     SemaRef.MarkDeclRefReferenced(E);
10735 
10736     return E;
10737   }
10738 
10739   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10740   if (E->hasExplicitTemplateArgs()) {
10741     TemplateArgs = &TransArgs;
10742     TransArgs.setLAngleLoc(E->getLAngleLoc());
10743     TransArgs.setRAngleLoc(E->getRAngleLoc());
10744     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10745                                                 E->getNumTemplateArgs(),
10746                                                 TransArgs))
10747       return ExprError();
10748   }
10749 
10750   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10751                                          Found, TemplateArgs);
10752 }
10753 
10754 template<typename Derived>
10755 ExprResult
10756 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10757   return E;
10758 }
10759 
10760 template <typename Derived>
10761 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10762     FixedPointLiteral *E) {
10763   return E;
10764 }
10765 
10766 template<typename Derived>
10767 ExprResult
10768 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10769   return E;
10770 }
10771 
10772 template<typename Derived>
10773 ExprResult
10774 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10775   return E;
10776 }
10777 
10778 template<typename Derived>
10779 ExprResult
10780 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10781   return E;
10782 }
10783 
10784 template<typename Derived>
10785 ExprResult
10786 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10787   return E;
10788 }
10789 
10790 template<typename Derived>
10791 ExprResult
10792 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10793   return getDerived().TransformCallExpr(E);
10794 }
10795 
10796 template<typename Derived>
10797 ExprResult
10798 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10799   ExprResult ControllingExpr =
10800     getDerived().TransformExpr(E->getControllingExpr());
10801   if (ControllingExpr.isInvalid())
10802     return ExprError();
10803 
10804   SmallVector<Expr *, 4> AssocExprs;
10805   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10806   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10807     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10808     if (TSI) {
10809       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10810       if (!AssocType)
10811         return ExprError();
10812       AssocTypes.push_back(AssocType);
10813     } else {
10814       AssocTypes.push_back(nullptr);
10815     }
10816 
10817     ExprResult AssocExpr =
10818         getDerived().TransformExpr(Assoc.getAssociationExpr());
10819     if (AssocExpr.isInvalid())
10820       return ExprError();
10821     AssocExprs.push_back(AssocExpr.get());
10822   }
10823 
10824   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10825                                                   E->getDefaultLoc(),
10826                                                   E->getRParenLoc(),
10827                                                   ControllingExpr.get(),
10828                                                   AssocTypes,
10829                                                   AssocExprs);
10830 }
10831 
10832 template<typename Derived>
10833 ExprResult
10834 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10835   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10836   if (SubExpr.isInvalid())
10837     return ExprError();
10838 
10839   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10840     return E;
10841 
10842   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10843                                        E->getRParen());
10844 }
10845 
10846 /// The operand of a unary address-of operator has special rules: it's
10847 /// allowed to refer to a non-static member of a class even if there's no 'this'
10848 /// object available.
10849 template<typename Derived>
10850 ExprResult
10851 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10852   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10853     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10854   else
10855     return getDerived().TransformExpr(E);
10856 }
10857 
10858 template<typename Derived>
10859 ExprResult
10860 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10861   ExprResult SubExpr;
10862   if (E->getOpcode() == UO_AddrOf)
10863     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10864   else
10865     SubExpr = TransformExpr(E->getSubExpr());
10866   if (SubExpr.isInvalid())
10867     return ExprError();
10868 
10869   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10870     return E;
10871 
10872   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10873                                            E->getOpcode(),
10874                                            SubExpr.get());
10875 }
10876 
10877 template<typename Derived>
10878 ExprResult
10879 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10880   // Transform the type.
10881   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10882   if (!Type)
10883     return ExprError();
10884 
10885   // Transform all of the components into components similar to what the
10886   // parser uses.
10887   // FIXME: It would be slightly more efficient in the non-dependent case to
10888   // just map FieldDecls, rather than requiring the rebuilder to look for
10889   // the fields again. However, __builtin_offsetof is rare enough in
10890   // template code that we don't care.
10891   bool ExprChanged = false;
10892   typedef Sema::OffsetOfComponent Component;
10893   SmallVector<Component, 4> Components;
10894   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10895     const OffsetOfNode &ON = E->getComponent(I);
10896     Component Comp;
10897     Comp.isBrackets = true;
10898     Comp.LocStart = ON.getSourceRange().getBegin();
10899     Comp.LocEnd = ON.getSourceRange().getEnd();
10900     switch (ON.getKind()) {
10901     case OffsetOfNode::Array: {
10902       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10903       ExprResult Index = getDerived().TransformExpr(FromIndex);
10904       if (Index.isInvalid())
10905         return ExprError();
10906 
10907       ExprChanged = ExprChanged || Index.get() != FromIndex;
10908       Comp.isBrackets = true;
10909       Comp.U.E = Index.get();
10910       break;
10911     }
10912 
10913     case OffsetOfNode::Field:
10914     case OffsetOfNode::Identifier:
10915       Comp.isBrackets = false;
10916       Comp.U.IdentInfo = ON.getFieldName();
10917       if (!Comp.U.IdentInfo)
10918         continue;
10919 
10920       break;
10921 
10922     case OffsetOfNode::Base:
10923       // Will be recomputed during the rebuild.
10924       continue;
10925     }
10926 
10927     Components.push_back(Comp);
10928   }
10929 
10930   // If nothing changed, retain the existing expression.
10931   if (!getDerived().AlwaysRebuild() &&
10932       Type == E->getTypeSourceInfo() &&
10933       !ExprChanged)
10934     return E;
10935 
10936   // Build a new offsetof expression.
10937   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10938                                           Components, E->getRParenLoc());
10939 }
10940 
10941 template<typename Derived>
10942 ExprResult
10943 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10944   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10945          "opaque value expression requires transformation");
10946   return E;
10947 }
10948 
10949 template<typename Derived>
10950 ExprResult
10951 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10952   return E;
10953 }
10954 
10955 template <typename Derived>
10956 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10957   llvm::SmallVector<Expr *, 8> Children;
10958   bool Changed = false;
10959   for (Expr *C : E->subExpressions()) {
10960     ExprResult NewC = getDerived().TransformExpr(C);
10961     if (NewC.isInvalid())
10962       return ExprError();
10963     Children.push_back(NewC.get());
10964 
10965     Changed |= NewC.get() != C;
10966   }
10967   if (!getDerived().AlwaysRebuild() && !Changed)
10968     return E;
10969   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10970                                           Children, E->getType());
10971 }
10972 
10973 template<typename Derived>
10974 ExprResult
10975 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10976   // Rebuild the syntactic form.  The original syntactic form has
10977   // opaque-value expressions in it, so strip those away and rebuild
10978   // the result.  This is a really awful way of doing this, but the
10979   // better solution (rebuilding the semantic expressions and
10980   // rebinding OVEs as necessary) doesn't work; we'd need
10981   // TreeTransform to not strip away implicit conversions.
10982   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10983   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10984   if (result.isInvalid()) return ExprError();
10985 
10986   // If that gives us a pseudo-object result back, the pseudo-object
10987   // expression must have been an lvalue-to-rvalue conversion which we
10988   // should reapply.
10989   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10990     result = SemaRef.checkPseudoObjectRValue(result.get());
10991 
10992   return result;
10993 }
10994 
10995 template<typename Derived>
10996 ExprResult
10997 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10998                                                 UnaryExprOrTypeTraitExpr *E) {
10999   if (E->isArgumentType()) {
11000     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
11001 
11002     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11003     if (!NewT)
11004       return ExprError();
11005 
11006     if (!getDerived().AlwaysRebuild() && OldT == NewT)
11007       return E;
11008 
11009     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
11010                                                     E->getKind(),
11011                                                     E->getSourceRange());
11012   }
11013 
11014   // C++0x [expr.sizeof]p1:
11015   //   The operand is either an expression, which is an unevaluated operand
11016   //   [...]
11017   EnterExpressionEvaluationContext Unevaluated(
11018       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11019       Sema::ReuseLambdaContextDecl);
11020 
11021   // Try to recover if we have something like sizeof(T::X) where X is a type.
11022   // Notably, there must be *exactly* one set of parens if X is a type.
11023   TypeSourceInfo *RecoveryTSI = nullptr;
11024   ExprResult SubExpr;
11025   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
11026   if (auto *DRE =
11027           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
11028     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
11029         PE, DRE, false, &RecoveryTSI);
11030   else
11031     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
11032 
11033   if (RecoveryTSI) {
11034     return getDerived().RebuildUnaryExprOrTypeTrait(
11035         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
11036   } else if (SubExpr.isInvalid())
11037     return ExprError();
11038 
11039   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
11040     return E;
11041 
11042   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
11043                                                   E->getOperatorLoc(),
11044                                                   E->getKind(),
11045                                                   E->getSourceRange());
11046 }
11047 
11048 template<typename Derived>
11049 ExprResult
11050 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
11051   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11052   if (LHS.isInvalid())
11053     return ExprError();
11054 
11055   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11056   if (RHS.isInvalid())
11057     return ExprError();
11058 
11059 
11060   if (!getDerived().AlwaysRebuild() &&
11061       LHS.get() == E->getLHS() &&
11062       RHS.get() == E->getRHS())
11063     return E;
11064 
11065   return getDerived().RebuildArraySubscriptExpr(
11066       LHS.get(),
11067       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
11068 }
11069 
11070 template <typename Derived>
11071 ExprResult
11072 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
11073   ExprResult Base = getDerived().TransformExpr(E->getBase());
11074   if (Base.isInvalid())
11075     return ExprError();
11076 
11077   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
11078   if (RowIdx.isInvalid())
11079     return ExprError();
11080 
11081   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
11082   if (ColumnIdx.isInvalid())
11083     return ExprError();
11084 
11085   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11086       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
11087     return E;
11088 
11089   return getDerived().RebuildMatrixSubscriptExpr(
11090       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
11091 }
11092 
11093 template <typename Derived>
11094 ExprResult
11095 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
11096   ExprResult Base = getDerived().TransformExpr(E->getBase());
11097   if (Base.isInvalid())
11098     return ExprError();
11099 
11100   ExprResult LowerBound;
11101   if (E->getLowerBound()) {
11102     LowerBound = getDerived().TransformExpr(E->getLowerBound());
11103     if (LowerBound.isInvalid())
11104       return ExprError();
11105   }
11106 
11107   ExprResult Length;
11108   if (E->getLength()) {
11109     Length = getDerived().TransformExpr(E->getLength());
11110     if (Length.isInvalid())
11111       return ExprError();
11112   }
11113 
11114   ExprResult Stride;
11115   if (Expr *Str = E->getStride()) {
11116     Stride = getDerived().TransformExpr(Str);
11117     if (Stride.isInvalid())
11118       return ExprError();
11119   }
11120 
11121   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
11122       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
11123     return E;
11124 
11125   return getDerived().RebuildOMPArraySectionExpr(
11126       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
11127       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
11128       E->getRBracketLoc());
11129 }
11130 
11131 template <typename Derived>
11132 ExprResult
11133 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
11134   ExprResult Base = getDerived().TransformExpr(E->getBase());
11135   if (Base.isInvalid())
11136     return ExprError();
11137 
11138   SmallVector<Expr *, 4> Dims;
11139   bool ErrorFound = false;
11140   for (Expr *Dim : E->getDimensions()) {
11141     ExprResult DimRes = getDerived().TransformExpr(Dim);
11142     if (DimRes.isInvalid()) {
11143       ErrorFound = true;
11144       continue;
11145     }
11146     Dims.push_back(DimRes.get());
11147   }
11148 
11149   if (ErrorFound)
11150     return ExprError();
11151   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
11152                                                  E->getRParenLoc(), Dims,
11153                                                  E->getBracketsRanges());
11154 }
11155 
11156 template <typename Derived>
11157 ExprResult
11158 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
11159   unsigned NumIterators = E->numOfIterators();
11160   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
11161 
11162   bool ErrorFound = false;
11163   bool NeedToRebuild = getDerived().AlwaysRebuild();
11164   for (unsigned I = 0; I < NumIterators; ++I) {
11165     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
11166     Data[I].DeclIdent = D->getIdentifier();
11167     Data[I].DeclIdentLoc = D->getLocation();
11168     if (D->getLocation() == D->getBeginLoc()) {
11169       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
11170              "Implicit type must be int.");
11171     } else {
11172       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
11173       QualType DeclTy = getDerived().TransformType(D->getType());
11174       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
11175     }
11176     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
11177     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
11178     ExprResult End = getDerived().TransformExpr(Range.End);
11179     ExprResult Step = getDerived().TransformExpr(Range.Step);
11180     ErrorFound = ErrorFound ||
11181                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
11182                                                !Data[I].Type.get().isNull())) ||
11183                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
11184     if (ErrorFound)
11185       continue;
11186     Data[I].Range.Begin = Begin.get();
11187     Data[I].Range.End = End.get();
11188     Data[I].Range.Step = Step.get();
11189     Data[I].AssignLoc = E->getAssignLoc(I);
11190     Data[I].ColonLoc = E->getColonLoc(I);
11191     Data[I].SecColonLoc = E->getSecondColonLoc(I);
11192     NeedToRebuild =
11193         NeedToRebuild ||
11194         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
11195                                        D->getType().getTypePtrOrNull()) ||
11196         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
11197         Range.Step != Data[I].Range.Step;
11198   }
11199   if (ErrorFound)
11200     return ExprError();
11201   if (!NeedToRebuild)
11202     return E;
11203 
11204   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
11205       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
11206   if (!Res.isUsable())
11207     return Res;
11208   auto *IE = cast<OMPIteratorExpr>(Res.get());
11209   for (unsigned I = 0; I < NumIterators; ++I)
11210     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
11211                                       IE->getIteratorDecl(I));
11212   return Res;
11213 }
11214 
11215 template<typename Derived>
11216 ExprResult
11217 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
11218   // Transform the callee.
11219   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11220   if (Callee.isInvalid())
11221     return ExprError();
11222 
11223   // Transform arguments.
11224   bool ArgChanged = false;
11225   SmallVector<Expr*, 8> Args;
11226   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11227                                   &ArgChanged))
11228     return ExprError();
11229 
11230   if (!getDerived().AlwaysRebuild() &&
11231       Callee.get() == E->getCallee() &&
11232       !ArgChanged)
11233     return SemaRef.MaybeBindToTemporary(E);
11234 
11235   // FIXME: Wrong source location information for the '('.
11236   SourceLocation FakeLParenLoc
11237     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11238 
11239   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11240   if (E->hasStoredFPFeatures()) {
11241     FPOptionsOverride NewOverrides = E->getFPFeatures();
11242     getSema().CurFPFeatures =
11243         NewOverrides.applyOverrides(getSema().getLangOpts());
11244     getSema().FpPragmaStack.CurrentValue = NewOverrides;
11245   }
11246 
11247   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11248                                       Args,
11249                                       E->getRParenLoc());
11250 }
11251 
11252 template<typename Derived>
11253 ExprResult
11254 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
11255   ExprResult Base = getDerived().TransformExpr(E->getBase());
11256   if (Base.isInvalid())
11257     return ExprError();
11258 
11259   NestedNameSpecifierLoc QualifierLoc;
11260   if (E->hasQualifier()) {
11261     QualifierLoc
11262       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
11263 
11264     if (!QualifierLoc)
11265       return ExprError();
11266   }
11267   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11268 
11269   ValueDecl *Member
11270     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
11271                                                          E->getMemberDecl()));
11272   if (!Member)
11273     return ExprError();
11274 
11275   NamedDecl *FoundDecl = E->getFoundDecl();
11276   if (FoundDecl == E->getMemberDecl()) {
11277     FoundDecl = Member;
11278   } else {
11279     FoundDecl = cast_or_null<NamedDecl>(
11280                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
11281     if (!FoundDecl)
11282       return ExprError();
11283   }
11284 
11285   if (!getDerived().AlwaysRebuild() &&
11286       Base.get() == E->getBase() &&
11287       QualifierLoc == E->getQualifierLoc() &&
11288       Member == E->getMemberDecl() &&
11289       FoundDecl == E->getFoundDecl() &&
11290       !E->hasExplicitTemplateArgs()) {
11291 
11292     // Skip for member expression of (this->f), rebuilt thisi->f is needed
11293     // for Openmp where the field need to be privatizized in the case.
11294     if (!(isa<CXXThisExpr>(E->getBase()) &&
11295           getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) {
11296       // Mark it referenced in the new context regardless.
11297       // FIXME: this is a bit instantiation-specific.
11298       SemaRef.MarkMemberReferenced(E);
11299       return E;
11300     }
11301   }
11302 
11303   TemplateArgumentListInfo TransArgs;
11304   if (E->hasExplicitTemplateArgs()) {
11305     TransArgs.setLAngleLoc(E->getLAngleLoc());
11306     TransArgs.setRAngleLoc(E->getRAngleLoc());
11307     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11308                                                 E->getNumTemplateArgs(),
11309                                                 TransArgs))
11310       return ExprError();
11311   }
11312 
11313   // FIXME: Bogus source location for the operator
11314   SourceLocation FakeOperatorLoc =
11315       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
11316 
11317   // FIXME: to do this check properly, we will need to preserve the
11318   // first-qualifier-in-scope here, just in case we had a dependent
11319   // base (and therefore couldn't do the check) and a
11320   // nested-name-qualifier (and therefore could do the lookup).
11321   NamedDecl *FirstQualifierInScope = nullptr;
11322   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
11323   if (MemberNameInfo.getName()) {
11324     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
11325     if (!MemberNameInfo.getName())
11326       return ExprError();
11327   }
11328 
11329   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
11330                                         E->isArrow(),
11331                                         QualifierLoc,
11332                                         TemplateKWLoc,
11333                                         MemberNameInfo,
11334                                         Member,
11335                                         FoundDecl,
11336                                         (E->hasExplicitTemplateArgs()
11337                                            ? &TransArgs : nullptr),
11338                                         FirstQualifierInScope);
11339 }
11340 
11341 template<typename Derived>
11342 ExprResult
11343 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11344   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11345   if (LHS.isInvalid())
11346     return ExprError();
11347 
11348   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11349   if (RHS.isInvalid())
11350     return ExprError();
11351 
11352   if (!getDerived().AlwaysRebuild() &&
11353       LHS.get() == E->getLHS() &&
11354       RHS.get() == E->getRHS())
11355     return E;
11356 
11357   if (E->isCompoundAssignmentOp())
11358     // FPFeatures has already been established from trailing storage
11359     return getDerived().RebuildBinaryOperator(
11360         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11361   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11362   FPOptionsOverride NewOverrides(E->getFPFeatures());
11363   getSema().CurFPFeatures =
11364       NewOverrides.applyOverrides(getSema().getLangOpts());
11365   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11366   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11367                                             LHS.get(), RHS.get());
11368 }
11369 
11370 template <typename Derived>
11371 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11372     CXXRewrittenBinaryOperator *E) {
11373   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11374 
11375   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11376   if (LHS.isInvalid())
11377     return ExprError();
11378 
11379   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11380   if (RHS.isInvalid())
11381     return ExprError();
11382 
11383   // Extract the already-resolved callee declarations so that we can restrict
11384   // ourselves to using them as the unqualified lookup results when rebuilding.
11385   UnresolvedSet<2> UnqualLookups;
11386   bool ChangedAnyLookups = false;
11387   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11388                             const_cast<Expr *>(Decomp.InnerBinOp)};
11389   for (Expr *PossibleBinOp : PossibleBinOps) {
11390     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11391     if (!Op)
11392       continue;
11393     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11394     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11395       continue;
11396 
11397     // Transform the callee in case we built a call to a local extern
11398     // declaration.
11399     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11400         E->getOperatorLoc(), Callee->getFoundDecl()));
11401     if (!Found)
11402       return ExprError();
11403     if (Found != Callee->getFoundDecl())
11404       ChangedAnyLookups = true;
11405     UnqualLookups.addDecl(Found);
11406   }
11407 
11408   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11409       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11410     // Mark all functions used in the rewrite as referenced. Note that when
11411     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11412     // function calls, and/or there might be a user-defined conversion sequence
11413     // applied to the operands of the <.
11414     // FIXME: this is a bit instantiation-specific.
11415     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11416     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11417     return E;
11418   }
11419 
11420   return getDerived().RebuildCXXRewrittenBinaryOperator(
11421       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11422 }
11423 
11424 template<typename Derived>
11425 ExprResult
11426 TreeTransform<Derived>::TransformCompoundAssignOperator(
11427                                                       CompoundAssignOperator *E) {
11428   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11429   FPOptionsOverride NewOverrides(E->getFPFeatures());
11430   getSema().CurFPFeatures =
11431       NewOverrides.applyOverrides(getSema().getLangOpts());
11432   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11433   return getDerived().TransformBinaryOperator(E);
11434 }
11435 
11436 template<typename Derived>
11437 ExprResult TreeTransform<Derived>::
11438 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11439   // Just rebuild the common and RHS expressions and see whether we
11440   // get any changes.
11441 
11442   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11443   if (commonExpr.isInvalid())
11444     return ExprError();
11445 
11446   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11447   if (rhs.isInvalid())
11448     return ExprError();
11449 
11450   if (!getDerived().AlwaysRebuild() &&
11451       commonExpr.get() == e->getCommon() &&
11452       rhs.get() == e->getFalseExpr())
11453     return e;
11454 
11455   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11456                                                  e->getQuestionLoc(),
11457                                                  nullptr,
11458                                                  e->getColonLoc(),
11459                                                  rhs.get());
11460 }
11461 
11462 template<typename Derived>
11463 ExprResult
11464 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11465   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11466   if (Cond.isInvalid())
11467     return ExprError();
11468 
11469   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11470   if (LHS.isInvalid())
11471     return ExprError();
11472 
11473   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11474   if (RHS.isInvalid())
11475     return ExprError();
11476 
11477   if (!getDerived().AlwaysRebuild() &&
11478       Cond.get() == E->getCond() &&
11479       LHS.get() == E->getLHS() &&
11480       RHS.get() == E->getRHS())
11481     return E;
11482 
11483   return getDerived().RebuildConditionalOperator(Cond.get(),
11484                                                  E->getQuestionLoc(),
11485                                                  LHS.get(),
11486                                                  E->getColonLoc(),
11487                                                  RHS.get());
11488 }
11489 
11490 template<typename Derived>
11491 ExprResult
11492 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11493   // Implicit casts are eliminated during transformation, since they
11494   // will be recomputed by semantic analysis after transformation.
11495   return getDerived().TransformExpr(E->getSubExprAsWritten());
11496 }
11497 
11498 template<typename Derived>
11499 ExprResult
11500 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11501   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11502   if (!Type)
11503     return ExprError();
11504 
11505   ExprResult SubExpr
11506     = getDerived().TransformExpr(E->getSubExprAsWritten());
11507   if (SubExpr.isInvalid())
11508     return ExprError();
11509 
11510   if (!getDerived().AlwaysRebuild() &&
11511       Type == E->getTypeInfoAsWritten() &&
11512       SubExpr.get() == E->getSubExpr())
11513     return E;
11514 
11515   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11516                                             Type,
11517                                             E->getRParenLoc(),
11518                                             SubExpr.get());
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
11523 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11524   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11525   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11526   if (!NewT)
11527     return ExprError();
11528 
11529   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11530   if (Init.isInvalid())
11531     return ExprError();
11532 
11533   if (!getDerived().AlwaysRebuild() &&
11534       OldT == NewT &&
11535       Init.get() == E->getInitializer())
11536     return SemaRef.MaybeBindToTemporary(E);
11537 
11538   // Note: the expression type doesn't necessarily match the
11539   // type-as-written, but that's okay, because it should always be
11540   // derivable from the initializer.
11541 
11542   return getDerived().RebuildCompoundLiteralExpr(
11543       E->getLParenLoc(), NewT,
11544       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11545 }
11546 
11547 template<typename Derived>
11548 ExprResult
11549 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11550   ExprResult Base = getDerived().TransformExpr(E->getBase());
11551   if (Base.isInvalid())
11552     return ExprError();
11553 
11554   if (!getDerived().AlwaysRebuild() &&
11555       Base.get() == E->getBase())
11556     return E;
11557 
11558   // FIXME: Bad source location
11559   SourceLocation FakeOperatorLoc =
11560       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11561   return getDerived().RebuildExtVectorElementExpr(
11562       Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
11563       E->getAccessor());
11564 }
11565 
11566 template<typename Derived>
11567 ExprResult
11568 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11569   if (InitListExpr *Syntactic = E->getSyntacticForm())
11570     E = Syntactic;
11571 
11572   bool InitChanged = false;
11573 
11574   EnterExpressionEvaluationContext Context(
11575       getSema(), EnterExpressionEvaluationContext::InitList);
11576 
11577   SmallVector<Expr*, 4> Inits;
11578   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11579                                   Inits, &InitChanged))
11580     return ExprError();
11581 
11582   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11583     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11584     // in some cases. We can't reuse it in general, because the syntactic and
11585     // semantic forms are linked, and we can't know that semantic form will
11586     // match even if the syntactic form does.
11587   }
11588 
11589   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11590                                       E->getRBraceLoc());
11591 }
11592 
11593 template<typename Derived>
11594 ExprResult
11595 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11596   Designation Desig;
11597 
11598   // transform the initializer value
11599   ExprResult Init = getDerived().TransformExpr(E->getInit());
11600   if (Init.isInvalid())
11601     return ExprError();
11602 
11603   // transform the designators.
11604   SmallVector<Expr*, 4> ArrayExprs;
11605   bool ExprChanged = false;
11606   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11607     if (D.isFieldDesignator()) {
11608       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11609                                                D.getDotLoc(),
11610                                                D.getFieldLoc()));
11611       if (D.getField()) {
11612         FieldDecl *Field = cast_or_null<FieldDecl>(
11613             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11614         if (Field != D.getField())
11615           // Rebuild the expression when the transformed FieldDecl is
11616           // different to the already assigned FieldDecl.
11617           ExprChanged = true;
11618       } else {
11619         // Ensure that the designator expression is rebuilt when there isn't
11620         // a resolved FieldDecl in the designator as we don't want to assign
11621         // a FieldDecl to a pattern designator that will be instantiated again.
11622         ExprChanged = true;
11623       }
11624       continue;
11625     }
11626 
11627     if (D.isArrayDesignator()) {
11628       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11629       if (Index.isInvalid())
11630         return ExprError();
11631 
11632       Desig.AddDesignator(
11633           Designator::getArray(Index.get(), D.getLBracketLoc()));
11634 
11635       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11636       ArrayExprs.push_back(Index.get());
11637       continue;
11638     }
11639 
11640     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11641     ExprResult Start
11642       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11643     if (Start.isInvalid())
11644       return ExprError();
11645 
11646     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11647     if (End.isInvalid())
11648       return ExprError();
11649 
11650     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11651                                                   End.get(),
11652                                                   D.getLBracketLoc(),
11653                                                   D.getEllipsisLoc()));
11654 
11655     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11656                   End.get() != E->getArrayRangeEnd(D);
11657 
11658     ArrayExprs.push_back(Start.get());
11659     ArrayExprs.push_back(End.get());
11660   }
11661 
11662   if (!getDerived().AlwaysRebuild() &&
11663       Init.get() == E->getInit() &&
11664       !ExprChanged)
11665     return E;
11666 
11667   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11668                                                 E->getEqualOrColonLoc(),
11669                                                 E->usesGNUSyntax(), Init.get());
11670 }
11671 
11672 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11673 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11674 template<typename Derived>
11675 ExprResult
11676 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11677     DesignatedInitUpdateExpr *E) {
11678   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11679                    "initializer");
11680   return ExprError();
11681 }
11682 
11683 template<typename Derived>
11684 ExprResult
11685 TreeTransform<Derived>::TransformNoInitExpr(
11686     NoInitExpr *E) {
11687   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11688   return ExprError();
11689 }
11690 
11691 template<typename Derived>
11692 ExprResult
11693 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11694   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11695   return ExprError();
11696 }
11697 
11698 template<typename Derived>
11699 ExprResult
11700 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11701   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11702   return ExprError();
11703 }
11704 
11705 template<typename Derived>
11706 ExprResult
11707 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11708                                                      ImplicitValueInitExpr *E) {
11709   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11710 
11711   // FIXME: Will we ever have proper type location here? Will we actually
11712   // need to transform the type?
11713   QualType T = getDerived().TransformType(E->getType());
11714   if (T.isNull())
11715     return ExprError();
11716 
11717   if (!getDerived().AlwaysRebuild() &&
11718       T == E->getType())
11719     return E;
11720 
11721   return getDerived().RebuildImplicitValueInitExpr(T);
11722 }
11723 
11724 template<typename Derived>
11725 ExprResult
11726 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11727   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11728   if (!TInfo)
11729     return ExprError();
11730 
11731   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11732   if (SubExpr.isInvalid())
11733     return ExprError();
11734 
11735   if (!getDerived().AlwaysRebuild() &&
11736       TInfo == E->getWrittenTypeInfo() &&
11737       SubExpr.get() == E->getSubExpr())
11738     return E;
11739 
11740   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11741                                        TInfo, E->getRParenLoc());
11742 }
11743 
11744 template<typename Derived>
11745 ExprResult
11746 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11747   bool ArgumentChanged = false;
11748   SmallVector<Expr*, 4> Inits;
11749   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11750                      &ArgumentChanged))
11751     return ExprError();
11752 
11753   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11754                                            Inits,
11755                                            E->getRParenLoc());
11756 }
11757 
11758 /// Transform an address-of-label expression.
11759 ///
11760 /// By default, the transformation of an address-of-label expression always
11761 /// rebuilds the expression, so that the label identifier can be resolved to
11762 /// the corresponding label statement by semantic analysis.
11763 template<typename Derived>
11764 ExprResult
11765 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11766   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11767                                         E->getLabel());
11768   if (!LD)
11769     return ExprError();
11770 
11771   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11772                                            cast<LabelDecl>(LD));
11773 }
11774 
11775 template<typename Derived>
11776 ExprResult
11777 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11778   SemaRef.ActOnStartStmtExpr();
11779   StmtResult SubStmt
11780     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11781   if (SubStmt.isInvalid()) {
11782     SemaRef.ActOnStmtExprError();
11783     return ExprError();
11784   }
11785 
11786   unsigned OldDepth = E->getTemplateDepth();
11787   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11788 
11789   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11790       SubStmt.get() == E->getSubStmt()) {
11791     // Calling this an 'error' is unintuitive, but it does the right thing.
11792     SemaRef.ActOnStmtExprError();
11793     return SemaRef.MaybeBindToTemporary(E);
11794   }
11795 
11796   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11797                                       E->getRParenLoc(), NewDepth);
11798 }
11799 
11800 template<typename Derived>
11801 ExprResult
11802 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11803   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11804   if (Cond.isInvalid())
11805     return ExprError();
11806 
11807   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11808   if (LHS.isInvalid())
11809     return ExprError();
11810 
11811   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11812   if (RHS.isInvalid())
11813     return ExprError();
11814 
11815   if (!getDerived().AlwaysRebuild() &&
11816       Cond.get() == E->getCond() &&
11817       LHS.get() == E->getLHS() &&
11818       RHS.get() == E->getRHS())
11819     return E;
11820 
11821   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11822                                         Cond.get(), LHS.get(), RHS.get(),
11823                                         E->getRParenLoc());
11824 }
11825 
11826 template<typename Derived>
11827 ExprResult
11828 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11829   return E;
11830 }
11831 
11832 template<typename Derived>
11833 ExprResult
11834 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11835   switch (E->getOperator()) {
11836   case OO_New:
11837   case OO_Delete:
11838   case OO_Array_New:
11839   case OO_Array_Delete:
11840     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11841 
11842   case OO_Subscript:
11843   case OO_Call: {
11844     // This is a call to an object's operator().
11845     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11846 
11847     // Transform the object itself.
11848     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11849     if (Object.isInvalid())
11850       return ExprError();
11851 
11852     // FIXME: Poor location information
11853     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11854         static_cast<Expr *>(Object.get())->getEndLoc());
11855 
11856     // Transform the call arguments.
11857     SmallVector<Expr*, 8> Args;
11858     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11859                                     Args))
11860       return ExprError();
11861 
11862     if (E->getOperator() == OO_Subscript)
11863       return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc,
11864                                                   Args, E->getEndLoc());
11865 
11866     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11867                                         E->getEndLoc());
11868   }
11869 
11870 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly)  \
11871   case OO_##Name:                                                              \
11872     break;
11873 
11874 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11875 #include "clang/Basic/OperatorKinds.def"
11876 
11877   case OO_Conditional:
11878     llvm_unreachable("conditional operator is not actually overloadable");
11879 
11880   case OO_None:
11881   case NUM_OVERLOADED_OPERATORS:
11882     llvm_unreachable("not an overloaded operator?");
11883   }
11884 
11885   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11886   if (Callee.isInvalid())
11887     return ExprError();
11888 
11889   ExprResult First;
11890   if (E->getOperator() == OO_Amp)
11891     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11892   else
11893     First = getDerived().TransformExpr(E->getArg(0));
11894   if (First.isInvalid())
11895     return ExprError();
11896 
11897   ExprResult Second;
11898   if (E->getNumArgs() == 2) {
11899     Second = getDerived().TransformExpr(E->getArg(1));
11900     if (Second.isInvalid())
11901       return ExprError();
11902   }
11903 
11904   if (!getDerived().AlwaysRebuild() &&
11905       Callee.get() == E->getCallee() &&
11906       First.get() == E->getArg(0) &&
11907       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11908     return SemaRef.MaybeBindToTemporary(E);
11909 
11910   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11911   FPOptionsOverride NewOverrides(E->getFPFeatures());
11912   getSema().CurFPFeatures =
11913       NewOverrides.applyOverrides(getSema().getLangOpts());
11914   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11915 
11916   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11917                                                  E->getOperatorLoc(),
11918                                                  Callee.get(),
11919                                                  First.get(),
11920                                                  Second.get());
11921 }
11922 
11923 template<typename Derived>
11924 ExprResult
11925 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11926   return getDerived().TransformCallExpr(E);
11927 }
11928 
11929 template <typename Derived>
11930 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11931   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11932                          getSema().CurContext != E->getParentContext();
11933 
11934   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11935     return E;
11936 
11937   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(),
11938                                            E->getBeginLoc(), E->getEndLoc(),
11939                                            getSema().CurContext);
11940 }
11941 
11942 template<typename Derived>
11943 ExprResult
11944 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11945   // Transform the callee.
11946   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11947   if (Callee.isInvalid())
11948     return ExprError();
11949 
11950   // Transform exec config.
11951   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11952   if (EC.isInvalid())
11953     return ExprError();
11954 
11955   // Transform arguments.
11956   bool ArgChanged = false;
11957   SmallVector<Expr*, 8> Args;
11958   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11959                                   &ArgChanged))
11960     return ExprError();
11961 
11962   if (!getDerived().AlwaysRebuild() &&
11963       Callee.get() == E->getCallee() &&
11964       !ArgChanged)
11965     return SemaRef.MaybeBindToTemporary(E);
11966 
11967   // FIXME: Wrong source location information for the '('.
11968   SourceLocation FakeLParenLoc
11969     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11970   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11971                                       Args,
11972                                       E->getRParenLoc(), EC.get());
11973 }
11974 
11975 template<typename Derived>
11976 ExprResult
11977 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11978   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11979   if (!Type)
11980     return ExprError();
11981 
11982   ExprResult SubExpr
11983     = getDerived().TransformExpr(E->getSubExprAsWritten());
11984   if (SubExpr.isInvalid())
11985     return ExprError();
11986 
11987   if (!getDerived().AlwaysRebuild() &&
11988       Type == E->getTypeInfoAsWritten() &&
11989       SubExpr.get() == E->getSubExpr())
11990     return E;
11991   return getDerived().RebuildCXXNamedCastExpr(
11992       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11993       Type, E->getAngleBrackets().getEnd(),
11994       // FIXME. this should be '(' location
11995       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11996 }
11997 
11998 template<typename Derived>
11999 ExprResult
12000 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
12001   TypeSourceInfo *TSI =
12002       getDerived().TransformType(BCE->getTypeInfoAsWritten());
12003   if (!TSI)
12004     return ExprError();
12005 
12006   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
12007   if (Sub.isInvalid())
12008     return ExprError();
12009 
12010   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
12011                                                 Sub.get(), BCE->getEndLoc());
12012 }
12013 
12014 template<typename Derived>
12015 ExprResult
12016 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
12017   return getDerived().TransformCXXNamedCastExpr(E);
12018 }
12019 
12020 template<typename Derived>
12021 ExprResult
12022 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
12023   return getDerived().TransformCXXNamedCastExpr(E);
12024 }
12025 
12026 template<typename Derived>
12027 ExprResult
12028 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
12029                                                       CXXReinterpretCastExpr *E) {
12030   return getDerived().TransformCXXNamedCastExpr(E);
12031 }
12032 
12033 template<typename Derived>
12034 ExprResult
12035 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
12036   return getDerived().TransformCXXNamedCastExpr(E);
12037 }
12038 
12039 template<typename Derived>
12040 ExprResult
12041 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
12042   return getDerived().TransformCXXNamedCastExpr(E);
12043 }
12044 
12045 template<typename Derived>
12046 ExprResult
12047 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
12048                                                      CXXFunctionalCastExpr *E) {
12049   TypeSourceInfo *Type =
12050       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
12051   if (!Type)
12052     return ExprError();
12053 
12054   ExprResult SubExpr
12055     = getDerived().TransformExpr(E->getSubExprAsWritten());
12056   if (SubExpr.isInvalid())
12057     return ExprError();
12058 
12059   if (!getDerived().AlwaysRebuild() &&
12060       Type == E->getTypeInfoAsWritten() &&
12061       SubExpr.get() == E->getSubExpr())
12062     return E;
12063 
12064   return getDerived().RebuildCXXFunctionalCastExpr(Type,
12065                                                    E->getLParenLoc(),
12066                                                    SubExpr.get(),
12067                                                    E->getRParenLoc(),
12068                                                    E->isListInitialization());
12069 }
12070 
12071 template<typename Derived>
12072 ExprResult
12073 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
12074   if (E->isTypeOperand()) {
12075     TypeSourceInfo *TInfo
12076       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12077     if (!TInfo)
12078       return ExprError();
12079 
12080     if (!getDerived().AlwaysRebuild() &&
12081         TInfo == E->getTypeOperandSourceInfo())
12082       return E;
12083 
12084     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12085                                              TInfo, E->getEndLoc());
12086   }
12087 
12088   // Typeid's operand is an unevaluated context, unless it's a polymorphic
12089   // type.  We must not unilaterally enter unevaluated context here, as then
12090   // semantic processing can re-transform an already transformed operand.
12091   Expr *Op = E->getExprOperand();
12092   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
12093   if (E->isGLValue())
12094     if (auto *RecordT = Op->getType()->getAs<RecordType>())
12095       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
12096         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
12097 
12098   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
12099                                                Sema::ReuseLambdaContextDecl);
12100 
12101   ExprResult SubExpr = getDerived().TransformExpr(Op);
12102   if (SubExpr.isInvalid())
12103     return ExprError();
12104 
12105   if (!getDerived().AlwaysRebuild() &&
12106       SubExpr.get() == E->getExprOperand())
12107     return E;
12108 
12109   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
12110                                            SubExpr.get(), E->getEndLoc());
12111 }
12112 
12113 template<typename Derived>
12114 ExprResult
12115 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
12116   if (E->isTypeOperand()) {
12117     TypeSourceInfo *TInfo
12118       = getDerived().TransformType(E->getTypeOperandSourceInfo());
12119     if (!TInfo)
12120       return ExprError();
12121 
12122     if (!getDerived().AlwaysRebuild() &&
12123         TInfo == E->getTypeOperandSourceInfo())
12124       return E;
12125 
12126     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12127                                              TInfo, E->getEndLoc());
12128   }
12129 
12130   EnterExpressionEvaluationContext Unevaluated(
12131       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12132 
12133   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
12134   if (SubExpr.isInvalid())
12135     return ExprError();
12136 
12137   if (!getDerived().AlwaysRebuild() &&
12138       SubExpr.get() == E->getExprOperand())
12139     return E;
12140 
12141   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
12142                                            SubExpr.get(), E->getEndLoc());
12143 }
12144 
12145 template<typename Derived>
12146 ExprResult
12147 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
12148   return E;
12149 }
12150 
12151 template<typename Derived>
12152 ExprResult
12153 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
12154                                                      CXXNullPtrLiteralExpr *E) {
12155   return E;
12156 }
12157 
12158 template<typename Derived>
12159 ExprResult
12160 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
12161   QualType T = getSema().getCurrentThisType();
12162 
12163   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
12164     // Mark it referenced in the new context regardless.
12165     // FIXME: this is a bit instantiation-specific.
12166     getSema().MarkThisReferenced(E);
12167     return E;
12168   }
12169 
12170   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
12171 }
12172 
12173 template<typename Derived>
12174 ExprResult
12175 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
12176   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
12177   if (SubExpr.isInvalid())
12178     return ExprError();
12179 
12180   if (!getDerived().AlwaysRebuild() &&
12181       SubExpr.get() == E->getSubExpr())
12182     return E;
12183 
12184   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
12185                                           E->isThrownVariableInScope());
12186 }
12187 
12188 template<typename Derived>
12189 ExprResult
12190 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
12191   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
12192       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
12193   if (!Param)
12194     return ExprError();
12195 
12196   ExprResult InitRes;
12197   if (E->hasRewrittenInit()) {
12198     InitRes = getDerived().TransformExpr(E->getRewrittenExpr());
12199     if (InitRes.isInvalid())
12200       return ExprError();
12201   }
12202 
12203   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
12204       E->getUsedContext() == SemaRef.CurContext &&
12205       InitRes.get() == E->getRewrittenExpr())
12206     return E;
12207 
12208   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param,
12209                                                InitRes.get());
12210 }
12211 
12212 template<typename Derived>
12213 ExprResult
12214 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
12215   FieldDecl *Field = cast_or_null<FieldDecl>(
12216       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
12217   if (!Field)
12218     return ExprError();
12219 
12220   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
12221       E->getUsedContext() == SemaRef.CurContext)
12222     return E;
12223 
12224   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
12225 }
12226 
12227 template<typename Derived>
12228 ExprResult
12229 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
12230                                                     CXXScalarValueInitExpr *E) {
12231   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
12232   if (!T)
12233     return ExprError();
12234 
12235   if (!getDerived().AlwaysRebuild() &&
12236       T == E->getTypeSourceInfo())
12237     return E;
12238 
12239   return getDerived().RebuildCXXScalarValueInitExpr(T,
12240                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
12241                                                     E->getRParenLoc());
12242 }
12243 
12244 template<typename Derived>
12245 ExprResult
12246 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
12247   // Transform the type that we're allocating
12248   TypeSourceInfo *AllocTypeInfo =
12249       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
12250   if (!AllocTypeInfo)
12251     return ExprError();
12252 
12253   // Transform the size of the array we're allocating (if any).
12254   std::optional<Expr *> ArraySize;
12255   if (E->isArray()) {
12256     ExprResult NewArraySize;
12257     if (std::optional<Expr *> OldArraySize = E->getArraySize()) {
12258       NewArraySize = getDerived().TransformExpr(*OldArraySize);
12259       if (NewArraySize.isInvalid())
12260         return ExprError();
12261     }
12262     ArraySize = NewArraySize.get();
12263   }
12264 
12265   // Transform the placement arguments (if any).
12266   bool ArgumentChanged = false;
12267   SmallVector<Expr*, 8> PlacementArgs;
12268   if (getDerived().TransformExprs(E->getPlacementArgs(),
12269                                   E->getNumPlacementArgs(), true,
12270                                   PlacementArgs, &ArgumentChanged))
12271     return ExprError();
12272 
12273   // Transform the initializer (if any).
12274   Expr *OldInit = E->getInitializer();
12275   ExprResult NewInit;
12276   if (OldInit)
12277     NewInit = getDerived().TransformInitializer(OldInit, true);
12278   if (NewInit.isInvalid())
12279     return ExprError();
12280 
12281   // Transform new operator and delete operator.
12282   FunctionDecl *OperatorNew = nullptr;
12283   if (E->getOperatorNew()) {
12284     OperatorNew = cast_or_null<FunctionDecl>(
12285         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
12286     if (!OperatorNew)
12287       return ExprError();
12288   }
12289 
12290   FunctionDecl *OperatorDelete = nullptr;
12291   if (E->getOperatorDelete()) {
12292     OperatorDelete = cast_or_null<FunctionDecl>(
12293         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12294     if (!OperatorDelete)
12295       return ExprError();
12296   }
12297 
12298   if (!getDerived().AlwaysRebuild() &&
12299       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
12300       ArraySize == E->getArraySize() &&
12301       NewInit.get() == OldInit &&
12302       OperatorNew == E->getOperatorNew() &&
12303       OperatorDelete == E->getOperatorDelete() &&
12304       !ArgumentChanged) {
12305     // Mark any declarations we need as referenced.
12306     // FIXME: instantiation-specific.
12307     if (OperatorNew)
12308       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
12309     if (OperatorDelete)
12310       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12311 
12312     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
12313       QualType ElementType
12314         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
12315       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
12316         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
12317         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
12318           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
12319         }
12320       }
12321     }
12322 
12323     return E;
12324   }
12325 
12326   QualType AllocType = AllocTypeInfo->getType();
12327   if (!ArraySize) {
12328     // If no array size was specified, but the new expression was
12329     // instantiated with an array type (e.g., "new T" where T is
12330     // instantiated with "int[4]"), extract the outer bound from the
12331     // array type as our array size. We do this with constant and
12332     // dependently-sized array types.
12333     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
12334     if (!ArrayT) {
12335       // Do nothing
12336     } else if (const ConstantArrayType *ConsArrayT
12337                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
12338       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
12339                                          SemaRef.Context.getSizeType(),
12340                                          /*FIXME:*/ E->getBeginLoc());
12341       AllocType = ConsArrayT->getElementType();
12342     } else if (const DependentSizedArrayType *DepArrayT
12343                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
12344       if (DepArrayT->getSizeExpr()) {
12345         ArraySize = DepArrayT->getSizeExpr();
12346         AllocType = DepArrayT->getElementType();
12347       }
12348     }
12349   }
12350 
12351   return getDerived().RebuildCXXNewExpr(
12352       E->getBeginLoc(), E->isGlobalNew(),
12353       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12354       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12355       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12356 }
12357 
12358 template<typename Derived>
12359 ExprResult
12360 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12361   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12362   if (Operand.isInvalid())
12363     return ExprError();
12364 
12365   // Transform the delete operator, if known.
12366   FunctionDecl *OperatorDelete = nullptr;
12367   if (E->getOperatorDelete()) {
12368     OperatorDelete = cast_or_null<FunctionDecl>(
12369         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12370     if (!OperatorDelete)
12371       return ExprError();
12372   }
12373 
12374   if (!getDerived().AlwaysRebuild() &&
12375       Operand.get() == E->getArgument() &&
12376       OperatorDelete == E->getOperatorDelete()) {
12377     // Mark any declarations we need as referenced.
12378     // FIXME: instantiation-specific.
12379     if (OperatorDelete)
12380       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12381 
12382     if (!E->getArgument()->isTypeDependent()) {
12383       QualType Destroyed = SemaRef.Context.getBaseElementType(
12384                                                          E->getDestroyedType());
12385       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12386         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12387         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12388                                        SemaRef.LookupDestructor(Record));
12389       }
12390     }
12391 
12392     return E;
12393   }
12394 
12395   return getDerived().RebuildCXXDeleteExpr(
12396       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12397 }
12398 
12399 template<typename Derived>
12400 ExprResult
12401 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12402                                                      CXXPseudoDestructorExpr *E) {
12403   ExprResult Base = getDerived().TransformExpr(E->getBase());
12404   if (Base.isInvalid())
12405     return ExprError();
12406 
12407   ParsedType ObjectTypePtr;
12408   bool MayBePseudoDestructor = false;
12409   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12410                                               E->getOperatorLoc(),
12411                                         E->isArrow()? tok::arrow : tok::period,
12412                                               ObjectTypePtr,
12413                                               MayBePseudoDestructor);
12414   if (Base.isInvalid())
12415     return ExprError();
12416 
12417   QualType ObjectType = ObjectTypePtr.get();
12418   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12419   if (QualifierLoc) {
12420     QualifierLoc
12421       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12422     if (!QualifierLoc)
12423       return ExprError();
12424   }
12425   CXXScopeSpec SS;
12426   SS.Adopt(QualifierLoc);
12427 
12428   PseudoDestructorTypeStorage Destroyed;
12429   if (E->getDestroyedTypeInfo()) {
12430     TypeSourceInfo *DestroyedTypeInfo
12431       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12432                                                 ObjectType, nullptr, SS);
12433     if (!DestroyedTypeInfo)
12434       return ExprError();
12435     Destroyed = DestroyedTypeInfo;
12436   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12437     // We aren't likely to be able to resolve the identifier down to a type
12438     // now anyway, so just retain the identifier.
12439     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12440                                             E->getDestroyedTypeLoc());
12441   } else {
12442     // Look for a destructor known with the given name.
12443     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12444                                               *E->getDestroyedTypeIdentifier(),
12445                                                 E->getDestroyedTypeLoc(),
12446                                                 /*Scope=*/nullptr,
12447                                                 SS, ObjectTypePtr,
12448                                                 false);
12449     if (!T)
12450       return ExprError();
12451 
12452     Destroyed
12453       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12454                                                  E->getDestroyedTypeLoc());
12455   }
12456 
12457   TypeSourceInfo *ScopeTypeInfo = nullptr;
12458   if (E->getScopeTypeInfo()) {
12459     CXXScopeSpec EmptySS;
12460     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12461                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12462     if (!ScopeTypeInfo)
12463       return ExprError();
12464   }
12465 
12466   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12467                                                      E->getOperatorLoc(),
12468                                                      E->isArrow(),
12469                                                      SS,
12470                                                      ScopeTypeInfo,
12471                                                      E->getColonColonLoc(),
12472                                                      E->getTildeLoc(),
12473                                                      Destroyed);
12474 }
12475 
12476 template <typename Derived>
12477 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12478                                                         bool RequiresADL,
12479                                                         LookupResult &R) {
12480   // Transform all the decls.
12481   bool AllEmptyPacks = true;
12482   for (auto *OldD : Old->decls()) {
12483     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12484     if (!InstD) {
12485       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12486       // This can happen because of dependent hiding.
12487       if (isa<UsingShadowDecl>(OldD))
12488         continue;
12489       else {
12490         R.clear();
12491         return true;
12492       }
12493     }
12494 
12495     // Expand using pack declarations.
12496     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12497     ArrayRef<NamedDecl*> Decls = SingleDecl;
12498     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12499       Decls = UPD->expansions();
12500 
12501     // Expand using declarations.
12502     for (auto *D : Decls) {
12503       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12504         for (auto *SD : UD->shadows())
12505           R.addDecl(SD);
12506       } else {
12507         R.addDecl(D);
12508       }
12509     }
12510 
12511     AllEmptyPacks &= Decls.empty();
12512   };
12513 
12514   // C++ [temp.res]/8.4.2:
12515   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12516   //   a name in the template definition found a using-declaration, but the
12517   //   lookup in the corresponding scope in the instantiation odoes not find
12518   //   any declarations because the using-declaration was a pack expansion and
12519   //   the corresponding pack is empty
12520   if (AllEmptyPacks && !RequiresADL) {
12521     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12522         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12523     return true;
12524   }
12525 
12526   // Resolve a kind, but don't do any further analysis.  If it's
12527   // ambiguous, the callee needs to deal with it.
12528   R.resolveKind();
12529   return false;
12530 }
12531 
12532 template<typename Derived>
12533 ExprResult
12534 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12535                                                   UnresolvedLookupExpr *Old) {
12536   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12537                  Sema::LookupOrdinaryName);
12538 
12539   // Transform the declaration set.
12540   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12541     return ExprError();
12542 
12543   // Rebuild the nested-name qualifier, if present.
12544   CXXScopeSpec SS;
12545   if (Old->getQualifierLoc()) {
12546     NestedNameSpecifierLoc QualifierLoc
12547       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12548     if (!QualifierLoc)
12549       return ExprError();
12550 
12551     SS.Adopt(QualifierLoc);
12552   }
12553 
12554   if (Old->getNamingClass()) {
12555     CXXRecordDecl *NamingClass
12556       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12557                                                             Old->getNameLoc(),
12558                                                         Old->getNamingClass()));
12559     if (!NamingClass) {
12560       R.clear();
12561       return ExprError();
12562     }
12563 
12564     R.setNamingClass(NamingClass);
12565   }
12566 
12567   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12568 
12569   // If we have neither explicit template arguments, nor the template keyword,
12570   // it's a normal declaration name or member reference.
12571   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12572     NamedDecl *D = R.getAsSingle<NamedDecl>();
12573     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12574     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12575     // give a good diagnostic.
12576     if (D && D->isCXXInstanceMember()) {
12577       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12578                                                      /*TemplateArgs=*/nullptr,
12579                                                      /*Scope=*/nullptr);
12580     }
12581 
12582     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12583   }
12584 
12585   // If we have template arguments, rebuild them, then rebuild the
12586   // templateid expression.
12587   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12588   if (Old->hasExplicitTemplateArgs() &&
12589       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12590                                               Old->getNumTemplateArgs(),
12591                                               TransArgs)) {
12592     R.clear();
12593     return ExprError();
12594   }
12595 
12596   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12597                                             Old->requiresADL(), &TransArgs);
12598 }
12599 
12600 template<typename Derived>
12601 ExprResult
12602 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12603   bool ArgChanged = false;
12604   SmallVector<TypeSourceInfo *, 4> Args;
12605   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12606     TypeSourceInfo *From = E->getArg(I);
12607     TypeLoc FromTL = From->getTypeLoc();
12608     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12609       TypeLocBuilder TLB;
12610       TLB.reserve(FromTL.getFullDataSize());
12611       QualType To = getDerived().TransformType(TLB, FromTL);
12612       if (To.isNull())
12613         return ExprError();
12614 
12615       if (To == From->getType())
12616         Args.push_back(From);
12617       else {
12618         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12619         ArgChanged = true;
12620       }
12621       continue;
12622     }
12623 
12624     ArgChanged = true;
12625 
12626     // We have a pack expansion. Instantiate it.
12627     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12628     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12629     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12630     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12631 
12632     // Determine whether the set of unexpanded parameter packs can and should
12633     // be expanded.
12634     bool Expand = true;
12635     bool RetainExpansion = false;
12636     std::optional<unsigned> OrigNumExpansions =
12637         ExpansionTL.getTypePtr()->getNumExpansions();
12638     std::optional<unsigned> NumExpansions = OrigNumExpansions;
12639     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12640                                              PatternTL.getSourceRange(),
12641                                              Unexpanded,
12642                                              Expand, RetainExpansion,
12643                                              NumExpansions))
12644       return ExprError();
12645 
12646     if (!Expand) {
12647       // The transform has determined that we should perform a simple
12648       // transformation on the pack expansion, producing another pack
12649       // expansion.
12650       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12651 
12652       TypeLocBuilder TLB;
12653       TLB.reserve(From->getTypeLoc().getFullDataSize());
12654 
12655       QualType To = getDerived().TransformType(TLB, PatternTL);
12656       if (To.isNull())
12657         return ExprError();
12658 
12659       To = getDerived().RebuildPackExpansionType(To,
12660                                                  PatternTL.getSourceRange(),
12661                                                  ExpansionTL.getEllipsisLoc(),
12662                                                  NumExpansions);
12663       if (To.isNull())
12664         return ExprError();
12665 
12666       PackExpansionTypeLoc ToExpansionTL
12667         = TLB.push<PackExpansionTypeLoc>(To);
12668       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12669       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12670       continue;
12671     }
12672 
12673     // Expand the pack expansion by substituting for each argument in the
12674     // pack(s).
12675     for (unsigned I = 0; I != *NumExpansions; ++I) {
12676       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12677       TypeLocBuilder TLB;
12678       TLB.reserve(PatternTL.getFullDataSize());
12679       QualType To = getDerived().TransformType(TLB, PatternTL);
12680       if (To.isNull())
12681         return ExprError();
12682 
12683       if (To->containsUnexpandedParameterPack()) {
12684         To = getDerived().RebuildPackExpansionType(To,
12685                                                    PatternTL.getSourceRange(),
12686                                                    ExpansionTL.getEllipsisLoc(),
12687                                                    NumExpansions);
12688         if (To.isNull())
12689           return ExprError();
12690 
12691         PackExpansionTypeLoc ToExpansionTL
12692           = TLB.push<PackExpansionTypeLoc>(To);
12693         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12694       }
12695 
12696       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12697     }
12698 
12699     if (!RetainExpansion)
12700       continue;
12701 
12702     // If we're supposed to retain a pack expansion, do so by temporarily
12703     // forgetting the partially-substituted parameter pack.
12704     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12705 
12706     TypeLocBuilder TLB;
12707     TLB.reserve(From->getTypeLoc().getFullDataSize());
12708 
12709     QualType To = getDerived().TransformType(TLB, PatternTL);
12710     if (To.isNull())
12711       return ExprError();
12712 
12713     To = getDerived().RebuildPackExpansionType(To,
12714                                                PatternTL.getSourceRange(),
12715                                                ExpansionTL.getEllipsisLoc(),
12716                                                NumExpansions);
12717     if (To.isNull())
12718       return ExprError();
12719 
12720     PackExpansionTypeLoc ToExpansionTL
12721       = TLB.push<PackExpansionTypeLoc>(To);
12722     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12723     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12724   }
12725 
12726   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12727     return E;
12728 
12729   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12730                                        E->getEndLoc());
12731 }
12732 
12733 template<typename Derived>
12734 ExprResult
12735 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12736                                                  ConceptSpecializationExpr *E) {
12737   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12738   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12739   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12740                                               Old->NumTemplateArgs, TransArgs))
12741     return ExprError();
12742 
12743   return getDerived().RebuildConceptSpecializationExpr(
12744       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12745       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12746       &TransArgs);
12747 }
12748 
12749 template<typename Derived>
12750 ExprResult
12751 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12752   SmallVector<ParmVarDecl*, 4> TransParams;
12753   SmallVector<QualType, 4> TransParamTypes;
12754   Sema::ExtParameterInfoBuilder ExtParamInfos;
12755 
12756   // C++2a [expr.prim.req]p2
12757   // Expressions appearing within a requirement-body are unevaluated operands.
12758   EnterExpressionEvaluationContext Ctx(
12759       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
12760       Sema::ReuseLambdaContextDecl);
12761 
12762   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12763       getSema().Context, getSema().CurContext,
12764       E->getBody()->getBeginLoc());
12765 
12766   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12767 
12768   ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams(
12769       E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body,
12770       E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos);
12771 
12772   for (ParmVarDecl *Param : TransParams)
12773     if (Param)
12774       Param->setDeclContext(Body);
12775 
12776   // On failure to transform, TransformRequiresTypeParams returns an expression
12777   // in the event that the transformation of the type params failed in some way.
12778   // It is expected that this will result in a 'not satisfied' Requires clause
12779   // when instantiating.
12780   if (!TypeParamResult.isUnset())
12781     return TypeParamResult;
12782 
12783   SmallVector<concepts::Requirement *, 4> TransReqs;
12784   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12785                                                      TransReqs))
12786     return ExprError();
12787 
12788   for (concepts::Requirement *Req : TransReqs) {
12789     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12790       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12791         ER->getReturnTypeRequirement()
12792                 .getTypeConstraintTemplateParameterList()->getParam(0)
12793                 ->setDeclContext(Body);
12794       }
12795     }
12796   }
12797 
12798   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12799                                           TransParams, TransReqs,
12800                                           E->getRBraceLoc());
12801 }
12802 
12803 template<typename Derived>
12804 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12805     ArrayRef<concepts::Requirement *> Reqs,
12806     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12807   for (concepts::Requirement *Req : Reqs) {
12808     concepts::Requirement *TransReq = nullptr;
12809     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12810       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12811     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12812       TransReq = getDerived().TransformExprRequirement(ExprReq);
12813     else
12814       TransReq = getDerived().TransformNestedRequirement(
12815                      cast<concepts::NestedRequirement>(Req));
12816     if (!TransReq)
12817       return true;
12818     Transformed.push_back(TransReq);
12819   }
12820   return false;
12821 }
12822 
12823 template<typename Derived>
12824 concepts::TypeRequirement *
12825 TreeTransform<Derived>::TransformTypeRequirement(
12826     concepts::TypeRequirement *Req) {
12827   if (Req->isSubstitutionFailure()) {
12828     if (getDerived().AlwaysRebuild())
12829       return getDerived().RebuildTypeRequirement(
12830               Req->getSubstitutionDiagnostic());
12831     return Req;
12832   }
12833   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12834   if (!TransType)
12835     return nullptr;
12836   return getDerived().RebuildTypeRequirement(TransType);
12837 }
12838 
12839 template<typename Derived>
12840 concepts::ExprRequirement *
12841 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12842   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12843   if (Req->isExprSubstitutionFailure())
12844     TransExpr = Req->getExprSubstitutionDiagnostic();
12845   else {
12846     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12847     if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType())
12848       TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
12849     if (TransExprRes.isInvalid())
12850       return nullptr;
12851     TransExpr = TransExprRes.get();
12852   }
12853 
12854   std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12855   const auto &RetReq = Req->getReturnTypeRequirement();
12856   if (RetReq.isEmpty())
12857     TransRetReq.emplace();
12858   else if (RetReq.isSubstitutionFailure())
12859     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12860   else if (RetReq.isTypeConstraint()) {
12861     TemplateParameterList *OrigTPL =
12862         RetReq.getTypeConstraintTemplateParameterList();
12863     TemplateParameterList *TPL =
12864         getDerived().TransformTemplateParameterList(OrigTPL);
12865     if (!TPL)
12866       return nullptr;
12867     TransRetReq.emplace(TPL);
12868   }
12869   assert(TransRetReq && "All code paths leading here must set TransRetReq");
12870   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12871     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12872                                                Req->getNoexceptLoc(),
12873                                                std::move(*TransRetReq));
12874   return getDerived().RebuildExprRequirement(
12875       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12876       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12877 }
12878 
12879 template<typename Derived>
12880 concepts::NestedRequirement *
12881 TreeTransform<Derived>::TransformNestedRequirement(
12882     concepts::NestedRequirement *Req) {
12883   if (Req->hasInvalidConstraint()) {
12884     if (getDerived().AlwaysRebuild())
12885       return getDerived().RebuildNestedRequirement(
12886           Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction());
12887     return Req;
12888   }
12889   ExprResult TransConstraint =
12890       getDerived().TransformExpr(Req->getConstraintExpr());
12891   if (TransConstraint.isInvalid())
12892     return nullptr;
12893   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12894 }
12895 
12896 template<typename Derived>
12897 ExprResult
12898 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12899   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12900   if (!T)
12901     return ExprError();
12902 
12903   if (!getDerived().AlwaysRebuild() &&
12904       T == E->getQueriedTypeSourceInfo())
12905     return E;
12906 
12907   ExprResult SubExpr;
12908   {
12909     EnterExpressionEvaluationContext Unevaluated(
12910         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12911     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12912     if (SubExpr.isInvalid())
12913       return ExprError();
12914 
12915     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12916       return E;
12917   }
12918 
12919   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12920                                             SubExpr.get(), E->getEndLoc());
12921 }
12922 
12923 template<typename Derived>
12924 ExprResult
12925 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12926   ExprResult SubExpr;
12927   {
12928     EnterExpressionEvaluationContext Unevaluated(
12929         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12930     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12931     if (SubExpr.isInvalid())
12932       return ExprError();
12933 
12934     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12935       return E;
12936   }
12937 
12938   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12939                                              SubExpr.get(), E->getEndLoc());
12940 }
12941 
12942 template <typename Derived>
12943 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12944     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12945     TypeSourceInfo **RecoveryTSI) {
12946   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12947       DRE, AddrTaken, RecoveryTSI);
12948 
12949   // Propagate both errors and recovered types, which return ExprEmpty.
12950   if (!NewDRE.isUsable())
12951     return NewDRE;
12952 
12953   // We got an expr, wrap it up in parens.
12954   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12955     return PE;
12956   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12957                                        PE->getRParen());
12958 }
12959 
12960 template <typename Derived>
12961 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12962     DependentScopeDeclRefExpr *E) {
12963   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12964                                             nullptr);
12965 }
12966 
12967 template <typename Derived>
12968 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12969     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12970     TypeSourceInfo **RecoveryTSI) {
12971   assert(E->getQualifierLoc());
12972   NestedNameSpecifierLoc QualifierLoc =
12973       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12974   if (!QualifierLoc)
12975     return ExprError();
12976   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12977 
12978   // TODO: If this is a conversion-function-id, verify that the
12979   // destination type name (if present) resolves the same way after
12980   // instantiation as it did in the local scope.
12981 
12982   DeclarationNameInfo NameInfo =
12983       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12984   if (!NameInfo.getName())
12985     return ExprError();
12986 
12987   if (!E->hasExplicitTemplateArgs()) {
12988     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12989         // Note: it is sufficient to compare the Name component of NameInfo:
12990         // if name has not changed, DNLoc has not changed either.
12991         NameInfo.getName() == E->getDeclName())
12992       return E;
12993 
12994     return getDerived().RebuildDependentScopeDeclRefExpr(
12995         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12996         IsAddressOfOperand, RecoveryTSI);
12997   }
12998 
12999   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13000   if (getDerived().TransformTemplateArguments(
13001           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
13002     return ExprError();
13003 
13004   return getDerived().RebuildDependentScopeDeclRefExpr(
13005       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
13006       RecoveryTSI);
13007 }
13008 
13009 template<typename Derived>
13010 ExprResult
13011 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
13012   // CXXConstructExprs other than for list-initialization and
13013   // CXXTemporaryObjectExpr are always implicit, so when we have
13014   // a 1-argument construction we just transform that argument.
13015   if (getDerived().AllowSkippingCXXConstructExpr() &&
13016       ((E->getNumArgs() == 1 ||
13017         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
13018        (!getDerived().DropCallArgument(E->getArg(0))) &&
13019        !E->isListInitialization()))
13020     return getDerived().TransformInitializer(E->getArg(0),
13021                                              /*DirectInit*/ false);
13022 
13023   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
13024 
13025   QualType T = getDerived().TransformType(E->getType());
13026   if (T.isNull())
13027     return ExprError();
13028 
13029   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13030       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13031   if (!Constructor)
13032     return ExprError();
13033 
13034   bool ArgumentChanged = false;
13035   SmallVector<Expr*, 8> Args;
13036   {
13037     EnterExpressionEvaluationContext Context(
13038         getSema(), EnterExpressionEvaluationContext::InitList,
13039         E->isListInitialization());
13040     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13041                                     &ArgumentChanged))
13042       return ExprError();
13043   }
13044 
13045   if (!getDerived().AlwaysRebuild() &&
13046       T == E->getType() &&
13047       Constructor == E->getConstructor() &&
13048       !ArgumentChanged) {
13049     // Mark the constructor as referenced.
13050     // FIXME: Instantiation-specific
13051     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13052     return E;
13053   }
13054 
13055   return getDerived().RebuildCXXConstructExpr(
13056       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
13057       E->hadMultipleCandidates(), E->isListInitialization(),
13058       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
13059       E->getConstructionKind(), E->getParenOrBraceRange());
13060 }
13061 
13062 template<typename Derived>
13063 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
13064     CXXInheritedCtorInitExpr *E) {
13065   QualType T = getDerived().TransformType(E->getType());
13066   if (T.isNull())
13067     return ExprError();
13068 
13069   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13070       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13071   if (!Constructor)
13072     return ExprError();
13073 
13074   if (!getDerived().AlwaysRebuild() &&
13075       T == E->getType() &&
13076       Constructor == E->getConstructor()) {
13077     // Mark the constructor as referenced.
13078     // FIXME: Instantiation-specific
13079     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13080     return E;
13081   }
13082 
13083   return getDerived().RebuildCXXInheritedCtorInitExpr(
13084       T, E->getLocation(), Constructor,
13085       E->constructsVBase(), E->inheritedFromVBase());
13086 }
13087 
13088 /// Transform a C++ temporary-binding expression.
13089 ///
13090 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
13091 /// transform the subexpression and return that.
13092 template<typename Derived>
13093 ExprResult
13094 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
13095   if (auto *Dtor = E->getTemporary()->getDestructor())
13096     SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
13097                                    const_cast<CXXDestructorDecl *>(Dtor));
13098   return getDerived().TransformExpr(E->getSubExpr());
13099 }
13100 
13101 /// Transform a C++ expression that contains cleanups that should
13102 /// be run after the expression is evaluated.
13103 ///
13104 /// Since ExprWithCleanups nodes are implicitly generated, we
13105 /// just transform the subexpression and return that.
13106 template<typename Derived>
13107 ExprResult
13108 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
13109   return getDerived().TransformExpr(E->getSubExpr());
13110 }
13111 
13112 template<typename Derived>
13113 ExprResult
13114 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
13115                                                     CXXTemporaryObjectExpr *E) {
13116   TypeSourceInfo *T =
13117       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13118   if (!T)
13119     return ExprError();
13120 
13121   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
13122       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
13123   if (!Constructor)
13124     return ExprError();
13125 
13126   bool ArgumentChanged = false;
13127   SmallVector<Expr*, 8> Args;
13128   Args.reserve(E->getNumArgs());
13129   {
13130     EnterExpressionEvaluationContext Context(
13131         getSema(), EnterExpressionEvaluationContext::InitList,
13132         E->isListInitialization());
13133     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
13134                        &ArgumentChanged))
13135       return ExprError();
13136   }
13137 
13138   if (!getDerived().AlwaysRebuild() &&
13139       T == E->getTypeSourceInfo() &&
13140       Constructor == E->getConstructor() &&
13141       !ArgumentChanged) {
13142     // FIXME: Instantiation-specific
13143     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
13144     return SemaRef.MaybeBindToTemporary(E);
13145   }
13146 
13147   // FIXME: We should just pass E->isListInitialization(), but we're not
13148   // prepared to handle list-initialization without a child InitListExpr.
13149   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
13150   return getDerived().RebuildCXXTemporaryObjectExpr(
13151       T, LParenLoc, Args, E->getEndLoc(),
13152       /*ListInitialization=*/LParenLoc.isInvalid());
13153 }
13154 
13155 template<typename Derived>
13156 ExprResult
13157 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
13158   // Transform any init-capture expressions before entering the scope of the
13159   // lambda body, because they are not semantically within that scope.
13160   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
13161   struct TransformedInitCapture {
13162     // The location of the ... if the result is retaining a pack expansion.
13163     SourceLocation EllipsisLoc;
13164     // Zero or more expansions of the init-capture.
13165     SmallVector<InitCaptureInfoTy, 4> Expansions;
13166   };
13167   SmallVector<TransformedInitCapture, 4> InitCaptures;
13168   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
13169   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13170                                     CEnd = E->capture_end();
13171        C != CEnd; ++C) {
13172     if (!E->isInitCapture(C))
13173       continue;
13174 
13175     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
13176     auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13177 
13178     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
13179                                 std::optional<unsigned> NumExpansions) {
13180       ExprResult NewExprInitResult = getDerived().TransformInitializer(
13181           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
13182 
13183       if (NewExprInitResult.isInvalid()) {
13184         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
13185         return;
13186       }
13187       Expr *NewExprInit = NewExprInitResult.get();
13188 
13189       QualType NewInitCaptureType =
13190           getSema().buildLambdaInitCaptureInitialization(
13191               C->getLocation(), C->getCaptureKind() == LCK_ByRef,
13192               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
13193               cast<VarDecl>(C->getCapturedVar())->getInitStyle() !=
13194                   VarDecl::CInit,
13195               NewExprInit);
13196       Result.Expansions.push_back(
13197           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
13198     };
13199 
13200     // If this is an init-capture pack, consider expanding the pack now.
13201     if (OldVD->isParameterPack()) {
13202       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
13203                                              ->getTypeLoc()
13204                                              .castAs<PackExpansionTypeLoc>();
13205       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13206       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
13207 
13208       // Determine whether the set of unexpanded parameter packs can and should
13209       // be expanded.
13210       bool Expand = true;
13211       bool RetainExpansion = false;
13212       std::optional<unsigned> OrigNumExpansions =
13213           ExpansionTL.getTypePtr()->getNumExpansions();
13214       std::optional<unsigned> NumExpansions = OrigNumExpansions;
13215       if (getDerived().TryExpandParameterPacks(
13216               ExpansionTL.getEllipsisLoc(),
13217               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
13218               RetainExpansion, NumExpansions))
13219         return ExprError();
13220       if (Expand) {
13221         for (unsigned I = 0; I != *NumExpansions; ++I) {
13222           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13223           SubstInitCapture(SourceLocation(), std::nullopt);
13224         }
13225       }
13226       if (!Expand || RetainExpansion) {
13227         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13228         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
13229         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
13230       }
13231     } else {
13232       SubstInitCapture(SourceLocation(), std::nullopt);
13233     }
13234   }
13235 
13236   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
13237   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
13238 
13239   // Transform the template parameters, and add them to the current
13240   // instantiation scope. The null case is handled correctly.
13241   auto TPL = getDerived().TransformTemplateParameterList(
13242       E->getTemplateParameterList());
13243   LSI->GLTemplateParameterList = TPL;
13244 
13245   // Transform the type of the original lambda's call operator.
13246   // The transformation MUST be done in the CurrentInstantiationScope since
13247   // it introduces a mapping of the original to the newly created
13248   // transformed parameters.
13249   TypeSourceInfo *NewCallOpTSI = nullptr;
13250   {
13251     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
13252     FunctionProtoTypeLoc OldCallOpFPTL =
13253         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
13254 
13255     TypeLocBuilder NewCallOpTLBuilder;
13256     SmallVector<QualType, 4> ExceptionStorage;
13257     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
13258     QualType NewCallOpType = TransformFunctionProtoType(
13259         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
13260         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
13261           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
13262                                               ExceptionStorage, Changed);
13263         });
13264     if (NewCallOpType.isNull())
13265       return ExprError();
13266     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
13267                                                         NewCallOpType);
13268   }
13269 
13270   // Create the local class that will describe the lambda.
13271 
13272   // FIXME: DependencyKind below is wrong when substituting inside a templated
13273   // context that isn't a DeclContext (such as a variable template), or when
13274   // substituting an unevaluated lambda inside of a function's parameter's type
13275   // - as parameter types are not instantiated from within a function's DC. We
13276   // use evaluation contexts to distinguish the function parameter case.
13277   CXXRecordDecl::LambdaDependencyKind DependencyKind =
13278       CXXRecordDecl::LDK_Unknown;
13279   if ((getSema().isUnevaluatedContext() ||
13280        getSema().isConstantEvaluatedContext()) &&
13281       (getSema().CurContext->isFileContext() ||
13282        !getSema().CurContext->getParent()->isDependentContext()))
13283     DependencyKind = CXXRecordDecl::LDK_NeverDependent;
13284 
13285   CXXRecordDecl *OldClass = E->getLambdaClass();
13286   CXXRecordDecl *Class =
13287       getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI,
13288                                         DependencyKind, E->getCaptureDefault());
13289 
13290   getDerived().transformedLocalDecl(OldClass, {Class});
13291 
13292   std::optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
13293   if (getDerived().ReplacingOriginal())
13294     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
13295                                OldClass->getLambdaManglingNumber(),
13296                                OldClass->getDeviceLambdaManglingNumber(),
13297                                OldClass->getLambdaContextDecl());
13298 
13299   // Build the call operator.
13300   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
13301       Class, E->getIntroducerRange(), NewCallOpTSI,
13302       E->getCallOperator()->getEndLoc(),
13303       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
13304       E->getCallOperator()->getConstexprKind(),
13305       E->getCallOperator()->getStorageClass(),
13306       E->getCallOperator()->getTrailingRequiresClause());
13307 
13308   LSI->CallOperator = NewCallOperator;
13309 
13310   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
13311   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
13312 
13313   // Number the lambda for linkage purposes if necessary.
13314   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
13315 
13316   // Introduce the context of the call operator.
13317   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
13318                                  /*NewThisContext*/false);
13319 
13320   // Enter the scope of the lambda.
13321   getSema().buildLambdaScope(LSI, NewCallOperator,
13322                              E->getIntroducerRange(),
13323                              E->getCaptureDefault(),
13324                              E->getCaptureDefaultLoc(),
13325                              E->hasExplicitParameters(),
13326                              E->hasExplicitResultType(),
13327                              E->isMutable());
13328 
13329   bool Invalid = false;
13330 
13331   // Transform captures.
13332   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13333                                  CEnd = E->capture_end();
13334        C != CEnd; ++C) {
13335     // When we hit the first implicit capture, tell Sema that we've finished
13336     // the list of explicit captures.
13337     if (C->isImplicit())
13338       break;
13339 
13340     // Capturing 'this' is trivial.
13341     if (C->capturesThis()) {
13342       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13343                                     /*BuildAndDiagnose*/ true, nullptr,
13344                                     C->getCaptureKind() == LCK_StarThis);
13345       continue;
13346     }
13347     // Captured expression will be recaptured during captured variables
13348     // rebuilding.
13349     if (C->capturesVLAType())
13350       continue;
13351 
13352     // Rebuild init-captures, including the implied field declaration.
13353     if (E->isInitCapture(C)) {
13354       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
13355 
13356       auto *OldVD = cast<VarDecl>(C->getCapturedVar());
13357       llvm::SmallVector<Decl*, 4> NewVDs;
13358 
13359       for (InitCaptureInfoTy &Info : NewC.Expansions) {
13360         ExprResult Init = Info.first;
13361         QualType InitQualType = Info.second;
13362         if (Init.isInvalid() || InitQualType.isNull()) {
13363           Invalid = true;
13364           break;
13365         }
13366         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13367             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13368             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13369         if (!NewVD) {
13370           Invalid = true;
13371           break;
13372         }
13373         NewVDs.push_back(NewVD);
13374         getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef);
13375       }
13376 
13377       if (Invalid)
13378         break;
13379 
13380       getDerived().transformedLocalDecl(OldVD, NewVDs);
13381       continue;
13382     }
13383 
13384     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13385 
13386     // Determine the capture kind for Sema.
13387     Sema::TryCaptureKind Kind
13388       = C->isImplicit()? Sema::TryCapture_Implicit
13389                        : C->getCaptureKind() == LCK_ByCopy
13390                            ? Sema::TryCapture_ExplicitByVal
13391                            : Sema::TryCapture_ExplicitByRef;
13392     SourceLocation EllipsisLoc;
13393     if (C->isPackExpansion()) {
13394       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13395       bool ShouldExpand = false;
13396       bool RetainExpansion = false;
13397       std::optional<unsigned> NumExpansions;
13398       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13399                                                C->getLocation(),
13400                                                Unexpanded,
13401                                                ShouldExpand, RetainExpansion,
13402                                                NumExpansions)) {
13403         Invalid = true;
13404         continue;
13405       }
13406 
13407       if (ShouldExpand) {
13408         // The transform has determined that we should perform an expansion;
13409         // transform and capture each of the arguments.
13410         // expansion of the pattern. Do so.
13411         auto *Pack = cast<VarDecl>(C->getCapturedVar());
13412         for (unsigned I = 0; I != *NumExpansions; ++I) {
13413           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13414           VarDecl *CapturedVar
13415             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13416                                                                Pack));
13417           if (!CapturedVar) {
13418             Invalid = true;
13419             continue;
13420           }
13421 
13422           // Capture the transformed variable.
13423           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13424         }
13425 
13426         // FIXME: Retain a pack expansion if RetainExpansion is true.
13427 
13428         continue;
13429       }
13430 
13431       EllipsisLoc = C->getEllipsisLoc();
13432     }
13433 
13434     // Transform the captured variable.
13435     auto *CapturedVar = cast_or_null<ValueDecl>(
13436         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13437     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13438       Invalid = true;
13439       continue;
13440     }
13441 
13442     // Capture the transformed variable.
13443     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13444                                  EllipsisLoc);
13445   }
13446   getSema().finishLambdaExplicitCaptures(LSI);
13447 
13448   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13449   // evaluation context even if we're not transforming the function body.
13450   getSema().PushExpressionEvaluationContext(
13451       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13452 
13453   // Instantiate the body of the lambda expression.
13454   StmtResult Body =
13455       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13456 
13457   // ActOnLambda* will pop the function scope for us.
13458   FuncScopeCleanup.disable();
13459 
13460   if (Body.isInvalid()) {
13461     SavedContext.pop();
13462     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13463                                /*IsInstantiation=*/true);
13464     return ExprError();
13465   }
13466 
13467   // Copy the LSI before ActOnFinishFunctionBody removes it.
13468   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13469   // the call operator.
13470   auto LSICopy = *LSI;
13471   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13472                                     /*IsInstantiation*/ true);
13473   SavedContext.pop();
13474 
13475   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13476                                    &LSICopy);
13477 }
13478 
13479 template<typename Derived>
13480 StmtResult
13481 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13482   return TransformStmt(S);
13483 }
13484 
13485 template<typename Derived>
13486 StmtResult
13487 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13488   // Transform captures.
13489   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13490                                  CEnd = E->capture_end();
13491        C != CEnd; ++C) {
13492     // When we hit the first implicit capture, tell Sema that we've finished
13493     // the list of explicit captures.
13494     if (!C->isImplicit())
13495       continue;
13496 
13497     // Capturing 'this' is trivial.
13498     if (C->capturesThis()) {
13499       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13500                                     /*BuildAndDiagnose*/ true, nullptr,
13501                                     C->getCaptureKind() == LCK_StarThis);
13502       continue;
13503     }
13504     // Captured expression will be recaptured during captured variables
13505     // rebuilding.
13506     if (C->capturesVLAType())
13507       continue;
13508 
13509     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13510     assert(!E->isInitCapture(C) && "implicit init-capture?");
13511 
13512     // Transform the captured variable.
13513     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13514         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13515     if (!CapturedVar || CapturedVar->isInvalidDecl())
13516       return StmtError();
13517 
13518     // Capture the transformed variable.
13519     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13520   }
13521 
13522   return S;
13523 }
13524 
13525 template<typename Derived>
13526 ExprResult
13527 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13528                                                   CXXUnresolvedConstructExpr *E) {
13529   TypeSourceInfo *T =
13530       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13531   if (!T)
13532     return ExprError();
13533 
13534   bool ArgumentChanged = false;
13535   SmallVector<Expr*, 8> Args;
13536   Args.reserve(E->getNumArgs());
13537   {
13538     EnterExpressionEvaluationContext Context(
13539         getSema(), EnterExpressionEvaluationContext::InitList,
13540         E->isListInitialization());
13541     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13542                                     &ArgumentChanged))
13543       return ExprError();
13544   }
13545 
13546   if (!getDerived().AlwaysRebuild() &&
13547       T == E->getTypeSourceInfo() &&
13548       !ArgumentChanged)
13549     return E;
13550 
13551   // FIXME: we're faking the locations of the commas
13552   return getDerived().RebuildCXXUnresolvedConstructExpr(
13553       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13554 }
13555 
13556 template<typename Derived>
13557 ExprResult
13558 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13559                                              CXXDependentScopeMemberExpr *E) {
13560   // Transform the base of the expression.
13561   ExprResult Base((Expr*) nullptr);
13562   Expr *OldBase;
13563   QualType BaseType;
13564   QualType ObjectType;
13565   if (!E->isImplicitAccess()) {
13566     OldBase = E->getBase();
13567     Base = getDerived().TransformExpr(OldBase);
13568     if (Base.isInvalid())
13569       return ExprError();
13570 
13571     // Start the member reference and compute the object's type.
13572     ParsedType ObjectTy;
13573     bool MayBePseudoDestructor = false;
13574     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13575                                                 E->getOperatorLoc(),
13576                                       E->isArrow()? tok::arrow : tok::period,
13577                                                 ObjectTy,
13578                                                 MayBePseudoDestructor);
13579     if (Base.isInvalid())
13580       return ExprError();
13581 
13582     ObjectType = ObjectTy.get();
13583     BaseType = ((Expr*) Base.get())->getType();
13584   } else {
13585     OldBase = nullptr;
13586     BaseType = getDerived().TransformType(E->getBaseType());
13587     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13588   }
13589 
13590   // Transform the first part of the nested-name-specifier that qualifies
13591   // the member name.
13592   NamedDecl *FirstQualifierInScope
13593     = getDerived().TransformFirstQualifierInScope(
13594                                             E->getFirstQualifierFoundInScope(),
13595                                             E->getQualifierLoc().getBeginLoc());
13596 
13597   NestedNameSpecifierLoc QualifierLoc;
13598   if (E->getQualifier()) {
13599     QualifierLoc
13600       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13601                                                      ObjectType,
13602                                                      FirstQualifierInScope);
13603     if (!QualifierLoc)
13604       return ExprError();
13605   }
13606 
13607   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13608 
13609   // TODO: If this is a conversion-function-id, verify that the
13610   // destination type name (if present) resolves the same way after
13611   // instantiation as it did in the local scope.
13612 
13613   DeclarationNameInfo NameInfo
13614     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13615   if (!NameInfo.getName())
13616     return ExprError();
13617 
13618   if (!E->hasExplicitTemplateArgs()) {
13619     // This is a reference to a member without an explicitly-specified
13620     // template argument list. Optimize for this common case.
13621     if (!getDerived().AlwaysRebuild() &&
13622         Base.get() == OldBase &&
13623         BaseType == E->getBaseType() &&
13624         QualifierLoc == E->getQualifierLoc() &&
13625         NameInfo.getName() == E->getMember() &&
13626         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13627       return E;
13628 
13629     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13630                                                        BaseType,
13631                                                        E->isArrow(),
13632                                                        E->getOperatorLoc(),
13633                                                        QualifierLoc,
13634                                                        TemplateKWLoc,
13635                                                        FirstQualifierInScope,
13636                                                        NameInfo,
13637                                                        /*TemplateArgs*/nullptr);
13638   }
13639 
13640   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13641   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13642                                               E->getNumTemplateArgs(),
13643                                               TransArgs))
13644     return ExprError();
13645 
13646   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13647                                                      BaseType,
13648                                                      E->isArrow(),
13649                                                      E->getOperatorLoc(),
13650                                                      QualifierLoc,
13651                                                      TemplateKWLoc,
13652                                                      FirstQualifierInScope,
13653                                                      NameInfo,
13654                                                      &TransArgs);
13655 }
13656 
13657 template <typename Derived>
13658 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13659     UnresolvedMemberExpr *Old) {
13660   // Transform the base of the expression.
13661   ExprResult Base((Expr *)nullptr);
13662   QualType BaseType;
13663   if (!Old->isImplicitAccess()) {
13664     Base = getDerived().TransformExpr(Old->getBase());
13665     if (Base.isInvalid())
13666       return ExprError();
13667     Base =
13668         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13669     if (Base.isInvalid())
13670       return ExprError();
13671     BaseType = Base.get()->getType();
13672   } else {
13673     BaseType = getDerived().TransformType(Old->getBaseType());
13674   }
13675 
13676   NestedNameSpecifierLoc QualifierLoc;
13677   if (Old->getQualifierLoc()) {
13678     QualifierLoc =
13679         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13680     if (!QualifierLoc)
13681       return ExprError();
13682   }
13683 
13684   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13685 
13686   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13687 
13688   // Transform the declaration set.
13689   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13690     return ExprError();
13691 
13692   // Determine the naming class.
13693   if (Old->getNamingClass()) {
13694     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13695         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13696     if (!NamingClass)
13697       return ExprError();
13698 
13699     R.setNamingClass(NamingClass);
13700   }
13701 
13702   TemplateArgumentListInfo TransArgs;
13703   if (Old->hasExplicitTemplateArgs()) {
13704     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13705     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13706     if (getDerived().TransformTemplateArguments(
13707             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13708       return ExprError();
13709   }
13710 
13711   // FIXME: to do this check properly, we will need to preserve the
13712   // first-qualifier-in-scope here, just in case we had a dependent
13713   // base (and therefore couldn't do the check) and a
13714   // nested-name-qualifier (and therefore could do the lookup).
13715   NamedDecl *FirstQualifierInScope = nullptr;
13716 
13717   return getDerived().RebuildUnresolvedMemberExpr(
13718       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13719       TemplateKWLoc, FirstQualifierInScope, R,
13720       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13721 }
13722 
13723 template<typename Derived>
13724 ExprResult
13725 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13726   EnterExpressionEvaluationContext Unevaluated(
13727       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13728   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13729   if (SubExpr.isInvalid())
13730     return ExprError();
13731 
13732   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13733     return E;
13734 
13735   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13736 }
13737 
13738 template<typename Derived>
13739 ExprResult
13740 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13741   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13742   if (Pattern.isInvalid())
13743     return ExprError();
13744 
13745   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13746     return E;
13747 
13748   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13749                                            E->getNumExpansions());
13750 }
13751 
13752 template<typename Derived>
13753 ExprResult
13754 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13755   // If E is not value-dependent, then nothing will change when we transform it.
13756   // Note: This is an instantiation-centric view.
13757   if (!E->isValueDependent())
13758     return E;
13759 
13760   EnterExpressionEvaluationContext Unevaluated(
13761       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13762 
13763   ArrayRef<TemplateArgument> PackArgs;
13764   TemplateArgument ArgStorage;
13765 
13766   // Find the argument list to transform.
13767   if (E->isPartiallySubstituted()) {
13768     PackArgs = E->getPartialArguments();
13769   } else if (E->isValueDependent()) {
13770     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13771     bool ShouldExpand = false;
13772     bool RetainExpansion = false;
13773     std::optional<unsigned> NumExpansions;
13774     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13775                                              Unexpanded,
13776                                              ShouldExpand, RetainExpansion,
13777                                              NumExpansions))
13778       return ExprError();
13779 
13780     // If we need to expand the pack, build a template argument from it and
13781     // expand that.
13782     if (ShouldExpand) {
13783       auto *Pack = E->getPack();
13784       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13785         ArgStorage = getSema().Context.getPackExpansionType(
13786             getSema().Context.getTypeDeclType(TTPD), std::nullopt);
13787       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13788         ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt);
13789       } else {
13790         auto *VD = cast<ValueDecl>(Pack);
13791         ExprResult DRE = getSema().BuildDeclRefExpr(
13792             VD, VD->getType().getNonLValueExprType(getSema().Context),
13793             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13794             E->getPackLoc());
13795         if (DRE.isInvalid())
13796           return ExprError();
13797         ArgStorage = new (getSema().Context)
13798             PackExpansionExpr(getSema().Context.DependentTy, DRE.get(),
13799                               E->getPackLoc(), std::nullopt);
13800       }
13801       PackArgs = ArgStorage;
13802     }
13803   }
13804 
13805   // If we're not expanding the pack, just transform the decl.
13806   if (!PackArgs.size()) {
13807     auto *Pack = cast_or_null<NamedDecl>(
13808         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13809     if (!Pack)
13810       return ExprError();
13811     return getDerived().RebuildSizeOfPackExpr(
13812         E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(),
13813         std::nullopt, std::nullopt);
13814   }
13815 
13816   // Try to compute the result without performing a partial substitution.
13817   std::optional<unsigned> Result = 0;
13818   for (const TemplateArgument &Arg : PackArgs) {
13819     if (!Arg.isPackExpansion()) {
13820       Result = *Result + 1;
13821       continue;
13822     }
13823 
13824     TemplateArgumentLoc ArgLoc;
13825     InventTemplateArgumentLoc(Arg, ArgLoc);
13826 
13827     // Find the pattern of the pack expansion.
13828     SourceLocation Ellipsis;
13829     std::optional<unsigned> OrigNumExpansions;
13830     TemplateArgumentLoc Pattern =
13831         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13832                                                           OrigNumExpansions);
13833 
13834     // Substitute under the pack expansion. Do not expand the pack (yet).
13835     TemplateArgumentLoc OutPattern;
13836     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13837     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13838                                                /*Uneval*/ true))
13839       return true;
13840 
13841     // See if we can determine the number of arguments from the result.
13842     std::optional<unsigned> NumExpansions =
13843         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13844     if (!NumExpansions) {
13845       // No: we must be in an alias template expansion, and we're going to need
13846       // to actually expand the packs.
13847       Result = std::nullopt;
13848       break;
13849     }
13850 
13851     Result = *Result + *NumExpansions;
13852   }
13853 
13854   // Common case: we could determine the number of expansions without
13855   // substituting.
13856   if (Result)
13857     return getDerived().RebuildSizeOfPackExpr(
13858         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
13859         *Result, std::nullopt);
13860 
13861   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13862                                                E->getPackLoc());
13863   {
13864     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13865     typedef TemplateArgumentLocInventIterator<
13866         Derived, const TemplateArgument*> PackLocIterator;
13867     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13868                                    PackLocIterator(*this, PackArgs.end()),
13869                                    TransformedPackArgs, /*Uneval*/true))
13870       return ExprError();
13871   }
13872 
13873   // Check whether we managed to fully-expand the pack.
13874   // FIXME: Is it possible for us to do so and not hit the early exit path?
13875   SmallVector<TemplateArgument, 8> Args;
13876   bool PartialSubstitution = false;
13877   for (auto &Loc : TransformedPackArgs.arguments()) {
13878     Args.push_back(Loc.getArgument());
13879     if (Loc.getArgument().isPackExpansion())
13880       PartialSubstitution = true;
13881   }
13882 
13883   if (PartialSubstitution)
13884     return getDerived().RebuildSizeOfPackExpr(
13885         E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(),
13886         std::nullopt, Args);
13887 
13888   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13889                                             E->getPackLoc(), E->getRParenLoc(),
13890                                             Args.size(), std::nullopt);
13891 }
13892 
13893 template<typename Derived>
13894 ExprResult
13895 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13896                                           SubstNonTypeTemplateParmPackExpr *E) {
13897   // Default behavior is to do nothing with this transformation.
13898   return E;
13899 }
13900 
13901 template<typename Derived>
13902 ExprResult
13903 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13904                                           SubstNonTypeTemplateParmExpr *E) {
13905   // Default behavior is to do nothing with this transformation.
13906   return E;
13907 }
13908 
13909 template<typename Derived>
13910 ExprResult
13911 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13912   // Default behavior is to do nothing with this transformation.
13913   return E;
13914 }
13915 
13916 template<typename Derived>
13917 ExprResult
13918 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13919                                                   MaterializeTemporaryExpr *E) {
13920   return getDerived().TransformExpr(E->getSubExpr());
13921 }
13922 
13923 template<typename Derived>
13924 ExprResult
13925 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13926   UnresolvedLookupExpr *Callee = nullptr;
13927   if (Expr *OldCallee = E->getCallee()) {
13928     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13929     if (CalleeResult.isInvalid())
13930       return ExprError();
13931     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13932   }
13933 
13934   Expr *Pattern = E->getPattern();
13935 
13936   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13937   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13938   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13939 
13940   // Determine whether the set of unexpanded parameter packs can and should
13941   // be expanded.
13942   bool Expand = true;
13943   bool RetainExpansion = false;
13944   std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13945                           NumExpansions = OrigNumExpansions;
13946   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13947                                            Pattern->getSourceRange(),
13948                                            Unexpanded,
13949                                            Expand, RetainExpansion,
13950                                            NumExpansions))
13951     return true;
13952 
13953   if (!Expand) {
13954     // Do not expand any packs here, just transform and rebuild a fold
13955     // expression.
13956     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13957 
13958     ExprResult LHS =
13959         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13960     if (LHS.isInvalid())
13961       return true;
13962 
13963     ExprResult RHS =
13964         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13965     if (RHS.isInvalid())
13966       return true;
13967 
13968     if (!getDerived().AlwaysRebuild() &&
13969         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13970       return E;
13971 
13972     return getDerived().RebuildCXXFoldExpr(
13973         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13974         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13975   }
13976 
13977   // Formally a fold expression expands to nested parenthesized expressions.
13978   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13979   // them.
13980   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13981     SemaRef.Diag(E->getEllipsisLoc(),
13982                  clang::diag::err_fold_expression_limit_exceeded)
13983         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13984         << E->getSourceRange();
13985     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13986     return ExprError();
13987   }
13988 
13989   // The transform has determined that we should perform an elementwise
13990   // expansion of the pattern. Do so.
13991   ExprResult Result = getDerived().TransformExpr(E->getInit());
13992   if (Result.isInvalid())
13993     return true;
13994   bool LeftFold = E->isLeftFold();
13995 
13996   // If we're retaining an expansion for a right fold, it is the innermost
13997   // component and takes the init (if any).
13998   if (!LeftFold && RetainExpansion) {
13999     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14000 
14001     ExprResult Out = getDerived().TransformExpr(Pattern);
14002     if (Out.isInvalid())
14003       return true;
14004 
14005     Result = getDerived().RebuildCXXFoldExpr(
14006         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
14007         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
14008     if (Result.isInvalid())
14009       return true;
14010   }
14011 
14012   for (unsigned I = 0; I != *NumExpansions; ++I) {
14013     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
14014         getSema(), LeftFold ? I : *NumExpansions - I - 1);
14015     ExprResult Out = getDerived().TransformExpr(Pattern);
14016     if (Out.isInvalid())
14017       return true;
14018 
14019     if (Out.get()->containsUnexpandedParameterPack()) {
14020       // We still have a pack; retain a pack expansion for this slice.
14021       Result = getDerived().RebuildCXXFoldExpr(
14022           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
14023           E->getOperator(), E->getEllipsisLoc(),
14024           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
14025           OrigNumExpansions);
14026     } else if (Result.isUsable()) {
14027       // We've got down to a single element; build a binary operator.
14028       Expr *LHS = LeftFold ? Result.get() : Out.get();
14029       Expr *RHS = LeftFold ? Out.get() : Result.get();
14030       if (Callee)
14031         Result = getDerived().RebuildCXXOperatorCallExpr(
14032             BinaryOperator::getOverloadedOperator(E->getOperator()),
14033             E->getEllipsisLoc(), Callee, LHS, RHS);
14034       else
14035         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
14036                                                     E->getOperator(), LHS, RHS);
14037     } else
14038       Result = Out;
14039 
14040     if (Result.isInvalid())
14041       return true;
14042   }
14043 
14044   // If we're retaining an expansion for a left fold, it is the outermost
14045   // component and takes the complete expansion so far as its init (if any).
14046   if (LeftFold && RetainExpansion) {
14047     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
14048 
14049     ExprResult Out = getDerived().TransformExpr(Pattern);
14050     if (Out.isInvalid())
14051       return true;
14052 
14053     Result = getDerived().RebuildCXXFoldExpr(
14054         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
14055         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
14056     if (Result.isInvalid())
14057       return true;
14058   }
14059 
14060   // If we had no init and an empty pack, and we're not retaining an expansion,
14061   // then produce a fallback value or error.
14062   if (Result.isUnset())
14063     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
14064                                                 E->getOperator());
14065 
14066   return Result;
14067 }
14068 
14069 template <typename Derived>
14070 ExprResult
14071 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) {
14072   SmallVector<Expr *, 4> TransformedInits;
14073   ArrayRef<Expr *> InitExprs = E->getInitExprs();
14074   if (TransformExprs(InitExprs.data(), InitExprs.size(), true,
14075                      TransformedInits))
14076     return ExprError();
14077 
14078   return getDerived().RebuildCXXParenListInitExpr(
14079       TransformedInits, E->getType(), E->getUserSpecifiedInitExprs().size(),
14080       E->getInitLoc(), E->getBeginLoc(), E->getEndLoc());
14081 }
14082 
14083 template<typename Derived>
14084 ExprResult
14085 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
14086     CXXStdInitializerListExpr *E) {
14087   return getDerived().TransformExpr(E->getSubExpr());
14088 }
14089 
14090 template<typename Derived>
14091 ExprResult
14092 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
14093   return SemaRef.MaybeBindToTemporary(E);
14094 }
14095 
14096 template<typename Derived>
14097 ExprResult
14098 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
14099   return E;
14100 }
14101 
14102 template<typename Derived>
14103 ExprResult
14104 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
14105   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
14106   if (SubExpr.isInvalid())
14107     return ExprError();
14108 
14109   if (!getDerived().AlwaysRebuild() &&
14110       SubExpr.get() == E->getSubExpr())
14111     return E;
14112 
14113   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
14114 }
14115 
14116 template<typename Derived>
14117 ExprResult
14118 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
14119   // Transform each of the elements.
14120   SmallVector<Expr *, 8> Elements;
14121   bool ArgChanged = false;
14122   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
14123                                   /*IsCall=*/false, Elements, &ArgChanged))
14124     return ExprError();
14125 
14126   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14127     return SemaRef.MaybeBindToTemporary(E);
14128 
14129   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
14130                                               Elements.data(),
14131                                               Elements.size());
14132 }
14133 
14134 template<typename Derived>
14135 ExprResult
14136 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
14137                                                     ObjCDictionaryLiteral *E) {
14138   // Transform each of the elements.
14139   SmallVector<ObjCDictionaryElement, 8> Elements;
14140   bool ArgChanged = false;
14141   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
14142     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
14143 
14144     if (OrigElement.isPackExpansion()) {
14145       // This key/value element is a pack expansion.
14146       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
14147       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
14148       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
14149       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
14150 
14151       // Determine whether the set of unexpanded parameter packs can
14152       // and should be expanded.
14153       bool Expand = true;
14154       bool RetainExpansion = false;
14155       std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
14156       std::optional<unsigned> NumExpansions = OrigNumExpansions;
14157       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
14158                                OrigElement.Value->getEndLoc());
14159       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
14160                                                PatternRange, Unexpanded, Expand,
14161                                                RetainExpansion, NumExpansions))
14162         return ExprError();
14163 
14164       if (!Expand) {
14165         // The transform has determined that we should perform a simple
14166         // transformation on the pack expansion, producing another pack
14167         // expansion.
14168         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
14169         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14170         if (Key.isInvalid())
14171           return ExprError();
14172 
14173         if (Key.get() != OrigElement.Key)
14174           ArgChanged = true;
14175 
14176         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14177         if (Value.isInvalid())
14178           return ExprError();
14179 
14180         if (Value.get() != OrigElement.Value)
14181           ArgChanged = true;
14182 
14183         ObjCDictionaryElement Expansion = {
14184           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
14185         };
14186         Elements.push_back(Expansion);
14187         continue;
14188       }
14189 
14190       // Record right away that the argument was changed.  This needs
14191       // to happen even if the array expands to nothing.
14192       ArgChanged = true;
14193 
14194       // The transform has determined that we should perform an elementwise
14195       // expansion of the pattern. Do so.
14196       for (unsigned I = 0; I != *NumExpansions; ++I) {
14197         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
14198         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14199         if (Key.isInvalid())
14200           return ExprError();
14201 
14202         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
14203         if (Value.isInvalid())
14204           return ExprError();
14205 
14206         ObjCDictionaryElement Element = {
14207           Key.get(), Value.get(), SourceLocation(), NumExpansions
14208         };
14209 
14210         // If any unexpanded parameter packs remain, we still have a
14211         // pack expansion.
14212         // FIXME: Can this really happen?
14213         if (Key.get()->containsUnexpandedParameterPack() ||
14214             Value.get()->containsUnexpandedParameterPack())
14215           Element.EllipsisLoc = OrigElement.EllipsisLoc;
14216 
14217         Elements.push_back(Element);
14218       }
14219 
14220       // FIXME: Retain a pack expansion if RetainExpansion is true.
14221 
14222       // We've finished with this pack expansion.
14223       continue;
14224     }
14225 
14226     // Transform and check key.
14227     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
14228     if (Key.isInvalid())
14229       return ExprError();
14230 
14231     if (Key.get() != OrigElement.Key)
14232       ArgChanged = true;
14233 
14234     // Transform and check value.
14235     ExprResult Value
14236       = getDerived().TransformExpr(OrigElement.Value);
14237     if (Value.isInvalid())
14238       return ExprError();
14239 
14240     if (Value.get() != OrigElement.Value)
14241       ArgChanged = true;
14242 
14243     ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(),
14244                                      std::nullopt};
14245     Elements.push_back(Element);
14246   }
14247 
14248   if (!getDerived().AlwaysRebuild() && !ArgChanged)
14249     return SemaRef.MaybeBindToTemporary(E);
14250 
14251   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
14252                                                    Elements);
14253 }
14254 
14255 template<typename Derived>
14256 ExprResult
14257 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
14258   TypeSourceInfo *EncodedTypeInfo
14259     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
14260   if (!EncodedTypeInfo)
14261     return ExprError();
14262 
14263   if (!getDerived().AlwaysRebuild() &&
14264       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
14265     return E;
14266 
14267   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
14268                                             EncodedTypeInfo,
14269                                             E->getRParenLoc());
14270 }
14271 
14272 template<typename Derived>
14273 ExprResult TreeTransform<Derived>::
14274 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
14275   // This is a kind of implicit conversion, and it needs to get dropped
14276   // and recomputed for the same general reasons that ImplicitCastExprs
14277   // do, as well a more specific one: this expression is only valid when
14278   // it appears *immediately* as an argument expression.
14279   return getDerived().TransformExpr(E->getSubExpr());
14280 }
14281 
14282 template<typename Derived>
14283 ExprResult TreeTransform<Derived>::
14284 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
14285   TypeSourceInfo *TSInfo
14286     = getDerived().TransformType(E->getTypeInfoAsWritten());
14287   if (!TSInfo)
14288     return ExprError();
14289 
14290   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
14291   if (Result.isInvalid())
14292     return ExprError();
14293 
14294   if (!getDerived().AlwaysRebuild() &&
14295       TSInfo == E->getTypeInfoAsWritten() &&
14296       Result.get() == E->getSubExpr())
14297     return E;
14298 
14299   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
14300                                       E->getBridgeKeywordLoc(), TSInfo,
14301                                       Result.get());
14302 }
14303 
14304 template <typename Derived>
14305 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
14306     ObjCAvailabilityCheckExpr *E) {
14307   return E;
14308 }
14309 
14310 template<typename Derived>
14311 ExprResult
14312 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
14313   // Transform arguments.
14314   bool ArgChanged = false;
14315   SmallVector<Expr*, 8> Args;
14316   Args.reserve(E->getNumArgs());
14317   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
14318                                   &ArgChanged))
14319     return ExprError();
14320 
14321   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
14322     // Class message: transform the receiver type.
14323     TypeSourceInfo *ReceiverTypeInfo
14324       = getDerived().TransformType(E->getClassReceiverTypeInfo());
14325     if (!ReceiverTypeInfo)
14326       return ExprError();
14327 
14328     // If nothing changed, just retain the existing message send.
14329     if (!getDerived().AlwaysRebuild() &&
14330         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
14331       return SemaRef.MaybeBindToTemporary(E);
14332 
14333     // Build a new class message send.
14334     SmallVector<SourceLocation, 16> SelLocs;
14335     E->getSelectorLocs(SelLocs);
14336     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
14337                                                E->getSelector(),
14338                                                SelLocs,
14339                                                E->getMethodDecl(),
14340                                                E->getLeftLoc(),
14341                                                Args,
14342                                                E->getRightLoc());
14343   }
14344   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
14345            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
14346     if (!E->getMethodDecl())
14347       return ExprError();
14348 
14349     // Build a new class message send to 'super'.
14350     SmallVector<SourceLocation, 16> SelLocs;
14351     E->getSelectorLocs(SelLocs);
14352     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
14353                                                E->getSelector(),
14354                                                SelLocs,
14355                                                E->getReceiverType(),
14356                                                E->getMethodDecl(),
14357                                                E->getLeftLoc(),
14358                                                Args,
14359                                                E->getRightLoc());
14360   }
14361 
14362   // Instance message: transform the receiver
14363   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
14364          "Only class and instance messages may be instantiated");
14365   ExprResult Receiver
14366     = getDerived().TransformExpr(E->getInstanceReceiver());
14367   if (Receiver.isInvalid())
14368     return ExprError();
14369 
14370   // If nothing changed, just retain the existing message send.
14371   if (!getDerived().AlwaysRebuild() &&
14372       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
14373     return SemaRef.MaybeBindToTemporary(E);
14374 
14375   // Build a new instance message send.
14376   SmallVector<SourceLocation, 16> SelLocs;
14377   E->getSelectorLocs(SelLocs);
14378   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14379                                              E->getSelector(),
14380                                              SelLocs,
14381                                              E->getMethodDecl(),
14382                                              E->getLeftLoc(),
14383                                              Args,
14384                                              E->getRightLoc());
14385 }
14386 
14387 template<typename Derived>
14388 ExprResult
14389 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14390   return E;
14391 }
14392 
14393 template<typename Derived>
14394 ExprResult
14395 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14396   return E;
14397 }
14398 
14399 template<typename Derived>
14400 ExprResult
14401 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14402   // Transform the base expression.
14403   ExprResult Base = getDerived().TransformExpr(E->getBase());
14404   if (Base.isInvalid())
14405     return ExprError();
14406 
14407   // We don't need to transform the ivar; it will never change.
14408 
14409   // If nothing changed, just retain the existing expression.
14410   if (!getDerived().AlwaysRebuild() &&
14411       Base.get() == E->getBase())
14412     return E;
14413 
14414   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14415                                              E->getLocation(),
14416                                              E->isArrow(), E->isFreeIvar());
14417 }
14418 
14419 template<typename Derived>
14420 ExprResult
14421 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14422   // 'super' and types never change. Property never changes. Just
14423   // retain the existing expression.
14424   if (!E->isObjectReceiver())
14425     return E;
14426 
14427   // Transform the base expression.
14428   ExprResult Base = getDerived().TransformExpr(E->getBase());
14429   if (Base.isInvalid())
14430     return ExprError();
14431 
14432   // We don't need to transform the property; it will never change.
14433 
14434   // If nothing changed, just retain the existing expression.
14435   if (!getDerived().AlwaysRebuild() &&
14436       Base.get() == E->getBase())
14437     return E;
14438 
14439   if (E->isExplicitProperty())
14440     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14441                                                    E->getExplicitProperty(),
14442                                                    E->getLocation());
14443 
14444   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14445                                                  SemaRef.Context.PseudoObjectTy,
14446                                                  E->getImplicitPropertyGetter(),
14447                                                  E->getImplicitPropertySetter(),
14448                                                  E->getLocation());
14449 }
14450 
14451 template<typename Derived>
14452 ExprResult
14453 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14454   // Transform the base expression.
14455   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14456   if (Base.isInvalid())
14457     return ExprError();
14458 
14459   // Transform the key expression.
14460   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14461   if (Key.isInvalid())
14462     return ExprError();
14463 
14464   // If nothing changed, just retain the existing expression.
14465   if (!getDerived().AlwaysRebuild() &&
14466       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14467     return E;
14468 
14469   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14470                                                   Base.get(), Key.get(),
14471                                                   E->getAtIndexMethodDecl(),
14472                                                   E->setAtIndexMethodDecl());
14473 }
14474 
14475 template<typename Derived>
14476 ExprResult
14477 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14478   // Transform the base expression.
14479   ExprResult Base = getDerived().TransformExpr(E->getBase());
14480   if (Base.isInvalid())
14481     return ExprError();
14482 
14483   // If nothing changed, just retain the existing expression.
14484   if (!getDerived().AlwaysRebuild() &&
14485       Base.get() == E->getBase())
14486     return E;
14487 
14488   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14489                                          E->getOpLoc(),
14490                                          E->isArrow());
14491 }
14492 
14493 template<typename Derived>
14494 ExprResult
14495 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14496   bool ArgumentChanged = false;
14497   SmallVector<Expr*, 8> SubExprs;
14498   SubExprs.reserve(E->getNumSubExprs());
14499   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14500                                   SubExprs, &ArgumentChanged))
14501     return ExprError();
14502 
14503   if (!getDerived().AlwaysRebuild() &&
14504       !ArgumentChanged)
14505     return E;
14506 
14507   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14508                                                SubExprs,
14509                                                E->getRParenLoc());
14510 }
14511 
14512 template<typename Derived>
14513 ExprResult
14514 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14515   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14516   if (SrcExpr.isInvalid())
14517     return ExprError();
14518 
14519   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14520   if (!Type)
14521     return ExprError();
14522 
14523   if (!getDerived().AlwaysRebuild() &&
14524       Type == E->getTypeSourceInfo() &&
14525       SrcExpr.get() == E->getSrcExpr())
14526     return E;
14527 
14528   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14529                                                SrcExpr.get(), Type,
14530                                                E->getRParenLoc());
14531 }
14532 
14533 template<typename Derived>
14534 ExprResult
14535 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14536   BlockDecl *oldBlock = E->getBlockDecl();
14537 
14538   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14539   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14540 
14541   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14542   blockScope->TheDecl->setBlockMissingReturnType(
14543                          oldBlock->blockMissingReturnType());
14544 
14545   SmallVector<ParmVarDecl*, 4> params;
14546   SmallVector<QualType, 4> paramTypes;
14547 
14548   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14549 
14550   // Parameter substitution.
14551   Sema::ExtParameterInfoBuilder extParamInfos;
14552   if (getDerived().TransformFunctionTypeParams(
14553           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14554           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14555           extParamInfos)) {
14556     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14557     return ExprError();
14558   }
14559 
14560   QualType exprResultType =
14561       getDerived().TransformType(exprFunctionType->getReturnType());
14562 
14563   auto epi = exprFunctionType->getExtProtoInfo();
14564   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14565 
14566   QualType functionType =
14567     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14568   blockScope->FunctionType = functionType;
14569 
14570   // Set the parameters on the block decl.
14571   if (!params.empty())
14572     blockScope->TheDecl->setParams(params);
14573 
14574   if (!oldBlock->blockMissingReturnType()) {
14575     blockScope->HasImplicitReturnType = false;
14576     blockScope->ReturnType = exprResultType;
14577   }
14578 
14579   // Transform the body
14580   StmtResult body = getDerived().TransformStmt(E->getBody());
14581   if (body.isInvalid()) {
14582     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14583     return ExprError();
14584   }
14585 
14586 #ifndef NDEBUG
14587   // In builds with assertions, make sure that we captured everything we
14588   // captured before.
14589   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14590     for (const auto &I : oldBlock->captures()) {
14591       VarDecl *oldCapture = I.getVariable();
14592 
14593       // Ignore parameter packs.
14594       if (oldCapture->isParameterPack())
14595         continue;
14596 
14597       VarDecl *newCapture =
14598         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14599                                                  oldCapture));
14600       assert(blockScope->CaptureMap.count(newCapture));
14601     }
14602     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14603   }
14604 #endif
14605 
14606   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14607                                     /*Scope=*/nullptr);
14608 }
14609 
14610 template<typename Derived>
14611 ExprResult
14612 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14613   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14614   if (SrcExpr.isInvalid())
14615     return ExprError();
14616 
14617   QualType Type = getDerived().TransformType(E->getType());
14618 
14619   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14620                                  E->getRParenLoc());
14621 }
14622 
14623 template<typename Derived>
14624 ExprResult
14625 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *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().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14638                                         E->getOp(), E->getRParenLoc());
14639 }
14640 
14641 //===----------------------------------------------------------------------===//
14642 // Type reconstruction
14643 //===----------------------------------------------------------------------===//
14644 
14645 template<typename Derived>
14646 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14647                                                     SourceLocation Star) {
14648   return SemaRef.BuildPointerType(PointeeType, Star,
14649                                   getDerived().getBaseEntity());
14650 }
14651 
14652 template<typename Derived>
14653 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14654                                                          SourceLocation Star) {
14655   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14656                                        getDerived().getBaseEntity());
14657 }
14658 
14659 template<typename Derived>
14660 QualType
14661 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14662                                              bool WrittenAsLValue,
14663                                              SourceLocation Sigil) {
14664   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14665                                     Sigil, getDerived().getBaseEntity());
14666 }
14667 
14668 template<typename Derived>
14669 QualType
14670 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14671                                                  QualType ClassType,
14672                                                  SourceLocation Sigil) {
14673   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14674                                         getDerived().getBaseEntity());
14675 }
14676 
14677 template<typename Derived>
14678 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14679            const ObjCTypeParamDecl *Decl,
14680            SourceLocation ProtocolLAngleLoc,
14681            ArrayRef<ObjCProtocolDecl *> Protocols,
14682            ArrayRef<SourceLocation> ProtocolLocs,
14683            SourceLocation ProtocolRAngleLoc) {
14684   return SemaRef.BuildObjCTypeParamType(Decl,
14685                                         ProtocolLAngleLoc, Protocols,
14686                                         ProtocolLocs, ProtocolRAngleLoc,
14687                                         /*FailOnError=*/true);
14688 }
14689 
14690 template<typename Derived>
14691 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14692            QualType BaseType,
14693            SourceLocation Loc,
14694            SourceLocation TypeArgsLAngleLoc,
14695            ArrayRef<TypeSourceInfo *> TypeArgs,
14696            SourceLocation TypeArgsRAngleLoc,
14697            SourceLocation ProtocolLAngleLoc,
14698            ArrayRef<ObjCProtocolDecl *> Protocols,
14699            ArrayRef<SourceLocation> ProtocolLocs,
14700            SourceLocation ProtocolRAngleLoc) {
14701   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs,
14702                                      TypeArgsRAngleLoc, ProtocolLAngleLoc,
14703                                      Protocols, ProtocolLocs, ProtocolRAngleLoc,
14704                                      /*FailOnError=*/true,
14705                                      /*Rebuilding=*/true);
14706 }
14707 
14708 template<typename Derived>
14709 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14710            QualType PointeeType,
14711            SourceLocation Star) {
14712   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14713 }
14714 
14715 template<typename Derived>
14716 QualType
14717 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14718                                          ArrayType::ArraySizeModifier SizeMod,
14719                                          const llvm::APInt *Size,
14720                                          Expr *SizeExpr,
14721                                          unsigned IndexTypeQuals,
14722                                          SourceRange BracketsRange) {
14723   if (SizeExpr || !Size)
14724     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14725                                   IndexTypeQuals, BracketsRange,
14726                                   getDerived().getBaseEntity());
14727 
14728   QualType Types[] = {
14729     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14730     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14731     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14732   };
14733   QualType SizeType;
14734   for (const auto &T : Types)
14735     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) {
14736       SizeType = T;
14737       break;
14738     }
14739 
14740   // Note that we can return a VariableArrayType here in the case where
14741   // the element type was a dependent VariableArrayType.
14742   IntegerLiteral *ArraySize
14743       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14744                                /*FIXME*/BracketsRange.getBegin());
14745   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14746                                 IndexTypeQuals, BracketsRange,
14747                                 getDerived().getBaseEntity());
14748 }
14749 
14750 template<typename Derived>
14751 QualType
14752 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14753                                                  ArrayType::ArraySizeModifier SizeMod,
14754                                                  const llvm::APInt &Size,
14755                                                  Expr *SizeExpr,
14756                                                  unsigned IndexTypeQuals,
14757                                                  SourceRange BracketsRange) {
14758   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14759                                         IndexTypeQuals, BracketsRange);
14760 }
14761 
14762 template<typename Derived>
14763 QualType
14764 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14765                                           ArrayType::ArraySizeModifier SizeMod,
14766                                                  unsigned IndexTypeQuals,
14767                                                    SourceRange BracketsRange) {
14768   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14769                                        IndexTypeQuals, BracketsRange);
14770 }
14771 
14772 template<typename Derived>
14773 QualType
14774 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14775                                           ArrayType::ArraySizeModifier SizeMod,
14776                                                  Expr *SizeExpr,
14777                                                  unsigned IndexTypeQuals,
14778                                                  SourceRange BracketsRange) {
14779   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14780                                        SizeExpr,
14781                                        IndexTypeQuals, BracketsRange);
14782 }
14783 
14784 template<typename Derived>
14785 QualType
14786 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14787                                           ArrayType::ArraySizeModifier SizeMod,
14788                                                        Expr *SizeExpr,
14789                                                        unsigned IndexTypeQuals,
14790                                                    SourceRange BracketsRange) {
14791   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14792                                        SizeExpr,
14793                                        IndexTypeQuals, BracketsRange);
14794 }
14795 
14796 template <typename Derived>
14797 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14798     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14799   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14800                                           AttributeLoc);
14801 }
14802 
14803 template <typename Derived>
14804 QualType
14805 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14806                                           unsigned NumElements,
14807                                           VectorType::VectorKind VecKind) {
14808   // FIXME: semantic checking!
14809   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14810 }
14811 
14812 template <typename Derived>
14813 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14814     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14815     VectorType::VectorKind VecKind) {
14816   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14817 }
14818 
14819 template<typename Derived>
14820 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14821                                                       unsigned NumElements,
14822                                                  SourceLocation AttributeLoc) {
14823   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14824                           NumElements, true);
14825   IntegerLiteral *VectorSize
14826     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14827                              AttributeLoc);
14828   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14829 }
14830 
14831 template<typename Derived>
14832 QualType
14833 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14834                                                            Expr *SizeExpr,
14835                                                   SourceLocation AttributeLoc) {
14836   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14837 }
14838 
14839 template <typename Derived>
14840 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14841     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14842   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14843                                                NumColumns);
14844 }
14845 
14846 template <typename Derived>
14847 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14848     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14849     SourceLocation AttributeLoc) {
14850   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14851                                  AttributeLoc);
14852 }
14853 
14854 template<typename Derived>
14855 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14856     QualType T,
14857     MutableArrayRef<QualType> ParamTypes,
14858     const FunctionProtoType::ExtProtoInfo &EPI) {
14859   return SemaRef.BuildFunctionType(T, ParamTypes,
14860                                    getDerived().getBaseLocation(),
14861                                    getDerived().getBaseEntity(),
14862                                    EPI);
14863 }
14864 
14865 template<typename Derived>
14866 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14867   return SemaRef.Context.getFunctionNoProtoType(T);
14868 }
14869 
14870 template<typename Derived>
14871 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14872                                                             Decl *D) {
14873   assert(D && "no decl found");
14874   if (D->isInvalidDecl()) return QualType();
14875 
14876   // FIXME: Doesn't account for ObjCInterfaceDecl!
14877   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14878     // A valid resolved using typename pack expansion decl can have multiple
14879     // UsingDecls, but they must each have exactly one type, and it must be
14880     // the same type in every case. But we must have at least one expansion!
14881     if (UPD->expansions().empty()) {
14882       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14883           << UPD->isCXXClassMember() << UPD;
14884       return QualType();
14885     }
14886 
14887     // We might still have some unresolved types. Try to pick a resolved type
14888     // if we can. The final instantiation will check that the remaining
14889     // unresolved types instantiate to the type we pick.
14890     QualType FallbackT;
14891     QualType T;
14892     for (auto *E : UPD->expansions()) {
14893       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14894       if (ThisT.isNull())
14895         continue;
14896       else if (ThisT->getAs<UnresolvedUsingType>())
14897         FallbackT = ThisT;
14898       else if (T.isNull())
14899         T = ThisT;
14900       else
14901         assert(getSema().Context.hasSameType(ThisT, T) &&
14902                "mismatched resolved types in using pack expansion");
14903     }
14904     return T.isNull() ? FallbackT : T;
14905   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14906     assert(Using->hasTypename() &&
14907            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14908 
14909     // A valid resolved using typename decl points to exactly one type decl.
14910     assert(++Using->shadow_begin() == Using->shadow_end());
14911 
14912     UsingShadowDecl *Shadow = *Using->shadow_begin();
14913     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14914       return QualType();
14915     return SemaRef.Context.getUsingType(
14916         Shadow, SemaRef.Context.getTypeDeclType(
14917                     cast<TypeDecl>(Shadow->getTargetDecl())));
14918   } else {
14919     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14920            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14921     return SemaRef.Context.getTypeDeclType(
14922         cast<UnresolvedUsingTypenameDecl>(D));
14923   }
14924 }
14925 
14926 template <typename Derived>
14927 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation,
14928                                                        TypeOfKind Kind) {
14929   return SemaRef.BuildTypeofExprType(E, Kind);
14930 }
14931 
14932 template<typename Derived>
14933 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying,
14934                                                    TypeOfKind Kind) {
14935   return SemaRef.Context.getTypeOfType(Underlying, Kind);
14936 }
14937 
14938 template <typename Derived>
14939 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14940   return SemaRef.BuildDecltypeType(E);
14941 }
14942 
14943 template<typename Derived>
14944 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14945                                             UnaryTransformType::UTTKind UKind,
14946                                             SourceLocation Loc) {
14947   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14948 }
14949 
14950 template<typename Derived>
14951 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14952                                                       TemplateName Template,
14953                                              SourceLocation TemplateNameLoc,
14954                                      TemplateArgumentListInfo &TemplateArgs) {
14955   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14956 }
14957 
14958 template<typename Derived>
14959 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14960                                                    SourceLocation KWLoc) {
14961   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14962 }
14963 
14964 template<typename Derived>
14965 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14966                                                  SourceLocation KWLoc,
14967                                                  bool isReadPipe) {
14968   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14969                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14970 }
14971 
14972 template <typename Derived>
14973 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14974                                                    unsigned NumBits,
14975                                                    SourceLocation Loc) {
14976   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14977                         NumBits, true);
14978   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14979                                                 SemaRef.Context.IntTy, Loc);
14980   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14981 }
14982 
14983 template <typename Derived>
14984 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14985     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14986   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14987 }
14988 
14989 template<typename Derived>
14990 TemplateName
14991 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14992                                             bool TemplateKW,
14993                                             TemplateDecl *Template) {
14994   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14995                                                   TemplateName(Template));
14996 }
14997 
14998 template<typename Derived>
14999 TemplateName
15000 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15001                                             SourceLocation TemplateKWLoc,
15002                                             const IdentifierInfo &Name,
15003                                             SourceLocation NameLoc,
15004                                             QualType ObjectType,
15005                                             NamedDecl *FirstQualifierInScope,
15006                                             bool AllowInjectedClassName) {
15007   UnqualifiedId TemplateName;
15008   TemplateName.setIdentifier(&Name, NameLoc);
15009   Sema::TemplateTy Template;
15010   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
15011                               TemplateName, ParsedType::make(ObjectType),
15012                               /*EnteringContext=*/false, Template,
15013                               AllowInjectedClassName);
15014   return Template.get();
15015 }
15016 
15017 template<typename Derived>
15018 TemplateName
15019 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
15020                                             SourceLocation TemplateKWLoc,
15021                                             OverloadedOperatorKind Operator,
15022                                             SourceLocation NameLoc,
15023                                             QualType ObjectType,
15024                                             bool AllowInjectedClassName) {
15025   UnqualifiedId Name;
15026   // FIXME: Bogus location information.
15027   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
15028   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
15029   Sema::TemplateTy Template;
15030   getSema().ActOnTemplateName(
15031       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
15032       /*EnteringContext=*/false, Template, AllowInjectedClassName);
15033   return Template.get();
15034 }
15035 
15036 template<typename Derived>
15037 ExprResult
15038 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
15039                                                    SourceLocation OpLoc,
15040                                                    Expr *OrigCallee,
15041                                                    Expr *First,
15042                                                    Expr *Second) {
15043   Expr *Callee = OrigCallee->IgnoreParenCasts();
15044   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
15045 
15046   if (First->getObjectKind() == OK_ObjCProperty) {
15047     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15048     if (BinaryOperator::isAssignmentOp(Opc))
15049       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
15050                                                  First, Second);
15051     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
15052     if (Result.isInvalid())
15053       return ExprError();
15054     First = Result.get();
15055   }
15056 
15057   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
15058     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
15059     if (Result.isInvalid())
15060       return ExprError();
15061     Second = Result.get();
15062   }
15063 
15064   // Determine whether this should be a builtin operation.
15065   if (Op == OO_Subscript) {
15066     if (!First->getType()->isOverloadableType() &&
15067         !Second->getType()->isOverloadableType())
15068       return getSema().CreateBuiltinArraySubscriptExpr(
15069           First, Callee->getBeginLoc(), Second, OpLoc);
15070   } else if (Op == OO_Arrow) {
15071     // It is possible that the type refers to a RecoveryExpr created earlier
15072     // in the tree transformation.
15073     if (First->getType()->isDependentType())
15074       return ExprError();
15075     // -> is never a builtin operation.
15076     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
15077   } else if (Second == nullptr || isPostIncDec) {
15078     if (!First->getType()->isOverloadableType() ||
15079         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
15080       // The argument is not of overloadable type, or this is an expression
15081       // of the form &Class::member, so try to create a built-in unary
15082       // operation.
15083       UnaryOperatorKind Opc
15084         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15085 
15086       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
15087     }
15088   } else {
15089     if (!First->getType()->isOverloadableType() &&
15090         !Second->getType()->isOverloadableType()) {
15091       // Neither of the arguments is an overloadable type, so try to
15092       // create a built-in binary operation.
15093       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15094       ExprResult Result
15095         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
15096       if (Result.isInvalid())
15097         return ExprError();
15098 
15099       return Result;
15100     }
15101   }
15102 
15103   // Compute the transformed set of functions (and function templates) to be
15104   // used during overload resolution.
15105   UnresolvedSet<16> Functions;
15106   bool RequiresADL;
15107 
15108   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
15109     Functions.append(ULE->decls_begin(), ULE->decls_end());
15110     // If the overload could not be resolved in the template definition
15111     // (because we had a dependent argument), ADL is performed as part of
15112     // template instantiation.
15113     RequiresADL = ULE->requiresADL();
15114   } else {
15115     // If we've resolved this to a particular non-member function, just call
15116     // that function. If we resolved it to a member function,
15117     // CreateOverloaded* will find that function for us.
15118     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
15119     if (!isa<CXXMethodDecl>(ND))
15120       Functions.addDecl(ND);
15121     RequiresADL = false;
15122   }
15123 
15124   // Add any functions found via argument-dependent lookup.
15125   Expr *Args[2] = { First, Second };
15126   unsigned NumArgs = 1 + (Second != nullptr);
15127 
15128   // Create the overloaded operator invocation for unary operators.
15129   if (NumArgs == 1 || isPostIncDec) {
15130     UnaryOperatorKind Opc
15131       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
15132     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
15133                                            RequiresADL);
15134   }
15135 
15136   if (Op == OO_Subscript) {
15137     SourceLocation LBrace;
15138     SourceLocation RBrace;
15139 
15140     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
15141       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
15142       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
15143       RBrace = NameLoc.getCXXOperatorNameEndLoc();
15144     } else {
15145       LBrace = Callee->getBeginLoc();
15146       RBrace = OpLoc;
15147     }
15148 
15149     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
15150                                                       First, Second);
15151   }
15152 
15153   // Create the overloaded operator invocation for binary operators.
15154   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
15155   ExprResult Result = SemaRef.CreateOverloadedBinOp(
15156       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
15157   if (Result.isInvalid())
15158     return ExprError();
15159 
15160   return Result;
15161 }
15162 
15163 template<typename Derived>
15164 ExprResult
15165 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
15166                                                      SourceLocation OperatorLoc,
15167                                                        bool isArrow,
15168                                                        CXXScopeSpec &SS,
15169                                                      TypeSourceInfo *ScopeType,
15170                                                        SourceLocation CCLoc,
15171                                                        SourceLocation TildeLoc,
15172                                         PseudoDestructorTypeStorage Destroyed) {
15173   QualType BaseType = Base->getType();
15174   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
15175       (!isArrow && !BaseType->getAs<RecordType>()) ||
15176       (isArrow && BaseType->getAs<PointerType>() &&
15177        !BaseType->castAs<PointerType>()->getPointeeType()
15178                                               ->template getAs<RecordType>())){
15179     // This pseudo-destructor expression is still a pseudo-destructor.
15180     return SemaRef.BuildPseudoDestructorExpr(
15181         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
15182         CCLoc, TildeLoc, Destroyed);
15183   }
15184 
15185   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
15186   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
15187                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
15188   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
15189   NameInfo.setNamedTypeInfo(DestroyedType);
15190 
15191   // The scope type is now known to be a valid nested name specifier
15192   // component. Tack it on to the end of the nested name specifier.
15193   if (ScopeType) {
15194     if (!ScopeType->getType()->getAs<TagType>()) {
15195       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
15196                      diag::err_expected_class_or_namespace)
15197           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
15198       return ExprError();
15199     }
15200     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
15201               CCLoc);
15202   }
15203 
15204   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
15205   return getSema().BuildMemberReferenceExpr(Base, BaseType,
15206                                             OperatorLoc, isArrow,
15207                                             SS, TemplateKWLoc,
15208                                             /*FIXME: FirstQualifier*/ nullptr,
15209                                             NameInfo,
15210                                             /*TemplateArgs*/ nullptr,
15211                                             /*S*/nullptr);
15212 }
15213 
15214 template<typename Derived>
15215 StmtResult
15216 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
15217   SourceLocation Loc = S->getBeginLoc();
15218   CapturedDecl *CD = S->getCapturedDecl();
15219   unsigned NumParams = CD->getNumParams();
15220   unsigned ContextParamPos = CD->getContextParamPosition();
15221   SmallVector<Sema::CapturedParamNameType, 4> Params;
15222   for (unsigned I = 0; I < NumParams; ++I) {
15223     if (I != ContextParamPos) {
15224       Params.push_back(
15225              std::make_pair(
15226                   CD->getParam(I)->getName(),
15227                   getDerived().TransformType(CD->getParam(I)->getType())));
15228     } else {
15229       Params.push_back(std::make_pair(StringRef(), QualType()));
15230     }
15231   }
15232   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
15233                                      S->getCapturedRegionKind(), Params);
15234   StmtResult Body;
15235   {
15236     Sema::CompoundScopeRAII CompoundScope(getSema());
15237     Body = getDerived().TransformStmt(S->getCapturedStmt());
15238   }
15239 
15240   if (Body.isInvalid()) {
15241     getSema().ActOnCapturedRegionError();
15242     return StmtError();
15243   }
15244 
15245   return getSema().ActOnCapturedRegionEnd(Body.get());
15246 }
15247 
15248 } // end namespace clang
15249 
15250 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15251