1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements a semantic tree transformation that takes a given
10 //  AST and rebuilds it, possibly transforming some nodes in the process.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
16 
17 #include "CoroutineStmtBuilder.h"
18 #include "TypeLocBuilder.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Sema/Lookup.h"
32 #include "clang/Sema/Ownership.h"
33 #include "clang/Sema/ParsedTemplate.h"
34 #include "clang/Sema/ScopeInfo.h"
35 #include "clang/Sema/SemaDiagnostic.h"
36 #include "clang/Sema/SemaInternal.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include <algorithm>
40 
41 namespace clang {
42 using namespace sema;
43 
44 /// \brief A semantic tree transformation that allows one to transform one
45 /// abstract syntax tree into another.
46 ///
47 /// A new tree transformation is defined by creating a new subclass \c X of
48 /// \c TreeTransform<X> and then overriding certain operations to provide
49 /// behavior specific to that transformation. For example, template
50 /// instantiation is implemented as a tree transformation where the
51 /// transformation of TemplateTypeParmType nodes involves substituting the
52 /// template arguments for their corresponding template parameters; a similar
53 /// transformation is performed for non-type template parameters and
54 /// template template parameters.
55 ///
56 /// This tree-transformation template uses static polymorphism to allow
57 /// subclasses to customize any of its operations. Thus, a subclass can
58 /// override any of the transformation or rebuild operators by providing an
59 /// operation with the same signature as the default implementation. The
60 /// overriding function should not be virtual.
61 ///
62 /// Semantic tree transformations are split into two stages, either of which
63 /// can be replaced by a subclass. The "transform" step transforms an AST node
64 /// or the parts of an AST node using the various transformation functions,
65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
66 /// node of the appropriate kind from the pieces. The default transformation
67 /// routines recursively transform the operands to composite AST nodes (e.g.,
68 /// the pointee type of a PointerType node) and, if any of those operand nodes
69 /// were changed by the transformation, invokes the rebuild operation to create
70 /// a new AST node.
71 ///
72 /// Subclasses can customize the transformation at various levels. The
73 /// most coarse-grained transformations involve replacing TransformType(),
74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
76 /// new implementations.
77 ///
78 /// For more fine-grained transformations, subclasses can replace any of the
79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
81 /// replacing TransformTemplateTypeParmType() allows template instantiation
82 /// to substitute template arguments for their corresponding template
83 /// parameters. Additionally, subclasses can override the \c RebuildXXX
84 /// functions to control how AST nodes are rebuilt when their operands change.
85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
87 /// be able to use more efficient rebuild steps.
88 ///
89 /// There are a handful of other functions that can be overridden, allowing one
90 /// to avoid traversing nodes that don't need any transformation
91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
92 /// operands have not changed (\c AlwaysRebuild()), and customize the
93 /// default locations and entity names used for type-checking
94 /// (\c getBaseLocation(), \c getBaseEntity()).
95 template<typename Derived>
96 class TreeTransform {
97   /// \brief Private RAII object that helps us forget and then re-remember
98   /// the template argument corresponding to a partially-substituted parameter
99   /// pack.
100   class ForgetPartiallySubstitutedPackRAII {
101     Derived &Self;
102     TemplateArgument Old;
103 
104   public:
105     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
106       Old = Self.ForgetPartiallySubstitutedPack();
107     }
108 
109     ~ForgetPartiallySubstitutedPackRAII() {
110       Self.RememberPartiallySubstitutedPack(Old);
111     }
112   };
113 
114 protected:
115   Sema &SemaRef;
116 
117   /// \brief The set of local declarations that have been transformed, for
118   /// cases where we are forced to build new declarations within the transformer
119   /// rather than in the subclass (e.g., lambda closure types).
120   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
121 
122 public:
123   /// \brief Initializes a new tree transformer.
124   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
125 
126   /// \brief Retrieves a reference to the derived class.
127   Derived &getDerived() { return static_cast<Derived&>(*this); }
128 
129   /// \brief Retrieves a reference to the derived class.
130   const Derived &getDerived() const {
131     return static_cast<const Derived&>(*this);
132   }
133 
134   static inline ExprResult Owned(Expr *E) { return E; }
135   static inline StmtResult Owned(Stmt *S) { return S; }
136 
137   /// \brief Retrieves a reference to the semantic analysis object used for
138   /// this tree transform.
139   Sema &getSema() const { return SemaRef; }
140 
141   /// \brief Whether the transformation should always rebuild AST nodes, even
142   /// if none of the children have changed.
143   ///
144   /// Subclasses may override this function to specify when the transformation
145   /// should rebuild all AST nodes.
146   ///
147   /// We must always rebuild all AST nodes when performing variadic template
148   /// pack expansion, in order to avoid violating the AST invariant that each
149   /// statement node appears at most once in its containing declaration.
150   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
151 
152   /// \brief Returns the location of the entity being transformed, if that
153   /// information was not available elsewhere in the AST.
154   ///
155   /// By default, returns no source-location information. Subclasses can
156   /// provide an alternative implementation that provides better location
157   /// information.
158   SourceLocation getBaseLocation() { return SourceLocation(); }
159 
160   /// \brief Returns the name of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns an empty name. Subclasses can provide an alternative
164   /// implementation with a more precise name.
165   DeclarationName getBaseEntity() { return DeclarationName(); }
166 
167   /// \brief Sets the "base" location and entity when that
168   /// information is known based on another transformation.
169   ///
170   /// By default, the source location and entity are ignored. Subclasses can
171   /// override this function to provide a customized implementation.
172   void setBase(SourceLocation Loc, DeclarationName Entity) { }
173 
174   /// \brief RAII object that temporarily sets the base location and entity
175   /// used for reporting diagnostics in types.
176   class TemporaryBase {
177     TreeTransform &Self;
178     SourceLocation OldLocation;
179     DeclarationName OldEntity;
180 
181   public:
182     TemporaryBase(TreeTransform &Self, SourceLocation Location,
183                   DeclarationName Entity) : Self(Self) {
184       OldLocation = Self.getDerived().getBaseLocation();
185       OldEntity = Self.getDerived().getBaseEntity();
186 
187       if (Location.isValid())
188         Self.getDerived().setBase(Location, Entity);
189     }
190 
191     ~TemporaryBase() {
192       Self.getDerived().setBase(OldLocation, OldEntity);
193     }
194   };
195 
196   /// \brief Determine whether the given type \p T has already been
197   /// transformed.
198   ///
199   /// Subclasses can provide an alternative implementation of this routine
200   /// to short-circuit evaluation when it is known that a given type will
201   /// not change. For example, template instantiation need not traverse
202   /// non-dependent types.
203   bool AlreadyTransformed(QualType T) {
204     return T.isNull();
205   }
206 
207   /// \brief Determine whether the given call argument should be dropped, e.g.,
208   /// because it is a default argument.
209   ///
210   /// Subclasses can provide an alternative implementation of this routine to
211   /// determine which kinds of call arguments get dropped. By default,
212   /// CXXDefaultArgument nodes are dropped (prior to transformation).
213   bool DropCallArgument(Expr *E) {
214     return E->isDefaultArgument();
215   }
216 
217   /// \brief Determine whether we should expand a pack expansion with the
218   /// given set of parameter packs into separate arguments by repeatedly
219   /// transforming the pattern.
220   ///
221   /// By default, the transformer never tries to expand pack expansions.
222   /// Subclasses can override this routine to provide different behavior.
223   ///
224   /// \param EllipsisLoc The location of the ellipsis that identifies the
225   /// pack expansion.
226   ///
227   /// \param PatternRange The source range that covers the entire pattern of
228   /// the pack expansion.
229   ///
230   /// \param Unexpanded The set of unexpanded parameter packs within the
231   /// pattern.
232   ///
233   /// \param ShouldExpand Will be set to \c true if the transformer should
234   /// expand the corresponding pack expansions into separate arguments. When
235   /// set, \c NumExpansions must also be set.
236   ///
237   /// \param RetainExpansion Whether the caller should add an unexpanded
238   /// pack expansion after all of the expanded arguments. This is used
239   /// when extending explicitly-specified template argument packs per
240   /// C++0x [temp.arg.explicit]p9.
241   ///
242   /// \param NumExpansions The number of separate arguments that will be in
243   /// the expanded form of the corresponding pack expansion. This is both an
244   /// input and an output parameter, which can be set by the caller if the
245   /// number of expansions is known a priori (e.g., due to a prior substitution)
246   /// and will be set by the callee when the number of expansions is known.
247   /// The callee must set this value when \c ShouldExpand is \c true; it may
248   /// set this value in other cases.
249   ///
250   /// \returns true if an error occurred (e.g., because the parameter packs
251   /// are to be instantiated with arguments of different lengths), false
252   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
253   /// must be set.
254   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
255                                SourceRange PatternRange,
256                                ArrayRef<UnexpandedParameterPack> Unexpanded,
257                                bool &ShouldExpand,
258                                bool &RetainExpansion,
259                                Optional<unsigned> &NumExpansions) {
260     ShouldExpand = false;
261     return false;
262   }
263 
264   /// \brief "Forget" about the partially-substituted pack template argument,
265   /// when performing an instantiation that must preserve the parameter pack
266   /// use.
267   ///
268   /// This routine is meant to be overridden by the template instantiator.
269   TemplateArgument ForgetPartiallySubstitutedPack() {
270     return TemplateArgument();
271   }
272 
273   /// \brief "Remember" the partially-substituted pack template argument
274   /// after performing an instantiation that must preserve the parameter pack
275   /// use.
276   ///
277   /// This routine is meant to be overridden by the template instantiator.
278   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
279 
280   /// \brief Note to the derived class when a function parameter pack is
281   /// being expanded.
282   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
283 
284   /// \brief Transforms the given type into another type.
285   ///
286   /// By default, this routine transforms a type by creating a
287   /// TypeSourceInfo for it and delegating to the appropriate
288   /// function.  This is expensive, but we don't mind, because
289   /// this method is deprecated anyway;  all users should be
290   /// switched to storing TypeSourceInfos.
291   ///
292   /// \returns the transformed type.
293   QualType TransformType(QualType T);
294 
295   /// \brief Transforms the given type-with-location into a new
296   /// type-with-location.
297   ///
298   /// By default, this routine transforms a type by delegating to the
299   /// appropriate TransformXXXType to build a new type.  Subclasses
300   /// may override this function (to take over all type
301   /// transformations) or some set of the TransformXXXType functions
302   /// to alter the transformation.
303   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
304 
305   /// \brief Transform the given type-with-location into a new
306   /// type, collecting location information in the given builder
307   /// as necessary.
308   ///
309   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
310 
311   /// \brief Transform a type that is permitted to produce a
312   /// DeducedTemplateSpecializationType.
313   ///
314   /// This is used in the (relatively rare) contexts where it is acceptable
315   /// for transformation to produce a class template type with deduced
316   /// template arguments.
317   /// @{
318   QualType TransformTypeWithDeducedTST(QualType T);
319   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
320   /// @}
321 
322   /// \brief Transform the given statement.
323   ///
324   /// By default, this routine transforms a statement by delegating to the
325   /// appropriate TransformXXXStmt function to transform a specific kind of
326   /// statement or the TransformExpr() function to transform an expression.
327   /// Subclasses may override this function to transform statements using some
328   /// other mechanism.
329   ///
330   /// \returns the transformed statement.
331   StmtResult TransformStmt(Stmt *S);
332 
333   /// \brief Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformOMPXXXClause function to transform a specific kind
337   /// of clause. Subclasses may override this function to transform statements
338   /// using some other mechanism.
339   ///
340   /// \returns the transformed OpenMP clause.
341   OMPClause *TransformOMPClause(OMPClause *S);
342 
343   /// \brief Transform the given attribute.
344   ///
345   /// By default, this routine transforms a statement by delegating to the
346   /// appropriate TransformXXXAttr function to transform a specific kind
347   /// of attribute. Subclasses may override this function to transform
348   /// attributed statements using some other mechanism.
349   ///
350   /// \returns the transformed attribute
351   const Attr *TransformAttr(const Attr *S);
352 
353 /// \brief Transform the specified attribute.
354 ///
355 /// Subclasses should override the transformation of attributes with a pragma
356 /// spelling to transform expressions stored within the attribute.
357 ///
358 /// \returns the transformed attribute.
359 #define ATTR(X)
360 #define PRAGMA_SPELLING_ATTR(X)                                                \
361   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
362 #include "clang/Basic/AttrList.inc"
363 
364   /// \brief Transform the given expression.
365   ///
366   /// By default, this routine transforms an expression by delegating to the
367   /// appropriate TransformXXXExpr function to build a new expression.
368   /// Subclasses may override this function to transform expressions using some
369   /// other mechanism.
370   ///
371   /// \returns the transformed expression.
372   ExprResult TransformExpr(Expr *E);
373 
374   /// \brief Transform the given initializer.
375   ///
376   /// By default, this routine transforms an initializer by stripping off the
377   /// semantic nodes added by initialization, then passing the result to
378   /// TransformExpr or TransformExprs.
379   ///
380   /// \returns the transformed initializer.
381   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
382 
383   /// \brief Transform the given list of expressions.
384   ///
385   /// This routine transforms a list of expressions by invoking
386   /// \c TransformExpr() for each subexpression. However, it also provides
387   /// support for variadic templates by expanding any pack expansions (if the
388   /// derived class permits such expansion) along the way. When pack expansions
389   /// are present, the number of outputs may not equal the number of inputs.
390   ///
391   /// \param Inputs The set of expressions to be transformed.
392   ///
393   /// \param NumInputs The number of expressions in \c Inputs.
394   ///
395   /// \param IsCall If \c true, then this transform is being performed on
396   /// function-call arguments, and any arguments that should be dropped, will
397   /// be.
398   ///
399   /// \param Outputs The transformed input expressions will be added to this
400   /// vector.
401   ///
402   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
403   /// due to transformation.
404   ///
405   /// \returns true if an error occurred, false otherwise.
406   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
407                       SmallVectorImpl<Expr *> &Outputs,
408                       bool *ArgChanged = nullptr);
409 
410   /// \brief Transform the given declaration, which is referenced from a type
411   /// or expression.
412   ///
413   /// By default, acts as the identity function on declarations, unless the
414   /// transformer has had to transform the declaration itself. Subclasses
415   /// may override this function to provide alternate behavior.
416   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
417     llvm::DenseMap<Decl *, Decl *>::iterator Known
418       = TransformedLocalDecls.find(D);
419     if (Known != TransformedLocalDecls.end())
420       return Known->second;
421 
422     return D;
423   }
424 
425   /// \brief Transform the specified condition.
426   ///
427   /// By default, this transforms the variable and expression and rebuilds
428   /// the condition.
429   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
430                                            Expr *Expr,
431                                            Sema::ConditionKind Kind);
432 
433   /// \brief Transform the attributes associated with the given declaration and
434   /// place them on the new declaration.
435   ///
436   /// By default, this operation does nothing. Subclasses may override this
437   /// behavior to transform attributes.
438   void transformAttrs(Decl *Old, Decl *New) { }
439 
440   /// \brief Note that a local declaration has been transformed by this
441   /// transformer.
442   ///
443   /// Local declarations are typically transformed via a call to
444   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
445   /// the transformer itself has to transform the declarations. This routine
446   /// can be overridden by a subclass that keeps track of such mappings.
447   void transformedLocalDecl(Decl *Old, Decl *New) {
448     TransformedLocalDecls[Old] = New;
449   }
450 
451   /// \brief Transform the definition of the given declaration.
452   ///
453   /// By default, invokes TransformDecl() to transform the declaration.
454   /// Subclasses may override this function to provide alternate behavior.
455   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
456     return getDerived().TransformDecl(Loc, D);
457   }
458 
459   /// \brief Transform the given declaration, which was the first part of a
460   /// nested-name-specifier in a member access expression.
461   ///
462   /// This specific declaration transformation only applies to the first
463   /// identifier in a nested-name-specifier of a member access expression, e.g.,
464   /// the \c T in \c x->T::member
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
469     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
470   }
471 
472   /// Transform the set of declarations in an OverloadExpr.
473   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
474                                   LookupResult &R);
475 
476   /// \brief Transform the given nested-name-specifier with source-location
477   /// information.
478   ///
479   /// By default, transforms all of the types and declarations within the
480   /// nested-name-specifier. Subclasses may override this function to provide
481   /// alternate behavior.
482   NestedNameSpecifierLoc
483   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
484                                   QualType ObjectType = QualType(),
485                                   NamedDecl *FirstQualifierInScope = nullptr);
486 
487   /// \brief Transform the given declaration name.
488   ///
489   /// By default, transforms the types of conversion function, constructor,
490   /// and destructor names and then (if needed) rebuilds the declaration name.
491   /// Identifiers and selectors are returned unmodified. Sublcasses may
492   /// override this function to provide alternate behavior.
493   DeclarationNameInfo
494   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
495 
496   /// \brief Transform the given template name.
497   ///
498   /// \param SS The nested-name-specifier that qualifies the template
499   /// name. This nested-name-specifier must already have been transformed.
500   ///
501   /// \param Name The template name to transform.
502   ///
503   /// \param NameLoc The source location of the template name.
504   ///
505   /// \param ObjectType If we're translating a template name within a member
506   /// access expression, this is the type of the object whose member template
507   /// is being referenced.
508   ///
509   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
510   /// also refers to a name within the current (lexical) scope, this is the
511   /// declaration it refers to.
512   ///
513   /// By default, transforms the template name by transforming the declarations
514   /// and nested-name-specifiers that occur within the template name.
515   /// Subclasses may override this function to provide alternate behavior.
516   TemplateName
517   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
518                         SourceLocation NameLoc,
519                         QualType ObjectType = QualType(),
520                         NamedDecl *FirstQualifierInScope = nullptr,
521                         bool AllowInjectedClassName = false);
522 
523   /// \brief Transform the given template argument.
524   ///
525   /// By default, this operation transforms the type, expression, or
526   /// declaration stored within the template argument and constructs a
527   /// new template argument from the transformed result. Subclasses may
528   /// override this function to provide alternate behavior.
529   ///
530   /// Returns true if there was an error.
531   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
532                                  TemplateArgumentLoc &Output,
533                                  bool Uneval = false);
534 
535   /// \brief Transform the given set of template arguments.
536   ///
537   /// By default, this operation transforms all of the template arguments
538   /// in the input set using \c TransformTemplateArgument(), and appends
539   /// the transformed arguments to the output list.
540   ///
541   /// Note that this overload of \c TransformTemplateArguments() is merely
542   /// a convenience function. Subclasses that wish to override this behavior
543   /// should override the iterator-based member template version.
544   ///
545   /// \param Inputs The set of template arguments to be transformed.
546   ///
547   /// \param NumInputs The number of template arguments in \p Inputs.
548   ///
549   /// \param Outputs The set of transformed template arguments output by this
550   /// routine.
551   ///
552   /// Returns true if an error occurred.
553   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
554                                   unsigned NumInputs,
555                                   TemplateArgumentListInfo &Outputs,
556                                   bool Uneval = false) {
557     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
558                                       Uneval);
559   }
560 
561   /// \brief Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// \param First An iterator to the first template argument.
568   ///
569   /// \param Last An iterator one step past the last template argument.
570   ///
571   /// \param Outputs The set of transformed template arguments output by this
572   /// routine.
573   ///
574   /// Returns true if an error occurred.
575   template<typename InputIterator>
576   bool TransformTemplateArguments(InputIterator First,
577                                   InputIterator Last,
578                                   TemplateArgumentListInfo &Outputs,
579                                   bool Uneval = false);
580 
581   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
582   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
583                                  TemplateArgumentLoc &ArgLoc);
584 
585   /// \brief Fakes up a TypeSourceInfo for a type.
586   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
587     return SemaRef.Context.getTrivialTypeSourceInfo(T,
588                        getDerived().getBaseLocation());
589   }
590 
591 #define ABSTRACT_TYPELOC(CLASS, PARENT)
592 #define TYPELOC(CLASS, PARENT)                                   \
593   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
594 #include "clang/AST/TypeLocNodes.def"
595 
596   template<typename Fn>
597   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
598                                       FunctionProtoTypeLoc TL,
599                                       CXXRecordDecl *ThisContext,
600                                       unsigned ThisTypeQuals,
601                                       Fn TransformExceptionSpec);
602 
603   bool TransformExceptionSpec(SourceLocation Loc,
604                               FunctionProtoType::ExceptionSpecInfo &ESI,
605                               SmallVectorImpl<QualType> &Exceptions,
606                               bool &Changed);
607 
608   StmtResult TransformSEHHandler(Stmt *Handler);
609 
610   QualType
611   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
612                                       TemplateSpecializationTypeLoc TL,
613                                       TemplateName Template);
614 
615   QualType
616   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
617                                       DependentTemplateSpecializationTypeLoc TL,
618                                                TemplateName Template,
619                                                CXXScopeSpec &SS);
620 
621   QualType TransformDependentTemplateSpecializationType(
622       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
623       NestedNameSpecifierLoc QualifierLoc);
624 
625   /// \brief Transforms the parameters of a function type into the
626   /// given vectors.
627   ///
628   /// The result vectors should be kept in sync; null entries in the
629   /// variables vector are acceptable.
630   ///
631   /// Return true on error.
632   bool TransformFunctionTypeParams(
633       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
634       const QualType *ParamTypes,
635       const FunctionProtoType::ExtParameterInfo *ParamInfos,
636       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
637       Sema::ExtParameterInfoBuilder &PInfos);
638 
639   /// \brief Transforms a single function-type parameter.  Return null
640   /// on error.
641   ///
642   /// \param indexAdjustment - A number to add to the parameter's
643   ///   scope index;  can be negative
644   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
645                                           int indexAdjustment,
646                                           Optional<unsigned> NumExpansions,
647                                           bool ExpectParameterPack);
648 
649   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
650 
651   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
652   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
653 
654   TemplateParameterList *TransformTemplateParameterList(
655         TemplateParameterList *TPL) {
656     return TPL;
657   }
658 
659   ExprResult TransformAddressOfOperand(Expr *E);
660 
661   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
662                                                 bool IsAddressOfOperand,
663                                                 TypeSourceInfo **RecoveryTSI);
664 
665   ExprResult TransformParenDependentScopeDeclRefExpr(
666       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
667       TypeSourceInfo **RecoveryTSI);
668 
669   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
670 
671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
672 // amount of stack usage with clang.
673 #define STMT(Node, Parent)                        \
674   LLVM_ATTRIBUTE_NOINLINE \
675   StmtResult Transform##Node(Node *S);
676 #define EXPR(Node, Parent)                        \
677   LLVM_ATTRIBUTE_NOINLINE \
678   ExprResult Transform##Node(Node *E);
679 #define ABSTRACT_STMT(Stmt)
680 #include "clang/AST/StmtNodes.inc"
681 
682 #define OPENMP_CLAUSE(Name, Class)                        \
683   LLVM_ATTRIBUTE_NOINLINE \
684   OMPClause *Transform ## Class(Class *S);
685 #include "clang/Basic/OpenMPKinds.def"
686 
687   /// \brief Build a new qualified type given its unqualified type and type
688   /// qualifiers.
689   ///
690   /// By default, this routine adds type qualifiers only to types that can
691   /// have qualifiers, and silently suppresses those qualifiers that are not
692   /// permitted. Subclasses may override this routine to provide different
693   /// behavior.
694   QualType RebuildQualifiedType(QualType T, SourceLocation Loc,
695                                 Qualifiers Quals);
696 
697   /// \brief Build a new pointer type given its pointee type.
698   ///
699   /// By default, performs semantic analysis when building the pointer type.
700   /// Subclasses may override this routine to provide different behavior.
701   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
702 
703   /// \brief Build a new block pointer type given its pointee type.
704   ///
705   /// By default, performs semantic analysis when building the block pointer
706   /// type. Subclasses may override this routine to provide different behavior.
707   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
708 
709   /// \brief Build a new reference type given the type it references.
710   ///
711   /// By default, performs semantic analysis when building the
712   /// reference type. Subclasses may override this routine to provide
713   /// different behavior.
714   ///
715   /// \param LValue whether the type was written with an lvalue sigil
716   /// or an rvalue sigil.
717   QualType RebuildReferenceType(QualType ReferentType,
718                                 bool LValue,
719                                 SourceLocation Sigil);
720 
721   /// \brief Build a new member pointer type given the pointee type and the
722   /// class type it refers into.
723   ///
724   /// By default, performs semantic analysis when building the member pointer
725   /// type. Subclasses may override this routine to provide different behavior.
726   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
727                                     SourceLocation Sigil);
728 
729   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
730                                     SourceLocation ProtocolLAngleLoc,
731                                     ArrayRef<ObjCProtocolDecl *> Protocols,
732                                     ArrayRef<SourceLocation> ProtocolLocs,
733                                     SourceLocation ProtocolRAngleLoc);
734 
735   /// \brief Build an Objective-C object type.
736   ///
737   /// By default, performs semantic analysis when building the object type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildObjCObjectType(QualType BaseType,
740                                  SourceLocation Loc,
741                                  SourceLocation TypeArgsLAngleLoc,
742                                  ArrayRef<TypeSourceInfo *> TypeArgs,
743                                  SourceLocation TypeArgsRAngleLoc,
744                                  SourceLocation ProtocolLAngleLoc,
745                                  ArrayRef<ObjCProtocolDecl *> Protocols,
746                                  ArrayRef<SourceLocation> ProtocolLocs,
747                                  SourceLocation ProtocolRAngleLoc);
748 
749   /// \brief Build a new Objective-C object pointer type given the pointee type.
750   ///
751   /// By default, directly builds the pointer type, with no additional semantic
752   /// analysis.
753   QualType RebuildObjCObjectPointerType(QualType PointeeType,
754                                         SourceLocation Star);
755 
756   /// \brief Build a new array type given the element type, size
757   /// modifier, size of the array (if known), size expression, and index type
758   /// qualifiers.
759   ///
760   /// By default, performs semantic analysis when building the array type.
761   /// Subclasses may override this routine to provide different behavior.
762   /// Also by default, all of the other Rebuild*Array
763   QualType RebuildArrayType(QualType ElementType,
764                             ArrayType::ArraySizeModifier SizeMod,
765                             const llvm::APInt *Size,
766                             Expr *SizeExpr,
767                             unsigned IndexTypeQuals,
768                             SourceRange BracketsRange);
769 
770   /// \brief Build a new constant array type given the element type, size
771   /// modifier, (known) size of the array, and index type qualifiers.
772   ///
773   /// By default, performs semantic analysis when building the array type.
774   /// Subclasses may override this routine to provide different behavior.
775   QualType RebuildConstantArrayType(QualType ElementType,
776                                     ArrayType::ArraySizeModifier SizeMod,
777                                     const llvm::APInt &Size,
778                                     unsigned IndexTypeQuals,
779                                     SourceRange BracketsRange);
780 
781   /// \brief Build a new incomplete array type given the element type, size
782   /// modifier, and index type qualifiers.
783   ///
784   /// By default, performs semantic analysis when building the array type.
785   /// Subclasses may override this routine to provide different behavior.
786   QualType RebuildIncompleteArrayType(QualType ElementType,
787                                       ArrayType::ArraySizeModifier SizeMod,
788                                       unsigned IndexTypeQuals,
789                                       SourceRange BracketsRange);
790 
791   /// \brief Build a new variable-length array type given the element type,
792   /// size modifier, size expression, and index type qualifiers.
793   ///
794   /// By default, performs semantic analysis when building the array type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildVariableArrayType(QualType ElementType,
797                                     ArrayType::ArraySizeModifier SizeMod,
798                                     Expr *SizeExpr,
799                                     unsigned IndexTypeQuals,
800                                     SourceRange BracketsRange);
801 
802   /// \brief Build a new dependent-sized array type given the element type,
803   /// size modifier, size expression, and index type qualifiers.
804   ///
805   /// By default, performs semantic analysis when building the array type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedArrayType(QualType ElementType,
808                                           ArrayType::ArraySizeModifier SizeMod,
809                                           Expr *SizeExpr,
810                                           unsigned IndexTypeQuals,
811                                           SourceRange BracketsRange);
812 
813   /// \brief Build a new vector type given the element type and
814   /// number of elements.
815   ///
816   /// By default, performs semantic analysis when building the vector type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
819                              VectorType::VectorKind VecKind);
820 
821   /// \brief Build a new extended vector type given the element type and
822   /// number of elements.
823   ///
824   /// By default, performs semantic analysis when building the vector type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
827                                 SourceLocation AttributeLoc);
828 
829   /// \brief Build a new potentially dependently-sized extended vector type
830   /// given the element type and number of elements.
831   ///
832   /// By default, performs semantic analysis when building the vector type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
835                                               Expr *SizeExpr,
836                                               SourceLocation AttributeLoc);
837 
838   /// \brief Build a new DependentAddressSpaceType or return the pointee
839   /// type variable with the correct address space (retrieved from
840   /// AddrSpaceExpr) applied to it. The former will be returned in cases
841   /// where the address space remains dependent.
842   ///
843   /// By default, performs semantic analysis when building the type with address
844   /// space applied. Subclasses may override this routine to provide different
845   /// behavior.
846   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
847                                             Expr *AddrSpaceExpr,
848                                             SourceLocation AttributeLoc);
849 
850   /// \brief Build a new function type.
851   ///
852   /// By default, performs semantic analysis when building the function type.
853   /// Subclasses may override this routine to provide different behavior.
854   QualType RebuildFunctionProtoType(QualType T,
855                                     MutableArrayRef<QualType> ParamTypes,
856                                     const FunctionProtoType::ExtProtoInfo &EPI);
857 
858   /// \brief Build a new unprototyped function type.
859   QualType RebuildFunctionNoProtoType(QualType ResultType);
860 
861   /// \brief Rebuild an unresolved typename type, given the decl that
862   /// the UnresolvedUsingTypenameDecl was transformed to.
863   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
864 
865   /// \brief Build a new typedef type.
866   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
867     return SemaRef.Context.getTypeDeclType(Typedef);
868   }
869 
870   /// \brief Build a new class/struct/union type.
871   QualType RebuildRecordType(RecordDecl *Record) {
872     return SemaRef.Context.getTypeDeclType(Record);
873   }
874 
875   /// \brief Build a new Enum type.
876   QualType RebuildEnumType(EnumDecl *Enum) {
877     return SemaRef.Context.getTypeDeclType(Enum);
878   }
879 
880   /// \brief Build a new typeof(expr) type.
881   ///
882   /// By default, performs semantic analysis when building the typeof type.
883   /// Subclasses may override this routine to provide different behavior.
884   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
885 
886   /// \brief Build a new typeof(type) type.
887   ///
888   /// By default, builds a new TypeOfType with the given underlying type.
889   QualType RebuildTypeOfType(QualType Underlying);
890 
891   /// \brief Build a new unary transform type.
892   QualType RebuildUnaryTransformType(QualType BaseType,
893                                      UnaryTransformType::UTTKind UKind,
894                                      SourceLocation Loc);
895 
896   /// \brief Build a new C++11 decltype type.
897   ///
898   /// By default, performs semantic analysis when building the decltype type.
899   /// Subclasses may override this routine to provide different behavior.
900   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
901 
902   /// \brief Build a new C++11 auto type.
903   ///
904   /// By default, builds a new AutoType with the given deduced type.
905   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
906     // Note, IsDependent is always false here: we implicitly convert an 'auto'
907     // which has been deduced to a dependent type into an undeduced 'auto', so
908     // that we'll retry deduction after the transformation.
909     return SemaRef.Context.getAutoType(Deduced, Keyword,
910                                        /*IsDependent*/ false);
911   }
912 
913   /// By default, builds a new DeducedTemplateSpecializationType with the given
914   /// deduced type.
915   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
916       QualType Deduced) {
917     return SemaRef.Context.getDeducedTemplateSpecializationType(
918         Template, Deduced, /*IsDependent*/ false);
919   }
920 
921   /// \brief Build a new template specialization type.
922   ///
923   /// By default, performs semantic analysis when building the template
924   /// specialization type. Subclasses may override this routine to provide
925   /// different behavior.
926   QualType RebuildTemplateSpecializationType(TemplateName Template,
927                                              SourceLocation TemplateLoc,
928                                              TemplateArgumentListInfo &Args);
929 
930   /// \brief Build a new parenthesized type.
931   ///
932   /// By default, builds a new ParenType type from the inner type.
933   /// Subclasses may override this routine to provide different behavior.
934   QualType RebuildParenType(QualType InnerType) {
935     return SemaRef.BuildParenType(InnerType);
936   }
937 
938   /// \brief Build a new qualified name type.
939   ///
940   /// By default, builds a new ElaboratedType type from the keyword,
941   /// the nested-name-specifier and the named type.
942   /// Subclasses may override this routine to provide different behavior.
943   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
944                                  ElaboratedTypeKeyword Keyword,
945                                  NestedNameSpecifierLoc QualifierLoc,
946                                  QualType Named) {
947     return SemaRef.Context.getElaboratedType(Keyword,
948                                          QualifierLoc.getNestedNameSpecifier(),
949                                              Named);
950   }
951 
952   /// \brief Build a new typename type that refers to a template-id.
953   ///
954   /// By default, builds a new DependentNameType type from the
955   /// nested-name-specifier and the given type. Subclasses may override
956   /// this routine to provide different behavior.
957   QualType RebuildDependentTemplateSpecializationType(
958                                           ElaboratedTypeKeyword Keyword,
959                                           NestedNameSpecifierLoc QualifierLoc,
960                                           const IdentifierInfo *Name,
961                                           SourceLocation NameLoc,
962                                           TemplateArgumentListInfo &Args,
963                                           bool AllowInjectedClassName) {
964     // Rebuild the template name.
965     // TODO: avoid TemplateName abstraction
966     CXXScopeSpec SS;
967     SS.Adopt(QualifierLoc);
968     TemplateName InstName
969       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
970                                          nullptr, AllowInjectedClassName);
971 
972     if (InstName.isNull())
973       return QualType();
974 
975     // If it's still dependent, make a dependent specialization.
976     if (InstName.getAsDependentTemplateName())
977       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
978                                           QualifierLoc.getNestedNameSpecifier(),
979                                                                     Name,
980                                                                     Args);
981 
982     // Otherwise, make an elaborated type wrapping a non-dependent
983     // specialization.
984     QualType T =
985     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
986     if (T.isNull()) return QualType();
987 
988     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
989       return T;
990 
991     return SemaRef.Context.getElaboratedType(Keyword,
992                                        QualifierLoc.getNestedNameSpecifier(),
993                                              T);
994   }
995 
996   /// \brief Build a new typename type that refers to an identifier.
997   ///
998   /// By default, performs semantic analysis when building the typename type
999   /// (or elaborated type). Subclasses may override this routine to provide
1000   /// different behavior.
1001   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1002                                     SourceLocation KeywordLoc,
1003                                     NestedNameSpecifierLoc QualifierLoc,
1004                                     const IdentifierInfo *Id,
1005                                     SourceLocation IdLoc,
1006                                     bool DeducedTSTContext) {
1007     CXXScopeSpec SS;
1008     SS.Adopt(QualifierLoc);
1009 
1010     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1011       // If the name is still dependent, just build a new dependent name type.
1012       if (!SemaRef.computeDeclContext(SS))
1013         return SemaRef.Context.getDependentNameType(Keyword,
1014                                           QualifierLoc.getNestedNameSpecifier(),
1015                                                     Id);
1016     }
1017 
1018     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1019       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1020                                              *Id, IdLoc);
1021       // If a dependent name resolves to a deduced template specialization type,
1022       // check that we're in one of the syntactic contexts permitting it.
1023       if (!DeducedTSTContext) {
1024         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1025                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1026           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1027             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1028                    Deduced->getTemplateName())
1029             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1030           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1031             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1032           return QualType();
1033         }
1034       }
1035       return T;
1036     }
1037 
1038     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1039 
1040     // We had a dependent elaborated-type-specifier that has been transformed
1041     // into a non-dependent elaborated-type-specifier. Find the tag we're
1042     // referring to.
1043     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1044     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1045     if (!DC)
1046       return QualType();
1047 
1048     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1049       return QualType();
1050 
1051     TagDecl *Tag = nullptr;
1052     SemaRef.LookupQualifiedName(Result, DC);
1053     switch (Result.getResultKind()) {
1054       case LookupResult::NotFound:
1055       case LookupResult::NotFoundInCurrentInstantiation:
1056         break;
1057 
1058       case LookupResult::Found:
1059         Tag = Result.getAsSingle<TagDecl>();
1060         break;
1061 
1062       case LookupResult::FoundOverloaded:
1063       case LookupResult::FoundUnresolvedValue:
1064         llvm_unreachable("Tag lookup cannot find non-tags");
1065 
1066       case LookupResult::Ambiguous:
1067         // Let the LookupResult structure handle ambiguities.
1068         return QualType();
1069     }
1070 
1071     if (!Tag) {
1072       // Check where the name exists but isn't a tag type and use that to emit
1073       // better diagnostics.
1074       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1075       SemaRef.LookupQualifiedName(Result, DC);
1076       switch (Result.getResultKind()) {
1077         case LookupResult::Found:
1078         case LookupResult::FoundOverloaded:
1079         case LookupResult::FoundUnresolvedValue: {
1080           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1081           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1082           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1083                                                                << NTK << Kind;
1084           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1085           break;
1086         }
1087         default:
1088           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1089               << Kind << Id << DC << QualifierLoc.getSourceRange();
1090           break;
1091       }
1092       return QualType();
1093     }
1094 
1095     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1096                                               IdLoc, Id)) {
1097       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1098       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1099       return QualType();
1100     }
1101 
1102     // Build the elaborated-type-specifier type.
1103     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1104     return SemaRef.Context.getElaboratedType(Keyword,
1105                                          QualifierLoc.getNestedNameSpecifier(),
1106                                              T);
1107   }
1108 
1109   /// \brief Build a new pack expansion type.
1110   ///
1111   /// By default, builds a new PackExpansionType type from the given pattern.
1112   /// Subclasses may override this routine to provide different behavior.
1113   QualType RebuildPackExpansionType(QualType Pattern,
1114                                     SourceRange PatternRange,
1115                                     SourceLocation EllipsisLoc,
1116                                     Optional<unsigned> NumExpansions) {
1117     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1118                                         NumExpansions);
1119   }
1120 
1121   /// \brief Build a new atomic type given its value type.
1122   ///
1123   /// By default, performs semantic analysis when building the atomic type.
1124   /// Subclasses may override this routine to provide different behavior.
1125   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1126 
1127   /// \brief Build a new pipe type given its value type.
1128   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1129                            bool isReadPipe);
1130 
1131   /// \brief Build a new template name given a nested name specifier, a flag
1132   /// indicating whether the "template" keyword was provided, and the template
1133   /// that the template name refers to.
1134   ///
1135   /// By default, builds the new template name directly. Subclasses may override
1136   /// this routine to provide different behavior.
1137   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1138                                    bool TemplateKW,
1139                                    TemplateDecl *Template);
1140 
1141   /// \brief Build a new template name given a nested name specifier and the
1142   /// name that is referred to as a template.
1143   ///
1144   /// By default, performs semantic analysis to determine whether the name can
1145   /// be resolved to a specific template, then builds the appropriate kind of
1146   /// template name. Subclasses may override this routine to provide different
1147   /// behavior.
1148   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1149                                    const IdentifierInfo &Name,
1150                                    SourceLocation NameLoc,
1151                                    QualType ObjectType,
1152                                    NamedDecl *FirstQualifierInScope,
1153                                    bool AllowInjectedClassName);
1154 
1155   /// \brief Build a new template name given a nested name specifier and the
1156   /// overloaded operator name that is referred to as a template.
1157   ///
1158   /// By default, performs semantic analysis to determine whether the name can
1159   /// be resolved to a specific template, then builds the appropriate kind of
1160   /// template name. Subclasses may override this routine to provide different
1161   /// behavior.
1162   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1163                                    OverloadedOperatorKind Operator,
1164                                    SourceLocation NameLoc,
1165                                    QualType ObjectType,
1166                                    bool AllowInjectedClassName);
1167 
1168   /// \brief Build a new template name given a template template parameter pack
1169   /// and the
1170   ///
1171   /// By default, performs semantic analysis to determine whether the name can
1172   /// be resolved to a specific template, then builds the appropriate kind of
1173   /// template name. Subclasses may override this routine to provide different
1174   /// behavior.
1175   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1176                                    const TemplateArgument &ArgPack) {
1177     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1178   }
1179 
1180   /// \brief Build a new compound statement.
1181   ///
1182   /// By default, performs semantic analysis to build the new statement.
1183   /// Subclasses may override this routine to provide different behavior.
1184   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1185                                        MultiStmtArg Statements,
1186                                        SourceLocation RBraceLoc,
1187                                        bool IsStmtExpr) {
1188     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1189                                        IsStmtExpr);
1190   }
1191 
1192   /// \brief Build a new case statement.
1193   ///
1194   /// By default, performs semantic analysis to build the new statement.
1195   /// Subclasses may override this routine to provide different behavior.
1196   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1197                                    Expr *LHS,
1198                                    SourceLocation EllipsisLoc,
1199                                    Expr *RHS,
1200                                    SourceLocation ColonLoc) {
1201     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1202                                    ColonLoc);
1203   }
1204 
1205   /// \brief Attach the body to a new case statement.
1206   ///
1207   /// By default, performs semantic analysis to build the new statement.
1208   /// Subclasses may override this routine to provide different behavior.
1209   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1210     getSema().ActOnCaseStmtBody(S, Body);
1211     return S;
1212   }
1213 
1214   /// \brief Build a new default statement.
1215   ///
1216   /// By default, performs semantic analysis to build the new statement.
1217   /// Subclasses may override this routine to provide different behavior.
1218   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1219                                       SourceLocation ColonLoc,
1220                                       Stmt *SubStmt) {
1221     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1222                                       /*CurScope=*/nullptr);
1223   }
1224 
1225   /// \brief Build a new label statement.
1226   ///
1227   /// By default, performs semantic analysis to build the new statement.
1228   /// Subclasses may override this routine to provide different behavior.
1229   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1230                               SourceLocation ColonLoc, Stmt *SubStmt) {
1231     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1232   }
1233 
1234   /// \brief Build a new label statement.
1235   ///
1236   /// By default, performs semantic analysis to build the new statement.
1237   /// Subclasses may override this routine to provide different behavior.
1238   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1239                                    ArrayRef<const Attr*> Attrs,
1240                                    Stmt *SubStmt) {
1241     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1242   }
1243 
1244   /// \brief Build a new "if" statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1249                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1250                            SourceLocation ElseLoc, Stmt *Else) {
1251     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1252                                  ElseLoc, Else);
1253   }
1254 
1255   /// \brief Start building a new switch statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1260                                     Sema::ConditionResult Cond) {
1261     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1262   }
1263 
1264   /// \brief Attach the body to the switch statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1269                                    Stmt *Switch, Stmt *Body) {
1270     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1271   }
1272 
1273   /// \brief Build a new while statement.
1274   ///
1275   /// By default, performs semantic analysis to build the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
1277   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1278                               Sema::ConditionResult Cond, Stmt *Body) {
1279     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1280   }
1281 
1282   /// \brief Build a new do-while statement.
1283   ///
1284   /// By default, performs semantic analysis to build the new statement.
1285   /// Subclasses may override this routine to provide different behavior.
1286   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1287                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1288                            Expr *Cond, SourceLocation RParenLoc) {
1289     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1290                                  Cond, RParenLoc);
1291   }
1292 
1293   /// \brief Build a new for statement.
1294   ///
1295   /// By default, performs semantic analysis to build the new statement.
1296   /// Subclasses may override this routine to provide different behavior.
1297   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1298                             Stmt *Init, Sema::ConditionResult Cond,
1299                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1300                             Stmt *Body) {
1301     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1302                                   Inc, RParenLoc, Body);
1303   }
1304 
1305   /// \brief Build a new goto statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
1309   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1310                              LabelDecl *Label) {
1311     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1312   }
1313 
1314   /// \brief Build a new indirect goto statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
1318   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1319                                      SourceLocation StarLoc,
1320                                      Expr *Target) {
1321     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1322   }
1323 
1324   /// \brief Build a new return statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1329     return getSema().BuildReturnStmt(ReturnLoc, Result);
1330   }
1331 
1332   /// \brief Build a new declaration statement.
1333   ///
1334   /// By default, performs semantic analysis to build the new statement.
1335   /// Subclasses may override this routine to provide different behavior.
1336   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1337                              SourceLocation StartLoc, SourceLocation EndLoc) {
1338     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1339     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1340   }
1341 
1342   /// \brief Build a new inline asm statement.
1343   ///
1344   /// By default, performs semantic analysis to build the new statement.
1345   /// Subclasses may override this routine to provide different behavior.
1346   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1347                                bool IsVolatile, unsigned NumOutputs,
1348                                unsigned NumInputs, IdentifierInfo **Names,
1349                                MultiExprArg Constraints, MultiExprArg Exprs,
1350                                Expr *AsmString, MultiExprArg Clobbers,
1351                                SourceLocation RParenLoc) {
1352     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1353                                      NumInputs, Names, Constraints, Exprs,
1354                                      AsmString, Clobbers, RParenLoc);
1355   }
1356 
1357   /// \brief Build a new MS style inline asm statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1362                               ArrayRef<Token> AsmToks,
1363                               StringRef AsmString,
1364                               unsigned NumOutputs, unsigned NumInputs,
1365                               ArrayRef<StringRef> Constraints,
1366                               ArrayRef<StringRef> Clobbers,
1367                               ArrayRef<Expr*> Exprs,
1368                               SourceLocation EndLoc) {
1369     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1370                                     NumOutputs, NumInputs,
1371                                     Constraints, Clobbers, Exprs, EndLoc);
1372   }
1373 
1374   /// \brief Build a new co_return statement.
1375   ///
1376   /// By default, performs semantic analysis to build the new statement.
1377   /// Subclasses may override this routine to provide different behavior.
1378   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1379                                  bool IsImplicit) {
1380     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1381   }
1382 
1383   /// \brief Build a new co_await expression.
1384   ///
1385   /// By default, performs semantic analysis to build the new expression.
1386   /// Subclasses may override this routine to provide different behavior.
1387   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1388                                 bool IsImplicit) {
1389     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1390   }
1391 
1392   /// \brief Build a new co_await expression.
1393   ///
1394   /// By default, performs semantic analysis to build the new expression.
1395   /// Subclasses may override this routine to provide different behavior.
1396   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1397                                          Expr *Result,
1398                                          UnresolvedLookupExpr *Lookup) {
1399     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1400   }
1401 
1402   /// \brief Build a new co_yield expression.
1403   ///
1404   /// By default, performs semantic analysis to build the new expression.
1405   /// Subclasses may override this routine to provide different behavior.
1406   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1407     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1408   }
1409 
1410   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1411     return getSema().BuildCoroutineBodyStmt(Args);
1412   }
1413 
1414   /// \brief Build a new Objective-C \@try statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1419                                         Stmt *TryBody,
1420                                         MultiStmtArg CatchStmts,
1421                                         Stmt *Finally) {
1422     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1423                                         Finally);
1424   }
1425 
1426   /// \brief Rebuild an Objective-C exception declaration.
1427   ///
1428   /// By default, performs semantic analysis to build the new declaration.
1429   /// Subclasses may override this routine to provide different behavior.
1430   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1431                                     TypeSourceInfo *TInfo, QualType T) {
1432     return getSema().BuildObjCExceptionDecl(TInfo, T,
1433                                             ExceptionDecl->getInnerLocStart(),
1434                                             ExceptionDecl->getLocation(),
1435                                             ExceptionDecl->getIdentifier());
1436   }
1437 
1438   /// \brief Build a new Objective-C \@catch statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1443                                           SourceLocation RParenLoc,
1444                                           VarDecl *Var,
1445                                           Stmt *Body) {
1446     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1447                                           Var, Body);
1448   }
1449 
1450   /// \brief Build a new Objective-C \@finally 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 RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1455                                             Stmt *Body) {
1456     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1457   }
1458 
1459   /// \brief Build a new Objective-C \@throw statement.
1460   ///
1461   /// By default, performs semantic analysis to build the new statement.
1462   /// Subclasses may override this routine to provide different behavior.
1463   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1464                                           Expr *Operand) {
1465     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1466   }
1467 
1468   /// \brief Build a new OpenMP executable directive.
1469   ///
1470   /// By default, performs semantic analysis to build the new statement.
1471   /// Subclasses may override this routine to provide different behavior.
1472   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1473                                            DeclarationNameInfo DirName,
1474                                            OpenMPDirectiveKind CancelRegion,
1475                                            ArrayRef<OMPClause *> Clauses,
1476                                            Stmt *AStmt, SourceLocation StartLoc,
1477                                            SourceLocation EndLoc) {
1478     return getSema().ActOnOpenMPExecutableDirective(
1479         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1480   }
1481 
1482   /// \brief Build a new OpenMP 'if' clause.
1483   ///
1484   /// By default, performs semantic analysis to build the new OpenMP clause.
1485   /// Subclasses may override this routine to provide different behavior.
1486   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1487                                 Expr *Condition, SourceLocation StartLoc,
1488                                 SourceLocation LParenLoc,
1489                                 SourceLocation NameModifierLoc,
1490                                 SourceLocation ColonLoc,
1491                                 SourceLocation EndLoc) {
1492     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1493                                          LParenLoc, NameModifierLoc, ColonLoc,
1494                                          EndLoc);
1495   }
1496 
1497   /// \brief Build a new OpenMP 'final' clause.
1498   ///
1499   /// By default, performs semantic analysis to build the new OpenMP clause.
1500   /// Subclasses may override this routine to provide different behavior.
1501   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1502                                    SourceLocation LParenLoc,
1503                                    SourceLocation EndLoc) {
1504     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1505                                             EndLoc);
1506   }
1507 
1508   /// \brief Build a new OpenMP 'num_threads' clause.
1509   ///
1510   /// By default, performs semantic analysis to build the new OpenMP clause.
1511   /// Subclasses may override this routine to provide different behavior.
1512   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1513                                         SourceLocation StartLoc,
1514                                         SourceLocation LParenLoc,
1515                                         SourceLocation EndLoc) {
1516     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1517                                                  LParenLoc, EndLoc);
1518   }
1519 
1520   /// \brief Build a new OpenMP 'safelen' clause.
1521   ///
1522   /// By default, performs semantic analysis to build the new OpenMP clause.
1523   /// Subclasses may override this routine to provide different behavior.
1524   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1525                                      SourceLocation LParenLoc,
1526                                      SourceLocation EndLoc) {
1527     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1528   }
1529 
1530   /// \brief Build a new OpenMP 'simdlen' clause.
1531   ///
1532   /// By default, performs semantic analysis to build the new OpenMP clause.
1533   /// Subclasses may override this routine to provide different behavior.
1534   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1535                                      SourceLocation LParenLoc,
1536                                      SourceLocation EndLoc) {
1537     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1538   }
1539 
1540   /// \brief Build a new OpenMP 'collapse' clause.
1541   ///
1542   /// By default, performs semantic analysis to build the new OpenMP clause.
1543   /// Subclasses may override this routine to provide different behavior.
1544   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1545                                       SourceLocation LParenLoc,
1546                                       SourceLocation EndLoc) {
1547     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1548                                                EndLoc);
1549   }
1550 
1551   /// \brief Build a new OpenMP 'default' clause.
1552   ///
1553   /// By default, performs semantic analysis to build the new OpenMP clause.
1554   /// Subclasses may override this routine to provide different behavior.
1555   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1556                                      SourceLocation KindKwLoc,
1557                                      SourceLocation StartLoc,
1558                                      SourceLocation LParenLoc,
1559                                      SourceLocation EndLoc) {
1560     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1561                                               StartLoc, LParenLoc, EndLoc);
1562   }
1563 
1564   /// \brief Build a new OpenMP 'proc_bind' clause.
1565   ///
1566   /// By default, performs semantic analysis to build the new OpenMP clause.
1567   /// Subclasses may override this routine to provide different behavior.
1568   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1569                                       SourceLocation KindKwLoc,
1570                                       SourceLocation StartLoc,
1571                                       SourceLocation LParenLoc,
1572                                       SourceLocation EndLoc) {
1573     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1574                                                StartLoc, LParenLoc, EndLoc);
1575   }
1576 
1577   /// \brief Build a new OpenMP 'schedule' clause.
1578   ///
1579   /// By default, performs semantic analysis to build the new OpenMP clause.
1580   /// Subclasses may override this routine to provide different behavior.
1581   OMPClause *RebuildOMPScheduleClause(
1582       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1583       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1584       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1585       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1586     return getSema().ActOnOpenMPScheduleClause(
1587         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1588         CommaLoc, EndLoc);
1589   }
1590 
1591   /// \brief Build a new OpenMP 'ordered' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1596                                      SourceLocation EndLoc,
1597                                      SourceLocation LParenLoc, Expr *Num) {
1598     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1599   }
1600 
1601   /// \brief Build a new OpenMP 'private' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1606                                      SourceLocation StartLoc,
1607                                      SourceLocation LParenLoc,
1608                                      SourceLocation EndLoc) {
1609     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1610                                               EndLoc);
1611   }
1612 
1613   /// \brief Build a new OpenMP 'firstprivate' clause.
1614   ///
1615   /// By default, performs semantic analysis to build the new OpenMP clause.
1616   /// Subclasses may override this routine to provide different behavior.
1617   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1618                                           SourceLocation StartLoc,
1619                                           SourceLocation LParenLoc,
1620                                           SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1622                                                    EndLoc);
1623   }
1624 
1625   /// \brief Build a new OpenMP 'lastprivate' clause.
1626   ///
1627   /// By default, performs semantic analysis to build the new OpenMP clause.
1628   /// Subclasses may override this routine to provide different behavior.
1629   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1630                                          SourceLocation StartLoc,
1631                                          SourceLocation LParenLoc,
1632                                          SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1634                                                   EndLoc);
1635   }
1636 
1637   /// \brief Build a new OpenMP 'shared' clause.
1638   ///
1639   /// By default, performs semantic analysis to build the new OpenMP clause.
1640   /// Subclasses may override this routine to provide different behavior.
1641   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1642                                     SourceLocation StartLoc,
1643                                     SourceLocation LParenLoc,
1644                                     SourceLocation EndLoc) {
1645     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1646                                              EndLoc);
1647   }
1648 
1649   /// \brief Build a new OpenMP 'reduction' clause.
1650   ///
1651   /// By default, performs semantic analysis to build the new statement.
1652   /// Subclasses may override this routine to provide different behavior.
1653   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1654                                        SourceLocation StartLoc,
1655                                        SourceLocation LParenLoc,
1656                                        SourceLocation ColonLoc,
1657                                        SourceLocation EndLoc,
1658                                        CXXScopeSpec &ReductionIdScopeSpec,
1659                                        const DeclarationNameInfo &ReductionId,
1660                                        ArrayRef<Expr *> UnresolvedReductions) {
1661     return getSema().ActOnOpenMPReductionClause(
1662         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1663         ReductionId, UnresolvedReductions);
1664   }
1665 
1666   /// Build a new OpenMP 'task_reduction' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new statement.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPTaskReductionClause(
1671       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1672       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1673       CXXScopeSpec &ReductionIdScopeSpec,
1674       const DeclarationNameInfo &ReductionId,
1675       ArrayRef<Expr *> UnresolvedReductions) {
1676     return getSema().ActOnOpenMPTaskReductionClause(
1677         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1678         ReductionId, UnresolvedReductions);
1679   }
1680 
1681   /// Build a new OpenMP 'in_reduction' clause.
1682   ///
1683   /// By default, performs semantic analysis to build the new statement.
1684   /// Subclasses may override this routine to provide different behavior.
1685   OMPClause *
1686   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1687                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1688                               SourceLocation EndLoc,
1689                               CXXScopeSpec &ReductionIdScopeSpec,
1690                               const DeclarationNameInfo &ReductionId,
1691                               ArrayRef<Expr *> UnresolvedReductions) {
1692     return getSema().ActOnOpenMPInReductionClause(
1693         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1694         ReductionId, UnresolvedReductions);
1695   }
1696 
1697   /// \brief Build a new OpenMP 'linear' clause.
1698   ///
1699   /// By default, performs semantic analysis to build the new OpenMP clause.
1700   /// Subclasses may override this routine to provide different behavior.
1701   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1702                                     SourceLocation StartLoc,
1703                                     SourceLocation LParenLoc,
1704                                     OpenMPLinearClauseKind Modifier,
1705                                     SourceLocation ModifierLoc,
1706                                     SourceLocation ColonLoc,
1707                                     SourceLocation EndLoc) {
1708     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1709                                              Modifier, ModifierLoc, ColonLoc,
1710                                              EndLoc);
1711   }
1712 
1713   /// \brief Build a new OpenMP 'aligned' clause.
1714   ///
1715   /// By default, performs semantic analysis to build the new OpenMP clause.
1716   /// Subclasses may override this routine to provide different behavior.
1717   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1718                                      SourceLocation StartLoc,
1719                                      SourceLocation LParenLoc,
1720                                      SourceLocation ColonLoc,
1721                                      SourceLocation EndLoc) {
1722     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1723                                               LParenLoc, ColonLoc, EndLoc);
1724   }
1725 
1726   /// \brief Build a new OpenMP 'copyin' clause.
1727   ///
1728   /// By default, performs semantic analysis to build the new OpenMP clause.
1729   /// Subclasses may override this routine to provide different behavior.
1730   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1731                                     SourceLocation StartLoc,
1732                                     SourceLocation LParenLoc,
1733                                     SourceLocation EndLoc) {
1734     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1735                                              EndLoc);
1736   }
1737 
1738   /// \brief Build a new OpenMP 'copyprivate' clause.
1739   ///
1740   /// By default, performs semantic analysis to build the new OpenMP clause.
1741   /// Subclasses may override this routine to provide different behavior.
1742   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1743                                          SourceLocation StartLoc,
1744                                          SourceLocation LParenLoc,
1745                                          SourceLocation EndLoc) {
1746     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1747                                                   EndLoc);
1748   }
1749 
1750   /// \brief Build a new OpenMP 'flush' pseudo clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1755                                    SourceLocation StartLoc,
1756                                    SourceLocation LParenLoc,
1757                                    SourceLocation EndLoc) {
1758     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1759                                             EndLoc);
1760   }
1761 
1762   /// \brief Build a new OpenMP 'depend' pseudo clause.
1763   ///
1764   /// By default, performs semantic analysis to build the new OpenMP clause.
1765   /// Subclasses may override this routine to provide different behavior.
1766   OMPClause *
1767   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1768                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1769                          SourceLocation StartLoc, SourceLocation LParenLoc,
1770                          SourceLocation EndLoc) {
1771     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1772                                              StartLoc, LParenLoc, EndLoc);
1773   }
1774 
1775   /// \brief Build a new OpenMP 'device' clause.
1776   ///
1777   /// By default, performs semantic analysis to build the new statement.
1778   /// Subclasses may override this routine to provide different behavior.
1779   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1780                                     SourceLocation LParenLoc,
1781                                     SourceLocation EndLoc) {
1782     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1783                                              EndLoc);
1784   }
1785 
1786   /// \brief Build a new OpenMP 'map' clause.
1787   ///
1788   /// By default, performs semantic analysis to build the new OpenMP clause.
1789   /// Subclasses may override this routine to provide different behavior.
1790   OMPClause *
1791   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1792                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1793                       SourceLocation MapLoc, SourceLocation ColonLoc,
1794                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1795                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1796     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1797                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1798                                           VarList, StartLoc, LParenLoc, EndLoc);
1799   }
1800 
1801   /// \brief Build a new OpenMP 'num_teams' clause.
1802   ///
1803   /// By default, performs semantic analysis to build the new statement.
1804   /// Subclasses may override this routine to provide different behavior.
1805   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1806                                       SourceLocation LParenLoc,
1807                                       SourceLocation EndLoc) {
1808     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1809                                                EndLoc);
1810   }
1811 
1812   /// \brief Build a new OpenMP 'thread_limit' clause.
1813   ///
1814   /// By default, performs semantic analysis to build the new statement.
1815   /// Subclasses may override this routine to provide different behavior.
1816   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1817                                          SourceLocation StartLoc,
1818                                          SourceLocation LParenLoc,
1819                                          SourceLocation EndLoc) {
1820     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1821                                                   LParenLoc, EndLoc);
1822   }
1823 
1824   /// \brief Build a new OpenMP 'priority' clause.
1825   ///
1826   /// By default, performs semantic analysis to build the new statement.
1827   /// Subclasses may override this routine to provide different behavior.
1828   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1829                                       SourceLocation LParenLoc,
1830                                       SourceLocation EndLoc) {
1831     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1832                                                EndLoc);
1833   }
1834 
1835   /// \brief Build a new OpenMP 'grainsize' clause.
1836   ///
1837   /// By default, performs semantic analysis to build the new statement.
1838   /// Subclasses may override this routine to provide different behavior.
1839   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1840                                        SourceLocation LParenLoc,
1841                                        SourceLocation EndLoc) {
1842     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1843                                                 EndLoc);
1844   }
1845 
1846   /// \brief Build a new OpenMP 'num_tasks' clause.
1847   ///
1848   /// By default, performs semantic analysis to build the new statement.
1849   /// Subclasses may override this routine to provide different behavior.
1850   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1851                                       SourceLocation LParenLoc,
1852                                       SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1854                                                EndLoc);
1855   }
1856 
1857   /// \brief Build a new OpenMP 'hint' clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new statement.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1862                                   SourceLocation LParenLoc,
1863                                   SourceLocation EndLoc) {
1864     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1865   }
1866 
1867   /// \brief Build a new OpenMP 'dist_schedule' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new OpenMP clause.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *
1872   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1873                                Expr *ChunkSize, SourceLocation StartLoc,
1874                                SourceLocation LParenLoc, SourceLocation KindLoc,
1875                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDistScheduleClause(
1877         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1878   }
1879 
1880   /// \brief Build a new OpenMP 'to' clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new statement.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1885                                 SourceLocation StartLoc,
1886                                 SourceLocation LParenLoc,
1887                                 SourceLocation EndLoc) {
1888     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1889   }
1890 
1891   /// \brief Build a new OpenMP 'from' clause.
1892   ///
1893   /// By default, performs semantic analysis to build the new statement.
1894   /// Subclasses may override this routine to provide different behavior.
1895   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1896                                   SourceLocation StartLoc,
1897                                   SourceLocation LParenLoc,
1898                                   SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1900                                            EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'use_device_ptr' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new OpenMP clause.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1908                                           SourceLocation StartLoc,
1909                                           SourceLocation LParenLoc,
1910                                           SourceLocation EndLoc) {
1911     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1912                                                    EndLoc);
1913   }
1914 
1915   /// Build a new OpenMP 'is_device_ptr' clause.
1916   ///
1917   /// By default, performs semantic analysis to build the new OpenMP clause.
1918   /// Subclasses may override this routine to provide different behavior.
1919   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1920                                          SourceLocation StartLoc,
1921                                          SourceLocation LParenLoc,
1922                                          SourceLocation EndLoc) {
1923     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1924                                                   EndLoc);
1925   }
1926 
1927   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1928   ///
1929   /// By default, performs semantic analysis to build the new statement.
1930   /// Subclasses may override this routine to provide different behavior.
1931   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1932                                               Expr *object) {
1933     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1934   }
1935 
1936   /// \brief Build a new Objective-C \@synchronized statement.
1937   ///
1938   /// By default, performs semantic analysis to build the new statement.
1939   /// Subclasses may override this routine to provide different behavior.
1940   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1941                                            Expr *Object, Stmt *Body) {
1942     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1943   }
1944 
1945   /// \brief Build a new Objective-C \@autoreleasepool statement.
1946   ///
1947   /// By default, performs semantic analysis to build the new statement.
1948   /// Subclasses may override this routine to provide different behavior.
1949   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1950                                             Stmt *Body) {
1951     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1952   }
1953 
1954   /// \brief Build a new Objective-C fast enumeration statement.
1955   ///
1956   /// By default, performs semantic analysis to build the new statement.
1957   /// Subclasses may override this routine to provide different behavior.
1958   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1959                                           Stmt *Element,
1960                                           Expr *Collection,
1961                                           SourceLocation RParenLoc,
1962                                           Stmt *Body) {
1963     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1964                                                 Element,
1965                                                 Collection,
1966                                                 RParenLoc);
1967     if (ForEachStmt.isInvalid())
1968       return StmtError();
1969 
1970     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1971   }
1972 
1973   /// \brief Build a new C++ exception declaration.
1974   ///
1975   /// By default, performs semantic analysis to build the new decaration.
1976   /// Subclasses may override this routine to provide different behavior.
1977   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1978                                 TypeSourceInfo *Declarator,
1979                                 SourceLocation StartLoc,
1980                                 SourceLocation IdLoc,
1981                                 IdentifierInfo *Id) {
1982     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1983                                                        StartLoc, IdLoc, Id);
1984     if (Var)
1985       getSema().CurContext->addDecl(Var);
1986     return Var;
1987   }
1988 
1989   /// \brief Build a new C++ catch statement.
1990   ///
1991   /// By default, performs semantic analysis to build the new statement.
1992   /// Subclasses may override this routine to provide different behavior.
1993   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1994                                  VarDecl *ExceptionDecl,
1995                                  Stmt *Handler) {
1996     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1997                                                       Handler));
1998   }
1999 
2000   /// \brief Build a new C++ try statement.
2001   ///
2002   /// By default, performs semantic analysis to build the new statement.
2003   /// Subclasses may override this routine to provide different behavior.
2004   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2005                                ArrayRef<Stmt *> Handlers) {
2006     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2007   }
2008 
2009   /// \brief Build a new C++0x range-based for statement.
2010   ///
2011   /// By default, performs semantic analysis to build the new statement.
2012   /// Subclasses may override this routine to provide different behavior.
2013   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2014                                     SourceLocation CoawaitLoc,
2015                                     SourceLocation ColonLoc,
2016                                     Stmt *Range, Stmt *Begin, Stmt *End,
2017                                     Expr *Cond, Expr *Inc,
2018                                     Stmt *LoopVar,
2019                                     SourceLocation RParenLoc) {
2020     // If we've just learned that the range is actually an Objective-C
2021     // collection, treat this as an Objective-C fast enumeration loop.
2022     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2023       if (RangeStmt->isSingleDecl()) {
2024         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2025           if (RangeVar->isInvalidDecl())
2026             return StmtError();
2027 
2028           Expr *RangeExpr = RangeVar->getInit();
2029           if (!RangeExpr->isTypeDependent() &&
2030               RangeExpr->getType()->isObjCObjectPointerType())
2031             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
2032                                                         RParenLoc);
2033         }
2034       }
2035     }
2036 
2037     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
2038                                           Range, Begin, End,
2039                                           Cond, Inc, LoopVar, RParenLoc,
2040                                           Sema::BFRK_Rebuild);
2041   }
2042 
2043   /// \brief Build a new C++0x range-based for statement.
2044   ///
2045   /// By default, performs semantic analysis to build the new statement.
2046   /// Subclasses may override this routine to provide different behavior.
2047   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2048                                           bool IsIfExists,
2049                                           NestedNameSpecifierLoc QualifierLoc,
2050                                           DeclarationNameInfo NameInfo,
2051                                           Stmt *Nested) {
2052     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2053                                                 QualifierLoc, NameInfo, Nested);
2054   }
2055 
2056   /// \brief Attach body to a C++0x range-based for statement.
2057   ///
2058   /// By default, performs semantic analysis to finish the new statement.
2059   /// Subclasses may override this routine to provide different behavior.
2060   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2061     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2062   }
2063 
2064   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2065                                Stmt *TryBlock, Stmt *Handler) {
2066     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2067   }
2068 
2069   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2070                                   Stmt *Block) {
2071     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2072   }
2073 
2074   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2075     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2076   }
2077 
2078   /// \brief Build a new predefined expression.
2079   ///
2080   /// By default, performs semantic analysis to build the new expression.
2081   /// Subclasses may override this routine to provide different behavior.
2082   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2083                                    PredefinedExpr::IdentType IT) {
2084     return getSema().BuildPredefinedExpr(Loc, IT);
2085   }
2086 
2087   /// \brief Build a new expression that references a declaration.
2088   ///
2089   /// By default, performs semantic analysis to build the new expression.
2090   /// Subclasses may override this routine to provide different behavior.
2091   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2092                                         LookupResult &R,
2093                                         bool RequiresADL) {
2094     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2095   }
2096 
2097 
2098   /// \brief Build a new expression that references a declaration.
2099   ///
2100   /// By default, performs semantic analysis to build the new expression.
2101   /// Subclasses may override this routine to provide different behavior.
2102   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2103                                 ValueDecl *VD,
2104                                 const DeclarationNameInfo &NameInfo,
2105                                 TemplateArgumentListInfo *TemplateArgs) {
2106     CXXScopeSpec SS;
2107     SS.Adopt(QualifierLoc);
2108 
2109     // FIXME: loses template args.
2110 
2111     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2112   }
2113 
2114   /// \brief Build a new expression in parentheses.
2115   ///
2116   /// By default, performs semantic analysis to build the new expression.
2117   /// Subclasses may override this routine to provide different behavior.
2118   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2119                                     SourceLocation RParen) {
2120     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2121   }
2122 
2123   /// \brief Build a new pseudo-destructor expression.
2124   ///
2125   /// By default, performs semantic analysis to build the new expression.
2126   /// Subclasses may override this routine to provide different behavior.
2127   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2128                                             SourceLocation OperatorLoc,
2129                                             bool isArrow,
2130                                             CXXScopeSpec &SS,
2131                                             TypeSourceInfo *ScopeType,
2132                                             SourceLocation CCLoc,
2133                                             SourceLocation TildeLoc,
2134                                         PseudoDestructorTypeStorage Destroyed);
2135 
2136   /// \brief Build a new unary operator expression.
2137   ///
2138   /// By default, performs semantic analysis to build the new expression.
2139   /// Subclasses may override this routine to provide different behavior.
2140   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2141                                         UnaryOperatorKind Opc,
2142                                         Expr *SubExpr) {
2143     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2144   }
2145 
2146   /// \brief Build a new builtin offsetof expression.
2147   ///
2148   /// By default, performs semantic analysis to build the new expression.
2149   /// Subclasses may override this routine to provide different behavior.
2150   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2151                                  TypeSourceInfo *Type,
2152                                  ArrayRef<Sema::OffsetOfComponent> Components,
2153                                  SourceLocation RParenLoc) {
2154     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2155                                           RParenLoc);
2156   }
2157 
2158   /// \brief Build a new sizeof, alignof or vec_step expression with a
2159   /// type argument.
2160   ///
2161   /// By default, performs semantic analysis to build the new expression.
2162   /// Subclasses may override this routine to provide different behavior.
2163   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2164                                          SourceLocation OpLoc,
2165                                          UnaryExprOrTypeTrait ExprKind,
2166                                          SourceRange R) {
2167     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2168   }
2169 
2170   /// \brief Build a new sizeof, alignof or vec step expression with an
2171   /// expression argument.
2172   ///
2173   /// By default, performs semantic analysis to build the new expression.
2174   /// Subclasses may override this routine to provide different behavior.
2175   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2176                                          UnaryExprOrTypeTrait ExprKind,
2177                                          SourceRange R) {
2178     ExprResult Result
2179       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2180     if (Result.isInvalid())
2181       return ExprError();
2182 
2183     return Result;
2184   }
2185 
2186   /// \brief Build a new array subscript expression.
2187   ///
2188   /// By default, performs semantic analysis to build the new expression.
2189   /// Subclasses may override this routine to provide different behavior.
2190   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2191                                              SourceLocation LBracketLoc,
2192                                              Expr *RHS,
2193                                              SourceLocation RBracketLoc) {
2194     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2195                                              LBracketLoc, RHS,
2196                                              RBracketLoc);
2197   }
2198 
2199   /// \brief Build a new array section expression.
2200   ///
2201   /// By default, performs semantic analysis to build the new expression.
2202   /// Subclasses may override this routine to provide different behavior.
2203   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2204                                         Expr *LowerBound,
2205                                         SourceLocation ColonLoc, Expr *Length,
2206                                         SourceLocation RBracketLoc) {
2207     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2208                                               ColonLoc, Length, RBracketLoc);
2209   }
2210 
2211   /// \brief Build a new call expression.
2212   ///
2213   /// By default, performs semantic analysis to build the new expression.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2216                                    MultiExprArg Args,
2217                                    SourceLocation RParenLoc,
2218                                    Expr *ExecConfig = nullptr) {
2219     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2220                                    Args, RParenLoc, ExecConfig);
2221   }
2222 
2223   /// \brief Build a new member access expression.
2224   ///
2225   /// By default, performs semantic analysis to build the new expression.
2226   /// Subclasses may override this routine to provide different behavior.
2227   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2228                                bool isArrow,
2229                                NestedNameSpecifierLoc QualifierLoc,
2230                                SourceLocation TemplateKWLoc,
2231                                const DeclarationNameInfo &MemberNameInfo,
2232                                ValueDecl *Member,
2233                                NamedDecl *FoundDecl,
2234                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2235                                NamedDecl *FirstQualifierInScope) {
2236     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2237                                                                       isArrow);
2238     if (!Member->getDeclName()) {
2239       // We have a reference to an unnamed field.  This is always the
2240       // base of an anonymous struct/union member access, i.e. the
2241       // field is always of record type.
2242       assert(Member->getType()->isRecordType() &&
2243              "unnamed member not of record type?");
2244 
2245       BaseResult =
2246         getSema().PerformObjectMemberConversion(BaseResult.get(),
2247                                                 QualifierLoc.getNestedNameSpecifier(),
2248                                                 FoundDecl, Member);
2249       if (BaseResult.isInvalid())
2250         return ExprError();
2251       Base = BaseResult.get();
2252 
2253       CXXScopeSpec EmptySS;
2254       return getSema().BuildFieldReferenceExpr(
2255           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2256           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2257     }
2258 
2259     CXXScopeSpec SS;
2260     SS.Adopt(QualifierLoc);
2261 
2262     Base = BaseResult.get();
2263     QualType BaseType = Base->getType();
2264 
2265     if (isArrow && !BaseType->isPointerType())
2266       return ExprError();
2267 
2268     // FIXME: this involves duplicating earlier analysis in a lot of
2269     // cases; we should avoid this when possible.
2270     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2271     R.addDecl(FoundDecl);
2272     R.resolveKind();
2273 
2274     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2275                                               SS, TemplateKWLoc,
2276                                               FirstQualifierInScope,
2277                                               R, ExplicitTemplateArgs,
2278                                               /*S*/nullptr);
2279   }
2280 
2281   /// \brief Build a new binary operator expression.
2282   ///
2283   /// By default, performs semantic analysis to build the new expression.
2284   /// Subclasses may override this routine to provide different behavior.
2285   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2286                                          BinaryOperatorKind Opc,
2287                                          Expr *LHS, Expr *RHS) {
2288     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2289   }
2290 
2291   /// \brief Build a new conditional operator expression.
2292   ///
2293   /// By default, performs semantic analysis to build the new expression.
2294   /// Subclasses may override this routine to provide different behavior.
2295   ExprResult RebuildConditionalOperator(Expr *Cond,
2296                                         SourceLocation QuestionLoc,
2297                                         Expr *LHS,
2298                                         SourceLocation ColonLoc,
2299                                         Expr *RHS) {
2300     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2301                                         LHS, RHS);
2302   }
2303 
2304   /// \brief Build a new C-style cast expression.
2305   ///
2306   /// By default, performs semantic analysis to build the new expression.
2307   /// Subclasses may override this routine to provide different behavior.
2308   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2309                                          TypeSourceInfo *TInfo,
2310                                          SourceLocation RParenLoc,
2311                                          Expr *SubExpr) {
2312     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2313                                          SubExpr);
2314   }
2315 
2316   /// \brief Build a new compound literal expression.
2317   ///
2318   /// By default, performs semantic analysis to build the new expression.
2319   /// Subclasses may override this routine to provide different behavior.
2320   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2321                                               TypeSourceInfo *TInfo,
2322                                               SourceLocation RParenLoc,
2323                                               Expr *Init) {
2324     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2325                                               Init);
2326   }
2327 
2328   /// \brief Build a new extended vector element access expression.
2329   ///
2330   /// By default, performs semantic analysis to build the new expression.
2331   /// Subclasses may override this routine to provide different behavior.
2332   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2333                                                SourceLocation OpLoc,
2334                                                SourceLocation AccessorLoc,
2335                                                IdentifierInfo &Accessor) {
2336 
2337     CXXScopeSpec SS;
2338     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2339     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2340                                               OpLoc, /*IsArrow*/ false,
2341                                               SS, SourceLocation(),
2342                                               /*FirstQualifierInScope*/ nullptr,
2343                                               NameInfo,
2344                                               /* TemplateArgs */ nullptr,
2345                                               /*S*/ nullptr);
2346   }
2347 
2348   /// \brief Build a new initializer list expression.
2349   ///
2350   /// By default, performs semantic analysis to build the new expression.
2351   /// Subclasses may override this routine to provide different behavior.
2352   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2353                              MultiExprArg Inits,
2354                              SourceLocation RBraceLoc) {
2355     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2356   }
2357 
2358   /// \brief Build a new designated initializer expression.
2359   ///
2360   /// By default, performs semantic analysis to build the new expression.
2361   /// Subclasses may override this routine to provide different behavior.
2362   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2363                                              MultiExprArg ArrayExprs,
2364                                              SourceLocation EqualOrColonLoc,
2365                                              bool GNUSyntax,
2366                                              Expr *Init) {
2367     ExprResult Result
2368       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2369                                            Init);
2370     if (Result.isInvalid())
2371       return ExprError();
2372 
2373     return Result;
2374   }
2375 
2376   /// \brief Build a new value-initialized expression.
2377   ///
2378   /// By default, builds the implicit value initialization without performing
2379   /// any semantic analysis. Subclasses may override this routine to provide
2380   /// different behavior.
2381   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2382     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2383   }
2384 
2385   /// \brief Build a new \c va_arg expression.
2386   ///
2387   /// By default, performs semantic analysis to build the new expression.
2388   /// Subclasses may override this routine to provide different behavior.
2389   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2390                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2391                                     SourceLocation RParenLoc) {
2392     return getSema().BuildVAArgExpr(BuiltinLoc,
2393                                     SubExpr, TInfo,
2394                                     RParenLoc);
2395   }
2396 
2397   /// \brief Build a new expression list in parentheses.
2398   ///
2399   /// By default, performs semantic analysis to build the new expression.
2400   /// Subclasses may override this routine to provide different behavior.
2401   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2402                                   MultiExprArg SubExprs,
2403                                   SourceLocation RParenLoc) {
2404     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2405   }
2406 
2407   /// \brief Build a new address-of-label expression.
2408   ///
2409   /// By default, performs semantic analysis, using the name of the label
2410   /// rather than attempting to map the label statement itself.
2411   /// Subclasses may override this routine to provide different behavior.
2412   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2413                                   SourceLocation LabelLoc, LabelDecl *Label) {
2414     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2415   }
2416 
2417   /// \brief Build a new GNU statement expression.
2418   ///
2419   /// By default, performs semantic analysis to build the new expression.
2420   /// Subclasses may override this routine to provide different behavior.
2421   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2422                                    Stmt *SubStmt,
2423                                    SourceLocation RParenLoc) {
2424     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2425   }
2426 
2427   /// \brief Build a new __builtin_choose_expr expression.
2428   ///
2429   /// By default, performs semantic analysis to build the new expression.
2430   /// Subclasses may override this routine to provide different behavior.
2431   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2432                                      Expr *Cond, Expr *LHS, Expr *RHS,
2433                                      SourceLocation RParenLoc) {
2434     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2435                                    Cond, LHS, RHS,
2436                                    RParenLoc);
2437   }
2438 
2439   /// \brief Build a new generic selection expression.
2440   ///
2441   /// By default, performs semantic analysis to build the new expression.
2442   /// Subclasses may override this routine to provide different behavior.
2443   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2444                                          SourceLocation DefaultLoc,
2445                                          SourceLocation RParenLoc,
2446                                          Expr *ControllingExpr,
2447                                          ArrayRef<TypeSourceInfo *> Types,
2448                                          ArrayRef<Expr *> Exprs) {
2449     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2450                                                 ControllingExpr, Types, Exprs);
2451   }
2452 
2453   /// \brief Build a new overloaded operator call expression.
2454   ///
2455   /// By default, performs semantic analysis to build the new expression.
2456   /// The semantic analysis provides the behavior of template instantiation,
2457   /// copying with transformations that turn what looks like an overloaded
2458   /// operator call into a use of a builtin operator, performing
2459   /// argument-dependent lookup, etc. Subclasses may override this routine to
2460   /// provide different behavior.
2461   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2462                                               SourceLocation OpLoc,
2463                                               Expr *Callee,
2464                                               Expr *First,
2465                                               Expr *Second);
2466 
2467   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2468   /// reinterpret_cast.
2469   ///
2470   /// By default, this routine dispatches to one of the more-specific routines
2471   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2474                                            Stmt::StmtClass Class,
2475                                            SourceLocation LAngleLoc,
2476                                            TypeSourceInfo *TInfo,
2477                                            SourceLocation RAngleLoc,
2478                                            SourceLocation LParenLoc,
2479                                            Expr *SubExpr,
2480                                            SourceLocation RParenLoc) {
2481     switch (Class) {
2482     case Stmt::CXXStaticCastExprClass:
2483       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2484                                                    RAngleLoc, LParenLoc,
2485                                                    SubExpr, RParenLoc);
2486 
2487     case Stmt::CXXDynamicCastExprClass:
2488       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2489                                                     RAngleLoc, LParenLoc,
2490                                                     SubExpr, RParenLoc);
2491 
2492     case Stmt::CXXReinterpretCastExprClass:
2493       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2494                                                         RAngleLoc, LParenLoc,
2495                                                         SubExpr,
2496                                                         RParenLoc);
2497 
2498     case Stmt::CXXConstCastExprClass:
2499       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2500                                                    RAngleLoc, LParenLoc,
2501                                                    SubExpr, RParenLoc);
2502 
2503     default:
2504       llvm_unreachable("Invalid C++ named cast");
2505     }
2506   }
2507 
2508   /// \brief Build a new C++ static_cast expression.
2509   ///
2510   /// By default, performs semantic analysis to build the new expression.
2511   /// Subclasses may override this routine to provide different behavior.
2512   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2513                                             SourceLocation LAngleLoc,
2514                                             TypeSourceInfo *TInfo,
2515                                             SourceLocation RAngleLoc,
2516                                             SourceLocation LParenLoc,
2517                                             Expr *SubExpr,
2518                                             SourceLocation RParenLoc) {
2519     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2520                                        TInfo, SubExpr,
2521                                        SourceRange(LAngleLoc, RAngleLoc),
2522                                        SourceRange(LParenLoc, RParenLoc));
2523   }
2524 
2525   /// \brief Build a new C++ dynamic_cast expression.
2526   ///
2527   /// By default, performs semantic analysis to build the new expression.
2528   /// Subclasses may override this routine to provide different behavior.
2529   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2530                                              SourceLocation LAngleLoc,
2531                                              TypeSourceInfo *TInfo,
2532                                              SourceLocation RAngleLoc,
2533                                              SourceLocation LParenLoc,
2534                                              Expr *SubExpr,
2535                                              SourceLocation RParenLoc) {
2536     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2537                                        TInfo, SubExpr,
2538                                        SourceRange(LAngleLoc, RAngleLoc),
2539                                        SourceRange(LParenLoc, RParenLoc));
2540   }
2541 
2542   /// \brief Build a new C++ reinterpret_cast expression.
2543   ///
2544   /// By default, performs semantic analysis to build the new expression.
2545   /// Subclasses may override this routine to provide different behavior.
2546   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2547                                                  SourceLocation LAngleLoc,
2548                                                  TypeSourceInfo *TInfo,
2549                                                  SourceLocation RAngleLoc,
2550                                                  SourceLocation LParenLoc,
2551                                                  Expr *SubExpr,
2552                                                  SourceLocation RParenLoc) {
2553     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2554                                        TInfo, SubExpr,
2555                                        SourceRange(LAngleLoc, RAngleLoc),
2556                                        SourceRange(LParenLoc, RParenLoc));
2557   }
2558 
2559   /// \brief Build a new C++ const_cast expression.
2560   ///
2561   /// By default, performs semantic analysis to build the new expression.
2562   /// Subclasses may override this routine to provide different behavior.
2563   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2564                                            SourceLocation LAngleLoc,
2565                                            TypeSourceInfo *TInfo,
2566                                            SourceLocation RAngleLoc,
2567                                            SourceLocation LParenLoc,
2568                                            Expr *SubExpr,
2569                                            SourceLocation RParenLoc) {
2570     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2571                                        TInfo, SubExpr,
2572                                        SourceRange(LAngleLoc, RAngleLoc),
2573                                        SourceRange(LParenLoc, RParenLoc));
2574   }
2575 
2576   /// \brief Build a new C++ functional-style cast expression.
2577   ///
2578   /// By default, performs semantic analysis to build the new expression.
2579   /// Subclasses may override this routine to provide different behavior.
2580   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2581                                           SourceLocation LParenLoc,
2582                                           Expr *Sub,
2583                                           SourceLocation RParenLoc,
2584                                           bool ListInitialization) {
2585     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2586                                                MultiExprArg(&Sub, 1), RParenLoc,
2587                                                ListInitialization);
2588   }
2589 
2590   /// \brief Build a new C++ typeid(type) expression.
2591   ///
2592   /// By default, performs semantic analysis to build the new expression.
2593   /// Subclasses may override this routine to provide different behavior.
2594   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2595                                         SourceLocation TypeidLoc,
2596                                         TypeSourceInfo *Operand,
2597                                         SourceLocation RParenLoc) {
2598     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2599                                     RParenLoc);
2600   }
2601 
2602 
2603   /// \brief Build a new C++ typeid(expr) expression.
2604   ///
2605   /// By default, performs semantic analysis to build the new expression.
2606   /// Subclasses may override this routine to provide different behavior.
2607   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2608                                         SourceLocation TypeidLoc,
2609                                         Expr *Operand,
2610                                         SourceLocation RParenLoc) {
2611     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2612                                     RParenLoc);
2613   }
2614 
2615   /// \brief Build a new C++ __uuidof(type) expression.
2616   ///
2617   /// By default, performs semantic analysis to build the new expression.
2618   /// Subclasses may override this routine to provide different behavior.
2619   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2620                                         SourceLocation TypeidLoc,
2621                                         TypeSourceInfo *Operand,
2622                                         SourceLocation RParenLoc) {
2623     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2624                                     RParenLoc);
2625   }
2626 
2627   /// \brief Build a new C++ __uuidof(expr) expression.
2628   ///
2629   /// By default, performs semantic analysis to build the new expression.
2630   /// Subclasses may override this routine to provide different behavior.
2631   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2632                                         SourceLocation TypeidLoc,
2633                                         Expr *Operand,
2634                                         SourceLocation RParenLoc) {
2635     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2636                                     RParenLoc);
2637   }
2638 
2639   /// \brief Build a new C++ "this" expression.
2640   ///
2641   /// By default, builds a new "this" expression without performing any
2642   /// semantic analysis. Subclasses may override this routine to provide
2643   /// different behavior.
2644   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2645                                 QualType ThisType,
2646                                 bool isImplicit) {
2647     getSema().CheckCXXThisCapture(ThisLoc);
2648     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2649   }
2650 
2651   /// \brief Build a new C++ throw expression.
2652   ///
2653   /// By default, performs semantic analysis to build the new expression.
2654   /// Subclasses may override this routine to provide different behavior.
2655   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2656                                  bool IsThrownVariableInScope) {
2657     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2658   }
2659 
2660   /// \brief Build a new C++ default-argument expression.
2661   ///
2662   /// By default, builds a new default-argument expression, which does not
2663   /// require any semantic analysis. Subclasses may override this routine to
2664   /// provide different behavior.
2665   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2666                                             ParmVarDecl *Param) {
2667     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2668   }
2669 
2670   /// \brief Build a new C++11 default-initialization expression.
2671   ///
2672   /// By default, builds a new default field initialization expression, which
2673   /// does not require any semantic analysis. Subclasses may override this
2674   /// routine to provide different behavior.
2675   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2676                                        FieldDecl *Field) {
2677     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2678   }
2679 
2680   /// \brief Build a new C++ zero-initialization expression.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2685                                            SourceLocation LParenLoc,
2686                                            SourceLocation RParenLoc) {
2687     return getSema().BuildCXXTypeConstructExpr(
2688         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2689   }
2690 
2691   /// \brief Build a new C++ "new" expression.
2692   ///
2693   /// By default, performs semantic analysis to build the new expression.
2694   /// Subclasses may override this routine to provide different behavior.
2695   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2696                                bool UseGlobal,
2697                                SourceLocation PlacementLParen,
2698                                MultiExprArg PlacementArgs,
2699                                SourceLocation PlacementRParen,
2700                                SourceRange TypeIdParens,
2701                                QualType AllocatedType,
2702                                TypeSourceInfo *AllocatedTypeInfo,
2703                                Expr *ArraySize,
2704                                SourceRange DirectInitRange,
2705                                Expr *Initializer) {
2706     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2707                                  PlacementLParen,
2708                                  PlacementArgs,
2709                                  PlacementRParen,
2710                                  TypeIdParens,
2711                                  AllocatedType,
2712                                  AllocatedTypeInfo,
2713                                  ArraySize,
2714                                  DirectInitRange,
2715                                  Initializer);
2716   }
2717 
2718   /// \brief Build a new C++ "delete" expression.
2719   ///
2720   /// By default, performs semantic analysis to build the new expression.
2721   /// Subclasses may override this routine to provide different behavior.
2722   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2723                                         bool IsGlobalDelete,
2724                                         bool IsArrayForm,
2725                                         Expr *Operand) {
2726     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2727                                     Operand);
2728   }
2729 
2730   /// \brief Build a new type trait expression.
2731   ///
2732   /// By default, performs semantic analysis to build the new expression.
2733   /// Subclasses may override this routine to provide different behavior.
2734   ExprResult RebuildTypeTrait(TypeTrait Trait,
2735                               SourceLocation StartLoc,
2736                               ArrayRef<TypeSourceInfo *> Args,
2737                               SourceLocation RParenLoc) {
2738     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2739   }
2740 
2741   /// \brief Build a new array type trait expression.
2742   ///
2743   /// By default, performs semantic analysis to build the new expression.
2744   /// Subclasses may override this routine to provide different behavior.
2745   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2746                                    SourceLocation StartLoc,
2747                                    TypeSourceInfo *TSInfo,
2748                                    Expr *DimExpr,
2749                                    SourceLocation RParenLoc) {
2750     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2751   }
2752 
2753   /// \brief Build a new expression trait expression.
2754   ///
2755   /// By default, performs semantic analysis to build the new expression.
2756   /// Subclasses may override this routine to provide different behavior.
2757   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2758                                    SourceLocation StartLoc,
2759                                    Expr *Queried,
2760                                    SourceLocation RParenLoc) {
2761     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2762   }
2763 
2764   /// \brief Build a new (previously unresolved) declaration reference
2765   /// expression.
2766   ///
2767   /// By default, performs semantic analysis to build the new expression.
2768   /// Subclasses may override this routine to provide different behavior.
2769   ExprResult RebuildDependentScopeDeclRefExpr(
2770                                           NestedNameSpecifierLoc QualifierLoc,
2771                                           SourceLocation TemplateKWLoc,
2772                                        const DeclarationNameInfo &NameInfo,
2773                               const TemplateArgumentListInfo *TemplateArgs,
2774                                           bool IsAddressOfOperand,
2775                                           TypeSourceInfo **RecoveryTSI) {
2776     CXXScopeSpec SS;
2777     SS.Adopt(QualifierLoc);
2778 
2779     if (TemplateArgs || TemplateKWLoc.isValid())
2780       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2781                                                     TemplateArgs);
2782 
2783     return getSema().BuildQualifiedDeclarationNameExpr(
2784         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2785   }
2786 
2787   /// \brief Build a new template-id expression.
2788   ///
2789   /// By default, performs semantic analysis to build the new expression.
2790   /// Subclasses may override this routine to provide different behavior.
2791   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2792                                    SourceLocation TemplateKWLoc,
2793                                    LookupResult &R,
2794                                    bool RequiresADL,
2795                               const TemplateArgumentListInfo *TemplateArgs) {
2796     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2797                                          TemplateArgs);
2798   }
2799 
2800   /// \brief Build a new object-construction expression.
2801   ///
2802   /// By default, performs semantic analysis to build the new expression.
2803   /// Subclasses may override this routine to provide different behavior.
2804   ExprResult RebuildCXXConstructExpr(QualType T,
2805                                      SourceLocation Loc,
2806                                      CXXConstructorDecl *Constructor,
2807                                      bool IsElidable,
2808                                      MultiExprArg Args,
2809                                      bool HadMultipleCandidates,
2810                                      bool ListInitialization,
2811                                      bool StdInitListInitialization,
2812                                      bool RequiresZeroInit,
2813                              CXXConstructExpr::ConstructionKind ConstructKind,
2814                                      SourceRange ParenRange) {
2815     SmallVector<Expr*, 8> ConvertedArgs;
2816     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2817                                           ConvertedArgs))
2818       return ExprError();
2819 
2820     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2821                                            IsElidable,
2822                                            ConvertedArgs,
2823                                            HadMultipleCandidates,
2824                                            ListInitialization,
2825                                            StdInitListInitialization,
2826                                            RequiresZeroInit, ConstructKind,
2827                                            ParenRange);
2828   }
2829 
2830   /// \brief Build a new implicit construction via inherited constructor
2831   /// expression.
2832   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2833                                              CXXConstructorDecl *Constructor,
2834                                              bool ConstructsVBase,
2835                                              bool InheritedFromVBase) {
2836     return new (getSema().Context) CXXInheritedCtorInitExpr(
2837         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2838   }
2839 
2840   /// \brief Build a new object-construction expression.
2841   ///
2842   /// By default, performs semantic analysis to build the new expression.
2843   /// Subclasses may override this routine to provide different behavior.
2844   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2845                                            SourceLocation LParenOrBraceLoc,
2846                                            MultiExprArg Args,
2847                                            SourceLocation RParenOrBraceLoc,
2848                                            bool ListInitialization) {
2849     return getSema().BuildCXXTypeConstructExpr(
2850         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2851   }
2852 
2853   /// \brief Build a new object-construction expression.
2854   ///
2855   /// By default, performs semantic analysis to build the new expression.
2856   /// Subclasses may override this routine to provide different behavior.
2857   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2858                                                SourceLocation LParenLoc,
2859                                                MultiExprArg Args,
2860                                                SourceLocation RParenLoc,
2861                                                bool ListInitialization) {
2862     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2863                                                RParenLoc, ListInitialization);
2864   }
2865 
2866   /// \brief Build a new member reference expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2871                                                 QualType BaseType,
2872                                                 bool IsArrow,
2873                                                 SourceLocation OperatorLoc,
2874                                           NestedNameSpecifierLoc QualifierLoc,
2875                                                 SourceLocation TemplateKWLoc,
2876                                             NamedDecl *FirstQualifierInScope,
2877                                    const DeclarationNameInfo &MemberNameInfo,
2878                               const TemplateArgumentListInfo *TemplateArgs) {
2879     CXXScopeSpec SS;
2880     SS.Adopt(QualifierLoc);
2881 
2882     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2883                                             OperatorLoc, IsArrow,
2884                                             SS, TemplateKWLoc,
2885                                             FirstQualifierInScope,
2886                                             MemberNameInfo,
2887                                             TemplateArgs, /*S*/nullptr);
2888   }
2889 
2890   /// \brief Build a new member reference expression.
2891   ///
2892   /// By default, performs semantic analysis to build the new expression.
2893   /// Subclasses may override this routine to provide different behavior.
2894   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2895                                          SourceLocation OperatorLoc,
2896                                          bool IsArrow,
2897                                          NestedNameSpecifierLoc QualifierLoc,
2898                                          SourceLocation TemplateKWLoc,
2899                                          NamedDecl *FirstQualifierInScope,
2900                                          LookupResult &R,
2901                                 const TemplateArgumentListInfo *TemplateArgs) {
2902     CXXScopeSpec SS;
2903     SS.Adopt(QualifierLoc);
2904 
2905     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2906                                             OperatorLoc, IsArrow,
2907                                             SS, TemplateKWLoc,
2908                                             FirstQualifierInScope,
2909                                             R, TemplateArgs, /*S*/nullptr);
2910   }
2911 
2912   /// \brief Build a new noexcept expression.
2913   ///
2914   /// By default, performs semantic analysis to build the new expression.
2915   /// Subclasses may override this routine to provide different behavior.
2916   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2917     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2918   }
2919 
2920   /// \brief Build a new expression to compute the length of a parameter pack.
2921   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2922                                    NamedDecl *Pack,
2923                                    SourceLocation PackLoc,
2924                                    SourceLocation RParenLoc,
2925                                    Optional<unsigned> Length,
2926                                    ArrayRef<TemplateArgument> PartialArgs) {
2927     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2928                                   RParenLoc, Length, PartialArgs);
2929   }
2930 
2931   /// \brief Build a new Objective-C boxed expression.
2932   ///
2933   /// By default, performs semantic analysis to build the new expression.
2934   /// Subclasses may override this routine to provide different behavior.
2935   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2936     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2937   }
2938 
2939   /// \brief Build a new Objective-C array literal.
2940   ///
2941   /// By default, performs semantic analysis to build the new expression.
2942   /// Subclasses may override this routine to provide different behavior.
2943   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2944                                      Expr **Elements, unsigned NumElements) {
2945     return getSema().BuildObjCArrayLiteral(Range,
2946                                            MultiExprArg(Elements, NumElements));
2947   }
2948 
2949   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2950                                          Expr *Base, Expr *Key,
2951                                          ObjCMethodDecl *getterMethod,
2952                                          ObjCMethodDecl *setterMethod) {
2953     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2954                                                    getterMethod, setterMethod);
2955   }
2956 
2957   /// \brief Build a new Objective-C dictionary literal.
2958   ///
2959   /// By default, performs semantic analysis to build the new expression.
2960   /// Subclasses may override this routine to provide different behavior.
2961   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2962                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2963     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2964   }
2965 
2966   /// \brief Build a new Objective-C \@encode expression.
2967   ///
2968   /// By default, performs semantic analysis to build the new expression.
2969   /// Subclasses may override this routine to provide different behavior.
2970   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2971                                          TypeSourceInfo *EncodeTypeInfo,
2972                                          SourceLocation RParenLoc) {
2973     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2974   }
2975 
2976   /// \brief Build a new Objective-C class message.
2977   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2978                                           Selector Sel,
2979                                           ArrayRef<SourceLocation> SelectorLocs,
2980                                           ObjCMethodDecl *Method,
2981                                           SourceLocation LBracLoc,
2982                                           MultiExprArg Args,
2983                                           SourceLocation RBracLoc) {
2984     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2985                                      ReceiverTypeInfo->getType(),
2986                                      /*SuperLoc=*/SourceLocation(),
2987                                      Sel, Method, LBracLoc, SelectorLocs,
2988                                      RBracLoc, Args);
2989   }
2990 
2991   /// \brief Build a new Objective-C instance message.
2992   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2993                                           Selector Sel,
2994                                           ArrayRef<SourceLocation> SelectorLocs,
2995                                           ObjCMethodDecl *Method,
2996                                           SourceLocation LBracLoc,
2997                                           MultiExprArg Args,
2998                                           SourceLocation RBracLoc) {
2999     return SemaRef.BuildInstanceMessage(Receiver,
3000                                         Receiver->getType(),
3001                                         /*SuperLoc=*/SourceLocation(),
3002                                         Sel, Method, LBracLoc, SelectorLocs,
3003                                         RBracLoc, Args);
3004   }
3005 
3006   /// \brief Build a new Objective-C instance/class message to 'super'.
3007   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3008                                     Selector Sel,
3009                                     ArrayRef<SourceLocation> SelectorLocs,
3010                                     QualType SuperType,
3011                                     ObjCMethodDecl *Method,
3012                                     SourceLocation LBracLoc,
3013                                     MultiExprArg Args,
3014                                     SourceLocation RBracLoc) {
3015     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3016                                           SuperType,
3017                                           SuperLoc,
3018                                           Sel, Method, LBracLoc, SelectorLocs,
3019                                           RBracLoc, Args)
3020                                       : SemaRef.BuildClassMessage(nullptr,
3021                                           SuperType,
3022                                           SuperLoc,
3023                                           Sel, Method, LBracLoc, SelectorLocs,
3024                                           RBracLoc, Args);
3025 
3026 
3027   }
3028 
3029   /// \brief Build a new Objective-C ivar reference expression.
3030   ///
3031   /// By default, performs semantic analysis to build the new expression.
3032   /// Subclasses may override this routine to provide different behavior.
3033   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3034                                           SourceLocation IvarLoc,
3035                                           bool IsArrow, bool IsFreeIvar) {
3036     CXXScopeSpec SS;
3037     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3038     ExprResult Result = getSema().BuildMemberReferenceExpr(
3039         BaseArg, BaseArg->getType(),
3040         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3041         /*FirstQualifierInScope=*/nullptr, NameInfo,
3042         /*TemplateArgs=*/nullptr,
3043         /*S=*/nullptr);
3044     if (IsFreeIvar && Result.isUsable())
3045       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3046     return Result;
3047   }
3048 
3049   /// \brief Build a new Objective-C property reference expression.
3050   ///
3051   /// By default, performs semantic analysis to build the new expression.
3052   /// Subclasses may override this routine to provide different behavior.
3053   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3054                                         ObjCPropertyDecl *Property,
3055                                         SourceLocation PropertyLoc) {
3056     CXXScopeSpec SS;
3057     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3058     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3059                                               /*FIXME:*/PropertyLoc,
3060                                               /*IsArrow=*/false,
3061                                               SS, SourceLocation(),
3062                                               /*FirstQualifierInScope=*/nullptr,
3063                                               NameInfo,
3064                                               /*TemplateArgs=*/nullptr,
3065                                               /*S=*/nullptr);
3066   }
3067 
3068   /// \brief Build a new Objective-C property reference expression.
3069   ///
3070   /// By default, performs semantic analysis to build the new expression.
3071   /// Subclasses may override this routine to provide different behavior.
3072   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3073                                         ObjCMethodDecl *Getter,
3074                                         ObjCMethodDecl *Setter,
3075                                         SourceLocation PropertyLoc) {
3076     // Since these expressions can only be value-dependent, we do not
3077     // need to perform semantic analysis again.
3078     return Owned(
3079       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3080                                                   VK_LValue, OK_ObjCProperty,
3081                                                   PropertyLoc, Base));
3082   }
3083 
3084   /// \brief Build a new Objective-C "isa" expression.
3085   ///
3086   /// By default, performs semantic analysis to build the new expression.
3087   /// Subclasses may override this routine to provide different behavior.
3088   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3089                                 SourceLocation OpLoc, bool IsArrow) {
3090     CXXScopeSpec SS;
3091     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3092     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3093                                               OpLoc, IsArrow,
3094                                               SS, SourceLocation(),
3095                                               /*FirstQualifierInScope=*/nullptr,
3096                                               NameInfo,
3097                                               /*TemplateArgs=*/nullptr,
3098                                               /*S=*/nullptr);
3099   }
3100 
3101   /// \brief Build a new shuffle vector expression.
3102   ///
3103   /// By default, performs semantic analysis to build the new expression.
3104   /// Subclasses may override this routine to provide different behavior.
3105   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3106                                       MultiExprArg SubExprs,
3107                                       SourceLocation RParenLoc) {
3108     // Find the declaration for __builtin_shufflevector
3109     const IdentifierInfo &Name
3110       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3111     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3112     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3113     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3114 
3115     // Build a reference to the __builtin_shufflevector builtin
3116     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3117     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3118                                                   SemaRef.Context.BuiltinFnTy,
3119                                                   VK_RValue, BuiltinLoc);
3120     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3121     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3122                                        CK_BuiltinFnToFnPtr).get();
3123 
3124     // Build the CallExpr
3125     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3126         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3127         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3128 
3129     // Type-check the __builtin_shufflevector expression.
3130     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3131   }
3132 
3133   /// \brief Build a new convert vector expression.
3134   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3135                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3136                                       SourceLocation RParenLoc) {
3137     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3138                                          BuiltinLoc, RParenLoc);
3139   }
3140 
3141   /// \brief Build a new template argument pack expansion.
3142   ///
3143   /// By default, performs semantic analysis to build a new pack expansion
3144   /// for a template argument. Subclasses may override this routine to provide
3145   /// different behavior.
3146   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3147                                            SourceLocation EllipsisLoc,
3148                                            Optional<unsigned> NumExpansions) {
3149     switch (Pattern.getArgument().getKind()) {
3150     case TemplateArgument::Expression: {
3151       ExprResult Result
3152         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3153                                        EllipsisLoc, NumExpansions);
3154       if (Result.isInvalid())
3155         return TemplateArgumentLoc();
3156 
3157       return TemplateArgumentLoc(Result.get(), Result.get());
3158     }
3159 
3160     case TemplateArgument::Template:
3161       return TemplateArgumentLoc(TemplateArgument(
3162                                           Pattern.getArgument().getAsTemplate(),
3163                                                   NumExpansions),
3164                                  Pattern.getTemplateQualifierLoc(),
3165                                  Pattern.getTemplateNameLoc(),
3166                                  EllipsisLoc);
3167 
3168     case TemplateArgument::Null:
3169     case TemplateArgument::Integral:
3170     case TemplateArgument::Declaration:
3171     case TemplateArgument::Pack:
3172     case TemplateArgument::TemplateExpansion:
3173     case TemplateArgument::NullPtr:
3174       llvm_unreachable("Pack expansion pattern has no parameter packs");
3175 
3176     case TemplateArgument::Type:
3177       if (TypeSourceInfo *Expansion
3178             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3179                                            EllipsisLoc,
3180                                            NumExpansions))
3181         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3182                                    Expansion);
3183       break;
3184     }
3185 
3186     return TemplateArgumentLoc();
3187   }
3188 
3189   /// \brief Build a new expression pack expansion.
3190   ///
3191   /// By default, performs semantic analysis to build a new pack expansion
3192   /// for an expression. Subclasses may override this routine to provide
3193   /// different behavior.
3194   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3195                                   Optional<unsigned> NumExpansions) {
3196     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3197   }
3198 
3199   /// \brief Build a new C++1z fold-expression.
3200   ///
3201   /// By default, performs semantic analysis in order to build a new fold
3202   /// expression.
3203   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3204                                 BinaryOperatorKind Operator,
3205                                 SourceLocation EllipsisLoc, Expr *RHS,
3206                                 SourceLocation RParenLoc) {
3207     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3208                                       RHS, RParenLoc);
3209   }
3210 
3211   /// \brief Build an empty C++1z fold-expression with the given operator.
3212   ///
3213   /// By default, produces the fallback value for the fold-expression, or
3214   /// produce an error if there is no fallback value.
3215   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3216                                      BinaryOperatorKind Operator) {
3217     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3218   }
3219 
3220   /// \brief Build a new atomic operation expression.
3221   ///
3222   /// By default, performs semantic analysis to build the new expression.
3223   /// Subclasses may override this routine to provide different behavior.
3224   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3225                                MultiExprArg SubExprs,
3226                                QualType RetTy,
3227                                AtomicExpr::AtomicOp Op,
3228                                SourceLocation RParenLoc) {
3229     // Just create the expression; there is not any interesting semantic
3230     // analysis here because we can't actually build an AtomicExpr until
3231     // we are sure it is semantically sound.
3232     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3233                                             RParenLoc);
3234   }
3235 
3236 private:
3237   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3238                                      QualType ObjectType,
3239                                      NamedDecl *FirstQualifierInScope,
3240                                      CXXScopeSpec &SS);
3241 
3242   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3243                                              QualType ObjectType,
3244                                              NamedDecl *FirstQualifierInScope,
3245                                              CXXScopeSpec &SS);
3246 
3247   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3248                                             NamedDecl *FirstQualifierInScope,
3249                                             CXXScopeSpec &SS);
3250 
3251   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3252                                       DependentNameTypeLoc TL,
3253                                       bool DeducibleTSTContext);
3254 };
3255 
3256 template<typename Derived>
3257 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3258   if (!S)
3259     return S;
3260 
3261   switch (S->getStmtClass()) {
3262   case Stmt::NoStmtClass: break;
3263 
3264   // Transform individual statement nodes
3265 #define STMT(Node, Parent)                                              \
3266   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3267 #define ABSTRACT_STMT(Node)
3268 #define EXPR(Node, Parent)
3269 #include "clang/AST/StmtNodes.inc"
3270 
3271   // Transform expressions by calling TransformExpr.
3272 #define STMT(Node, Parent)
3273 #define ABSTRACT_STMT(Stmt)
3274 #define EXPR(Node, Parent) case Stmt::Node##Class:
3275 #include "clang/AST/StmtNodes.inc"
3276     {
3277       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3278       if (E.isInvalid())
3279         return StmtError();
3280 
3281       return getSema().ActOnExprStmt(E);
3282     }
3283   }
3284 
3285   return S;
3286 }
3287 
3288 template<typename Derived>
3289 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3290   if (!S)
3291     return S;
3292 
3293   switch (S->getClauseKind()) {
3294   default: break;
3295   // Transform individual clause nodes
3296 #define OPENMP_CLAUSE(Name, Class)                                             \
3297   case OMPC_ ## Name :                                                         \
3298     return getDerived().Transform ## Class(cast<Class>(S));
3299 #include "clang/Basic/OpenMPKinds.def"
3300   }
3301 
3302   return S;
3303 }
3304 
3305 
3306 template<typename Derived>
3307 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3308   if (!E)
3309     return E;
3310 
3311   switch (E->getStmtClass()) {
3312     case Stmt::NoStmtClass: break;
3313 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3314 #define ABSTRACT_STMT(Stmt)
3315 #define EXPR(Node, Parent)                                              \
3316     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3317 #include "clang/AST/StmtNodes.inc"
3318   }
3319 
3320   return E;
3321 }
3322 
3323 template<typename Derived>
3324 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3325                                                         bool NotCopyInit) {
3326   // Initializers are instantiated like expressions, except that various outer
3327   // layers are stripped.
3328   if (!Init)
3329     return Init;
3330 
3331   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3332     Init = ExprTemp->getSubExpr();
3333 
3334   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3335     Init = AIL->getCommonExpr();
3336 
3337   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3338     Init = MTE->GetTemporaryExpr();
3339 
3340   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3341     Init = Binder->getSubExpr();
3342 
3343   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3344     Init = ICE->getSubExprAsWritten();
3345 
3346   if (CXXStdInitializerListExpr *ILE =
3347           dyn_cast<CXXStdInitializerListExpr>(Init))
3348     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3349 
3350   // If this is copy-initialization, we only need to reconstruct
3351   // InitListExprs. Other forms of copy-initialization will be a no-op if
3352   // the initializer is already the right type.
3353   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3354   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3355     return getDerived().TransformExpr(Init);
3356 
3357   // Revert value-initialization back to empty parens.
3358   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3359     SourceRange Parens = VIE->getSourceRange();
3360     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3361                                              Parens.getEnd());
3362   }
3363 
3364   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3365   if (isa<ImplicitValueInitExpr>(Init))
3366     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3367                                              SourceLocation());
3368 
3369   // Revert initialization by constructor back to a parenthesized or braced list
3370   // of expressions. Any other form of initializer can just be reused directly.
3371   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3372     return getDerived().TransformExpr(Init);
3373 
3374   // If the initialization implicitly converted an initializer list to a
3375   // std::initializer_list object, unwrap the std::initializer_list too.
3376   if (Construct && Construct->isStdInitListInitialization())
3377     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3378 
3379   SmallVector<Expr*, 8> NewArgs;
3380   bool ArgChanged = false;
3381   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3382                                   /*IsCall*/true, NewArgs, &ArgChanged))
3383     return ExprError();
3384 
3385   // If this was list initialization, revert to syntactic list form.
3386   if (Construct->isListInitialization())
3387     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3388                                         Construct->getLocEnd());
3389 
3390   // Build a ParenListExpr to represent anything else.
3391   SourceRange Parens = Construct->getParenOrBraceRange();
3392   if (Parens.isInvalid()) {
3393     // This was a variable declaration's initialization for which no initializer
3394     // was specified.
3395     assert(NewArgs.empty() &&
3396            "no parens or braces but have direct init with arguments?");
3397     return ExprEmpty();
3398   }
3399   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3400                                            Parens.getEnd());
3401 }
3402 
3403 template<typename Derived>
3404 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3405                                             unsigned NumInputs,
3406                                             bool IsCall,
3407                                       SmallVectorImpl<Expr *> &Outputs,
3408                                             bool *ArgChanged) {
3409   for (unsigned I = 0; I != NumInputs; ++I) {
3410     // If requested, drop call arguments that need to be dropped.
3411     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3412       if (ArgChanged)
3413         *ArgChanged = true;
3414 
3415       break;
3416     }
3417 
3418     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3419       Expr *Pattern = Expansion->getPattern();
3420 
3421       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3422       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3423       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3424 
3425       // Determine whether the set of unexpanded parameter packs can and should
3426       // be expanded.
3427       bool Expand = true;
3428       bool RetainExpansion = false;
3429       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3430       Optional<unsigned> NumExpansions = OrigNumExpansions;
3431       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3432                                                Pattern->getSourceRange(),
3433                                                Unexpanded,
3434                                                Expand, RetainExpansion,
3435                                                NumExpansions))
3436         return true;
3437 
3438       if (!Expand) {
3439         // The transform has determined that we should perform a simple
3440         // transformation on the pack expansion, producing another pack
3441         // expansion.
3442         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3443         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3444         if (OutPattern.isInvalid())
3445           return true;
3446 
3447         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3448                                                 Expansion->getEllipsisLoc(),
3449                                                            NumExpansions);
3450         if (Out.isInvalid())
3451           return true;
3452 
3453         if (ArgChanged)
3454           *ArgChanged = true;
3455         Outputs.push_back(Out.get());
3456         continue;
3457       }
3458 
3459       // Record right away that the argument was changed.  This needs
3460       // to happen even if the array expands to nothing.
3461       if (ArgChanged) *ArgChanged = true;
3462 
3463       // The transform has determined that we should perform an elementwise
3464       // expansion of the pattern. Do so.
3465       for (unsigned I = 0; I != *NumExpansions; ++I) {
3466         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3467         ExprResult Out = getDerived().TransformExpr(Pattern);
3468         if (Out.isInvalid())
3469           return true;
3470 
3471         if (Out.get()->containsUnexpandedParameterPack()) {
3472           Out = getDerived().RebuildPackExpansion(
3473               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3474           if (Out.isInvalid())
3475             return true;
3476         }
3477 
3478         Outputs.push_back(Out.get());
3479       }
3480 
3481       // If we're supposed to retain a pack expansion, do so by temporarily
3482       // forgetting the partially-substituted parameter pack.
3483       if (RetainExpansion) {
3484         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3485 
3486         ExprResult Out = getDerived().TransformExpr(Pattern);
3487         if (Out.isInvalid())
3488           return true;
3489 
3490         Out = getDerived().RebuildPackExpansion(
3491             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3492         if (Out.isInvalid())
3493           return true;
3494 
3495         Outputs.push_back(Out.get());
3496       }
3497 
3498       continue;
3499     }
3500 
3501     ExprResult Result =
3502       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3503              : getDerived().TransformExpr(Inputs[I]);
3504     if (Result.isInvalid())
3505       return true;
3506 
3507     if (Result.get() != Inputs[I] && ArgChanged)
3508       *ArgChanged = true;
3509 
3510     Outputs.push_back(Result.get());
3511   }
3512 
3513   return false;
3514 }
3515 
3516 template <typename Derived>
3517 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3518     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3519   if (Var) {
3520     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3521         getDerived().TransformDefinition(Var->getLocation(), Var));
3522 
3523     if (!ConditionVar)
3524       return Sema::ConditionError();
3525 
3526     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3527   }
3528 
3529   if (Expr) {
3530     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3531 
3532     if (CondExpr.isInvalid())
3533       return Sema::ConditionError();
3534 
3535     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3536   }
3537 
3538   return Sema::ConditionResult();
3539 }
3540 
3541 template<typename Derived>
3542 NestedNameSpecifierLoc
3543 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3544                                                     NestedNameSpecifierLoc NNS,
3545                                                      QualType ObjectType,
3546                                              NamedDecl *FirstQualifierInScope) {
3547   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3548   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3549        Qualifier = Qualifier.getPrefix())
3550     Qualifiers.push_back(Qualifier);
3551 
3552   CXXScopeSpec SS;
3553   while (!Qualifiers.empty()) {
3554     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3555     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3556 
3557     switch (QNNS->getKind()) {
3558     case NestedNameSpecifier::Identifier: {
3559       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3560                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3561       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3562                                               SS, FirstQualifierInScope, false))
3563         return NestedNameSpecifierLoc();
3564     }
3565       break;
3566 
3567     case NestedNameSpecifier::Namespace: {
3568       NamespaceDecl *NS
3569         = cast_or_null<NamespaceDecl>(
3570                                     getDerived().TransformDecl(
3571                                                           Q.getLocalBeginLoc(),
3572                                                        QNNS->getAsNamespace()));
3573       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3574       break;
3575     }
3576 
3577     case NestedNameSpecifier::NamespaceAlias: {
3578       NamespaceAliasDecl *Alias
3579         = cast_or_null<NamespaceAliasDecl>(
3580                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3581                                                  QNNS->getAsNamespaceAlias()));
3582       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3583                 Q.getLocalEndLoc());
3584       break;
3585     }
3586 
3587     case NestedNameSpecifier::Global:
3588       // There is no meaningful transformation that one could perform on the
3589       // global scope.
3590       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3591       break;
3592 
3593     case NestedNameSpecifier::Super: {
3594       CXXRecordDecl *RD =
3595           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3596               SourceLocation(), QNNS->getAsRecordDecl()));
3597       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3598       break;
3599     }
3600 
3601     case NestedNameSpecifier::TypeSpecWithTemplate:
3602     case NestedNameSpecifier::TypeSpec: {
3603       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3604                                               FirstQualifierInScope, SS);
3605 
3606       if (!TL)
3607         return NestedNameSpecifierLoc();
3608 
3609       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3610           (SemaRef.getLangOpts().CPlusPlus11 &&
3611            TL.getType()->isEnumeralType())) {
3612         assert(!TL.getType().hasLocalQualifiers() &&
3613                "Can't get cv-qualifiers here");
3614         if (TL.getType()->isEnumeralType())
3615           SemaRef.Diag(TL.getBeginLoc(),
3616                        diag::warn_cxx98_compat_enum_nested_name_spec);
3617         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3618                   Q.getLocalEndLoc());
3619         break;
3620       }
3621       // If the nested-name-specifier is an invalid type def, don't emit an
3622       // error because a previous error should have already been emitted.
3623       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3624       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3625         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3626           << TL.getType() << SS.getRange();
3627       }
3628       return NestedNameSpecifierLoc();
3629     }
3630     }
3631 
3632     // The qualifier-in-scope and object type only apply to the leftmost entity.
3633     FirstQualifierInScope = nullptr;
3634     ObjectType = QualType();
3635   }
3636 
3637   // Don't rebuild the nested-name-specifier if we don't have to.
3638   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3639       !getDerived().AlwaysRebuild())
3640     return NNS;
3641 
3642   // If we can re-use the source-location data from the original
3643   // nested-name-specifier, do so.
3644   if (SS.location_size() == NNS.getDataLength() &&
3645       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3646     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3647 
3648   // Allocate new nested-name-specifier location information.
3649   return SS.getWithLocInContext(SemaRef.Context);
3650 }
3651 
3652 template<typename Derived>
3653 DeclarationNameInfo
3654 TreeTransform<Derived>
3655 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3656   DeclarationName Name = NameInfo.getName();
3657   if (!Name)
3658     return DeclarationNameInfo();
3659 
3660   switch (Name.getNameKind()) {
3661   case DeclarationName::Identifier:
3662   case DeclarationName::ObjCZeroArgSelector:
3663   case DeclarationName::ObjCOneArgSelector:
3664   case DeclarationName::ObjCMultiArgSelector:
3665   case DeclarationName::CXXOperatorName:
3666   case DeclarationName::CXXLiteralOperatorName:
3667   case DeclarationName::CXXUsingDirective:
3668     return NameInfo;
3669 
3670   case DeclarationName::CXXDeductionGuideName: {
3671     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3672     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3673         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3674     if (!NewTemplate)
3675       return DeclarationNameInfo();
3676 
3677     DeclarationNameInfo NewNameInfo(NameInfo);
3678     NewNameInfo.setName(
3679         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3680     return NewNameInfo;
3681   }
3682 
3683   case DeclarationName::CXXConstructorName:
3684   case DeclarationName::CXXDestructorName:
3685   case DeclarationName::CXXConversionFunctionName: {
3686     TypeSourceInfo *NewTInfo;
3687     CanQualType NewCanTy;
3688     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3689       NewTInfo = getDerived().TransformType(OldTInfo);
3690       if (!NewTInfo)
3691         return DeclarationNameInfo();
3692       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3693     }
3694     else {
3695       NewTInfo = nullptr;
3696       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3697       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3698       if (NewT.isNull())
3699         return DeclarationNameInfo();
3700       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3701     }
3702 
3703     DeclarationName NewName
3704       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3705                                                            NewCanTy);
3706     DeclarationNameInfo NewNameInfo(NameInfo);
3707     NewNameInfo.setName(NewName);
3708     NewNameInfo.setNamedTypeInfo(NewTInfo);
3709     return NewNameInfo;
3710   }
3711   }
3712 
3713   llvm_unreachable("Unknown name kind.");
3714 }
3715 
3716 template<typename Derived>
3717 TemplateName
3718 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3719                                               TemplateName Name,
3720                                               SourceLocation NameLoc,
3721                                               QualType ObjectType,
3722                                               NamedDecl *FirstQualifierInScope,
3723                                               bool AllowInjectedClassName) {
3724   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3725     TemplateDecl *Template = QTN->getTemplateDecl();
3726     assert(Template && "qualified template name must refer to a template");
3727 
3728     TemplateDecl *TransTemplate
3729       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3730                                                               Template));
3731     if (!TransTemplate)
3732       return TemplateName();
3733 
3734     if (!getDerived().AlwaysRebuild() &&
3735         SS.getScopeRep() == QTN->getQualifier() &&
3736         TransTemplate == Template)
3737       return Name;
3738 
3739     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3740                                             TransTemplate);
3741   }
3742 
3743   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3744     if (SS.getScopeRep()) {
3745       // These apply to the scope specifier, not the template.
3746       ObjectType = QualType();
3747       FirstQualifierInScope = nullptr;
3748     }
3749 
3750     if (!getDerived().AlwaysRebuild() &&
3751         SS.getScopeRep() == DTN->getQualifier() &&
3752         ObjectType.isNull())
3753       return Name;
3754 
3755     if (DTN->isIdentifier()) {
3756       return getDerived().RebuildTemplateName(SS,
3757                                               *DTN->getIdentifier(),
3758                                               NameLoc,
3759                                               ObjectType,
3760                                               FirstQualifierInScope,
3761                                               AllowInjectedClassName);
3762     }
3763 
3764     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3765                                             ObjectType, AllowInjectedClassName);
3766   }
3767 
3768   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3769     TemplateDecl *TransTemplate
3770       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3771                                                               Template));
3772     if (!TransTemplate)
3773       return TemplateName();
3774 
3775     if (!getDerived().AlwaysRebuild() &&
3776         TransTemplate == Template)
3777       return Name;
3778 
3779     return TemplateName(TransTemplate);
3780   }
3781 
3782   if (SubstTemplateTemplateParmPackStorage *SubstPack
3783       = Name.getAsSubstTemplateTemplateParmPack()) {
3784     TemplateTemplateParmDecl *TransParam
3785     = cast_or_null<TemplateTemplateParmDecl>(
3786             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3787     if (!TransParam)
3788       return TemplateName();
3789 
3790     if (!getDerived().AlwaysRebuild() &&
3791         TransParam == SubstPack->getParameterPack())
3792       return Name;
3793 
3794     return getDerived().RebuildTemplateName(TransParam,
3795                                             SubstPack->getArgumentPack());
3796   }
3797 
3798   // These should be getting filtered out before they reach the AST.
3799   llvm_unreachable("overloaded function decl survived to here");
3800 }
3801 
3802 template<typename Derived>
3803 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3804                                          const TemplateArgument &Arg,
3805                                          TemplateArgumentLoc &Output) {
3806   SourceLocation Loc = getDerived().getBaseLocation();
3807   switch (Arg.getKind()) {
3808   case TemplateArgument::Null:
3809     llvm_unreachable("null template argument in TreeTransform");
3810     break;
3811 
3812   case TemplateArgument::Type:
3813     Output = TemplateArgumentLoc(Arg,
3814                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3815 
3816     break;
3817 
3818   case TemplateArgument::Template:
3819   case TemplateArgument::TemplateExpansion: {
3820     NestedNameSpecifierLocBuilder Builder;
3821     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3822     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3823       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3824     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3825       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3826 
3827     if (Arg.getKind() == TemplateArgument::Template)
3828       Output = TemplateArgumentLoc(Arg,
3829                                    Builder.getWithLocInContext(SemaRef.Context),
3830                                    Loc);
3831     else
3832       Output = TemplateArgumentLoc(Arg,
3833                                    Builder.getWithLocInContext(SemaRef.Context),
3834                                    Loc, Loc);
3835 
3836     break;
3837   }
3838 
3839   case TemplateArgument::Expression:
3840     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3841     break;
3842 
3843   case TemplateArgument::Declaration:
3844   case TemplateArgument::Integral:
3845   case TemplateArgument::Pack:
3846   case TemplateArgument::NullPtr:
3847     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3848     break;
3849   }
3850 }
3851 
3852 template<typename Derived>
3853 bool TreeTransform<Derived>::TransformTemplateArgument(
3854                                          const TemplateArgumentLoc &Input,
3855                                          TemplateArgumentLoc &Output, bool Uneval) {
3856   const TemplateArgument &Arg = Input.getArgument();
3857   switch (Arg.getKind()) {
3858   case TemplateArgument::Null:
3859   case TemplateArgument::Integral:
3860   case TemplateArgument::Pack:
3861   case TemplateArgument::Declaration:
3862   case TemplateArgument::NullPtr:
3863     llvm_unreachable("Unexpected TemplateArgument");
3864 
3865   case TemplateArgument::Type: {
3866     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3867     if (!DI)
3868       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3869 
3870     DI = getDerived().TransformType(DI);
3871     if (!DI) return true;
3872 
3873     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3874     return false;
3875   }
3876 
3877   case TemplateArgument::Template: {
3878     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3879     if (QualifierLoc) {
3880       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3881       if (!QualifierLoc)
3882         return true;
3883     }
3884 
3885     CXXScopeSpec SS;
3886     SS.Adopt(QualifierLoc);
3887     TemplateName Template
3888       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3889                                            Input.getTemplateNameLoc());
3890     if (Template.isNull())
3891       return true;
3892 
3893     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3894                                  Input.getTemplateNameLoc());
3895     return false;
3896   }
3897 
3898   case TemplateArgument::TemplateExpansion:
3899     llvm_unreachable("Caller should expand pack expansions");
3900 
3901   case TemplateArgument::Expression: {
3902     // Template argument expressions are constant expressions.
3903     EnterExpressionEvaluationContext Unevaluated(
3904         getSema(), Uneval
3905                        ? Sema::ExpressionEvaluationContext::Unevaluated
3906                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3907 
3908     Expr *InputExpr = Input.getSourceExpression();
3909     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3910 
3911     ExprResult E = getDerived().TransformExpr(InputExpr);
3912     E = SemaRef.ActOnConstantExpression(E);
3913     if (E.isInvalid()) return true;
3914     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3915     return false;
3916   }
3917   }
3918 
3919   // Work around bogus GCC warning
3920   return true;
3921 }
3922 
3923 /// \brief Iterator adaptor that invents template argument location information
3924 /// for each of the template arguments in its underlying iterator.
3925 template<typename Derived, typename InputIterator>
3926 class TemplateArgumentLocInventIterator {
3927   TreeTransform<Derived> &Self;
3928   InputIterator Iter;
3929 
3930 public:
3931   typedef TemplateArgumentLoc value_type;
3932   typedef TemplateArgumentLoc reference;
3933   typedef typename std::iterator_traits<InputIterator>::difference_type
3934     difference_type;
3935   typedef std::input_iterator_tag iterator_category;
3936 
3937   class pointer {
3938     TemplateArgumentLoc Arg;
3939 
3940   public:
3941     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3942 
3943     const TemplateArgumentLoc *operator->() const { return &Arg; }
3944   };
3945 
3946   TemplateArgumentLocInventIterator() { }
3947 
3948   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3949                                              InputIterator Iter)
3950     : Self(Self), Iter(Iter) { }
3951 
3952   TemplateArgumentLocInventIterator &operator++() {
3953     ++Iter;
3954     return *this;
3955   }
3956 
3957   TemplateArgumentLocInventIterator operator++(int) {
3958     TemplateArgumentLocInventIterator Old(*this);
3959     ++(*this);
3960     return Old;
3961   }
3962 
3963   reference operator*() const {
3964     TemplateArgumentLoc Result;
3965     Self.InventTemplateArgumentLoc(*Iter, Result);
3966     return Result;
3967   }
3968 
3969   pointer operator->() const { return pointer(**this); }
3970 
3971   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3972                          const TemplateArgumentLocInventIterator &Y) {
3973     return X.Iter == Y.Iter;
3974   }
3975 
3976   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3977                          const TemplateArgumentLocInventIterator &Y) {
3978     return X.Iter != Y.Iter;
3979   }
3980 };
3981 
3982 template<typename Derived>
3983 template<typename InputIterator>
3984 bool TreeTransform<Derived>::TransformTemplateArguments(
3985     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3986     bool Uneval) {
3987   for (; First != Last; ++First) {
3988     TemplateArgumentLoc Out;
3989     TemplateArgumentLoc In = *First;
3990 
3991     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3992       // Unpack argument packs, which we translate them into separate
3993       // arguments.
3994       // FIXME: We could do much better if we could guarantee that the
3995       // TemplateArgumentLocInfo for the pack expansion would be usable for
3996       // all of the template arguments in the argument pack.
3997       typedef TemplateArgumentLocInventIterator<Derived,
3998                                                 TemplateArgument::pack_iterator>
3999         PackLocIterator;
4000       if (TransformTemplateArguments(PackLocIterator(*this,
4001                                                  In.getArgument().pack_begin()),
4002                                      PackLocIterator(*this,
4003                                                    In.getArgument().pack_end()),
4004                                      Outputs, Uneval))
4005         return true;
4006 
4007       continue;
4008     }
4009 
4010     if (In.getArgument().isPackExpansion()) {
4011       // We have a pack expansion, for which we will be substituting into
4012       // the pattern.
4013       SourceLocation Ellipsis;
4014       Optional<unsigned> OrigNumExpansions;
4015       TemplateArgumentLoc Pattern
4016         = getSema().getTemplateArgumentPackExpansionPattern(
4017               In, Ellipsis, OrigNumExpansions);
4018 
4019       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4020       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4021       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4022 
4023       // Determine whether the set of unexpanded parameter packs can and should
4024       // be expanded.
4025       bool Expand = true;
4026       bool RetainExpansion = false;
4027       Optional<unsigned> NumExpansions = OrigNumExpansions;
4028       if (getDerived().TryExpandParameterPacks(Ellipsis,
4029                                                Pattern.getSourceRange(),
4030                                                Unexpanded,
4031                                                Expand,
4032                                                RetainExpansion,
4033                                                NumExpansions))
4034         return true;
4035 
4036       if (!Expand) {
4037         // The transform has determined that we should perform a simple
4038         // transformation on the pack expansion, producing another pack
4039         // expansion.
4040         TemplateArgumentLoc OutPattern;
4041         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4042         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4043           return true;
4044 
4045         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4046                                                 NumExpansions);
4047         if (Out.getArgument().isNull())
4048           return true;
4049 
4050         Outputs.addArgument(Out);
4051         continue;
4052       }
4053 
4054       // The transform has determined that we should perform an elementwise
4055       // expansion of the pattern. Do so.
4056       for (unsigned I = 0; I != *NumExpansions; ++I) {
4057         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4058 
4059         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4060           return true;
4061 
4062         if (Out.getArgument().containsUnexpandedParameterPack()) {
4063           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4064                                                   OrigNumExpansions);
4065           if (Out.getArgument().isNull())
4066             return true;
4067         }
4068 
4069         Outputs.addArgument(Out);
4070       }
4071 
4072       // If we're supposed to retain a pack expansion, do so by temporarily
4073       // forgetting the partially-substituted parameter pack.
4074       if (RetainExpansion) {
4075         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4076 
4077         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4078           return true;
4079 
4080         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4081                                                 OrigNumExpansions);
4082         if (Out.getArgument().isNull())
4083           return true;
4084 
4085         Outputs.addArgument(Out);
4086       }
4087 
4088       continue;
4089     }
4090 
4091     // The simple case:
4092     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4093       return true;
4094 
4095     Outputs.addArgument(Out);
4096   }
4097 
4098   return false;
4099 
4100 }
4101 
4102 //===----------------------------------------------------------------------===//
4103 // Type transformation
4104 //===----------------------------------------------------------------------===//
4105 
4106 template<typename Derived>
4107 QualType TreeTransform<Derived>::TransformType(QualType T) {
4108   if (getDerived().AlreadyTransformed(T))
4109     return T;
4110 
4111   // Temporary workaround.  All of these transformations should
4112   // eventually turn into transformations on TypeLocs.
4113   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4114                                                 getDerived().getBaseLocation());
4115 
4116   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4117 
4118   if (!NewDI)
4119     return QualType();
4120 
4121   return NewDI->getType();
4122 }
4123 
4124 template<typename Derived>
4125 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4126   // Refine the base location to the type's location.
4127   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4128                        getDerived().getBaseEntity());
4129   if (getDerived().AlreadyTransformed(DI->getType()))
4130     return DI;
4131 
4132   TypeLocBuilder TLB;
4133 
4134   TypeLoc TL = DI->getTypeLoc();
4135   TLB.reserve(TL.getFullDataSize());
4136 
4137   QualType Result = getDerived().TransformType(TLB, TL);
4138   if (Result.isNull())
4139     return nullptr;
4140 
4141   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4142 }
4143 
4144 template<typename Derived>
4145 QualType
4146 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4147   switch (T.getTypeLocClass()) {
4148 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4149 #define TYPELOC(CLASS, PARENT)                                                 \
4150   case TypeLoc::CLASS:                                                         \
4151     return getDerived().Transform##CLASS##Type(TLB,                            \
4152                                                T.castAs<CLASS##TypeLoc>());
4153 #include "clang/AST/TypeLocNodes.def"
4154   }
4155 
4156   llvm_unreachable("unhandled type loc!");
4157 }
4158 
4159 template<typename Derived>
4160 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4161   if (!isa<DependentNameType>(T))
4162     return TransformType(T);
4163 
4164   if (getDerived().AlreadyTransformed(T))
4165     return T;
4166   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4167                                                 getDerived().getBaseLocation());
4168   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4169   return NewDI ? NewDI->getType() : QualType();
4170 }
4171 
4172 template<typename Derived>
4173 TypeSourceInfo *
4174 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4175   if (!isa<DependentNameType>(DI->getType()))
4176     return TransformType(DI);
4177 
4178   // Refine the base location to the type's location.
4179   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4180                        getDerived().getBaseEntity());
4181   if (getDerived().AlreadyTransformed(DI->getType()))
4182     return DI;
4183 
4184   TypeLocBuilder TLB;
4185 
4186   TypeLoc TL = DI->getTypeLoc();
4187   TLB.reserve(TL.getFullDataSize());
4188 
4189   auto QTL = TL.getAs<QualifiedTypeLoc>();
4190   if (QTL)
4191     TL = QTL.getUnqualifiedLoc();
4192 
4193   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4194 
4195   QualType Result = getDerived().TransformDependentNameType(
4196       TLB, DNTL, /*DeducedTSTContext*/true);
4197   if (Result.isNull())
4198     return nullptr;
4199 
4200   if (QTL) {
4201     Result = getDerived().RebuildQualifiedType(
4202         Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers());
4203     TLB.TypeWasModifiedSafely(Result);
4204   }
4205 
4206   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4207 }
4208 
4209 template<typename Derived>
4210 QualType
4211 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4212                                                QualifiedTypeLoc T) {
4213   Qualifiers Quals = T.getType().getLocalQualifiers();
4214 
4215   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4216   if (Result.isNull())
4217     return QualType();
4218 
4219   Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals);
4220 
4221   // RebuildQualifiedType might have updated the type, but not in a way
4222   // that invalidates the TypeLoc. (There's no location information for
4223   // qualifiers.)
4224   TLB.TypeWasModifiedSafely(Result);
4225 
4226   return Result;
4227 }
4228 
4229 template<typename Derived>
4230 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4231                                                       SourceLocation Loc,
4232                                                       Qualifiers Quals) {
4233   // C++ [dcl.fct]p7:
4234   //   [When] adding cv-qualifications on top of the function type [...] the
4235   //   cv-qualifiers are ignored.
4236   // C++ [dcl.ref]p1:
4237   //   when the cv-qualifiers are introduced through the use of a typedef-name
4238   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4239   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4240   // applied to a reference type.
4241   // FIXME: This removes all qualifiers, not just cv-qualifiers!
4242   if (T->isFunctionType() || T->isReferenceType())
4243     return T;
4244 
4245   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4246   // resulting type.
4247   if (Quals.hasObjCLifetime()) {
4248     if (!T->isObjCLifetimeType() && !T->isDependentType())
4249       Quals.removeObjCLifetime();
4250     else if (T.getObjCLifetime()) {
4251       // Objective-C ARC:
4252       //   A lifetime qualifier applied to a substituted template parameter
4253       //   overrides the lifetime qualifier from the template argument.
4254       const AutoType *AutoTy;
4255       if (const SubstTemplateTypeParmType *SubstTypeParam
4256                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4257         QualType Replacement = SubstTypeParam->getReplacementType();
4258         Qualifiers Qs = Replacement.getQualifiers();
4259         Qs.removeObjCLifetime();
4260         Replacement = SemaRef.Context.getQualifiedType(
4261             Replacement.getUnqualifiedType(), Qs);
4262         T = SemaRef.Context.getSubstTemplateTypeParmType(
4263             SubstTypeParam->getReplacedParameter(), Replacement);
4264       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4265         // 'auto' types behave the same way as template parameters.
4266         QualType Deduced = AutoTy->getDeducedType();
4267         Qualifiers Qs = Deduced.getQualifiers();
4268         Qs.removeObjCLifetime();
4269         Deduced =
4270             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4271         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4272                                         AutoTy->isDependentType());
4273       } else {
4274         // Otherwise, complain about the addition of a qualifier to an
4275         // already-qualified type.
4276         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4277         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4278         Quals.removeObjCLifetime();
4279       }
4280     }
4281   }
4282 
4283   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4284 }
4285 
4286 template<typename Derived>
4287 TypeLoc
4288 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4289                                                    QualType ObjectType,
4290                                                    NamedDecl *UnqualLookup,
4291                                                    CXXScopeSpec &SS) {
4292   if (getDerived().AlreadyTransformed(TL.getType()))
4293     return TL;
4294 
4295   TypeSourceInfo *TSI =
4296       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4297   if (TSI)
4298     return TSI->getTypeLoc();
4299   return TypeLoc();
4300 }
4301 
4302 template<typename Derived>
4303 TypeSourceInfo *
4304 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4305                                                    QualType ObjectType,
4306                                                    NamedDecl *UnqualLookup,
4307                                                    CXXScopeSpec &SS) {
4308   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4309     return TSInfo;
4310 
4311   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4312                                    UnqualLookup, SS);
4313 }
4314 
4315 template <typename Derived>
4316 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4317     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4318     CXXScopeSpec &SS) {
4319   QualType T = TL.getType();
4320   assert(!getDerived().AlreadyTransformed(T));
4321 
4322   TypeLocBuilder TLB;
4323   QualType Result;
4324 
4325   if (isa<TemplateSpecializationType>(T)) {
4326     TemplateSpecializationTypeLoc SpecTL =
4327         TL.castAs<TemplateSpecializationTypeLoc>();
4328 
4329     TemplateName Template = getDerived().TransformTemplateName(
4330         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4331         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4332     if (Template.isNull())
4333       return nullptr;
4334 
4335     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4336                                                               Template);
4337   } else if (isa<DependentTemplateSpecializationType>(T)) {
4338     DependentTemplateSpecializationTypeLoc SpecTL =
4339         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4340 
4341     TemplateName Template
4342       = getDerived().RebuildTemplateName(SS,
4343                                          *SpecTL.getTypePtr()->getIdentifier(),
4344                                          SpecTL.getTemplateNameLoc(),
4345                                          ObjectType, UnqualLookup,
4346                                          /*AllowInjectedClassName*/true);
4347     if (Template.isNull())
4348       return nullptr;
4349 
4350     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4351                                                                        SpecTL,
4352                                                                        Template,
4353                                                                        SS);
4354   } else {
4355     // Nothing special needs to be done for these.
4356     Result = getDerived().TransformType(TLB, TL);
4357   }
4358 
4359   if (Result.isNull())
4360     return nullptr;
4361 
4362   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4363 }
4364 
4365 template <class TyLoc> static inline
4366 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4367   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4368   NewT.setNameLoc(T.getNameLoc());
4369   return T.getType();
4370 }
4371 
4372 template<typename Derived>
4373 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4374                                                       BuiltinTypeLoc T) {
4375   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4376   NewT.setBuiltinLoc(T.getBuiltinLoc());
4377   if (T.needsExtraLocalData())
4378     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4379   return T.getType();
4380 }
4381 
4382 template<typename Derived>
4383 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4384                                                       ComplexTypeLoc T) {
4385   // FIXME: recurse?
4386   return TransformTypeSpecType(TLB, T);
4387 }
4388 
4389 template <typename Derived>
4390 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4391                                                        AdjustedTypeLoc TL) {
4392   // Adjustments applied during transformation are handled elsewhere.
4393   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4394 }
4395 
4396 template<typename Derived>
4397 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4398                                                       DecayedTypeLoc TL) {
4399   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4400   if (OriginalType.isNull())
4401     return QualType();
4402 
4403   QualType Result = TL.getType();
4404   if (getDerived().AlwaysRebuild() ||
4405       OriginalType != TL.getOriginalLoc().getType())
4406     Result = SemaRef.Context.getDecayedType(OriginalType);
4407   TLB.push<DecayedTypeLoc>(Result);
4408   // Nothing to set for DecayedTypeLoc.
4409   return Result;
4410 }
4411 
4412 template<typename Derived>
4413 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4414                                                       PointerTypeLoc TL) {
4415   QualType PointeeType
4416     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4417   if (PointeeType.isNull())
4418     return QualType();
4419 
4420   QualType Result = TL.getType();
4421   if (PointeeType->getAs<ObjCObjectType>()) {
4422     // A dependent pointer type 'T *' has is being transformed such
4423     // that an Objective-C class type is being replaced for 'T'. The
4424     // resulting pointer type is an ObjCObjectPointerType, not a
4425     // PointerType.
4426     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4427 
4428     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4429     NewT.setStarLoc(TL.getStarLoc());
4430     return Result;
4431   }
4432 
4433   if (getDerived().AlwaysRebuild() ||
4434       PointeeType != TL.getPointeeLoc().getType()) {
4435     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4436     if (Result.isNull())
4437       return QualType();
4438   }
4439 
4440   // Objective-C ARC can add lifetime qualifiers to the type that we're
4441   // pointing to.
4442   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4443 
4444   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4445   NewT.setSigilLoc(TL.getSigilLoc());
4446   return Result;
4447 }
4448 
4449 template<typename Derived>
4450 QualType
4451 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4452                                                   BlockPointerTypeLoc TL) {
4453   QualType PointeeType
4454     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4455   if (PointeeType.isNull())
4456     return QualType();
4457 
4458   QualType Result = TL.getType();
4459   if (getDerived().AlwaysRebuild() ||
4460       PointeeType != TL.getPointeeLoc().getType()) {
4461     Result = getDerived().RebuildBlockPointerType(PointeeType,
4462                                                   TL.getSigilLoc());
4463     if (Result.isNull())
4464       return QualType();
4465   }
4466 
4467   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4468   NewT.setSigilLoc(TL.getSigilLoc());
4469   return Result;
4470 }
4471 
4472 /// Transforms a reference type.  Note that somewhat paradoxically we
4473 /// don't care whether the type itself is an l-value type or an r-value
4474 /// type;  we only care if the type was *written* as an l-value type
4475 /// or an r-value type.
4476 template<typename Derived>
4477 QualType
4478 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4479                                                ReferenceTypeLoc TL) {
4480   const ReferenceType *T = TL.getTypePtr();
4481 
4482   // Note that this works with the pointee-as-written.
4483   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4484   if (PointeeType.isNull())
4485     return QualType();
4486 
4487   QualType Result = TL.getType();
4488   if (getDerived().AlwaysRebuild() ||
4489       PointeeType != T->getPointeeTypeAsWritten()) {
4490     Result = getDerived().RebuildReferenceType(PointeeType,
4491                                                T->isSpelledAsLValue(),
4492                                                TL.getSigilLoc());
4493     if (Result.isNull())
4494       return QualType();
4495   }
4496 
4497   // Objective-C ARC can add lifetime qualifiers to the type that we're
4498   // referring to.
4499   TLB.TypeWasModifiedSafely(
4500                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4501 
4502   // r-value references can be rebuilt as l-value references.
4503   ReferenceTypeLoc NewTL;
4504   if (isa<LValueReferenceType>(Result))
4505     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4506   else
4507     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4508   NewTL.setSigilLoc(TL.getSigilLoc());
4509 
4510   return Result;
4511 }
4512 
4513 template<typename Derived>
4514 QualType
4515 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4516                                                  LValueReferenceTypeLoc TL) {
4517   return TransformReferenceType(TLB, TL);
4518 }
4519 
4520 template<typename Derived>
4521 QualType
4522 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4523                                                  RValueReferenceTypeLoc TL) {
4524   return TransformReferenceType(TLB, TL);
4525 }
4526 
4527 template<typename Derived>
4528 QualType
4529 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4530                                                    MemberPointerTypeLoc TL) {
4531   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4532   if (PointeeType.isNull())
4533     return QualType();
4534 
4535   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4536   TypeSourceInfo *NewClsTInfo = nullptr;
4537   if (OldClsTInfo) {
4538     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4539     if (!NewClsTInfo)
4540       return QualType();
4541   }
4542 
4543   const MemberPointerType *T = TL.getTypePtr();
4544   QualType OldClsType = QualType(T->getClass(), 0);
4545   QualType NewClsType;
4546   if (NewClsTInfo)
4547     NewClsType = NewClsTInfo->getType();
4548   else {
4549     NewClsType = getDerived().TransformType(OldClsType);
4550     if (NewClsType.isNull())
4551       return QualType();
4552   }
4553 
4554   QualType Result = TL.getType();
4555   if (getDerived().AlwaysRebuild() ||
4556       PointeeType != T->getPointeeType() ||
4557       NewClsType != OldClsType) {
4558     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4559                                                    TL.getStarLoc());
4560     if (Result.isNull())
4561       return QualType();
4562   }
4563 
4564   // If we had to adjust the pointee type when building a member pointer, make
4565   // sure to push TypeLoc info for it.
4566   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4567   if (MPT && PointeeType != MPT->getPointeeType()) {
4568     assert(isa<AdjustedType>(MPT->getPointeeType()));
4569     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4570   }
4571 
4572   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4573   NewTL.setSigilLoc(TL.getSigilLoc());
4574   NewTL.setClassTInfo(NewClsTInfo);
4575 
4576   return Result;
4577 }
4578 
4579 template<typename Derived>
4580 QualType
4581 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4582                                                    ConstantArrayTypeLoc TL) {
4583   const ConstantArrayType *T = TL.getTypePtr();
4584   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4585   if (ElementType.isNull())
4586     return QualType();
4587 
4588   QualType Result = TL.getType();
4589   if (getDerived().AlwaysRebuild() ||
4590       ElementType != T->getElementType()) {
4591     Result = getDerived().RebuildConstantArrayType(ElementType,
4592                                                    T->getSizeModifier(),
4593                                                    T->getSize(),
4594                                              T->getIndexTypeCVRQualifiers(),
4595                                                    TL.getBracketsRange());
4596     if (Result.isNull())
4597       return QualType();
4598   }
4599 
4600   // We might have either a ConstantArrayType or a VariableArrayType now:
4601   // a ConstantArrayType is allowed to have an element type which is a
4602   // VariableArrayType if the type is dependent.  Fortunately, all array
4603   // types have the same location layout.
4604   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4605   NewTL.setLBracketLoc(TL.getLBracketLoc());
4606   NewTL.setRBracketLoc(TL.getRBracketLoc());
4607 
4608   Expr *Size = TL.getSizeExpr();
4609   if (Size) {
4610     EnterExpressionEvaluationContext Unevaluated(
4611         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4612     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4613     Size = SemaRef.ActOnConstantExpression(Size).get();
4614   }
4615   NewTL.setSizeExpr(Size);
4616 
4617   return Result;
4618 }
4619 
4620 template<typename Derived>
4621 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4622                                               TypeLocBuilder &TLB,
4623                                               IncompleteArrayTypeLoc TL) {
4624   const IncompleteArrayType *T = TL.getTypePtr();
4625   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4626   if (ElementType.isNull())
4627     return QualType();
4628 
4629   QualType Result = TL.getType();
4630   if (getDerived().AlwaysRebuild() ||
4631       ElementType != T->getElementType()) {
4632     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4633                                                      T->getSizeModifier(),
4634                                            T->getIndexTypeCVRQualifiers(),
4635                                                      TL.getBracketsRange());
4636     if (Result.isNull())
4637       return QualType();
4638   }
4639 
4640   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4641   NewTL.setLBracketLoc(TL.getLBracketLoc());
4642   NewTL.setRBracketLoc(TL.getRBracketLoc());
4643   NewTL.setSizeExpr(nullptr);
4644 
4645   return Result;
4646 }
4647 
4648 template<typename Derived>
4649 QualType
4650 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4651                                                    VariableArrayTypeLoc TL) {
4652   const VariableArrayType *T = TL.getTypePtr();
4653   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4654   if (ElementType.isNull())
4655     return QualType();
4656 
4657   ExprResult SizeResult;
4658   {
4659     EnterExpressionEvaluationContext Context(
4660         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4661     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4662   }
4663   if (SizeResult.isInvalid())
4664     return QualType();
4665   SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get());
4666   if (SizeResult.isInvalid())
4667     return QualType();
4668 
4669   Expr *Size = SizeResult.get();
4670 
4671   QualType Result = TL.getType();
4672   if (getDerived().AlwaysRebuild() ||
4673       ElementType != T->getElementType() ||
4674       Size != T->getSizeExpr()) {
4675     Result = getDerived().RebuildVariableArrayType(ElementType,
4676                                                    T->getSizeModifier(),
4677                                                    Size,
4678                                              T->getIndexTypeCVRQualifiers(),
4679                                                    TL.getBracketsRange());
4680     if (Result.isNull())
4681       return QualType();
4682   }
4683 
4684   // We might have constant size array now, but fortunately it has the same
4685   // location layout.
4686   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4687   NewTL.setLBracketLoc(TL.getLBracketLoc());
4688   NewTL.setRBracketLoc(TL.getRBracketLoc());
4689   NewTL.setSizeExpr(Size);
4690 
4691   return Result;
4692 }
4693 
4694 template<typename Derived>
4695 QualType
4696 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4697                                              DependentSizedArrayTypeLoc TL) {
4698   const DependentSizedArrayType *T = TL.getTypePtr();
4699   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4700   if (ElementType.isNull())
4701     return QualType();
4702 
4703   // Array bounds are constant expressions.
4704   EnterExpressionEvaluationContext Unevaluated(
4705       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4706 
4707   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4708   Expr *origSize = TL.getSizeExpr();
4709   if (!origSize) origSize = T->getSizeExpr();
4710 
4711   ExprResult sizeResult
4712     = getDerived().TransformExpr(origSize);
4713   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4714   if (sizeResult.isInvalid())
4715     return QualType();
4716 
4717   Expr *size = sizeResult.get();
4718 
4719   QualType Result = TL.getType();
4720   if (getDerived().AlwaysRebuild() ||
4721       ElementType != T->getElementType() ||
4722       size != origSize) {
4723     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4724                                                          T->getSizeModifier(),
4725                                                          size,
4726                                                 T->getIndexTypeCVRQualifiers(),
4727                                                         TL.getBracketsRange());
4728     if (Result.isNull())
4729       return QualType();
4730   }
4731 
4732   // We might have any sort of array type now, but fortunately they
4733   // all have the same location layout.
4734   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4735   NewTL.setLBracketLoc(TL.getLBracketLoc());
4736   NewTL.setRBracketLoc(TL.getRBracketLoc());
4737   NewTL.setSizeExpr(size);
4738 
4739   return Result;
4740 }
4741 
4742 template<typename Derived>
4743 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4744                                       TypeLocBuilder &TLB,
4745                                       DependentSizedExtVectorTypeLoc TL) {
4746   const DependentSizedExtVectorType *T = TL.getTypePtr();
4747 
4748   // FIXME: ext vector locs should be nested
4749   QualType ElementType = getDerived().TransformType(T->getElementType());
4750   if (ElementType.isNull())
4751     return QualType();
4752 
4753   // Vector sizes are constant expressions.
4754   EnterExpressionEvaluationContext Unevaluated(
4755       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4756 
4757   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4758   Size = SemaRef.ActOnConstantExpression(Size);
4759   if (Size.isInvalid())
4760     return QualType();
4761 
4762   QualType Result = TL.getType();
4763   if (getDerived().AlwaysRebuild() ||
4764       ElementType != T->getElementType() ||
4765       Size.get() != T->getSizeExpr()) {
4766     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4767                                                              Size.get(),
4768                                                          T->getAttributeLoc());
4769     if (Result.isNull())
4770       return QualType();
4771   }
4772 
4773   // Result might be dependent or not.
4774   if (isa<DependentSizedExtVectorType>(Result)) {
4775     DependentSizedExtVectorTypeLoc NewTL
4776       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4777     NewTL.setNameLoc(TL.getNameLoc());
4778   } else {
4779     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4780     NewTL.setNameLoc(TL.getNameLoc());
4781   }
4782 
4783   return Result;
4784 }
4785 
4786 template <typename Derived>
4787 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4788     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4789   const DependentAddressSpaceType *T = TL.getTypePtr();
4790 
4791   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4792 
4793   if (pointeeType.isNull())
4794     return QualType();
4795 
4796   // Address spaces are constant expressions.
4797   EnterExpressionEvaluationContext Unevaluated(
4798       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4799 
4800   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4801   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4802   if (AddrSpace.isInvalid())
4803     return QualType();
4804 
4805   QualType Result = TL.getType();
4806   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4807       AddrSpace.get() != T->getAddrSpaceExpr()) {
4808     Result = getDerived().RebuildDependentAddressSpaceType(
4809         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4810     if (Result.isNull())
4811       return QualType();
4812   }
4813 
4814   // Result might be dependent or not.
4815   if (isa<DependentAddressSpaceType>(Result)) {
4816     DependentAddressSpaceTypeLoc NewTL =
4817         TLB.push<DependentAddressSpaceTypeLoc>(Result);
4818 
4819     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4820     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
4821     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
4822 
4823   } else {
4824     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
4825         Result, getDerived().getBaseLocation());
4826     TransformType(TLB, DI->getTypeLoc());
4827   }
4828 
4829   return Result;
4830 }
4831 
4832 template <typename Derived>
4833 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4834                                                      VectorTypeLoc TL) {
4835   const VectorType *T = TL.getTypePtr();
4836   QualType ElementType = getDerived().TransformType(T->getElementType());
4837   if (ElementType.isNull())
4838     return QualType();
4839 
4840   QualType Result = TL.getType();
4841   if (getDerived().AlwaysRebuild() ||
4842       ElementType != T->getElementType()) {
4843     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4844                                             T->getVectorKind());
4845     if (Result.isNull())
4846       return QualType();
4847   }
4848 
4849   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4850   NewTL.setNameLoc(TL.getNameLoc());
4851 
4852   return Result;
4853 }
4854 
4855 template<typename Derived>
4856 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4857                                                         ExtVectorTypeLoc TL) {
4858   const VectorType *T = TL.getTypePtr();
4859   QualType ElementType = getDerived().TransformType(T->getElementType());
4860   if (ElementType.isNull())
4861     return QualType();
4862 
4863   QualType Result = TL.getType();
4864   if (getDerived().AlwaysRebuild() ||
4865       ElementType != T->getElementType()) {
4866     Result = getDerived().RebuildExtVectorType(ElementType,
4867                                                T->getNumElements(),
4868                                                /*FIXME*/ SourceLocation());
4869     if (Result.isNull())
4870       return QualType();
4871   }
4872 
4873   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4874   NewTL.setNameLoc(TL.getNameLoc());
4875 
4876   return Result;
4877 }
4878 
4879 template <typename Derived>
4880 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4881     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4882     bool ExpectParameterPack) {
4883   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4884   TypeSourceInfo *NewDI = nullptr;
4885 
4886   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4887     // If we're substituting into a pack expansion type and we know the
4888     // length we want to expand to, just substitute for the pattern.
4889     TypeLoc OldTL = OldDI->getTypeLoc();
4890     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4891 
4892     TypeLocBuilder TLB;
4893     TypeLoc NewTL = OldDI->getTypeLoc();
4894     TLB.reserve(NewTL.getFullDataSize());
4895 
4896     QualType Result = getDerived().TransformType(TLB,
4897                                                OldExpansionTL.getPatternLoc());
4898     if (Result.isNull())
4899       return nullptr;
4900 
4901     Result = RebuildPackExpansionType(Result,
4902                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4903                                       OldExpansionTL.getEllipsisLoc(),
4904                                       NumExpansions);
4905     if (Result.isNull())
4906       return nullptr;
4907 
4908     PackExpansionTypeLoc NewExpansionTL
4909       = TLB.push<PackExpansionTypeLoc>(Result);
4910     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4911     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4912   } else
4913     NewDI = getDerived().TransformType(OldDI);
4914   if (!NewDI)
4915     return nullptr;
4916 
4917   if (NewDI == OldDI && indexAdjustment == 0)
4918     return OldParm;
4919 
4920   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4921                                              OldParm->getDeclContext(),
4922                                              OldParm->getInnerLocStart(),
4923                                              OldParm->getLocation(),
4924                                              OldParm->getIdentifier(),
4925                                              NewDI->getType(),
4926                                              NewDI,
4927                                              OldParm->getStorageClass(),
4928                                              /* DefArg */ nullptr);
4929   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4930                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4931   return newParm;
4932 }
4933 
4934 template <typename Derived>
4935 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4936     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4937     const QualType *ParamTypes,
4938     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4939     SmallVectorImpl<QualType> &OutParamTypes,
4940     SmallVectorImpl<ParmVarDecl *> *PVars,
4941     Sema::ExtParameterInfoBuilder &PInfos) {
4942   int indexAdjustment = 0;
4943 
4944   unsigned NumParams = Params.size();
4945   for (unsigned i = 0; i != NumParams; ++i) {
4946     if (ParmVarDecl *OldParm = Params[i]) {
4947       assert(OldParm->getFunctionScopeIndex() == i);
4948 
4949       Optional<unsigned> NumExpansions;
4950       ParmVarDecl *NewParm = nullptr;
4951       if (OldParm->isParameterPack()) {
4952         // We have a function parameter pack that may need to be expanded.
4953         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4954 
4955         // Find the parameter packs that could be expanded.
4956         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4957         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4958         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4959         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4960         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4961 
4962         // Determine whether we should expand the parameter packs.
4963         bool ShouldExpand = false;
4964         bool RetainExpansion = false;
4965         Optional<unsigned> OrigNumExpansions =
4966             ExpansionTL.getTypePtr()->getNumExpansions();
4967         NumExpansions = OrigNumExpansions;
4968         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4969                                                  Pattern.getSourceRange(),
4970                                                  Unexpanded,
4971                                                  ShouldExpand,
4972                                                  RetainExpansion,
4973                                                  NumExpansions)) {
4974           return true;
4975         }
4976 
4977         if (ShouldExpand) {
4978           // Expand the function parameter pack into multiple, separate
4979           // parameters.
4980           getDerived().ExpandingFunctionParameterPack(OldParm);
4981           for (unsigned I = 0; I != *NumExpansions; ++I) {
4982             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4983             ParmVarDecl *NewParm
4984               = getDerived().TransformFunctionTypeParam(OldParm,
4985                                                         indexAdjustment++,
4986                                                         OrigNumExpansions,
4987                                                 /*ExpectParameterPack=*/false);
4988             if (!NewParm)
4989               return true;
4990 
4991             if (ParamInfos)
4992               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4993             OutParamTypes.push_back(NewParm->getType());
4994             if (PVars)
4995               PVars->push_back(NewParm);
4996           }
4997 
4998           // If we're supposed to retain a pack expansion, do so by temporarily
4999           // forgetting the partially-substituted parameter pack.
5000           if (RetainExpansion) {
5001             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5002             ParmVarDecl *NewParm
5003               = getDerived().TransformFunctionTypeParam(OldParm,
5004                                                         indexAdjustment++,
5005                                                         OrigNumExpansions,
5006                                                 /*ExpectParameterPack=*/false);
5007             if (!NewParm)
5008               return true;
5009 
5010             if (ParamInfos)
5011               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5012             OutParamTypes.push_back(NewParm->getType());
5013             if (PVars)
5014               PVars->push_back(NewParm);
5015           }
5016 
5017           // The next parameter should have the same adjustment as the
5018           // last thing we pushed, but we post-incremented indexAdjustment
5019           // on every push.  Also, if we push nothing, the adjustment should
5020           // go down by one.
5021           indexAdjustment--;
5022 
5023           // We're done with the pack expansion.
5024           continue;
5025         }
5026 
5027         // We'll substitute the parameter now without expanding the pack
5028         // expansion.
5029         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5030         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5031                                                           indexAdjustment,
5032                                                           NumExpansions,
5033                                                   /*ExpectParameterPack=*/true);
5034       } else {
5035         NewParm = getDerived().TransformFunctionTypeParam(
5036             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5037       }
5038 
5039       if (!NewParm)
5040         return true;
5041 
5042       if (ParamInfos)
5043         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5044       OutParamTypes.push_back(NewParm->getType());
5045       if (PVars)
5046         PVars->push_back(NewParm);
5047       continue;
5048     }
5049 
5050     // Deal with the possibility that we don't have a parameter
5051     // declaration for this parameter.
5052     QualType OldType = ParamTypes[i];
5053     bool IsPackExpansion = false;
5054     Optional<unsigned> NumExpansions;
5055     QualType NewType;
5056     if (const PackExpansionType *Expansion
5057                                        = dyn_cast<PackExpansionType>(OldType)) {
5058       // We have a function parameter pack that may need to be expanded.
5059       QualType Pattern = Expansion->getPattern();
5060       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5061       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5062 
5063       // Determine whether we should expand the parameter packs.
5064       bool ShouldExpand = false;
5065       bool RetainExpansion = false;
5066       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5067                                                Unexpanded,
5068                                                ShouldExpand,
5069                                                RetainExpansion,
5070                                                NumExpansions)) {
5071         return true;
5072       }
5073 
5074       if (ShouldExpand) {
5075         // Expand the function parameter pack into multiple, separate
5076         // parameters.
5077         for (unsigned I = 0; I != *NumExpansions; ++I) {
5078           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5079           QualType NewType = getDerived().TransformType(Pattern);
5080           if (NewType.isNull())
5081             return true;
5082 
5083           if (NewType->containsUnexpandedParameterPack()) {
5084             NewType =
5085                 getSema().getASTContext().getPackExpansionType(NewType, None);
5086 
5087             if (NewType.isNull())
5088               return true;
5089           }
5090 
5091           if (ParamInfos)
5092             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5093           OutParamTypes.push_back(NewType);
5094           if (PVars)
5095             PVars->push_back(nullptr);
5096         }
5097 
5098         // We're done with the pack expansion.
5099         continue;
5100       }
5101 
5102       // If we're supposed to retain a pack expansion, do so by temporarily
5103       // forgetting the partially-substituted parameter pack.
5104       if (RetainExpansion) {
5105         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5106         QualType NewType = getDerived().TransformType(Pattern);
5107         if (NewType.isNull())
5108           return true;
5109 
5110         if (ParamInfos)
5111           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5112         OutParamTypes.push_back(NewType);
5113         if (PVars)
5114           PVars->push_back(nullptr);
5115       }
5116 
5117       // We'll substitute the parameter now without expanding the pack
5118       // expansion.
5119       OldType = Expansion->getPattern();
5120       IsPackExpansion = true;
5121       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5122       NewType = getDerived().TransformType(OldType);
5123     } else {
5124       NewType = getDerived().TransformType(OldType);
5125     }
5126 
5127     if (NewType.isNull())
5128       return true;
5129 
5130     if (IsPackExpansion)
5131       NewType = getSema().Context.getPackExpansionType(NewType,
5132                                                        NumExpansions);
5133 
5134     if (ParamInfos)
5135       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5136     OutParamTypes.push_back(NewType);
5137     if (PVars)
5138       PVars->push_back(nullptr);
5139   }
5140 
5141 #ifndef NDEBUG
5142   if (PVars) {
5143     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5144       if (ParmVarDecl *parm = (*PVars)[i])
5145         assert(parm->getFunctionScopeIndex() == i);
5146   }
5147 #endif
5148 
5149   return false;
5150 }
5151 
5152 template<typename Derived>
5153 QualType
5154 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5155                                                    FunctionProtoTypeLoc TL) {
5156   SmallVector<QualType, 4> ExceptionStorage;
5157   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5158   return getDerived().TransformFunctionProtoType(
5159       TLB, TL, nullptr, 0,
5160       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5161         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5162                                             ExceptionStorage, Changed);
5163       });
5164 }
5165 
5166 template<typename Derived> template<typename Fn>
5167 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5168     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5169     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
5170 
5171   // Transform the parameters and return type.
5172   //
5173   // We are required to instantiate the params and return type in source order.
5174   // When the function has a trailing return type, we instantiate the
5175   // parameters before the return type,  since the return type can then refer
5176   // to the parameters themselves (via decltype, sizeof, etc.).
5177   //
5178   SmallVector<QualType, 4> ParamTypes;
5179   SmallVector<ParmVarDecl*, 4> ParamDecls;
5180   Sema::ExtParameterInfoBuilder ExtParamInfos;
5181   const FunctionProtoType *T = TL.getTypePtr();
5182 
5183   QualType ResultType;
5184 
5185   if (T->hasTrailingReturn()) {
5186     if (getDerived().TransformFunctionTypeParams(
5187             TL.getBeginLoc(), TL.getParams(),
5188             TL.getTypePtr()->param_type_begin(),
5189             T->getExtParameterInfosOrNull(),
5190             ParamTypes, &ParamDecls, ExtParamInfos))
5191       return QualType();
5192 
5193     {
5194       // C++11 [expr.prim.general]p3:
5195       //   If a declaration declares a member function or member function
5196       //   template of a class X, the expression this is a prvalue of type
5197       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5198       //   and the end of the function-definition, member-declarator, or
5199       //   declarator.
5200       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5201 
5202       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5203       if (ResultType.isNull())
5204         return QualType();
5205     }
5206   }
5207   else {
5208     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5209     if (ResultType.isNull())
5210       return QualType();
5211 
5212     if (getDerived().TransformFunctionTypeParams(
5213             TL.getBeginLoc(), TL.getParams(),
5214             TL.getTypePtr()->param_type_begin(),
5215             T->getExtParameterInfosOrNull(),
5216             ParamTypes, &ParamDecls, ExtParamInfos))
5217       return QualType();
5218   }
5219 
5220   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5221 
5222   bool EPIChanged = false;
5223   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5224     return QualType();
5225 
5226   // Handle extended parameter information.
5227   if (auto NewExtParamInfos =
5228         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5229     if (!EPI.ExtParameterInfos ||
5230         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5231           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5232       EPIChanged = true;
5233     }
5234     EPI.ExtParameterInfos = NewExtParamInfos;
5235   } else if (EPI.ExtParameterInfos) {
5236     EPIChanged = true;
5237     EPI.ExtParameterInfos = nullptr;
5238   }
5239 
5240   QualType Result = TL.getType();
5241   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5242       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5243     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5244     if (Result.isNull())
5245       return QualType();
5246   }
5247 
5248   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5249   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5250   NewTL.setLParenLoc(TL.getLParenLoc());
5251   NewTL.setRParenLoc(TL.getRParenLoc());
5252   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5253   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5254   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5255     NewTL.setParam(i, ParamDecls[i]);
5256 
5257   return Result;
5258 }
5259 
5260 template<typename Derived>
5261 bool TreeTransform<Derived>::TransformExceptionSpec(
5262     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5263     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5264   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5265 
5266   // Instantiate a dynamic noexcept expression, if any.
5267   if (ESI.Type == EST_ComputedNoexcept) {
5268     EnterExpressionEvaluationContext Unevaluated(
5269         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5270     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5271     if (NoexceptExpr.isInvalid())
5272       return true;
5273 
5274     // FIXME: This is bogus, a noexcept expression is not a condition.
5275     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5276     if (NoexceptExpr.isInvalid())
5277       return true;
5278 
5279     if (!NoexceptExpr.get()->isValueDependent()) {
5280       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5281           NoexceptExpr.get(), nullptr,
5282           diag::err_noexcept_needs_constant_expression,
5283           /*AllowFold*/false);
5284       if (NoexceptExpr.isInvalid())
5285         return true;
5286     }
5287 
5288     if (ESI.NoexceptExpr != NoexceptExpr.get())
5289       Changed = true;
5290     ESI.NoexceptExpr = NoexceptExpr.get();
5291   }
5292 
5293   if (ESI.Type != EST_Dynamic)
5294     return false;
5295 
5296   // Instantiate a dynamic exception specification's type.
5297   for (QualType T : ESI.Exceptions) {
5298     if (const PackExpansionType *PackExpansion =
5299             T->getAs<PackExpansionType>()) {
5300       Changed = true;
5301 
5302       // We have a pack expansion. Instantiate it.
5303       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5304       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5305                                               Unexpanded);
5306       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5307 
5308       // Determine whether the set of unexpanded parameter packs can and
5309       // should
5310       // be expanded.
5311       bool Expand = false;
5312       bool RetainExpansion = false;
5313       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5314       // FIXME: Track the location of the ellipsis (and track source location
5315       // information for the types in the exception specification in general).
5316       if (getDerived().TryExpandParameterPacks(
5317               Loc, SourceRange(), Unexpanded, Expand,
5318               RetainExpansion, NumExpansions))
5319         return true;
5320 
5321       if (!Expand) {
5322         // We can't expand this pack expansion into separate arguments yet;
5323         // just substitute into the pattern and create a new pack expansion
5324         // type.
5325         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5326         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5327         if (U.isNull())
5328           return true;
5329 
5330         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5331         Exceptions.push_back(U);
5332         continue;
5333       }
5334 
5335       // Substitute into the pack expansion pattern for each slice of the
5336       // pack.
5337       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5338         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5339 
5340         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5341         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5342           return true;
5343 
5344         Exceptions.push_back(U);
5345       }
5346     } else {
5347       QualType U = getDerived().TransformType(T);
5348       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5349         return true;
5350       if (T != U)
5351         Changed = true;
5352 
5353       Exceptions.push_back(U);
5354     }
5355   }
5356 
5357   ESI.Exceptions = Exceptions;
5358   if (ESI.Exceptions.empty())
5359     ESI.Type = EST_DynamicNone;
5360   return false;
5361 }
5362 
5363 template<typename Derived>
5364 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5365                                                  TypeLocBuilder &TLB,
5366                                                  FunctionNoProtoTypeLoc TL) {
5367   const FunctionNoProtoType *T = TL.getTypePtr();
5368   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5369   if (ResultType.isNull())
5370     return QualType();
5371 
5372   QualType Result = TL.getType();
5373   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5374     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5375 
5376   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5377   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5378   NewTL.setLParenLoc(TL.getLParenLoc());
5379   NewTL.setRParenLoc(TL.getRParenLoc());
5380   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5381 
5382   return Result;
5383 }
5384 
5385 template<typename Derived> QualType
5386 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5387                                                  UnresolvedUsingTypeLoc TL) {
5388   const UnresolvedUsingType *T = TL.getTypePtr();
5389   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5390   if (!D)
5391     return QualType();
5392 
5393   QualType Result = TL.getType();
5394   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5395     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5396     if (Result.isNull())
5397       return QualType();
5398   }
5399 
5400   // We might get an arbitrary type spec type back.  We should at
5401   // least always get a type spec type, though.
5402   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5403   NewTL.setNameLoc(TL.getNameLoc());
5404 
5405   return Result;
5406 }
5407 
5408 template<typename Derived>
5409 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5410                                                       TypedefTypeLoc TL) {
5411   const TypedefType *T = TL.getTypePtr();
5412   TypedefNameDecl *Typedef
5413     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5414                                                                T->getDecl()));
5415   if (!Typedef)
5416     return QualType();
5417 
5418   QualType Result = TL.getType();
5419   if (getDerived().AlwaysRebuild() ||
5420       Typedef != T->getDecl()) {
5421     Result = getDerived().RebuildTypedefType(Typedef);
5422     if (Result.isNull())
5423       return QualType();
5424   }
5425 
5426   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5427   NewTL.setNameLoc(TL.getNameLoc());
5428 
5429   return Result;
5430 }
5431 
5432 template<typename Derived>
5433 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5434                                                       TypeOfExprTypeLoc TL) {
5435   // typeof expressions are not potentially evaluated contexts
5436   EnterExpressionEvaluationContext Unevaluated(
5437       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5438       Sema::ReuseLambdaContextDecl);
5439 
5440   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5441   if (E.isInvalid())
5442     return QualType();
5443 
5444   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5445   if (E.isInvalid())
5446     return QualType();
5447 
5448   QualType Result = TL.getType();
5449   if (getDerived().AlwaysRebuild() ||
5450       E.get() != TL.getUnderlyingExpr()) {
5451     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5452     if (Result.isNull())
5453       return QualType();
5454   }
5455   else E.get();
5456 
5457   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5458   NewTL.setTypeofLoc(TL.getTypeofLoc());
5459   NewTL.setLParenLoc(TL.getLParenLoc());
5460   NewTL.setRParenLoc(TL.getRParenLoc());
5461 
5462   return Result;
5463 }
5464 
5465 template<typename Derived>
5466 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5467                                                      TypeOfTypeLoc TL) {
5468   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5469   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5470   if (!New_Under_TI)
5471     return QualType();
5472 
5473   QualType Result = TL.getType();
5474   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5475     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5476     if (Result.isNull())
5477       return QualType();
5478   }
5479 
5480   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5481   NewTL.setTypeofLoc(TL.getTypeofLoc());
5482   NewTL.setLParenLoc(TL.getLParenLoc());
5483   NewTL.setRParenLoc(TL.getRParenLoc());
5484   NewTL.setUnderlyingTInfo(New_Under_TI);
5485 
5486   return Result;
5487 }
5488 
5489 template<typename Derived>
5490 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5491                                                        DecltypeTypeLoc TL) {
5492   const DecltypeType *T = TL.getTypePtr();
5493 
5494   // decltype expressions are not potentially evaluated contexts
5495   EnterExpressionEvaluationContext Unevaluated(
5496       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5497       /*IsDecltype=*/true);
5498 
5499   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5500   if (E.isInvalid())
5501     return QualType();
5502 
5503   E = getSema().ActOnDecltypeExpression(E.get());
5504   if (E.isInvalid())
5505     return QualType();
5506 
5507   QualType Result = TL.getType();
5508   if (getDerived().AlwaysRebuild() ||
5509       E.get() != T->getUnderlyingExpr()) {
5510     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5511     if (Result.isNull())
5512       return QualType();
5513   }
5514   else E.get();
5515 
5516   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5517   NewTL.setNameLoc(TL.getNameLoc());
5518 
5519   return Result;
5520 }
5521 
5522 template<typename Derived>
5523 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5524                                                             TypeLocBuilder &TLB,
5525                                                      UnaryTransformTypeLoc TL) {
5526   QualType Result = TL.getType();
5527   if (Result->isDependentType()) {
5528     const UnaryTransformType *T = TL.getTypePtr();
5529     QualType NewBase =
5530       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5531     Result = getDerived().RebuildUnaryTransformType(NewBase,
5532                                                     T->getUTTKind(),
5533                                                     TL.getKWLoc());
5534     if (Result.isNull())
5535       return QualType();
5536   }
5537 
5538   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5539   NewTL.setKWLoc(TL.getKWLoc());
5540   NewTL.setParensRange(TL.getParensRange());
5541   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5542   return Result;
5543 }
5544 
5545 template<typename Derived>
5546 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5547                                                    AutoTypeLoc TL) {
5548   const AutoType *T = TL.getTypePtr();
5549   QualType OldDeduced = T->getDeducedType();
5550   QualType NewDeduced;
5551   if (!OldDeduced.isNull()) {
5552     NewDeduced = getDerived().TransformType(OldDeduced);
5553     if (NewDeduced.isNull())
5554       return QualType();
5555   }
5556 
5557   QualType Result = TL.getType();
5558   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5559       T->isDependentType()) {
5560     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5561     if (Result.isNull())
5562       return QualType();
5563   }
5564 
5565   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5566   NewTL.setNameLoc(TL.getNameLoc());
5567 
5568   return Result;
5569 }
5570 
5571 template<typename Derived>
5572 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5573     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5574   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5575 
5576   CXXScopeSpec SS;
5577   TemplateName TemplateName = getDerived().TransformTemplateName(
5578       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5579   if (TemplateName.isNull())
5580     return QualType();
5581 
5582   QualType OldDeduced = T->getDeducedType();
5583   QualType NewDeduced;
5584   if (!OldDeduced.isNull()) {
5585     NewDeduced = getDerived().TransformType(OldDeduced);
5586     if (NewDeduced.isNull())
5587       return QualType();
5588   }
5589 
5590   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5591       TemplateName, NewDeduced);
5592   if (Result.isNull())
5593     return QualType();
5594 
5595   DeducedTemplateSpecializationTypeLoc NewTL =
5596       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5597   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5598 
5599   return Result;
5600 }
5601 
5602 template<typename Derived>
5603 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5604                                                      RecordTypeLoc TL) {
5605   const RecordType *T = TL.getTypePtr();
5606   RecordDecl *Record
5607     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5608                                                           T->getDecl()));
5609   if (!Record)
5610     return QualType();
5611 
5612   QualType Result = TL.getType();
5613   if (getDerived().AlwaysRebuild() ||
5614       Record != T->getDecl()) {
5615     Result = getDerived().RebuildRecordType(Record);
5616     if (Result.isNull())
5617       return QualType();
5618   }
5619 
5620   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5621   NewTL.setNameLoc(TL.getNameLoc());
5622 
5623   return Result;
5624 }
5625 
5626 template<typename Derived>
5627 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5628                                                    EnumTypeLoc TL) {
5629   const EnumType *T = TL.getTypePtr();
5630   EnumDecl *Enum
5631     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5632                                                         T->getDecl()));
5633   if (!Enum)
5634     return QualType();
5635 
5636   QualType Result = TL.getType();
5637   if (getDerived().AlwaysRebuild() ||
5638       Enum != T->getDecl()) {
5639     Result = getDerived().RebuildEnumType(Enum);
5640     if (Result.isNull())
5641       return QualType();
5642   }
5643 
5644   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5645   NewTL.setNameLoc(TL.getNameLoc());
5646 
5647   return Result;
5648 }
5649 
5650 template<typename Derived>
5651 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5652                                          TypeLocBuilder &TLB,
5653                                          InjectedClassNameTypeLoc TL) {
5654   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5655                                        TL.getTypePtr()->getDecl());
5656   if (!D) return QualType();
5657 
5658   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5659   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5660   return T;
5661 }
5662 
5663 template<typename Derived>
5664 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5665                                                 TypeLocBuilder &TLB,
5666                                                 TemplateTypeParmTypeLoc TL) {
5667   return TransformTypeSpecType(TLB, TL);
5668 }
5669 
5670 template<typename Derived>
5671 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5672                                          TypeLocBuilder &TLB,
5673                                          SubstTemplateTypeParmTypeLoc TL) {
5674   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5675 
5676   // Substitute into the replacement type, which itself might involve something
5677   // that needs to be transformed. This only tends to occur with default
5678   // template arguments of template template parameters.
5679   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5680   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5681   if (Replacement.isNull())
5682     return QualType();
5683 
5684   // Always canonicalize the replacement type.
5685   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5686   QualType Result
5687     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5688                                                    Replacement);
5689 
5690   // Propagate type-source information.
5691   SubstTemplateTypeParmTypeLoc NewTL
5692     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5693   NewTL.setNameLoc(TL.getNameLoc());
5694   return Result;
5695 
5696 }
5697 
5698 template<typename Derived>
5699 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5700                                           TypeLocBuilder &TLB,
5701                                           SubstTemplateTypeParmPackTypeLoc TL) {
5702   return TransformTypeSpecType(TLB, TL);
5703 }
5704 
5705 template<typename Derived>
5706 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5707                                                         TypeLocBuilder &TLB,
5708                                            TemplateSpecializationTypeLoc TL) {
5709   const TemplateSpecializationType *T = TL.getTypePtr();
5710 
5711   // The nested-name-specifier never matters in a TemplateSpecializationType,
5712   // because we can't have a dependent nested-name-specifier anyway.
5713   CXXScopeSpec SS;
5714   TemplateName Template
5715     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5716                                          TL.getTemplateNameLoc());
5717   if (Template.isNull())
5718     return QualType();
5719 
5720   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5721 }
5722 
5723 template<typename Derived>
5724 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5725                                                      AtomicTypeLoc TL) {
5726   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5727   if (ValueType.isNull())
5728     return QualType();
5729 
5730   QualType Result = TL.getType();
5731   if (getDerived().AlwaysRebuild() ||
5732       ValueType != TL.getValueLoc().getType()) {
5733     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5734     if (Result.isNull())
5735       return QualType();
5736   }
5737 
5738   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5739   NewTL.setKWLoc(TL.getKWLoc());
5740   NewTL.setLParenLoc(TL.getLParenLoc());
5741   NewTL.setRParenLoc(TL.getRParenLoc());
5742 
5743   return Result;
5744 }
5745 
5746 template <typename Derived>
5747 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5748                                                    PipeTypeLoc TL) {
5749   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5750   if (ValueType.isNull())
5751     return QualType();
5752 
5753   QualType Result = TL.getType();
5754   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5755     const PipeType *PT = Result->getAs<PipeType>();
5756     bool isReadPipe = PT->isReadOnly();
5757     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5758     if (Result.isNull())
5759       return QualType();
5760   }
5761 
5762   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5763   NewTL.setKWLoc(TL.getKWLoc());
5764 
5765   return Result;
5766 }
5767 
5768   /// \brief Simple iterator that traverses the template arguments in a
5769   /// container that provides a \c getArgLoc() member function.
5770   ///
5771   /// This iterator is intended to be used with the iterator form of
5772   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5773   template<typename ArgLocContainer>
5774   class TemplateArgumentLocContainerIterator {
5775     ArgLocContainer *Container;
5776     unsigned Index;
5777 
5778   public:
5779     typedef TemplateArgumentLoc value_type;
5780     typedef TemplateArgumentLoc reference;
5781     typedef int difference_type;
5782     typedef std::input_iterator_tag iterator_category;
5783 
5784     class pointer {
5785       TemplateArgumentLoc Arg;
5786 
5787     public:
5788       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5789 
5790       const TemplateArgumentLoc *operator->() const {
5791         return &Arg;
5792       }
5793     };
5794 
5795 
5796     TemplateArgumentLocContainerIterator() {}
5797 
5798     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5799                                  unsigned Index)
5800       : Container(&Container), Index(Index) { }
5801 
5802     TemplateArgumentLocContainerIterator &operator++() {
5803       ++Index;
5804       return *this;
5805     }
5806 
5807     TemplateArgumentLocContainerIterator operator++(int) {
5808       TemplateArgumentLocContainerIterator Old(*this);
5809       ++(*this);
5810       return Old;
5811     }
5812 
5813     TemplateArgumentLoc operator*() const {
5814       return Container->getArgLoc(Index);
5815     }
5816 
5817     pointer operator->() const {
5818       return pointer(Container->getArgLoc(Index));
5819     }
5820 
5821     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5822                            const TemplateArgumentLocContainerIterator &Y) {
5823       return X.Container == Y.Container && X.Index == Y.Index;
5824     }
5825 
5826     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5827                            const TemplateArgumentLocContainerIterator &Y) {
5828       return !(X == Y);
5829     }
5830   };
5831 
5832 
5833 template <typename Derived>
5834 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5835                                                         TypeLocBuilder &TLB,
5836                                            TemplateSpecializationTypeLoc TL,
5837                                                       TemplateName Template) {
5838   TemplateArgumentListInfo NewTemplateArgs;
5839   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5840   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5841   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5842     ArgIterator;
5843   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5844                                               ArgIterator(TL, TL.getNumArgs()),
5845                                               NewTemplateArgs))
5846     return QualType();
5847 
5848   // FIXME: maybe don't rebuild if all the template arguments are the same.
5849 
5850   QualType Result =
5851     getDerived().RebuildTemplateSpecializationType(Template,
5852                                                    TL.getTemplateNameLoc(),
5853                                                    NewTemplateArgs);
5854 
5855   if (!Result.isNull()) {
5856     // Specializations of template template parameters are represented as
5857     // TemplateSpecializationTypes, and substitution of type alias templates
5858     // within a dependent context can transform them into
5859     // DependentTemplateSpecializationTypes.
5860     if (isa<DependentTemplateSpecializationType>(Result)) {
5861       DependentTemplateSpecializationTypeLoc NewTL
5862         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5863       NewTL.setElaboratedKeywordLoc(SourceLocation());
5864       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5865       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5866       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5867       NewTL.setLAngleLoc(TL.getLAngleLoc());
5868       NewTL.setRAngleLoc(TL.getRAngleLoc());
5869       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5870         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5871       return Result;
5872     }
5873 
5874     TemplateSpecializationTypeLoc NewTL
5875       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5876     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5877     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5878     NewTL.setLAngleLoc(TL.getLAngleLoc());
5879     NewTL.setRAngleLoc(TL.getRAngleLoc());
5880     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5881       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5882   }
5883 
5884   return Result;
5885 }
5886 
5887 template <typename Derived>
5888 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5889                                      TypeLocBuilder &TLB,
5890                                      DependentTemplateSpecializationTypeLoc TL,
5891                                      TemplateName Template,
5892                                      CXXScopeSpec &SS) {
5893   TemplateArgumentListInfo NewTemplateArgs;
5894   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5895   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5896   typedef TemplateArgumentLocContainerIterator<
5897             DependentTemplateSpecializationTypeLoc> ArgIterator;
5898   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5899                                               ArgIterator(TL, TL.getNumArgs()),
5900                                               NewTemplateArgs))
5901     return QualType();
5902 
5903   // FIXME: maybe don't rebuild if all the template arguments are the same.
5904 
5905   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5906     QualType Result
5907       = getSema().Context.getDependentTemplateSpecializationType(
5908                                                 TL.getTypePtr()->getKeyword(),
5909                                                          DTN->getQualifier(),
5910                                                          DTN->getIdentifier(),
5911                                                                NewTemplateArgs);
5912 
5913     DependentTemplateSpecializationTypeLoc NewTL
5914       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5915     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5916     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5917     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5918     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5919     NewTL.setLAngleLoc(TL.getLAngleLoc());
5920     NewTL.setRAngleLoc(TL.getRAngleLoc());
5921     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5922       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5923     return Result;
5924   }
5925 
5926   QualType Result
5927     = getDerived().RebuildTemplateSpecializationType(Template,
5928                                                      TL.getTemplateNameLoc(),
5929                                                      NewTemplateArgs);
5930 
5931   if (!Result.isNull()) {
5932     /// FIXME: Wrap this in an elaborated-type-specifier?
5933     TemplateSpecializationTypeLoc NewTL
5934       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5935     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5936     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5937     NewTL.setLAngleLoc(TL.getLAngleLoc());
5938     NewTL.setRAngleLoc(TL.getRAngleLoc());
5939     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5940       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5941   }
5942 
5943   return Result;
5944 }
5945 
5946 template<typename Derived>
5947 QualType
5948 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5949                                                 ElaboratedTypeLoc TL) {
5950   const ElaboratedType *T = TL.getTypePtr();
5951 
5952   NestedNameSpecifierLoc QualifierLoc;
5953   // NOTE: the qualifier in an ElaboratedType is optional.
5954   if (TL.getQualifierLoc()) {
5955     QualifierLoc
5956       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5957     if (!QualifierLoc)
5958       return QualType();
5959   }
5960 
5961   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5962   if (NamedT.isNull())
5963     return QualType();
5964 
5965   // C++0x [dcl.type.elab]p2:
5966   //   If the identifier resolves to a typedef-name or the simple-template-id
5967   //   resolves to an alias template specialization, the
5968   //   elaborated-type-specifier is ill-formed.
5969   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5970     if (const TemplateSpecializationType *TST =
5971           NamedT->getAs<TemplateSpecializationType>()) {
5972       TemplateName Template = TST->getTemplateName();
5973       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5974               Template.getAsTemplateDecl())) {
5975         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5976                      diag::err_tag_reference_non_tag)
5977             << TAT << Sema::NTK_TypeAliasTemplate
5978             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5979         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5980       }
5981     }
5982   }
5983 
5984   QualType Result = TL.getType();
5985   if (getDerived().AlwaysRebuild() ||
5986       QualifierLoc != TL.getQualifierLoc() ||
5987       NamedT != T->getNamedType()) {
5988     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5989                                                 T->getKeyword(),
5990                                                 QualifierLoc, NamedT);
5991     if (Result.isNull())
5992       return QualType();
5993   }
5994 
5995   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5996   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5997   NewTL.setQualifierLoc(QualifierLoc);
5998   return Result;
5999 }
6000 
6001 template<typename Derived>
6002 QualType TreeTransform<Derived>::TransformAttributedType(
6003                                                 TypeLocBuilder &TLB,
6004                                                 AttributedTypeLoc TL) {
6005   const AttributedType *oldType = TL.getTypePtr();
6006   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6007   if (modifiedType.isNull())
6008     return QualType();
6009 
6010   QualType result = TL.getType();
6011 
6012   // FIXME: dependent operand expressions?
6013   if (getDerived().AlwaysRebuild() ||
6014       modifiedType != oldType->getModifiedType()) {
6015     // TODO: this is really lame; we should really be rebuilding the
6016     // equivalent type from first principles.
6017     QualType equivalentType
6018       = getDerived().TransformType(oldType->getEquivalentType());
6019     if (equivalentType.isNull())
6020       return QualType();
6021 
6022     // Check whether we can add nullability; it is only represented as
6023     // type sugar, and therefore cannot be diagnosed in any other way.
6024     if (auto nullability = oldType->getImmediateNullability()) {
6025       if (!modifiedType->canHaveNullability()) {
6026         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
6027           << DiagNullabilityKind(*nullability, false) << modifiedType;
6028         return QualType();
6029       }
6030     }
6031 
6032     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
6033                                                modifiedType,
6034                                                equivalentType);
6035   }
6036 
6037   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6038   newTL.setAttrNameLoc(TL.getAttrNameLoc());
6039   if (TL.hasAttrOperand())
6040     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
6041   if (TL.hasAttrExprOperand())
6042     newTL.setAttrExprOperand(TL.getAttrExprOperand());
6043   else if (TL.hasAttrEnumOperand())
6044     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
6045 
6046   return result;
6047 }
6048 
6049 template<typename Derived>
6050 QualType
6051 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6052                                            ParenTypeLoc TL) {
6053   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6054   if (Inner.isNull())
6055     return QualType();
6056 
6057   QualType Result = TL.getType();
6058   if (getDerived().AlwaysRebuild() ||
6059       Inner != TL.getInnerLoc().getType()) {
6060     Result = getDerived().RebuildParenType(Inner);
6061     if (Result.isNull())
6062       return QualType();
6063   }
6064 
6065   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6066   NewTL.setLParenLoc(TL.getLParenLoc());
6067   NewTL.setRParenLoc(TL.getRParenLoc());
6068   return Result;
6069 }
6070 
6071 template<typename Derived>
6072 QualType TreeTransform<Derived>::TransformDependentNameType(
6073     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6074   return TransformDependentNameType(TLB, TL, false);
6075 }
6076 
6077 template<typename Derived>
6078 QualType TreeTransform<Derived>::TransformDependentNameType(
6079     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6080   const DependentNameType *T = TL.getTypePtr();
6081 
6082   NestedNameSpecifierLoc QualifierLoc
6083     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6084   if (!QualifierLoc)
6085     return QualType();
6086 
6087   QualType Result
6088     = getDerived().RebuildDependentNameType(T->getKeyword(),
6089                                             TL.getElaboratedKeywordLoc(),
6090                                             QualifierLoc,
6091                                             T->getIdentifier(),
6092                                             TL.getNameLoc(),
6093                                             DeducedTSTContext);
6094   if (Result.isNull())
6095     return QualType();
6096 
6097   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6098     QualType NamedT = ElabT->getNamedType();
6099     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6100 
6101     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6102     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6103     NewTL.setQualifierLoc(QualifierLoc);
6104   } else {
6105     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6106     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6107     NewTL.setQualifierLoc(QualifierLoc);
6108     NewTL.setNameLoc(TL.getNameLoc());
6109   }
6110   return Result;
6111 }
6112 
6113 template<typename Derived>
6114 QualType TreeTransform<Derived>::
6115           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6116                                  DependentTemplateSpecializationTypeLoc TL) {
6117   NestedNameSpecifierLoc QualifierLoc;
6118   if (TL.getQualifierLoc()) {
6119     QualifierLoc
6120       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6121     if (!QualifierLoc)
6122       return QualType();
6123   }
6124 
6125   return getDerived()
6126            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6127 }
6128 
6129 template<typename Derived>
6130 QualType TreeTransform<Derived>::
6131 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6132                                    DependentTemplateSpecializationTypeLoc TL,
6133                                        NestedNameSpecifierLoc QualifierLoc) {
6134   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6135 
6136   TemplateArgumentListInfo NewTemplateArgs;
6137   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6138   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6139 
6140   typedef TemplateArgumentLocContainerIterator<
6141   DependentTemplateSpecializationTypeLoc> ArgIterator;
6142   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6143                                               ArgIterator(TL, TL.getNumArgs()),
6144                                               NewTemplateArgs))
6145     return QualType();
6146 
6147   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6148       T->getKeyword(), QualifierLoc, T->getIdentifier(),
6149       TL.getTemplateNameLoc(), NewTemplateArgs,
6150       /*AllowInjectedClassName*/ false);
6151   if (Result.isNull())
6152     return QualType();
6153 
6154   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6155     QualType NamedT = ElabT->getNamedType();
6156 
6157     // Copy information relevant to the template specialization.
6158     TemplateSpecializationTypeLoc NamedTL
6159       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6160     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6161     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6162     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6163     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6164     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6165       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6166 
6167     // Copy information relevant to the elaborated type.
6168     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6169     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6170     NewTL.setQualifierLoc(QualifierLoc);
6171   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6172     DependentTemplateSpecializationTypeLoc SpecTL
6173       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6174     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6175     SpecTL.setQualifierLoc(QualifierLoc);
6176     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6177     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6178     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6179     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6180     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6181       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6182   } else {
6183     TemplateSpecializationTypeLoc SpecTL
6184       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6185     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6186     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6187     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6188     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6189     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6190       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6191   }
6192   return Result;
6193 }
6194 
6195 template<typename Derived>
6196 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6197                                                       PackExpansionTypeLoc TL) {
6198   QualType Pattern
6199     = getDerived().TransformType(TLB, TL.getPatternLoc());
6200   if (Pattern.isNull())
6201     return QualType();
6202 
6203   QualType Result = TL.getType();
6204   if (getDerived().AlwaysRebuild() ||
6205       Pattern != TL.getPatternLoc().getType()) {
6206     Result = getDerived().RebuildPackExpansionType(Pattern,
6207                                            TL.getPatternLoc().getSourceRange(),
6208                                                    TL.getEllipsisLoc(),
6209                                            TL.getTypePtr()->getNumExpansions());
6210     if (Result.isNull())
6211       return QualType();
6212   }
6213 
6214   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6215   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6216   return Result;
6217 }
6218 
6219 template<typename Derived>
6220 QualType
6221 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6222                                                    ObjCInterfaceTypeLoc TL) {
6223   // ObjCInterfaceType is never dependent.
6224   TLB.pushFullCopy(TL);
6225   return TL.getType();
6226 }
6227 
6228 template<typename Derived>
6229 QualType
6230 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6231                                                    ObjCTypeParamTypeLoc TL) {
6232   const ObjCTypeParamType *T = TL.getTypePtr();
6233   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6234       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6235   if (!OTP)
6236     return QualType();
6237 
6238   QualType Result = TL.getType();
6239   if (getDerived().AlwaysRebuild() ||
6240       OTP != T->getDecl()) {
6241     Result = getDerived().RebuildObjCTypeParamType(OTP,
6242                  TL.getProtocolLAngleLoc(),
6243                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6244                                     TL.getNumProtocols()),
6245                  TL.getProtocolLocs(),
6246                  TL.getProtocolRAngleLoc());
6247     if (Result.isNull())
6248       return QualType();
6249   }
6250 
6251   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6252   if (TL.getNumProtocols()) {
6253     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6254     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6255       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6256     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6257   }
6258   return Result;
6259 }
6260 
6261 template<typename Derived>
6262 QualType
6263 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6264                                                 ObjCObjectTypeLoc TL) {
6265   // Transform base type.
6266   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6267   if (BaseType.isNull())
6268     return QualType();
6269 
6270   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6271 
6272   // Transform type arguments.
6273   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6274   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6275     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6276     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6277     QualType TypeArg = TypeArgInfo->getType();
6278     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6279       AnyChanged = true;
6280 
6281       // We have a pack expansion. Instantiate it.
6282       const auto *PackExpansion = PackExpansionLoc.getType()
6283                                     ->castAs<PackExpansionType>();
6284       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6285       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6286                                               Unexpanded);
6287       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6288 
6289       // Determine whether the set of unexpanded parameter packs can
6290       // and should be expanded.
6291       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6292       bool Expand = false;
6293       bool RetainExpansion = false;
6294       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6295       if (getDerived().TryExpandParameterPacks(
6296             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6297             Unexpanded, Expand, RetainExpansion, NumExpansions))
6298         return QualType();
6299 
6300       if (!Expand) {
6301         // We can't expand this pack expansion into separate arguments yet;
6302         // just substitute into the pattern and create a new pack expansion
6303         // type.
6304         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6305 
6306         TypeLocBuilder TypeArgBuilder;
6307         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6308         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6309                                                              PatternLoc);
6310         if (NewPatternType.isNull())
6311           return QualType();
6312 
6313         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6314                                       NewPatternType, NumExpansions);
6315         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6316         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6317         NewTypeArgInfos.push_back(
6318           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6319         continue;
6320       }
6321 
6322       // Substitute into the pack expansion pattern for each slice of the
6323       // pack.
6324       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6325         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6326 
6327         TypeLocBuilder TypeArgBuilder;
6328         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6329 
6330         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6331                                                          PatternLoc);
6332         if (NewTypeArg.isNull())
6333           return QualType();
6334 
6335         NewTypeArgInfos.push_back(
6336           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6337       }
6338 
6339       continue;
6340     }
6341 
6342     TypeLocBuilder TypeArgBuilder;
6343     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6344     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6345     if (NewTypeArg.isNull())
6346       return QualType();
6347 
6348     // If nothing changed, just keep the old TypeSourceInfo.
6349     if (NewTypeArg == TypeArg) {
6350       NewTypeArgInfos.push_back(TypeArgInfo);
6351       continue;
6352     }
6353 
6354     NewTypeArgInfos.push_back(
6355       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6356     AnyChanged = true;
6357   }
6358 
6359   QualType Result = TL.getType();
6360   if (getDerived().AlwaysRebuild() || AnyChanged) {
6361     // Rebuild the type.
6362     Result = getDerived().RebuildObjCObjectType(
6363                BaseType,
6364                TL.getLocStart(),
6365                TL.getTypeArgsLAngleLoc(),
6366                NewTypeArgInfos,
6367                TL.getTypeArgsRAngleLoc(),
6368                TL.getProtocolLAngleLoc(),
6369                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6370                                   TL.getNumProtocols()),
6371                TL.getProtocolLocs(),
6372                TL.getProtocolRAngleLoc());
6373 
6374     if (Result.isNull())
6375       return QualType();
6376   }
6377 
6378   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6379   NewT.setHasBaseTypeAsWritten(true);
6380   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6381   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6382     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6383   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6384   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6385   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6386     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6387   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6388   return Result;
6389 }
6390 
6391 template<typename Derived>
6392 QualType
6393 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6394                                                ObjCObjectPointerTypeLoc TL) {
6395   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6396   if (PointeeType.isNull())
6397     return QualType();
6398 
6399   QualType Result = TL.getType();
6400   if (getDerived().AlwaysRebuild() ||
6401       PointeeType != TL.getPointeeLoc().getType()) {
6402     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6403                                                        TL.getStarLoc());
6404     if (Result.isNull())
6405       return QualType();
6406   }
6407 
6408   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6409   NewT.setStarLoc(TL.getStarLoc());
6410   return Result;
6411 }
6412 
6413 //===----------------------------------------------------------------------===//
6414 // Statement transformation
6415 //===----------------------------------------------------------------------===//
6416 template<typename Derived>
6417 StmtResult
6418 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6419   return S;
6420 }
6421 
6422 template<typename Derived>
6423 StmtResult
6424 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6425   return getDerived().TransformCompoundStmt(S, false);
6426 }
6427 
6428 template<typename Derived>
6429 StmtResult
6430 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6431                                               bool IsStmtExpr) {
6432   Sema::CompoundScopeRAII CompoundScope(getSema());
6433 
6434   bool SubStmtInvalid = false;
6435   bool SubStmtChanged = false;
6436   SmallVector<Stmt*, 8> Statements;
6437   for (auto *B : S->body()) {
6438     StmtResult Result = getDerived().TransformStmt(B);
6439     if (Result.isInvalid()) {
6440       // Immediately fail if this was a DeclStmt, since it's very
6441       // likely that this will cause problems for future statements.
6442       if (isa<DeclStmt>(B))
6443         return StmtError();
6444 
6445       // Otherwise, just keep processing substatements and fail later.
6446       SubStmtInvalid = true;
6447       continue;
6448     }
6449 
6450     SubStmtChanged = SubStmtChanged || Result.get() != B;
6451     Statements.push_back(Result.getAs<Stmt>());
6452   }
6453 
6454   if (SubStmtInvalid)
6455     return StmtError();
6456 
6457   if (!getDerived().AlwaysRebuild() &&
6458       !SubStmtChanged)
6459     return S;
6460 
6461   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6462                                           Statements,
6463                                           S->getRBracLoc(),
6464                                           IsStmtExpr);
6465 }
6466 
6467 template<typename Derived>
6468 StmtResult
6469 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6470   ExprResult LHS, RHS;
6471   {
6472     EnterExpressionEvaluationContext Unevaluated(
6473         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6474 
6475     // Transform the left-hand case value.
6476     LHS = getDerived().TransformExpr(S->getLHS());
6477     LHS = SemaRef.ActOnConstantExpression(LHS);
6478     if (LHS.isInvalid())
6479       return StmtError();
6480 
6481     // Transform the right-hand case value (for the GNU case-range extension).
6482     RHS = getDerived().TransformExpr(S->getRHS());
6483     RHS = SemaRef.ActOnConstantExpression(RHS);
6484     if (RHS.isInvalid())
6485       return StmtError();
6486   }
6487 
6488   // Build the case statement.
6489   // Case statements are always rebuilt so that they will attached to their
6490   // transformed switch statement.
6491   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6492                                                        LHS.get(),
6493                                                        S->getEllipsisLoc(),
6494                                                        RHS.get(),
6495                                                        S->getColonLoc());
6496   if (Case.isInvalid())
6497     return StmtError();
6498 
6499   // Transform the statement following the case
6500   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6501   if (SubStmt.isInvalid())
6502     return StmtError();
6503 
6504   // Attach the body to the case statement
6505   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6506 }
6507 
6508 template<typename Derived>
6509 StmtResult
6510 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6511   // Transform the statement following the default case
6512   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6513   if (SubStmt.isInvalid())
6514     return StmtError();
6515 
6516   // Default statements are always rebuilt
6517   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6518                                          SubStmt.get());
6519 }
6520 
6521 template<typename Derived>
6522 StmtResult
6523 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6524   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6525   if (SubStmt.isInvalid())
6526     return StmtError();
6527 
6528   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6529                                         S->getDecl());
6530   if (!LD)
6531     return StmtError();
6532 
6533 
6534   // FIXME: Pass the real colon location in.
6535   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6536                                        cast<LabelDecl>(LD), SourceLocation(),
6537                                        SubStmt.get());
6538 }
6539 
6540 template <typename Derived>
6541 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6542   if (!R)
6543     return R;
6544 
6545   switch (R->getKind()) {
6546 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6547 #define ATTR(X)
6548 #define PRAGMA_SPELLING_ATTR(X)                                                \
6549   case attr::X:                                                                \
6550     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6551 #include "clang/Basic/AttrList.inc"
6552   default:
6553     return R;
6554   }
6555 }
6556 
6557 template <typename Derived>
6558 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6559   bool AttrsChanged = false;
6560   SmallVector<const Attr *, 1> Attrs;
6561 
6562   // Visit attributes and keep track if any are transformed.
6563   for (const auto *I : S->getAttrs()) {
6564     const Attr *R = getDerived().TransformAttr(I);
6565     AttrsChanged |= (I != R);
6566     Attrs.push_back(R);
6567   }
6568 
6569   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6570   if (SubStmt.isInvalid())
6571     return StmtError();
6572 
6573   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6574     return S;
6575 
6576   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6577                                             SubStmt.get());
6578 }
6579 
6580 template<typename Derived>
6581 StmtResult
6582 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6583   // Transform the initialization statement
6584   StmtResult Init = getDerived().TransformStmt(S->getInit());
6585   if (Init.isInvalid())
6586     return StmtError();
6587 
6588   // Transform the condition
6589   Sema::ConditionResult Cond = getDerived().TransformCondition(
6590       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6591       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6592                        : Sema::ConditionKind::Boolean);
6593   if (Cond.isInvalid())
6594     return StmtError();
6595 
6596   // If this is a constexpr if, determine which arm we should instantiate.
6597   llvm::Optional<bool> ConstexprConditionValue;
6598   if (S->isConstexpr())
6599     ConstexprConditionValue = Cond.getKnownValue();
6600 
6601   // Transform the "then" branch.
6602   StmtResult Then;
6603   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6604     Then = getDerived().TransformStmt(S->getThen());
6605     if (Then.isInvalid())
6606       return StmtError();
6607   } else {
6608     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6609   }
6610 
6611   // Transform the "else" branch.
6612   StmtResult Else;
6613   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6614     Else = getDerived().TransformStmt(S->getElse());
6615     if (Else.isInvalid())
6616       return StmtError();
6617   }
6618 
6619   if (!getDerived().AlwaysRebuild() &&
6620       Init.get() == S->getInit() &&
6621       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6622       Then.get() == S->getThen() &&
6623       Else.get() == S->getElse())
6624     return S;
6625 
6626   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6627                                     Init.get(), Then.get(), S->getElseLoc(),
6628                                     Else.get());
6629 }
6630 
6631 template<typename Derived>
6632 StmtResult
6633 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6634   // Transform the initialization statement
6635   StmtResult Init = getDerived().TransformStmt(S->getInit());
6636   if (Init.isInvalid())
6637     return StmtError();
6638 
6639   // Transform the condition.
6640   Sema::ConditionResult Cond = getDerived().TransformCondition(
6641       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6642       Sema::ConditionKind::Switch);
6643   if (Cond.isInvalid())
6644     return StmtError();
6645 
6646   // Rebuild the switch statement.
6647   StmtResult Switch
6648     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6649   if (Switch.isInvalid())
6650     return StmtError();
6651 
6652   // Transform the body of the switch statement.
6653   StmtResult Body = getDerived().TransformStmt(S->getBody());
6654   if (Body.isInvalid())
6655     return StmtError();
6656 
6657   // Complete the switch statement.
6658   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6659                                             Body.get());
6660 }
6661 
6662 template<typename Derived>
6663 StmtResult
6664 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6665   // Transform the condition
6666   Sema::ConditionResult Cond = getDerived().TransformCondition(
6667       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6668       Sema::ConditionKind::Boolean);
6669   if (Cond.isInvalid())
6670     return StmtError();
6671 
6672   // Transform the body
6673   StmtResult Body = getDerived().TransformStmt(S->getBody());
6674   if (Body.isInvalid())
6675     return StmtError();
6676 
6677   if (!getDerived().AlwaysRebuild() &&
6678       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6679       Body.get() == S->getBody())
6680     return Owned(S);
6681 
6682   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6683 }
6684 
6685 template<typename Derived>
6686 StmtResult
6687 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6688   // Transform the body
6689   StmtResult Body = getDerived().TransformStmt(S->getBody());
6690   if (Body.isInvalid())
6691     return StmtError();
6692 
6693   // Transform the condition
6694   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6695   if (Cond.isInvalid())
6696     return StmtError();
6697 
6698   if (!getDerived().AlwaysRebuild() &&
6699       Cond.get() == S->getCond() &&
6700       Body.get() == S->getBody())
6701     return S;
6702 
6703   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6704                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6705                                     S->getRParenLoc());
6706 }
6707 
6708 template<typename Derived>
6709 StmtResult
6710 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6711   // Transform the initialization statement
6712   StmtResult Init = getDerived().TransformStmt(S->getInit());
6713   if (Init.isInvalid())
6714     return StmtError();
6715 
6716   // In OpenMP loop region loop control variable must be captured and be
6717   // private. Perform analysis of first part (if any).
6718   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6719     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6720 
6721   // Transform the condition
6722   Sema::ConditionResult Cond = getDerived().TransformCondition(
6723       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6724       Sema::ConditionKind::Boolean);
6725   if (Cond.isInvalid())
6726     return StmtError();
6727 
6728   // Transform the increment
6729   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6730   if (Inc.isInvalid())
6731     return StmtError();
6732 
6733   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6734   if (S->getInc() && !FullInc.get())
6735     return StmtError();
6736 
6737   // Transform the body
6738   StmtResult Body = getDerived().TransformStmt(S->getBody());
6739   if (Body.isInvalid())
6740     return StmtError();
6741 
6742   if (!getDerived().AlwaysRebuild() &&
6743       Init.get() == S->getInit() &&
6744       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6745       Inc.get() == S->getInc() &&
6746       Body.get() == S->getBody())
6747     return S;
6748 
6749   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6750                                      Init.get(), Cond, FullInc,
6751                                      S->getRParenLoc(), Body.get());
6752 }
6753 
6754 template<typename Derived>
6755 StmtResult
6756 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6757   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6758                                         S->getLabel());
6759   if (!LD)
6760     return StmtError();
6761 
6762   // Goto statements must always be rebuilt, to resolve the label.
6763   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6764                                       cast<LabelDecl>(LD));
6765 }
6766 
6767 template<typename Derived>
6768 StmtResult
6769 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6770   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6771   if (Target.isInvalid())
6772     return StmtError();
6773   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6774 
6775   if (!getDerived().AlwaysRebuild() &&
6776       Target.get() == S->getTarget())
6777     return S;
6778 
6779   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6780                                               Target.get());
6781 }
6782 
6783 template<typename Derived>
6784 StmtResult
6785 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6786   return S;
6787 }
6788 
6789 template<typename Derived>
6790 StmtResult
6791 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6792   return S;
6793 }
6794 
6795 template<typename Derived>
6796 StmtResult
6797 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6798   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6799                                                         /*NotCopyInit*/false);
6800   if (Result.isInvalid())
6801     return StmtError();
6802 
6803   // FIXME: We always rebuild the return statement because there is no way
6804   // to tell whether the return type of the function has changed.
6805   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6806 }
6807 
6808 template<typename Derived>
6809 StmtResult
6810 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6811   bool DeclChanged = false;
6812   SmallVector<Decl *, 4> Decls;
6813   for (auto *D : S->decls()) {
6814     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6815     if (!Transformed)
6816       return StmtError();
6817 
6818     if (Transformed != D)
6819       DeclChanged = true;
6820 
6821     Decls.push_back(Transformed);
6822   }
6823 
6824   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6825     return S;
6826 
6827   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6828 }
6829 
6830 template<typename Derived>
6831 StmtResult
6832 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6833 
6834   SmallVector<Expr*, 8> Constraints;
6835   SmallVector<Expr*, 8> Exprs;
6836   SmallVector<IdentifierInfo *, 4> Names;
6837 
6838   ExprResult AsmString;
6839   SmallVector<Expr*, 8> Clobbers;
6840 
6841   bool ExprsChanged = false;
6842 
6843   // Go through the outputs.
6844   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6845     Names.push_back(S->getOutputIdentifier(I));
6846 
6847     // No need to transform the constraint literal.
6848     Constraints.push_back(S->getOutputConstraintLiteral(I));
6849 
6850     // Transform the output expr.
6851     Expr *OutputExpr = S->getOutputExpr(I);
6852     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6853     if (Result.isInvalid())
6854       return StmtError();
6855 
6856     ExprsChanged |= Result.get() != OutputExpr;
6857 
6858     Exprs.push_back(Result.get());
6859   }
6860 
6861   // Go through the inputs.
6862   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6863     Names.push_back(S->getInputIdentifier(I));
6864 
6865     // No need to transform the constraint literal.
6866     Constraints.push_back(S->getInputConstraintLiteral(I));
6867 
6868     // Transform the input expr.
6869     Expr *InputExpr = S->getInputExpr(I);
6870     ExprResult Result = getDerived().TransformExpr(InputExpr);
6871     if (Result.isInvalid())
6872       return StmtError();
6873 
6874     ExprsChanged |= Result.get() != InputExpr;
6875 
6876     Exprs.push_back(Result.get());
6877   }
6878 
6879   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6880     return S;
6881 
6882   // Go through the clobbers.
6883   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6884     Clobbers.push_back(S->getClobberStringLiteral(I));
6885 
6886   // No need to transform the asm string literal.
6887   AsmString = S->getAsmString();
6888   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6889                                         S->isVolatile(), S->getNumOutputs(),
6890                                         S->getNumInputs(), Names.data(),
6891                                         Constraints, Exprs, AsmString.get(),
6892                                         Clobbers, S->getRParenLoc());
6893 }
6894 
6895 template<typename Derived>
6896 StmtResult
6897 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6898   ArrayRef<Token> AsmToks =
6899     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6900 
6901   bool HadError = false, HadChange = false;
6902 
6903   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6904   SmallVector<Expr*, 8> TransformedExprs;
6905   TransformedExprs.reserve(SrcExprs.size());
6906   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6907     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6908     if (!Result.isUsable()) {
6909       HadError = true;
6910     } else {
6911       HadChange |= (Result.get() != SrcExprs[i]);
6912       TransformedExprs.push_back(Result.get());
6913     }
6914   }
6915 
6916   if (HadError) return StmtError();
6917   if (!HadChange && !getDerived().AlwaysRebuild())
6918     return Owned(S);
6919 
6920   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6921                                        AsmToks, S->getAsmString(),
6922                                        S->getNumOutputs(), S->getNumInputs(),
6923                                        S->getAllConstraints(), S->getClobbers(),
6924                                        TransformedExprs, S->getEndLoc());
6925 }
6926 
6927 // C++ Coroutines TS
6928 
6929 template<typename Derived>
6930 StmtResult
6931 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6932   auto *ScopeInfo = SemaRef.getCurFunction();
6933   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
6934   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
6935          ScopeInfo->NeedsCoroutineSuspends &&
6936          ScopeInfo->CoroutineSuspends.first == nullptr &&
6937          ScopeInfo->CoroutineSuspends.second == nullptr &&
6938          "expected clean scope info");
6939 
6940   // Set that we have (possibly-invalid) suspend points before we do anything
6941   // that may fail.
6942   ScopeInfo->setNeedsCoroutineSuspends(false);
6943 
6944   // The new CoroutinePromise object needs to be built and put into the current
6945   // FunctionScopeInfo before any transformations or rebuilding occurs.
6946   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
6947     return StmtError();
6948   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
6949   if (!Promise)
6950     return StmtError();
6951   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
6952   ScopeInfo->CoroutinePromise = Promise;
6953 
6954   // Transform the implicit coroutine statements we built during the initial
6955   // parse.
6956   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
6957   if (InitSuspend.isInvalid())
6958     return StmtError();
6959   StmtResult FinalSuspend =
6960       getDerived().TransformStmt(S->getFinalSuspendStmt());
6961   if (FinalSuspend.isInvalid())
6962     return StmtError();
6963   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
6964   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
6965 
6966   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
6967   if (BodyRes.isInvalid())
6968     return StmtError();
6969 
6970   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
6971   if (Builder.isInvalid())
6972     return StmtError();
6973 
6974   Expr *ReturnObject = S->getReturnValueInit();
6975   assert(ReturnObject && "the return object is expected to be valid");
6976   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
6977                                                      /*NoCopyInit*/ false);
6978   if (Res.isInvalid())
6979     return StmtError();
6980   Builder.ReturnValue = Res.get();
6981 
6982   if (S->hasDependentPromiseType()) {
6983     assert(!Promise->getType()->isDependentType() &&
6984            "the promise type must no longer be dependent");
6985     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
6986            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
6987            "these nodes should not have been built yet");
6988     if (!Builder.buildDependentStatements())
6989       return StmtError();
6990   } else {
6991     if (auto *OnFallthrough = S->getFallthroughHandler()) {
6992       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
6993       if (Res.isInvalid())
6994         return StmtError();
6995       Builder.OnFallthrough = Res.get();
6996     }
6997 
6998     if (auto *OnException = S->getExceptionHandler()) {
6999       StmtResult Res = getDerived().TransformStmt(OnException);
7000       if (Res.isInvalid())
7001         return StmtError();
7002       Builder.OnException = Res.get();
7003     }
7004 
7005     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7006       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7007       if (Res.isInvalid())
7008         return StmtError();
7009       Builder.ReturnStmtOnAllocFailure = Res.get();
7010     }
7011 
7012     // Transform any additional statements we may have already built
7013     assert(S->getAllocate() && S->getDeallocate() &&
7014            "allocation and deallocation calls must already be built");
7015     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7016     if (AllocRes.isInvalid())
7017       return StmtError();
7018     Builder.Allocate = AllocRes.get();
7019 
7020     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7021     if (DeallocRes.isInvalid())
7022       return StmtError();
7023     Builder.Deallocate = DeallocRes.get();
7024 
7025     assert(S->getResultDecl() && "ResultDecl must already be built");
7026     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7027     if (ResultDecl.isInvalid())
7028       return StmtError();
7029     Builder.ResultDecl = ResultDecl.get();
7030 
7031     if (auto *ReturnStmt = S->getReturnStmt()) {
7032       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7033       if (Res.isInvalid())
7034         return StmtError();
7035       Builder.ReturnStmt = Res.get();
7036     }
7037   }
7038 
7039   return getDerived().RebuildCoroutineBodyStmt(Builder);
7040 }
7041 
7042 template<typename Derived>
7043 StmtResult
7044 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7045   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7046                                                         /*NotCopyInit*/false);
7047   if (Result.isInvalid())
7048     return StmtError();
7049 
7050   // Always rebuild; we don't know if this needs to be injected into a new
7051   // context or if the promise type has changed.
7052   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7053                                           S->isImplicit());
7054 }
7055 
7056 template<typename Derived>
7057 ExprResult
7058 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7059   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7060                                                         /*NotCopyInit*/false);
7061   if (Result.isInvalid())
7062     return ExprError();
7063 
7064   // Always rebuild; we don't know if this needs to be injected into a new
7065   // context or if the promise type has changed.
7066   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7067                                          E->isImplicit());
7068 }
7069 
7070 template <typename Derived>
7071 ExprResult
7072 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7073   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7074                                                         /*NotCopyInit*/ false);
7075   if (OperandResult.isInvalid())
7076     return ExprError();
7077 
7078   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7079           E->getOperatorCoawaitLookup());
7080 
7081   if (LookupResult.isInvalid())
7082     return ExprError();
7083 
7084   // Always rebuild; we don't know if this needs to be injected into a new
7085   // context or if the promise type has changed.
7086   return getDerived().RebuildDependentCoawaitExpr(
7087       E->getKeywordLoc(), OperandResult.get(),
7088       cast<UnresolvedLookupExpr>(LookupResult.get()));
7089 }
7090 
7091 template<typename Derived>
7092 ExprResult
7093 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7094   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7095                                                         /*NotCopyInit*/false);
7096   if (Result.isInvalid())
7097     return ExprError();
7098 
7099   // Always rebuild; we don't know if this needs to be injected into a new
7100   // context or if the promise type has changed.
7101   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7102 }
7103 
7104 // Objective-C Statements.
7105 
7106 template<typename Derived>
7107 StmtResult
7108 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7109   // Transform the body of the @try.
7110   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7111   if (TryBody.isInvalid())
7112     return StmtError();
7113 
7114   // Transform the @catch statements (if present).
7115   bool AnyCatchChanged = false;
7116   SmallVector<Stmt*, 8> CatchStmts;
7117   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7118     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7119     if (Catch.isInvalid())
7120       return StmtError();
7121     if (Catch.get() != S->getCatchStmt(I))
7122       AnyCatchChanged = true;
7123     CatchStmts.push_back(Catch.get());
7124   }
7125 
7126   // Transform the @finally statement (if present).
7127   StmtResult Finally;
7128   if (S->getFinallyStmt()) {
7129     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7130     if (Finally.isInvalid())
7131       return StmtError();
7132   }
7133 
7134   // If nothing changed, just retain this statement.
7135   if (!getDerived().AlwaysRebuild() &&
7136       TryBody.get() == S->getTryBody() &&
7137       !AnyCatchChanged &&
7138       Finally.get() == S->getFinallyStmt())
7139     return S;
7140 
7141   // Build a new statement.
7142   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7143                                            CatchStmts, Finally.get());
7144 }
7145 
7146 template<typename Derived>
7147 StmtResult
7148 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7149   // Transform the @catch parameter, if there is one.
7150   VarDecl *Var = nullptr;
7151   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7152     TypeSourceInfo *TSInfo = nullptr;
7153     if (FromVar->getTypeSourceInfo()) {
7154       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7155       if (!TSInfo)
7156         return StmtError();
7157     }
7158 
7159     QualType T;
7160     if (TSInfo)
7161       T = TSInfo->getType();
7162     else {
7163       T = getDerived().TransformType(FromVar->getType());
7164       if (T.isNull())
7165         return StmtError();
7166     }
7167 
7168     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7169     if (!Var)
7170       return StmtError();
7171   }
7172 
7173   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7174   if (Body.isInvalid())
7175     return StmtError();
7176 
7177   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7178                                              S->getRParenLoc(),
7179                                              Var, Body.get());
7180 }
7181 
7182 template<typename Derived>
7183 StmtResult
7184 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7185   // Transform the body.
7186   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7187   if (Body.isInvalid())
7188     return StmtError();
7189 
7190   // If nothing changed, just retain this statement.
7191   if (!getDerived().AlwaysRebuild() &&
7192       Body.get() == S->getFinallyBody())
7193     return S;
7194 
7195   // Build a new statement.
7196   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7197                                                Body.get());
7198 }
7199 
7200 template<typename Derived>
7201 StmtResult
7202 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7203   ExprResult Operand;
7204   if (S->getThrowExpr()) {
7205     Operand = getDerived().TransformExpr(S->getThrowExpr());
7206     if (Operand.isInvalid())
7207       return StmtError();
7208   }
7209 
7210   if (!getDerived().AlwaysRebuild() &&
7211       Operand.get() == S->getThrowExpr())
7212     return S;
7213 
7214   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7215 }
7216 
7217 template<typename Derived>
7218 StmtResult
7219 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7220                                                   ObjCAtSynchronizedStmt *S) {
7221   // Transform the object we are locking.
7222   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7223   if (Object.isInvalid())
7224     return StmtError();
7225   Object =
7226     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7227                                                   Object.get());
7228   if (Object.isInvalid())
7229     return StmtError();
7230 
7231   // Transform the body.
7232   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7233   if (Body.isInvalid())
7234     return StmtError();
7235 
7236   // If nothing change, just retain the current statement.
7237   if (!getDerived().AlwaysRebuild() &&
7238       Object.get() == S->getSynchExpr() &&
7239       Body.get() == S->getSynchBody())
7240     return S;
7241 
7242   // Build a new statement.
7243   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7244                                                     Object.get(), Body.get());
7245 }
7246 
7247 template<typename Derived>
7248 StmtResult
7249 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7250                                               ObjCAutoreleasePoolStmt *S) {
7251   // Transform the body.
7252   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7253   if (Body.isInvalid())
7254     return StmtError();
7255 
7256   // If nothing changed, just retain this statement.
7257   if (!getDerived().AlwaysRebuild() &&
7258       Body.get() == S->getSubStmt())
7259     return S;
7260 
7261   // Build a new statement.
7262   return getDerived().RebuildObjCAutoreleasePoolStmt(
7263                         S->getAtLoc(), Body.get());
7264 }
7265 
7266 template<typename Derived>
7267 StmtResult
7268 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7269                                                   ObjCForCollectionStmt *S) {
7270   // Transform the element statement.
7271   StmtResult Element = getDerived().TransformStmt(S->getElement());
7272   if (Element.isInvalid())
7273     return StmtError();
7274 
7275   // Transform the collection expression.
7276   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7277   if (Collection.isInvalid())
7278     return StmtError();
7279 
7280   // Transform the body.
7281   StmtResult Body = getDerived().TransformStmt(S->getBody());
7282   if (Body.isInvalid())
7283     return StmtError();
7284 
7285   // If nothing changed, just retain this statement.
7286   if (!getDerived().AlwaysRebuild() &&
7287       Element.get() == S->getElement() &&
7288       Collection.get() == S->getCollection() &&
7289       Body.get() == S->getBody())
7290     return S;
7291 
7292   // Build a new statement.
7293   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7294                                                    Element.get(),
7295                                                    Collection.get(),
7296                                                    S->getRParenLoc(),
7297                                                    Body.get());
7298 }
7299 
7300 template <typename Derived>
7301 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7302   // Transform the exception declaration, if any.
7303   VarDecl *Var = nullptr;
7304   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7305     TypeSourceInfo *T =
7306         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7307     if (!T)
7308       return StmtError();
7309 
7310     Var = getDerived().RebuildExceptionDecl(
7311         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7312         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7313     if (!Var || Var->isInvalidDecl())
7314       return StmtError();
7315   }
7316 
7317   // Transform the actual exception handler.
7318   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7319   if (Handler.isInvalid())
7320     return StmtError();
7321 
7322   if (!getDerived().AlwaysRebuild() && !Var &&
7323       Handler.get() == S->getHandlerBlock())
7324     return S;
7325 
7326   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7327 }
7328 
7329 template <typename Derived>
7330 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7331   // Transform the try block itself.
7332   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7333   if (TryBlock.isInvalid())
7334     return StmtError();
7335 
7336   // Transform the handlers.
7337   bool HandlerChanged = false;
7338   SmallVector<Stmt *, 8> Handlers;
7339   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7340     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7341     if (Handler.isInvalid())
7342       return StmtError();
7343 
7344     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7345     Handlers.push_back(Handler.getAs<Stmt>());
7346   }
7347 
7348   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7349       !HandlerChanged)
7350     return S;
7351 
7352   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7353                                         Handlers);
7354 }
7355 
7356 template<typename Derived>
7357 StmtResult
7358 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7359   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7360   if (Range.isInvalid())
7361     return StmtError();
7362 
7363   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7364   if (Begin.isInvalid())
7365     return StmtError();
7366   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7367   if (End.isInvalid())
7368     return StmtError();
7369 
7370   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7371   if (Cond.isInvalid())
7372     return StmtError();
7373   if (Cond.get())
7374     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7375   if (Cond.isInvalid())
7376     return StmtError();
7377   if (Cond.get())
7378     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7379 
7380   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7381   if (Inc.isInvalid())
7382     return StmtError();
7383   if (Inc.get())
7384     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7385 
7386   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7387   if (LoopVar.isInvalid())
7388     return StmtError();
7389 
7390   StmtResult NewStmt = S;
7391   if (getDerived().AlwaysRebuild() ||
7392       Range.get() != S->getRangeStmt() ||
7393       Begin.get() != S->getBeginStmt() ||
7394       End.get() != S->getEndStmt() ||
7395       Cond.get() != S->getCond() ||
7396       Inc.get() != S->getInc() ||
7397       LoopVar.get() != S->getLoopVarStmt()) {
7398     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7399                                                   S->getCoawaitLoc(),
7400                                                   S->getColonLoc(), Range.get(),
7401                                                   Begin.get(), End.get(),
7402                                                   Cond.get(),
7403                                                   Inc.get(), LoopVar.get(),
7404                                                   S->getRParenLoc());
7405     if (NewStmt.isInvalid())
7406       return StmtError();
7407   }
7408 
7409   StmtResult Body = getDerived().TransformStmt(S->getBody());
7410   if (Body.isInvalid())
7411     return StmtError();
7412 
7413   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7414   // it now so we have a new statement to attach the body to.
7415   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7416     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7417                                                   S->getCoawaitLoc(),
7418                                                   S->getColonLoc(), Range.get(),
7419                                                   Begin.get(), End.get(),
7420                                                   Cond.get(),
7421                                                   Inc.get(), LoopVar.get(),
7422                                                   S->getRParenLoc());
7423     if (NewStmt.isInvalid())
7424       return StmtError();
7425   }
7426 
7427   if (NewStmt.get() == S)
7428     return S;
7429 
7430   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7431 }
7432 
7433 template<typename Derived>
7434 StmtResult
7435 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7436                                                     MSDependentExistsStmt *S) {
7437   // Transform the nested-name-specifier, if any.
7438   NestedNameSpecifierLoc QualifierLoc;
7439   if (S->getQualifierLoc()) {
7440     QualifierLoc
7441       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7442     if (!QualifierLoc)
7443       return StmtError();
7444   }
7445 
7446   // Transform the declaration name.
7447   DeclarationNameInfo NameInfo = S->getNameInfo();
7448   if (NameInfo.getName()) {
7449     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7450     if (!NameInfo.getName())
7451       return StmtError();
7452   }
7453 
7454   // Check whether anything changed.
7455   if (!getDerived().AlwaysRebuild() &&
7456       QualifierLoc == S->getQualifierLoc() &&
7457       NameInfo.getName() == S->getNameInfo().getName())
7458     return S;
7459 
7460   // Determine whether this name exists, if we can.
7461   CXXScopeSpec SS;
7462   SS.Adopt(QualifierLoc);
7463   bool Dependent = false;
7464   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7465   case Sema::IER_Exists:
7466     if (S->isIfExists())
7467       break;
7468 
7469     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7470 
7471   case Sema::IER_DoesNotExist:
7472     if (S->isIfNotExists())
7473       break;
7474 
7475     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7476 
7477   case Sema::IER_Dependent:
7478     Dependent = true;
7479     break;
7480 
7481   case Sema::IER_Error:
7482     return StmtError();
7483   }
7484 
7485   // We need to continue with the instantiation, so do so now.
7486   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7487   if (SubStmt.isInvalid())
7488     return StmtError();
7489 
7490   // If we have resolved the name, just transform to the substatement.
7491   if (!Dependent)
7492     return SubStmt;
7493 
7494   // The name is still dependent, so build a dependent expression again.
7495   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7496                                                    S->isIfExists(),
7497                                                    QualifierLoc,
7498                                                    NameInfo,
7499                                                    SubStmt.get());
7500 }
7501 
7502 template<typename Derived>
7503 ExprResult
7504 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7505   NestedNameSpecifierLoc QualifierLoc;
7506   if (E->getQualifierLoc()) {
7507     QualifierLoc
7508     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7509     if (!QualifierLoc)
7510       return ExprError();
7511   }
7512 
7513   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7514     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7515   if (!PD)
7516     return ExprError();
7517 
7518   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7519   if (Base.isInvalid())
7520     return ExprError();
7521 
7522   return new (SemaRef.getASTContext())
7523       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7524                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7525                         QualifierLoc, E->getMemberLoc());
7526 }
7527 
7528 template <typename Derived>
7529 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7530     MSPropertySubscriptExpr *E) {
7531   auto BaseRes = getDerived().TransformExpr(E->getBase());
7532   if (BaseRes.isInvalid())
7533     return ExprError();
7534   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7535   if (IdxRes.isInvalid())
7536     return ExprError();
7537 
7538   if (!getDerived().AlwaysRebuild() &&
7539       BaseRes.get() == E->getBase() &&
7540       IdxRes.get() == E->getIdx())
7541     return E;
7542 
7543   return getDerived().RebuildArraySubscriptExpr(
7544       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7545 }
7546 
7547 template <typename Derived>
7548 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7549   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7550   if (TryBlock.isInvalid())
7551     return StmtError();
7552 
7553   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7554   if (Handler.isInvalid())
7555     return StmtError();
7556 
7557   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7558       Handler.get() == S->getHandler())
7559     return S;
7560 
7561   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7562                                         TryBlock.get(), Handler.get());
7563 }
7564 
7565 template <typename Derived>
7566 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7567   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7568   if (Block.isInvalid())
7569     return StmtError();
7570 
7571   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7572 }
7573 
7574 template <typename Derived>
7575 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7576   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7577   if (FilterExpr.isInvalid())
7578     return StmtError();
7579 
7580   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7581   if (Block.isInvalid())
7582     return StmtError();
7583 
7584   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7585                                            Block.get());
7586 }
7587 
7588 template <typename Derived>
7589 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7590   if (isa<SEHFinallyStmt>(Handler))
7591     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7592   else
7593     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7594 }
7595 
7596 template<typename Derived>
7597 StmtResult
7598 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7599   return S;
7600 }
7601 
7602 //===----------------------------------------------------------------------===//
7603 // OpenMP directive transformation
7604 //===----------------------------------------------------------------------===//
7605 template <typename Derived>
7606 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7607     OMPExecutableDirective *D) {
7608 
7609   // Transform the clauses
7610   llvm::SmallVector<OMPClause *, 16> TClauses;
7611   ArrayRef<OMPClause *> Clauses = D->clauses();
7612   TClauses.reserve(Clauses.size());
7613   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7614        I != E; ++I) {
7615     if (*I) {
7616       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7617       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7618       getDerived().getSema().EndOpenMPClause();
7619       if (Clause)
7620         TClauses.push_back(Clause);
7621     } else {
7622       TClauses.push_back(nullptr);
7623     }
7624   }
7625   StmtResult AssociatedStmt;
7626   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7627     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7628                                                   /*CurScope=*/nullptr);
7629     StmtResult Body;
7630     {
7631       Sema::CompoundScopeRAII CompoundScope(getSema());
7632       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7633       Body = getDerived().TransformStmt(CS);
7634     }
7635     AssociatedStmt =
7636         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7637     if (AssociatedStmt.isInvalid()) {
7638       return StmtError();
7639     }
7640   }
7641   if (TClauses.size() != Clauses.size()) {
7642     return StmtError();
7643   }
7644 
7645   // Transform directive name for 'omp critical' directive.
7646   DeclarationNameInfo DirName;
7647   if (D->getDirectiveKind() == OMPD_critical) {
7648     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7649     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7650   }
7651   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7652   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7653     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7654   } else if (D->getDirectiveKind() == OMPD_cancel) {
7655     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7656   }
7657 
7658   return getDerived().RebuildOMPExecutableDirective(
7659       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7660       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7661 }
7662 
7663 template <typename Derived>
7664 StmtResult
7665 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7666   DeclarationNameInfo DirName;
7667   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7668                                              D->getLocStart());
7669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7671   return Res;
7672 }
7673 
7674 template <typename Derived>
7675 StmtResult
7676 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7677   DeclarationNameInfo DirName;
7678   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7679                                              D->getLocStart());
7680   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7681   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7682   return Res;
7683 }
7684 
7685 template <typename Derived>
7686 StmtResult
7687 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7688   DeclarationNameInfo DirName;
7689   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7690                                              D->getLocStart());
7691   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7692   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7693   return Res;
7694 }
7695 
7696 template <typename Derived>
7697 StmtResult
7698 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7699   DeclarationNameInfo DirName;
7700   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7701                                              D->getLocStart());
7702   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7703   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7704   return Res;
7705 }
7706 
7707 template <typename Derived>
7708 StmtResult
7709 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7710   DeclarationNameInfo DirName;
7711   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7712                                              D->getLocStart());
7713   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7714   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7715   return Res;
7716 }
7717 
7718 template <typename Derived>
7719 StmtResult
7720 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7721   DeclarationNameInfo DirName;
7722   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7723                                              D->getLocStart());
7724   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7726   return Res;
7727 }
7728 
7729 template <typename Derived>
7730 StmtResult
7731 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7732   DeclarationNameInfo DirName;
7733   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7734                                              D->getLocStart());
7735   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7736   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7737   return Res;
7738 }
7739 
7740 template <typename Derived>
7741 StmtResult
7742 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7743   DeclarationNameInfo DirName;
7744   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7745                                              D->getLocStart());
7746   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7747   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7748   return Res;
7749 }
7750 
7751 template <typename Derived>
7752 StmtResult
7753 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7754   getDerived().getSema().StartOpenMPDSABlock(
7755       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7756   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7757   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7758   return Res;
7759 }
7760 
7761 template <typename Derived>
7762 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7763     OMPParallelForDirective *D) {
7764   DeclarationNameInfo DirName;
7765   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7766                                              nullptr, D->getLocStart());
7767   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7768   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7769   return Res;
7770 }
7771 
7772 template <typename Derived>
7773 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7774     OMPParallelForSimdDirective *D) {
7775   DeclarationNameInfo DirName;
7776   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7777                                              nullptr, D->getLocStart());
7778   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7779   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7780   return Res;
7781 }
7782 
7783 template <typename Derived>
7784 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7785     OMPParallelSectionsDirective *D) {
7786   DeclarationNameInfo DirName;
7787   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7788                                              nullptr, D->getLocStart());
7789   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7790   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7791   return Res;
7792 }
7793 
7794 template <typename Derived>
7795 StmtResult
7796 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7797   DeclarationNameInfo DirName;
7798   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7799                                              D->getLocStart());
7800   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7801   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7802   return Res;
7803 }
7804 
7805 template <typename Derived>
7806 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7807     OMPTaskyieldDirective *D) {
7808   DeclarationNameInfo DirName;
7809   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7810                                              D->getLocStart());
7811   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7812   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7813   return Res;
7814 }
7815 
7816 template <typename Derived>
7817 StmtResult
7818 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7819   DeclarationNameInfo DirName;
7820   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7821                                              D->getLocStart());
7822   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7823   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7824   return Res;
7825 }
7826 
7827 template <typename Derived>
7828 StmtResult
7829 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7830   DeclarationNameInfo DirName;
7831   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7832                                              D->getLocStart());
7833   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7834   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7835   return Res;
7836 }
7837 
7838 template <typename Derived>
7839 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7840     OMPTaskgroupDirective *D) {
7841   DeclarationNameInfo DirName;
7842   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7843                                              D->getLocStart());
7844   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7845   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7846   return Res;
7847 }
7848 
7849 template <typename Derived>
7850 StmtResult
7851 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7852   DeclarationNameInfo DirName;
7853   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7854                                              D->getLocStart());
7855   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7856   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7857   return Res;
7858 }
7859 
7860 template <typename Derived>
7861 StmtResult
7862 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7863   DeclarationNameInfo DirName;
7864   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7865                                              D->getLocStart());
7866   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7867   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7868   return Res;
7869 }
7870 
7871 template <typename Derived>
7872 StmtResult
7873 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7874   DeclarationNameInfo DirName;
7875   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7876                                              D->getLocStart());
7877   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7878   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7879   return Res;
7880 }
7881 
7882 template <typename Derived>
7883 StmtResult
7884 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7885   DeclarationNameInfo DirName;
7886   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7887                                              D->getLocStart());
7888   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7889   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7890   return Res;
7891 }
7892 
7893 template <typename Derived>
7894 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7895     OMPTargetDataDirective *D) {
7896   DeclarationNameInfo DirName;
7897   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7898                                              D->getLocStart());
7899   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7900   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7901   return Res;
7902 }
7903 
7904 template <typename Derived>
7905 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7906     OMPTargetEnterDataDirective *D) {
7907   DeclarationNameInfo DirName;
7908   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7909                                              nullptr, D->getLocStart());
7910   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7911   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7912   return Res;
7913 }
7914 
7915 template <typename Derived>
7916 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7917     OMPTargetExitDataDirective *D) {
7918   DeclarationNameInfo DirName;
7919   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7920                                              nullptr, D->getLocStart());
7921   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7922   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7923   return Res;
7924 }
7925 
7926 template <typename Derived>
7927 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7928     OMPTargetParallelDirective *D) {
7929   DeclarationNameInfo DirName;
7930   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7931                                              nullptr, D->getLocStart());
7932   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7933   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7934   return Res;
7935 }
7936 
7937 template <typename Derived>
7938 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7939     OMPTargetParallelForDirective *D) {
7940   DeclarationNameInfo DirName;
7941   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7942                                              nullptr, D->getLocStart());
7943   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7944   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7945   return Res;
7946 }
7947 
7948 template <typename Derived>
7949 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7950     OMPTargetUpdateDirective *D) {
7951   DeclarationNameInfo DirName;
7952   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7953                                              nullptr, D->getLocStart());
7954   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7955   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7956   return Res;
7957 }
7958 
7959 template <typename Derived>
7960 StmtResult
7961 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7962   DeclarationNameInfo DirName;
7963   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7964                                              D->getLocStart());
7965   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7966   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7967   return Res;
7968 }
7969 
7970 template <typename Derived>
7971 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7972     OMPCancellationPointDirective *D) {
7973   DeclarationNameInfo DirName;
7974   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7975                                              nullptr, D->getLocStart());
7976   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7977   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7978   return Res;
7979 }
7980 
7981 template <typename Derived>
7982 StmtResult
7983 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7984   DeclarationNameInfo DirName;
7985   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7986                                              D->getLocStart());
7987   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7988   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7989   return Res;
7990 }
7991 
7992 template <typename Derived>
7993 StmtResult
7994 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7995   DeclarationNameInfo DirName;
7996   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7997                                              D->getLocStart());
7998   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7999   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8000   return Res;
8001 }
8002 
8003 template <typename Derived>
8004 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8005     OMPTaskLoopSimdDirective *D) {
8006   DeclarationNameInfo DirName;
8007   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8008                                              nullptr, D->getLocStart());
8009   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8010   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8011   return Res;
8012 }
8013 
8014 template <typename Derived>
8015 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8016     OMPDistributeDirective *D) {
8017   DeclarationNameInfo DirName;
8018   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8019                                              D->getLocStart());
8020   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8021   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8022   return Res;
8023 }
8024 
8025 template <typename Derived>
8026 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8027     OMPDistributeParallelForDirective *D) {
8028   DeclarationNameInfo DirName;
8029   getDerived().getSema().StartOpenMPDSABlock(
8030       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
8031   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8032   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8033   return Res;
8034 }
8035 
8036 template <typename Derived>
8037 StmtResult
8038 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8039     OMPDistributeParallelForSimdDirective *D) {
8040   DeclarationNameInfo DirName;
8041   getDerived().getSema().StartOpenMPDSABlock(
8042       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8045   return Res;
8046 }
8047 
8048 template <typename Derived>
8049 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8050     OMPDistributeSimdDirective *D) {
8051   DeclarationNameInfo DirName;
8052   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8053                                              nullptr, D->getLocStart());
8054   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8055   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8056   return Res;
8057 }
8058 
8059 template <typename Derived>
8060 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8061     OMPTargetParallelForSimdDirective *D) {
8062   DeclarationNameInfo DirName;
8063   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
8064                                              DirName, nullptr,
8065                                              D->getLocStart());
8066   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8068   return Res;
8069 }
8070 
8071 template <typename Derived>
8072 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8073     OMPTargetSimdDirective *D) {
8074   DeclarationNameInfo DirName;
8075   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8076                                              D->getLocStart());
8077   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8078   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8079   return Res;
8080 }
8081 
8082 template <typename Derived>
8083 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8084     OMPTeamsDistributeDirective *D) {
8085   DeclarationNameInfo DirName;
8086   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8087                                              nullptr, D->getLocStart());
8088   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8089   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8090   return Res;
8091 }
8092 
8093 template <typename Derived>
8094 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8095     OMPTeamsDistributeSimdDirective *D) {
8096   DeclarationNameInfo DirName;
8097   getDerived().getSema().StartOpenMPDSABlock(
8098       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8099   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8100   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8101   return Res;
8102 }
8103 
8104 template <typename Derived>
8105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8106     OMPTeamsDistributeParallelForSimdDirective *D) {
8107   DeclarationNameInfo DirName;
8108   getDerived().getSema().StartOpenMPDSABlock(
8109       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8110   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8111   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8112   return Res;
8113 }
8114 
8115 template <typename Derived>
8116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8117     OMPTeamsDistributeParallelForDirective *D) {
8118   DeclarationNameInfo DirName;
8119   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
8120       DirName, nullptr, D->getLocStart());
8121   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8122   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8123   return Res;
8124 }
8125 
8126 template <typename Derived>
8127 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8128     OMPTargetTeamsDirective *D) {
8129   DeclarationNameInfo DirName;
8130   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8131                                              nullptr, D->getLocStart());
8132   auto Res = getDerived().TransformOMPExecutableDirective(D);
8133   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8134   return Res;
8135 }
8136 
8137 template <typename Derived>
8138 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8139     OMPTargetTeamsDistributeDirective *D) {
8140   DeclarationNameInfo DirName;
8141   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
8142       DirName, nullptr, D->getLocStart());
8143   auto Res = getDerived().TransformOMPExecutableDirective(D);
8144   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8145   return Res;
8146 }
8147 
8148 template <typename Derived>
8149 StmtResult
8150 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8151     OMPTargetTeamsDistributeParallelForDirective *D) {
8152   DeclarationNameInfo DirName;
8153   getDerived().getSema().StartOpenMPDSABlock(
8154       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8155       D->getLocStart());
8156   auto Res = getDerived().TransformOMPExecutableDirective(D);
8157   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8158   return Res;
8159 }
8160 
8161 template <typename Derived>
8162 StmtResult TreeTransform<Derived>::
8163     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8164         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8165   DeclarationNameInfo DirName;
8166   getDerived().getSema().StartOpenMPDSABlock(
8167       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8168       D->getLocStart());
8169   auto Res = getDerived().TransformOMPExecutableDirective(D);
8170   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8171   return Res;
8172 }
8173 
8174 template <typename Derived>
8175 StmtResult
8176 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8177     OMPTargetTeamsDistributeSimdDirective *D) {
8178   DeclarationNameInfo DirName;
8179   getDerived().getSema().StartOpenMPDSABlock(
8180       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8181   auto Res = getDerived().TransformOMPExecutableDirective(D);
8182   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8183   return Res;
8184 }
8185 
8186 
8187 //===----------------------------------------------------------------------===//
8188 // OpenMP clause transformation
8189 //===----------------------------------------------------------------------===//
8190 template <typename Derived>
8191 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8192   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8193   if (Cond.isInvalid())
8194     return nullptr;
8195   return getDerived().RebuildOMPIfClause(
8196       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
8197       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
8198 }
8199 
8200 template <typename Derived>
8201 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8202   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8203   if (Cond.isInvalid())
8204     return nullptr;
8205   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
8206                                             C->getLParenLoc(), C->getLocEnd());
8207 }
8208 
8209 template <typename Derived>
8210 OMPClause *
8211 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8212   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8213   if (NumThreads.isInvalid())
8214     return nullptr;
8215   return getDerived().RebuildOMPNumThreadsClause(
8216       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8217 }
8218 
8219 template <typename Derived>
8220 OMPClause *
8221 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8222   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8223   if (E.isInvalid())
8224     return nullptr;
8225   return getDerived().RebuildOMPSafelenClause(
8226       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8227 }
8228 
8229 template <typename Derived>
8230 OMPClause *
8231 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8232   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8233   if (E.isInvalid())
8234     return nullptr;
8235   return getDerived().RebuildOMPSimdlenClause(
8236       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8237 }
8238 
8239 template <typename Derived>
8240 OMPClause *
8241 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8242   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8243   if (E.isInvalid())
8244     return nullptr;
8245   return getDerived().RebuildOMPCollapseClause(
8246       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8247 }
8248 
8249 template <typename Derived>
8250 OMPClause *
8251 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8252   return getDerived().RebuildOMPDefaultClause(
8253       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
8254       C->getLParenLoc(), C->getLocEnd());
8255 }
8256 
8257 template <typename Derived>
8258 OMPClause *
8259 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8260   return getDerived().RebuildOMPProcBindClause(
8261       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
8262       C->getLParenLoc(), C->getLocEnd());
8263 }
8264 
8265 template <typename Derived>
8266 OMPClause *
8267 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8268   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8269   if (E.isInvalid())
8270     return nullptr;
8271   return getDerived().RebuildOMPScheduleClause(
8272       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8273       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8274       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8275       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8276 }
8277 
8278 template <typename Derived>
8279 OMPClause *
8280 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8281   ExprResult E;
8282   if (auto *Num = C->getNumForLoops()) {
8283     E = getDerived().TransformExpr(Num);
8284     if (E.isInvalid())
8285       return nullptr;
8286   }
8287   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
8288                                               C->getLParenLoc(), E.get());
8289 }
8290 
8291 template <typename Derived>
8292 OMPClause *
8293 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8294   // No need to rebuild this clause, no template-dependent parameters.
8295   return C;
8296 }
8297 
8298 template <typename Derived>
8299 OMPClause *
8300 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8301   // No need to rebuild this clause, no template-dependent parameters.
8302   return C;
8303 }
8304 
8305 template <typename Derived>
8306 OMPClause *
8307 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8308   // No need to rebuild this clause, no template-dependent parameters.
8309   return C;
8310 }
8311 
8312 template <typename Derived>
8313 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8314   // No need to rebuild this clause, no template-dependent parameters.
8315   return C;
8316 }
8317 
8318 template <typename Derived>
8319 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8320   // No need to rebuild this clause, no template-dependent parameters.
8321   return C;
8322 }
8323 
8324 template <typename Derived>
8325 OMPClause *
8326 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8327   // No need to rebuild this clause, no template-dependent parameters.
8328   return C;
8329 }
8330 
8331 template <typename Derived>
8332 OMPClause *
8333 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8334   // No need to rebuild this clause, no template-dependent parameters.
8335   return C;
8336 }
8337 
8338 template <typename Derived>
8339 OMPClause *
8340 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8341   // No need to rebuild this clause, no template-dependent parameters.
8342   return C;
8343 }
8344 
8345 template <typename Derived>
8346 OMPClause *
8347 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8348   // No need to rebuild this clause, no template-dependent parameters.
8349   return C;
8350 }
8351 
8352 template <typename Derived>
8353 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8354   // No need to rebuild this clause, no template-dependent parameters.
8355   return C;
8356 }
8357 
8358 template <typename Derived>
8359 OMPClause *
8360 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8361   // No need to rebuild this clause, no template-dependent parameters.
8362   return C;
8363 }
8364 
8365 template <typename Derived>
8366 OMPClause *
8367 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8368   llvm::SmallVector<Expr *, 16> Vars;
8369   Vars.reserve(C->varlist_size());
8370   for (auto *VE : C->varlists()) {
8371     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8372     if (EVar.isInvalid())
8373       return nullptr;
8374     Vars.push_back(EVar.get());
8375   }
8376   return getDerived().RebuildOMPPrivateClause(
8377       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8378 }
8379 
8380 template <typename Derived>
8381 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8382     OMPFirstprivateClause *C) {
8383   llvm::SmallVector<Expr *, 16> Vars;
8384   Vars.reserve(C->varlist_size());
8385   for (auto *VE : C->varlists()) {
8386     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8387     if (EVar.isInvalid())
8388       return nullptr;
8389     Vars.push_back(EVar.get());
8390   }
8391   return getDerived().RebuildOMPFirstprivateClause(
8392       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8393 }
8394 
8395 template <typename Derived>
8396 OMPClause *
8397 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8398   llvm::SmallVector<Expr *, 16> Vars;
8399   Vars.reserve(C->varlist_size());
8400   for (auto *VE : C->varlists()) {
8401     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8402     if (EVar.isInvalid())
8403       return nullptr;
8404     Vars.push_back(EVar.get());
8405   }
8406   return getDerived().RebuildOMPLastprivateClause(
8407       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8408 }
8409 
8410 template <typename Derived>
8411 OMPClause *
8412 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8413   llvm::SmallVector<Expr *, 16> Vars;
8414   Vars.reserve(C->varlist_size());
8415   for (auto *VE : C->varlists()) {
8416     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8417     if (EVar.isInvalid())
8418       return nullptr;
8419     Vars.push_back(EVar.get());
8420   }
8421   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8422                                              C->getLParenLoc(), C->getLocEnd());
8423 }
8424 
8425 template <typename Derived>
8426 OMPClause *
8427 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8428   llvm::SmallVector<Expr *, 16> Vars;
8429   Vars.reserve(C->varlist_size());
8430   for (auto *VE : C->varlists()) {
8431     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8432     if (EVar.isInvalid())
8433       return nullptr;
8434     Vars.push_back(EVar.get());
8435   }
8436   CXXScopeSpec ReductionIdScopeSpec;
8437   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8438 
8439   DeclarationNameInfo NameInfo = C->getNameInfo();
8440   if (NameInfo.getName()) {
8441     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8442     if (!NameInfo.getName())
8443       return nullptr;
8444   }
8445   // Build a list of all UDR decls with the same names ranged by the Scopes.
8446   // The Scope boundary is a duplication of the previous decl.
8447   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8448   for (auto *E : C->reduction_ops()) {
8449     // Transform all the decls.
8450     if (E) {
8451       auto *ULE = cast<UnresolvedLookupExpr>(E);
8452       UnresolvedSet<8> Decls;
8453       for (auto *D : ULE->decls()) {
8454         NamedDecl *InstD =
8455             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8456         Decls.addDecl(InstD, InstD->getAccess());
8457       }
8458       UnresolvedReductions.push_back(
8459        UnresolvedLookupExpr::Create(
8460           SemaRef.Context, /*NamingClass=*/nullptr,
8461           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8462           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8463           Decls.begin(), Decls.end()));
8464     } else
8465       UnresolvedReductions.push_back(nullptr);
8466   }
8467   return getDerived().RebuildOMPReductionClause(
8468       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8469       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8470 }
8471 
8472 template <typename Derived>
8473 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8474     OMPTaskReductionClause *C) {
8475   llvm::SmallVector<Expr *, 16> Vars;
8476   Vars.reserve(C->varlist_size());
8477   for (auto *VE : C->varlists()) {
8478     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8479     if (EVar.isInvalid())
8480       return nullptr;
8481     Vars.push_back(EVar.get());
8482   }
8483   CXXScopeSpec ReductionIdScopeSpec;
8484   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8485 
8486   DeclarationNameInfo NameInfo = C->getNameInfo();
8487   if (NameInfo.getName()) {
8488     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8489     if (!NameInfo.getName())
8490       return nullptr;
8491   }
8492   // Build a list of all UDR decls with the same names ranged by the Scopes.
8493   // The Scope boundary is a duplication of the previous decl.
8494   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8495   for (auto *E : C->reduction_ops()) {
8496     // Transform all the decls.
8497     if (E) {
8498       auto *ULE = cast<UnresolvedLookupExpr>(E);
8499       UnresolvedSet<8> Decls;
8500       for (auto *D : ULE->decls()) {
8501         NamedDecl *InstD =
8502             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8503         Decls.addDecl(InstD, InstD->getAccess());
8504       }
8505       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8506           SemaRef.Context, /*NamingClass=*/nullptr,
8507           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8508           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8509     } else
8510       UnresolvedReductions.push_back(nullptr);
8511   }
8512   return getDerived().RebuildOMPTaskReductionClause(
8513       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8514       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8515 }
8516 
8517 template <typename Derived>
8518 OMPClause *
8519 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8520   llvm::SmallVector<Expr *, 16> Vars;
8521   Vars.reserve(C->varlist_size());
8522   for (auto *VE : C->varlists()) {
8523     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8524     if (EVar.isInvalid())
8525       return nullptr;
8526     Vars.push_back(EVar.get());
8527   }
8528   CXXScopeSpec ReductionIdScopeSpec;
8529   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8530 
8531   DeclarationNameInfo NameInfo = C->getNameInfo();
8532   if (NameInfo.getName()) {
8533     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8534     if (!NameInfo.getName())
8535       return nullptr;
8536   }
8537   // Build a list of all UDR decls with the same names ranged by the Scopes.
8538   // The Scope boundary is a duplication of the previous decl.
8539   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8540   for (auto *E : C->reduction_ops()) {
8541     // Transform all the decls.
8542     if (E) {
8543       auto *ULE = cast<UnresolvedLookupExpr>(E);
8544       UnresolvedSet<8> Decls;
8545       for (auto *D : ULE->decls()) {
8546         NamedDecl *InstD =
8547             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8548         Decls.addDecl(InstD, InstD->getAccess());
8549       }
8550       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8551           SemaRef.Context, /*NamingClass=*/nullptr,
8552           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8553           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8554     } else
8555       UnresolvedReductions.push_back(nullptr);
8556   }
8557   return getDerived().RebuildOMPInReductionClause(
8558       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8559       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8560 }
8561 
8562 template <typename Derived>
8563 OMPClause *
8564 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8565   llvm::SmallVector<Expr *, 16> Vars;
8566   Vars.reserve(C->varlist_size());
8567   for (auto *VE : C->varlists()) {
8568     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8569     if (EVar.isInvalid())
8570       return nullptr;
8571     Vars.push_back(EVar.get());
8572   }
8573   ExprResult Step = getDerived().TransformExpr(C->getStep());
8574   if (Step.isInvalid())
8575     return nullptr;
8576   return getDerived().RebuildOMPLinearClause(
8577       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8578       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8579 }
8580 
8581 template <typename Derived>
8582 OMPClause *
8583 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8584   llvm::SmallVector<Expr *, 16> Vars;
8585   Vars.reserve(C->varlist_size());
8586   for (auto *VE : C->varlists()) {
8587     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8588     if (EVar.isInvalid())
8589       return nullptr;
8590     Vars.push_back(EVar.get());
8591   }
8592   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8593   if (Alignment.isInvalid())
8594     return nullptr;
8595   return getDerived().RebuildOMPAlignedClause(
8596       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8597       C->getColonLoc(), C->getLocEnd());
8598 }
8599 
8600 template <typename Derived>
8601 OMPClause *
8602 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8603   llvm::SmallVector<Expr *, 16> Vars;
8604   Vars.reserve(C->varlist_size());
8605   for (auto *VE : C->varlists()) {
8606     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8607     if (EVar.isInvalid())
8608       return nullptr;
8609     Vars.push_back(EVar.get());
8610   }
8611   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8612                                              C->getLParenLoc(), C->getLocEnd());
8613 }
8614 
8615 template <typename Derived>
8616 OMPClause *
8617 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8618   llvm::SmallVector<Expr *, 16> Vars;
8619   Vars.reserve(C->varlist_size());
8620   for (auto *VE : C->varlists()) {
8621     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8622     if (EVar.isInvalid())
8623       return nullptr;
8624     Vars.push_back(EVar.get());
8625   }
8626   return getDerived().RebuildOMPCopyprivateClause(
8627       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8628 }
8629 
8630 template <typename Derived>
8631 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8632   llvm::SmallVector<Expr *, 16> Vars;
8633   Vars.reserve(C->varlist_size());
8634   for (auto *VE : C->varlists()) {
8635     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8636     if (EVar.isInvalid())
8637       return nullptr;
8638     Vars.push_back(EVar.get());
8639   }
8640   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8641                                             C->getLParenLoc(), C->getLocEnd());
8642 }
8643 
8644 template <typename Derived>
8645 OMPClause *
8646 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8647   llvm::SmallVector<Expr *, 16> Vars;
8648   Vars.reserve(C->varlist_size());
8649   for (auto *VE : C->varlists()) {
8650     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8651     if (EVar.isInvalid())
8652       return nullptr;
8653     Vars.push_back(EVar.get());
8654   }
8655   return getDerived().RebuildOMPDependClause(
8656       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8657       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8658 }
8659 
8660 template <typename Derived>
8661 OMPClause *
8662 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8663   ExprResult E = getDerived().TransformExpr(C->getDevice());
8664   if (E.isInvalid())
8665     return nullptr;
8666   return getDerived().RebuildOMPDeviceClause(
8667       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8668 }
8669 
8670 template <typename Derived>
8671 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8672   llvm::SmallVector<Expr *, 16> Vars;
8673   Vars.reserve(C->varlist_size());
8674   for (auto *VE : C->varlists()) {
8675     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8676     if (EVar.isInvalid())
8677       return nullptr;
8678     Vars.push_back(EVar.get());
8679   }
8680   return getDerived().RebuildOMPMapClause(
8681       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8682       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8683       C->getLParenLoc(), C->getLocEnd());
8684 }
8685 
8686 template <typename Derived>
8687 OMPClause *
8688 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8689   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8690   if (E.isInvalid())
8691     return nullptr;
8692   return getDerived().RebuildOMPNumTeamsClause(
8693       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8694 }
8695 
8696 template <typename Derived>
8697 OMPClause *
8698 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8699   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8700   if (E.isInvalid())
8701     return nullptr;
8702   return getDerived().RebuildOMPThreadLimitClause(
8703       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8704 }
8705 
8706 template <typename Derived>
8707 OMPClause *
8708 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8709   ExprResult E = getDerived().TransformExpr(C->getPriority());
8710   if (E.isInvalid())
8711     return nullptr;
8712   return getDerived().RebuildOMPPriorityClause(
8713       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8714 }
8715 
8716 template <typename Derived>
8717 OMPClause *
8718 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8719   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8720   if (E.isInvalid())
8721     return nullptr;
8722   return getDerived().RebuildOMPGrainsizeClause(
8723       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8724 }
8725 
8726 template <typename Derived>
8727 OMPClause *
8728 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8729   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8730   if (E.isInvalid())
8731     return nullptr;
8732   return getDerived().RebuildOMPNumTasksClause(
8733       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8734 }
8735 
8736 template <typename Derived>
8737 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8738   ExprResult E = getDerived().TransformExpr(C->getHint());
8739   if (E.isInvalid())
8740     return nullptr;
8741   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8742                                            C->getLParenLoc(), C->getLocEnd());
8743 }
8744 
8745 template <typename Derived>
8746 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8747     OMPDistScheduleClause *C) {
8748   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8749   if (E.isInvalid())
8750     return nullptr;
8751   return getDerived().RebuildOMPDistScheduleClause(
8752       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8753       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8754 }
8755 
8756 template <typename Derived>
8757 OMPClause *
8758 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8759   return C;
8760 }
8761 
8762 template <typename Derived>
8763 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8764   llvm::SmallVector<Expr *, 16> Vars;
8765   Vars.reserve(C->varlist_size());
8766   for (auto *VE : C->varlists()) {
8767     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8768     if (EVar.isInvalid())
8769       return 0;
8770     Vars.push_back(EVar.get());
8771   }
8772   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8773                                          C->getLParenLoc(), C->getLocEnd());
8774 }
8775 
8776 template <typename Derived>
8777 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8778   llvm::SmallVector<Expr *, 16> Vars;
8779   Vars.reserve(C->varlist_size());
8780   for (auto *VE : C->varlists()) {
8781     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8782     if (EVar.isInvalid())
8783       return 0;
8784     Vars.push_back(EVar.get());
8785   }
8786   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8787                                            C->getLParenLoc(), C->getLocEnd());
8788 }
8789 
8790 template <typename Derived>
8791 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8792     OMPUseDevicePtrClause *C) {
8793   llvm::SmallVector<Expr *, 16> Vars;
8794   Vars.reserve(C->varlist_size());
8795   for (auto *VE : C->varlists()) {
8796     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8797     if (EVar.isInvalid())
8798       return nullptr;
8799     Vars.push_back(EVar.get());
8800   }
8801   return getDerived().RebuildOMPUseDevicePtrClause(
8802       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8803 }
8804 
8805 template <typename Derived>
8806 OMPClause *
8807 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8808   llvm::SmallVector<Expr *, 16> Vars;
8809   Vars.reserve(C->varlist_size());
8810   for (auto *VE : C->varlists()) {
8811     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8812     if (EVar.isInvalid())
8813       return nullptr;
8814     Vars.push_back(EVar.get());
8815   }
8816   return getDerived().RebuildOMPIsDevicePtrClause(
8817       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8818 }
8819 
8820 //===----------------------------------------------------------------------===//
8821 // Expression transformation
8822 //===----------------------------------------------------------------------===//
8823 template<typename Derived>
8824 ExprResult
8825 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8826   if (!E->isTypeDependent())
8827     return E;
8828 
8829   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8830                                             E->getIdentType());
8831 }
8832 
8833 template<typename Derived>
8834 ExprResult
8835 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8836   NestedNameSpecifierLoc QualifierLoc;
8837   if (E->getQualifierLoc()) {
8838     QualifierLoc
8839       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8840     if (!QualifierLoc)
8841       return ExprError();
8842   }
8843 
8844   ValueDecl *ND
8845     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8846                                                          E->getDecl()));
8847   if (!ND)
8848     return ExprError();
8849 
8850   DeclarationNameInfo NameInfo = E->getNameInfo();
8851   if (NameInfo.getName()) {
8852     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8853     if (!NameInfo.getName())
8854       return ExprError();
8855   }
8856 
8857   if (!getDerived().AlwaysRebuild() &&
8858       QualifierLoc == E->getQualifierLoc() &&
8859       ND == E->getDecl() &&
8860       NameInfo.getName() == E->getDecl()->getDeclName() &&
8861       !E->hasExplicitTemplateArgs()) {
8862 
8863     // Mark it referenced in the new context regardless.
8864     // FIXME: this is a bit instantiation-specific.
8865     SemaRef.MarkDeclRefReferenced(E);
8866 
8867     return E;
8868   }
8869 
8870   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8871   if (E->hasExplicitTemplateArgs()) {
8872     TemplateArgs = &TransArgs;
8873     TransArgs.setLAngleLoc(E->getLAngleLoc());
8874     TransArgs.setRAngleLoc(E->getRAngleLoc());
8875     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8876                                                 E->getNumTemplateArgs(),
8877                                                 TransArgs))
8878       return ExprError();
8879   }
8880 
8881   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8882                                          TemplateArgs);
8883 }
8884 
8885 template<typename Derived>
8886 ExprResult
8887 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8888   return E;
8889 }
8890 
8891 template<typename Derived>
8892 ExprResult
8893 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8894   return E;
8895 }
8896 
8897 template<typename Derived>
8898 ExprResult
8899 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8900   return E;
8901 }
8902 
8903 template<typename Derived>
8904 ExprResult
8905 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8906   return E;
8907 }
8908 
8909 template<typename Derived>
8910 ExprResult
8911 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8912   return E;
8913 }
8914 
8915 template<typename Derived>
8916 ExprResult
8917 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8918   if (FunctionDecl *FD = E->getDirectCallee())
8919     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8920   return SemaRef.MaybeBindToTemporary(E);
8921 }
8922 
8923 template<typename Derived>
8924 ExprResult
8925 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8926   ExprResult ControllingExpr =
8927     getDerived().TransformExpr(E->getControllingExpr());
8928   if (ControllingExpr.isInvalid())
8929     return ExprError();
8930 
8931   SmallVector<Expr *, 4> AssocExprs;
8932   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8933   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8934     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8935     if (TS) {
8936       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8937       if (!AssocType)
8938         return ExprError();
8939       AssocTypes.push_back(AssocType);
8940     } else {
8941       AssocTypes.push_back(nullptr);
8942     }
8943 
8944     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8945     if (AssocExpr.isInvalid())
8946       return ExprError();
8947     AssocExprs.push_back(AssocExpr.get());
8948   }
8949 
8950   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8951                                                   E->getDefaultLoc(),
8952                                                   E->getRParenLoc(),
8953                                                   ControllingExpr.get(),
8954                                                   AssocTypes,
8955                                                   AssocExprs);
8956 }
8957 
8958 template<typename Derived>
8959 ExprResult
8960 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8961   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8962   if (SubExpr.isInvalid())
8963     return ExprError();
8964 
8965   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8966     return E;
8967 
8968   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8969                                        E->getRParen());
8970 }
8971 
8972 /// \brief The operand of a unary address-of operator has special rules: it's
8973 /// allowed to refer to a non-static member of a class even if there's no 'this'
8974 /// object available.
8975 template<typename Derived>
8976 ExprResult
8977 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8978   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8979     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8980   else
8981     return getDerived().TransformExpr(E);
8982 }
8983 
8984 template<typename Derived>
8985 ExprResult
8986 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8987   ExprResult SubExpr;
8988   if (E->getOpcode() == UO_AddrOf)
8989     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8990   else
8991     SubExpr = TransformExpr(E->getSubExpr());
8992   if (SubExpr.isInvalid())
8993     return ExprError();
8994 
8995   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8996     return E;
8997 
8998   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
8999                                            E->getOpcode(),
9000                                            SubExpr.get());
9001 }
9002 
9003 template<typename Derived>
9004 ExprResult
9005 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9006   // Transform the type.
9007   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9008   if (!Type)
9009     return ExprError();
9010 
9011   // Transform all of the components into components similar to what the
9012   // parser uses.
9013   // FIXME: It would be slightly more efficient in the non-dependent case to
9014   // just map FieldDecls, rather than requiring the rebuilder to look for
9015   // the fields again. However, __builtin_offsetof is rare enough in
9016   // template code that we don't care.
9017   bool ExprChanged = false;
9018   typedef Sema::OffsetOfComponent Component;
9019   SmallVector<Component, 4> Components;
9020   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9021     const OffsetOfNode &ON = E->getComponent(I);
9022     Component Comp;
9023     Comp.isBrackets = true;
9024     Comp.LocStart = ON.getSourceRange().getBegin();
9025     Comp.LocEnd = ON.getSourceRange().getEnd();
9026     switch (ON.getKind()) {
9027     case OffsetOfNode::Array: {
9028       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9029       ExprResult Index = getDerived().TransformExpr(FromIndex);
9030       if (Index.isInvalid())
9031         return ExprError();
9032 
9033       ExprChanged = ExprChanged || Index.get() != FromIndex;
9034       Comp.isBrackets = true;
9035       Comp.U.E = Index.get();
9036       break;
9037     }
9038 
9039     case OffsetOfNode::Field:
9040     case OffsetOfNode::Identifier:
9041       Comp.isBrackets = false;
9042       Comp.U.IdentInfo = ON.getFieldName();
9043       if (!Comp.U.IdentInfo)
9044         continue;
9045 
9046       break;
9047 
9048     case OffsetOfNode::Base:
9049       // Will be recomputed during the rebuild.
9050       continue;
9051     }
9052 
9053     Components.push_back(Comp);
9054   }
9055 
9056   // If nothing changed, retain the existing expression.
9057   if (!getDerived().AlwaysRebuild() &&
9058       Type == E->getTypeSourceInfo() &&
9059       !ExprChanged)
9060     return E;
9061 
9062   // Build a new offsetof expression.
9063   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9064                                           Components, E->getRParenLoc());
9065 }
9066 
9067 template<typename Derived>
9068 ExprResult
9069 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9070   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9071          "opaque value expression requires transformation");
9072   return E;
9073 }
9074 
9075 template<typename Derived>
9076 ExprResult
9077 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9078   return E;
9079 }
9080 
9081 template<typename Derived>
9082 ExprResult
9083 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9084   // Rebuild the syntactic form.  The original syntactic form has
9085   // opaque-value expressions in it, so strip those away and rebuild
9086   // the result.  This is a really awful way of doing this, but the
9087   // better solution (rebuilding the semantic expressions and
9088   // rebinding OVEs as necessary) doesn't work; we'd need
9089   // TreeTransform to not strip away implicit conversions.
9090   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9091   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9092   if (result.isInvalid()) return ExprError();
9093 
9094   // If that gives us a pseudo-object result back, the pseudo-object
9095   // expression must have been an lvalue-to-rvalue conversion which we
9096   // should reapply.
9097   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9098     result = SemaRef.checkPseudoObjectRValue(result.get());
9099 
9100   return result;
9101 }
9102 
9103 template<typename Derived>
9104 ExprResult
9105 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9106                                                 UnaryExprOrTypeTraitExpr *E) {
9107   if (E->isArgumentType()) {
9108     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9109 
9110     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9111     if (!NewT)
9112       return ExprError();
9113 
9114     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9115       return E;
9116 
9117     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9118                                                     E->getKind(),
9119                                                     E->getSourceRange());
9120   }
9121 
9122   // C++0x [expr.sizeof]p1:
9123   //   The operand is either an expression, which is an unevaluated operand
9124   //   [...]
9125   EnterExpressionEvaluationContext Unevaluated(
9126       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9127       Sema::ReuseLambdaContextDecl);
9128 
9129   // Try to recover if we have something like sizeof(T::X) where X is a type.
9130   // Notably, there must be *exactly* one set of parens if X is a type.
9131   TypeSourceInfo *RecoveryTSI = nullptr;
9132   ExprResult SubExpr;
9133   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9134   if (auto *DRE =
9135           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9136     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9137         PE, DRE, false, &RecoveryTSI);
9138   else
9139     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9140 
9141   if (RecoveryTSI) {
9142     return getDerived().RebuildUnaryExprOrTypeTrait(
9143         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9144   } else if (SubExpr.isInvalid())
9145     return ExprError();
9146 
9147   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9148     return E;
9149 
9150   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9151                                                   E->getOperatorLoc(),
9152                                                   E->getKind(),
9153                                                   E->getSourceRange());
9154 }
9155 
9156 template<typename Derived>
9157 ExprResult
9158 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9159   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9160   if (LHS.isInvalid())
9161     return ExprError();
9162 
9163   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9164   if (RHS.isInvalid())
9165     return ExprError();
9166 
9167 
9168   if (!getDerived().AlwaysRebuild() &&
9169       LHS.get() == E->getLHS() &&
9170       RHS.get() == E->getRHS())
9171     return E;
9172 
9173   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
9174                                            /*FIXME:*/E->getLHS()->getLocStart(),
9175                                                 RHS.get(),
9176                                                 E->getRBracketLoc());
9177 }
9178 
9179 template <typename Derived>
9180 ExprResult
9181 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9182   ExprResult Base = getDerived().TransformExpr(E->getBase());
9183   if (Base.isInvalid())
9184     return ExprError();
9185 
9186   ExprResult LowerBound;
9187   if (E->getLowerBound()) {
9188     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9189     if (LowerBound.isInvalid())
9190       return ExprError();
9191   }
9192 
9193   ExprResult Length;
9194   if (E->getLength()) {
9195     Length = getDerived().TransformExpr(E->getLength());
9196     if (Length.isInvalid())
9197       return ExprError();
9198   }
9199 
9200   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9201       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9202     return E;
9203 
9204   return getDerived().RebuildOMPArraySectionExpr(
9205       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
9206       Length.get(), E->getRBracketLoc());
9207 }
9208 
9209 template<typename Derived>
9210 ExprResult
9211 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9212   // Transform the callee.
9213   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9214   if (Callee.isInvalid())
9215     return ExprError();
9216 
9217   // Transform arguments.
9218   bool ArgChanged = false;
9219   SmallVector<Expr*, 8> Args;
9220   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9221                                   &ArgChanged))
9222     return ExprError();
9223 
9224   if (!getDerived().AlwaysRebuild() &&
9225       Callee.get() == E->getCallee() &&
9226       !ArgChanged)
9227     return SemaRef.MaybeBindToTemporary(E);
9228 
9229   // FIXME: Wrong source location information for the '('.
9230   SourceLocation FakeLParenLoc
9231     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9232   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9233                                       Args,
9234                                       E->getRParenLoc());
9235 }
9236 
9237 template<typename Derived>
9238 ExprResult
9239 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9240   ExprResult Base = getDerived().TransformExpr(E->getBase());
9241   if (Base.isInvalid())
9242     return ExprError();
9243 
9244   NestedNameSpecifierLoc QualifierLoc;
9245   if (E->hasQualifier()) {
9246     QualifierLoc
9247       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9248 
9249     if (!QualifierLoc)
9250       return ExprError();
9251   }
9252   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9253 
9254   ValueDecl *Member
9255     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9256                                                          E->getMemberDecl()));
9257   if (!Member)
9258     return ExprError();
9259 
9260   NamedDecl *FoundDecl = E->getFoundDecl();
9261   if (FoundDecl == E->getMemberDecl()) {
9262     FoundDecl = Member;
9263   } else {
9264     FoundDecl = cast_or_null<NamedDecl>(
9265                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9266     if (!FoundDecl)
9267       return ExprError();
9268   }
9269 
9270   if (!getDerived().AlwaysRebuild() &&
9271       Base.get() == E->getBase() &&
9272       QualifierLoc == E->getQualifierLoc() &&
9273       Member == E->getMemberDecl() &&
9274       FoundDecl == E->getFoundDecl() &&
9275       !E->hasExplicitTemplateArgs()) {
9276 
9277     // Mark it referenced in the new context regardless.
9278     // FIXME: this is a bit instantiation-specific.
9279     SemaRef.MarkMemberReferenced(E);
9280 
9281     return E;
9282   }
9283 
9284   TemplateArgumentListInfo TransArgs;
9285   if (E->hasExplicitTemplateArgs()) {
9286     TransArgs.setLAngleLoc(E->getLAngleLoc());
9287     TransArgs.setRAngleLoc(E->getRAngleLoc());
9288     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9289                                                 E->getNumTemplateArgs(),
9290                                                 TransArgs))
9291       return ExprError();
9292   }
9293 
9294   // FIXME: Bogus source location for the operator
9295   SourceLocation FakeOperatorLoc =
9296       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9297 
9298   // FIXME: to do this check properly, we will need to preserve the
9299   // first-qualifier-in-scope here, just in case we had a dependent
9300   // base (and therefore couldn't do the check) and a
9301   // nested-name-qualifier (and therefore could do the lookup).
9302   NamedDecl *FirstQualifierInScope = nullptr;
9303   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9304   if (MemberNameInfo.getName()) {
9305     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9306     if (!MemberNameInfo.getName())
9307       return ExprError();
9308   }
9309 
9310   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9311                                         E->isArrow(),
9312                                         QualifierLoc,
9313                                         TemplateKWLoc,
9314                                         MemberNameInfo,
9315                                         Member,
9316                                         FoundDecl,
9317                                         (E->hasExplicitTemplateArgs()
9318                                            ? &TransArgs : nullptr),
9319                                         FirstQualifierInScope);
9320 }
9321 
9322 template<typename Derived>
9323 ExprResult
9324 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9325   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9326   if (LHS.isInvalid())
9327     return ExprError();
9328 
9329   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9330   if (RHS.isInvalid())
9331     return ExprError();
9332 
9333   if (!getDerived().AlwaysRebuild() &&
9334       LHS.get() == E->getLHS() &&
9335       RHS.get() == E->getRHS())
9336     return E;
9337 
9338   Sema::FPContractStateRAII FPContractState(getSema());
9339   getSema().FPFeatures = E->getFPFeatures();
9340 
9341   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9342                                             LHS.get(), RHS.get());
9343 }
9344 
9345 template<typename Derived>
9346 ExprResult
9347 TreeTransform<Derived>::TransformCompoundAssignOperator(
9348                                                       CompoundAssignOperator *E) {
9349   return getDerived().TransformBinaryOperator(E);
9350 }
9351 
9352 template<typename Derived>
9353 ExprResult TreeTransform<Derived>::
9354 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9355   // Just rebuild the common and RHS expressions and see whether we
9356   // get any changes.
9357 
9358   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9359   if (commonExpr.isInvalid())
9360     return ExprError();
9361 
9362   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9363   if (rhs.isInvalid())
9364     return ExprError();
9365 
9366   if (!getDerived().AlwaysRebuild() &&
9367       commonExpr.get() == e->getCommon() &&
9368       rhs.get() == e->getFalseExpr())
9369     return e;
9370 
9371   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9372                                                  e->getQuestionLoc(),
9373                                                  nullptr,
9374                                                  e->getColonLoc(),
9375                                                  rhs.get());
9376 }
9377 
9378 template<typename Derived>
9379 ExprResult
9380 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9381   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9382   if (Cond.isInvalid())
9383     return ExprError();
9384 
9385   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9386   if (LHS.isInvalid())
9387     return ExprError();
9388 
9389   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9390   if (RHS.isInvalid())
9391     return ExprError();
9392 
9393   if (!getDerived().AlwaysRebuild() &&
9394       Cond.get() == E->getCond() &&
9395       LHS.get() == E->getLHS() &&
9396       RHS.get() == E->getRHS())
9397     return E;
9398 
9399   return getDerived().RebuildConditionalOperator(Cond.get(),
9400                                                  E->getQuestionLoc(),
9401                                                  LHS.get(),
9402                                                  E->getColonLoc(),
9403                                                  RHS.get());
9404 }
9405 
9406 template<typename Derived>
9407 ExprResult
9408 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9409   // Implicit casts are eliminated during transformation, since they
9410   // will be recomputed by semantic analysis after transformation.
9411   return getDerived().TransformExpr(E->getSubExprAsWritten());
9412 }
9413 
9414 template<typename Derived>
9415 ExprResult
9416 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9417   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9418   if (!Type)
9419     return ExprError();
9420 
9421   ExprResult SubExpr
9422     = getDerived().TransformExpr(E->getSubExprAsWritten());
9423   if (SubExpr.isInvalid())
9424     return ExprError();
9425 
9426   if (!getDerived().AlwaysRebuild() &&
9427       Type == E->getTypeInfoAsWritten() &&
9428       SubExpr.get() == E->getSubExpr())
9429     return E;
9430 
9431   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9432                                             Type,
9433                                             E->getRParenLoc(),
9434                                             SubExpr.get());
9435 }
9436 
9437 template<typename Derived>
9438 ExprResult
9439 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9440   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9441   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9442   if (!NewT)
9443     return ExprError();
9444 
9445   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9446   if (Init.isInvalid())
9447     return ExprError();
9448 
9449   if (!getDerived().AlwaysRebuild() &&
9450       OldT == NewT &&
9451       Init.get() == E->getInitializer())
9452     return SemaRef.MaybeBindToTemporary(E);
9453 
9454   // Note: the expression type doesn't necessarily match the
9455   // type-as-written, but that's okay, because it should always be
9456   // derivable from the initializer.
9457 
9458   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
9459                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
9460                                                  Init.get());
9461 }
9462 
9463 template<typename Derived>
9464 ExprResult
9465 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9466   ExprResult Base = getDerived().TransformExpr(E->getBase());
9467   if (Base.isInvalid())
9468     return ExprError();
9469 
9470   if (!getDerived().AlwaysRebuild() &&
9471       Base.get() == E->getBase())
9472     return E;
9473 
9474   // FIXME: Bad source location
9475   SourceLocation FakeOperatorLoc =
9476       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
9477   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9478                                                   E->getAccessorLoc(),
9479                                                   E->getAccessor());
9480 }
9481 
9482 template<typename Derived>
9483 ExprResult
9484 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9485   if (InitListExpr *Syntactic = E->getSyntacticForm())
9486     E = Syntactic;
9487 
9488   bool InitChanged = false;
9489 
9490   SmallVector<Expr*, 4> Inits;
9491   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9492                                   Inits, &InitChanged))
9493     return ExprError();
9494 
9495   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9496     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9497     // in some cases. We can't reuse it in general, because the syntactic and
9498     // semantic forms are linked, and we can't know that semantic form will
9499     // match even if the syntactic form does.
9500   }
9501 
9502   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9503                                       E->getRBraceLoc());
9504 }
9505 
9506 template<typename Derived>
9507 ExprResult
9508 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9509   Designation Desig;
9510 
9511   // transform the initializer value
9512   ExprResult Init = getDerived().TransformExpr(E->getInit());
9513   if (Init.isInvalid())
9514     return ExprError();
9515 
9516   // transform the designators.
9517   SmallVector<Expr*, 4> ArrayExprs;
9518   bool ExprChanged = false;
9519   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9520     if (D.isFieldDesignator()) {
9521       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9522                                                D.getDotLoc(),
9523                                                D.getFieldLoc()));
9524       if (D.getField()) {
9525         FieldDecl *Field = cast_or_null<FieldDecl>(
9526             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9527         if (Field != D.getField())
9528           // Rebuild the expression when the transformed FieldDecl is
9529           // different to the already assigned FieldDecl.
9530           ExprChanged = true;
9531       } else {
9532         // Ensure that the designator expression is rebuilt when there isn't
9533         // a resolved FieldDecl in the designator as we don't want to assign
9534         // a FieldDecl to a pattern designator that will be instantiated again.
9535         ExprChanged = true;
9536       }
9537       continue;
9538     }
9539 
9540     if (D.isArrayDesignator()) {
9541       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9542       if (Index.isInvalid())
9543         return ExprError();
9544 
9545       Desig.AddDesignator(
9546           Designator::getArray(Index.get(), D.getLBracketLoc()));
9547 
9548       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9549       ArrayExprs.push_back(Index.get());
9550       continue;
9551     }
9552 
9553     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9554     ExprResult Start
9555       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9556     if (Start.isInvalid())
9557       return ExprError();
9558 
9559     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9560     if (End.isInvalid())
9561       return ExprError();
9562 
9563     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9564                                                   End.get(),
9565                                                   D.getLBracketLoc(),
9566                                                   D.getEllipsisLoc()));
9567 
9568     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9569                   End.get() != E->getArrayRangeEnd(D);
9570 
9571     ArrayExprs.push_back(Start.get());
9572     ArrayExprs.push_back(End.get());
9573   }
9574 
9575   if (!getDerived().AlwaysRebuild() &&
9576       Init.get() == E->getInit() &&
9577       !ExprChanged)
9578     return E;
9579 
9580   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9581                                                 E->getEqualOrColonLoc(),
9582                                                 E->usesGNUSyntax(), Init.get());
9583 }
9584 
9585 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9586 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9587 template<typename Derived>
9588 ExprResult
9589 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9590     DesignatedInitUpdateExpr *E) {
9591   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9592                    "initializer");
9593   return ExprError();
9594 }
9595 
9596 template<typename Derived>
9597 ExprResult
9598 TreeTransform<Derived>::TransformNoInitExpr(
9599     NoInitExpr *E) {
9600   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9601   return ExprError();
9602 }
9603 
9604 template<typename Derived>
9605 ExprResult
9606 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9607   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9608   return ExprError();
9609 }
9610 
9611 template<typename Derived>
9612 ExprResult
9613 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9614   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9615   return ExprError();
9616 }
9617 
9618 template<typename Derived>
9619 ExprResult
9620 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9621                                                      ImplicitValueInitExpr *E) {
9622   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9623 
9624   // FIXME: Will we ever have proper type location here? Will we actually
9625   // need to transform the type?
9626   QualType T = getDerived().TransformType(E->getType());
9627   if (T.isNull())
9628     return ExprError();
9629 
9630   if (!getDerived().AlwaysRebuild() &&
9631       T == E->getType())
9632     return E;
9633 
9634   return getDerived().RebuildImplicitValueInitExpr(T);
9635 }
9636 
9637 template<typename Derived>
9638 ExprResult
9639 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9640   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9641   if (!TInfo)
9642     return ExprError();
9643 
9644   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9645   if (SubExpr.isInvalid())
9646     return ExprError();
9647 
9648   if (!getDerived().AlwaysRebuild() &&
9649       TInfo == E->getWrittenTypeInfo() &&
9650       SubExpr.get() == E->getSubExpr())
9651     return E;
9652 
9653   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9654                                        TInfo, E->getRParenLoc());
9655 }
9656 
9657 template<typename Derived>
9658 ExprResult
9659 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9660   bool ArgumentChanged = false;
9661   SmallVector<Expr*, 4> Inits;
9662   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9663                      &ArgumentChanged))
9664     return ExprError();
9665 
9666   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9667                                            Inits,
9668                                            E->getRParenLoc());
9669 }
9670 
9671 /// \brief Transform an address-of-label expression.
9672 ///
9673 /// By default, the transformation of an address-of-label expression always
9674 /// rebuilds the expression, so that the label identifier can be resolved to
9675 /// the corresponding label statement by semantic analysis.
9676 template<typename Derived>
9677 ExprResult
9678 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9679   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9680                                         E->getLabel());
9681   if (!LD)
9682     return ExprError();
9683 
9684   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9685                                            cast<LabelDecl>(LD));
9686 }
9687 
9688 template<typename Derived>
9689 ExprResult
9690 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9691   SemaRef.ActOnStartStmtExpr();
9692   StmtResult SubStmt
9693     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9694   if (SubStmt.isInvalid()) {
9695     SemaRef.ActOnStmtExprError();
9696     return ExprError();
9697   }
9698 
9699   if (!getDerived().AlwaysRebuild() &&
9700       SubStmt.get() == E->getSubStmt()) {
9701     // Calling this an 'error' is unintuitive, but it does the right thing.
9702     SemaRef.ActOnStmtExprError();
9703     return SemaRef.MaybeBindToTemporary(E);
9704   }
9705 
9706   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9707                                       SubStmt.get(),
9708                                       E->getRParenLoc());
9709 }
9710 
9711 template<typename Derived>
9712 ExprResult
9713 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9714   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9715   if (Cond.isInvalid())
9716     return ExprError();
9717 
9718   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9719   if (LHS.isInvalid())
9720     return ExprError();
9721 
9722   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9723   if (RHS.isInvalid())
9724     return ExprError();
9725 
9726   if (!getDerived().AlwaysRebuild() &&
9727       Cond.get() == E->getCond() &&
9728       LHS.get() == E->getLHS() &&
9729       RHS.get() == E->getRHS())
9730     return E;
9731 
9732   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9733                                         Cond.get(), LHS.get(), RHS.get(),
9734                                         E->getRParenLoc());
9735 }
9736 
9737 template<typename Derived>
9738 ExprResult
9739 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9740   return E;
9741 }
9742 
9743 template<typename Derived>
9744 ExprResult
9745 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9746   switch (E->getOperator()) {
9747   case OO_New:
9748   case OO_Delete:
9749   case OO_Array_New:
9750   case OO_Array_Delete:
9751     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9752 
9753   case OO_Call: {
9754     // This is a call to an object's operator().
9755     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9756 
9757     // Transform the object itself.
9758     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9759     if (Object.isInvalid())
9760       return ExprError();
9761 
9762     // FIXME: Poor location information
9763     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9764         static_cast<Expr *>(Object.get())->getLocEnd());
9765 
9766     // Transform the call arguments.
9767     SmallVector<Expr*, 8> Args;
9768     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9769                                     Args))
9770       return ExprError();
9771 
9772     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9773                                         Args,
9774                                         E->getLocEnd());
9775   }
9776 
9777 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9778   case OO_##Name:
9779 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9780 #include "clang/Basic/OperatorKinds.def"
9781   case OO_Subscript:
9782     // Handled below.
9783     break;
9784 
9785   case OO_Conditional:
9786     llvm_unreachable("conditional operator is not actually overloadable");
9787 
9788   case OO_None:
9789   case NUM_OVERLOADED_OPERATORS:
9790     llvm_unreachable("not an overloaded operator?");
9791   }
9792 
9793   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9794   if (Callee.isInvalid())
9795     return ExprError();
9796 
9797   ExprResult First;
9798   if (E->getOperator() == OO_Amp)
9799     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9800   else
9801     First = getDerived().TransformExpr(E->getArg(0));
9802   if (First.isInvalid())
9803     return ExprError();
9804 
9805   ExprResult Second;
9806   if (E->getNumArgs() == 2) {
9807     Second = getDerived().TransformExpr(E->getArg(1));
9808     if (Second.isInvalid())
9809       return ExprError();
9810   }
9811 
9812   if (!getDerived().AlwaysRebuild() &&
9813       Callee.get() == E->getCallee() &&
9814       First.get() == E->getArg(0) &&
9815       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9816     return SemaRef.MaybeBindToTemporary(E);
9817 
9818   Sema::FPContractStateRAII FPContractState(getSema());
9819   getSema().FPFeatures = E->getFPFeatures();
9820 
9821   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9822                                                  E->getOperatorLoc(),
9823                                                  Callee.get(),
9824                                                  First.get(),
9825                                                  Second.get());
9826 }
9827 
9828 template<typename Derived>
9829 ExprResult
9830 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9831   return getDerived().TransformCallExpr(E);
9832 }
9833 
9834 template<typename Derived>
9835 ExprResult
9836 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9837   // Transform the callee.
9838   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9839   if (Callee.isInvalid())
9840     return ExprError();
9841 
9842   // Transform exec config.
9843   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9844   if (EC.isInvalid())
9845     return ExprError();
9846 
9847   // Transform arguments.
9848   bool ArgChanged = false;
9849   SmallVector<Expr*, 8> Args;
9850   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9851                                   &ArgChanged))
9852     return ExprError();
9853 
9854   if (!getDerived().AlwaysRebuild() &&
9855       Callee.get() == E->getCallee() &&
9856       !ArgChanged)
9857     return SemaRef.MaybeBindToTemporary(E);
9858 
9859   // FIXME: Wrong source location information for the '('.
9860   SourceLocation FakeLParenLoc
9861     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9862   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9863                                       Args,
9864                                       E->getRParenLoc(), EC.get());
9865 }
9866 
9867 template<typename Derived>
9868 ExprResult
9869 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9870   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9871   if (!Type)
9872     return ExprError();
9873 
9874   ExprResult SubExpr
9875     = getDerived().TransformExpr(E->getSubExprAsWritten());
9876   if (SubExpr.isInvalid())
9877     return ExprError();
9878 
9879   if (!getDerived().AlwaysRebuild() &&
9880       Type == E->getTypeInfoAsWritten() &&
9881       SubExpr.get() == E->getSubExpr())
9882     return E;
9883   return getDerived().RebuildCXXNamedCastExpr(
9884       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9885       Type, E->getAngleBrackets().getEnd(),
9886       // FIXME. this should be '(' location
9887       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9888 }
9889 
9890 template<typename Derived>
9891 ExprResult
9892 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9893   return getDerived().TransformCXXNamedCastExpr(E);
9894 }
9895 
9896 template<typename Derived>
9897 ExprResult
9898 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9899   return getDerived().TransformCXXNamedCastExpr(E);
9900 }
9901 
9902 template<typename Derived>
9903 ExprResult
9904 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9905                                                       CXXReinterpretCastExpr *E) {
9906   return getDerived().TransformCXXNamedCastExpr(E);
9907 }
9908 
9909 template<typename Derived>
9910 ExprResult
9911 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9912   return getDerived().TransformCXXNamedCastExpr(E);
9913 }
9914 
9915 template<typename Derived>
9916 ExprResult
9917 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9918                                                      CXXFunctionalCastExpr *E) {
9919   TypeSourceInfo *Type =
9920       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
9921   if (!Type)
9922     return ExprError();
9923 
9924   ExprResult SubExpr
9925     = getDerived().TransformExpr(E->getSubExprAsWritten());
9926   if (SubExpr.isInvalid())
9927     return ExprError();
9928 
9929   if (!getDerived().AlwaysRebuild() &&
9930       Type == E->getTypeInfoAsWritten() &&
9931       SubExpr.get() == E->getSubExpr())
9932     return E;
9933 
9934   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9935                                                    E->getLParenLoc(),
9936                                                    SubExpr.get(),
9937                                                    E->getRParenLoc(),
9938                                                    E->isListInitialization());
9939 }
9940 
9941 template<typename Derived>
9942 ExprResult
9943 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9944   if (E->isTypeOperand()) {
9945     TypeSourceInfo *TInfo
9946       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9947     if (!TInfo)
9948       return ExprError();
9949 
9950     if (!getDerived().AlwaysRebuild() &&
9951         TInfo == E->getTypeOperandSourceInfo())
9952       return E;
9953 
9954     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9955                                              E->getLocStart(),
9956                                              TInfo,
9957                                              E->getLocEnd());
9958   }
9959 
9960   // We don't know whether the subexpression is potentially evaluated until
9961   // after we perform semantic analysis.  We speculatively assume it is
9962   // unevaluated; it will get fixed later if the subexpression is in fact
9963   // potentially evaluated.
9964   EnterExpressionEvaluationContext Unevaluated(
9965       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9966       Sema::ReuseLambdaContextDecl);
9967 
9968   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9969   if (SubExpr.isInvalid())
9970     return ExprError();
9971 
9972   if (!getDerived().AlwaysRebuild() &&
9973       SubExpr.get() == E->getExprOperand())
9974     return E;
9975 
9976   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9977                                            E->getLocStart(),
9978                                            SubExpr.get(),
9979                                            E->getLocEnd());
9980 }
9981 
9982 template<typename Derived>
9983 ExprResult
9984 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9985   if (E->isTypeOperand()) {
9986     TypeSourceInfo *TInfo
9987       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9988     if (!TInfo)
9989       return ExprError();
9990 
9991     if (!getDerived().AlwaysRebuild() &&
9992         TInfo == E->getTypeOperandSourceInfo())
9993       return E;
9994 
9995     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9996                                              E->getLocStart(),
9997                                              TInfo,
9998                                              E->getLocEnd());
9999   }
10000 
10001   EnterExpressionEvaluationContext Unevaluated(
10002       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10003 
10004   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10005   if (SubExpr.isInvalid())
10006     return ExprError();
10007 
10008   if (!getDerived().AlwaysRebuild() &&
10009       SubExpr.get() == E->getExprOperand())
10010     return E;
10011 
10012   return getDerived().RebuildCXXUuidofExpr(E->getType(),
10013                                            E->getLocStart(),
10014                                            SubExpr.get(),
10015                                            E->getLocEnd());
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult
10020 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10021   return E;
10022 }
10023 
10024 template<typename Derived>
10025 ExprResult
10026 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10027                                                      CXXNullPtrLiteralExpr *E) {
10028   return E;
10029 }
10030 
10031 template<typename Derived>
10032 ExprResult
10033 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10034   QualType T = getSema().getCurrentThisType();
10035 
10036   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10037     // Make sure that we capture 'this'.
10038     getSema().CheckCXXThisCapture(E->getLocStart());
10039     return E;
10040   }
10041 
10042   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
10043 }
10044 
10045 template<typename Derived>
10046 ExprResult
10047 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10048   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10049   if (SubExpr.isInvalid())
10050     return ExprError();
10051 
10052   if (!getDerived().AlwaysRebuild() &&
10053       SubExpr.get() == E->getSubExpr())
10054     return E;
10055 
10056   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10057                                           E->isThrownVariableInScope());
10058 }
10059 
10060 template<typename Derived>
10061 ExprResult
10062 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10063   ParmVarDecl *Param
10064     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
10065                                                            E->getParam()));
10066   if (!Param)
10067     return ExprError();
10068 
10069   if (!getDerived().AlwaysRebuild() &&
10070       Param == E->getParam())
10071     return E;
10072 
10073   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10074 }
10075 
10076 template<typename Derived>
10077 ExprResult
10078 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10079   FieldDecl *Field
10080     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
10081                                                          E->getField()));
10082   if (!Field)
10083     return ExprError();
10084 
10085   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10086     return E;
10087 
10088   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10089 }
10090 
10091 template<typename Derived>
10092 ExprResult
10093 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10094                                                     CXXScalarValueInitExpr *E) {
10095   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10096   if (!T)
10097     return ExprError();
10098 
10099   if (!getDerived().AlwaysRebuild() &&
10100       T == E->getTypeSourceInfo())
10101     return E;
10102 
10103   return getDerived().RebuildCXXScalarValueInitExpr(T,
10104                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10105                                                     E->getRParenLoc());
10106 }
10107 
10108 template<typename Derived>
10109 ExprResult
10110 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10111   // Transform the type that we're allocating
10112   TypeSourceInfo *AllocTypeInfo =
10113       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10114   if (!AllocTypeInfo)
10115     return ExprError();
10116 
10117   // Transform the size of the array we're allocating (if any).
10118   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10119   if (ArraySize.isInvalid())
10120     return ExprError();
10121 
10122   // Transform the placement arguments (if any).
10123   bool ArgumentChanged = false;
10124   SmallVector<Expr*, 8> PlacementArgs;
10125   if (getDerived().TransformExprs(E->getPlacementArgs(),
10126                                   E->getNumPlacementArgs(), true,
10127                                   PlacementArgs, &ArgumentChanged))
10128     return ExprError();
10129 
10130   // Transform the initializer (if any).
10131   Expr *OldInit = E->getInitializer();
10132   ExprResult NewInit;
10133   if (OldInit)
10134     NewInit = getDerived().TransformInitializer(OldInit, true);
10135   if (NewInit.isInvalid())
10136     return ExprError();
10137 
10138   // Transform new operator and delete operator.
10139   FunctionDecl *OperatorNew = nullptr;
10140   if (E->getOperatorNew()) {
10141     OperatorNew = cast_or_null<FunctionDecl>(
10142                                  getDerived().TransformDecl(E->getLocStart(),
10143                                                          E->getOperatorNew()));
10144     if (!OperatorNew)
10145       return ExprError();
10146   }
10147 
10148   FunctionDecl *OperatorDelete = nullptr;
10149   if (E->getOperatorDelete()) {
10150     OperatorDelete = cast_or_null<FunctionDecl>(
10151                                    getDerived().TransformDecl(E->getLocStart(),
10152                                                        E->getOperatorDelete()));
10153     if (!OperatorDelete)
10154       return ExprError();
10155   }
10156 
10157   if (!getDerived().AlwaysRebuild() &&
10158       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10159       ArraySize.get() == E->getArraySize() &&
10160       NewInit.get() == OldInit &&
10161       OperatorNew == E->getOperatorNew() &&
10162       OperatorDelete == E->getOperatorDelete() &&
10163       !ArgumentChanged) {
10164     // Mark any declarations we need as referenced.
10165     // FIXME: instantiation-specific.
10166     if (OperatorNew)
10167       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
10168     if (OperatorDelete)
10169       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10170 
10171     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10172       QualType ElementType
10173         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10174       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10175         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10176         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10177           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
10178         }
10179       }
10180     }
10181 
10182     return E;
10183   }
10184 
10185   QualType AllocType = AllocTypeInfo->getType();
10186   if (!ArraySize.get()) {
10187     // If no array size was specified, but the new expression was
10188     // instantiated with an array type (e.g., "new T" where T is
10189     // instantiated with "int[4]"), extract the outer bound from the
10190     // array type as our array size. We do this with constant and
10191     // dependently-sized array types.
10192     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10193     if (!ArrayT) {
10194       // Do nothing
10195     } else if (const ConstantArrayType *ConsArrayT
10196                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10197       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10198                                          SemaRef.Context.getSizeType(),
10199                                          /*FIXME:*/ E->getLocStart());
10200       AllocType = ConsArrayT->getElementType();
10201     } else if (const DependentSizedArrayType *DepArrayT
10202                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10203       if (DepArrayT->getSizeExpr()) {
10204         ArraySize = DepArrayT->getSizeExpr();
10205         AllocType = DepArrayT->getElementType();
10206       }
10207     }
10208   }
10209 
10210   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
10211                                         E->isGlobalNew(),
10212                                         /*FIXME:*/E->getLocStart(),
10213                                         PlacementArgs,
10214                                         /*FIXME:*/E->getLocStart(),
10215                                         E->getTypeIdParens(),
10216                                         AllocType,
10217                                         AllocTypeInfo,
10218                                         ArraySize.get(),
10219                                         E->getDirectInitRange(),
10220                                         NewInit.get());
10221 }
10222 
10223 template<typename Derived>
10224 ExprResult
10225 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10226   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10227   if (Operand.isInvalid())
10228     return ExprError();
10229 
10230   // Transform the delete operator, if known.
10231   FunctionDecl *OperatorDelete = nullptr;
10232   if (E->getOperatorDelete()) {
10233     OperatorDelete = cast_or_null<FunctionDecl>(
10234                                    getDerived().TransformDecl(E->getLocStart(),
10235                                                        E->getOperatorDelete()));
10236     if (!OperatorDelete)
10237       return ExprError();
10238   }
10239 
10240   if (!getDerived().AlwaysRebuild() &&
10241       Operand.get() == E->getArgument() &&
10242       OperatorDelete == E->getOperatorDelete()) {
10243     // Mark any declarations we need as referenced.
10244     // FIXME: instantiation-specific.
10245     if (OperatorDelete)
10246       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10247 
10248     if (!E->getArgument()->isTypeDependent()) {
10249       QualType Destroyed = SemaRef.Context.getBaseElementType(
10250                                                          E->getDestroyedType());
10251       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10252         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10253         SemaRef.MarkFunctionReferenced(E->getLocStart(),
10254                                        SemaRef.LookupDestructor(Record));
10255       }
10256     }
10257 
10258     return E;
10259   }
10260 
10261   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
10262                                            E->isGlobalDelete(),
10263                                            E->isArrayForm(),
10264                                            Operand.get());
10265 }
10266 
10267 template<typename Derived>
10268 ExprResult
10269 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10270                                                      CXXPseudoDestructorExpr *E) {
10271   ExprResult Base = getDerived().TransformExpr(E->getBase());
10272   if (Base.isInvalid())
10273     return ExprError();
10274 
10275   ParsedType ObjectTypePtr;
10276   bool MayBePseudoDestructor = false;
10277   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10278                                               E->getOperatorLoc(),
10279                                         E->isArrow()? tok::arrow : tok::period,
10280                                               ObjectTypePtr,
10281                                               MayBePseudoDestructor);
10282   if (Base.isInvalid())
10283     return ExprError();
10284 
10285   QualType ObjectType = ObjectTypePtr.get();
10286   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10287   if (QualifierLoc) {
10288     QualifierLoc
10289       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10290     if (!QualifierLoc)
10291       return ExprError();
10292   }
10293   CXXScopeSpec SS;
10294   SS.Adopt(QualifierLoc);
10295 
10296   PseudoDestructorTypeStorage Destroyed;
10297   if (E->getDestroyedTypeInfo()) {
10298     TypeSourceInfo *DestroyedTypeInfo
10299       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10300                                                 ObjectType, nullptr, SS);
10301     if (!DestroyedTypeInfo)
10302       return ExprError();
10303     Destroyed = DestroyedTypeInfo;
10304   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10305     // We aren't likely to be able to resolve the identifier down to a type
10306     // now anyway, so just retain the identifier.
10307     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10308                                             E->getDestroyedTypeLoc());
10309   } else {
10310     // Look for a destructor known with the given name.
10311     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10312                                               *E->getDestroyedTypeIdentifier(),
10313                                                 E->getDestroyedTypeLoc(),
10314                                                 /*Scope=*/nullptr,
10315                                                 SS, ObjectTypePtr,
10316                                                 false);
10317     if (!T)
10318       return ExprError();
10319 
10320     Destroyed
10321       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10322                                                  E->getDestroyedTypeLoc());
10323   }
10324 
10325   TypeSourceInfo *ScopeTypeInfo = nullptr;
10326   if (E->getScopeTypeInfo()) {
10327     CXXScopeSpec EmptySS;
10328     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10329                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10330     if (!ScopeTypeInfo)
10331       return ExprError();
10332   }
10333 
10334   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10335                                                      E->getOperatorLoc(),
10336                                                      E->isArrow(),
10337                                                      SS,
10338                                                      ScopeTypeInfo,
10339                                                      E->getColonColonLoc(),
10340                                                      E->getTildeLoc(),
10341                                                      Destroyed);
10342 }
10343 
10344 template <typename Derived>
10345 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10346                                                         bool RequiresADL,
10347                                                         LookupResult &R) {
10348   // Transform all the decls.
10349   bool AllEmptyPacks = true;
10350   for (auto *OldD : Old->decls()) {
10351     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10352     if (!InstD) {
10353       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10354       // This can happen because of dependent hiding.
10355       if (isa<UsingShadowDecl>(OldD))
10356         continue;
10357       else {
10358         R.clear();
10359         return true;
10360       }
10361     }
10362 
10363     // Expand using pack declarations.
10364     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10365     ArrayRef<NamedDecl*> Decls = SingleDecl;
10366     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10367       Decls = UPD->expansions();
10368 
10369     // Expand using declarations.
10370     for (auto *D : Decls) {
10371       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10372         for (auto *SD : UD->shadows())
10373           R.addDecl(SD);
10374       } else {
10375         R.addDecl(D);
10376       }
10377     }
10378 
10379     AllEmptyPacks &= Decls.empty();
10380   };
10381 
10382   // C++ [temp.res]/8.4.2:
10383   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10384   //   a name in the template definition found a using-declaration, but the
10385   //   lookup in the corresponding scope in the instantiation odoes not find
10386   //   any declarations because the using-declaration was a pack expansion and
10387   //   the corresponding pack is empty
10388   if (AllEmptyPacks && !RequiresADL) {
10389     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10390         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
10391     return true;
10392   }
10393 
10394   // Resolve a kind, but don't do any further analysis.  If it's
10395   // ambiguous, the callee needs to deal with it.
10396   R.resolveKind();
10397   return false;
10398 }
10399 
10400 template<typename Derived>
10401 ExprResult
10402 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10403                                                   UnresolvedLookupExpr *Old) {
10404   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10405                  Sema::LookupOrdinaryName);
10406 
10407   // Transform the declaration set.
10408   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10409     return ExprError();
10410 
10411   // Rebuild the nested-name qualifier, if present.
10412   CXXScopeSpec SS;
10413   if (Old->getQualifierLoc()) {
10414     NestedNameSpecifierLoc QualifierLoc
10415       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10416     if (!QualifierLoc)
10417       return ExprError();
10418 
10419     SS.Adopt(QualifierLoc);
10420   }
10421 
10422   if (Old->getNamingClass()) {
10423     CXXRecordDecl *NamingClass
10424       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10425                                                             Old->getNameLoc(),
10426                                                         Old->getNamingClass()));
10427     if (!NamingClass) {
10428       R.clear();
10429       return ExprError();
10430     }
10431 
10432     R.setNamingClass(NamingClass);
10433   }
10434 
10435   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10436 
10437   // If we have neither explicit template arguments, nor the template keyword,
10438   // it's a normal declaration name or member reference.
10439   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10440     NamedDecl *D = R.getAsSingle<NamedDecl>();
10441     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10442     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10443     // give a good diagnostic.
10444     if (D && D->isCXXInstanceMember()) {
10445       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10446                                                      /*TemplateArgs=*/nullptr,
10447                                                      /*Scope=*/nullptr);
10448     }
10449 
10450     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10451   }
10452 
10453   // If we have template arguments, rebuild them, then rebuild the
10454   // templateid expression.
10455   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10456   if (Old->hasExplicitTemplateArgs() &&
10457       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10458                                               Old->getNumTemplateArgs(),
10459                                               TransArgs)) {
10460     R.clear();
10461     return ExprError();
10462   }
10463 
10464   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10465                                             Old->requiresADL(), &TransArgs);
10466 }
10467 
10468 template<typename Derived>
10469 ExprResult
10470 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10471   bool ArgChanged = false;
10472   SmallVector<TypeSourceInfo *, 4> Args;
10473   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10474     TypeSourceInfo *From = E->getArg(I);
10475     TypeLoc FromTL = From->getTypeLoc();
10476     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10477       TypeLocBuilder TLB;
10478       TLB.reserve(FromTL.getFullDataSize());
10479       QualType To = getDerived().TransformType(TLB, FromTL);
10480       if (To.isNull())
10481         return ExprError();
10482 
10483       if (To == From->getType())
10484         Args.push_back(From);
10485       else {
10486         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10487         ArgChanged = true;
10488       }
10489       continue;
10490     }
10491 
10492     ArgChanged = true;
10493 
10494     // We have a pack expansion. Instantiate it.
10495     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10496     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10497     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10498     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10499 
10500     // Determine whether the set of unexpanded parameter packs can and should
10501     // be expanded.
10502     bool Expand = true;
10503     bool RetainExpansion = false;
10504     Optional<unsigned> OrigNumExpansions =
10505         ExpansionTL.getTypePtr()->getNumExpansions();
10506     Optional<unsigned> NumExpansions = OrigNumExpansions;
10507     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10508                                              PatternTL.getSourceRange(),
10509                                              Unexpanded,
10510                                              Expand, RetainExpansion,
10511                                              NumExpansions))
10512       return ExprError();
10513 
10514     if (!Expand) {
10515       // The transform has determined that we should perform a simple
10516       // transformation on the pack expansion, producing another pack
10517       // expansion.
10518       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10519 
10520       TypeLocBuilder TLB;
10521       TLB.reserve(From->getTypeLoc().getFullDataSize());
10522 
10523       QualType To = getDerived().TransformType(TLB, PatternTL);
10524       if (To.isNull())
10525         return ExprError();
10526 
10527       To = getDerived().RebuildPackExpansionType(To,
10528                                                  PatternTL.getSourceRange(),
10529                                                  ExpansionTL.getEllipsisLoc(),
10530                                                  NumExpansions);
10531       if (To.isNull())
10532         return ExprError();
10533 
10534       PackExpansionTypeLoc ToExpansionTL
10535         = TLB.push<PackExpansionTypeLoc>(To);
10536       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10537       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10538       continue;
10539     }
10540 
10541     // Expand the pack expansion by substituting for each argument in the
10542     // pack(s).
10543     for (unsigned I = 0; I != *NumExpansions; ++I) {
10544       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10545       TypeLocBuilder TLB;
10546       TLB.reserve(PatternTL.getFullDataSize());
10547       QualType To = getDerived().TransformType(TLB, PatternTL);
10548       if (To.isNull())
10549         return ExprError();
10550 
10551       if (To->containsUnexpandedParameterPack()) {
10552         To = getDerived().RebuildPackExpansionType(To,
10553                                                    PatternTL.getSourceRange(),
10554                                                    ExpansionTL.getEllipsisLoc(),
10555                                                    NumExpansions);
10556         if (To.isNull())
10557           return ExprError();
10558 
10559         PackExpansionTypeLoc ToExpansionTL
10560           = TLB.push<PackExpansionTypeLoc>(To);
10561         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10562       }
10563 
10564       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10565     }
10566 
10567     if (!RetainExpansion)
10568       continue;
10569 
10570     // If we're supposed to retain a pack expansion, do so by temporarily
10571     // forgetting the partially-substituted parameter pack.
10572     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10573 
10574     TypeLocBuilder TLB;
10575     TLB.reserve(From->getTypeLoc().getFullDataSize());
10576 
10577     QualType To = getDerived().TransformType(TLB, PatternTL);
10578     if (To.isNull())
10579       return ExprError();
10580 
10581     To = getDerived().RebuildPackExpansionType(To,
10582                                                PatternTL.getSourceRange(),
10583                                                ExpansionTL.getEllipsisLoc(),
10584                                                NumExpansions);
10585     if (To.isNull())
10586       return ExprError();
10587 
10588     PackExpansionTypeLoc ToExpansionTL
10589       = TLB.push<PackExpansionTypeLoc>(To);
10590     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10591     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10592   }
10593 
10594   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10595     return E;
10596 
10597   return getDerived().RebuildTypeTrait(E->getTrait(),
10598                                        E->getLocStart(),
10599                                        Args,
10600                                        E->getLocEnd());
10601 }
10602 
10603 template<typename Derived>
10604 ExprResult
10605 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10606   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10607   if (!T)
10608     return ExprError();
10609 
10610   if (!getDerived().AlwaysRebuild() &&
10611       T == E->getQueriedTypeSourceInfo())
10612     return E;
10613 
10614   ExprResult SubExpr;
10615   {
10616     EnterExpressionEvaluationContext Unevaluated(
10617         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10618     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10619     if (SubExpr.isInvalid())
10620       return ExprError();
10621 
10622     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10623       return E;
10624   }
10625 
10626   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10627                                             E->getLocStart(),
10628                                             T,
10629                                             SubExpr.get(),
10630                                             E->getLocEnd());
10631 }
10632 
10633 template<typename Derived>
10634 ExprResult
10635 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10636   ExprResult SubExpr;
10637   {
10638     EnterExpressionEvaluationContext Unevaluated(
10639         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10640     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10641     if (SubExpr.isInvalid())
10642       return ExprError();
10643 
10644     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10645       return E;
10646   }
10647 
10648   return getDerived().RebuildExpressionTrait(
10649       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10650 }
10651 
10652 template <typename Derived>
10653 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10654     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10655     TypeSourceInfo **RecoveryTSI) {
10656   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10657       DRE, AddrTaken, RecoveryTSI);
10658 
10659   // Propagate both errors and recovered types, which return ExprEmpty.
10660   if (!NewDRE.isUsable())
10661     return NewDRE;
10662 
10663   // We got an expr, wrap it up in parens.
10664   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10665     return PE;
10666   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10667                                        PE->getRParen());
10668 }
10669 
10670 template <typename Derived>
10671 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10672     DependentScopeDeclRefExpr *E) {
10673   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10674                                             nullptr);
10675 }
10676 
10677 template<typename Derived>
10678 ExprResult
10679 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10680                                                DependentScopeDeclRefExpr *E,
10681                                                bool IsAddressOfOperand,
10682                                                TypeSourceInfo **RecoveryTSI) {
10683   assert(E->getQualifierLoc());
10684   NestedNameSpecifierLoc QualifierLoc
10685   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10686   if (!QualifierLoc)
10687     return ExprError();
10688   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10689 
10690   // TODO: If this is a conversion-function-id, verify that the
10691   // destination type name (if present) resolves the same way after
10692   // instantiation as it did in the local scope.
10693 
10694   DeclarationNameInfo NameInfo
10695     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10696   if (!NameInfo.getName())
10697     return ExprError();
10698 
10699   if (!E->hasExplicitTemplateArgs()) {
10700     if (!getDerived().AlwaysRebuild() &&
10701         QualifierLoc == E->getQualifierLoc() &&
10702         // Note: it is sufficient to compare the Name component of NameInfo:
10703         // if name has not changed, DNLoc has not changed either.
10704         NameInfo.getName() == E->getDeclName())
10705       return E;
10706 
10707     return getDerived().RebuildDependentScopeDeclRefExpr(
10708         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10709         IsAddressOfOperand, RecoveryTSI);
10710   }
10711 
10712   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10713   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10714                                               E->getNumTemplateArgs(),
10715                                               TransArgs))
10716     return ExprError();
10717 
10718   return getDerived().RebuildDependentScopeDeclRefExpr(
10719       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10720       RecoveryTSI);
10721 }
10722 
10723 template<typename Derived>
10724 ExprResult
10725 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10726   // CXXConstructExprs other than for list-initialization and
10727   // CXXTemporaryObjectExpr are always implicit, so when we have
10728   // a 1-argument construction we just transform that argument.
10729   if ((E->getNumArgs() == 1 ||
10730        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10731       (!getDerived().DropCallArgument(E->getArg(0))) &&
10732       !E->isListInitialization())
10733     return getDerived().TransformExpr(E->getArg(0));
10734 
10735   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10736 
10737   QualType T = getDerived().TransformType(E->getType());
10738   if (T.isNull())
10739     return ExprError();
10740 
10741   CXXConstructorDecl *Constructor
10742     = cast_or_null<CXXConstructorDecl>(
10743                                 getDerived().TransformDecl(E->getLocStart(),
10744                                                          E->getConstructor()));
10745   if (!Constructor)
10746     return ExprError();
10747 
10748   bool ArgumentChanged = false;
10749   SmallVector<Expr*, 8> Args;
10750   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10751                                   &ArgumentChanged))
10752     return ExprError();
10753 
10754   if (!getDerived().AlwaysRebuild() &&
10755       T == E->getType() &&
10756       Constructor == E->getConstructor() &&
10757       !ArgumentChanged) {
10758     // Mark the constructor as referenced.
10759     // FIXME: Instantiation-specific
10760     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10761     return E;
10762   }
10763 
10764   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10765                                               Constructor,
10766                                               E->isElidable(), Args,
10767                                               E->hadMultipleCandidates(),
10768                                               E->isListInitialization(),
10769                                               E->isStdInitListInitialization(),
10770                                               E->requiresZeroInitialization(),
10771                                               E->getConstructionKind(),
10772                                               E->getParenOrBraceRange());
10773 }
10774 
10775 template<typename Derived>
10776 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10777     CXXInheritedCtorInitExpr *E) {
10778   QualType T = getDerived().TransformType(E->getType());
10779   if (T.isNull())
10780     return ExprError();
10781 
10782   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10783       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10784   if (!Constructor)
10785     return ExprError();
10786 
10787   if (!getDerived().AlwaysRebuild() &&
10788       T == E->getType() &&
10789       Constructor == E->getConstructor()) {
10790     // Mark the constructor as referenced.
10791     // FIXME: Instantiation-specific
10792     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10793     return E;
10794   }
10795 
10796   return getDerived().RebuildCXXInheritedCtorInitExpr(
10797       T, E->getLocation(), Constructor,
10798       E->constructsVBase(), E->inheritedFromVBase());
10799 }
10800 
10801 /// \brief Transform a C++ temporary-binding expression.
10802 ///
10803 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10804 /// transform the subexpression and return that.
10805 template<typename Derived>
10806 ExprResult
10807 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10808   return getDerived().TransformExpr(E->getSubExpr());
10809 }
10810 
10811 /// \brief Transform a C++ expression that contains cleanups that should
10812 /// be run after the expression is evaluated.
10813 ///
10814 /// Since ExprWithCleanups nodes are implicitly generated, we
10815 /// just transform the subexpression and return that.
10816 template<typename Derived>
10817 ExprResult
10818 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10819   return getDerived().TransformExpr(E->getSubExpr());
10820 }
10821 
10822 template<typename Derived>
10823 ExprResult
10824 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10825                                                     CXXTemporaryObjectExpr *E) {
10826   TypeSourceInfo *T =
10827       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10828   if (!T)
10829     return ExprError();
10830 
10831   CXXConstructorDecl *Constructor
10832     = cast_or_null<CXXConstructorDecl>(
10833                                   getDerived().TransformDecl(E->getLocStart(),
10834                                                          E->getConstructor()));
10835   if (!Constructor)
10836     return ExprError();
10837 
10838   bool ArgumentChanged = false;
10839   SmallVector<Expr*, 8> Args;
10840   Args.reserve(E->getNumArgs());
10841   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10842                      &ArgumentChanged))
10843     return ExprError();
10844 
10845   if (!getDerived().AlwaysRebuild() &&
10846       T == E->getTypeSourceInfo() &&
10847       Constructor == E->getConstructor() &&
10848       !ArgumentChanged) {
10849     // FIXME: Instantiation-specific
10850     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10851     return SemaRef.MaybeBindToTemporary(E);
10852   }
10853 
10854   // FIXME: We should just pass E->isListInitialization(), but we're not
10855   // prepared to handle list-initialization without a child InitListExpr.
10856   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
10857   return getDerived().RebuildCXXTemporaryObjectExpr(
10858       T, LParenLoc, Args, E->getLocEnd(),
10859       /*ListInitialization=*/LParenLoc.isInvalid());
10860 }
10861 
10862 template<typename Derived>
10863 ExprResult
10864 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10865   // Transform any init-capture expressions before entering the scope of the
10866   // lambda body, because they are not semantically within that scope.
10867   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10868   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10869   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10870                                   E->explicit_capture_begin());
10871   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10872                                     CEnd = E->capture_end();
10873        C != CEnd; ++C) {
10874     if (!E->isInitCapture(C))
10875       continue;
10876     EnterExpressionEvaluationContext EEEC(
10877         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10878     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10879         C->getCapturedVar()->getInit(),
10880         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10881 
10882     if (NewExprInitResult.isInvalid())
10883       return ExprError();
10884     Expr *NewExprInit = NewExprInitResult.get();
10885 
10886     VarDecl *OldVD = C->getCapturedVar();
10887     QualType NewInitCaptureType =
10888         getSema().buildLambdaInitCaptureInitialization(
10889             C->getLocation(), OldVD->getType()->isReferenceType(),
10890             OldVD->getIdentifier(),
10891             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10892     NewExprInitResult = NewExprInit;
10893     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10894         std::make_pair(NewExprInitResult, NewInitCaptureType);
10895   }
10896 
10897   // Transform the template parameters, and add them to the current
10898   // instantiation scope. The null case is handled correctly.
10899   auto TPL = getDerived().TransformTemplateParameterList(
10900       E->getTemplateParameterList());
10901 
10902   // Transform the type of the original lambda's call operator.
10903   // The transformation MUST be done in the CurrentInstantiationScope since
10904   // it introduces a mapping of the original to the newly created
10905   // transformed parameters.
10906   TypeSourceInfo *NewCallOpTSI = nullptr;
10907   {
10908     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10909     FunctionProtoTypeLoc OldCallOpFPTL =
10910         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10911 
10912     TypeLocBuilder NewCallOpTLBuilder;
10913     SmallVector<QualType, 4> ExceptionStorage;
10914     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10915     QualType NewCallOpType = TransformFunctionProtoType(
10916         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10917         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10918           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10919                                               ExceptionStorage, Changed);
10920         });
10921     if (NewCallOpType.isNull())
10922       return ExprError();
10923     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10924                                                         NewCallOpType);
10925   }
10926 
10927   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10928   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10929   LSI->GLTemplateParameterList = TPL;
10930 
10931   // Create the local class that will describe the lambda.
10932   CXXRecordDecl *Class
10933     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10934                                         NewCallOpTSI,
10935                                         /*KnownDependent=*/false,
10936                                         E->getCaptureDefault());
10937   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10938 
10939   // Build the call operator.
10940   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10941       Class, E->getIntroducerRange(), NewCallOpTSI,
10942       E->getCallOperator()->getLocEnd(),
10943       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10944       E->getCallOperator()->isConstexpr());
10945 
10946   LSI->CallOperator = NewCallOperator;
10947 
10948   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10949        I != NumParams; ++I) {
10950     auto *P = NewCallOperator->getParamDecl(I);
10951     if (P->hasUninstantiatedDefaultArg()) {
10952       EnterExpressionEvaluationContext Eval(
10953           getSema(),
10954           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
10955       ExprResult R = getDerived().TransformExpr(
10956           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10957       P->setDefaultArg(R.get());
10958     }
10959   }
10960 
10961   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10962   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10963 
10964   // Introduce the context of the call operator.
10965   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10966                                  /*NewThisContext*/false);
10967 
10968   // Enter the scope of the lambda.
10969   getSema().buildLambdaScope(LSI, NewCallOperator,
10970                              E->getIntroducerRange(),
10971                              E->getCaptureDefault(),
10972                              E->getCaptureDefaultLoc(),
10973                              E->hasExplicitParameters(),
10974                              E->hasExplicitResultType(),
10975                              E->isMutable());
10976 
10977   bool Invalid = false;
10978 
10979   // Transform captures.
10980   bool FinishedExplicitCaptures = false;
10981   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10982                                  CEnd = E->capture_end();
10983        C != CEnd; ++C) {
10984     // When we hit the first implicit capture, tell Sema that we've finished
10985     // the list of explicit captures.
10986     if (!FinishedExplicitCaptures && C->isImplicit()) {
10987       getSema().finishLambdaExplicitCaptures(LSI);
10988       FinishedExplicitCaptures = true;
10989     }
10990 
10991     // Capturing 'this' is trivial.
10992     if (C->capturesThis()) {
10993       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10994                                     /*BuildAndDiagnose*/ true, nullptr,
10995                                     C->getCaptureKind() == LCK_StarThis);
10996       continue;
10997     }
10998     // Captured expression will be recaptured during captured variables
10999     // rebuilding.
11000     if (C->capturesVLAType())
11001       continue;
11002 
11003     // Rebuild init-captures, including the implied field declaration.
11004     if (E->isInitCapture(C)) {
11005       InitCaptureInfoTy InitExprTypePair =
11006           InitCaptureExprsAndTypes[C - E->capture_begin()];
11007       ExprResult Init = InitExprTypePair.first;
11008       QualType InitQualType = InitExprTypePair.second;
11009       if (Init.isInvalid() || InitQualType.isNull()) {
11010         Invalid = true;
11011         continue;
11012       }
11013       VarDecl *OldVD = C->getCapturedVar();
11014       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11015           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
11016           OldVD->getInitStyle(), Init.get());
11017       if (!NewVD)
11018         Invalid = true;
11019       else {
11020         getDerived().transformedLocalDecl(OldVD, NewVD);
11021       }
11022       getSema().buildInitCaptureField(LSI, NewVD);
11023       continue;
11024     }
11025 
11026     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11027 
11028     // Determine the capture kind for Sema.
11029     Sema::TryCaptureKind Kind
11030       = C->isImplicit()? Sema::TryCapture_Implicit
11031                        : C->getCaptureKind() == LCK_ByCopy
11032                            ? Sema::TryCapture_ExplicitByVal
11033                            : Sema::TryCapture_ExplicitByRef;
11034     SourceLocation EllipsisLoc;
11035     if (C->isPackExpansion()) {
11036       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11037       bool ShouldExpand = false;
11038       bool RetainExpansion = false;
11039       Optional<unsigned> NumExpansions;
11040       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11041                                                C->getLocation(),
11042                                                Unexpanded,
11043                                                ShouldExpand, RetainExpansion,
11044                                                NumExpansions)) {
11045         Invalid = true;
11046         continue;
11047       }
11048 
11049       if (ShouldExpand) {
11050         // The transform has determined that we should perform an expansion;
11051         // transform and capture each of the arguments.
11052         // expansion of the pattern. Do so.
11053         VarDecl *Pack = C->getCapturedVar();
11054         for (unsigned I = 0; I != *NumExpansions; ++I) {
11055           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11056           VarDecl *CapturedVar
11057             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11058                                                                Pack));
11059           if (!CapturedVar) {
11060             Invalid = true;
11061             continue;
11062           }
11063 
11064           // Capture the transformed variable.
11065           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11066         }
11067 
11068         // FIXME: Retain a pack expansion if RetainExpansion is true.
11069 
11070         continue;
11071       }
11072 
11073       EllipsisLoc = C->getEllipsisLoc();
11074     }
11075 
11076     // Transform the captured variable.
11077     VarDecl *CapturedVar
11078       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11079                                                          C->getCapturedVar()));
11080     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11081       Invalid = true;
11082       continue;
11083     }
11084 
11085     // Capture the transformed variable.
11086     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11087                                  EllipsisLoc);
11088   }
11089   if (!FinishedExplicitCaptures)
11090     getSema().finishLambdaExplicitCaptures(LSI);
11091 
11092   // Enter a new evaluation context to insulate the lambda from any
11093   // cleanups from the enclosing full-expression.
11094   getSema().PushExpressionEvaluationContext(
11095       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11096 
11097   // Instantiate the body of the lambda expression.
11098   StmtResult Body =
11099       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11100 
11101   // ActOnLambda* will pop the function scope for us.
11102   FuncScopeCleanup.disable();
11103 
11104   if (Body.isInvalid()) {
11105     SavedContext.pop();
11106     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
11107                                /*IsInstantiation=*/true);
11108     return ExprError();
11109   }
11110 
11111   // Copy the LSI before ActOnFinishFunctionBody removes it.
11112   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11113   // the call operator.
11114   auto LSICopy = *LSI;
11115   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11116                                     /*IsInstantiation*/ true);
11117   SavedContext.pop();
11118 
11119   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
11120                                    &LSICopy);
11121 }
11122 
11123 template<typename Derived>
11124 ExprResult
11125 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11126                                                   CXXUnresolvedConstructExpr *E) {
11127   TypeSourceInfo *T =
11128       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11129   if (!T)
11130     return ExprError();
11131 
11132   bool ArgumentChanged = false;
11133   SmallVector<Expr*, 8> Args;
11134   Args.reserve(E->arg_size());
11135   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11136                                   &ArgumentChanged))
11137     return ExprError();
11138 
11139   if (!getDerived().AlwaysRebuild() &&
11140       T == E->getTypeSourceInfo() &&
11141       !ArgumentChanged)
11142     return E;
11143 
11144   // FIXME: we're faking the locations of the commas
11145   return getDerived().RebuildCXXUnresolvedConstructExpr(
11146       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11147 }
11148 
11149 template<typename Derived>
11150 ExprResult
11151 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11152                                              CXXDependentScopeMemberExpr *E) {
11153   // Transform the base of the expression.
11154   ExprResult Base((Expr*) nullptr);
11155   Expr *OldBase;
11156   QualType BaseType;
11157   QualType ObjectType;
11158   if (!E->isImplicitAccess()) {
11159     OldBase = E->getBase();
11160     Base = getDerived().TransformExpr(OldBase);
11161     if (Base.isInvalid())
11162       return ExprError();
11163 
11164     // Start the member reference and compute the object's type.
11165     ParsedType ObjectTy;
11166     bool MayBePseudoDestructor = false;
11167     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11168                                                 E->getOperatorLoc(),
11169                                       E->isArrow()? tok::arrow : tok::period,
11170                                                 ObjectTy,
11171                                                 MayBePseudoDestructor);
11172     if (Base.isInvalid())
11173       return ExprError();
11174 
11175     ObjectType = ObjectTy.get();
11176     BaseType = ((Expr*) Base.get())->getType();
11177   } else {
11178     OldBase = nullptr;
11179     BaseType = getDerived().TransformType(E->getBaseType());
11180     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11181   }
11182 
11183   // Transform the first part of the nested-name-specifier that qualifies
11184   // the member name.
11185   NamedDecl *FirstQualifierInScope
11186     = getDerived().TransformFirstQualifierInScope(
11187                                             E->getFirstQualifierFoundInScope(),
11188                                             E->getQualifierLoc().getBeginLoc());
11189 
11190   NestedNameSpecifierLoc QualifierLoc;
11191   if (E->getQualifier()) {
11192     QualifierLoc
11193       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11194                                                      ObjectType,
11195                                                      FirstQualifierInScope);
11196     if (!QualifierLoc)
11197       return ExprError();
11198   }
11199 
11200   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11201 
11202   // TODO: If this is a conversion-function-id, verify that the
11203   // destination type name (if present) resolves the same way after
11204   // instantiation as it did in the local scope.
11205 
11206   DeclarationNameInfo NameInfo
11207     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11208   if (!NameInfo.getName())
11209     return ExprError();
11210 
11211   if (!E->hasExplicitTemplateArgs()) {
11212     // This is a reference to a member without an explicitly-specified
11213     // template argument list. Optimize for this common case.
11214     if (!getDerived().AlwaysRebuild() &&
11215         Base.get() == OldBase &&
11216         BaseType == E->getBaseType() &&
11217         QualifierLoc == E->getQualifierLoc() &&
11218         NameInfo.getName() == E->getMember() &&
11219         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11220       return E;
11221 
11222     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11223                                                        BaseType,
11224                                                        E->isArrow(),
11225                                                        E->getOperatorLoc(),
11226                                                        QualifierLoc,
11227                                                        TemplateKWLoc,
11228                                                        FirstQualifierInScope,
11229                                                        NameInfo,
11230                                                        /*TemplateArgs*/nullptr);
11231   }
11232 
11233   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11234   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11235                                               E->getNumTemplateArgs(),
11236                                               TransArgs))
11237     return ExprError();
11238 
11239   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11240                                                      BaseType,
11241                                                      E->isArrow(),
11242                                                      E->getOperatorLoc(),
11243                                                      QualifierLoc,
11244                                                      TemplateKWLoc,
11245                                                      FirstQualifierInScope,
11246                                                      NameInfo,
11247                                                      &TransArgs);
11248 }
11249 
11250 template<typename Derived>
11251 ExprResult
11252 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11253   // Transform the base of the expression.
11254   ExprResult Base((Expr*) nullptr);
11255   QualType BaseType;
11256   if (!Old->isImplicitAccess()) {
11257     Base = getDerived().TransformExpr(Old->getBase());
11258     if (Base.isInvalid())
11259       return ExprError();
11260     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11261                                                      Old->isArrow());
11262     if (Base.isInvalid())
11263       return ExprError();
11264     BaseType = Base.get()->getType();
11265   } else {
11266     BaseType = getDerived().TransformType(Old->getBaseType());
11267   }
11268 
11269   NestedNameSpecifierLoc QualifierLoc;
11270   if (Old->getQualifierLoc()) {
11271     QualifierLoc
11272     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11273     if (!QualifierLoc)
11274       return ExprError();
11275   }
11276 
11277   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11278 
11279   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11280                  Sema::LookupOrdinaryName);
11281 
11282   // Transform the declaration set.
11283   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11284     return ExprError();
11285 
11286   // Determine the naming class.
11287   if (Old->getNamingClass()) {
11288     CXXRecordDecl *NamingClass
11289       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11290                                                           Old->getMemberLoc(),
11291                                                         Old->getNamingClass()));
11292     if (!NamingClass)
11293       return ExprError();
11294 
11295     R.setNamingClass(NamingClass);
11296   }
11297 
11298   TemplateArgumentListInfo TransArgs;
11299   if (Old->hasExplicitTemplateArgs()) {
11300     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11301     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11302     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11303                                                 Old->getNumTemplateArgs(),
11304                                                 TransArgs))
11305       return ExprError();
11306   }
11307 
11308   // FIXME: to do this check properly, we will need to preserve the
11309   // first-qualifier-in-scope here, just in case we had a dependent
11310   // base (and therefore couldn't do the check) and a
11311   // nested-name-qualifier (and therefore could do the lookup).
11312   NamedDecl *FirstQualifierInScope = nullptr;
11313 
11314   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11315                                                   BaseType,
11316                                                   Old->getOperatorLoc(),
11317                                                   Old->isArrow(),
11318                                                   QualifierLoc,
11319                                                   TemplateKWLoc,
11320                                                   FirstQualifierInScope,
11321                                                   R,
11322                                               (Old->hasExplicitTemplateArgs()
11323                                                   ? &TransArgs : nullptr));
11324 }
11325 
11326 template<typename Derived>
11327 ExprResult
11328 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11329   EnterExpressionEvaluationContext Unevaluated(
11330       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11331   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11332   if (SubExpr.isInvalid())
11333     return ExprError();
11334 
11335   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11336     return E;
11337 
11338   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11339 }
11340 
11341 template<typename Derived>
11342 ExprResult
11343 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11344   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11345   if (Pattern.isInvalid())
11346     return ExprError();
11347 
11348   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11349     return E;
11350 
11351   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11352                                            E->getNumExpansions());
11353 }
11354 
11355 template<typename Derived>
11356 ExprResult
11357 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11358   // If E is not value-dependent, then nothing will change when we transform it.
11359   // Note: This is an instantiation-centric view.
11360   if (!E->isValueDependent())
11361     return E;
11362 
11363   EnterExpressionEvaluationContext Unevaluated(
11364       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11365 
11366   ArrayRef<TemplateArgument> PackArgs;
11367   TemplateArgument ArgStorage;
11368 
11369   // Find the argument list to transform.
11370   if (E->isPartiallySubstituted()) {
11371     PackArgs = E->getPartialArguments();
11372   } else if (E->isValueDependent()) {
11373     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11374     bool ShouldExpand = false;
11375     bool RetainExpansion = false;
11376     Optional<unsigned> NumExpansions;
11377     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11378                                              Unexpanded,
11379                                              ShouldExpand, RetainExpansion,
11380                                              NumExpansions))
11381       return ExprError();
11382 
11383     // If we need to expand the pack, build a template argument from it and
11384     // expand that.
11385     if (ShouldExpand) {
11386       auto *Pack = E->getPack();
11387       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11388         ArgStorage = getSema().Context.getPackExpansionType(
11389             getSema().Context.getTypeDeclType(TTPD), None);
11390       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11391         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11392       } else {
11393         auto *VD = cast<ValueDecl>(Pack);
11394         ExprResult DRE = getSema().BuildDeclRefExpr(
11395             VD, VD->getType().getNonLValueExprType(getSema().Context),
11396             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11397             E->getPackLoc());
11398         if (DRE.isInvalid())
11399           return ExprError();
11400         ArgStorage = new (getSema().Context) PackExpansionExpr(
11401             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11402       }
11403       PackArgs = ArgStorage;
11404     }
11405   }
11406 
11407   // If we're not expanding the pack, just transform the decl.
11408   if (!PackArgs.size()) {
11409     auto *Pack = cast_or_null<NamedDecl>(
11410         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11411     if (!Pack)
11412       return ExprError();
11413     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11414                                               E->getPackLoc(),
11415                                               E->getRParenLoc(), None, None);
11416   }
11417 
11418   // Try to compute the result without performing a partial substitution.
11419   Optional<unsigned> Result = 0;
11420   for (const TemplateArgument &Arg : PackArgs) {
11421     if (!Arg.isPackExpansion()) {
11422       Result = *Result + 1;
11423       continue;
11424     }
11425 
11426     TemplateArgumentLoc ArgLoc;
11427     InventTemplateArgumentLoc(Arg, ArgLoc);
11428 
11429     // Find the pattern of the pack expansion.
11430     SourceLocation Ellipsis;
11431     Optional<unsigned> OrigNumExpansions;
11432     TemplateArgumentLoc Pattern =
11433         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11434                                                           OrigNumExpansions);
11435 
11436     // Substitute under the pack expansion. Do not expand the pack (yet).
11437     TemplateArgumentLoc OutPattern;
11438     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11439     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11440                                                /*Uneval*/ true))
11441       return true;
11442 
11443     // See if we can determine the number of arguments from the result.
11444     Optional<unsigned> NumExpansions =
11445         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11446     if (!NumExpansions) {
11447       // No: we must be in an alias template expansion, and we're going to need
11448       // to actually expand the packs.
11449       Result = None;
11450       break;
11451     }
11452 
11453     Result = *Result + *NumExpansions;
11454   }
11455 
11456   // Common case: we could determine the number of expansions without
11457   // substituting.
11458   if (Result)
11459     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11460                                               E->getPackLoc(),
11461                                               E->getRParenLoc(), *Result, None);
11462 
11463   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11464                                                E->getPackLoc());
11465   {
11466     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11467     typedef TemplateArgumentLocInventIterator<
11468         Derived, const TemplateArgument*> PackLocIterator;
11469     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11470                                    PackLocIterator(*this, PackArgs.end()),
11471                                    TransformedPackArgs, /*Uneval*/true))
11472       return ExprError();
11473   }
11474 
11475   // Check whether we managed to fully-expand the pack.
11476   // FIXME: Is it possible for us to do so and not hit the early exit path?
11477   SmallVector<TemplateArgument, 8> Args;
11478   bool PartialSubstitution = false;
11479   for (auto &Loc : TransformedPackArgs.arguments()) {
11480     Args.push_back(Loc.getArgument());
11481     if (Loc.getArgument().isPackExpansion())
11482       PartialSubstitution = true;
11483   }
11484 
11485   if (PartialSubstitution)
11486     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11487                                               E->getPackLoc(),
11488                                               E->getRParenLoc(), None, Args);
11489 
11490   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11491                                             E->getPackLoc(), E->getRParenLoc(),
11492                                             Args.size(), None);
11493 }
11494 
11495 template<typename Derived>
11496 ExprResult
11497 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11498                                           SubstNonTypeTemplateParmPackExpr *E) {
11499   // Default behavior is to do nothing with this transformation.
11500   return E;
11501 }
11502 
11503 template<typename Derived>
11504 ExprResult
11505 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11506                                           SubstNonTypeTemplateParmExpr *E) {
11507   // Default behavior is to do nothing with this transformation.
11508   return E;
11509 }
11510 
11511 template<typename Derived>
11512 ExprResult
11513 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11514   // Default behavior is to do nothing with this transformation.
11515   return E;
11516 }
11517 
11518 template<typename Derived>
11519 ExprResult
11520 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11521                                                   MaterializeTemporaryExpr *E) {
11522   return getDerived().TransformExpr(E->GetTemporaryExpr());
11523 }
11524 
11525 template<typename Derived>
11526 ExprResult
11527 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11528   Expr *Pattern = E->getPattern();
11529 
11530   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11531   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11532   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11533 
11534   // Determine whether the set of unexpanded parameter packs can and should
11535   // be expanded.
11536   bool Expand = true;
11537   bool RetainExpansion = false;
11538   Optional<unsigned> NumExpansions;
11539   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11540                                            Pattern->getSourceRange(),
11541                                            Unexpanded,
11542                                            Expand, RetainExpansion,
11543                                            NumExpansions))
11544     return true;
11545 
11546   if (!Expand) {
11547     // Do not expand any packs here, just transform and rebuild a fold
11548     // expression.
11549     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11550 
11551     ExprResult LHS =
11552         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11553     if (LHS.isInvalid())
11554       return true;
11555 
11556     ExprResult RHS =
11557         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11558     if (RHS.isInvalid())
11559       return true;
11560 
11561     if (!getDerived().AlwaysRebuild() &&
11562         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11563       return E;
11564 
11565     return getDerived().RebuildCXXFoldExpr(
11566         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11567         RHS.get(), E->getLocEnd());
11568   }
11569 
11570   // The transform has determined that we should perform an elementwise
11571   // expansion of the pattern. Do so.
11572   ExprResult Result = getDerived().TransformExpr(E->getInit());
11573   if (Result.isInvalid())
11574     return true;
11575   bool LeftFold = E->isLeftFold();
11576 
11577   // If we're retaining an expansion for a right fold, it is the innermost
11578   // component and takes the init (if any).
11579   if (!LeftFold && RetainExpansion) {
11580     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11581 
11582     ExprResult Out = getDerived().TransformExpr(Pattern);
11583     if (Out.isInvalid())
11584       return true;
11585 
11586     Result = getDerived().RebuildCXXFoldExpr(
11587         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11588         Result.get(), E->getLocEnd());
11589     if (Result.isInvalid())
11590       return true;
11591   }
11592 
11593   for (unsigned I = 0; I != *NumExpansions; ++I) {
11594     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11595         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11596     ExprResult Out = getDerived().TransformExpr(Pattern);
11597     if (Out.isInvalid())
11598       return true;
11599 
11600     if (Out.get()->containsUnexpandedParameterPack()) {
11601       // We still have a pack; retain a pack expansion for this slice.
11602       Result = getDerived().RebuildCXXFoldExpr(
11603           E->getLocStart(),
11604           LeftFold ? Result.get() : Out.get(),
11605           E->getOperator(), E->getEllipsisLoc(),
11606           LeftFold ? Out.get() : Result.get(),
11607           E->getLocEnd());
11608     } else if (Result.isUsable()) {
11609       // We've got down to a single element; build a binary operator.
11610       Result = getDerived().RebuildBinaryOperator(
11611           E->getEllipsisLoc(), E->getOperator(),
11612           LeftFold ? Result.get() : Out.get(),
11613           LeftFold ? Out.get() : Result.get());
11614     } else
11615       Result = Out;
11616 
11617     if (Result.isInvalid())
11618       return true;
11619   }
11620 
11621   // If we're retaining an expansion for a left fold, it is the outermost
11622   // component and takes the complete expansion so far as its init (if any).
11623   if (LeftFold && RetainExpansion) {
11624     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11625 
11626     ExprResult Out = getDerived().TransformExpr(Pattern);
11627     if (Out.isInvalid())
11628       return true;
11629 
11630     Result = getDerived().RebuildCXXFoldExpr(
11631         E->getLocStart(), Result.get(),
11632         E->getOperator(), E->getEllipsisLoc(),
11633         Out.get(), E->getLocEnd());
11634     if (Result.isInvalid())
11635       return true;
11636   }
11637 
11638   // If we had no init and an empty pack, and we're not retaining an expansion,
11639   // then produce a fallback value or error.
11640   if (Result.isUnset())
11641     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11642                                                 E->getOperator());
11643 
11644   return Result;
11645 }
11646 
11647 template<typename Derived>
11648 ExprResult
11649 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11650     CXXStdInitializerListExpr *E) {
11651   return getDerived().TransformExpr(E->getSubExpr());
11652 }
11653 
11654 template<typename Derived>
11655 ExprResult
11656 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11657   return SemaRef.MaybeBindToTemporary(E);
11658 }
11659 
11660 template<typename Derived>
11661 ExprResult
11662 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11663   return E;
11664 }
11665 
11666 template<typename Derived>
11667 ExprResult
11668 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11669   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11670   if (SubExpr.isInvalid())
11671     return ExprError();
11672 
11673   if (!getDerived().AlwaysRebuild() &&
11674       SubExpr.get() == E->getSubExpr())
11675     return E;
11676 
11677   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11678 }
11679 
11680 template<typename Derived>
11681 ExprResult
11682 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11683   // Transform each of the elements.
11684   SmallVector<Expr *, 8> Elements;
11685   bool ArgChanged = false;
11686   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11687                                   /*IsCall=*/false, Elements, &ArgChanged))
11688     return ExprError();
11689 
11690   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11691     return SemaRef.MaybeBindToTemporary(E);
11692 
11693   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11694                                               Elements.data(),
11695                                               Elements.size());
11696 }
11697 
11698 template<typename Derived>
11699 ExprResult
11700 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11701                                                     ObjCDictionaryLiteral *E) {
11702   // Transform each of the elements.
11703   SmallVector<ObjCDictionaryElement, 8> Elements;
11704   bool ArgChanged = false;
11705   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11706     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11707 
11708     if (OrigElement.isPackExpansion()) {
11709       // This key/value element is a pack expansion.
11710       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11711       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11712       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11713       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11714 
11715       // Determine whether the set of unexpanded parameter packs can
11716       // and should be expanded.
11717       bool Expand = true;
11718       bool RetainExpansion = false;
11719       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11720       Optional<unsigned> NumExpansions = OrigNumExpansions;
11721       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11722                                OrigElement.Value->getLocEnd());
11723      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11724                                                PatternRange,
11725                                                Unexpanded,
11726                                                Expand, RetainExpansion,
11727                                                NumExpansions))
11728         return ExprError();
11729 
11730       if (!Expand) {
11731         // The transform has determined that we should perform a simple
11732         // transformation on the pack expansion, producing another pack
11733         // expansion.
11734         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11735         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11736         if (Key.isInvalid())
11737           return ExprError();
11738 
11739         if (Key.get() != OrigElement.Key)
11740           ArgChanged = true;
11741 
11742         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11743         if (Value.isInvalid())
11744           return ExprError();
11745 
11746         if (Value.get() != OrigElement.Value)
11747           ArgChanged = true;
11748 
11749         ObjCDictionaryElement Expansion = {
11750           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11751         };
11752         Elements.push_back(Expansion);
11753         continue;
11754       }
11755 
11756       // Record right away that the argument was changed.  This needs
11757       // to happen even if the array expands to nothing.
11758       ArgChanged = true;
11759 
11760       // The transform has determined that we should perform an elementwise
11761       // expansion of the pattern. Do so.
11762       for (unsigned I = 0; I != *NumExpansions; ++I) {
11763         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11764         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11765         if (Key.isInvalid())
11766           return ExprError();
11767 
11768         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11769         if (Value.isInvalid())
11770           return ExprError();
11771 
11772         ObjCDictionaryElement Element = {
11773           Key.get(), Value.get(), SourceLocation(), NumExpansions
11774         };
11775 
11776         // If any unexpanded parameter packs remain, we still have a
11777         // pack expansion.
11778         // FIXME: Can this really happen?
11779         if (Key.get()->containsUnexpandedParameterPack() ||
11780             Value.get()->containsUnexpandedParameterPack())
11781           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11782 
11783         Elements.push_back(Element);
11784       }
11785 
11786       // FIXME: Retain a pack expansion if RetainExpansion is true.
11787 
11788       // We've finished with this pack expansion.
11789       continue;
11790     }
11791 
11792     // Transform and check key.
11793     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11794     if (Key.isInvalid())
11795       return ExprError();
11796 
11797     if (Key.get() != OrigElement.Key)
11798       ArgChanged = true;
11799 
11800     // Transform and check value.
11801     ExprResult Value
11802       = getDerived().TransformExpr(OrigElement.Value);
11803     if (Value.isInvalid())
11804       return ExprError();
11805 
11806     if (Value.get() != OrigElement.Value)
11807       ArgChanged = true;
11808 
11809     ObjCDictionaryElement Element = {
11810       Key.get(), Value.get(), SourceLocation(), None
11811     };
11812     Elements.push_back(Element);
11813   }
11814 
11815   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11816     return SemaRef.MaybeBindToTemporary(E);
11817 
11818   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11819                                                    Elements);
11820 }
11821 
11822 template<typename Derived>
11823 ExprResult
11824 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11825   TypeSourceInfo *EncodedTypeInfo
11826     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11827   if (!EncodedTypeInfo)
11828     return ExprError();
11829 
11830   if (!getDerived().AlwaysRebuild() &&
11831       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11832     return E;
11833 
11834   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11835                                             EncodedTypeInfo,
11836                                             E->getRParenLoc());
11837 }
11838 
11839 template<typename Derived>
11840 ExprResult TreeTransform<Derived>::
11841 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11842   // This is a kind of implicit conversion, and it needs to get dropped
11843   // and recomputed for the same general reasons that ImplicitCastExprs
11844   // do, as well a more specific one: this expression is only valid when
11845   // it appears *immediately* as an argument expression.
11846   return getDerived().TransformExpr(E->getSubExpr());
11847 }
11848 
11849 template<typename Derived>
11850 ExprResult TreeTransform<Derived>::
11851 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11852   TypeSourceInfo *TSInfo
11853     = getDerived().TransformType(E->getTypeInfoAsWritten());
11854   if (!TSInfo)
11855     return ExprError();
11856 
11857   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11858   if (Result.isInvalid())
11859     return ExprError();
11860 
11861   if (!getDerived().AlwaysRebuild() &&
11862       TSInfo == E->getTypeInfoAsWritten() &&
11863       Result.get() == E->getSubExpr())
11864     return E;
11865 
11866   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11867                                       E->getBridgeKeywordLoc(), TSInfo,
11868                                       Result.get());
11869 }
11870 
11871 template <typename Derived>
11872 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11873     ObjCAvailabilityCheckExpr *E) {
11874   return E;
11875 }
11876 
11877 template<typename Derived>
11878 ExprResult
11879 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11880   // Transform arguments.
11881   bool ArgChanged = false;
11882   SmallVector<Expr*, 8> Args;
11883   Args.reserve(E->getNumArgs());
11884   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11885                                   &ArgChanged))
11886     return ExprError();
11887 
11888   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11889     // Class message: transform the receiver type.
11890     TypeSourceInfo *ReceiverTypeInfo
11891       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11892     if (!ReceiverTypeInfo)
11893       return ExprError();
11894 
11895     // If nothing changed, just retain the existing message send.
11896     if (!getDerived().AlwaysRebuild() &&
11897         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11898       return SemaRef.MaybeBindToTemporary(E);
11899 
11900     // Build a new class message send.
11901     SmallVector<SourceLocation, 16> SelLocs;
11902     E->getSelectorLocs(SelLocs);
11903     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11904                                                E->getSelector(),
11905                                                SelLocs,
11906                                                E->getMethodDecl(),
11907                                                E->getLeftLoc(),
11908                                                Args,
11909                                                E->getRightLoc());
11910   }
11911   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11912            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11913     if (!E->getMethodDecl())
11914       return ExprError();
11915 
11916     // Build a new class message send to 'super'.
11917     SmallVector<SourceLocation, 16> SelLocs;
11918     E->getSelectorLocs(SelLocs);
11919     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11920                                                E->getSelector(),
11921                                                SelLocs,
11922                                                E->getReceiverType(),
11923                                                E->getMethodDecl(),
11924                                                E->getLeftLoc(),
11925                                                Args,
11926                                                E->getRightLoc());
11927   }
11928 
11929   // Instance message: transform the receiver
11930   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11931          "Only class and instance messages may be instantiated");
11932   ExprResult Receiver
11933     = getDerived().TransformExpr(E->getInstanceReceiver());
11934   if (Receiver.isInvalid())
11935     return ExprError();
11936 
11937   // If nothing changed, just retain the existing message send.
11938   if (!getDerived().AlwaysRebuild() &&
11939       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11940     return SemaRef.MaybeBindToTemporary(E);
11941 
11942   // Build a new instance message send.
11943   SmallVector<SourceLocation, 16> SelLocs;
11944   E->getSelectorLocs(SelLocs);
11945   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11946                                              E->getSelector(),
11947                                              SelLocs,
11948                                              E->getMethodDecl(),
11949                                              E->getLeftLoc(),
11950                                              Args,
11951                                              E->getRightLoc());
11952 }
11953 
11954 template<typename Derived>
11955 ExprResult
11956 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11957   return E;
11958 }
11959 
11960 template<typename Derived>
11961 ExprResult
11962 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11963   return E;
11964 }
11965 
11966 template<typename Derived>
11967 ExprResult
11968 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11969   // Transform the base expression.
11970   ExprResult Base = getDerived().TransformExpr(E->getBase());
11971   if (Base.isInvalid())
11972     return ExprError();
11973 
11974   // We don't need to transform the ivar; it will never change.
11975 
11976   // If nothing changed, just retain the existing expression.
11977   if (!getDerived().AlwaysRebuild() &&
11978       Base.get() == E->getBase())
11979     return E;
11980 
11981   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11982                                              E->getLocation(),
11983                                              E->isArrow(), E->isFreeIvar());
11984 }
11985 
11986 template<typename Derived>
11987 ExprResult
11988 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11989   // 'super' and types never change. Property never changes. Just
11990   // retain the existing expression.
11991   if (!E->isObjectReceiver())
11992     return E;
11993 
11994   // Transform the base expression.
11995   ExprResult Base = getDerived().TransformExpr(E->getBase());
11996   if (Base.isInvalid())
11997     return ExprError();
11998 
11999   // We don't need to transform the property; it will never change.
12000 
12001   // If nothing changed, just retain the existing expression.
12002   if (!getDerived().AlwaysRebuild() &&
12003       Base.get() == E->getBase())
12004     return E;
12005 
12006   if (E->isExplicitProperty())
12007     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12008                                                    E->getExplicitProperty(),
12009                                                    E->getLocation());
12010 
12011   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12012                                                  SemaRef.Context.PseudoObjectTy,
12013                                                  E->getImplicitPropertyGetter(),
12014                                                  E->getImplicitPropertySetter(),
12015                                                  E->getLocation());
12016 }
12017 
12018 template<typename Derived>
12019 ExprResult
12020 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12021   // Transform the base expression.
12022   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12023   if (Base.isInvalid())
12024     return ExprError();
12025 
12026   // Transform the key expression.
12027   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12028   if (Key.isInvalid())
12029     return ExprError();
12030 
12031   // If nothing changed, just retain the existing expression.
12032   if (!getDerived().AlwaysRebuild() &&
12033       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12034     return E;
12035 
12036   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12037                                                   Base.get(), Key.get(),
12038                                                   E->getAtIndexMethodDecl(),
12039                                                   E->setAtIndexMethodDecl());
12040 }
12041 
12042 template<typename Derived>
12043 ExprResult
12044 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12045   // Transform the base expression.
12046   ExprResult Base = getDerived().TransformExpr(E->getBase());
12047   if (Base.isInvalid())
12048     return ExprError();
12049 
12050   // If nothing changed, just retain the existing expression.
12051   if (!getDerived().AlwaysRebuild() &&
12052       Base.get() == E->getBase())
12053     return E;
12054 
12055   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12056                                          E->getOpLoc(),
12057                                          E->isArrow());
12058 }
12059 
12060 template<typename Derived>
12061 ExprResult
12062 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12063   bool ArgumentChanged = false;
12064   SmallVector<Expr*, 8> SubExprs;
12065   SubExprs.reserve(E->getNumSubExprs());
12066   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12067                                   SubExprs, &ArgumentChanged))
12068     return ExprError();
12069 
12070   if (!getDerived().AlwaysRebuild() &&
12071       !ArgumentChanged)
12072     return E;
12073 
12074   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12075                                                SubExprs,
12076                                                E->getRParenLoc());
12077 }
12078 
12079 template<typename Derived>
12080 ExprResult
12081 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12082   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12083   if (SrcExpr.isInvalid())
12084     return ExprError();
12085 
12086   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12087   if (!Type)
12088     return ExprError();
12089 
12090   if (!getDerived().AlwaysRebuild() &&
12091       Type == E->getTypeSourceInfo() &&
12092       SrcExpr.get() == E->getSrcExpr())
12093     return E;
12094 
12095   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12096                                                SrcExpr.get(), Type,
12097                                                E->getRParenLoc());
12098 }
12099 
12100 template<typename Derived>
12101 ExprResult
12102 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12103   BlockDecl *oldBlock = E->getBlockDecl();
12104 
12105   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12106   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12107 
12108   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12109   blockScope->TheDecl->setBlockMissingReturnType(
12110                          oldBlock->blockMissingReturnType());
12111 
12112   SmallVector<ParmVarDecl*, 4> params;
12113   SmallVector<QualType, 4> paramTypes;
12114 
12115   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12116 
12117   // Parameter substitution.
12118   Sema::ExtParameterInfoBuilder extParamInfos;
12119   if (getDerived().TransformFunctionTypeParams(
12120           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12121           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12122           extParamInfos)) {
12123     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12124     return ExprError();
12125   }
12126 
12127   QualType exprResultType =
12128       getDerived().TransformType(exprFunctionType->getReturnType());
12129 
12130   auto epi = exprFunctionType->getExtProtoInfo();
12131   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12132 
12133   QualType functionType =
12134     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12135   blockScope->FunctionType = functionType;
12136 
12137   // Set the parameters on the block decl.
12138   if (!params.empty())
12139     blockScope->TheDecl->setParams(params);
12140 
12141   if (!oldBlock->blockMissingReturnType()) {
12142     blockScope->HasImplicitReturnType = false;
12143     blockScope->ReturnType = exprResultType;
12144   }
12145 
12146   // Transform the body
12147   StmtResult body = getDerived().TransformStmt(E->getBody());
12148   if (body.isInvalid()) {
12149     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12150     return ExprError();
12151   }
12152 
12153 #ifndef NDEBUG
12154   // In builds with assertions, make sure that we captured everything we
12155   // captured before.
12156   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12157     for (const auto &I : oldBlock->captures()) {
12158       VarDecl *oldCapture = I.getVariable();
12159 
12160       // Ignore parameter packs.
12161       if (isa<ParmVarDecl>(oldCapture) &&
12162           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12163         continue;
12164 
12165       VarDecl *newCapture =
12166         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12167                                                  oldCapture));
12168       assert(blockScope->CaptureMap.count(newCapture));
12169     }
12170     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12171   }
12172 #endif
12173 
12174   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12175                                     /*Scope=*/nullptr);
12176 }
12177 
12178 template<typename Derived>
12179 ExprResult
12180 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12181   llvm_unreachable("Cannot transform asType expressions yet");
12182 }
12183 
12184 template<typename Derived>
12185 ExprResult
12186 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12187   QualType RetTy = getDerived().TransformType(E->getType());
12188   bool ArgumentChanged = false;
12189   SmallVector<Expr*, 8> SubExprs;
12190   SubExprs.reserve(E->getNumSubExprs());
12191   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12192                                   SubExprs, &ArgumentChanged))
12193     return ExprError();
12194 
12195   if (!getDerived().AlwaysRebuild() &&
12196       !ArgumentChanged)
12197     return E;
12198 
12199   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12200                                         RetTy, E->getOp(), E->getRParenLoc());
12201 }
12202 
12203 //===----------------------------------------------------------------------===//
12204 // Type reconstruction
12205 //===----------------------------------------------------------------------===//
12206 
12207 template<typename Derived>
12208 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12209                                                     SourceLocation Star) {
12210   return SemaRef.BuildPointerType(PointeeType, Star,
12211                                   getDerived().getBaseEntity());
12212 }
12213 
12214 template<typename Derived>
12215 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12216                                                          SourceLocation Star) {
12217   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12218                                        getDerived().getBaseEntity());
12219 }
12220 
12221 template<typename Derived>
12222 QualType
12223 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12224                                              bool WrittenAsLValue,
12225                                              SourceLocation Sigil) {
12226   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12227                                     Sigil, getDerived().getBaseEntity());
12228 }
12229 
12230 template<typename Derived>
12231 QualType
12232 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12233                                                  QualType ClassType,
12234                                                  SourceLocation Sigil) {
12235   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12236                                         getDerived().getBaseEntity());
12237 }
12238 
12239 template<typename Derived>
12240 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12241            const ObjCTypeParamDecl *Decl,
12242            SourceLocation ProtocolLAngleLoc,
12243            ArrayRef<ObjCProtocolDecl *> Protocols,
12244            ArrayRef<SourceLocation> ProtocolLocs,
12245            SourceLocation ProtocolRAngleLoc) {
12246   return SemaRef.BuildObjCTypeParamType(Decl,
12247                                         ProtocolLAngleLoc, Protocols,
12248                                         ProtocolLocs, ProtocolRAngleLoc,
12249                                         /*FailOnError=*/true);
12250 }
12251 
12252 template<typename Derived>
12253 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12254            QualType BaseType,
12255            SourceLocation Loc,
12256            SourceLocation TypeArgsLAngleLoc,
12257            ArrayRef<TypeSourceInfo *> TypeArgs,
12258            SourceLocation TypeArgsRAngleLoc,
12259            SourceLocation ProtocolLAngleLoc,
12260            ArrayRef<ObjCProtocolDecl *> Protocols,
12261            ArrayRef<SourceLocation> ProtocolLocs,
12262            SourceLocation ProtocolRAngleLoc) {
12263   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12264                                      TypeArgs, TypeArgsRAngleLoc,
12265                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12266                                      ProtocolRAngleLoc,
12267                                      /*FailOnError=*/true);
12268 }
12269 
12270 template<typename Derived>
12271 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12272            QualType PointeeType,
12273            SourceLocation Star) {
12274   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12275 }
12276 
12277 template<typename Derived>
12278 QualType
12279 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12280                                          ArrayType::ArraySizeModifier SizeMod,
12281                                          const llvm::APInt *Size,
12282                                          Expr *SizeExpr,
12283                                          unsigned IndexTypeQuals,
12284                                          SourceRange BracketsRange) {
12285   if (SizeExpr || !Size)
12286     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12287                                   IndexTypeQuals, BracketsRange,
12288                                   getDerived().getBaseEntity());
12289 
12290   QualType Types[] = {
12291     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12292     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12293     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12294   };
12295   const unsigned NumTypes = llvm::array_lengthof(Types);
12296   QualType SizeType;
12297   for (unsigned I = 0; I != NumTypes; ++I)
12298     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12299       SizeType = Types[I];
12300       break;
12301     }
12302 
12303   // Note that we can return a VariableArrayType here in the case where
12304   // the element type was a dependent VariableArrayType.
12305   IntegerLiteral *ArraySize
12306       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12307                                /*FIXME*/BracketsRange.getBegin());
12308   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12309                                 IndexTypeQuals, BracketsRange,
12310                                 getDerived().getBaseEntity());
12311 }
12312 
12313 template<typename Derived>
12314 QualType
12315 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12316                                                  ArrayType::ArraySizeModifier SizeMod,
12317                                                  const llvm::APInt &Size,
12318                                                  unsigned IndexTypeQuals,
12319                                                  SourceRange BracketsRange) {
12320   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12321                                         IndexTypeQuals, BracketsRange);
12322 }
12323 
12324 template<typename Derived>
12325 QualType
12326 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12327                                           ArrayType::ArraySizeModifier SizeMod,
12328                                                  unsigned IndexTypeQuals,
12329                                                    SourceRange BracketsRange) {
12330   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12331                                        IndexTypeQuals, BracketsRange);
12332 }
12333 
12334 template<typename Derived>
12335 QualType
12336 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12337                                           ArrayType::ArraySizeModifier SizeMod,
12338                                                  Expr *SizeExpr,
12339                                                  unsigned IndexTypeQuals,
12340                                                  SourceRange BracketsRange) {
12341   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12342                                        SizeExpr,
12343                                        IndexTypeQuals, BracketsRange);
12344 }
12345 
12346 template<typename Derived>
12347 QualType
12348 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12349                                           ArrayType::ArraySizeModifier SizeMod,
12350                                                        Expr *SizeExpr,
12351                                                        unsigned IndexTypeQuals,
12352                                                    SourceRange BracketsRange) {
12353   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12354                                        SizeExpr,
12355                                        IndexTypeQuals, BracketsRange);
12356 }
12357 
12358 template <typename Derived>
12359 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12360     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12361   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12362                                           AttributeLoc);
12363 }
12364 
12365 template <typename Derived>
12366 QualType
12367 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12368                                           unsigned NumElements,
12369                                           VectorType::VectorKind VecKind) {
12370   // FIXME: semantic checking!
12371   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12372 }
12373 
12374 template<typename Derived>
12375 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12376                                                       unsigned NumElements,
12377                                                  SourceLocation AttributeLoc) {
12378   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12379                           NumElements, true);
12380   IntegerLiteral *VectorSize
12381     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12382                              AttributeLoc);
12383   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12384 }
12385 
12386 template<typename Derived>
12387 QualType
12388 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12389                                                            Expr *SizeExpr,
12390                                                   SourceLocation AttributeLoc) {
12391   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12392 }
12393 
12394 template<typename Derived>
12395 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12396     QualType T,
12397     MutableArrayRef<QualType> ParamTypes,
12398     const FunctionProtoType::ExtProtoInfo &EPI) {
12399   return SemaRef.BuildFunctionType(T, ParamTypes,
12400                                    getDerived().getBaseLocation(),
12401                                    getDerived().getBaseEntity(),
12402                                    EPI);
12403 }
12404 
12405 template<typename Derived>
12406 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12407   return SemaRef.Context.getFunctionNoProtoType(T);
12408 }
12409 
12410 template<typename Derived>
12411 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12412                                                             Decl *D) {
12413   assert(D && "no decl found");
12414   if (D->isInvalidDecl()) return QualType();
12415 
12416   // FIXME: Doesn't account for ObjCInterfaceDecl!
12417   TypeDecl *Ty;
12418   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12419     // A valid resolved using typename pack expansion decl can have multiple
12420     // UsingDecls, but they must each have exactly one type, and it must be
12421     // the same type in every case. But we must have at least one expansion!
12422     if (UPD->expansions().empty()) {
12423       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12424           << UPD->isCXXClassMember() << UPD;
12425       return QualType();
12426     }
12427 
12428     // We might still have some unresolved types. Try to pick a resolved type
12429     // if we can. The final instantiation will check that the remaining
12430     // unresolved types instantiate to the type we pick.
12431     QualType FallbackT;
12432     QualType T;
12433     for (auto *E : UPD->expansions()) {
12434       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12435       if (ThisT.isNull())
12436         continue;
12437       else if (ThisT->getAs<UnresolvedUsingType>())
12438         FallbackT = ThisT;
12439       else if (T.isNull())
12440         T = ThisT;
12441       else
12442         assert(getSema().Context.hasSameType(ThisT, T) &&
12443                "mismatched resolved types in using pack expansion");
12444     }
12445     return T.isNull() ? FallbackT : T;
12446   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12447     assert(Using->hasTypename() &&
12448            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12449 
12450     // A valid resolved using typename decl points to exactly one type decl.
12451     assert(++Using->shadow_begin() == Using->shadow_end());
12452     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12453   } else {
12454     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12455            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12456     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12457   }
12458 
12459   return SemaRef.Context.getTypeDeclType(Ty);
12460 }
12461 
12462 template<typename Derived>
12463 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12464                                                        SourceLocation Loc) {
12465   return SemaRef.BuildTypeofExprType(E, Loc);
12466 }
12467 
12468 template<typename Derived>
12469 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12470   return SemaRef.Context.getTypeOfType(Underlying);
12471 }
12472 
12473 template<typename Derived>
12474 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12475                                                      SourceLocation Loc) {
12476   return SemaRef.BuildDecltypeType(E, Loc);
12477 }
12478 
12479 template<typename Derived>
12480 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12481                                             UnaryTransformType::UTTKind UKind,
12482                                             SourceLocation Loc) {
12483   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12484 }
12485 
12486 template<typename Derived>
12487 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12488                                                       TemplateName Template,
12489                                              SourceLocation TemplateNameLoc,
12490                                      TemplateArgumentListInfo &TemplateArgs) {
12491   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12492 }
12493 
12494 template<typename Derived>
12495 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12496                                                    SourceLocation KWLoc) {
12497   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12498 }
12499 
12500 template<typename Derived>
12501 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12502                                                  SourceLocation KWLoc,
12503                                                  bool isReadPipe) {
12504   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12505                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12506 }
12507 
12508 template<typename Derived>
12509 TemplateName
12510 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12511                                             bool TemplateKW,
12512                                             TemplateDecl *Template) {
12513   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12514                                                   Template);
12515 }
12516 
12517 template<typename Derived>
12518 TemplateName
12519 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12520                                             const IdentifierInfo &Name,
12521                                             SourceLocation NameLoc,
12522                                             QualType ObjectType,
12523                                             NamedDecl *FirstQualifierInScope,
12524                                             bool AllowInjectedClassName) {
12525   UnqualifiedId TemplateName;
12526   TemplateName.setIdentifier(&Name, NameLoc);
12527   Sema::TemplateTy Template;
12528   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12529   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12530                                        SS, TemplateKWLoc, TemplateName,
12531                                        ParsedType::make(ObjectType),
12532                                        /*EnteringContext=*/false,
12533                                        Template, AllowInjectedClassName);
12534   return Template.get();
12535 }
12536 
12537 template<typename Derived>
12538 TemplateName
12539 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12540                                             OverloadedOperatorKind Operator,
12541                                             SourceLocation NameLoc,
12542                                             QualType ObjectType,
12543                                             bool AllowInjectedClassName) {
12544   UnqualifiedId Name;
12545   // FIXME: Bogus location information.
12546   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12547   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12548   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12549   Sema::TemplateTy Template;
12550   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12551                                        SS, TemplateKWLoc, Name,
12552                                        ParsedType::make(ObjectType),
12553                                        /*EnteringContext=*/false,
12554                                        Template, AllowInjectedClassName);
12555   return Template.get();
12556 }
12557 
12558 template<typename Derived>
12559 ExprResult
12560 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12561                                                    SourceLocation OpLoc,
12562                                                    Expr *OrigCallee,
12563                                                    Expr *First,
12564                                                    Expr *Second) {
12565   Expr *Callee = OrigCallee->IgnoreParenCasts();
12566   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12567 
12568   if (First->getObjectKind() == OK_ObjCProperty) {
12569     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12570     if (BinaryOperator::isAssignmentOp(Opc))
12571       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12572                                                  First, Second);
12573     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12574     if (Result.isInvalid())
12575       return ExprError();
12576     First = Result.get();
12577   }
12578 
12579   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12580     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12581     if (Result.isInvalid())
12582       return ExprError();
12583     Second = Result.get();
12584   }
12585 
12586   // Determine whether this should be a builtin operation.
12587   if (Op == OO_Subscript) {
12588     if (!First->getType()->isOverloadableType() &&
12589         !Second->getType()->isOverloadableType())
12590       return getSema().CreateBuiltinArraySubscriptExpr(First,
12591                                                        Callee->getLocStart(),
12592                                                        Second, OpLoc);
12593   } else if (Op == OO_Arrow) {
12594     // -> is never a builtin operation.
12595     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12596   } else if (Second == nullptr || isPostIncDec) {
12597     if (!First->getType()->isOverloadableType()) {
12598       // The argument is not of overloadable type, so try to create a
12599       // built-in unary operation.
12600       UnaryOperatorKind Opc
12601         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12602 
12603       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12604     }
12605   } else {
12606     if (!First->getType()->isOverloadableType() &&
12607         !Second->getType()->isOverloadableType()) {
12608       // Neither of the arguments is an overloadable type, so try to
12609       // create a built-in binary operation.
12610       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12611       ExprResult Result
12612         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12613       if (Result.isInvalid())
12614         return ExprError();
12615 
12616       return Result;
12617     }
12618   }
12619 
12620   // Compute the transformed set of functions (and function templates) to be
12621   // used during overload resolution.
12622   UnresolvedSet<16> Functions;
12623   bool RequiresADL;
12624 
12625   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12626     Functions.append(ULE->decls_begin(), ULE->decls_end());
12627     // If the overload could not be resolved in the template definition
12628     // (because we had a dependent argument), ADL is performed as part of
12629     // template instantiation.
12630     RequiresADL = ULE->requiresADL();
12631   } else {
12632     // If we've resolved this to a particular non-member function, just call
12633     // that function. If we resolved it to a member function,
12634     // CreateOverloaded* will find that function for us.
12635     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12636     if (!isa<CXXMethodDecl>(ND))
12637       Functions.addDecl(ND);
12638     RequiresADL = false;
12639   }
12640 
12641   // Add any functions found via argument-dependent lookup.
12642   Expr *Args[2] = { First, Second };
12643   unsigned NumArgs = 1 + (Second != nullptr);
12644 
12645   // Create the overloaded operator invocation for unary operators.
12646   if (NumArgs == 1 || isPostIncDec) {
12647     UnaryOperatorKind Opc
12648       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12649     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
12650                                            RequiresADL);
12651   }
12652 
12653   if (Op == OO_Subscript) {
12654     SourceLocation LBrace;
12655     SourceLocation RBrace;
12656 
12657     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12658         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12659         LBrace = SourceLocation::getFromRawEncoding(
12660                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12661         RBrace = SourceLocation::getFromRawEncoding(
12662                     NameLoc.CXXOperatorName.EndOpNameLoc);
12663     } else {
12664         LBrace = Callee->getLocStart();
12665         RBrace = OpLoc;
12666     }
12667 
12668     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12669                                                       First, Second);
12670   }
12671 
12672   // Create the overloaded operator invocation for binary operators.
12673   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12674   ExprResult Result = SemaRef.CreateOverloadedBinOp(
12675       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
12676   if (Result.isInvalid())
12677     return ExprError();
12678 
12679   return Result;
12680 }
12681 
12682 template<typename Derived>
12683 ExprResult
12684 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12685                                                      SourceLocation OperatorLoc,
12686                                                        bool isArrow,
12687                                                        CXXScopeSpec &SS,
12688                                                      TypeSourceInfo *ScopeType,
12689                                                        SourceLocation CCLoc,
12690                                                        SourceLocation TildeLoc,
12691                                         PseudoDestructorTypeStorage Destroyed) {
12692   QualType BaseType = Base->getType();
12693   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12694       (!isArrow && !BaseType->getAs<RecordType>()) ||
12695       (isArrow && BaseType->getAs<PointerType>() &&
12696        !BaseType->getAs<PointerType>()->getPointeeType()
12697                                               ->template getAs<RecordType>())){
12698     // This pseudo-destructor expression is still a pseudo-destructor.
12699     return SemaRef.BuildPseudoDestructorExpr(
12700         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12701         CCLoc, TildeLoc, Destroyed);
12702   }
12703 
12704   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12705   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12706                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12707   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12708   NameInfo.setNamedTypeInfo(DestroyedType);
12709 
12710   // The scope type is now known to be a valid nested name specifier
12711   // component. Tack it on to the end of the nested name specifier.
12712   if (ScopeType) {
12713     if (!ScopeType->getType()->getAs<TagType>()) {
12714       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12715                      diag::err_expected_class_or_namespace)
12716           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12717       return ExprError();
12718     }
12719     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12720               CCLoc);
12721   }
12722 
12723   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12724   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12725                                             OperatorLoc, isArrow,
12726                                             SS, TemplateKWLoc,
12727                                             /*FIXME: FirstQualifier*/ nullptr,
12728                                             NameInfo,
12729                                             /*TemplateArgs*/ nullptr,
12730                                             /*S*/nullptr);
12731 }
12732 
12733 template<typename Derived>
12734 StmtResult
12735 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12736   SourceLocation Loc = S->getLocStart();
12737   CapturedDecl *CD = S->getCapturedDecl();
12738   unsigned NumParams = CD->getNumParams();
12739   unsigned ContextParamPos = CD->getContextParamPosition();
12740   SmallVector<Sema::CapturedParamNameType, 4> Params;
12741   for (unsigned I = 0; I < NumParams; ++I) {
12742     if (I != ContextParamPos) {
12743       Params.push_back(
12744              std::make_pair(
12745                   CD->getParam(I)->getName(),
12746                   getDerived().TransformType(CD->getParam(I)->getType())));
12747     } else {
12748       Params.push_back(std::make_pair(StringRef(), QualType()));
12749     }
12750   }
12751   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12752                                      S->getCapturedRegionKind(), Params);
12753   StmtResult Body;
12754   {
12755     Sema::CompoundScopeRAII CompoundScope(getSema());
12756     Body = getDerived().TransformStmt(S->getCapturedStmt());
12757   }
12758 
12759   if (Body.isInvalid()) {
12760     getSema().ActOnCapturedRegionError();
12761     return StmtError();
12762   }
12763 
12764   return getSema().ActOnCapturedRegionEnd(Body.get());
12765 }
12766 
12767 } // end namespace clang
12768 
12769 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12770