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 "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/Stmt.h"
25 #include "clang/AST/StmtCXX.h"
26 #include "clang/AST/StmtObjC.h"
27 #include "clang/AST/StmtOpenMP.h"
28 #include "clang/Sema/Designator.h"
29 #include "clang/Sema/Lookup.h"
30 #include "clang/Sema/Ownership.h"
31 #include "clang/Sema/ParsedTemplate.h"
32 #include "clang/Sema/ScopeInfo.h"
33 #include "clang/Sema/SemaDiagnostic.h"
34 #include "clang/Sema/SemaInternal.h"
35 #include "llvm/ADT/ArrayRef.h"
36 #include "llvm/Support/ErrorHandling.h"
37 #include <algorithm>
38 
39 namespace clang {
40 using namespace sema;
41 
42 /// \brief A semantic tree transformation that allows one to transform one
43 /// abstract syntax tree into another.
44 ///
45 /// A new tree transformation is defined by creating a new subclass \c X of
46 /// \c TreeTransform<X> and then overriding certain operations to provide
47 /// behavior specific to that transformation. For example, template
48 /// instantiation is implemented as a tree transformation where the
49 /// transformation of TemplateTypeParmType nodes involves substituting the
50 /// template arguments for their corresponding template parameters; a similar
51 /// transformation is performed for non-type template parameters and
52 /// template template parameters.
53 ///
54 /// This tree-transformation template uses static polymorphism to allow
55 /// subclasses to customize any of its operations. Thus, a subclass can
56 /// override any of the transformation or rebuild operators by providing an
57 /// operation with the same signature as the default implementation. The
58 /// overridding function should not be virtual.
59 ///
60 /// Semantic tree transformations are split into two stages, either of which
61 /// can be replaced by a subclass. The "transform" step transforms an AST node
62 /// or the parts of an AST node using the various transformation functions,
63 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
64 /// node of the appropriate kind from the pieces. The default transformation
65 /// routines recursively transform the operands to composite AST nodes (e.g.,
66 /// the pointee type of a PointerType node) and, if any of those operand nodes
67 /// were changed by the transformation, invokes the rebuild operation to create
68 /// a new AST node.
69 ///
70 /// Subclasses can customize the transformation at various levels. The
71 /// most coarse-grained transformations involve replacing TransformType(),
72 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
73 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
74 /// new implementations.
75 ///
76 /// For more fine-grained transformations, subclasses can replace any of the
77 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
78 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
79 /// replacing TransformTemplateTypeParmType() allows template instantiation
80 /// to substitute template arguments for their corresponding template
81 /// parameters. Additionally, subclasses can override the \c RebuildXXX
82 /// functions to control how AST nodes are rebuilt when their operands change.
83 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
84 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
85 /// be able to use more efficient rebuild steps.
86 ///
87 /// There are a handful of other functions that can be overridden, allowing one
88 /// to avoid traversing nodes that don't need any transformation
89 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
90 /// operands have not changed (\c AlwaysRebuild()), and customize the
91 /// default locations and entity names used for type-checking
92 /// (\c getBaseLocation(), \c getBaseEntity()).
93 template<typename Derived>
94 class TreeTransform {
95   /// \brief Private RAII object that helps us forget and then re-remember
96   /// the template argument corresponding to a partially-substituted parameter
97   /// pack.
98   class ForgetPartiallySubstitutedPackRAII {
99     Derived &Self;
100     TemplateArgument Old;
101 
102   public:
103     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
104       Old = Self.ForgetPartiallySubstitutedPack();
105     }
106 
107     ~ForgetPartiallySubstitutedPackRAII() {
108       Self.RememberPartiallySubstitutedPack(Old);
109     }
110   };
111 
112 protected:
113   Sema &SemaRef;
114 
115   /// \brief The set of local declarations that have been transformed, for
116   /// cases where we are forced to build new declarations within the transformer
117   /// rather than in the subclass (e.g., lambda closure types).
118   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
119 
120 public:
121   /// \brief Initializes a new tree transformer.
122   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
123 
124   /// \brief Retrieves a reference to the derived class.
125   Derived &getDerived() { return static_cast<Derived&>(*this); }
126 
127   /// \brief Retrieves a reference to the derived class.
128   const Derived &getDerived() const {
129     return static_cast<const Derived&>(*this);
130   }
131 
132   static inline ExprResult Owned(Expr *E) { return E; }
133   static inline StmtResult Owned(Stmt *S) { return S; }
134 
135   /// \brief Retrieves a reference to the semantic analysis object used for
136   /// this tree transform.
137   Sema &getSema() const { return SemaRef; }
138 
139   /// \brief Whether the transformation should always rebuild AST nodes, even
140   /// if none of the children have changed.
141   ///
142   /// Subclasses may override this function to specify when the transformation
143   /// should rebuild all AST nodes.
144   ///
145   /// We must always rebuild all AST nodes when performing variadic template
146   /// pack expansion, in order to avoid violating the AST invariant that each
147   /// statement node appears at most once in its containing declaration.
148   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
149 
150   /// \brief Returns the location of the entity being transformed, if that
151   /// information was not available elsewhere in the AST.
152   ///
153   /// By default, returns no source-location information. Subclasses can
154   /// provide an alternative implementation that provides better location
155   /// information.
156   SourceLocation getBaseLocation() { return SourceLocation(); }
157 
158   /// \brief Returns the name of the entity being transformed, if that
159   /// information was not available elsewhere in the AST.
160   ///
161   /// By default, returns an empty name. Subclasses can provide an alternative
162   /// implementation with a more precise name.
163   DeclarationName getBaseEntity() { return DeclarationName(); }
164 
165   /// \brief Sets the "base" location and entity when that
166   /// information is known based on another transformation.
167   ///
168   /// By default, the source location and entity are ignored. Subclasses can
169   /// override this function to provide a customized implementation.
170   void setBase(SourceLocation Loc, DeclarationName Entity) { }
171 
172   /// \brief RAII object that temporarily sets the base location and entity
173   /// used for reporting diagnostics in types.
174   class TemporaryBase {
175     TreeTransform &Self;
176     SourceLocation OldLocation;
177     DeclarationName OldEntity;
178 
179   public:
180     TemporaryBase(TreeTransform &Self, SourceLocation Location,
181                   DeclarationName Entity) : Self(Self) {
182       OldLocation = Self.getDerived().getBaseLocation();
183       OldEntity = Self.getDerived().getBaseEntity();
184 
185       if (Location.isValid())
186         Self.getDerived().setBase(Location, Entity);
187     }
188 
189     ~TemporaryBase() {
190       Self.getDerived().setBase(OldLocation, OldEntity);
191     }
192   };
193 
194   /// \brief Determine whether the given type \p T has already been
195   /// transformed.
196   ///
197   /// Subclasses can provide an alternative implementation of this routine
198   /// to short-circuit evaluation when it is known that a given type will
199   /// not change. For example, template instantiation need not traverse
200   /// non-dependent types.
201   bool AlreadyTransformed(QualType T) {
202     return T.isNull();
203   }
204 
205   /// \brief Determine whether the given call argument should be dropped, e.g.,
206   /// because it is a default argument.
207   ///
208   /// Subclasses can provide an alternative implementation of this routine to
209   /// determine which kinds of call arguments get dropped. By default,
210   /// CXXDefaultArgument nodes are dropped (prior to transformation).
211   bool DropCallArgument(Expr *E) {
212     return E->isDefaultArgument();
213   }
214 
215   /// \brief Determine whether we should expand a pack expansion with the
216   /// given set of parameter packs into separate arguments by repeatedly
217   /// transforming the pattern.
218   ///
219   /// By default, the transformer never tries to expand pack expansions.
220   /// Subclasses can override this routine to provide different behavior.
221   ///
222   /// \param EllipsisLoc The location of the ellipsis that identifies the
223   /// pack expansion.
224   ///
225   /// \param PatternRange The source range that covers the entire pattern of
226   /// the pack expansion.
227   ///
228   /// \param Unexpanded The set of unexpanded parameter packs within the
229   /// pattern.
230   ///
231   /// \param ShouldExpand Will be set to \c true if the transformer should
232   /// expand the corresponding pack expansions into separate arguments. When
233   /// set, \c NumExpansions must also be set.
234   ///
235   /// \param RetainExpansion Whether the caller should add an unexpanded
236   /// pack expansion after all of the expanded arguments. This is used
237   /// when extending explicitly-specified template argument packs per
238   /// C++0x [temp.arg.explicit]p9.
239   ///
240   /// \param NumExpansions The number of separate arguments that will be in
241   /// the expanded form of the corresponding pack expansion. This is both an
242   /// input and an output parameter, which can be set by the caller if the
243   /// number of expansions is known a priori (e.g., due to a prior substitution)
244   /// and will be set by the callee when the number of expansions is known.
245   /// The callee must set this value when \c ShouldExpand is \c true; it may
246   /// set this value in other cases.
247   ///
248   /// \returns true if an error occurred (e.g., because the parameter packs
249   /// are to be instantiated with arguments of different lengths), false
250   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
251   /// must be set.
252   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
253                                SourceRange PatternRange,
254                                ArrayRef<UnexpandedParameterPack> Unexpanded,
255                                bool &ShouldExpand,
256                                bool &RetainExpansion,
257                                Optional<unsigned> &NumExpansions) {
258     ShouldExpand = false;
259     return false;
260   }
261 
262   /// \brief "Forget" about the partially-substituted pack template argument,
263   /// when performing an instantiation that must preserve the parameter pack
264   /// use.
265   ///
266   /// This routine is meant to be overridden by the template instantiator.
267   TemplateArgument ForgetPartiallySubstitutedPack() {
268     return TemplateArgument();
269   }
270 
271   /// \brief "Remember" the partially-substituted pack template argument
272   /// after performing an instantiation that must preserve the parameter pack
273   /// use.
274   ///
275   /// This routine is meant to be overridden by the template instantiator.
276   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
277 
278   /// \brief Note to the derived class when a function parameter pack is
279   /// being expanded.
280   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
281 
282   /// \brief Transforms the given type into another type.
283   ///
284   /// By default, this routine transforms a type by creating a
285   /// TypeSourceInfo for it and delegating to the appropriate
286   /// function.  This is expensive, but we don't mind, because
287   /// this method is deprecated anyway;  all users should be
288   /// switched to storing TypeSourceInfos.
289   ///
290   /// \returns the transformed type.
291   QualType TransformType(QualType T);
292 
293   /// \brief Transforms the given type-with-location into a new
294   /// type-with-location.
295   ///
296   /// By default, this routine transforms a type by delegating to the
297   /// appropriate TransformXXXType to build a new type.  Subclasses
298   /// may override this function (to take over all type
299   /// transformations) or some set of the TransformXXXType functions
300   /// to alter the transformation.
301   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
302 
303   /// \brief Transform the given type-with-location into a new
304   /// type, collecting location information in the given builder
305   /// as necessary.
306   ///
307   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
308 
309   /// \brief Transform the given statement.
310   ///
311   /// By default, this routine transforms a statement by delegating to the
312   /// appropriate TransformXXXStmt function to transform a specific kind of
313   /// statement or the TransformExpr() function to transform an expression.
314   /// Subclasses may override this function to transform statements using some
315   /// other mechanism.
316   ///
317   /// \returns the transformed statement.
318   StmtResult TransformStmt(Stmt *S);
319 
320   /// \brief Transform the given statement.
321   ///
322   /// By default, this routine transforms a statement by delegating to the
323   /// appropriate TransformOMPXXXClause function to transform a specific kind
324   /// of clause. Subclasses may override this function to transform statements
325   /// using some other mechanism.
326   ///
327   /// \returns the transformed OpenMP clause.
328   OMPClause *TransformOMPClause(OMPClause *S);
329 
330   /// \brief Transform the given attribute.
331   ///
332   /// By default, this routine transforms a statement by delegating to the
333   /// appropriate TransformXXXAttr function to transform a specific kind
334   /// of attribute. Subclasses may override this function to transform
335   /// attributed statements using some other mechanism.
336   ///
337   /// \returns the transformed attribute
338   const Attr *TransformAttr(const Attr *S);
339 
340 /// \brief Transform the specified attribute.
341 ///
342 /// Subclasses should override the transformation of attributes with a pragma
343 /// spelling to transform expressions stored within the attribute.
344 ///
345 /// \returns the transformed attribute.
346 #define ATTR(X)
347 #define PRAGMA_SPELLING_ATTR(X)                                                \
348   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
349 #include "clang/Basic/AttrList.inc"
350 
351   /// \brief Transform the given expression.
352   ///
353   /// By default, this routine transforms an expression by delegating to the
354   /// appropriate TransformXXXExpr function to build a new expression.
355   /// Subclasses may override this function to transform expressions using some
356   /// other mechanism.
357   ///
358   /// \returns the transformed expression.
359   ExprResult TransformExpr(Expr *E);
360 
361   /// \brief Transform the given initializer.
362   ///
363   /// By default, this routine transforms an initializer by stripping off the
364   /// semantic nodes added by initialization, then passing the result to
365   /// TransformExpr or TransformExprs.
366   ///
367   /// \returns the transformed initializer.
368   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
369 
370   /// \brief Transform the given list of expressions.
371   ///
372   /// This routine transforms a list of expressions by invoking
373   /// \c TransformExpr() for each subexpression. However, it also provides
374   /// support for variadic templates by expanding any pack expansions (if the
375   /// derived class permits such expansion) along the way. When pack expansions
376   /// are present, the number of outputs may not equal the number of inputs.
377   ///
378   /// \param Inputs The set of expressions to be transformed.
379   ///
380   /// \param NumInputs The number of expressions in \c Inputs.
381   ///
382   /// \param IsCall If \c true, then this transform is being performed on
383   /// function-call arguments, and any arguments that should be dropped, will
384   /// be.
385   ///
386   /// \param Outputs The transformed input expressions will be added to this
387   /// vector.
388   ///
389   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
390   /// due to transformation.
391   ///
392   /// \returns true if an error occurred, false otherwise.
393   bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall,
394                       SmallVectorImpl<Expr *> &Outputs,
395                       bool *ArgChanged = nullptr);
396 
397   /// \brief Transform the given declaration, which is referenced from a type
398   /// or expression.
399   ///
400   /// By default, acts as the identity function on declarations, unless the
401   /// transformer has had to transform the declaration itself. Subclasses
402   /// may override this function to provide alternate behavior.
403   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
404     llvm::DenseMap<Decl *, Decl *>::iterator Known
405       = TransformedLocalDecls.find(D);
406     if (Known != TransformedLocalDecls.end())
407       return Known->second;
408 
409     return D;
410   }
411 
412   /// \brief Transform the attributes associated with the given declaration and
413   /// place them on the new declaration.
414   ///
415   /// By default, this operation does nothing. Subclasses may override this
416   /// behavior to transform attributes.
417   void transformAttrs(Decl *Old, Decl *New) { }
418 
419   /// \brief Note that a local declaration has been transformed by this
420   /// transformer.
421   ///
422   /// Local declarations are typically transformed via a call to
423   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
424   /// the transformer itself has to transform the declarations. This routine
425   /// can be overridden by a subclass that keeps track of such mappings.
426   void transformedLocalDecl(Decl *Old, Decl *New) {
427     TransformedLocalDecls[Old] = New;
428   }
429 
430   /// \brief Transform the definition of the given declaration.
431   ///
432   /// By default, invokes TransformDecl() to transform the declaration.
433   /// Subclasses may override this function to provide alternate behavior.
434   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
435     return getDerived().TransformDecl(Loc, D);
436   }
437 
438   /// \brief Transform the given declaration, which was the first part of a
439   /// nested-name-specifier in a member access expression.
440   ///
441   /// This specific declaration transformation only applies to the first
442   /// identifier in a nested-name-specifier of a member access expression, e.g.,
443   /// the \c T in \c x->T::member
444   ///
445   /// By default, invokes TransformDecl() to transform the declaration.
446   /// Subclasses may override this function to provide alternate behavior.
447   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
448     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
449   }
450 
451   /// \brief Transform the given nested-name-specifier with source-location
452   /// information.
453   ///
454   /// By default, transforms all of the types and declarations within the
455   /// nested-name-specifier. Subclasses may override this function to provide
456   /// alternate behavior.
457   NestedNameSpecifierLoc
458   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
459                                   QualType ObjectType = QualType(),
460                                   NamedDecl *FirstQualifierInScope = nullptr);
461 
462   /// \brief Transform the given declaration name.
463   ///
464   /// By default, transforms the types of conversion function, constructor,
465   /// and destructor names and then (if needed) rebuilds the declaration name.
466   /// Identifiers and selectors are returned unmodified. Sublcasses may
467   /// override this function to provide alternate behavior.
468   DeclarationNameInfo
469   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
470 
471   /// \brief Transform the given template name.
472   ///
473   /// \param SS The nested-name-specifier that qualifies the template
474   /// name. This nested-name-specifier must already have been transformed.
475   ///
476   /// \param Name The template name to transform.
477   ///
478   /// \param NameLoc The source location of the template name.
479   ///
480   /// \param ObjectType If we're translating a template name within a member
481   /// access expression, this is the type of the object whose member template
482   /// is being referenced.
483   ///
484   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
485   /// also refers to a name within the current (lexical) scope, this is the
486   /// declaration it refers to.
487   ///
488   /// By default, transforms the template name by transforming the declarations
489   /// and nested-name-specifiers that occur within the template name.
490   /// Subclasses may override this function to provide alternate behavior.
491   TemplateName
492   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
493                         SourceLocation NameLoc,
494                         QualType ObjectType = QualType(),
495                         NamedDecl *FirstQualifierInScope = nullptr);
496 
497   /// \brief Transform the given template argument.
498   ///
499   /// By default, this operation transforms the type, expression, or
500   /// declaration stored within the template argument and constructs a
501   /// new template argument from the transformed result. Subclasses may
502   /// override this function to provide alternate behavior.
503   ///
504   /// Returns true if there was an error.
505   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
506                                  TemplateArgumentLoc &Output);
507 
508   /// \brief Transform the given set of template arguments.
509   ///
510   /// By default, this operation transforms all of the template arguments
511   /// in the input set using \c TransformTemplateArgument(), and appends
512   /// the transformed arguments to the output list.
513   ///
514   /// Note that this overload of \c TransformTemplateArguments() is merely
515   /// a convenience function. Subclasses that wish to override this behavior
516   /// should override the iterator-based member template version.
517   ///
518   /// \param Inputs The set of template arguments to be transformed.
519   ///
520   /// \param NumInputs The number of template arguments in \p Inputs.
521   ///
522   /// \param Outputs The set of transformed template arguments output by this
523   /// routine.
524   ///
525   /// Returns true if an error occurred.
526   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
527                                   unsigned NumInputs,
528                                   TemplateArgumentListInfo &Outputs) {
529     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs);
530   }
531 
532   /// \brief Transform the given set of template arguments.
533   ///
534   /// By default, this operation transforms all of the template arguments
535   /// in the input set using \c TransformTemplateArgument(), and appends
536   /// the transformed arguments to the output list.
537   ///
538   /// \param First An iterator to the first template argument.
539   ///
540   /// \param Last An iterator one step past the last template argument.
541   ///
542   /// \param Outputs The set of transformed template arguments output by this
543   /// routine.
544   ///
545   /// Returns true if an error occurred.
546   template<typename InputIterator>
547   bool TransformTemplateArguments(InputIterator First,
548                                   InputIterator Last,
549                                   TemplateArgumentListInfo &Outputs);
550 
551   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
552   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
553                                  TemplateArgumentLoc &ArgLoc);
554 
555   /// \brief Fakes up a TypeSourceInfo for a type.
556   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
557     return SemaRef.Context.getTrivialTypeSourceInfo(T,
558                        getDerived().getBaseLocation());
559   }
560 
561 #define ABSTRACT_TYPELOC(CLASS, PARENT)
562 #define TYPELOC(CLASS, PARENT)                                   \
563   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
564 #include "clang/AST/TypeLocNodes.def"
565 
566   template<typename Fn>
567   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
568                                       FunctionProtoTypeLoc TL,
569                                       CXXRecordDecl *ThisContext,
570                                       unsigned ThisTypeQuals,
571                                       Fn TransformExceptionSpec);
572 
573   bool TransformExceptionSpec(SourceLocation Loc,
574                               FunctionProtoType::ExceptionSpecInfo &ESI,
575                               SmallVectorImpl<QualType> &Exceptions,
576                               bool &Changed);
577 
578   StmtResult TransformSEHHandler(Stmt *Handler);
579 
580   QualType
581   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
582                                       TemplateSpecializationTypeLoc TL,
583                                       TemplateName Template);
584 
585   QualType
586   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
587                                       DependentTemplateSpecializationTypeLoc TL,
588                                                TemplateName Template,
589                                                CXXScopeSpec &SS);
590 
591   QualType TransformDependentTemplateSpecializationType(
592       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
593       NestedNameSpecifierLoc QualifierLoc);
594 
595   /// \brief Transforms the parameters of a function type into the
596   /// given vectors.
597   ///
598   /// The result vectors should be kept in sync; null entries in the
599   /// variables vector are acceptable.
600   ///
601   /// Return true on error.
602   bool TransformFunctionTypeParams(SourceLocation Loc,
603                                    ParmVarDecl **Params, unsigned NumParams,
604                                    const QualType *ParamTypes,
605                                    SmallVectorImpl<QualType> &PTypes,
606                                    SmallVectorImpl<ParmVarDecl*> *PVars);
607 
608   /// \brief Transforms a single function-type parameter.  Return null
609   /// on error.
610   ///
611   /// \param indexAdjustment - A number to add to the parameter's
612   ///   scope index;  can be negative
613   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
614                                           int indexAdjustment,
615                                           Optional<unsigned> NumExpansions,
616                                           bool ExpectParameterPack);
617 
618   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
619 
620   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
621   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
622 
623   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
624   /// \brief Transform the captures and body of a lambda expression.
625   ExprResult TransformLambdaScope(LambdaExpr *E, CXXMethodDecl *CallOperator,
626        ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes);
627 
628   TemplateParameterList *TransformTemplateParameterList(
629         TemplateParameterList *TPL) {
630     return TPL;
631   }
632 
633   ExprResult TransformAddressOfOperand(Expr *E);
634 
635   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
636                                                 bool IsAddressOfOperand,
637                                                 TypeSourceInfo **RecoveryTSI);
638 
639   ExprResult TransformParenDependentScopeDeclRefExpr(
640       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
641       TypeSourceInfo **RecoveryTSI);
642 
643   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
644 
645 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
646 // amount of stack usage with clang.
647 #define STMT(Node, Parent)                        \
648   LLVM_ATTRIBUTE_NOINLINE \
649   StmtResult Transform##Node(Node *S);
650 #define EXPR(Node, Parent)                        \
651   LLVM_ATTRIBUTE_NOINLINE \
652   ExprResult Transform##Node(Node *E);
653 #define ABSTRACT_STMT(Stmt)
654 #include "clang/AST/StmtNodes.inc"
655 
656 #define OPENMP_CLAUSE(Name, Class)                        \
657   LLVM_ATTRIBUTE_NOINLINE \
658   OMPClause *Transform ## Class(Class *S);
659 #include "clang/Basic/OpenMPKinds.def"
660 
661   /// \brief Build a new pointer type given its pointee type.
662   ///
663   /// By default, performs semantic analysis when building the pointer type.
664   /// Subclasses may override this routine to provide different behavior.
665   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
666 
667   /// \brief Build a new block pointer type given its pointee type.
668   ///
669   /// By default, performs semantic analysis when building the block pointer
670   /// type. Subclasses may override this routine to provide different behavior.
671   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
672 
673   /// \brief Build a new reference type given the type it references.
674   ///
675   /// By default, performs semantic analysis when building the
676   /// reference type. Subclasses may override this routine to provide
677   /// different behavior.
678   ///
679   /// \param LValue whether the type was written with an lvalue sigil
680   /// or an rvalue sigil.
681   QualType RebuildReferenceType(QualType ReferentType,
682                                 bool LValue,
683                                 SourceLocation Sigil);
684 
685   /// \brief Build a new member pointer type given the pointee type and the
686   /// class type it refers into.
687   ///
688   /// By default, performs semantic analysis when building the member pointer
689   /// type. Subclasses may override this routine to provide different behavior.
690   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
691                                     SourceLocation Sigil);
692 
693   /// \brief Build a new array type given the element type, size
694   /// modifier, size of the array (if known), size expression, and index type
695   /// qualifiers.
696   ///
697   /// By default, performs semantic analysis when building the array type.
698   /// Subclasses may override this routine to provide different behavior.
699   /// Also by default, all of the other Rebuild*Array
700   QualType RebuildArrayType(QualType ElementType,
701                             ArrayType::ArraySizeModifier SizeMod,
702                             const llvm::APInt *Size,
703                             Expr *SizeExpr,
704                             unsigned IndexTypeQuals,
705                             SourceRange BracketsRange);
706 
707   /// \brief Build a new constant array type given the element type, size
708   /// modifier, (known) size of the array, and index type qualifiers.
709   ///
710   /// By default, performs semantic analysis when building the array type.
711   /// Subclasses may override this routine to provide different behavior.
712   QualType RebuildConstantArrayType(QualType ElementType,
713                                     ArrayType::ArraySizeModifier SizeMod,
714                                     const llvm::APInt &Size,
715                                     unsigned IndexTypeQuals,
716                                     SourceRange BracketsRange);
717 
718   /// \brief Build a new incomplete array type given the element type, size
719   /// modifier, and index type qualifiers.
720   ///
721   /// By default, performs semantic analysis when building the array type.
722   /// Subclasses may override this routine to provide different behavior.
723   QualType RebuildIncompleteArrayType(QualType ElementType,
724                                       ArrayType::ArraySizeModifier SizeMod,
725                                       unsigned IndexTypeQuals,
726                                       SourceRange BracketsRange);
727 
728   /// \brief Build a new variable-length array type given the element type,
729   /// size modifier, size expression, and index type qualifiers.
730   ///
731   /// By default, performs semantic analysis when building the array type.
732   /// Subclasses may override this routine to provide different behavior.
733   QualType RebuildVariableArrayType(QualType ElementType,
734                                     ArrayType::ArraySizeModifier SizeMod,
735                                     Expr *SizeExpr,
736                                     unsigned IndexTypeQuals,
737                                     SourceRange BracketsRange);
738 
739   /// \brief Build a new dependent-sized array type given the element type,
740   /// size modifier, size expression, and index type qualifiers.
741   ///
742   /// By default, performs semantic analysis when building the array type.
743   /// Subclasses may override this routine to provide different behavior.
744   QualType RebuildDependentSizedArrayType(QualType ElementType,
745                                           ArrayType::ArraySizeModifier SizeMod,
746                                           Expr *SizeExpr,
747                                           unsigned IndexTypeQuals,
748                                           SourceRange BracketsRange);
749 
750   /// \brief Build a new vector type given the element type and
751   /// number of elements.
752   ///
753   /// By default, performs semantic analysis when building the vector type.
754   /// Subclasses may override this routine to provide different behavior.
755   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
756                              VectorType::VectorKind VecKind);
757 
758   /// \brief Build a new extended vector type given the element type and
759   /// number of elements.
760   ///
761   /// By default, performs semantic analysis when building the vector type.
762   /// Subclasses may override this routine to provide different behavior.
763   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
764                                 SourceLocation AttributeLoc);
765 
766   /// \brief Build a new potentially dependently-sized extended vector type
767   /// given the element type and number of elements.
768   ///
769   /// By default, performs semantic analysis when building the vector type.
770   /// Subclasses may override this routine to provide different behavior.
771   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
772                                               Expr *SizeExpr,
773                                               SourceLocation AttributeLoc);
774 
775   /// \brief Build a new function type.
776   ///
777   /// By default, performs semantic analysis when building the function type.
778   /// Subclasses may override this routine to provide different behavior.
779   QualType RebuildFunctionProtoType(QualType T,
780                                     MutableArrayRef<QualType> ParamTypes,
781                                     const FunctionProtoType::ExtProtoInfo &EPI);
782 
783   /// \brief Build a new unprototyped function type.
784   QualType RebuildFunctionNoProtoType(QualType ResultType);
785 
786   /// \brief Rebuild an unresolved typename type, given the decl that
787   /// the UnresolvedUsingTypenameDecl was transformed to.
788   QualType RebuildUnresolvedUsingType(Decl *D);
789 
790   /// \brief Build a new typedef type.
791   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
792     return SemaRef.Context.getTypeDeclType(Typedef);
793   }
794 
795   /// \brief Build a new class/struct/union type.
796   QualType RebuildRecordType(RecordDecl *Record) {
797     return SemaRef.Context.getTypeDeclType(Record);
798   }
799 
800   /// \brief Build a new Enum type.
801   QualType RebuildEnumType(EnumDecl *Enum) {
802     return SemaRef.Context.getTypeDeclType(Enum);
803   }
804 
805   /// \brief Build a new typeof(expr) type.
806   ///
807   /// By default, performs semantic analysis when building the typeof type.
808   /// Subclasses may override this routine to provide different behavior.
809   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
810 
811   /// \brief Build a new typeof(type) type.
812   ///
813   /// By default, builds a new TypeOfType with the given underlying type.
814   QualType RebuildTypeOfType(QualType Underlying);
815 
816   /// \brief Build a new unary transform type.
817   QualType RebuildUnaryTransformType(QualType BaseType,
818                                      UnaryTransformType::UTTKind UKind,
819                                      SourceLocation Loc);
820 
821   /// \brief Build a new C++11 decltype type.
822   ///
823   /// By default, performs semantic analysis when building the decltype type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
826 
827   /// \brief Build a new C++11 auto type.
828   ///
829   /// By default, builds a new AutoType with the given deduced type.
830   QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) {
831     // Note, IsDependent is always false here: we implicitly convert an 'auto'
832     // which has been deduced to a dependent type into an undeduced 'auto', so
833     // that we'll retry deduction after the transformation.
834     return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto,
835                                        /*IsDependent*/ false);
836   }
837 
838   /// \brief Build a new template specialization type.
839   ///
840   /// By default, performs semantic analysis when building the template
841   /// specialization type. Subclasses may override this routine to provide
842   /// different behavior.
843   QualType RebuildTemplateSpecializationType(TemplateName Template,
844                                              SourceLocation TemplateLoc,
845                                              TemplateArgumentListInfo &Args);
846 
847   /// \brief Build a new parenthesized type.
848   ///
849   /// By default, builds a new ParenType type from the inner type.
850   /// Subclasses may override this routine to provide different behavior.
851   QualType RebuildParenType(QualType InnerType) {
852     return SemaRef.Context.getParenType(InnerType);
853   }
854 
855   /// \brief Build a new qualified name type.
856   ///
857   /// By default, builds a new ElaboratedType type from the keyword,
858   /// the nested-name-specifier and the named type.
859   /// Subclasses may override this routine to provide different behavior.
860   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
861                                  ElaboratedTypeKeyword Keyword,
862                                  NestedNameSpecifierLoc QualifierLoc,
863                                  QualType Named) {
864     return SemaRef.Context.getElaboratedType(Keyword,
865                                          QualifierLoc.getNestedNameSpecifier(),
866                                              Named);
867   }
868 
869   /// \brief Build a new typename type that refers to a template-id.
870   ///
871   /// By default, builds a new DependentNameType type from the
872   /// nested-name-specifier and the given type. Subclasses may override
873   /// this routine to provide different behavior.
874   QualType RebuildDependentTemplateSpecializationType(
875                                           ElaboratedTypeKeyword Keyword,
876                                           NestedNameSpecifierLoc QualifierLoc,
877                                           const IdentifierInfo *Name,
878                                           SourceLocation NameLoc,
879                                           TemplateArgumentListInfo &Args) {
880     // Rebuild the template name.
881     // TODO: avoid TemplateName abstraction
882     CXXScopeSpec SS;
883     SS.Adopt(QualifierLoc);
884     TemplateName InstName
885       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
886                                          nullptr);
887 
888     if (InstName.isNull())
889       return QualType();
890 
891     // If it's still dependent, make a dependent specialization.
892     if (InstName.getAsDependentTemplateName())
893       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
894                                           QualifierLoc.getNestedNameSpecifier(),
895                                                                     Name,
896                                                                     Args);
897 
898     // Otherwise, make an elaborated type wrapping a non-dependent
899     // specialization.
900     QualType T =
901     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
902     if (T.isNull()) return QualType();
903 
904     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
905       return T;
906 
907     return SemaRef.Context.getElaboratedType(Keyword,
908                                        QualifierLoc.getNestedNameSpecifier(),
909                                              T);
910   }
911 
912   /// \brief Build a new typename type that refers to an identifier.
913   ///
914   /// By default, performs semantic analysis when building the typename type
915   /// (or elaborated type). Subclasses may override this routine to provide
916   /// different behavior.
917   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
918                                     SourceLocation KeywordLoc,
919                                     NestedNameSpecifierLoc QualifierLoc,
920                                     const IdentifierInfo *Id,
921                                     SourceLocation IdLoc) {
922     CXXScopeSpec SS;
923     SS.Adopt(QualifierLoc);
924 
925     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
926       // If the name is still dependent, just build a new dependent name type.
927       if (!SemaRef.computeDeclContext(SS))
928         return SemaRef.Context.getDependentNameType(Keyword,
929                                           QualifierLoc.getNestedNameSpecifier(),
930                                                     Id);
931     }
932 
933     if (Keyword == ETK_None || Keyword == ETK_Typename)
934       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
935                                        *Id, IdLoc);
936 
937     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
938 
939     // We had a dependent elaborated-type-specifier that has been transformed
940     // into a non-dependent elaborated-type-specifier. Find the tag we're
941     // referring to.
942     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
943     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
944     if (!DC)
945       return QualType();
946 
947     if (SemaRef.RequireCompleteDeclContext(SS, DC))
948       return QualType();
949 
950     TagDecl *Tag = nullptr;
951     SemaRef.LookupQualifiedName(Result, DC);
952     switch (Result.getResultKind()) {
953       case LookupResult::NotFound:
954       case LookupResult::NotFoundInCurrentInstantiation:
955         break;
956 
957       case LookupResult::Found:
958         Tag = Result.getAsSingle<TagDecl>();
959         break;
960 
961       case LookupResult::FoundOverloaded:
962       case LookupResult::FoundUnresolvedValue:
963         llvm_unreachable("Tag lookup cannot find non-tags");
964 
965       case LookupResult::Ambiguous:
966         // Let the LookupResult structure handle ambiguities.
967         return QualType();
968     }
969 
970     if (!Tag) {
971       // Check where the name exists but isn't a tag type and use that to emit
972       // better diagnostics.
973       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
974       SemaRef.LookupQualifiedName(Result, DC);
975       switch (Result.getResultKind()) {
976         case LookupResult::Found:
977         case LookupResult::FoundOverloaded:
978         case LookupResult::FoundUnresolvedValue: {
979           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
980           unsigned Kind = 0;
981           if (isa<TypedefDecl>(SomeDecl)) Kind = 1;
982           else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2;
983           else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3;
984           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind;
985           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
986           break;
987         }
988         default:
989           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
990               << Kind << Id << DC << QualifierLoc.getSourceRange();
991           break;
992       }
993       return QualType();
994     }
995 
996     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
997                                               IdLoc, *Id)) {
998       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
999       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1000       return QualType();
1001     }
1002 
1003     // Build the elaborated-type-specifier type.
1004     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1005     return SemaRef.Context.getElaboratedType(Keyword,
1006                                          QualifierLoc.getNestedNameSpecifier(),
1007                                              T);
1008   }
1009 
1010   /// \brief Build a new pack expansion type.
1011   ///
1012   /// By default, builds a new PackExpansionType type from the given pattern.
1013   /// Subclasses may override this routine to provide different behavior.
1014   QualType RebuildPackExpansionType(QualType Pattern,
1015                                     SourceRange PatternRange,
1016                                     SourceLocation EllipsisLoc,
1017                                     Optional<unsigned> NumExpansions) {
1018     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1019                                         NumExpansions);
1020   }
1021 
1022   /// \brief Build a new atomic type given its value type.
1023   ///
1024   /// By default, performs semantic analysis when building the atomic type.
1025   /// Subclasses may override this routine to provide different behavior.
1026   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1027 
1028   /// \brief Build a new template name given a nested name specifier, a flag
1029   /// indicating whether the "template" keyword was provided, and the template
1030   /// that the template name refers to.
1031   ///
1032   /// By default, builds the new template name directly. Subclasses may override
1033   /// this routine to provide different behavior.
1034   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1035                                    bool TemplateKW,
1036                                    TemplateDecl *Template);
1037 
1038   /// \brief Build a new template name given a nested name specifier and the
1039   /// name that is referred to as a template.
1040   ///
1041   /// By default, performs semantic analysis to determine whether the name can
1042   /// be resolved to a specific template, then builds the appropriate kind of
1043   /// template name. Subclasses may override this routine to provide different
1044   /// behavior.
1045   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1046                                    const IdentifierInfo &Name,
1047                                    SourceLocation NameLoc,
1048                                    QualType ObjectType,
1049                                    NamedDecl *FirstQualifierInScope);
1050 
1051   /// \brief Build a new template name given a nested name specifier and the
1052   /// overloaded operator name that is referred to as a template.
1053   ///
1054   /// By default, performs semantic analysis to determine whether the name can
1055   /// be resolved to a specific template, then builds the appropriate kind of
1056   /// template name. Subclasses may override this routine to provide different
1057   /// behavior.
1058   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1059                                    OverloadedOperatorKind Operator,
1060                                    SourceLocation NameLoc,
1061                                    QualType ObjectType);
1062 
1063   /// \brief Build a new template name given a template template parameter pack
1064   /// and the
1065   ///
1066   /// By default, performs semantic analysis to determine whether the name can
1067   /// be resolved to a specific template, then builds the appropriate kind of
1068   /// template name. Subclasses may override this routine to provide different
1069   /// behavior.
1070   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1071                                    const TemplateArgument &ArgPack) {
1072     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1073   }
1074 
1075   /// \brief Build a new compound statement.
1076   ///
1077   /// By default, performs semantic analysis to build the new statement.
1078   /// Subclasses may override this routine to provide different behavior.
1079   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1080                                        MultiStmtArg Statements,
1081                                        SourceLocation RBraceLoc,
1082                                        bool IsStmtExpr) {
1083     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1084                                        IsStmtExpr);
1085   }
1086 
1087   /// \brief Build a new case statement.
1088   ///
1089   /// By default, performs semantic analysis to build the new statement.
1090   /// Subclasses may override this routine to provide different behavior.
1091   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1092                                    Expr *LHS,
1093                                    SourceLocation EllipsisLoc,
1094                                    Expr *RHS,
1095                                    SourceLocation ColonLoc) {
1096     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1097                                    ColonLoc);
1098   }
1099 
1100   /// \brief Attach the body to a new case statement.
1101   ///
1102   /// By default, performs semantic analysis to build the new statement.
1103   /// Subclasses may override this routine to provide different behavior.
1104   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1105     getSema().ActOnCaseStmtBody(S, Body);
1106     return S;
1107   }
1108 
1109   /// \brief Build a new default statement.
1110   ///
1111   /// By default, performs semantic analysis to build the new statement.
1112   /// Subclasses may override this routine to provide different behavior.
1113   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1114                                       SourceLocation ColonLoc,
1115                                       Stmt *SubStmt) {
1116     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1117                                       /*CurScope=*/nullptr);
1118   }
1119 
1120   /// \brief Build a new label statement.
1121   ///
1122   /// By default, performs semantic analysis to build the new statement.
1123   /// Subclasses may override this routine to provide different behavior.
1124   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1125                               SourceLocation ColonLoc, Stmt *SubStmt) {
1126     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1127   }
1128 
1129   /// \brief Build a new label statement.
1130   ///
1131   /// By default, performs semantic analysis to build the new statement.
1132   /// Subclasses may override this routine to provide different behavior.
1133   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1134                                    ArrayRef<const Attr*> Attrs,
1135                                    Stmt *SubStmt) {
1136     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1137   }
1138 
1139   /// \brief Build a new "if" statement.
1140   ///
1141   /// By default, performs semantic analysis to build the new statement.
1142   /// Subclasses may override this routine to provide different behavior.
1143   StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
1144                            VarDecl *CondVar, Stmt *Then,
1145                            SourceLocation ElseLoc, Stmt *Else) {
1146     return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else);
1147   }
1148 
1149   /// \brief Start building a new switch statement.
1150   ///
1151   /// By default, performs semantic analysis to build the new statement.
1152   /// Subclasses may override this routine to provide different behavior.
1153   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1154                                     Expr *Cond, VarDecl *CondVar) {
1155     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond,
1156                                             CondVar);
1157   }
1158 
1159   /// \brief Attach the body to the switch statement.
1160   ///
1161   /// By default, performs semantic analysis to build the new statement.
1162   /// Subclasses may override this routine to provide different behavior.
1163   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1164                                    Stmt *Switch, Stmt *Body) {
1165     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1166   }
1167 
1168   /// \brief Build a new while statement.
1169   ///
1170   /// By default, performs semantic analysis to build the new statement.
1171   /// Subclasses may override this routine to provide different behavior.
1172   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond,
1173                               VarDecl *CondVar, Stmt *Body) {
1174     return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body);
1175   }
1176 
1177   /// \brief Build a new do-while statement.
1178   ///
1179   /// By default, performs semantic analysis to build the new statement.
1180   /// Subclasses may override this routine to provide different behavior.
1181   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1182                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1183                            Expr *Cond, SourceLocation RParenLoc) {
1184     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1185                                  Cond, RParenLoc);
1186   }
1187 
1188   /// \brief Build a new for statement.
1189   ///
1190   /// By default, performs semantic analysis to build the new statement.
1191   /// Subclasses may override this routine to provide different behavior.
1192   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1193                             Stmt *Init, Sema::FullExprArg Cond,
1194                             VarDecl *CondVar, Sema::FullExprArg Inc,
1195                             SourceLocation RParenLoc, Stmt *Body) {
1196     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1197                                   CondVar, Inc, RParenLoc, Body);
1198   }
1199 
1200   /// \brief Build a new goto statement.
1201   ///
1202   /// By default, performs semantic analysis to build the new statement.
1203   /// Subclasses may override this routine to provide different behavior.
1204   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1205                              LabelDecl *Label) {
1206     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1207   }
1208 
1209   /// \brief Build a new indirect goto statement.
1210   ///
1211   /// By default, performs semantic analysis to build the new statement.
1212   /// Subclasses may override this routine to provide different behavior.
1213   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1214                                      SourceLocation StarLoc,
1215                                      Expr *Target) {
1216     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1217   }
1218 
1219   /// \brief Build a new return statement.
1220   ///
1221   /// By default, performs semantic analysis to build the new statement.
1222   /// Subclasses may override this routine to provide different behavior.
1223   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1224     return getSema().BuildReturnStmt(ReturnLoc, Result);
1225   }
1226 
1227   /// \brief Build a new declaration statement.
1228   ///
1229   /// By default, performs semantic analysis to build the new statement.
1230   /// Subclasses may override this routine to provide different behavior.
1231   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1232                              SourceLocation StartLoc, SourceLocation EndLoc) {
1233     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1234     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1235   }
1236 
1237   /// \brief Build a new inline asm statement.
1238   ///
1239   /// By default, performs semantic analysis to build the new statement.
1240   /// Subclasses may override this routine to provide different behavior.
1241   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1242                                bool IsVolatile, unsigned NumOutputs,
1243                                unsigned NumInputs, IdentifierInfo **Names,
1244                                MultiExprArg Constraints, MultiExprArg Exprs,
1245                                Expr *AsmString, MultiExprArg Clobbers,
1246                                SourceLocation RParenLoc) {
1247     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1248                                      NumInputs, Names, Constraints, Exprs,
1249                                      AsmString, Clobbers, RParenLoc);
1250   }
1251 
1252   /// \brief Build a new MS style inline asm statement.
1253   ///
1254   /// By default, performs semantic analysis to build the new statement.
1255   /// Subclasses may override this routine to provide different behavior.
1256   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1257                               ArrayRef<Token> AsmToks,
1258                               StringRef AsmString,
1259                               unsigned NumOutputs, unsigned NumInputs,
1260                               ArrayRef<StringRef> Constraints,
1261                               ArrayRef<StringRef> Clobbers,
1262                               ArrayRef<Expr*> Exprs,
1263                               SourceLocation EndLoc) {
1264     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1265                                     NumOutputs, NumInputs,
1266                                     Constraints, Clobbers, Exprs, EndLoc);
1267   }
1268 
1269   /// \brief Build a new Objective-C \@try statement.
1270   ///
1271   /// By default, performs semantic analysis to build the new statement.
1272   /// Subclasses may override this routine to provide different behavior.
1273   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1274                                         Stmt *TryBody,
1275                                         MultiStmtArg CatchStmts,
1276                                         Stmt *Finally) {
1277     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1278                                         Finally);
1279   }
1280 
1281   /// \brief Rebuild an Objective-C exception declaration.
1282   ///
1283   /// By default, performs semantic analysis to build the new declaration.
1284   /// Subclasses may override this routine to provide different behavior.
1285   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1286                                     TypeSourceInfo *TInfo, QualType T) {
1287     return getSema().BuildObjCExceptionDecl(TInfo, T,
1288                                             ExceptionDecl->getInnerLocStart(),
1289                                             ExceptionDecl->getLocation(),
1290                                             ExceptionDecl->getIdentifier());
1291   }
1292 
1293   /// \brief Build a new Objective-C \@catch 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 RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1298                                           SourceLocation RParenLoc,
1299                                           VarDecl *Var,
1300                                           Stmt *Body) {
1301     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1302                                           Var, Body);
1303   }
1304 
1305   /// \brief Build a new Objective-C \@finally 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 RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1310                                             Stmt *Body) {
1311     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1312   }
1313 
1314   /// \brief Build a new Objective-C \@throw 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 RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1319                                           Expr *Operand) {
1320     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1321   }
1322 
1323   /// \brief Build a new OpenMP executable directive.
1324   ///
1325   /// By default, performs semantic analysis to build the new statement.
1326   /// Subclasses may override this routine to provide different behavior.
1327   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1328                                            DeclarationNameInfo DirName,
1329                                            ArrayRef<OMPClause *> Clauses,
1330                                            Stmt *AStmt, SourceLocation StartLoc,
1331                                            SourceLocation EndLoc) {
1332     return getSema().ActOnOpenMPExecutableDirective(Kind, DirName, Clauses,
1333                                                     AStmt, StartLoc, EndLoc);
1334   }
1335 
1336   /// \brief Build a new OpenMP 'if' clause.
1337   ///
1338   /// By default, performs semantic analysis to build the new OpenMP clause.
1339   /// Subclasses may override this routine to provide different behavior.
1340   OMPClause *RebuildOMPIfClause(Expr *Condition,
1341                                 SourceLocation StartLoc,
1342                                 SourceLocation LParenLoc,
1343                                 SourceLocation EndLoc) {
1344     return getSema().ActOnOpenMPIfClause(Condition, StartLoc,
1345                                          LParenLoc, EndLoc);
1346   }
1347 
1348   /// \brief Build a new OpenMP 'final' clause.
1349   ///
1350   /// By default, performs semantic analysis to build the new OpenMP clause.
1351   /// Subclasses may override this routine to provide different behavior.
1352   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1353                                    SourceLocation LParenLoc,
1354                                    SourceLocation EndLoc) {
1355     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1356                                             EndLoc);
1357   }
1358 
1359   /// \brief Build a new OpenMP 'num_threads' clause.
1360   ///
1361   /// By default, performs semantic analysis to build the new OpenMP clause.
1362   /// Subclasses may override this routine to provide different behavior.
1363   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1364                                         SourceLocation StartLoc,
1365                                         SourceLocation LParenLoc,
1366                                         SourceLocation EndLoc) {
1367     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1368                                                  LParenLoc, EndLoc);
1369   }
1370 
1371   /// \brief Build a new OpenMP 'safelen' clause.
1372   ///
1373   /// By default, performs semantic analysis to build the new OpenMP clause.
1374   /// Subclasses may override this routine to provide different behavior.
1375   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1376                                      SourceLocation LParenLoc,
1377                                      SourceLocation EndLoc) {
1378     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1379   }
1380 
1381   /// \brief Build a new OpenMP 'collapse' clause.
1382   ///
1383   /// By default, performs semantic analysis to build the new OpenMP clause.
1384   /// Subclasses may override this routine to provide different behavior.
1385   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1386                                       SourceLocation LParenLoc,
1387                                       SourceLocation EndLoc) {
1388     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1389                                                EndLoc);
1390   }
1391 
1392   /// \brief Build a new OpenMP 'default' clause.
1393   ///
1394   /// By default, performs semantic analysis to build the new OpenMP clause.
1395   /// Subclasses may override this routine to provide different behavior.
1396   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1397                                      SourceLocation KindKwLoc,
1398                                      SourceLocation StartLoc,
1399                                      SourceLocation LParenLoc,
1400                                      SourceLocation EndLoc) {
1401     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1402                                               StartLoc, LParenLoc, EndLoc);
1403   }
1404 
1405   /// \brief Build a new OpenMP 'proc_bind' clause.
1406   ///
1407   /// By default, performs semantic analysis to build the new OpenMP clause.
1408   /// Subclasses may override this routine to provide different behavior.
1409   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1410                                       SourceLocation KindKwLoc,
1411                                       SourceLocation StartLoc,
1412                                       SourceLocation LParenLoc,
1413                                       SourceLocation EndLoc) {
1414     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1415                                                StartLoc, LParenLoc, EndLoc);
1416   }
1417 
1418   /// \brief Build a new OpenMP 'schedule' clause.
1419   ///
1420   /// By default, performs semantic analysis to build the new OpenMP clause.
1421   /// Subclasses may override this routine to provide different behavior.
1422   OMPClause *RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind,
1423                                       Expr *ChunkSize,
1424                                       SourceLocation StartLoc,
1425                                       SourceLocation LParenLoc,
1426                                       SourceLocation KindLoc,
1427                                       SourceLocation CommaLoc,
1428                                       SourceLocation EndLoc) {
1429     return getSema().ActOnOpenMPScheduleClause(
1430         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1431   }
1432 
1433   /// \brief Build a new OpenMP 'private' clause.
1434   ///
1435   /// By default, performs semantic analysis to build the new OpenMP clause.
1436   /// Subclasses may override this routine to provide different behavior.
1437   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1438                                      SourceLocation StartLoc,
1439                                      SourceLocation LParenLoc,
1440                                      SourceLocation EndLoc) {
1441     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1442                                               EndLoc);
1443   }
1444 
1445   /// \brief Build a new OpenMP 'firstprivate' clause.
1446   ///
1447   /// By default, performs semantic analysis to build the new OpenMP clause.
1448   /// Subclasses may override this routine to provide different behavior.
1449   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1450                                           SourceLocation StartLoc,
1451                                           SourceLocation LParenLoc,
1452                                           SourceLocation EndLoc) {
1453     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1454                                                    EndLoc);
1455   }
1456 
1457   /// \brief Build a new OpenMP 'lastprivate' clause.
1458   ///
1459   /// By default, performs semantic analysis to build the new OpenMP clause.
1460   /// Subclasses may override this routine to provide different behavior.
1461   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1462                                          SourceLocation StartLoc,
1463                                          SourceLocation LParenLoc,
1464                                          SourceLocation EndLoc) {
1465     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1466                                                   EndLoc);
1467   }
1468 
1469   /// \brief Build a new OpenMP 'shared' clause.
1470   ///
1471   /// By default, performs semantic analysis to build the new OpenMP clause.
1472   /// Subclasses may override this routine to provide different behavior.
1473   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1474                                     SourceLocation StartLoc,
1475                                     SourceLocation LParenLoc,
1476                                     SourceLocation EndLoc) {
1477     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1478                                              EndLoc);
1479   }
1480 
1481   /// \brief Build a new OpenMP 'reduction' clause.
1482   ///
1483   /// By default, performs semantic analysis to build the new statement.
1484   /// Subclasses may override this routine to provide different behavior.
1485   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1486                                        SourceLocation StartLoc,
1487                                        SourceLocation LParenLoc,
1488                                        SourceLocation ColonLoc,
1489                                        SourceLocation EndLoc,
1490                                        CXXScopeSpec &ReductionIdScopeSpec,
1491                                        const DeclarationNameInfo &ReductionId) {
1492     return getSema().ActOnOpenMPReductionClause(
1493         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1494         ReductionId);
1495   }
1496 
1497   /// \brief Build a new OpenMP 'linear' 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 *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1502                                     SourceLocation StartLoc,
1503                                     SourceLocation LParenLoc,
1504                                     SourceLocation ColonLoc,
1505                                     SourceLocation EndLoc) {
1506     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1507                                              ColonLoc, EndLoc);
1508   }
1509 
1510   /// \brief Build a new OpenMP 'aligned' clause.
1511   ///
1512   /// By default, performs semantic analysis to build the new OpenMP clause.
1513   /// Subclasses may override this routine to provide different behavior.
1514   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1515                                      SourceLocation StartLoc,
1516                                      SourceLocation LParenLoc,
1517                                      SourceLocation ColonLoc,
1518                                      SourceLocation EndLoc) {
1519     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1520                                               LParenLoc, ColonLoc, EndLoc);
1521   }
1522 
1523   /// \brief Build a new OpenMP 'copyin' clause.
1524   ///
1525   /// By default, performs semantic analysis to build the new OpenMP clause.
1526   /// Subclasses may override this routine to provide different behavior.
1527   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1528                                     SourceLocation StartLoc,
1529                                     SourceLocation LParenLoc,
1530                                     SourceLocation EndLoc) {
1531     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1532                                              EndLoc);
1533   }
1534 
1535   /// \brief Build a new OpenMP 'copyprivate' clause.
1536   ///
1537   /// By default, performs semantic analysis to build the new OpenMP clause.
1538   /// Subclasses may override this routine to provide different behavior.
1539   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1540                                          SourceLocation StartLoc,
1541                                          SourceLocation LParenLoc,
1542                                          SourceLocation EndLoc) {
1543     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1544                                                   EndLoc);
1545   }
1546 
1547   /// \brief Build a new OpenMP 'flush' pseudo clause.
1548   ///
1549   /// By default, performs semantic analysis to build the new OpenMP clause.
1550   /// Subclasses may override this routine to provide different behavior.
1551   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1552                                    SourceLocation StartLoc,
1553                                    SourceLocation LParenLoc,
1554                                    SourceLocation EndLoc) {
1555     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1556                                             EndLoc);
1557   }
1558 
1559   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1560   ///
1561   /// By default, performs semantic analysis to build the new statement.
1562   /// Subclasses may override this routine to provide different behavior.
1563   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1564                                               Expr *object) {
1565     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1566   }
1567 
1568   /// \brief Build a new Objective-C \@synchronized statement.
1569   ///
1570   /// By default, performs semantic analysis to build the new statement.
1571   /// Subclasses may override this routine to provide different behavior.
1572   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1573                                            Expr *Object, Stmt *Body) {
1574     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1575   }
1576 
1577   /// \brief Build a new Objective-C \@autoreleasepool statement.
1578   ///
1579   /// By default, performs semantic analysis to build the new statement.
1580   /// Subclasses may override this routine to provide different behavior.
1581   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1582                                             Stmt *Body) {
1583     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1584   }
1585 
1586   /// \brief Build a new Objective-C fast enumeration statement.
1587   ///
1588   /// By default, performs semantic analysis to build the new statement.
1589   /// Subclasses may override this routine to provide different behavior.
1590   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1591                                           Stmt *Element,
1592                                           Expr *Collection,
1593                                           SourceLocation RParenLoc,
1594                                           Stmt *Body) {
1595     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1596                                                 Element,
1597                                                 Collection,
1598                                                 RParenLoc);
1599     if (ForEachStmt.isInvalid())
1600       return StmtError();
1601 
1602     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1603   }
1604 
1605   /// \brief Build a new C++ exception declaration.
1606   ///
1607   /// By default, performs semantic analysis to build the new decaration.
1608   /// Subclasses may override this routine to provide different behavior.
1609   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1610                                 TypeSourceInfo *Declarator,
1611                                 SourceLocation StartLoc,
1612                                 SourceLocation IdLoc,
1613                                 IdentifierInfo *Id) {
1614     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1615                                                        StartLoc, IdLoc, Id);
1616     if (Var)
1617       getSema().CurContext->addDecl(Var);
1618     return Var;
1619   }
1620 
1621   /// \brief Build a new C++ catch statement.
1622   ///
1623   /// By default, performs semantic analysis to build the new statement.
1624   /// Subclasses may override this routine to provide different behavior.
1625   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1626                                  VarDecl *ExceptionDecl,
1627                                  Stmt *Handler) {
1628     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1629                                                       Handler));
1630   }
1631 
1632   /// \brief Build a new C++ try statement.
1633   ///
1634   /// By default, performs semantic analysis to build the new statement.
1635   /// Subclasses may override this routine to provide different behavior.
1636   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
1637                                ArrayRef<Stmt *> Handlers) {
1638     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
1639   }
1640 
1641   /// \brief Build a new C++0x range-based for statement.
1642   ///
1643   /// By default, performs semantic analysis to build the new statement.
1644   /// Subclasses may override this routine to provide different behavior.
1645   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
1646                                     SourceLocation ColonLoc,
1647                                     Stmt *Range, Stmt *BeginEnd,
1648                                     Expr *Cond, Expr *Inc,
1649                                     Stmt *LoopVar,
1650                                     SourceLocation RParenLoc) {
1651     // If we've just learned that the range is actually an Objective-C
1652     // collection, treat this as an Objective-C fast enumeration loop.
1653     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
1654       if (RangeStmt->isSingleDecl()) {
1655         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
1656           if (RangeVar->isInvalidDecl())
1657             return StmtError();
1658 
1659           Expr *RangeExpr = RangeVar->getInit();
1660           if (!RangeExpr->isTypeDependent() &&
1661               RangeExpr->getType()->isObjCObjectPointerType())
1662             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
1663                                                         RParenLoc);
1664         }
1665       }
1666     }
1667 
1668     return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd,
1669                                           Cond, Inc, LoopVar, RParenLoc,
1670                                           Sema::BFRK_Rebuild);
1671   }
1672 
1673   /// \brief Build a new C++0x range-based for statement.
1674   ///
1675   /// By default, performs semantic analysis to build the new statement.
1676   /// Subclasses may override this routine to provide different behavior.
1677   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
1678                                           bool IsIfExists,
1679                                           NestedNameSpecifierLoc QualifierLoc,
1680                                           DeclarationNameInfo NameInfo,
1681                                           Stmt *Nested) {
1682     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
1683                                                 QualifierLoc, NameInfo, Nested);
1684   }
1685 
1686   /// \brief Attach body to a C++0x range-based for statement.
1687   ///
1688   /// By default, performs semantic analysis to finish the new statement.
1689   /// Subclasses may override this routine to provide different behavior.
1690   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
1691     return getSema().FinishCXXForRangeStmt(ForRange, Body);
1692   }
1693 
1694   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
1695                                Stmt *TryBlock, Stmt *Handler) {
1696     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
1697   }
1698 
1699   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
1700                                   Stmt *Block) {
1701     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
1702   }
1703 
1704   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
1705     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
1706   }
1707 
1708   /// \brief Build a new predefined expression.
1709   ///
1710   /// By default, performs semantic analysis to build the new expression.
1711   /// Subclasses may override this routine to provide different behavior.
1712   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
1713                                    PredefinedExpr::IdentType IT) {
1714     return getSema().BuildPredefinedExpr(Loc, IT);
1715   }
1716 
1717   /// \brief Build a new expression that references a declaration.
1718   ///
1719   /// By default, performs semantic analysis to build the new expression.
1720   /// Subclasses may override this routine to provide different behavior.
1721   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
1722                                         LookupResult &R,
1723                                         bool RequiresADL) {
1724     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
1725   }
1726 
1727 
1728   /// \brief Build a new expression that references a declaration.
1729   ///
1730   /// By default, performs semantic analysis to build the new expression.
1731   /// Subclasses may override this routine to provide different behavior.
1732   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
1733                                 ValueDecl *VD,
1734                                 const DeclarationNameInfo &NameInfo,
1735                                 TemplateArgumentListInfo *TemplateArgs) {
1736     CXXScopeSpec SS;
1737     SS.Adopt(QualifierLoc);
1738 
1739     // FIXME: loses template args.
1740 
1741     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
1742   }
1743 
1744   /// \brief Build a new expression in parentheses.
1745   ///
1746   /// By default, performs semantic analysis to build the new expression.
1747   /// Subclasses may override this routine to provide different behavior.
1748   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
1749                                     SourceLocation RParen) {
1750     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
1751   }
1752 
1753   /// \brief Build a new pseudo-destructor expression.
1754   ///
1755   /// By default, performs semantic analysis to build the new expression.
1756   /// Subclasses may override this routine to provide different behavior.
1757   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
1758                                             SourceLocation OperatorLoc,
1759                                             bool isArrow,
1760                                             CXXScopeSpec &SS,
1761                                             TypeSourceInfo *ScopeType,
1762                                             SourceLocation CCLoc,
1763                                             SourceLocation TildeLoc,
1764                                         PseudoDestructorTypeStorage Destroyed);
1765 
1766   /// \brief Build a new unary operator expression.
1767   ///
1768   /// By default, performs semantic analysis to build the new expression.
1769   /// Subclasses may override this routine to provide different behavior.
1770   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
1771                                         UnaryOperatorKind Opc,
1772                                         Expr *SubExpr) {
1773     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
1774   }
1775 
1776   /// \brief Build a new builtin offsetof expression.
1777   ///
1778   /// By default, performs semantic analysis to build the new expression.
1779   /// Subclasses may override this routine to provide different behavior.
1780   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
1781                                        TypeSourceInfo *Type,
1782                                        Sema::OffsetOfComponent *Components,
1783                                        unsigned NumComponents,
1784                                        SourceLocation RParenLoc) {
1785     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
1786                                           NumComponents, RParenLoc);
1787   }
1788 
1789   /// \brief Build a new sizeof, alignof or vec_step expression with a
1790   /// type argument.
1791   ///
1792   /// By default, performs semantic analysis to build the new expression.
1793   /// Subclasses may override this routine to provide different behavior.
1794   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
1795                                          SourceLocation OpLoc,
1796                                          UnaryExprOrTypeTrait ExprKind,
1797                                          SourceRange R) {
1798     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
1799   }
1800 
1801   /// \brief Build a new sizeof, alignof or vec step expression with an
1802   /// expression argument.
1803   ///
1804   /// By default, performs semantic analysis to build the new expression.
1805   /// Subclasses may override this routine to provide different behavior.
1806   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
1807                                          UnaryExprOrTypeTrait ExprKind,
1808                                          SourceRange R) {
1809     ExprResult Result
1810       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
1811     if (Result.isInvalid())
1812       return ExprError();
1813 
1814     return Result;
1815   }
1816 
1817   /// \brief Build a new array subscript expression.
1818   ///
1819   /// By default, performs semantic analysis to build the new expression.
1820   /// Subclasses may override this routine to provide different behavior.
1821   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
1822                                              SourceLocation LBracketLoc,
1823                                              Expr *RHS,
1824                                              SourceLocation RBracketLoc) {
1825     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
1826                                              LBracketLoc, RHS,
1827                                              RBracketLoc);
1828   }
1829 
1830   /// \brief Build a new call expression.
1831   ///
1832   /// By default, performs semantic analysis to build the new expression.
1833   /// Subclasses may override this routine to provide different behavior.
1834   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
1835                                    MultiExprArg Args,
1836                                    SourceLocation RParenLoc,
1837                                    Expr *ExecConfig = nullptr) {
1838     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
1839                                    Args, RParenLoc, ExecConfig);
1840   }
1841 
1842   /// \brief Build a new member access expression.
1843   ///
1844   /// By default, performs semantic analysis to build the new expression.
1845   /// Subclasses may override this routine to provide different behavior.
1846   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
1847                                bool isArrow,
1848                                NestedNameSpecifierLoc QualifierLoc,
1849                                SourceLocation TemplateKWLoc,
1850                                const DeclarationNameInfo &MemberNameInfo,
1851                                ValueDecl *Member,
1852                                NamedDecl *FoundDecl,
1853                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
1854                                NamedDecl *FirstQualifierInScope) {
1855     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
1856                                                                       isArrow);
1857     if (!Member->getDeclName()) {
1858       // We have a reference to an unnamed field.  This is always the
1859       // base of an anonymous struct/union member access, i.e. the
1860       // field is always of record type.
1861       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
1862       assert(Member->getType()->isRecordType() &&
1863              "unnamed member not of record type?");
1864 
1865       BaseResult =
1866         getSema().PerformObjectMemberConversion(BaseResult.get(),
1867                                                 QualifierLoc.getNestedNameSpecifier(),
1868                                                 FoundDecl, Member);
1869       if (BaseResult.isInvalid())
1870         return ExprError();
1871       Base = BaseResult.get();
1872       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
1873       MemberExpr *ME =
1874         new (getSema().Context) MemberExpr(Base, isArrow,
1875                                            Member, MemberNameInfo,
1876                                            cast<FieldDecl>(Member)->getType(),
1877                                            VK, OK_Ordinary);
1878       return ME;
1879     }
1880 
1881     CXXScopeSpec SS;
1882     SS.Adopt(QualifierLoc);
1883 
1884     Base = BaseResult.get();
1885     QualType BaseType = Base->getType();
1886 
1887     // FIXME: this involves duplicating earlier analysis in a lot of
1888     // cases; we should avoid this when possible.
1889     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
1890     R.addDecl(FoundDecl);
1891     R.resolveKind();
1892 
1893     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
1894                                               SS, TemplateKWLoc,
1895                                               FirstQualifierInScope,
1896                                               R, ExplicitTemplateArgs);
1897   }
1898 
1899   /// \brief Build a new binary operator expression.
1900   ///
1901   /// By default, performs semantic analysis to build the new expression.
1902   /// Subclasses may override this routine to provide different behavior.
1903   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
1904                                          BinaryOperatorKind Opc,
1905                                          Expr *LHS, Expr *RHS) {
1906     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
1907   }
1908 
1909   /// \brief Build a new conditional operator expression.
1910   ///
1911   /// By default, performs semantic analysis to build the new expression.
1912   /// Subclasses may override this routine to provide different behavior.
1913   ExprResult RebuildConditionalOperator(Expr *Cond,
1914                                         SourceLocation QuestionLoc,
1915                                         Expr *LHS,
1916                                         SourceLocation ColonLoc,
1917                                         Expr *RHS) {
1918     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
1919                                         LHS, RHS);
1920   }
1921 
1922   /// \brief Build a new C-style cast expression.
1923   ///
1924   /// By default, performs semantic analysis to build the new expression.
1925   /// Subclasses may override this routine to provide different behavior.
1926   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
1927                                          TypeSourceInfo *TInfo,
1928                                          SourceLocation RParenLoc,
1929                                          Expr *SubExpr) {
1930     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
1931                                          SubExpr);
1932   }
1933 
1934   /// \brief Build a new compound literal expression.
1935   ///
1936   /// By default, performs semantic analysis to build the new expression.
1937   /// Subclasses may override this routine to provide different behavior.
1938   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1939                                               TypeSourceInfo *TInfo,
1940                                               SourceLocation RParenLoc,
1941                                               Expr *Init) {
1942     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
1943                                               Init);
1944   }
1945 
1946   /// \brief Build a new extended vector element access expression.
1947   ///
1948   /// By default, performs semantic analysis to build the new expression.
1949   /// Subclasses may override this routine to provide different behavior.
1950   ExprResult RebuildExtVectorElementExpr(Expr *Base,
1951                                                SourceLocation OpLoc,
1952                                                SourceLocation AccessorLoc,
1953                                                IdentifierInfo &Accessor) {
1954 
1955     CXXScopeSpec SS;
1956     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
1957     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
1958                                               OpLoc, /*IsArrow*/ false,
1959                                               SS, SourceLocation(),
1960                                               /*FirstQualifierInScope*/ nullptr,
1961                                               NameInfo,
1962                                               /* TemplateArgs */ nullptr);
1963   }
1964 
1965   /// \brief Build a new initializer list expression.
1966   ///
1967   /// By default, performs semantic analysis to build the new expression.
1968   /// Subclasses may override this routine to provide different behavior.
1969   ExprResult RebuildInitList(SourceLocation LBraceLoc,
1970                              MultiExprArg Inits,
1971                              SourceLocation RBraceLoc,
1972                              QualType ResultTy) {
1973     ExprResult Result
1974       = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
1975     if (Result.isInvalid() || ResultTy->isDependentType())
1976       return Result;
1977 
1978     // Patch in the result type we were given, which may have been computed
1979     // when the initial InitListExpr was built.
1980     InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get());
1981     ILE->setType(ResultTy);
1982     return Result;
1983   }
1984 
1985   /// \brief Build a new designated initializer expression.
1986   ///
1987   /// By default, performs semantic analysis to build the new expression.
1988   /// Subclasses may override this routine to provide different behavior.
1989   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
1990                                              MultiExprArg ArrayExprs,
1991                                              SourceLocation EqualOrColonLoc,
1992                                              bool GNUSyntax,
1993                                              Expr *Init) {
1994     ExprResult Result
1995       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1996                                            Init);
1997     if (Result.isInvalid())
1998       return ExprError();
1999 
2000     return Result;
2001   }
2002 
2003   /// \brief Build a new value-initialized expression.
2004   ///
2005   /// By default, builds the implicit value initialization without performing
2006   /// any semantic analysis. Subclasses may override this routine to provide
2007   /// different behavior.
2008   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2009     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2010   }
2011 
2012   /// \brief Build a new \c va_arg expression.
2013   ///
2014   /// By default, performs semantic analysis to build the new expression.
2015   /// Subclasses may override this routine to provide different behavior.
2016   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2017                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2018                                     SourceLocation RParenLoc) {
2019     return getSema().BuildVAArgExpr(BuiltinLoc,
2020                                     SubExpr, TInfo,
2021                                     RParenLoc);
2022   }
2023 
2024   /// \brief Build a new expression list in parentheses.
2025   ///
2026   /// By default, performs semantic analysis to build the new expression.
2027   /// Subclasses may override this routine to provide different behavior.
2028   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2029                                   MultiExprArg SubExprs,
2030                                   SourceLocation RParenLoc) {
2031     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2032   }
2033 
2034   /// \brief Build a new address-of-label expression.
2035   ///
2036   /// By default, performs semantic analysis, using the name of the label
2037   /// rather than attempting to map the label statement itself.
2038   /// Subclasses may override this routine to provide different behavior.
2039   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2040                                   SourceLocation LabelLoc, LabelDecl *Label) {
2041     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2042   }
2043 
2044   /// \brief Build a new GNU statement expression.
2045   ///
2046   /// By default, performs semantic analysis to build the new expression.
2047   /// Subclasses may override this routine to provide different behavior.
2048   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2049                                    Stmt *SubStmt,
2050                                    SourceLocation RParenLoc) {
2051     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2052   }
2053 
2054   /// \brief Build a new __builtin_choose_expr expression.
2055   ///
2056   /// By default, performs semantic analysis to build the new expression.
2057   /// Subclasses may override this routine to provide different behavior.
2058   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2059                                      Expr *Cond, Expr *LHS, Expr *RHS,
2060                                      SourceLocation RParenLoc) {
2061     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2062                                    Cond, LHS, RHS,
2063                                    RParenLoc);
2064   }
2065 
2066   /// \brief Build a new generic selection expression.
2067   ///
2068   /// By default, performs semantic analysis to build the new expression.
2069   /// Subclasses may override this routine to provide different behavior.
2070   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2071                                          SourceLocation DefaultLoc,
2072                                          SourceLocation RParenLoc,
2073                                          Expr *ControllingExpr,
2074                                          ArrayRef<TypeSourceInfo *> Types,
2075                                          ArrayRef<Expr *> Exprs) {
2076     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2077                                                 ControllingExpr, Types, Exprs);
2078   }
2079 
2080   /// \brief Build a new overloaded operator call expression.
2081   ///
2082   /// By default, performs semantic analysis to build the new expression.
2083   /// The semantic analysis provides the behavior of template instantiation,
2084   /// copying with transformations that turn what looks like an overloaded
2085   /// operator call into a use of a builtin operator, performing
2086   /// argument-dependent lookup, etc. Subclasses may override this routine to
2087   /// provide different behavior.
2088   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2089                                               SourceLocation OpLoc,
2090                                               Expr *Callee,
2091                                               Expr *First,
2092                                               Expr *Second);
2093 
2094   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2095   /// reinterpret_cast.
2096   ///
2097   /// By default, this routine dispatches to one of the more-specific routines
2098   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2099   /// Subclasses may override this routine to provide different behavior.
2100   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2101                                            Stmt::StmtClass Class,
2102                                            SourceLocation LAngleLoc,
2103                                            TypeSourceInfo *TInfo,
2104                                            SourceLocation RAngleLoc,
2105                                            SourceLocation LParenLoc,
2106                                            Expr *SubExpr,
2107                                            SourceLocation RParenLoc) {
2108     switch (Class) {
2109     case Stmt::CXXStaticCastExprClass:
2110       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2111                                                    RAngleLoc, LParenLoc,
2112                                                    SubExpr, RParenLoc);
2113 
2114     case Stmt::CXXDynamicCastExprClass:
2115       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2116                                                     RAngleLoc, LParenLoc,
2117                                                     SubExpr, RParenLoc);
2118 
2119     case Stmt::CXXReinterpretCastExprClass:
2120       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2121                                                         RAngleLoc, LParenLoc,
2122                                                         SubExpr,
2123                                                         RParenLoc);
2124 
2125     case Stmt::CXXConstCastExprClass:
2126       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2127                                                    RAngleLoc, LParenLoc,
2128                                                    SubExpr, RParenLoc);
2129 
2130     default:
2131       llvm_unreachable("Invalid C++ named cast");
2132     }
2133   }
2134 
2135   /// \brief Build a new C++ static_cast expression.
2136   ///
2137   /// By default, performs semantic analysis to build the new expression.
2138   /// Subclasses may override this routine to provide different behavior.
2139   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2140                                             SourceLocation LAngleLoc,
2141                                             TypeSourceInfo *TInfo,
2142                                             SourceLocation RAngleLoc,
2143                                             SourceLocation LParenLoc,
2144                                             Expr *SubExpr,
2145                                             SourceLocation RParenLoc) {
2146     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2147                                        TInfo, SubExpr,
2148                                        SourceRange(LAngleLoc, RAngleLoc),
2149                                        SourceRange(LParenLoc, RParenLoc));
2150   }
2151 
2152   /// \brief Build a new C++ dynamic_cast expression.
2153   ///
2154   /// By default, performs semantic analysis to build the new expression.
2155   /// Subclasses may override this routine to provide different behavior.
2156   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2157                                              SourceLocation LAngleLoc,
2158                                              TypeSourceInfo *TInfo,
2159                                              SourceLocation RAngleLoc,
2160                                              SourceLocation LParenLoc,
2161                                              Expr *SubExpr,
2162                                              SourceLocation RParenLoc) {
2163     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2164                                        TInfo, SubExpr,
2165                                        SourceRange(LAngleLoc, RAngleLoc),
2166                                        SourceRange(LParenLoc, RParenLoc));
2167   }
2168 
2169   /// \brief Build a new C++ reinterpret_cast expression.
2170   ///
2171   /// By default, performs semantic analysis to build the new expression.
2172   /// Subclasses may override this routine to provide different behavior.
2173   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2174                                                  SourceLocation LAngleLoc,
2175                                                  TypeSourceInfo *TInfo,
2176                                                  SourceLocation RAngleLoc,
2177                                                  SourceLocation LParenLoc,
2178                                                  Expr *SubExpr,
2179                                                  SourceLocation RParenLoc) {
2180     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2181                                        TInfo, SubExpr,
2182                                        SourceRange(LAngleLoc, RAngleLoc),
2183                                        SourceRange(LParenLoc, RParenLoc));
2184   }
2185 
2186   /// \brief Build a new C++ const_cast 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 RebuildCXXConstCastExpr(SourceLocation OpLoc,
2191                                            SourceLocation LAngleLoc,
2192                                            TypeSourceInfo *TInfo,
2193                                            SourceLocation RAngleLoc,
2194                                            SourceLocation LParenLoc,
2195                                            Expr *SubExpr,
2196                                            SourceLocation RParenLoc) {
2197     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2198                                        TInfo, SubExpr,
2199                                        SourceRange(LAngleLoc, RAngleLoc),
2200                                        SourceRange(LParenLoc, RParenLoc));
2201   }
2202 
2203   /// \brief Build a new C++ functional-style cast expression.
2204   ///
2205   /// By default, performs semantic analysis to build the new expression.
2206   /// Subclasses may override this routine to provide different behavior.
2207   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2208                                           SourceLocation LParenLoc,
2209                                           Expr *Sub,
2210                                           SourceLocation RParenLoc) {
2211     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2212                                                MultiExprArg(&Sub, 1),
2213                                                RParenLoc);
2214   }
2215 
2216   /// \brief Build a new C++ typeid(type) expression.
2217   ///
2218   /// By default, performs semantic analysis to build the new expression.
2219   /// Subclasses may override this routine to provide different behavior.
2220   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2221                                         SourceLocation TypeidLoc,
2222                                         TypeSourceInfo *Operand,
2223                                         SourceLocation RParenLoc) {
2224     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2225                                     RParenLoc);
2226   }
2227 
2228 
2229   /// \brief Build a new C++ typeid(expr) expression.
2230   ///
2231   /// By default, performs semantic analysis to build the new expression.
2232   /// Subclasses may override this routine to provide different behavior.
2233   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2234                                         SourceLocation TypeidLoc,
2235                                         Expr *Operand,
2236                                         SourceLocation RParenLoc) {
2237     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2238                                     RParenLoc);
2239   }
2240 
2241   /// \brief Build a new C++ __uuidof(type) expression.
2242   ///
2243   /// By default, performs semantic analysis to build the new expression.
2244   /// Subclasses may override this routine to provide different behavior.
2245   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2246                                         SourceLocation TypeidLoc,
2247                                         TypeSourceInfo *Operand,
2248                                         SourceLocation RParenLoc) {
2249     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2250                                     RParenLoc);
2251   }
2252 
2253   /// \brief Build a new C++ __uuidof(expr) expression.
2254   ///
2255   /// By default, performs semantic analysis to build the new expression.
2256   /// Subclasses may override this routine to provide different behavior.
2257   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2258                                         SourceLocation TypeidLoc,
2259                                         Expr *Operand,
2260                                         SourceLocation RParenLoc) {
2261     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2262                                     RParenLoc);
2263   }
2264 
2265   /// \brief Build a new C++ "this" expression.
2266   ///
2267   /// By default, builds a new "this" expression without performing any
2268   /// semantic analysis. Subclasses may override this routine to provide
2269   /// different behavior.
2270   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2271                                 QualType ThisType,
2272                                 bool isImplicit) {
2273     getSema().CheckCXXThisCapture(ThisLoc);
2274     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2275   }
2276 
2277   /// \brief Build a new C++ throw expression.
2278   ///
2279   /// By default, performs semantic analysis to build the new expression.
2280   /// Subclasses may override this routine to provide different behavior.
2281   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2282                                  bool IsThrownVariableInScope) {
2283     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2284   }
2285 
2286   /// \brief Build a new C++ default-argument expression.
2287   ///
2288   /// By default, builds a new default-argument expression, which does not
2289   /// require any semantic analysis. Subclasses may override this routine to
2290   /// provide different behavior.
2291   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2292                                             ParmVarDecl *Param) {
2293     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2294   }
2295 
2296   /// \brief Build a new C++11 default-initialization expression.
2297   ///
2298   /// By default, builds a new default field initialization expression, which
2299   /// does not require any semantic analysis. Subclasses may override this
2300   /// routine to provide different behavior.
2301   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2302                                        FieldDecl *Field) {
2303     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2304   }
2305 
2306   /// \brief Build a new C++ zero-initialization expression.
2307   ///
2308   /// By default, performs semantic analysis to build the new expression.
2309   /// Subclasses may override this routine to provide different behavior.
2310   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2311                                            SourceLocation LParenLoc,
2312                                            SourceLocation RParenLoc) {
2313     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc,
2314                                                None, RParenLoc);
2315   }
2316 
2317   /// \brief Build a new C++ "new" expression.
2318   ///
2319   /// By default, performs semantic analysis to build the new expression.
2320   /// Subclasses may override this routine to provide different behavior.
2321   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2322                                bool UseGlobal,
2323                                SourceLocation PlacementLParen,
2324                                MultiExprArg PlacementArgs,
2325                                SourceLocation PlacementRParen,
2326                                SourceRange TypeIdParens,
2327                                QualType AllocatedType,
2328                                TypeSourceInfo *AllocatedTypeInfo,
2329                                Expr *ArraySize,
2330                                SourceRange DirectInitRange,
2331                                Expr *Initializer) {
2332     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2333                                  PlacementLParen,
2334                                  PlacementArgs,
2335                                  PlacementRParen,
2336                                  TypeIdParens,
2337                                  AllocatedType,
2338                                  AllocatedTypeInfo,
2339                                  ArraySize,
2340                                  DirectInitRange,
2341                                  Initializer);
2342   }
2343 
2344   /// \brief Build a new C++ "delete" expression.
2345   ///
2346   /// By default, performs semantic analysis to build the new expression.
2347   /// Subclasses may override this routine to provide different behavior.
2348   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2349                                         bool IsGlobalDelete,
2350                                         bool IsArrayForm,
2351                                         Expr *Operand) {
2352     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2353                                     Operand);
2354   }
2355 
2356   /// \brief Build a new type trait expression.
2357   ///
2358   /// By default, performs semantic analysis to build the new expression.
2359   /// Subclasses may override this routine to provide different behavior.
2360   ExprResult RebuildTypeTrait(TypeTrait Trait,
2361                               SourceLocation StartLoc,
2362                               ArrayRef<TypeSourceInfo *> Args,
2363                               SourceLocation RParenLoc) {
2364     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2365   }
2366 
2367   /// \brief Build a new array type trait expression.
2368   ///
2369   /// By default, performs semantic analysis to build the new expression.
2370   /// Subclasses may override this routine to provide different behavior.
2371   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2372                                    SourceLocation StartLoc,
2373                                    TypeSourceInfo *TSInfo,
2374                                    Expr *DimExpr,
2375                                    SourceLocation RParenLoc) {
2376     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2377   }
2378 
2379   /// \brief Build a new expression trait expression.
2380   ///
2381   /// By default, performs semantic analysis to build the new expression.
2382   /// Subclasses may override this routine to provide different behavior.
2383   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2384                                    SourceLocation StartLoc,
2385                                    Expr *Queried,
2386                                    SourceLocation RParenLoc) {
2387     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2388   }
2389 
2390   /// \brief Build a new (previously unresolved) declaration reference
2391   /// expression.
2392   ///
2393   /// By default, performs semantic analysis to build the new expression.
2394   /// Subclasses may override this routine to provide different behavior.
2395   ExprResult RebuildDependentScopeDeclRefExpr(
2396                                           NestedNameSpecifierLoc QualifierLoc,
2397                                           SourceLocation TemplateKWLoc,
2398                                        const DeclarationNameInfo &NameInfo,
2399                               const TemplateArgumentListInfo *TemplateArgs,
2400                                           bool IsAddressOfOperand,
2401                                           TypeSourceInfo **RecoveryTSI) {
2402     CXXScopeSpec SS;
2403     SS.Adopt(QualifierLoc);
2404 
2405     if (TemplateArgs || TemplateKWLoc.isValid())
2406       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2407                                                     TemplateArgs);
2408 
2409     return getSema().BuildQualifiedDeclarationNameExpr(
2410         SS, NameInfo, IsAddressOfOperand, RecoveryTSI);
2411   }
2412 
2413   /// \brief Build a new template-id expression.
2414   ///
2415   /// By default, performs semantic analysis to build the new expression.
2416   /// Subclasses may override this routine to provide different behavior.
2417   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2418                                    SourceLocation TemplateKWLoc,
2419                                    LookupResult &R,
2420                                    bool RequiresADL,
2421                               const TemplateArgumentListInfo *TemplateArgs) {
2422     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2423                                          TemplateArgs);
2424   }
2425 
2426   /// \brief Build a new object-construction expression.
2427   ///
2428   /// By default, performs semantic analysis to build the new expression.
2429   /// Subclasses may override this routine to provide different behavior.
2430   ExprResult RebuildCXXConstructExpr(QualType T,
2431                                      SourceLocation Loc,
2432                                      CXXConstructorDecl *Constructor,
2433                                      bool IsElidable,
2434                                      MultiExprArg Args,
2435                                      bool HadMultipleCandidates,
2436                                      bool ListInitialization,
2437                                      bool StdInitListInitialization,
2438                                      bool RequiresZeroInit,
2439                              CXXConstructExpr::ConstructionKind ConstructKind,
2440                                      SourceRange ParenRange) {
2441     SmallVector<Expr*, 8> ConvertedArgs;
2442     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2443                                           ConvertedArgs))
2444       return ExprError();
2445 
2446     return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable,
2447                                            ConvertedArgs,
2448                                            HadMultipleCandidates,
2449                                            ListInitialization,
2450                                            StdInitListInitialization,
2451                                            RequiresZeroInit, ConstructKind,
2452                                            ParenRange);
2453   }
2454 
2455   /// \brief Build a new object-construction expression.
2456   ///
2457   /// By default, performs semantic analysis to build the new expression.
2458   /// Subclasses may override this routine to provide different behavior.
2459   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2460                                            SourceLocation LParenLoc,
2461                                            MultiExprArg Args,
2462                                            SourceLocation RParenLoc) {
2463     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2464                                                LParenLoc,
2465                                                Args,
2466                                                RParenLoc);
2467   }
2468 
2469   /// \brief Build a new object-construction expression.
2470   ///
2471   /// By default, performs semantic analysis to build the new expression.
2472   /// Subclasses may override this routine to provide different behavior.
2473   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2474                                                SourceLocation LParenLoc,
2475                                                MultiExprArg Args,
2476                                                SourceLocation RParenLoc) {
2477     return getSema().BuildCXXTypeConstructExpr(TSInfo,
2478                                                LParenLoc,
2479                                                Args,
2480                                                RParenLoc);
2481   }
2482 
2483   /// \brief Build a new member reference expression.
2484   ///
2485   /// By default, performs semantic analysis to build the new expression.
2486   /// Subclasses may override this routine to provide different behavior.
2487   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2488                                                 QualType BaseType,
2489                                                 bool IsArrow,
2490                                                 SourceLocation OperatorLoc,
2491                                           NestedNameSpecifierLoc QualifierLoc,
2492                                                 SourceLocation TemplateKWLoc,
2493                                             NamedDecl *FirstQualifierInScope,
2494                                    const DeclarationNameInfo &MemberNameInfo,
2495                               const TemplateArgumentListInfo *TemplateArgs) {
2496     CXXScopeSpec SS;
2497     SS.Adopt(QualifierLoc);
2498 
2499     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2500                                             OperatorLoc, IsArrow,
2501                                             SS, TemplateKWLoc,
2502                                             FirstQualifierInScope,
2503                                             MemberNameInfo,
2504                                             TemplateArgs);
2505   }
2506 
2507   /// \brief Build a new member reference expression.
2508   ///
2509   /// By default, performs semantic analysis to build the new expression.
2510   /// Subclasses may override this routine to provide different behavior.
2511   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2512                                          SourceLocation OperatorLoc,
2513                                          bool IsArrow,
2514                                          NestedNameSpecifierLoc QualifierLoc,
2515                                          SourceLocation TemplateKWLoc,
2516                                          NamedDecl *FirstQualifierInScope,
2517                                          LookupResult &R,
2518                                 const TemplateArgumentListInfo *TemplateArgs) {
2519     CXXScopeSpec SS;
2520     SS.Adopt(QualifierLoc);
2521 
2522     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2523                                             OperatorLoc, IsArrow,
2524                                             SS, TemplateKWLoc,
2525                                             FirstQualifierInScope,
2526                                             R, TemplateArgs);
2527   }
2528 
2529   /// \brief Build a new noexcept expression.
2530   ///
2531   /// By default, performs semantic analysis to build the new expression.
2532   /// Subclasses may override this routine to provide different behavior.
2533   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2534     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2535   }
2536 
2537   /// \brief Build a new expression to compute the length of a parameter pack.
2538   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack,
2539                                    SourceLocation PackLoc,
2540                                    SourceLocation RParenLoc,
2541                                    Optional<unsigned> Length) {
2542     if (Length)
2543       return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2544                                                   OperatorLoc, Pack, PackLoc,
2545                                                   RParenLoc, *Length);
2546 
2547     return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(),
2548                                                 OperatorLoc, Pack, PackLoc,
2549                                                 RParenLoc);
2550   }
2551 
2552   /// \brief Build a new Objective-C boxed expression.
2553   ///
2554   /// By default, performs semantic analysis to build the new expression.
2555   /// Subclasses may override this routine to provide different behavior.
2556   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2557     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2558   }
2559 
2560   /// \brief Build a new Objective-C array literal.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
2564   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2565                                      Expr **Elements, unsigned NumElements) {
2566     return getSema().BuildObjCArrayLiteral(Range,
2567                                            MultiExprArg(Elements, NumElements));
2568   }
2569 
2570   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2571                                          Expr *Base, Expr *Key,
2572                                          ObjCMethodDecl *getterMethod,
2573                                          ObjCMethodDecl *setterMethod) {
2574     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2575                                                    getterMethod, setterMethod);
2576   }
2577 
2578   /// \brief Build a new Objective-C dictionary literal.
2579   ///
2580   /// By default, performs semantic analysis to build the new expression.
2581   /// Subclasses may override this routine to provide different behavior.
2582   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2583                                           ObjCDictionaryElement *Elements,
2584                                           unsigned NumElements) {
2585     return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements);
2586   }
2587 
2588   /// \brief Build a new Objective-C \@encode expression.
2589   ///
2590   /// By default, performs semantic analysis to build the new expression.
2591   /// Subclasses may override this routine to provide different behavior.
2592   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2593                                          TypeSourceInfo *EncodeTypeInfo,
2594                                          SourceLocation RParenLoc) {
2595     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2596   }
2597 
2598   /// \brief Build a new Objective-C class message.
2599   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2600                                           Selector Sel,
2601                                           ArrayRef<SourceLocation> SelectorLocs,
2602                                           ObjCMethodDecl *Method,
2603                                           SourceLocation LBracLoc,
2604                                           MultiExprArg Args,
2605                                           SourceLocation RBracLoc) {
2606     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2607                                      ReceiverTypeInfo->getType(),
2608                                      /*SuperLoc=*/SourceLocation(),
2609                                      Sel, Method, LBracLoc, SelectorLocs,
2610                                      RBracLoc, Args);
2611   }
2612 
2613   /// \brief Build a new Objective-C instance message.
2614   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2615                                           Selector Sel,
2616                                           ArrayRef<SourceLocation> SelectorLocs,
2617                                           ObjCMethodDecl *Method,
2618                                           SourceLocation LBracLoc,
2619                                           MultiExprArg Args,
2620                                           SourceLocation RBracLoc) {
2621     return SemaRef.BuildInstanceMessage(Receiver,
2622                                         Receiver->getType(),
2623                                         /*SuperLoc=*/SourceLocation(),
2624                                         Sel, Method, LBracLoc, SelectorLocs,
2625                                         RBracLoc, Args);
2626   }
2627 
2628   /// \brief Build a new Objective-C ivar reference expression.
2629   ///
2630   /// By default, performs semantic analysis to build the new expression.
2631   /// Subclasses may override this routine to provide different behavior.
2632   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
2633                                           SourceLocation IvarLoc,
2634                                           bool IsArrow, bool IsFreeIvar) {
2635     // FIXME: We lose track of the IsFreeIvar bit.
2636     CXXScopeSpec SS;
2637     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
2638     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2639                                               /*FIXME:*/IvarLoc, IsArrow,
2640                                               SS, SourceLocation(),
2641                                               /*FirstQualifierInScope=*/nullptr,
2642                                               NameInfo,
2643                                               /*TemplateArgs=*/nullptr);
2644   }
2645 
2646   /// \brief Build a new Objective-C property reference expression.
2647   ///
2648   /// By default, performs semantic analysis to build the new expression.
2649   /// Subclasses may override this routine to provide different behavior.
2650   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
2651                                         ObjCPropertyDecl *Property,
2652                                         SourceLocation PropertyLoc) {
2653     CXXScopeSpec SS;
2654     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
2655     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2656                                               /*FIXME:*/PropertyLoc,
2657                                               /*IsArrow=*/false,
2658                                               SS, SourceLocation(),
2659                                               /*FirstQualifierInScope=*/nullptr,
2660                                               NameInfo,
2661                                               /*TemplateArgs=*/nullptr);
2662   }
2663 
2664   /// \brief Build a new Objective-C property reference expression.
2665   ///
2666   /// By default, performs semantic analysis to build the new expression.
2667   /// Subclasses may override this routine to provide different behavior.
2668   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
2669                                         ObjCMethodDecl *Getter,
2670                                         ObjCMethodDecl *Setter,
2671                                         SourceLocation PropertyLoc) {
2672     // Since these expressions can only be value-dependent, we do not
2673     // need to perform semantic analysis again.
2674     return Owned(
2675       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
2676                                                   VK_LValue, OK_ObjCProperty,
2677                                                   PropertyLoc, Base));
2678   }
2679 
2680   /// \brief Build a new Objective-C "isa" 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 RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
2685                                 SourceLocation OpLoc, bool IsArrow) {
2686     CXXScopeSpec SS;
2687     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
2688     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
2689                                               OpLoc, IsArrow,
2690                                               SS, SourceLocation(),
2691                                               /*FirstQualifierInScope=*/nullptr,
2692                                               NameInfo,
2693                                               /*TemplateArgs=*/nullptr);
2694   }
2695 
2696   /// \brief Build a new shuffle vector expression.
2697   ///
2698   /// By default, performs semantic analysis to build the new expression.
2699   /// Subclasses may override this routine to provide different behavior.
2700   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
2701                                       MultiExprArg SubExprs,
2702                                       SourceLocation RParenLoc) {
2703     // Find the declaration for __builtin_shufflevector
2704     const IdentifierInfo &Name
2705       = SemaRef.Context.Idents.get("__builtin_shufflevector");
2706     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
2707     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
2708     assert(!Lookup.empty() && "No __builtin_shufflevector?");
2709 
2710     // Build a reference to the __builtin_shufflevector builtin
2711     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
2712     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
2713                                                   SemaRef.Context.BuiltinFnTy,
2714                                                   VK_RValue, BuiltinLoc);
2715     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
2716     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
2717                                        CK_BuiltinFnToFnPtr).get();
2718 
2719     // Build the CallExpr
2720     ExprResult TheCall = new (SemaRef.Context) CallExpr(
2721         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
2722         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
2723 
2724     // Type-check the __builtin_shufflevector expression.
2725     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
2726   }
2727 
2728   /// \brief Build a new convert vector expression.
2729   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
2730                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
2731                                       SourceLocation RParenLoc) {
2732     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
2733                                          BuiltinLoc, RParenLoc);
2734   }
2735 
2736   /// \brief Build a new template argument pack expansion.
2737   ///
2738   /// By default, performs semantic analysis to build a new pack expansion
2739   /// for a template argument. Subclasses may override this routine to provide
2740   /// different behavior.
2741   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
2742                                            SourceLocation EllipsisLoc,
2743                                            Optional<unsigned> NumExpansions) {
2744     switch (Pattern.getArgument().getKind()) {
2745     case TemplateArgument::Expression: {
2746       ExprResult Result
2747         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
2748                                        EllipsisLoc, NumExpansions);
2749       if (Result.isInvalid())
2750         return TemplateArgumentLoc();
2751 
2752       return TemplateArgumentLoc(Result.get(), Result.get());
2753     }
2754 
2755     case TemplateArgument::Template:
2756       return TemplateArgumentLoc(TemplateArgument(
2757                                           Pattern.getArgument().getAsTemplate(),
2758                                                   NumExpansions),
2759                                  Pattern.getTemplateQualifierLoc(),
2760                                  Pattern.getTemplateNameLoc(),
2761                                  EllipsisLoc);
2762 
2763     case TemplateArgument::Null:
2764     case TemplateArgument::Integral:
2765     case TemplateArgument::Declaration:
2766     case TemplateArgument::Pack:
2767     case TemplateArgument::TemplateExpansion:
2768     case TemplateArgument::NullPtr:
2769       llvm_unreachable("Pack expansion pattern has no parameter packs");
2770 
2771     case TemplateArgument::Type:
2772       if (TypeSourceInfo *Expansion
2773             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
2774                                            EllipsisLoc,
2775                                            NumExpansions))
2776         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
2777                                    Expansion);
2778       break;
2779     }
2780 
2781     return TemplateArgumentLoc();
2782   }
2783 
2784   /// \brief Build a new expression pack expansion.
2785   ///
2786   /// By default, performs semantic analysis to build a new pack expansion
2787   /// for an expression. Subclasses may override this routine to provide
2788   /// different behavior.
2789   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
2790                                   Optional<unsigned> NumExpansions) {
2791     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
2792   }
2793 
2794   /// \brief Build a new C++1z fold-expression.
2795   ///
2796   /// By default, performs semantic analysis in order to build a new fold
2797   /// expression.
2798   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
2799                                 BinaryOperatorKind Operator,
2800                                 SourceLocation EllipsisLoc, Expr *RHS,
2801                                 SourceLocation RParenLoc) {
2802     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
2803                                       RHS, RParenLoc);
2804   }
2805 
2806   /// \brief Build an empty C++1z fold-expression with the given operator.
2807   ///
2808   /// By default, produces the fallback value for the fold-expression, or
2809   /// produce an error if there is no fallback value.
2810   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
2811                                      BinaryOperatorKind Operator) {
2812     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
2813   }
2814 
2815   /// \brief Build a new atomic operation expression.
2816   ///
2817   /// By default, performs semantic analysis to build the new expression.
2818   /// Subclasses may override this routine to provide different behavior.
2819   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
2820                                MultiExprArg SubExprs,
2821                                QualType RetTy,
2822                                AtomicExpr::AtomicOp Op,
2823                                SourceLocation RParenLoc) {
2824     // Just create the expression; there is not any interesting semantic
2825     // analysis here because we can't actually build an AtomicExpr until
2826     // we are sure it is semantically sound.
2827     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
2828                                             RParenLoc);
2829   }
2830 
2831 private:
2832   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
2833                                      QualType ObjectType,
2834                                      NamedDecl *FirstQualifierInScope,
2835                                      CXXScopeSpec &SS);
2836 
2837   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
2838                                              QualType ObjectType,
2839                                              NamedDecl *FirstQualifierInScope,
2840                                              CXXScopeSpec &SS);
2841 
2842   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
2843                                             NamedDecl *FirstQualifierInScope,
2844                                             CXXScopeSpec &SS);
2845 };
2846 
2847 template<typename Derived>
2848 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
2849   if (!S)
2850     return S;
2851 
2852   switch (S->getStmtClass()) {
2853   case Stmt::NoStmtClass: break;
2854 
2855   // Transform individual statement nodes
2856 #define STMT(Node, Parent)                                              \
2857   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
2858 #define ABSTRACT_STMT(Node)
2859 #define EXPR(Node, Parent)
2860 #include "clang/AST/StmtNodes.inc"
2861 
2862   // Transform expressions by calling TransformExpr.
2863 #define STMT(Node, Parent)
2864 #define ABSTRACT_STMT(Stmt)
2865 #define EXPR(Node, Parent) case Stmt::Node##Class:
2866 #include "clang/AST/StmtNodes.inc"
2867     {
2868       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
2869       if (E.isInvalid())
2870         return StmtError();
2871 
2872       return getSema().ActOnExprStmt(E);
2873     }
2874   }
2875 
2876   return S;
2877 }
2878 
2879 template<typename Derived>
2880 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
2881   if (!S)
2882     return S;
2883 
2884   switch (S->getClauseKind()) {
2885   default: break;
2886   // Transform individual clause nodes
2887 #define OPENMP_CLAUSE(Name, Class)                                             \
2888   case OMPC_ ## Name :                                                         \
2889     return getDerived().Transform ## Class(cast<Class>(S));
2890 #include "clang/Basic/OpenMPKinds.def"
2891   }
2892 
2893   return S;
2894 }
2895 
2896 
2897 template<typename Derived>
2898 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
2899   if (!E)
2900     return E;
2901 
2902   switch (E->getStmtClass()) {
2903     case Stmt::NoStmtClass: break;
2904 #define STMT(Node, Parent) case Stmt::Node##Class: break;
2905 #define ABSTRACT_STMT(Stmt)
2906 #define EXPR(Node, Parent)                                              \
2907     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
2908 #include "clang/AST/StmtNodes.inc"
2909   }
2910 
2911   return E;
2912 }
2913 
2914 template<typename Derived>
2915 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
2916                                                         bool NotCopyInit) {
2917   // Initializers are instantiated like expressions, except that various outer
2918   // layers are stripped.
2919   if (!Init)
2920     return Init;
2921 
2922   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
2923     Init = ExprTemp->getSubExpr();
2924 
2925   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
2926     Init = MTE->GetTemporaryExpr();
2927 
2928   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
2929     Init = Binder->getSubExpr();
2930 
2931   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
2932     Init = ICE->getSubExprAsWritten();
2933 
2934   if (CXXStdInitializerListExpr *ILE =
2935           dyn_cast<CXXStdInitializerListExpr>(Init))
2936     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
2937 
2938   // If this is copy-initialization, we only need to reconstruct
2939   // InitListExprs. Other forms of copy-initialization will be a no-op if
2940   // the initializer is already the right type.
2941   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
2942   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
2943     return getDerived().TransformExpr(Init);
2944 
2945   // Revert value-initialization back to empty parens.
2946   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
2947     SourceRange Parens = VIE->getSourceRange();
2948     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
2949                                              Parens.getEnd());
2950   }
2951 
2952   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
2953   if (isa<ImplicitValueInitExpr>(Init))
2954     return getDerived().RebuildParenListExpr(SourceLocation(), None,
2955                                              SourceLocation());
2956 
2957   // Revert initialization by constructor back to a parenthesized or braced list
2958   // of expressions. Any other form of initializer can just be reused directly.
2959   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
2960     return getDerived().TransformExpr(Init);
2961 
2962   // If the initialization implicitly converted an initializer list to a
2963   // std::initializer_list object, unwrap the std::initializer_list too.
2964   if (Construct && Construct->isStdInitListInitialization())
2965     return TransformInitializer(Construct->getArg(0), NotCopyInit);
2966 
2967   SmallVector<Expr*, 8> NewArgs;
2968   bool ArgChanged = false;
2969   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
2970                                   /*IsCall*/true, NewArgs, &ArgChanged))
2971     return ExprError();
2972 
2973   // If this was list initialization, revert to list form.
2974   if (Construct->isListInitialization())
2975     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
2976                                         Construct->getLocEnd(),
2977                                         Construct->getType());
2978 
2979   // Build a ParenListExpr to represent anything else.
2980   SourceRange Parens = Construct->getParenOrBraceRange();
2981   if (Parens.isInvalid()) {
2982     // This was a variable declaration's initialization for which no initializer
2983     // was specified.
2984     assert(NewArgs.empty() &&
2985            "no parens or braces but have direct init with arguments?");
2986     return ExprEmpty();
2987   }
2988   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
2989                                            Parens.getEnd());
2990 }
2991 
2992 template<typename Derived>
2993 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs,
2994                                             unsigned NumInputs,
2995                                             bool IsCall,
2996                                       SmallVectorImpl<Expr *> &Outputs,
2997                                             bool *ArgChanged) {
2998   for (unsigned I = 0; I != NumInputs; ++I) {
2999     // If requested, drop call arguments that need to be dropped.
3000     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3001       if (ArgChanged)
3002         *ArgChanged = true;
3003 
3004       break;
3005     }
3006 
3007     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3008       Expr *Pattern = Expansion->getPattern();
3009 
3010       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3011       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3012       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3013 
3014       // Determine whether the set of unexpanded parameter packs can and should
3015       // be expanded.
3016       bool Expand = true;
3017       bool RetainExpansion = false;
3018       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3019       Optional<unsigned> NumExpansions = OrigNumExpansions;
3020       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3021                                                Pattern->getSourceRange(),
3022                                                Unexpanded,
3023                                                Expand, RetainExpansion,
3024                                                NumExpansions))
3025         return true;
3026 
3027       if (!Expand) {
3028         // The transform has determined that we should perform a simple
3029         // transformation on the pack expansion, producing another pack
3030         // expansion.
3031         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3032         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3033         if (OutPattern.isInvalid())
3034           return true;
3035 
3036         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3037                                                 Expansion->getEllipsisLoc(),
3038                                                            NumExpansions);
3039         if (Out.isInvalid())
3040           return true;
3041 
3042         if (ArgChanged)
3043           *ArgChanged = true;
3044         Outputs.push_back(Out.get());
3045         continue;
3046       }
3047 
3048       // Record right away that the argument was changed.  This needs
3049       // to happen even if the array expands to nothing.
3050       if (ArgChanged) *ArgChanged = true;
3051 
3052       // The transform has determined that we should perform an elementwise
3053       // expansion of the pattern. Do so.
3054       for (unsigned I = 0; I != *NumExpansions; ++I) {
3055         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3056         ExprResult Out = getDerived().TransformExpr(Pattern);
3057         if (Out.isInvalid())
3058           return true;
3059 
3060         // FIXME: Can this happen? We should not try to expand the pack
3061         // in this case.
3062         if (Out.get()->containsUnexpandedParameterPack()) {
3063           Out = getDerived().RebuildPackExpansion(
3064               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3065           if (Out.isInvalid())
3066             return true;
3067         }
3068 
3069         Outputs.push_back(Out.get());
3070       }
3071 
3072       // If we're supposed to retain a pack expansion, do so by temporarily
3073       // forgetting the partially-substituted parameter pack.
3074       if (RetainExpansion) {
3075         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3076 
3077         ExprResult Out = getDerived().TransformExpr(Pattern);
3078         if (Out.isInvalid())
3079           return true;
3080 
3081         Out = getDerived().RebuildPackExpansion(
3082             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3083         if (Out.isInvalid())
3084           return true;
3085 
3086         Outputs.push_back(Out.get());
3087       }
3088 
3089       continue;
3090     }
3091 
3092     ExprResult Result =
3093       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3094              : getDerived().TransformExpr(Inputs[I]);
3095     if (Result.isInvalid())
3096       return true;
3097 
3098     if (Result.get() != Inputs[I] && ArgChanged)
3099       *ArgChanged = true;
3100 
3101     Outputs.push_back(Result.get());
3102   }
3103 
3104   return false;
3105 }
3106 
3107 template<typename Derived>
3108 NestedNameSpecifierLoc
3109 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3110                                                     NestedNameSpecifierLoc NNS,
3111                                                      QualType ObjectType,
3112                                              NamedDecl *FirstQualifierInScope) {
3113   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3114   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3115        Qualifier = Qualifier.getPrefix())
3116     Qualifiers.push_back(Qualifier);
3117 
3118   CXXScopeSpec SS;
3119   while (!Qualifiers.empty()) {
3120     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3121     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3122 
3123     switch (QNNS->getKind()) {
3124     case NestedNameSpecifier::Identifier:
3125       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr,
3126                                               *QNNS->getAsIdentifier(),
3127                                               Q.getLocalBeginLoc(),
3128                                               Q.getLocalEndLoc(),
3129                                               ObjectType, false, SS,
3130                                               FirstQualifierInScope, false))
3131         return NestedNameSpecifierLoc();
3132 
3133       break;
3134 
3135     case NestedNameSpecifier::Namespace: {
3136       NamespaceDecl *NS
3137         = cast_or_null<NamespaceDecl>(
3138                                     getDerived().TransformDecl(
3139                                                           Q.getLocalBeginLoc(),
3140                                                        QNNS->getAsNamespace()));
3141       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3142       break;
3143     }
3144 
3145     case NestedNameSpecifier::NamespaceAlias: {
3146       NamespaceAliasDecl *Alias
3147         = cast_or_null<NamespaceAliasDecl>(
3148                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3149                                                  QNNS->getAsNamespaceAlias()));
3150       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3151                 Q.getLocalEndLoc());
3152       break;
3153     }
3154 
3155     case NestedNameSpecifier::Global:
3156       // There is no meaningful transformation that one could perform on the
3157       // global scope.
3158       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3159       break;
3160 
3161     case NestedNameSpecifier::Super: {
3162       CXXRecordDecl *RD =
3163           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3164               SourceLocation(), QNNS->getAsRecordDecl()));
3165       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3166       break;
3167     }
3168 
3169     case NestedNameSpecifier::TypeSpecWithTemplate:
3170     case NestedNameSpecifier::TypeSpec: {
3171       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3172                                               FirstQualifierInScope, SS);
3173 
3174       if (!TL)
3175         return NestedNameSpecifierLoc();
3176 
3177       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3178           (SemaRef.getLangOpts().CPlusPlus11 &&
3179            TL.getType()->isEnumeralType())) {
3180         assert(!TL.getType().hasLocalQualifiers() &&
3181                "Can't get cv-qualifiers here");
3182         if (TL.getType()->isEnumeralType())
3183           SemaRef.Diag(TL.getBeginLoc(),
3184                        diag::warn_cxx98_compat_enum_nested_name_spec);
3185         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3186                   Q.getLocalEndLoc());
3187         break;
3188       }
3189       // If the nested-name-specifier is an invalid type def, don't emit an
3190       // error because a previous error should have already been emitted.
3191       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3192       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3193         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3194           << TL.getType() << SS.getRange();
3195       }
3196       return NestedNameSpecifierLoc();
3197     }
3198     }
3199 
3200     // The qualifier-in-scope and object type only apply to the leftmost entity.
3201     FirstQualifierInScope = nullptr;
3202     ObjectType = QualType();
3203   }
3204 
3205   // Don't rebuild the nested-name-specifier if we don't have to.
3206   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3207       !getDerived().AlwaysRebuild())
3208     return NNS;
3209 
3210   // If we can re-use the source-location data from the original
3211   // nested-name-specifier, do so.
3212   if (SS.location_size() == NNS.getDataLength() &&
3213       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3214     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3215 
3216   // Allocate new nested-name-specifier location information.
3217   return SS.getWithLocInContext(SemaRef.Context);
3218 }
3219 
3220 template<typename Derived>
3221 DeclarationNameInfo
3222 TreeTransform<Derived>
3223 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3224   DeclarationName Name = NameInfo.getName();
3225   if (!Name)
3226     return DeclarationNameInfo();
3227 
3228   switch (Name.getNameKind()) {
3229   case DeclarationName::Identifier:
3230   case DeclarationName::ObjCZeroArgSelector:
3231   case DeclarationName::ObjCOneArgSelector:
3232   case DeclarationName::ObjCMultiArgSelector:
3233   case DeclarationName::CXXOperatorName:
3234   case DeclarationName::CXXLiteralOperatorName:
3235   case DeclarationName::CXXUsingDirective:
3236     return NameInfo;
3237 
3238   case DeclarationName::CXXConstructorName:
3239   case DeclarationName::CXXDestructorName:
3240   case DeclarationName::CXXConversionFunctionName: {
3241     TypeSourceInfo *NewTInfo;
3242     CanQualType NewCanTy;
3243     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3244       NewTInfo = getDerived().TransformType(OldTInfo);
3245       if (!NewTInfo)
3246         return DeclarationNameInfo();
3247       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3248     }
3249     else {
3250       NewTInfo = nullptr;
3251       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3252       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3253       if (NewT.isNull())
3254         return DeclarationNameInfo();
3255       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3256     }
3257 
3258     DeclarationName NewName
3259       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3260                                                            NewCanTy);
3261     DeclarationNameInfo NewNameInfo(NameInfo);
3262     NewNameInfo.setName(NewName);
3263     NewNameInfo.setNamedTypeInfo(NewTInfo);
3264     return NewNameInfo;
3265   }
3266   }
3267 
3268   llvm_unreachable("Unknown name kind.");
3269 }
3270 
3271 template<typename Derived>
3272 TemplateName
3273 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3274                                               TemplateName Name,
3275                                               SourceLocation NameLoc,
3276                                               QualType ObjectType,
3277                                               NamedDecl *FirstQualifierInScope) {
3278   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3279     TemplateDecl *Template = QTN->getTemplateDecl();
3280     assert(Template && "qualified template name must refer to a template");
3281 
3282     TemplateDecl *TransTemplate
3283       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3284                                                               Template));
3285     if (!TransTemplate)
3286       return TemplateName();
3287 
3288     if (!getDerived().AlwaysRebuild() &&
3289         SS.getScopeRep() == QTN->getQualifier() &&
3290         TransTemplate == Template)
3291       return Name;
3292 
3293     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3294                                             TransTemplate);
3295   }
3296 
3297   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3298     if (SS.getScopeRep()) {
3299       // These apply to the scope specifier, not the template.
3300       ObjectType = QualType();
3301       FirstQualifierInScope = nullptr;
3302     }
3303 
3304     if (!getDerived().AlwaysRebuild() &&
3305         SS.getScopeRep() == DTN->getQualifier() &&
3306         ObjectType.isNull())
3307       return Name;
3308 
3309     if (DTN->isIdentifier()) {
3310       return getDerived().RebuildTemplateName(SS,
3311                                               *DTN->getIdentifier(),
3312                                               NameLoc,
3313                                               ObjectType,
3314                                               FirstQualifierInScope);
3315     }
3316 
3317     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3318                                             ObjectType);
3319   }
3320 
3321   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3322     TemplateDecl *TransTemplate
3323       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3324                                                               Template));
3325     if (!TransTemplate)
3326       return TemplateName();
3327 
3328     if (!getDerived().AlwaysRebuild() &&
3329         TransTemplate == Template)
3330       return Name;
3331 
3332     return TemplateName(TransTemplate);
3333   }
3334 
3335   if (SubstTemplateTemplateParmPackStorage *SubstPack
3336       = Name.getAsSubstTemplateTemplateParmPack()) {
3337     TemplateTemplateParmDecl *TransParam
3338     = cast_or_null<TemplateTemplateParmDecl>(
3339             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3340     if (!TransParam)
3341       return TemplateName();
3342 
3343     if (!getDerived().AlwaysRebuild() &&
3344         TransParam == SubstPack->getParameterPack())
3345       return Name;
3346 
3347     return getDerived().RebuildTemplateName(TransParam,
3348                                             SubstPack->getArgumentPack());
3349   }
3350 
3351   // These should be getting filtered out before they reach the AST.
3352   llvm_unreachable("overloaded function decl survived to here");
3353 }
3354 
3355 template<typename Derived>
3356 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3357                                          const TemplateArgument &Arg,
3358                                          TemplateArgumentLoc &Output) {
3359   SourceLocation Loc = getDerived().getBaseLocation();
3360   switch (Arg.getKind()) {
3361   case TemplateArgument::Null:
3362     llvm_unreachable("null template argument in TreeTransform");
3363     break;
3364 
3365   case TemplateArgument::Type:
3366     Output = TemplateArgumentLoc(Arg,
3367                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3368 
3369     break;
3370 
3371   case TemplateArgument::Template:
3372   case TemplateArgument::TemplateExpansion: {
3373     NestedNameSpecifierLocBuilder Builder;
3374     TemplateName Template = Arg.getAsTemplate();
3375     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3376       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3377     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3378       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3379 
3380     if (Arg.getKind() == TemplateArgument::Template)
3381       Output = TemplateArgumentLoc(Arg,
3382                                    Builder.getWithLocInContext(SemaRef.Context),
3383                                    Loc);
3384     else
3385       Output = TemplateArgumentLoc(Arg,
3386                                    Builder.getWithLocInContext(SemaRef.Context),
3387                                    Loc, Loc);
3388 
3389     break;
3390   }
3391 
3392   case TemplateArgument::Expression:
3393     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3394     break;
3395 
3396   case TemplateArgument::Declaration:
3397   case TemplateArgument::Integral:
3398   case TemplateArgument::Pack:
3399   case TemplateArgument::NullPtr:
3400     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3401     break;
3402   }
3403 }
3404 
3405 template<typename Derived>
3406 bool TreeTransform<Derived>::TransformTemplateArgument(
3407                                          const TemplateArgumentLoc &Input,
3408                                          TemplateArgumentLoc &Output) {
3409   const TemplateArgument &Arg = Input.getArgument();
3410   switch (Arg.getKind()) {
3411   case TemplateArgument::Null:
3412   case TemplateArgument::Integral:
3413   case TemplateArgument::Pack:
3414   case TemplateArgument::Declaration:
3415   case TemplateArgument::NullPtr:
3416     llvm_unreachable("Unexpected TemplateArgument");
3417 
3418   case TemplateArgument::Type: {
3419     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3420     if (!DI)
3421       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3422 
3423     DI = getDerived().TransformType(DI);
3424     if (!DI) return true;
3425 
3426     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3427     return false;
3428   }
3429 
3430   case TemplateArgument::Template: {
3431     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3432     if (QualifierLoc) {
3433       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3434       if (!QualifierLoc)
3435         return true;
3436     }
3437 
3438     CXXScopeSpec SS;
3439     SS.Adopt(QualifierLoc);
3440     TemplateName Template
3441       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3442                                            Input.getTemplateNameLoc());
3443     if (Template.isNull())
3444       return true;
3445 
3446     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3447                                  Input.getTemplateNameLoc());
3448     return false;
3449   }
3450 
3451   case TemplateArgument::TemplateExpansion:
3452     llvm_unreachable("Caller should expand pack expansions");
3453 
3454   case TemplateArgument::Expression: {
3455     // Template argument expressions are constant expressions.
3456     EnterExpressionEvaluationContext Unevaluated(getSema(),
3457                                                  Sema::ConstantEvaluated);
3458 
3459     Expr *InputExpr = Input.getSourceExpression();
3460     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3461 
3462     ExprResult E = getDerived().TransformExpr(InputExpr);
3463     E = SemaRef.ActOnConstantExpression(E);
3464     if (E.isInvalid()) return true;
3465     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3466     return false;
3467   }
3468   }
3469 
3470   // Work around bogus GCC warning
3471   return true;
3472 }
3473 
3474 /// \brief Iterator adaptor that invents template argument location information
3475 /// for each of the template arguments in its underlying iterator.
3476 template<typename Derived, typename InputIterator>
3477 class TemplateArgumentLocInventIterator {
3478   TreeTransform<Derived> &Self;
3479   InputIterator Iter;
3480 
3481 public:
3482   typedef TemplateArgumentLoc value_type;
3483   typedef TemplateArgumentLoc reference;
3484   typedef typename std::iterator_traits<InputIterator>::difference_type
3485     difference_type;
3486   typedef std::input_iterator_tag iterator_category;
3487 
3488   class pointer {
3489     TemplateArgumentLoc Arg;
3490 
3491   public:
3492     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3493 
3494     const TemplateArgumentLoc *operator->() const { return &Arg; }
3495   };
3496 
3497   TemplateArgumentLocInventIterator() { }
3498 
3499   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3500                                              InputIterator Iter)
3501     : Self(Self), Iter(Iter) { }
3502 
3503   TemplateArgumentLocInventIterator &operator++() {
3504     ++Iter;
3505     return *this;
3506   }
3507 
3508   TemplateArgumentLocInventIterator operator++(int) {
3509     TemplateArgumentLocInventIterator Old(*this);
3510     ++(*this);
3511     return Old;
3512   }
3513 
3514   reference operator*() const {
3515     TemplateArgumentLoc Result;
3516     Self.InventTemplateArgumentLoc(*Iter, Result);
3517     return Result;
3518   }
3519 
3520   pointer operator->() const { return pointer(**this); }
3521 
3522   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3523                          const TemplateArgumentLocInventIterator &Y) {
3524     return X.Iter == Y.Iter;
3525   }
3526 
3527   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3528                          const TemplateArgumentLocInventIterator &Y) {
3529     return X.Iter != Y.Iter;
3530   }
3531 };
3532 
3533 template<typename Derived>
3534 template<typename InputIterator>
3535 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
3536                                                         InputIterator Last,
3537                                             TemplateArgumentListInfo &Outputs) {
3538   for (; First != Last; ++First) {
3539     TemplateArgumentLoc Out;
3540     TemplateArgumentLoc In = *First;
3541 
3542     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3543       // Unpack argument packs, which we translate them into separate
3544       // arguments.
3545       // FIXME: We could do much better if we could guarantee that the
3546       // TemplateArgumentLocInfo for the pack expansion would be usable for
3547       // all of the template arguments in the argument pack.
3548       typedef TemplateArgumentLocInventIterator<Derived,
3549                                                 TemplateArgument::pack_iterator>
3550         PackLocIterator;
3551       if (TransformTemplateArguments(PackLocIterator(*this,
3552                                                  In.getArgument().pack_begin()),
3553                                      PackLocIterator(*this,
3554                                                    In.getArgument().pack_end()),
3555                                      Outputs))
3556         return true;
3557 
3558       continue;
3559     }
3560 
3561     if (In.getArgument().isPackExpansion()) {
3562       // We have a pack expansion, for which we will be substituting into
3563       // the pattern.
3564       SourceLocation Ellipsis;
3565       Optional<unsigned> OrigNumExpansions;
3566       TemplateArgumentLoc Pattern
3567         = getSema().getTemplateArgumentPackExpansionPattern(
3568               In, Ellipsis, OrigNumExpansions);
3569 
3570       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3571       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3572       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3573 
3574       // Determine whether the set of unexpanded parameter packs can and should
3575       // be expanded.
3576       bool Expand = true;
3577       bool RetainExpansion = false;
3578       Optional<unsigned> NumExpansions = OrigNumExpansions;
3579       if (getDerived().TryExpandParameterPacks(Ellipsis,
3580                                                Pattern.getSourceRange(),
3581                                                Unexpanded,
3582                                                Expand,
3583                                                RetainExpansion,
3584                                                NumExpansions))
3585         return true;
3586 
3587       if (!Expand) {
3588         // The transform has determined that we should perform a simple
3589         // transformation on the pack expansion, producing another pack
3590         // expansion.
3591         TemplateArgumentLoc OutPattern;
3592         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3593         if (getDerived().TransformTemplateArgument(Pattern, OutPattern))
3594           return true;
3595 
3596         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
3597                                                 NumExpansions);
3598         if (Out.getArgument().isNull())
3599           return true;
3600 
3601         Outputs.addArgument(Out);
3602         continue;
3603       }
3604 
3605       // The transform has determined that we should perform an elementwise
3606       // expansion of the pattern. Do so.
3607       for (unsigned I = 0; I != *NumExpansions; ++I) {
3608         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3609 
3610         if (getDerived().TransformTemplateArgument(Pattern, Out))
3611           return true;
3612 
3613         if (Out.getArgument().containsUnexpandedParameterPack()) {
3614           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3615                                                   OrigNumExpansions);
3616           if (Out.getArgument().isNull())
3617             return true;
3618         }
3619 
3620         Outputs.addArgument(Out);
3621       }
3622 
3623       // If we're supposed to retain a pack expansion, do so by temporarily
3624       // forgetting the partially-substituted parameter pack.
3625       if (RetainExpansion) {
3626         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3627 
3628         if (getDerived().TransformTemplateArgument(Pattern, Out))
3629           return true;
3630 
3631         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
3632                                                 OrigNumExpansions);
3633         if (Out.getArgument().isNull())
3634           return true;
3635 
3636         Outputs.addArgument(Out);
3637       }
3638 
3639       continue;
3640     }
3641 
3642     // The simple case:
3643     if (getDerived().TransformTemplateArgument(In, Out))
3644       return true;
3645 
3646     Outputs.addArgument(Out);
3647   }
3648 
3649   return false;
3650 
3651 }
3652 
3653 //===----------------------------------------------------------------------===//
3654 // Type transformation
3655 //===----------------------------------------------------------------------===//
3656 
3657 template<typename Derived>
3658 QualType TreeTransform<Derived>::TransformType(QualType T) {
3659   if (getDerived().AlreadyTransformed(T))
3660     return T;
3661 
3662   // Temporary workaround.  All of these transformations should
3663   // eventually turn into transformations on TypeLocs.
3664   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
3665                                                 getDerived().getBaseLocation());
3666 
3667   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
3668 
3669   if (!NewDI)
3670     return QualType();
3671 
3672   return NewDI->getType();
3673 }
3674 
3675 template<typename Derived>
3676 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
3677   // Refine the base location to the type's location.
3678   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
3679                        getDerived().getBaseEntity());
3680   if (getDerived().AlreadyTransformed(DI->getType()))
3681     return DI;
3682 
3683   TypeLocBuilder TLB;
3684 
3685   TypeLoc TL = DI->getTypeLoc();
3686   TLB.reserve(TL.getFullDataSize());
3687 
3688   QualType Result = getDerived().TransformType(TLB, TL);
3689   if (Result.isNull())
3690     return nullptr;
3691 
3692   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3693 }
3694 
3695 template<typename Derived>
3696 QualType
3697 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
3698   switch (T.getTypeLocClass()) {
3699 #define ABSTRACT_TYPELOC(CLASS, PARENT)
3700 #define TYPELOC(CLASS, PARENT)                                                 \
3701   case TypeLoc::CLASS:                                                         \
3702     return getDerived().Transform##CLASS##Type(TLB,                            \
3703                                                T.castAs<CLASS##TypeLoc>());
3704 #include "clang/AST/TypeLocNodes.def"
3705   }
3706 
3707   llvm_unreachable("unhandled type loc!");
3708 }
3709 
3710 /// FIXME: By default, this routine adds type qualifiers only to types
3711 /// that can have qualifiers, and silently suppresses those qualifiers
3712 /// that are not permitted (e.g., qualifiers on reference or function
3713 /// types). This is the right thing for template instantiation, but
3714 /// probably not for other clients.
3715 template<typename Derived>
3716 QualType
3717 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
3718                                                QualifiedTypeLoc T) {
3719   Qualifiers Quals = T.getType().getLocalQualifiers();
3720 
3721   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
3722   if (Result.isNull())
3723     return QualType();
3724 
3725   // Silently suppress qualifiers if the result type can't be qualified.
3726   // FIXME: this is the right thing for template instantiation, but
3727   // probably not for other clients.
3728   if (Result->isFunctionType() || Result->isReferenceType())
3729     return Result;
3730 
3731   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
3732   // resulting type.
3733   if (Quals.hasObjCLifetime()) {
3734     if (!Result->isObjCLifetimeType() && !Result->isDependentType())
3735       Quals.removeObjCLifetime();
3736     else if (Result.getObjCLifetime()) {
3737       // Objective-C ARC:
3738       //   A lifetime qualifier applied to a substituted template parameter
3739       //   overrides the lifetime qualifier from the template argument.
3740       const AutoType *AutoTy;
3741       if (const SubstTemplateTypeParmType *SubstTypeParam
3742                                 = dyn_cast<SubstTemplateTypeParmType>(Result)) {
3743         QualType Replacement = SubstTypeParam->getReplacementType();
3744         Qualifiers Qs = Replacement.getQualifiers();
3745         Qs.removeObjCLifetime();
3746         Replacement
3747           = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(),
3748                                              Qs);
3749         Result = SemaRef.Context.getSubstTemplateTypeParmType(
3750                                         SubstTypeParam->getReplacedParameter(),
3751                                                               Replacement);
3752         TLB.TypeWasModifiedSafely(Result);
3753       } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) {
3754         // 'auto' types behave the same way as template parameters.
3755         QualType Deduced = AutoTy->getDeducedType();
3756         Qualifiers Qs = Deduced.getQualifiers();
3757         Qs.removeObjCLifetime();
3758         Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(),
3759                                                    Qs);
3760         Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto(),
3761                                 AutoTy->isDependentType());
3762         TLB.TypeWasModifiedSafely(Result);
3763       } else {
3764         // Otherwise, complain about the addition of a qualifier to an
3765         // already-qualified type.
3766         SourceRange R = T.getUnqualifiedLoc().getSourceRange();
3767         SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant)
3768           << Result << R;
3769 
3770         Quals.removeObjCLifetime();
3771       }
3772     }
3773   }
3774   if (!Quals.empty()) {
3775     Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals);
3776     // BuildQualifiedType might not add qualifiers if they are invalid.
3777     if (Result.hasLocalQualifiers())
3778       TLB.push<QualifiedTypeLoc>(Result);
3779     // No location information to preserve.
3780   }
3781 
3782   return Result;
3783 }
3784 
3785 template<typename Derived>
3786 TypeLoc
3787 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
3788                                                    QualType ObjectType,
3789                                                    NamedDecl *UnqualLookup,
3790                                                    CXXScopeSpec &SS) {
3791   if (getDerived().AlreadyTransformed(TL.getType()))
3792     return TL;
3793 
3794   TypeSourceInfo *TSI =
3795       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
3796   if (TSI)
3797     return TSI->getTypeLoc();
3798   return TypeLoc();
3799 }
3800 
3801 template<typename Derived>
3802 TypeSourceInfo *
3803 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3804                                                    QualType ObjectType,
3805                                                    NamedDecl *UnqualLookup,
3806                                                    CXXScopeSpec &SS) {
3807   if (getDerived().AlreadyTransformed(TSInfo->getType()))
3808     return TSInfo;
3809 
3810   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
3811                                    UnqualLookup, SS);
3812 }
3813 
3814 template <typename Derived>
3815 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
3816     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
3817     CXXScopeSpec &SS) {
3818   QualType T = TL.getType();
3819   assert(!getDerived().AlreadyTransformed(T));
3820 
3821   TypeLocBuilder TLB;
3822   QualType Result;
3823 
3824   if (isa<TemplateSpecializationType>(T)) {
3825     TemplateSpecializationTypeLoc SpecTL =
3826         TL.castAs<TemplateSpecializationTypeLoc>();
3827 
3828     TemplateName Template
3829     = getDerived().TransformTemplateName(SS,
3830                                          SpecTL.getTypePtr()->getTemplateName(),
3831                                          SpecTL.getTemplateNameLoc(),
3832                                          ObjectType, UnqualLookup);
3833     if (Template.isNull())
3834       return nullptr;
3835 
3836     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
3837                                                               Template);
3838   } else if (isa<DependentTemplateSpecializationType>(T)) {
3839     DependentTemplateSpecializationTypeLoc SpecTL =
3840         TL.castAs<DependentTemplateSpecializationTypeLoc>();
3841 
3842     TemplateName Template
3843       = getDerived().RebuildTemplateName(SS,
3844                                          *SpecTL.getTypePtr()->getIdentifier(),
3845                                          SpecTL.getTemplateNameLoc(),
3846                                          ObjectType, UnqualLookup);
3847     if (Template.isNull())
3848       return nullptr;
3849 
3850     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
3851                                                                        SpecTL,
3852                                                                        Template,
3853                                                                        SS);
3854   } else {
3855     // Nothing special needs to be done for these.
3856     Result = getDerived().TransformType(TLB, TL);
3857   }
3858 
3859   if (Result.isNull())
3860     return nullptr;
3861 
3862   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
3863 }
3864 
3865 template <class TyLoc> static inline
3866 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
3867   TyLoc NewT = TLB.push<TyLoc>(T.getType());
3868   NewT.setNameLoc(T.getNameLoc());
3869   return T.getType();
3870 }
3871 
3872 template<typename Derived>
3873 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
3874                                                       BuiltinTypeLoc T) {
3875   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
3876   NewT.setBuiltinLoc(T.getBuiltinLoc());
3877   if (T.needsExtraLocalData())
3878     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
3879   return T.getType();
3880 }
3881 
3882 template<typename Derived>
3883 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
3884                                                       ComplexTypeLoc T) {
3885   // FIXME: recurse?
3886   return TransformTypeSpecType(TLB, T);
3887 }
3888 
3889 template <typename Derived>
3890 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
3891                                                        AdjustedTypeLoc TL) {
3892   // Adjustments applied during transformation are handled elsewhere.
3893   return getDerived().TransformType(TLB, TL.getOriginalLoc());
3894 }
3895 
3896 template<typename Derived>
3897 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
3898                                                       DecayedTypeLoc TL) {
3899   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
3900   if (OriginalType.isNull())
3901     return QualType();
3902 
3903   QualType Result = TL.getType();
3904   if (getDerived().AlwaysRebuild() ||
3905       OriginalType != TL.getOriginalLoc().getType())
3906     Result = SemaRef.Context.getDecayedType(OriginalType);
3907   TLB.push<DecayedTypeLoc>(Result);
3908   // Nothing to set for DecayedTypeLoc.
3909   return Result;
3910 }
3911 
3912 template<typename Derived>
3913 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
3914                                                       PointerTypeLoc TL) {
3915   QualType PointeeType
3916     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3917   if (PointeeType.isNull())
3918     return QualType();
3919 
3920   QualType Result = TL.getType();
3921   if (PointeeType->getAs<ObjCObjectType>()) {
3922     // A dependent pointer type 'T *' has is being transformed such
3923     // that an Objective-C class type is being replaced for 'T'. The
3924     // resulting pointer type is an ObjCObjectPointerType, not a
3925     // PointerType.
3926     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
3927 
3928     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
3929     NewT.setStarLoc(TL.getStarLoc());
3930     return Result;
3931   }
3932 
3933   if (getDerived().AlwaysRebuild() ||
3934       PointeeType != TL.getPointeeLoc().getType()) {
3935     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
3936     if (Result.isNull())
3937       return QualType();
3938   }
3939 
3940   // Objective-C ARC can add lifetime qualifiers to the type that we're
3941   // pointing to.
3942   TLB.TypeWasModifiedSafely(Result->getPointeeType());
3943 
3944   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
3945   NewT.setSigilLoc(TL.getSigilLoc());
3946   return Result;
3947 }
3948 
3949 template<typename Derived>
3950 QualType
3951 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
3952                                                   BlockPointerTypeLoc TL) {
3953   QualType PointeeType
3954     = getDerived().TransformType(TLB, TL.getPointeeLoc());
3955   if (PointeeType.isNull())
3956     return QualType();
3957 
3958   QualType Result = TL.getType();
3959   if (getDerived().AlwaysRebuild() ||
3960       PointeeType != TL.getPointeeLoc().getType()) {
3961     Result = getDerived().RebuildBlockPointerType(PointeeType,
3962                                                   TL.getSigilLoc());
3963     if (Result.isNull())
3964       return QualType();
3965   }
3966 
3967   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
3968   NewT.setSigilLoc(TL.getSigilLoc());
3969   return Result;
3970 }
3971 
3972 /// Transforms a reference type.  Note that somewhat paradoxically we
3973 /// don't care whether the type itself is an l-value type or an r-value
3974 /// type;  we only care if the type was *written* as an l-value type
3975 /// or an r-value type.
3976 template<typename Derived>
3977 QualType
3978 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
3979                                                ReferenceTypeLoc TL) {
3980   const ReferenceType *T = TL.getTypePtr();
3981 
3982   // Note that this works with the pointee-as-written.
3983   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
3984   if (PointeeType.isNull())
3985     return QualType();
3986 
3987   QualType Result = TL.getType();
3988   if (getDerived().AlwaysRebuild() ||
3989       PointeeType != T->getPointeeTypeAsWritten()) {
3990     Result = getDerived().RebuildReferenceType(PointeeType,
3991                                                T->isSpelledAsLValue(),
3992                                                TL.getSigilLoc());
3993     if (Result.isNull())
3994       return QualType();
3995   }
3996 
3997   // Objective-C ARC can add lifetime qualifiers to the type that we're
3998   // referring to.
3999   TLB.TypeWasModifiedSafely(
4000                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4001 
4002   // r-value references can be rebuilt as l-value references.
4003   ReferenceTypeLoc NewTL;
4004   if (isa<LValueReferenceType>(Result))
4005     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4006   else
4007     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4008   NewTL.setSigilLoc(TL.getSigilLoc());
4009 
4010   return Result;
4011 }
4012 
4013 template<typename Derived>
4014 QualType
4015 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4016                                                  LValueReferenceTypeLoc TL) {
4017   return TransformReferenceType(TLB, TL);
4018 }
4019 
4020 template<typename Derived>
4021 QualType
4022 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4023                                                  RValueReferenceTypeLoc TL) {
4024   return TransformReferenceType(TLB, TL);
4025 }
4026 
4027 template<typename Derived>
4028 QualType
4029 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4030                                                    MemberPointerTypeLoc TL) {
4031   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4032   if (PointeeType.isNull())
4033     return QualType();
4034 
4035   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4036   TypeSourceInfo *NewClsTInfo = nullptr;
4037   if (OldClsTInfo) {
4038     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4039     if (!NewClsTInfo)
4040       return QualType();
4041   }
4042 
4043   const MemberPointerType *T = TL.getTypePtr();
4044   QualType OldClsType = QualType(T->getClass(), 0);
4045   QualType NewClsType;
4046   if (NewClsTInfo)
4047     NewClsType = NewClsTInfo->getType();
4048   else {
4049     NewClsType = getDerived().TransformType(OldClsType);
4050     if (NewClsType.isNull())
4051       return QualType();
4052   }
4053 
4054   QualType Result = TL.getType();
4055   if (getDerived().AlwaysRebuild() ||
4056       PointeeType != T->getPointeeType() ||
4057       NewClsType != OldClsType) {
4058     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4059                                                    TL.getStarLoc());
4060     if (Result.isNull())
4061       return QualType();
4062   }
4063 
4064   // If we had to adjust the pointee type when building a member pointer, make
4065   // sure to push TypeLoc info for it.
4066   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4067   if (MPT && PointeeType != MPT->getPointeeType()) {
4068     assert(isa<AdjustedType>(MPT->getPointeeType()));
4069     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4070   }
4071 
4072   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4073   NewTL.setSigilLoc(TL.getSigilLoc());
4074   NewTL.setClassTInfo(NewClsTInfo);
4075 
4076   return Result;
4077 }
4078 
4079 template<typename Derived>
4080 QualType
4081 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4082                                                    ConstantArrayTypeLoc TL) {
4083   const ConstantArrayType *T = TL.getTypePtr();
4084   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4085   if (ElementType.isNull())
4086     return QualType();
4087 
4088   QualType Result = TL.getType();
4089   if (getDerived().AlwaysRebuild() ||
4090       ElementType != T->getElementType()) {
4091     Result = getDerived().RebuildConstantArrayType(ElementType,
4092                                                    T->getSizeModifier(),
4093                                                    T->getSize(),
4094                                              T->getIndexTypeCVRQualifiers(),
4095                                                    TL.getBracketsRange());
4096     if (Result.isNull())
4097       return QualType();
4098   }
4099 
4100   // We might have either a ConstantArrayType or a VariableArrayType now:
4101   // a ConstantArrayType is allowed to have an element type which is a
4102   // VariableArrayType if the type is dependent.  Fortunately, all array
4103   // types have the same location layout.
4104   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4105   NewTL.setLBracketLoc(TL.getLBracketLoc());
4106   NewTL.setRBracketLoc(TL.getRBracketLoc());
4107 
4108   Expr *Size = TL.getSizeExpr();
4109   if (Size) {
4110     EnterExpressionEvaluationContext Unevaluated(SemaRef,
4111                                                  Sema::ConstantEvaluated);
4112     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4113     Size = SemaRef.ActOnConstantExpression(Size).get();
4114   }
4115   NewTL.setSizeExpr(Size);
4116 
4117   return Result;
4118 }
4119 
4120 template<typename Derived>
4121 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4122                                               TypeLocBuilder &TLB,
4123                                               IncompleteArrayTypeLoc TL) {
4124   const IncompleteArrayType *T = TL.getTypePtr();
4125   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4126   if (ElementType.isNull())
4127     return QualType();
4128 
4129   QualType Result = TL.getType();
4130   if (getDerived().AlwaysRebuild() ||
4131       ElementType != T->getElementType()) {
4132     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4133                                                      T->getSizeModifier(),
4134                                            T->getIndexTypeCVRQualifiers(),
4135                                                      TL.getBracketsRange());
4136     if (Result.isNull())
4137       return QualType();
4138   }
4139 
4140   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4141   NewTL.setLBracketLoc(TL.getLBracketLoc());
4142   NewTL.setRBracketLoc(TL.getRBracketLoc());
4143   NewTL.setSizeExpr(nullptr);
4144 
4145   return Result;
4146 }
4147 
4148 template<typename Derived>
4149 QualType
4150 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4151                                                    VariableArrayTypeLoc TL) {
4152   const VariableArrayType *T = TL.getTypePtr();
4153   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4154   if (ElementType.isNull())
4155     return QualType();
4156 
4157   ExprResult SizeResult
4158     = getDerived().TransformExpr(T->getSizeExpr());
4159   if (SizeResult.isInvalid())
4160     return QualType();
4161 
4162   Expr *Size = SizeResult.get();
4163 
4164   QualType Result = TL.getType();
4165   if (getDerived().AlwaysRebuild() ||
4166       ElementType != T->getElementType() ||
4167       Size != T->getSizeExpr()) {
4168     Result = getDerived().RebuildVariableArrayType(ElementType,
4169                                                    T->getSizeModifier(),
4170                                                    Size,
4171                                              T->getIndexTypeCVRQualifiers(),
4172                                                    TL.getBracketsRange());
4173     if (Result.isNull())
4174       return QualType();
4175   }
4176 
4177   // We might have constant size array now, but fortunately it has the same
4178   // location layout.
4179   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4180   NewTL.setLBracketLoc(TL.getLBracketLoc());
4181   NewTL.setRBracketLoc(TL.getRBracketLoc());
4182   NewTL.setSizeExpr(Size);
4183 
4184   return Result;
4185 }
4186 
4187 template<typename Derived>
4188 QualType
4189 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4190                                              DependentSizedArrayTypeLoc TL) {
4191   const DependentSizedArrayType *T = TL.getTypePtr();
4192   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4193   if (ElementType.isNull())
4194     return QualType();
4195 
4196   // Array bounds are constant expressions.
4197   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4198                                                Sema::ConstantEvaluated);
4199 
4200   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4201   Expr *origSize = TL.getSizeExpr();
4202   if (!origSize) origSize = T->getSizeExpr();
4203 
4204   ExprResult sizeResult
4205     = getDerived().TransformExpr(origSize);
4206   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4207   if (sizeResult.isInvalid())
4208     return QualType();
4209 
4210   Expr *size = sizeResult.get();
4211 
4212   QualType Result = TL.getType();
4213   if (getDerived().AlwaysRebuild() ||
4214       ElementType != T->getElementType() ||
4215       size != origSize) {
4216     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4217                                                          T->getSizeModifier(),
4218                                                          size,
4219                                                 T->getIndexTypeCVRQualifiers(),
4220                                                         TL.getBracketsRange());
4221     if (Result.isNull())
4222       return QualType();
4223   }
4224 
4225   // We might have any sort of array type now, but fortunately they
4226   // all have the same location layout.
4227   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4228   NewTL.setLBracketLoc(TL.getLBracketLoc());
4229   NewTL.setRBracketLoc(TL.getRBracketLoc());
4230   NewTL.setSizeExpr(size);
4231 
4232   return Result;
4233 }
4234 
4235 template<typename Derived>
4236 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4237                                       TypeLocBuilder &TLB,
4238                                       DependentSizedExtVectorTypeLoc TL) {
4239   const DependentSizedExtVectorType *T = TL.getTypePtr();
4240 
4241   // FIXME: ext vector locs should be nested
4242   QualType ElementType = getDerived().TransformType(T->getElementType());
4243   if (ElementType.isNull())
4244     return QualType();
4245 
4246   // Vector sizes are constant expressions.
4247   EnterExpressionEvaluationContext Unevaluated(SemaRef,
4248                                                Sema::ConstantEvaluated);
4249 
4250   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4251   Size = SemaRef.ActOnConstantExpression(Size);
4252   if (Size.isInvalid())
4253     return QualType();
4254 
4255   QualType Result = TL.getType();
4256   if (getDerived().AlwaysRebuild() ||
4257       ElementType != T->getElementType() ||
4258       Size.get() != T->getSizeExpr()) {
4259     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4260                                                              Size.get(),
4261                                                          T->getAttributeLoc());
4262     if (Result.isNull())
4263       return QualType();
4264   }
4265 
4266   // Result might be dependent or not.
4267   if (isa<DependentSizedExtVectorType>(Result)) {
4268     DependentSizedExtVectorTypeLoc NewTL
4269       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4270     NewTL.setNameLoc(TL.getNameLoc());
4271   } else {
4272     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4273     NewTL.setNameLoc(TL.getNameLoc());
4274   }
4275 
4276   return Result;
4277 }
4278 
4279 template<typename Derived>
4280 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4281                                                      VectorTypeLoc TL) {
4282   const VectorType *T = TL.getTypePtr();
4283   QualType ElementType = getDerived().TransformType(T->getElementType());
4284   if (ElementType.isNull())
4285     return QualType();
4286 
4287   QualType Result = TL.getType();
4288   if (getDerived().AlwaysRebuild() ||
4289       ElementType != T->getElementType()) {
4290     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4291                                             T->getVectorKind());
4292     if (Result.isNull())
4293       return QualType();
4294   }
4295 
4296   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4297   NewTL.setNameLoc(TL.getNameLoc());
4298 
4299   return Result;
4300 }
4301 
4302 template<typename Derived>
4303 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4304                                                         ExtVectorTypeLoc TL) {
4305   const VectorType *T = TL.getTypePtr();
4306   QualType ElementType = getDerived().TransformType(T->getElementType());
4307   if (ElementType.isNull())
4308     return QualType();
4309 
4310   QualType Result = TL.getType();
4311   if (getDerived().AlwaysRebuild() ||
4312       ElementType != T->getElementType()) {
4313     Result = getDerived().RebuildExtVectorType(ElementType,
4314                                                T->getNumElements(),
4315                                                /*FIXME*/ SourceLocation());
4316     if (Result.isNull())
4317       return QualType();
4318   }
4319 
4320   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4321   NewTL.setNameLoc(TL.getNameLoc());
4322 
4323   return Result;
4324 }
4325 
4326 template <typename Derived>
4327 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4328     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4329     bool ExpectParameterPack) {
4330   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4331   TypeSourceInfo *NewDI = nullptr;
4332 
4333   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4334     // If we're substituting into a pack expansion type and we know the
4335     // length we want to expand to, just substitute for the pattern.
4336     TypeLoc OldTL = OldDI->getTypeLoc();
4337     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4338 
4339     TypeLocBuilder TLB;
4340     TypeLoc NewTL = OldDI->getTypeLoc();
4341     TLB.reserve(NewTL.getFullDataSize());
4342 
4343     QualType Result = getDerived().TransformType(TLB,
4344                                                OldExpansionTL.getPatternLoc());
4345     if (Result.isNull())
4346       return nullptr;
4347 
4348     Result = RebuildPackExpansionType(Result,
4349                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4350                                       OldExpansionTL.getEllipsisLoc(),
4351                                       NumExpansions);
4352     if (Result.isNull())
4353       return nullptr;
4354 
4355     PackExpansionTypeLoc NewExpansionTL
4356       = TLB.push<PackExpansionTypeLoc>(Result);
4357     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4358     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4359   } else
4360     NewDI = getDerived().TransformType(OldDI);
4361   if (!NewDI)
4362     return nullptr;
4363 
4364   if (NewDI == OldDI && indexAdjustment == 0)
4365     return OldParm;
4366 
4367   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4368                                              OldParm->getDeclContext(),
4369                                              OldParm->getInnerLocStart(),
4370                                              OldParm->getLocation(),
4371                                              OldParm->getIdentifier(),
4372                                              NewDI->getType(),
4373                                              NewDI,
4374                                              OldParm->getStorageClass(),
4375                                              /* DefArg */ nullptr);
4376   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4377                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4378   return newParm;
4379 }
4380 
4381 template<typename Derived>
4382 bool TreeTransform<Derived>::
4383   TransformFunctionTypeParams(SourceLocation Loc,
4384                               ParmVarDecl **Params, unsigned NumParams,
4385                               const QualType *ParamTypes,
4386                               SmallVectorImpl<QualType> &OutParamTypes,
4387                               SmallVectorImpl<ParmVarDecl*> *PVars) {
4388   int indexAdjustment = 0;
4389 
4390   for (unsigned i = 0; i != NumParams; ++i) {
4391     if (ParmVarDecl *OldParm = Params[i]) {
4392       assert(OldParm->getFunctionScopeIndex() == i);
4393 
4394       Optional<unsigned> NumExpansions;
4395       ParmVarDecl *NewParm = nullptr;
4396       if (OldParm->isParameterPack()) {
4397         // We have a function parameter pack that may need to be expanded.
4398         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4399 
4400         // Find the parameter packs that could be expanded.
4401         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4402         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4403         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4404         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4405         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4406 
4407         // Determine whether we should expand the parameter packs.
4408         bool ShouldExpand = false;
4409         bool RetainExpansion = false;
4410         Optional<unsigned> OrigNumExpansions =
4411             ExpansionTL.getTypePtr()->getNumExpansions();
4412         NumExpansions = OrigNumExpansions;
4413         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4414                                                  Pattern.getSourceRange(),
4415                                                  Unexpanded,
4416                                                  ShouldExpand,
4417                                                  RetainExpansion,
4418                                                  NumExpansions)) {
4419           return true;
4420         }
4421 
4422         if (ShouldExpand) {
4423           // Expand the function parameter pack into multiple, separate
4424           // parameters.
4425           getDerived().ExpandingFunctionParameterPack(OldParm);
4426           for (unsigned I = 0; I != *NumExpansions; ++I) {
4427             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4428             ParmVarDecl *NewParm
4429               = getDerived().TransformFunctionTypeParam(OldParm,
4430                                                         indexAdjustment++,
4431                                                         OrigNumExpansions,
4432                                                 /*ExpectParameterPack=*/false);
4433             if (!NewParm)
4434               return true;
4435 
4436             OutParamTypes.push_back(NewParm->getType());
4437             if (PVars)
4438               PVars->push_back(NewParm);
4439           }
4440 
4441           // If we're supposed to retain a pack expansion, do so by temporarily
4442           // forgetting the partially-substituted parameter pack.
4443           if (RetainExpansion) {
4444             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4445             ParmVarDecl *NewParm
4446               = getDerived().TransformFunctionTypeParam(OldParm,
4447                                                         indexAdjustment++,
4448                                                         OrigNumExpansions,
4449                                                 /*ExpectParameterPack=*/false);
4450             if (!NewParm)
4451               return true;
4452 
4453             OutParamTypes.push_back(NewParm->getType());
4454             if (PVars)
4455               PVars->push_back(NewParm);
4456           }
4457 
4458           // The next parameter should have the same adjustment as the
4459           // last thing we pushed, but we post-incremented indexAdjustment
4460           // on every push.  Also, if we push nothing, the adjustment should
4461           // go down by one.
4462           indexAdjustment--;
4463 
4464           // We're done with the pack expansion.
4465           continue;
4466         }
4467 
4468         // We'll substitute the parameter now without expanding the pack
4469         // expansion.
4470         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4471         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
4472                                                           indexAdjustment,
4473                                                           NumExpansions,
4474                                                   /*ExpectParameterPack=*/true);
4475       } else {
4476         NewParm = getDerived().TransformFunctionTypeParam(
4477             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
4478       }
4479 
4480       if (!NewParm)
4481         return true;
4482 
4483       OutParamTypes.push_back(NewParm->getType());
4484       if (PVars)
4485         PVars->push_back(NewParm);
4486       continue;
4487     }
4488 
4489     // Deal with the possibility that we don't have a parameter
4490     // declaration for this parameter.
4491     QualType OldType = ParamTypes[i];
4492     bool IsPackExpansion = false;
4493     Optional<unsigned> NumExpansions;
4494     QualType NewType;
4495     if (const PackExpansionType *Expansion
4496                                        = dyn_cast<PackExpansionType>(OldType)) {
4497       // We have a function parameter pack that may need to be expanded.
4498       QualType Pattern = Expansion->getPattern();
4499       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4500       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4501 
4502       // Determine whether we should expand the parameter packs.
4503       bool ShouldExpand = false;
4504       bool RetainExpansion = false;
4505       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
4506                                                Unexpanded,
4507                                                ShouldExpand,
4508                                                RetainExpansion,
4509                                                NumExpansions)) {
4510         return true;
4511       }
4512 
4513       if (ShouldExpand) {
4514         // Expand the function parameter pack into multiple, separate
4515         // parameters.
4516         for (unsigned I = 0; I != *NumExpansions; ++I) {
4517           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4518           QualType NewType = getDerived().TransformType(Pattern);
4519           if (NewType.isNull())
4520             return true;
4521 
4522           OutParamTypes.push_back(NewType);
4523           if (PVars)
4524             PVars->push_back(nullptr);
4525         }
4526 
4527         // We're done with the pack expansion.
4528         continue;
4529       }
4530 
4531       // If we're supposed to retain a pack expansion, do so by temporarily
4532       // forgetting the partially-substituted parameter pack.
4533       if (RetainExpansion) {
4534         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4535         QualType NewType = getDerived().TransformType(Pattern);
4536         if (NewType.isNull())
4537           return true;
4538 
4539         OutParamTypes.push_back(NewType);
4540         if (PVars)
4541           PVars->push_back(nullptr);
4542       }
4543 
4544       // We'll substitute the parameter now without expanding the pack
4545       // expansion.
4546       OldType = Expansion->getPattern();
4547       IsPackExpansion = true;
4548       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4549       NewType = getDerived().TransformType(OldType);
4550     } else {
4551       NewType = getDerived().TransformType(OldType);
4552     }
4553 
4554     if (NewType.isNull())
4555       return true;
4556 
4557     if (IsPackExpansion)
4558       NewType = getSema().Context.getPackExpansionType(NewType,
4559                                                        NumExpansions);
4560 
4561     OutParamTypes.push_back(NewType);
4562     if (PVars)
4563       PVars->push_back(nullptr);
4564   }
4565 
4566 #ifndef NDEBUG
4567   if (PVars) {
4568     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
4569       if (ParmVarDecl *parm = (*PVars)[i])
4570         assert(parm->getFunctionScopeIndex() == i);
4571   }
4572 #endif
4573 
4574   return false;
4575 }
4576 
4577 template<typename Derived>
4578 QualType
4579 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
4580                                                    FunctionProtoTypeLoc TL) {
4581   SmallVector<QualType, 4> ExceptionStorage;
4582   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
4583   return getDerived().TransformFunctionProtoType(
4584       TLB, TL, nullptr, 0,
4585       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
4586         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
4587                                             ExceptionStorage, Changed);
4588       });
4589 }
4590 
4591 template<typename Derived> template<typename Fn>
4592 QualType TreeTransform<Derived>::TransformFunctionProtoType(
4593     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
4594     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
4595   // Transform the parameters and return type.
4596   //
4597   // We are required to instantiate the params and return type in source order.
4598   // When the function has a trailing return type, we instantiate the
4599   // parameters before the return type,  since the return type can then refer
4600   // to the parameters themselves (via decltype, sizeof, etc.).
4601   //
4602   SmallVector<QualType, 4> ParamTypes;
4603   SmallVector<ParmVarDecl*, 4> ParamDecls;
4604   const FunctionProtoType *T = TL.getTypePtr();
4605 
4606   QualType ResultType;
4607 
4608   if (T->hasTrailingReturn()) {
4609     if (getDerived().TransformFunctionTypeParams(
4610             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4611             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4612       return QualType();
4613 
4614     {
4615       // C++11 [expr.prim.general]p3:
4616       //   If a declaration declares a member function or member function
4617       //   template of a class X, the expression this is a prvalue of type
4618       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
4619       //   and the end of the function-definition, member-declarator, or
4620       //   declarator.
4621       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
4622 
4623       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4624       if (ResultType.isNull())
4625         return QualType();
4626     }
4627   }
4628   else {
4629     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4630     if (ResultType.isNull())
4631       return QualType();
4632 
4633     if (getDerived().TransformFunctionTypeParams(
4634             TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(),
4635             TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls))
4636       return QualType();
4637   }
4638 
4639   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
4640 
4641   bool EPIChanged = false;
4642   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
4643     return QualType();
4644 
4645   // FIXME: Need to transform ConsumedParameters for variadic template
4646   // expansion.
4647 
4648   QualType Result = TL.getType();
4649   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
4650       T->getNumParams() != ParamTypes.size() ||
4651       !std::equal(T->param_type_begin(), T->param_type_end(),
4652                   ParamTypes.begin()) || EPIChanged) {
4653     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
4654     if (Result.isNull())
4655       return QualType();
4656   }
4657 
4658   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
4659   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4660   NewTL.setLParenLoc(TL.getLParenLoc());
4661   NewTL.setRParenLoc(TL.getRParenLoc());
4662   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4663   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
4664     NewTL.setParam(i, ParamDecls[i]);
4665 
4666   return Result;
4667 }
4668 
4669 template<typename Derived>
4670 bool TreeTransform<Derived>::TransformExceptionSpec(
4671     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
4672     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
4673   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
4674 
4675   // Instantiate a dynamic noexcept expression, if any.
4676   if (ESI.Type == EST_ComputedNoexcept) {
4677     EnterExpressionEvaluationContext Unevaluated(getSema(),
4678                                                  Sema::ConstantEvaluated);
4679     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
4680     if (NoexceptExpr.isInvalid())
4681       return true;
4682 
4683     NoexceptExpr = getSema().CheckBooleanCondition(
4684         NoexceptExpr.get(), NoexceptExpr.get()->getLocStart());
4685     if (NoexceptExpr.isInvalid())
4686       return true;
4687 
4688     if (!NoexceptExpr.get()->isValueDependent()) {
4689       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
4690           NoexceptExpr.get(), nullptr,
4691           diag::err_noexcept_needs_constant_expression,
4692           /*AllowFold*/false);
4693       if (NoexceptExpr.isInvalid())
4694         return true;
4695     }
4696 
4697     if (ESI.NoexceptExpr != NoexceptExpr.get())
4698       Changed = true;
4699     ESI.NoexceptExpr = NoexceptExpr.get();
4700   }
4701 
4702   if (ESI.Type != EST_Dynamic)
4703     return false;
4704 
4705   // Instantiate a dynamic exception specification's type.
4706   for (QualType T : ESI.Exceptions) {
4707     if (const PackExpansionType *PackExpansion =
4708             T->getAs<PackExpansionType>()) {
4709       Changed = true;
4710 
4711       // We have a pack expansion. Instantiate it.
4712       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4713       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
4714                                               Unexpanded);
4715       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4716 
4717       // Determine whether the set of unexpanded parameter packs can and
4718       // should
4719       // be expanded.
4720       bool Expand = false;
4721       bool RetainExpansion = false;
4722       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
4723       // FIXME: Track the location of the ellipsis (and track source location
4724       // information for the types in the exception specification in general).
4725       if (getDerived().TryExpandParameterPacks(
4726               Loc, SourceRange(), Unexpanded, Expand,
4727               RetainExpansion, NumExpansions))
4728         return true;
4729 
4730       if (!Expand) {
4731         // We can't expand this pack expansion into separate arguments yet;
4732         // just substitute into the pattern and create a new pack expansion
4733         // type.
4734         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4735         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4736         if (U.isNull())
4737           return true;
4738 
4739         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
4740         Exceptions.push_back(U);
4741         continue;
4742       }
4743 
4744       // Substitute into the pack expansion pattern for each slice of the
4745       // pack.
4746       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
4747         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
4748 
4749         QualType U = getDerived().TransformType(PackExpansion->getPattern());
4750         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4751           return true;
4752 
4753         Exceptions.push_back(U);
4754       }
4755     } else {
4756       QualType U = getDerived().TransformType(T);
4757       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
4758         return true;
4759       if (T != U)
4760         Changed = true;
4761 
4762       Exceptions.push_back(U);
4763     }
4764   }
4765 
4766   ESI.Exceptions = Exceptions;
4767   return false;
4768 }
4769 
4770 template<typename Derived>
4771 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
4772                                                  TypeLocBuilder &TLB,
4773                                                  FunctionNoProtoTypeLoc TL) {
4774   const FunctionNoProtoType *T = TL.getTypePtr();
4775   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
4776   if (ResultType.isNull())
4777     return QualType();
4778 
4779   QualType Result = TL.getType();
4780   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
4781     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
4782 
4783   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
4784   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
4785   NewTL.setLParenLoc(TL.getLParenLoc());
4786   NewTL.setRParenLoc(TL.getRParenLoc());
4787   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
4788 
4789   return Result;
4790 }
4791 
4792 template<typename Derived> QualType
4793 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
4794                                                  UnresolvedUsingTypeLoc TL) {
4795   const UnresolvedUsingType *T = TL.getTypePtr();
4796   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
4797   if (!D)
4798     return QualType();
4799 
4800   QualType Result = TL.getType();
4801   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
4802     Result = getDerived().RebuildUnresolvedUsingType(D);
4803     if (Result.isNull())
4804       return QualType();
4805   }
4806 
4807   // We might get an arbitrary type spec type back.  We should at
4808   // least always get a type spec type, though.
4809   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
4810   NewTL.setNameLoc(TL.getNameLoc());
4811 
4812   return Result;
4813 }
4814 
4815 template<typename Derived>
4816 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
4817                                                       TypedefTypeLoc TL) {
4818   const TypedefType *T = TL.getTypePtr();
4819   TypedefNameDecl *Typedef
4820     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4821                                                                T->getDecl()));
4822   if (!Typedef)
4823     return QualType();
4824 
4825   QualType Result = TL.getType();
4826   if (getDerived().AlwaysRebuild() ||
4827       Typedef != T->getDecl()) {
4828     Result = getDerived().RebuildTypedefType(Typedef);
4829     if (Result.isNull())
4830       return QualType();
4831   }
4832 
4833   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
4834   NewTL.setNameLoc(TL.getNameLoc());
4835 
4836   return Result;
4837 }
4838 
4839 template<typename Derived>
4840 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
4841                                                       TypeOfExprTypeLoc TL) {
4842   // typeof expressions are not potentially evaluated contexts
4843   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4844                                                Sema::ReuseLambdaContextDecl);
4845 
4846   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
4847   if (E.isInvalid())
4848     return QualType();
4849 
4850   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
4851   if (E.isInvalid())
4852     return QualType();
4853 
4854   QualType Result = TL.getType();
4855   if (getDerived().AlwaysRebuild() ||
4856       E.get() != TL.getUnderlyingExpr()) {
4857     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
4858     if (Result.isNull())
4859       return QualType();
4860   }
4861   else E.get();
4862 
4863   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
4864   NewTL.setTypeofLoc(TL.getTypeofLoc());
4865   NewTL.setLParenLoc(TL.getLParenLoc());
4866   NewTL.setRParenLoc(TL.getRParenLoc());
4867 
4868   return Result;
4869 }
4870 
4871 template<typename Derived>
4872 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
4873                                                      TypeOfTypeLoc TL) {
4874   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
4875   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
4876   if (!New_Under_TI)
4877     return QualType();
4878 
4879   QualType Result = TL.getType();
4880   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
4881     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
4882     if (Result.isNull())
4883       return QualType();
4884   }
4885 
4886   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
4887   NewTL.setTypeofLoc(TL.getTypeofLoc());
4888   NewTL.setLParenLoc(TL.getLParenLoc());
4889   NewTL.setRParenLoc(TL.getRParenLoc());
4890   NewTL.setUnderlyingTInfo(New_Under_TI);
4891 
4892   return Result;
4893 }
4894 
4895 template<typename Derived>
4896 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
4897                                                        DecltypeTypeLoc TL) {
4898   const DecltypeType *T = TL.getTypePtr();
4899 
4900   // decltype expressions are not potentially evaluated contexts
4901   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
4902                                                nullptr, /*IsDecltype=*/ true);
4903 
4904   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
4905   if (E.isInvalid())
4906     return QualType();
4907 
4908   E = getSema().ActOnDecltypeExpression(E.get());
4909   if (E.isInvalid())
4910     return QualType();
4911 
4912   QualType Result = TL.getType();
4913   if (getDerived().AlwaysRebuild() ||
4914       E.get() != T->getUnderlyingExpr()) {
4915     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
4916     if (Result.isNull())
4917       return QualType();
4918   }
4919   else E.get();
4920 
4921   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
4922   NewTL.setNameLoc(TL.getNameLoc());
4923 
4924   return Result;
4925 }
4926 
4927 template<typename Derived>
4928 QualType TreeTransform<Derived>::TransformUnaryTransformType(
4929                                                             TypeLocBuilder &TLB,
4930                                                      UnaryTransformTypeLoc TL) {
4931   QualType Result = TL.getType();
4932   if (Result->isDependentType()) {
4933     const UnaryTransformType *T = TL.getTypePtr();
4934     QualType NewBase =
4935       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
4936     Result = getDerived().RebuildUnaryTransformType(NewBase,
4937                                                     T->getUTTKind(),
4938                                                     TL.getKWLoc());
4939     if (Result.isNull())
4940       return QualType();
4941   }
4942 
4943   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
4944   NewTL.setKWLoc(TL.getKWLoc());
4945   NewTL.setParensRange(TL.getParensRange());
4946   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
4947   return Result;
4948 }
4949 
4950 template<typename Derived>
4951 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
4952                                                    AutoTypeLoc TL) {
4953   const AutoType *T = TL.getTypePtr();
4954   QualType OldDeduced = T->getDeducedType();
4955   QualType NewDeduced;
4956   if (!OldDeduced.isNull()) {
4957     NewDeduced = getDerived().TransformType(OldDeduced);
4958     if (NewDeduced.isNull())
4959       return QualType();
4960   }
4961 
4962   QualType Result = TL.getType();
4963   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
4964       T->isDependentType()) {
4965     Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto());
4966     if (Result.isNull())
4967       return QualType();
4968   }
4969 
4970   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
4971   NewTL.setNameLoc(TL.getNameLoc());
4972 
4973   return Result;
4974 }
4975 
4976 template<typename Derived>
4977 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
4978                                                      RecordTypeLoc TL) {
4979   const RecordType *T = TL.getTypePtr();
4980   RecordDecl *Record
4981     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
4982                                                           T->getDecl()));
4983   if (!Record)
4984     return QualType();
4985 
4986   QualType Result = TL.getType();
4987   if (getDerived().AlwaysRebuild() ||
4988       Record != T->getDecl()) {
4989     Result = getDerived().RebuildRecordType(Record);
4990     if (Result.isNull())
4991       return QualType();
4992   }
4993 
4994   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
4995   NewTL.setNameLoc(TL.getNameLoc());
4996 
4997   return Result;
4998 }
4999 
5000 template<typename Derived>
5001 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5002                                                    EnumTypeLoc TL) {
5003   const EnumType *T = TL.getTypePtr();
5004   EnumDecl *Enum
5005     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5006                                                         T->getDecl()));
5007   if (!Enum)
5008     return QualType();
5009 
5010   QualType Result = TL.getType();
5011   if (getDerived().AlwaysRebuild() ||
5012       Enum != T->getDecl()) {
5013     Result = getDerived().RebuildEnumType(Enum);
5014     if (Result.isNull())
5015       return QualType();
5016   }
5017 
5018   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5019   NewTL.setNameLoc(TL.getNameLoc());
5020 
5021   return Result;
5022 }
5023 
5024 template<typename Derived>
5025 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5026                                          TypeLocBuilder &TLB,
5027                                          InjectedClassNameTypeLoc TL) {
5028   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5029                                        TL.getTypePtr()->getDecl());
5030   if (!D) return QualType();
5031 
5032   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5033   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5034   return T;
5035 }
5036 
5037 template<typename Derived>
5038 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5039                                                 TypeLocBuilder &TLB,
5040                                                 TemplateTypeParmTypeLoc TL) {
5041   return TransformTypeSpecType(TLB, TL);
5042 }
5043 
5044 template<typename Derived>
5045 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5046                                          TypeLocBuilder &TLB,
5047                                          SubstTemplateTypeParmTypeLoc TL) {
5048   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5049 
5050   // Substitute into the replacement type, which itself might involve something
5051   // that needs to be transformed. This only tends to occur with default
5052   // template arguments of template template parameters.
5053   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5054   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5055   if (Replacement.isNull())
5056     return QualType();
5057 
5058   // Always canonicalize the replacement type.
5059   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5060   QualType Result
5061     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5062                                                    Replacement);
5063 
5064   // Propagate type-source information.
5065   SubstTemplateTypeParmTypeLoc NewTL
5066     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5067   NewTL.setNameLoc(TL.getNameLoc());
5068   return Result;
5069 
5070 }
5071 
5072 template<typename Derived>
5073 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5074                                           TypeLocBuilder &TLB,
5075                                           SubstTemplateTypeParmPackTypeLoc TL) {
5076   return TransformTypeSpecType(TLB, TL);
5077 }
5078 
5079 template<typename Derived>
5080 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5081                                                         TypeLocBuilder &TLB,
5082                                            TemplateSpecializationTypeLoc TL) {
5083   const TemplateSpecializationType *T = TL.getTypePtr();
5084 
5085   // The nested-name-specifier never matters in a TemplateSpecializationType,
5086   // because we can't have a dependent nested-name-specifier anyway.
5087   CXXScopeSpec SS;
5088   TemplateName Template
5089     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5090                                          TL.getTemplateNameLoc());
5091   if (Template.isNull())
5092     return QualType();
5093 
5094   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5095 }
5096 
5097 template<typename Derived>
5098 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5099                                                      AtomicTypeLoc TL) {
5100   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5101   if (ValueType.isNull())
5102     return QualType();
5103 
5104   QualType Result = TL.getType();
5105   if (getDerived().AlwaysRebuild() ||
5106       ValueType != TL.getValueLoc().getType()) {
5107     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5108     if (Result.isNull())
5109       return QualType();
5110   }
5111 
5112   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5113   NewTL.setKWLoc(TL.getKWLoc());
5114   NewTL.setLParenLoc(TL.getLParenLoc());
5115   NewTL.setRParenLoc(TL.getRParenLoc());
5116 
5117   return Result;
5118 }
5119 
5120   /// \brief Simple iterator that traverses the template arguments in a
5121   /// container that provides a \c getArgLoc() member function.
5122   ///
5123   /// This iterator is intended to be used with the iterator form of
5124   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5125   template<typename ArgLocContainer>
5126   class TemplateArgumentLocContainerIterator {
5127     ArgLocContainer *Container;
5128     unsigned Index;
5129 
5130   public:
5131     typedef TemplateArgumentLoc value_type;
5132     typedef TemplateArgumentLoc reference;
5133     typedef int difference_type;
5134     typedef std::input_iterator_tag iterator_category;
5135 
5136     class pointer {
5137       TemplateArgumentLoc Arg;
5138 
5139     public:
5140       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5141 
5142       const TemplateArgumentLoc *operator->() const {
5143         return &Arg;
5144       }
5145     };
5146 
5147 
5148     TemplateArgumentLocContainerIterator() {}
5149 
5150     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5151                                  unsigned Index)
5152       : Container(&Container), Index(Index) { }
5153 
5154     TemplateArgumentLocContainerIterator &operator++() {
5155       ++Index;
5156       return *this;
5157     }
5158 
5159     TemplateArgumentLocContainerIterator operator++(int) {
5160       TemplateArgumentLocContainerIterator Old(*this);
5161       ++(*this);
5162       return Old;
5163     }
5164 
5165     TemplateArgumentLoc operator*() const {
5166       return Container->getArgLoc(Index);
5167     }
5168 
5169     pointer operator->() const {
5170       return pointer(Container->getArgLoc(Index));
5171     }
5172 
5173     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5174                            const TemplateArgumentLocContainerIterator &Y) {
5175       return X.Container == Y.Container && X.Index == Y.Index;
5176     }
5177 
5178     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5179                            const TemplateArgumentLocContainerIterator &Y) {
5180       return !(X == Y);
5181     }
5182   };
5183 
5184 
5185 template <typename Derived>
5186 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5187                                                         TypeLocBuilder &TLB,
5188                                            TemplateSpecializationTypeLoc TL,
5189                                                       TemplateName Template) {
5190   TemplateArgumentListInfo NewTemplateArgs;
5191   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5192   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5193   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5194     ArgIterator;
5195   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5196                                               ArgIterator(TL, TL.getNumArgs()),
5197                                               NewTemplateArgs))
5198     return QualType();
5199 
5200   // FIXME: maybe don't rebuild if all the template arguments are the same.
5201 
5202   QualType Result =
5203     getDerived().RebuildTemplateSpecializationType(Template,
5204                                                    TL.getTemplateNameLoc(),
5205                                                    NewTemplateArgs);
5206 
5207   if (!Result.isNull()) {
5208     // Specializations of template template parameters are represented as
5209     // TemplateSpecializationTypes, and substitution of type alias templates
5210     // within a dependent context can transform them into
5211     // DependentTemplateSpecializationTypes.
5212     if (isa<DependentTemplateSpecializationType>(Result)) {
5213       DependentTemplateSpecializationTypeLoc NewTL
5214         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5215       NewTL.setElaboratedKeywordLoc(SourceLocation());
5216       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5217       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5218       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5219       NewTL.setLAngleLoc(TL.getLAngleLoc());
5220       NewTL.setRAngleLoc(TL.getRAngleLoc());
5221       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5222         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5223       return Result;
5224     }
5225 
5226     TemplateSpecializationTypeLoc NewTL
5227       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5228     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5229     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5230     NewTL.setLAngleLoc(TL.getLAngleLoc());
5231     NewTL.setRAngleLoc(TL.getRAngleLoc());
5232     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5233       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5234   }
5235 
5236   return Result;
5237 }
5238 
5239 template <typename Derived>
5240 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5241                                      TypeLocBuilder &TLB,
5242                                      DependentTemplateSpecializationTypeLoc TL,
5243                                      TemplateName Template,
5244                                      CXXScopeSpec &SS) {
5245   TemplateArgumentListInfo NewTemplateArgs;
5246   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5247   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5248   typedef TemplateArgumentLocContainerIterator<
5249             DependentTemplateSpecializationTypeLoc> ArgIterator;
5250   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5251                                               ArgIterator(TL, TL.getNumArgs()),
5252                                               NewTemplateArgs))
5253     return QualType();
5254 
5255   // FIXME: maybe don't rebuild if all the template arguments are the same.
5256 
5257   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5258     QualType Result
5259       = getSema().Context.getDependentTemplateSpecializationType(
5260                                                 TL.getTypePtr()->getKeyword(),
5261                                                          DTN->getQualifier(),
5262                                                          DTN->getIdentifier(),
5263                                                                NewTemplateArgs);
5264 
5265     DependentTemplateSpecializationTypeLoc NewTL
5266       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5267     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5268     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5269     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5270     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5271     NewTL.setLAngleLoc(TL.getLAngleLoc());
5272     NewTL.setRAngleLoc(TL.getRAngleLoc());
5273     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5274       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5275     return Result;
5276   }
5277 
5278   QualType Result
5279     = getDerived().RebuildTemplateSpecializationType(Template,
5280                                                      TL.getTemplateNameLoc(),
5281                                                      NewTemplateArgs);
5282 
5283   if (!Result.isNull()) {
5284     /// FIXME: Wrap this in an elaborated-type-specifier?
5285     TemplateSpecializationTypeLoc NewTL
5286       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5287     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5288     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5289     NewTL.setLAngleLoc(TL.getLAngleLoc());
5290     NewTL.setRAngleLoc(TL.getRAngleLoc());
5291     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5292       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5293   }
5294 
5295   return Result;
5296 }
5297 
5298 template<typename Derived>
5299 QualType
5300 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5301                                                 ElaboratedTypeLoc TL) {
5302   const ElaboratedType *T = TL.getTypePtr();
5303 
5304   NestedNameSpecifierLoc QualifierLoc;
5305   // NOTE: the qualifier in an ElaboratedType is optional.
5306   if (TL.getQualifierLoc()) {
5307     QualifierLoc
5308       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5309     if (!QualifierLoc)
5310       return QualType();
5311   }
5312 
5313   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5314   if (NamedT.isNull())
5315     return QualType();
5316 
5317   // C++0x [dcl.type.elab]p2:
5318   //   If the identifier resolves to a typedef-name or the simple-template-id
5319   //   resolves to an alias template specialization, the
5320   //   elaborated-type-specifier is ill-formed.
5321   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5322     if (const TemplateSpecializationType *TST =
5323           NamedT->getAs<TemplateSpecializationType>()) {
5324       TemplateName Template = TST->getTemplateName();
5325       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5326               Template.getAsTemplateDecl())) {
5327         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5328                      diag::err_tag_reference_non_tag) << 4;
5329         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5330       }
5331     }
5332   }
5333 
5334   QualType Result = TL.getType();
5335   if (getDerived().AlwaysRebuild() ||
5336       QualifierLoc != TL.getQualifierLoc() ||
5337       NamedT != T->getNamedType()) {
5338     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5339                                                 T->getKeyword(),
5340                                                 QualifierLoc, NamedT);
5341     if (Result.isNull())
5342       return QualType();
5343   }
5344 
5345   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5346   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5347   NewTL.setQualifierLoc(QualifierLoc);
5348   return Result;
5349 }
5350 
5351 template<typename Derived>
5352 QualType TreeTransform<Derived>::TransformAttributedType(
5353                                                 TypeLocBuilder &TLB,
5354                                                 AttributedTypeLoc TL) {
5355   const AttributedType *oldType = TL.getTypePtr();
5356   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
5357   if (modifiedType.isNull())
5358     return QualType();
5359 
5360   QualType result = TL.getType();
5361 
5362   // FIXME: dependent operand expressions?
5363   if (getDerived().AlwaysRebuild() ||
5364       modifiedType != oldType->getModifiedType()) {
5365     // TODO: this is really lame; we should really be rebuilding the
5366     // equivalent type from first principles.
5367     QualType equivalentType
5368       = getDerived().TransformType(oldType->getEquivalentType());
5369     if (equivalentType.isNull())
5370       return QualType();
5371     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
5372                                                modifiedType,
5373                                                equivalentType);
5374   }
5375 
5376   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
5377   newTL.setAttrNameLoc(TL.getAttrNameLoc());
5378   if (TL.hasAttrOperand())
5379     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5380   if (TL.hasAttrExprOperand())
5381     newTL.setAttrExprOperand(TL.getAttrExprOperand());
5382   else if (TL.hasAttrEnumOperand())
5383     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
5384 
5385   return result;
5386 }
5387 
5388 template<typename Derived>
5389 QualType
5390 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
5391                                            ParenTypeLoc TL) {
5392   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
5393   if (Inner.isNull())
5394     return QualType();
5395 
5396   QualType Result = TL.getType();
5397   if (getDerived().AlwaysRebuild() ||
5398       Inner != TL.getInnerLoc().getType()) {
5399     Result = getDerived().RebuildParenType(Inner);
5400     if (Result.isNull())
5401       return QualType();
5402   }
5403 
5404   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
5405   NewTL.setLParenLoc(TL.getLParenLoc());
5406   NewTL.setRParenLoc(TL.getRParenLoc());
5407   return Result;
5408 }
5409 
5410 template<typename Derived>
5411 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB,
5412                                                       DependentNameTypeLoc TL) {
5413   const DependentNameType *T = TL.getTypePtr();
5414 
5415   NestedNameSpecifierLoc QualifierLoc
5416     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5417   if (!QualifierLoc)
5418     return QualType();
5419 
5420   QualType Result
5421     = getDerived().RebuildDependentNameType(T->getKeyword(),
5422                                             TL.getElaboratedKeywordLoc(),
5423                                             QualifierLoc,
5424                                             T->getIdentifier(),
5425                                             TL.getNameLoc());
5426   if (Result.isNull())
5427     return QualType();
5428 
5429   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
5430     QualType NamedT = ElabT->getNamedType();
5431     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
5432 
5433     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5434     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5435     NewTL.setQualifierLoc(QualifierLoc);
5436   } else {
5437     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
5438     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5439     NewTL.setQualifierLoc(QualifierLoc);
5440     NewTL.setNameLoc(TL.getNameLoc());
5441   }
5442   return Result;
5443 }
5444 
5445 template<typename Derived>
5446 QualType TreeTransform<Derived>::
5447           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5448                                  DependentTemplateSpecializationTypeLoc TL) {
5449   NestedNameSpecifierLoc QualifierLoc;
5450   if (TL.getQualifierLoc()) {
5451     QualifierLoc
5452       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5453     if (!QualifierLoc)
5454       return QualType();
5455   }
5456 
5457   return getDerived()
5458            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
5459 }
5460 
5461 template<typename Derived>
5462 QualType TreeTransform<Derived>::
5463 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
5464                                    DependentTemplateSpecializationTypeLoc TL,
5465                                        NestedNameSpecifierLoc QualifierLoc) {
5466   const DependentTemplateSpecializationType *T = TL.getTypePtr();
5467 
5468   TemplateArgumentListInfo NewTemplateArgs;
5469   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5470   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5471 
5472   typedef TemplateArgumentLocContainerIterator<
5473   DependentTemplateSpecializationTypeLoc> ArgIterator;
5474   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5475                                               ArgIterator(TL, TL.getNumArgs()),
5476                                               NewTemplateArgs))
5477     return QualType();
5478 
5479   QualType Result
5480     = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(),
5481                                                               QualifierLoc,
5482                                                             T->getIdentifier(),
5483                                                        TL.getTemplateNameLoc(),
5484                                                             NewTemplateArgs);
5485   if (Result.isNull())
5486     return QualType();
5487 
5488   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
5489     QualType NamedT = ElabT->getNamedType();
5490 
5491     // Copy information relevant to the template specialization.
5492     TemplateSpecializationTypeLoc NamedTL
5493       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
5494     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5495     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5496     NamedTL.setLAngleLoc(TL.getLAngleLoc());
5497     NamedTL.setRAngleLoc(TL.getRAngleLoc());
5498     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5499       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5500 
5501     // Copy information relevant to the elaborated type.
5502     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5503     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5504     NewTL.setQualifierLoc(QualifierLoc);
5505   } else if (isa<DependentTemplateSpecializationType>(Result)) {
5506     DependentTemplateSpecializationTypeLoc SpecTL
5507       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5508     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5509     SpecTL.setQualifierLoc(QualifierLoc);
5510     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5511     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5512     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5513     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5514     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5515       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5516   } else {
5517     TemplateSpecializationTypeLoc SpecTL
5518       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5519     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5520     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5521     SpecTL.setLAngleLoc(TL.getLAngleLoc());
5522     SpecTL.setRAngleLoc(TL.getRAngleLoc());
5523     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
5524       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
5525   }
5526   return Result;
5527 }
5528 
5529 template<typename Derived>
5530 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
5531                                                       PackExpansionTypeLoc TL) {
5532   QualType Pattern
5533     = getDerived().TransformType(TLB, TL.getPatternLoc());
5534   if (Pattern.isNull())
5535     return QualType();
5536 
5537   QualType Result = TL.getType();
5538   if (getDerived().AlwaysRebuild() ||
5539       Pattern != TL.getPatternLoc().getType()) {
5540     Result = getDerived().RebuildPackExpansionType(Pattern,
5541                                            TL.getPatternLoc().getSourceRange(),
5542                                                    TL.getEllipsisLoc(),
5543                                            TL.getTypePtr()->getNumExpansions());
5544     if (Result.isNull())
5545       return QualType();
5546   }
5547 
5548   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
5549   NewT.setEllipsisLoc(TL.getEllipsisLoc());
5550   return Result;
5551 }
5552 
5553 template<typename Derived>
5554 QualType
5555 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
5556                                                    ObjCInterfaceTypeLoc TL) {
5557   // ObjCInterfaceType is never dependent.
5558   TLB.pushFullCopy(TL);
5559   return TL.getType();
5560 }
5561 
5562 template<typename Derived>
5563 QualType
5564 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
5565                                                 ObjCObjectTypeLoc TL) {
5566   // ObjCObjectType is never dependent.
5567   TLB.pushFullCopy(TL);
5568   return TL.getType();
5569 }
5570 
5571 template<typename Derived>
5572 QualType
5573 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
5574                                                ObjCObjectPointerTypeLoc TL) {
5575   // ObjCObjectPointerType is never dependent.
5576   TLB.pushFullCopy(TL);
5577   return TL.getType();
5578 }
5579 
5580 //===----------------------------------------------------------------------===//
5581 // Statement transformation
5582 //===----------------------------------------------------------------------===//
5583 template<typename Derived>
5584 StmtResult
5585 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
5586   return S;
5587 }
5588 
5589 template<typename Derived>
5590 StmtResult
5591 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
5592   return getDerived().TransformCompoundStmt(S, false);
5593 }
5594 
5595 template<typename Derived>
5596 StmtResult
5597 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
5598                                               bool IsStmtExpr) {
5599   Sema::CompoundScopeRAII CompoundScope(getSema());
5600 
5601   bool SubStmtInvalid = false;
5602   bool SubStmtChanged = false;
5603   SmallVector<Stmt*, 8> Statements;
5604   for (auto *B : S->body()) {
5605     StmtResult Result = getDerived().TransformStmt(B);
5606     if (Result.isInvalid()) {
5607       // Immediately fail if this was a DeclStmt, since it's very
5608       // likely that this will cause problems for future statements.
5609       if (isa<DeclStmt>(B))
5610         return StmtError();
5611 
5612       // Otherwise, just keep processing substatements and fail later.
5613       SubStmtInvalid = true;
5614       continue;
5615     }
5616 
5617     SubStmtChanged = SubStmtChanged || Result.get() != B;
5618     Statements.push_back(Result.getAs<Stmt>());
5619   }
5620 
5621   if (SubStmtInvalid)
5622     return StmtError();
5623 
5624   if (!getDerived().AlwaysRebuild() &&
5625       !SubStmtChanged)
5626     return S;
5627 
5628   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
5629                                           Statements,
5630                                           S->getRBracLoc(),
5631                                           IsStmtExpr);
5632 }
5633 
5634 template<typename Derived>
5635 StmtResult
5636 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
5637   ExprResult LHS, RHS;
5638   {
5639     EnterExpressionEvaluationContext Unevaluated(SemaRef,
5640                                                  Sema::ConstantEvaluated);
5641 
5642     // Transform the left-hand case value.
5643     LHS = getDerived().TransformExpr(S->getLHS());
5644     LHS = SemaRef.ActOnConstantExpression(LHS);
5645     if (LHS.isInvalid())
5646       return StmtError();
5647 
5648     // Transform the right-hand case value (for the GNU case-range extension).
5649     RHS = getDerived().TransformExpr(S->getRHS());
5650     RHS = SemaRef.ActOnConstantExpression(RHS);
5651     if (RHS.isInvalid())
5652       return StmtError();
5653   }
5654 
5655   // Build the case statement.
5656   // Case statements are always rebuilt so that they will attached to their
5657   // transformed switch statement.
5658   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
5659                                                        LHS.get(),
5660                                                        S->getEllipsisLoc(),
5661                                                        RHS.get(),
5662                                                        S->getColonLoc());
5663   if (Case.isInvalid())
5664     return StmtError();
5665 
5666   // Transform the statement following the case
5667   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5668   if (SubStmt.isInvalid())
5669     return StmtError();
5670 
5671   // Attach the body to the case statement
5672   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
5673 }
5674 
5675 template<typename Derived>
5676 StmtResult
5677 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
5678   // Transform the statement following the default case
5679   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5680   if (SubStmt.isInvalid())
5681     return StmtError();
5682 
5683   // Default statements are always rebuilt
5684   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
5685                                          SubStmt.get());
5686 }
5687 
5688 template<typename Derived>
5689 StmtResult
5690 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
5691   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5692   if (SubStmt.isInvalid())
5693     return StmtError();
5694 
5695   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
5696                                         S->getDecl());
5697   if (!LD)
5698     return StmtError();
5699 
5700 
5701   // FIXME: Pass the real colon location in.
5702   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
5703                                        cast<LabelDecl>(LD), SourceLocation(),
5704                                        SubStmt.get());
5705 }
5706 
5707 template <typename Derived>
5708 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
5709   if (!R)
5710     return R;
5711 
5712   switch (R->getKind()) {
5713 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
5714 #define ATTR(X)
5715 #define PRAGMA_SPELLING_ATTR(X)                                                \
5716   case attr::X:                                                                \
5717     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
5718 #include "clang/Basic/AttrList.inc"
5719   default:
5720     return R;
5721   }
5722 }
5723 
5724 template <typename Derived>
5725 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
5726   bool AttrsChanged = false;
5727   SmallVector<const Attr *, 1> Attrs;
5728 
5729   // Visit attributes and keep track if any are transformed.
5730   for (const auto *I : S->getAttrs()) {
5731     const Attr *R = getDerived().TransformAttr(I);
5732     AttrsChanged |= (I != R);
5733     Attrs.push_back(R);
5734   }
5735 
5736   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
5737   if (SubStmt.isInvalid())
5738     return StmtError();
5739 
5740   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
5741     return S;
5742 
5743   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
5744                                             SubStmt.get());
5745 }
5746 
5747 template<typename Derived>
5748 StmtResult
5749 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
5750   // Transform the condition
5751   ExprResult Cond;
5752   VarDecl *ConditionVar = nullptr;
5753   if (S->getConditionVariable()) {
5754     ConditionVar
5755       = cast_or_null<VarDecl>(
5756                    getDerived().TransformDefinition(
5757                                       S->getConditionVariable()->getLocation(),
5758                                                     S->getConditionVariable()));
5759     if (!ConditionVar)
5760       return StmtError();
5761   } else {
5762     Cond = getDerived().TransformExpr(S->getCond());
5763 
5764     if (Cond.isInvalid())
5765       return StmtError();
5766 
5767     // Convert the condition to a boolean value.
5768     if (S->getCond()) {
5769       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(),
5770                                                          Cond.get());
5771       if (CondE.isInvalid())
5772         return StmtError();
5773 
5774       Cond = CondE.get();
5775     }
5776   }
5777 
5778   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5779   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5780     return StmtError();
5781 
5782   // Transform the "then" branch.
5783   StmtResult Then = getDerived().TransformStmt(S->getThen());
5784   if (Then.isInvalid())
5785     return StmtError();
5786 
5787   // Transform the "else" branch.
5788   StmtResult Else = getDerived().TransformStmt(S->getElse());
5789   if (Else.isInvalid())
5790     return StmtError();
5791 
5792   if (!getDerived().AlwaysRebuild() &&
5793       FullCond.get() == S->getCond() &&
5794       ConditionVar == S->getConditionVariable() &&
5795       Then.get() == S->getThen() &&
5796       Else.get() == S->getElse())
5797     return S;
5798 
5799   return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar,
5800                                     Then.get(),
5801                                     S->getElseLoc(), Else.get());
5802 }
5803 
5804 template<typename Derived>
5805 StmtResult
5806 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
5807   // Transform the condition.
5808   ExprResult Cond;
5809   VarDecl *ConditionVar = nullptr;
5810   if (S->getConditionVariable()) {
5811     ConditionVar
5812       = cast_or_null<VarDecl>(
5813                    getDerived().TransformDefinition(
5814                                       S->getConditionVariable()->getLocation(),
5815                                                     S->getConditionVariable()));
5816     if (!ConditionVar)
5817       return StmtError();
5818   } else {
5819     Cond = getDerived().TransformExpr(S->getCond());
5820 
5821     if (Cond.isInvalid())
5822       return StmtError();
5823   }
5824 
5825   // Rebuild the switch statement.
5826   StmtResult Switch
5827     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(),
5828                                           ConditionVar);
5829   if (Switch.isInvalid())
5830     return StmtError();
5831 
5832   // Transform the body of the switch statement.
5833   StmtResult Body = getDerived().TransformStmt(S->getBody());
5834   if (Body.isInvalid())
5835     return StmtError();
5836 
5837   // Complete the switch statement.
5838   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
5839                                             Body.get());
5840 }
5841 
5842 template<typename Derived>
5843 StmtResult
5844 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
5845   // Transform the condition
5846   ExprResult Cond;
5847   VarDecl *ConditionVar = nullptr;
5848   if (S->getConditionVariable()) {
5849     ConditionVar
5850       = cast_or_null<VarDecl>(
5851                    getDerived().TransformDefinition(
5852                                       S->getConditionVariable()->getLocation(),
5853                                                     S->getConditionVariable()));
5854     if (!ConditionVar)
5855       return StmtError();
5856   } else {
5857     Cond = getDerived().TransformExpr(S->getCond());
5858 
5859     if (Cond.isInvalid())
5860       return StmtError();
5861 
5862     if (S->getCond()) {
5863       // Convert the condition to a boolean value.
5864       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5865                                                          S->getWhileLoc(),
5866                                                          Cond.get());
5867       if (CondE.isInvalid())
5868         return StmtError();
5869       Cond = CondE;
5870     }
5871   }
5872 
5873   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5874   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5875     return StmtError();
5876 
5877   // Transform the body
5878   StmtResult Body = getDerived().TransformStmt(S->getBody());
5879   if (Body.isInvalid())
5880     return StmtError();
5881 
5882   if (!getDerived().AlwaysRebuild() &&
5883       FullCond.get() == S->getCond() &&
5884       ConditionVar == S->getConditionVariable() &&
5885       Body.get() == S->getBody())
5886     return Owned(S);
5887 
5888   return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond,
5889                                        ConditionVar, Body.get());
5890 }
5891 
5892 template<typename Derived>
5893 StmtResult
5894 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
5895   // Transform the body
5896   StmtResult Body = getDerived().TransformStmt(S->getBody());
5897   if (Body.isInvalid())
5898     return StmtError();
5899 
5900   // Transform the condition
5901   ExprResult Cond = getDerived().TransformExpr(S->getCond());
5902   if (Cond.isInvalid())
5903     return StmtError();
5904 
5905   if (!getDerived().AlwaysRebuild() &&
5906       Cond.get() == S->getCond() &&
5907       Body.get() == S->getBody())
5908     return S;
5909 
5910   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
5911                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
5912                                     S->getRParenLoc());
5913 }
5914 
5915 template<typename Derived>
5916 StmtResult
5917 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
5918   // Transform the initialization statement
5919   StmtResult Init = getDerived().TransformStmt(S->getInit());
5920   if (Init.isInvalid())
5921     return StmtError();
5922 
5923   // Transform the condition
5924   ExprResult Cond;
5925   VarDecl *ConditionVar = nullptr;
5926   if (S->getConditionVariable()) {
5927     ConditionVar
5928       = cast_or_null<VarDecl>(
5929                    getDerived().TransformDefinition(
5930                                       S->getConditionVariable()->getLocation(),
5931                                                     S->getConditionVariable()));
5932     if (!ConditionVar)
5933       return StmtError();
5934   } else {
5935     Cond = getDerived().TransformExpr(S->getCond());
5936 
5937     if (Cond.isInvalid())
5938       return StmtError();
5939 
5940     if (S->getCond()) {
5941       // Convert the condition to a boolean value.
5942       ExprResult CondE = getSema().ActOnBooleanCondition(nullptr,
5943                                                          S->getForLoc(),
5944                                                          Cond.get());
5945       if (CondE.isInvalid())
5946         return StmtError();
5947 
5948       Cond = CondE.get();
5949     }
5950   }
5951 
5952   Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get()));
5953   if (!S->getConditionVariable() && S->getCond() && !FullCond.get())
5954     return StmtError();
5955 
5956   // Transform the increment
5957   ExprResult Inc = getDerived().TransformExpr(S->getInc());
5958   if (Inc.isInvalid())
5959     return StmtError();
5960 
5961   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
5962   if (S->getInc() && !FullInc.get())
5963     return StmtError();
5964 
5965   // Transform the body
5966   StmtResult Body = getDerived().TransformStmt(S->getBody());
5967   if (Body.isInvalid())
5968     return StmtError();
5969 
5970   if (!getDerived().AlwaysRebuild() &&
5971       Init.get() == S->getInit() &&
5972       FullCond.get() == S->getCond() &&
5973       Inc.get() == S->getInc() &&
5974       Body.get() == S->getBody())
5975     return S;
5976 
5977   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
5978                                      Init.get(), FullCond, ConditionVar,
5979                                      FullInc, S->getRParenLoc(), Body.get());
5980 }
5981 
5982 template<typename Derived>
5983 StmtResult
5984 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
5985   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
5986                                         S->getLabel());
5987   if (!LD)
5988     return StmtError();
5989 
5990   // Goto statements must always be rebuilt, to resolve the label.
5991   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
5992                                       cast<LabelDecl>(LD));
5993 }
5994 
5995 template<typename Derived>
5996 StmtResult
5997 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
5998   ExprResult Target = getDerived().TransformExpr(S->getTarget());
5999   if (Target.isInvalid())
6000     return StmtError();
6001   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6002 
6003   if (!getDerived().AlwaysRebuild() &&
6004       Target.get() == S->getTarget())
6005     return S;
6006 
6007   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6008                                               Target.get());
6009 }
6010 
6011 template<typename Derived>
6012 StmtResult
6013 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6014   return S;
6015 }
6016 
6017 template<typename Derived>
6018 StmtResult
6019 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6020   return S;
6021 }
6022 
6023 template<typename Derived>
6024 StmtResult
6025 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6026   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6027                                                         /*NotCopyInit*/false);
6028   if (Result.isInvalid())
6029     return StmtError();
6030 
6031   // FIXME: We always rebuild the return statement because there is no way
6032   // to tell whether the return type of the function has changed.
6033   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6034 }
6035 
6036 template<typename Derived>
6037 StmtResult
6038 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6039   bool DeclChanged = false;
6040   SmallVector<Decl *, 4> Decls;
6041   for (auto *D : S->decls()) {
6042     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6043     if (!Transformed)
6044       return StmtError();
6045 
6046     if (Transformed != D)
6047       DeclChanged = true;
6048 
6049     Decls.push_back(Transformed);
6050   }
6051 
6052   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6053     return S;
6054 
6055   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6056 }
6057 
6058 template<typename Derived>
6059 StmtResult
6060 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6061 
6062   SmallVector<Expr*, 8> Constraints;
6063   SmallVector<Expr*, 8> Exprs;
6064   SmallVector<IdentifierInfo *, 4> Names;
6065 
6066   ExprResult AsmString;
6067   SmallVector<Expr*, 8> Clobbers;
6068 
6069   bool ExprsChanged = false;
6070 
6071   // Go through the outputs.
6072   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6073     Names.push_back(S->getOutputIdentifier(I));
6074 
6075     // No need to transform the constraint literal.
6076     Constraints.push_back(S->getOutputConstraintLiteral(I));
6077 
6078     // Transform the output expr.
6079     Expr *OutputExpr = S->getOutputExpr(I);
6080     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6081     if (Result.isInvalid())
6082       return StmtError();
6083 
6084     ExprsChanged |= Result.get() != OutputExpr;
6085 
6086     Exprs.push_back(Result.get());
6087   }
6088 
6089   // Go through the inputs.
6090   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6091     Names.push_back(S->getInputIdentifier(I));
6092 
6093     // No need to transform the constraint literal.
6094     Constraints.push_back(S->getInputConstraintLiteral(I));
6095 
6096     // Transform the input expr.
6097     Expr *InputExpr = S->getInputExpr(I);
6098     ExprResult Result = getDerived().TransformExpr(InputExpr);
6099     if (Result.isInvalid())
6100       return StmtError();
6101 
6102     ExprsChanged |= Result.get() != InputExpr;
6103 
6104     Exprs.push_back(Result.get());
6105   }
6106 
6107   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6108     return S;
6109 
6110   // Go through the clobbers.
6111   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6112     Clobbers.push_back(S->getClobberStringLiteral(I));
6113 
6114   // No need to transform the asm string literal.
6115   AsmString = S->getAsmString();
6116   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6117                                         S->isVolatile(), S->getNumOutputs(),
6118                                         S->getNumInputs(), Names.data(),
6119                                         Constraints, Exprs, AsmString.get(),
6120                                         Clobbers, S->getRParenLoc());
6121 }
6122 
6123 template<typename Derived>
6124 StmtResult
6125 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6126   ArrayRef<Token> AsmToks =
6127     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6128 
6129   bool HadError = false, HadChange = false;
6130 
6131   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6132   SmallVector<Expr*, 8> TransformedExprs;
6133   TransformedExprs.reserve(SrcExprs.size());
6134   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6135     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6136     if (!Result.isUsable()) {
6137       HadError = true;
6138     } else {
6139       HadChange |= (Result.get() != SrcExprs[i]);
6140       TransformedExprs.push_back(Result.get());
6141     }
6142   }
6143 
6144   if (HadError) return StmtError();
6145   if (!HadChange && !getDerived().AlwaysRebuild())
6146     return Owned(S);
6147 
6148   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6149                                        AsmToks, S->getAsmString(),
6150                                        S->getNumOutputs(), S->getNumInputs(),
6151                                        S->getAllConstraints(), S->getClobbers(),
6152                                        TransformedExprs, S->getEndLoc());
6153 }
6154 
6155 template<typename Derived>
6156 StmtResult
6157 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
6158   // Transform the body of the @try.
6159   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
6160   if (TryBody.isInvalid())
6161     return StmtError();
6162 
6163   // Transform the @catch statements (if present).
6164   bool AnyCatchChanged = false;
6165   SmallVector<Stmt*, 8> CatchStmts;
6166   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
6167     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
6168     if (Catch.isInvalid())
6169       return StmtError();
6170     if (Catch.get() != S->getCatchStmt(I))
6171       AnyCatchChanged = true;
6172     CatchStmts.push_back(Catch.get());
6173   }
6174 
6175   // Transform the @finally statement (if present).
6176   StmtResult Finally;
6177   if (S->getFinallyStmt()) {
6178     Finally = getDerived().TransformStmt(S->getFinallyStmt());
6179     if (Finally.isInvalid())
6180       return StmtError();
6181   }
6182 
6183   // If nothing changed, just retain this statement.
6184   if (!getDerived().AlwaysRebuild() &&
6185       TryBody.get() == S->getTryBody() &&
6186       !AnyCatchChanged &&
6187       Finally.get() == S->getFinallyStmt())
6188     return S;
6189 
6190   // Build a new statement.
6191   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
6192                                            CatchStmts, Finally.get());
6193 }
6194 
6195 template<typename Derived>
6196 StmtResult
6197 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
6198   // Transform the @catch parameter, if there is one.
6199   VarDecl *Var = nullptr;
6200   if (VarDecl *FromVar = S->getCatchParamDecl()) {
6201     TypeSourceInfo *TSInfo = nullptr;
6202     if (FromVar->getTypeSourceInfo()) {
6203       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
6204       if (!TSInfo)
6205         return StmtError();
6206     }
6207 
6208     QualType T;
6209     if (TSInfo)
6210       T = TSInfo->getType();
6211     else {
6212       T = getDerived().TransformType(FromVar->getType());
6213       if (T.isNull())
6214         return StmtError();
6215     }
6216 
6217     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
6218     if (!Var)
6219       return StmtError();
6220   }
6221 
6222   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
6223   if (Body.isInvalid())
6224     return StmtError();
6225 
6226   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
6227                                              S->getRParenLoc(),
6228                                              Var, Body.get());
6229 }
6230 
6231 template<typename Derived>
6232 StmtResult
6233 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
6234   // Transform the body.
6235   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
6236   if (Body.isInvalid())
6237     return StmtError();
6238 
6239   // If nothing changed, just retain this statement.
6240   if (!getDerived().AlwaysRebuild() &&
6241       Body.get() == S->getFinallyBody())
6242     return S;
6243 
6244   // Build a new statement.
6245   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
6246                                                Body.get());
6247 }
6248 
6249 template<typename Derived>
6250 StmtResult
6251 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
6252   ExprResult Operand;
6253   if (S->getThrowExpr()) {
6254     Operand = getDerived().TransformExpr(S->getThrowExpr());
6255     if (Operand.isInvalid())
6256       return StmtError();
6257   }
6258 
6259   if (!getDerived().AlwaysRebuild() &&
6260       Operand.get() == S->getThrowExpr())
6261     return S;
6262 
6263   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
6264 }
6265 
6266 template<typename Derived>
6267 StmtResult
6268 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
6269                                                   ObjCAtSynchronizedStmt *S) {
6270   // Transform the object we are locking.
6271   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
6272   if (Object.isInvalid())
6273     return StmtError();
6274   Object =
6275     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
6276                                                   Object.get());
6277   if (Object.isInvalid())
6278     return StmtError();
6279 
6280   // Transform the body.
6281   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
6282   if (Body.isInvalid())
6283     return StmtError();
6284 
6285   // If nothing change, just retain the current statement.
6286   if (!getDerived().AlwaysRebuild() &&
6287       Object.get() == S->getSynchExpr() &&
6288       Body.get() == S->getSynchBody())
6289     return S;
6290 
6291   // Build a new statement.
6292   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
6293                                                     Object.get(), Body.get());
6294 }
6295 
6296 template<typename Derived>
6297 StmtResult
6298 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
6299                                               ObjCAutoreleasePoolStmt *S) {
6300   // Transform the body.
6301   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
6302   if (Body.isInvalid())
6303     return StmtError();
6304 
6305   // If nothing changed, just retain this statement.
6306   if (!getDerived().AlwaysRebuild() &&
6307       Body.get() == S->getSubStmt())
6308     return S;
6309 
6310   // Build a new statement.
6311   return getDerived().RebuildObjCAutoreleasePoolStmt(
6312                         S->getAtLoc(), Body.get());
6313 }
6314 
6315 template<typename Derived>
6316 StmtResult
6317 TreeTransform<Derived>::TransformObjCForCollectionStmt(
6318                                                   ObjCForCollectionStmt *S) {
6319   // Transform the element statement.
6320   StmtResult Element = getDerived().TransformStmt(S->getElement());
6321   if (Element.isInvalid())
6322     return StmtError();
6323 
6324   // Transform the collection expression.
6325   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
6326   if (Collection.isInvalid())
6327     return StmtError();
6328 
6329   // Transform the body.
6330   StmtResult Body = getDerived().TransformStmt(S->getBody());
6331   if (Body.isInvalid())
6332     return StmtError();
6333 
6334   // If nothing changed, just retain this statement.
6335   if (!getDerived().AlwaysRebuild() &&
6336       Element.get() == S->getElement() &&
6337       Collection.get() == S->getCollection() &&
6338       Body.get() == S->getBody())
6339     return S;
6340 
6341   // Build a new statement.
6342   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
6343                                                    Element.get(),
6344                                                    Collection.get(),
6345                                                    S->getRParenLoc(),
6346                                                    Body.get());
6347 }
6348 
6349 template <typename Derived>
6350 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
6351   // Transform the exception declaration, if any.
6352   VarDecl *Var = nullptr;
6353   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
6354     TypeSourceInfo *T =
6355         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
6356     if (!T)
6357       return StmtError();
6358 
6359     Var = getDerived().RebuildExceptionDecl(
6360         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
6361         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
6362     if (!Var || Var->isInvalidDecl())
6363       return StmtError();
6364   }
6365 
6366   // Transform the actual exception handler.
6367   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
6368   if (Handler.isInvalid())
6369     return StmtError();
6370 
6371   if (!getDerived().AlwaysRebuild() && !Var &&
6372       Handler.get() == S->getHandlerBlock())
6373     return S;
6374 
6375   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
6376 }
6377 
6378 template <typename Derived>
6379 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
6380   // Transform the try block itself.
6381   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6382   if (TryBlock.isInvalid())
6383     return StmtError();
6384 
6385   // Transform the handlers.
6386   bool HandlerChanged = false;
6387   SmallVector<Stmt *, 8> Handlers;
6388   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
6389     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
6390     if (Handler.isInvalid())
6391       return StmtError();
6392 
6393     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
6394     Handlers.push_back(Handler.getAs<Stmt>());
6395   }
6396 
6397   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6398       !HandlerChanged)
6399     return S;
6400 
6401   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
6402                                         Handlers);
6403 }
6404 
6405 template<typename Derived>
6406 StmtResult
6407 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
6408   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
6409   if (Range.isInvalid())
6410     return StmtError();
6411 
6412   StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt());
6413   if (BeginEnd.isInvalid())
6414     return StmtError();
6415 
6416   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6417   if (Cond.isInvalid())
6418     return StmtError();
6419   if (Cond.get())
6420     Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc());
6421   if (Cond.isInvalid())
6422     return StmtError();
6423   if (Cond.get())
6424     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
6425 
6426   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6427   if (Inc.isInvalid())
6428     return StmtError();
6429   if (Inc.get())
6430     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
6431 
6432   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
6433   if (LoopVar.isInvalid())
6434     return StmtError();
6435 
6436   StmtResult NewStmt = S;
6437   if (getDerived().AlwaysRebuild() ||
6438       Range.get() != S->getRangeStmt() ||
6439       BeginEnd.get() != S->getBeginEndStmt() ||
6440       Cond.get() != S->getCond() ||
6441       Inc.get() != S->getInc() ||
6442       LoopVar.get() != S->getLoopVarStmt()) {
6443     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6444                                                   S->getColonLoc(), Range.get(),
6445                                                   BeginEnd.get(), Cond.get(),
6446                                                   Inc.get(), LoopVar.get(),
6447                                                   S->getRParenLoc());
6448     if (NewStmt.isInvalid())
6449       return StmtError();
6450   }
6451 
6452   StmtResult Body = getDerived().TransformStmt(S->getBody());
6453   if (Body.isInvalid())
6454     return StmtError();
6455 
6456   // Body has changed but we didn't rebuild the for-range statement. Rebuild
6457   // it now so we have a new statement to attach the body to.
6458   if (Body.get() != S->getBody() && NewStmt.get() == S) {
6459     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
6460                                                   S->getColonLoc(), Range.get(),
6461                                                   BeginEnd.get(), Cond.get(),
6462                                                   Inc.get(), LoopVar.get(),
6463                                                   S->getRParenLoc());
6464     if (NewStmt.isInvalid())
6465       return StmtError();
6466   }
6467 
6468   if (NewStmt.get() == S)
6469     return S;
6470 
6471   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
6472 }
6473 
6474 template<typename Derived>
6475 StmtResult
6476 TreeTransform<Derived>::TransformMSDependentExistsStmt(
6477                                                     MSDependentExistsStmt *S) {
6478   // Transform the nested-name-specifier, if any.
6479   NestedNameSpecifierLoc QualifierLoc;
6480   if (S->getQualifierLoc()) {
6481     QualifierLoc
6482       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
6483     if (!QualifierLoc)
6484       return StmtError();
6485   }
6486 
6487   // Transform the declaration name.
6488   DeclarationNameInfo NameInfo = S->getNameInfo();
6489   if (NameInfo.getName()) {
6490     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
6491     if (!NameInfo.getName())
6492       return StmtError();
6493   }
6494 
6495   // Check whether anything changed.
6496   if (!getDerived().AlwaysRebuild() &&
6497       QualifierLoc == S->getQualifierLoc() &&
6498       NameInfo.getName() == S->getNameInfo().getName())
6499     return S;
6500 
6501   // Determine whether this name exists, if we can.
6502   CXXScopeSpec SS;
6503   SS.Adopt(QualifierLoc);
6504   bool Dependent = false;
6505   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
6506   case Sema::IER_Exists:
6507     if (S->isIfExists())
6508       break;
6509 
6510     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6511 
6512   case Sema::IER_DoesNotExist:
6513     if (S->isIfNotExists())
6514       break;
6515 
6516     return new (getSema().Context) NullStmt(S->getKeywordLoc());
6517 
6518   case Sema::IER_Dependent:
6519     Dependent = true;
6520     break;
6521 
6522   case Sema::IER_Error:
6523     return StmtError();
6524   }
6525 
6526   // We need to continue with the instantiation, so do so now.
6527   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
6528   if (SubStmt.isInvalid())
6529     return StmtError();
6530 
6531   // If we have resolved the name, just transform to the substatement.
6532   if (!Dependent)
6533     return SubStmt;
6534 
6535   // The name is still dependent, so build a dependent expression again.
6536   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
6537                                                    S->isIfExists(),
6538                                                    QualifierLoc,
6539                                                    NameInfo,
6540                                                    SubStmt.get());
6541 }
6542 
6543 template<typename Derived>
6544 ExprResult
6545 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
6546   NestedNameSpecifierLoc QualifierLoc;
6547   if (E->getQualifierLoc()) {
6548     QualifierLoc
6549     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
6550     if (!QualifierLoc)
6551       return ExprError();
6552   }
6553 
6554   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
6555     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
6556   if (!PD)
6557     return ExprError();
6558 
6559   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
6560   if (Base.isInvalid())
6561     return ExprError();
6562 
6563   return new (SemaRef.getASTContext())
6564       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
6565                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
6566                         QualifierLoc, E->getMemberLoc());
6567 }
6568 
6569 template <typename Derived>
6570 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
6571   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
6572   if (TryBlock.isInvalid())
6573     return StmtError();
6574 
6575   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
6576   if (Handler.isInvalid())
6577     return StmtError();
6578 
6579   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
6580       Handler.get() == S->getHandler())
6581     return S;
6582 
6583   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
6584                                         TryBlock.get(), Handler.get());
6585 }
6586 
6587 template <typename Derived>
6588 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
6589   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6590   if (Block.isInvalid())
6591     return StmtError();
6592 
6593   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
6594 }
6595 
6596 template <typename Derived>
6597 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
6598   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
6599   if (FilterExpr.isInvalid())
6600     return StmtError();
6601 
6602   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
6603   if (Block.isInvalid())
6604     return StmtError();
6605 
6606   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
6607                                            Block.get());
6608 }
6609 
6610 template <typename Derived>
6611 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
6612   if (isa<SEHFinallyStmt>(Handler))
6613     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
6614   else
6615     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
6616 }
6617 
6618 template<typename Derived>
6619 StmtResult
6620 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
6621   return S;
6622 }
6623 
6624 //===----------------------------------------------------------------------===//
6625 // OpenMP directive transformation
6626 //===----------------------------------------------------------------------===//
6627 template <typename Derived>
6628 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
6629     OMPExecutableDirective *D) {
6630 
6631   // Transform the clauses
6632   llvm::SmallVector<OMPClause *, 16> TClauses;
6633   ArrayRef<OMPClause *> Clauses = D->clauses();
6634   TClauses.reserve(Clauses.size());
6635   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
6636        I != E; ++I) {
6637     if (*I) {
6638       OMPClause *Clause = getDerived().TransformOMPClause(*I);
6639       if (Clause)
6640         TClauses.push_back(Clause);
6641     } else {
6642       TClauses.push_back(nullptr);
6643     }
6644   }
6645   StmtResult AssociatedStmt;
6646   if (D->hasAssociatedStmt()) {
6647     if (!D->getAssociatedStmt()) {
6648       return StmtError();
6649     }
6650     AssociatedStmt = getDerived().TransformStmt(D->getAssociatedStmt());
6651     if (AssociatedStmt.isInvalid()) {
6652       return StmtError();
6653     }
6654   }
6655   if (TClauses.size() != Clauses.size()) {
6656     return StmtError();
6657   }
6658 
6659   // Transform directive name for 'omp critical' directive.
6660   DeclarationNameInfo DirName;
6661   if (D->getDirectiveKind() == OMPD_critical) {
6662     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
6663     DirName = getDerived().TransformDeclarationNameInfo(DirName);
6664   }
6665 
6666   return getDerived().RebuildOMPExecutableDirective(
6667       D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.get(),
6668       D->getLocStart(), D->getLocEnd());
6669 }
6670 
6671 template <typename Derived>
6672 StmtResult
6673 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
6674   DeclarationNameInfo DirName;
6675   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
6676                                              D->getLocStart());
6677   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6678   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6679   return Res;
6680 }
6681 
6682 template <typename Derived>
6683 StmtResult
6684 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
6685   DeclarationNameInfo DirName;
6686   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
6687                                              D->getLocStart());
6688   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6689   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6690   return Res;
6691 }
6692 
6693 template <typename Derived>
6694 StmtResult
6695 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
6696   DeclarationNameInfo DirName;
6697   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
6698                                              D->getLocStart());
6699   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6700   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6701   return Res;
6702 }
6703 
6704 template <typename Derived>
6705 StmtResult
6706 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
6707   DeclarationNameInfo DirName;
6708   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
6709                                              D->getLocStart());
6710   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6711   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6712   return Res;
6713 }
6714 
6715 template <typename Derived>
6716 StmtResult
6717 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
6718   DeclarationNameInfo DirName;
6719   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
6720                                              D->getLocStart());
6721   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6722   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6723   return Res;
6724 }
6725 
6726 template <typename Derived>
6727 StmtResult
6728 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
6729   DeclarationNameInfo DirName;
6730   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
6731                                              D->getLocStart());
6732   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6733   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6734   return Res;
6735 }
6736 
6737 template <typename Derived>
6738 StmtResult
6739 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
6740   DeclarationNameInfo DirName;
6741   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
6742                                              D->getLocStart());
6743   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6744   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6745   return Res;
6746 }
6747 
6748 template <typename Derived>
6749 StmtResult
6750 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
6751   DeclarationNameInfo DirName;
6752   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
6753                                              D->getLocStart());
6754   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6755   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6756   return Res;
6757 }
6758 
6759 template <typename Derived>
6760 StmtResult
6761 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
6762   getDerived().getSema().StartOpenMPDSABlock(
6763       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
6764   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6765   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6766   return Res;
6767 }
6768 
6769 template <typename Derived>
6770 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
6771     OMPParallelForDirective *D) {
6772   DeclarationNameInfo DirName;
6773   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
6774                                              nullptr, D->getLocStart());
6775   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6776   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6777   return Res;
6778 }
6779 
6780 template <typename Derived>
6781 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
6782     OMPParallelForSimdDirective *D) {
6783   DeclarationNameInfo DirName;
6784   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
6785                                              nullptr, D->getLocStart());
6786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6788   return Res;
6789 }
6790 
6791 template <typename Derived>
6792 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
6793     OMPParallelSectionsDirective *D) {
6794   DeclarationNameInfo DirName;
6795   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
6796                                              nullptr, D->getLocStart());
6797   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6798   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6799   return Res;
6800 }
6801 
6802 template <typename Derived>
6803 StmtResult
6804 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
6805   DeclarationNameInfo DirName;
6806   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
6807                                              D->getLocStart());
6808   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6809   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6810   return Res;
6811 }
6812 
6813 template <typename Derived>
6814 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
6815     OMPTaskyieldDirective *D) {
6816   DeclarationNameInfo DirName;
6817   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
6818                                              D->getLocStart());
6819   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6820   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6821   return Res;
6822 }
6823 
6824 template <typename Derived>
6825 StmtResult
6826 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
6827   DeclarationNameInfo DirName;
6828   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
6829                                              D->getLocStart());
6830   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6831   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6832   return Res;
6833 }
6834 
6835 template <typename Derived>
6836 StmtResult
6837 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
6838   DeclarationNameInfo DirName;
6839   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
6840                                              D->getLocStart());
6841   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6842   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6843   return Res;
6844 }
6845 
6846 template <typename Derived>
6847 StmtResult
6848 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
6849   DeclarationNameInfo DirName;
6850   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
6851                                              D->getLocStart());
6852   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6853   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6854   return Res;
6855 }
6856 
6857 template <typename Derived>
6858 StmtResult
6859 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
6860   DeclarationNameInfo DirName;
6861   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
6862                                              D->getLocStart());
6863   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6864   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6865   return Res;
6866 }
6867 
6868 template <typename Derived>
6869 StmtResult
6870 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
6871   DeclarationNameInfo DirName;
6872   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
6873                                              D->getLocStart());
6874   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6875   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6876   return Res;
6877 }
6878 
6879 template <typename Derived>
6880 StmtResult
6881 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
6882   DeclarationNameInfo DirName;
6883   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
6884                                              D->getLocStart());
6885   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6886   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6887   return Res;
6888 }
6889 
6890 template <typename Derived>
6891 StmtResult
6892 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
6893   DeclarationNameInfo DirName;
6894   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
6895                                              D->getLocStart());
6896   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
6897   getDerived().getSema().EndOpenMPDSABlock(Res.get());
6898   return Res;
6899 }
6900 
6901 //===----------------------------------------------------------------------===//
6902 // OpenMP clause transformation
6903 //===----------------------------------------------------------------------===//
6904 template <typename Derived>
6905 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
6906   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
6907   if (Cond.isInvalid())
6908     return nullptr;
6909   return getDerived().RebuildOMPIfClause(Cond.get(), C->getLocStart(),
6910                                          C->getLParenLoc(), C->getLocEnd());
6911 }
6912 
6913 template <typename Derived>
6914 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
6915   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
6916   if (Cond.isInvalid())
6917     return nullptr;
6918   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
6919                                             C->getLParenLoc(), C->getLocEnd());
6920 }
6921 
6922 template <typename Derived>
6923 OMPClause *
6924 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
6925   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
6926   if (NumThreads.isInvalid())
6927     return nullptr;
6928   return getDerived().RebuildOMPNumThreadsClause(
6929       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6930 }
6931 
6932 template <typename Derived>
6933 OMPClause *
6934 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
6935   ExprResult E = getDerived().TransformExpr(C->getSafelen());
6936   if (E.isInvalid())
6937     return nullptr;
6938   return getDerived().RebuildOMPSafelenClause(
6939       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6940 }
6941 
6942 template <typename Derived>
6943 OMPClause *
6944 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
6945   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
6946   if (E.isInvalid())
6947     return 0;
6948   return getDerived().RebuildOMPCollapseClause(
6949       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
6950 }
6951 
6952 template <typename Derived>
6953 OMPClause *
6954 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
6955   return getDerived().RebuildOMPDefaultClause(
6956       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
6957       C->getLParenLoc(), C->getLocEnd());
6958 }
6959 
6960 template <typename Derived>
6961 OMPClause *
6962 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
6963   return getDerived().RebuildOMPProcBindClause(
6964       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
6965       C->getLParenLoc(), C->getLocEnd());
6966 }
6967 
6968 template <typename Derived>
6969 OMPClause *
6970 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
6971   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
6972   if (E.isInvalid())
6973     return nullptr;
6974   return getDerived().RebuildOMPScheduleClause(
6975       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
6976       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
6977 }
6978 
6979 template <typename Derived>
6980 OMPClause *
6981 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
6982   // No need to rebuild this clause, no template-dependent parameters.
6983   return C;
6984 }
6985 
6986 template <typename Derived>
6987 OMPClause *
6988 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
6989   // No need to rebuild this clause, no template-dependent parameters.
6990   return C;
6991 }
6992 
6993 template <typename Derived>
6994 OMPClause *
6995 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
6996   // No need to rebuild this clause, no template-dependent parameters.
6997   return C;
6998 }
6999 
7000 template <typename Derived>
7001 OMPClause *
7002 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
7003   // No need to rebuild this clause, no template-dependent parameters.
7004   return C;
7005 }
7006 
7007 template <typename Derived>
7008 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
7009   // No need to rebuild this clause, no template-dependent parameters.
7010   return C;
7011 }
7012 
7013 template <typename Derived>
7014 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
7015   // No need to rebuild this clause, no template-dependent parameters.
7016   return C;
7017 }
7018 
7019 template <typename Derived>
7020 OMPClause *
7021 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
7022   // No need to rebuild this clause, no template-dependent parameters.
7023   return C;
7024 }
7025 
7026 template <typename Derived>
7027 OMPClause *
7028 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
7029   // No need to rebuild this clause, no template-dependent parameters.
7030   return C;
7031 }
7032 
7033 template <typename Derived>
7034 OMPClause *
7035 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
7036   // No need to rebuild this clause, no template-dependent parameters.
7037   return C;
7038 }
7039 
7040 template <typename Derived>
7041 OMPClause *
7042 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
7043   llvm::SmallVector<Expr *, 16> Vars;
7044   Vars.reserve(C->varlist_size());
7045   for (auto *VE : C->varlists()) {
7046     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7047     if (EVar.isInvalid())
7048       return nullptr;
7049     Vars.push_back(EVar.get());
7050   }
7051   return getDerived().RebuildOMPPrivateClause(
7052       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7053 }
7054 
7055 template <typename Derived>
7056 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
7057     OMPFirstprivateClause *C) {
7058   llvm::SmallVector<Expr *, 16> Vars;
7059   Vars.reserve(C->varlist_size());
7060   for (auto *VE : C->varlists()) {
7061     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7062     if (EVar.isInvalid())
7063       return nullptr;
7064     Vars.push_back(EVar.get());
7065   }
7066   return getDerived().RebuildOMPFirstprivateClause(
7067       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7068 }
7069 
7070 template <typename Derived>
7071 OMPClause *
7072 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
7073   llvm::SmallVector<Expr *, 16> Vars;
7074   Vars.reserve(C->varlist_size());
7075   for (auto *VE : C->varlists()) {
7076     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7077     if (EVar.isInvalid())
7078       return nullptr;
7079     Vars.push_back(EVar.get());
7080   }
7081   return getDerived().RebuildOMPLastprivateClause(
7082       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7083 }
7084 
7085 template <typename Derived>
7086 OMPClause *
7087 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
7088   llvm::SmallVector<Expr *, 16> Vars;
7089   Vars.reserve(C->varlist_size());
7090   for (auto *VE : C->varlists()) {
7091     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7092     if (EVar.isInvalid())
7093       return nullptr;
7094     Vars.push_back(EVar.get());
7095   }
7096   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
7097                                              C->getLParenLoc(), C->getLocEnd());
7098 }
7099 
7100 template <typename Derived>
7101 OMPClause *
7102 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
7103   llvm::SmallVector<Expr *, 16> Vars;
7104   Vars.reserve(C->varlist_size());
7105   for (auto *VE : C->varlists()) {
7106     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7107     if (EVar.isInvalid())
7108       return nullptr;
7109     Vars.push_back(EVar.get());
7110   }
7111   CXXScopeSpec ReductionIdScopeSpec;
7112   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
7113 
7114   DeclarationNameInfo NameInfo = C->getNameInfo();
7115   if (NameInfo.getName()) {
7116     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7117     if (!NameInfo.getName())
7118       return nullptr;
7119   }
7120   return getDerived().RebuildOMPReductionClause(
7121       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
7122       C->getLocEnd(), ReductionIdScopeSpec, NameInfo);
7123 }
7124 
7125 template <typename Derived>
7126 OMPClause *
7127 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
7128   llvm::SmallVector<Expr *, 16> Vars;
7129   Vars.reserve(C->varlist_size());
7130   for (auto *VE : C->varlists()) {
7131     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7132     if (EVar.isInvalid())
7133       return nullptr;
7134     Vars.push_back(EVar.get());
7135   }
7136   ExprResult Step = getDerived().TransformExpr(C->getStep());
7137   if (Step.isInvalid())
7138     return nullptr;
7139   return getDerived().RebuildOMPLinearClause(Vars, Step.get(), C->getLocStart(),
7140                                              C->getLParenLoc(),
7141                                              C->getColonLoc(), C->getLocEnd());
7142 }
7143 
7144 template <typename Derived>
7145 OMPClause *
7146 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
7147   llvm::SmallVector<Expr *, 16> Vars;
7148   Vars.reserve(C->varlist_size());
7149   for (auto *VE : C->varlists()) {
7150     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7151     if (EVar.isInvalid())
7152       return nullptr;
7153     Vars.push_back(EVar.get());
7154   }
7155   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
7156   if (Alignment.isInvalid())
7157     return nullptr;
7158   return getDerived().RebuildOMPAlignedClause(
7159       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
7160       C->getColonLoc(), C->getLocEnd());
7161 }
7162 
7163 template <typename Derived>
7164 OMPClause *
7165 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
7166   llvm::SmallVector<Expr *, 16> Vars;
7167   Vars.reserve(C->varlist_size());
7168   for (auto *VE : C->varlists()) {
7169     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7170     if (EVar.isInvalid())
7171       return nullptr;
7172     Vars.push_back(EVar.get());
7173   }
7174   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
7175                                              C->getLParenLoc(), C->getLocEnd());
7176 }
7177 
7178 template <typename Derived>
7179 OMPClause *
7180 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
7181   llvm::SmallVector<Expr *, 16> Vars;
7182   Vars.reserve(C->varlist_size());
7183   for (auto *VE : C->varlists()) {
7184     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7185     if (EVar.isInvalid())
7186       return nullptr;
7187     Vars.push_back(EVar.get());
7188   }
7189   return getDerived().RebuildOMPCopyprivateClause(
7190       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
7191 }
7192 
7193 template <typename Derived>
7194 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
7195   llvm::SmallVector<Expr *, 16> Vars;
7196   Vars.reserve(C->varlist_size());
7197   for (auto *VE : C->varlists()) {
7198     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
7199     if (EVar.isInvalid())
7200       return nullptr;
7201     Vars.push_back(EVar.get());
7202   }
7203   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
7204                                             C->getLParenLoc(), C->getLocEnd());
7205 }
7206 
7207 //===----------------------------------------------------------------------===//
7208 // Expression transformation
7209 //===----------------------------------------------------------------------===//
7210 template<typename Derived>
7211 ExprResult
7212 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
7213   if (!E->isTypeDependent())
7214     return E;
7215 
7216   return getDerived().RebuildPredefinedExpr(E->getLocation(),
7217                                             E->getIdentType());
7218 }
7219 
7220 template<typename Derived>
7221 ExprResult
7222 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
7223   NestedNameSpecifierLoc QualifierLoc;
7224   if (E->getQualifierLoc()) {
7225     QualifierLoc
7226       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7227     if (!QualifierLoc)
7228       return ExprError();
7229   }
7230 
7231   ValueDecl *ND
7232     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
7233                                                          E->getDecl()));
7234   if (!ND)
7235     return ExprError();
7236 
7237   DeclarationNameInfo NameInfo = E->getNameInfo();
7238   if (NameInfo.getName()) {
7239     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7240     if (!NameInfo.getName())
7241       return ExprError();
7242   }
7243 
7244   if (!getDerived().AlwaysRebuild() &&
7245       QualifierLoc == E->getQualifierLoc() &&
7246       ND == E->getDecl() &&
7247       NameInfo.getName() == E->getDecl()->getDeclName() &&
7248       !E->hasExplicitTemplateArgs()) {
7249 
7250     // Mark it referenced in the new context regardless.
7251     // FIXME: this is a bit instantiation-specific.
7252     SemaRef.MarkDeclRefReferenced(E);
7253 
7254     return E;
7255   }
7256 
7257   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
7258   if (E->hasExplicitTemplateArgs()) {
7259     TemplateArgs = &TransArgs;
7260     TransArgs.setLAngleLoc(E->getLAngleLoc());
7261     TransArgs.setRAngleLoc(E->getRAngleLoc());
7262     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7263                                                 E->getNumTemplateArgs(),
7264                                                 TransArgs))
7265       return ExprError();
7266   }
7267 
7268   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
7269                                          TemplateArgs);
7270 }
7271 
7272 template<typename Derived>
7273 ExprResult
7274 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
7275   return E;
7276 }
7277 
7278 template<typename Derived>
7279 ExprResult
7280 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
7281   return E;
7282 }
7283 
7284 template<typename Derived>
7285 ExprResult
7286 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
7287   return E;
7288 }
7289 
7290 template<typename Derived>
7291 ExprResult
7292 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
7293   return E;
7294 }
7295 
7296 template<typename Derived>
7297 ExprResult
7298 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
7299   return E;
7300 }
7301 
7302 template<typename Derived>
7303 ExprResult
7304 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
7305   if (FunctionDecl *FD = E->getDirectCallee())
7306     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
7307   return SemaRef.MaybeBindToTemporary(E);
7308 }
7309 
7310 template<typename Derived>
7311 ExprResult
7312 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
7313   ExprResult ControllingExpr =
7314     getDerived().TransformExpr(E->getControllingExpr());
7315   if (ControllingExpr.isInvalid())
7316     return ExprError();
7317 
7318   SmallVector<Expr *, 4> AssocExprs;
7319   SmallVector<TypeSourceInfo *, 4> AssocTypes;
7320   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
7321     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
7322     if (TS) {
7323       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
7324       if (!AssocType)
7325         return ExprError();
7326       AssocTypes.push_back(AssocType);
7327     } else {
7328       AssocTypes.push_back(nullptr);
7329     }
7330 
7331     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
7332     if (AssocExpr.isInvalid())
7333       return ExprError();
7334     AssocExprs.push_back(AssocExpr.get());
7335   }
7336 
7337   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
7338                                                   E->getDefaultLoc(),
7339                                                   E->getRParenLoc(),
7340                                                   ControllingExpr.get(),
7341                                                   AssocTypes,
7342                                                   AssocExprs);
7343 }
7344 
7345 template<typename Derived>
7346 ExprResult
7347 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
7348   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7349   if (SubExpr.isInvalid())
7350     return ExprError();
7351 
7352   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7353     return E;
7354 
7355   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
7356                                        E->getRParen());
7357 }
7358 
7359 /// \brief The operand of a unary address-of operator has special rules: it's
7360 /// allowed to refer to a non-static member of a class even if there's no 'this'
7361 /// object available.
7362 template<typename Derived>
7363 ExprResult
7364 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
7365   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
7366     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
7367   else
7368     return getDerived().TransformExpr(E);
7369 }
7370 
7371 template<typename Derived>
7372 ExprResult
7373 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
7374   ExprResult SubExpr;
7375   if (E->getOpcode() == UO_AddrOf)
7376     SubExpr = TransformAddressOfOperand(E->getSubExpr());
7377   else
7378     SubExpr = TransformExpr(E->getSubExpr());
7379   if (SubExpr.isInvalid())
7380     return ExprError();
7381 
7382   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
7383     return E;
7384 
7385   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
7386                                            E->getOpcode(),
7387                                            SubExpr.get());
7388 }
7389 
7390 template<typename Derived>
7391 ExprResult
7392 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
7393   // Transform the type.
7394   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
7395   if (!Type)
7396     return ExprError();
7397 
7398   // Transform all of the components into components similar to what the
7399   // parser uses.
7400   // FIXME: It would be slightly more efficient in the non-dependent case to
7401   // just map FieldDecls, rather than requiring the rebuilder to look for
7402   // the fields again. However, __builtin_offsetof is rare enough in
7403   // template code that we don't care.
7404   bool ExprChanged = false;
7405   typedef Sema::OffsetOfComponent Component;
7406   typedef OffsetOfExpr::OffsetOfNode Node;
7407   SmallVector<Component, 4> Components;
7408   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
7409     const Node &ON = E->getComponent(I);
7410     Component Comp;
7411     Comp.isBrackets = true;
7412     Comp.LocStart = ON.getSourceRange().getBegin();
7413     Comp.LocEnd = ON.getSourceRange().getEnd();
7414     switch (ON.getKind()) {
7415     case Node::Array: {
7416       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
7417       ExprResult Index = getDerived().TransformExpr(FromIndex);
7418       if (Index.isInvalid())
7419         return ExprError();
7420 
7421       ExprChanged = ExprChanged || Index.get() != FromIndex;
7422       Comp.isBrackets = true;
7423       Comp.U.E = Index.get();
7424       break;
7425     }
7426 
7427     case Node::Field:
7428     case Node::Identifier:
7429       Comp.isBrackets = false;
7430       Comp.U.IdentInfo = ON.getFieldName();
7431       if (!Comp.U.IdentInfo)
7432         continue;
7433 
7434       break;
7435 
7436     case Node::Base:
7437       // Will be recomputed during the rebuild.
7438       continue;
7439     }
7440 
7441     Components.push_back(Comp);
7442   }
7443 
7444   // If nothing changed, retain the existing expression.
7445   if (!getDerived().AlwaysRebuild() &&
7446       Type == E->getTypeSourceInfo() &&
7447       !ExprChanged)
7448     return E;
7449 
7450   // Build a new offsetof expression.
7451   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
7452                                           Components.data(), Components.size(),
7453                                           E->getRParenLoc());
7454 }
7455 
7456 template<typename Derived>
7457 ExprResult
7458 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
7459   assert(getDerived().AlreadyTransformed(E->getType()) &&
7460          "opaque value expression requires transformation");
7461   return E;
7462 }
7463 
7464 template<typename Derived>
7465 ExprResult
7466 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
7467   return E;
7468 }
7469 
7470 template<typename Derived>
7471 ExprResult
7472 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
7473   // Rebuild the syntactic form.  The original syntactic form has
7474   // opaque-value expressions in it, so strip those away and rebuild
7475   // the result.  This is a really awful way of doing this, but the
7476   // better solution (rebuilding the semantic expressions and
7477   // rebinding OVEs as necessary) doesn't work; we'd need
7478   // TreeTransform to not strip away implicit conversions.
7479   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
7480   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
7481   if (result.isInvalid()) return ExprError();
7482 
7483   // If that gives us a pseudo-object result back, the pseudo-object
7484   // expression must have been an lvalue-to-rvalue conversion which we
7485   // should reapply.
7486   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
7487     result = SemaRef.checkPseudoObjectRValue(result.get());
7488 
7489   return result;
7490 }
7491 
7492 template<typename Derived>
7493 ExprResult
7494 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
7495                                                 UnaryExprOrTypeTraitExpr *E) {
7496   if (E->isArgumentType()) {
7497     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
7498 
7499     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7500     if (!NewT)
7501       return ExprError();
7502 
7503     if (!getDerived().AlwaysRebuild() && OldT == NewT)
7504       return E;
7505 
7506     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
7507                                                     E->getKind(),
7508                                                     E->getSourceRange());
7509   }
7510 
7511   // C++0x [expr.sizeof]p1:
7512   //   The operand is either an expression, which is an unevaluated operand
7513   //   [...]
7514   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
7515                                                Sema::ReuseLambdaContextDecl);
7516 
7517   // Try to recover if we have something like sizeof(T::X) where X is a type.
7518   // Notably, there must be *exactly* one set of parens if X is a type.
7519   TypeSourceInfo *RecoveryTSI = nullptr;
7520   ExprResult SubExpr;
7521   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
7522   if (auto *DRE =
7523           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
7524     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
7525         PE, DRE, false, &RecoveryTSI);
7526   else
7527     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
7528 
7529   if (RecoveryTSI) {
7530     return getDerived().RebuildUnaryExprOrTypeTrait(
7531         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
7532   } else if (SubExpr.isInvalid())
7533     return ExprError();
7534 
7535   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
7536     return E;
7537 
7538   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
7539                                                   E->getOperatorLoc(),
7540                                                   E->getKind(),
7541                                                   E->getSourceRange());
7542 }
7543 
7544 template<typename Derived>
7545 ExprResult
7546 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
7547   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7548   if (LHS.isInvalid())
7549     return ExprError();
7550 
7551   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7552   if (RHS.isInvalid())
7553     return ExprError();
7554 
7555 
7556   if (!getDerived().AlwaysRebuild() &&
7557       LHS.get() == E->getLHS() &&
7558       RHS.get() == E->getRHS())
7559     return E;
7560 
7561   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
7562                                            /*FIXME:*/E->getLHS()->getLocStart(),
7563                                                 RHS.get(),
7564                                                 E->getRBracketLoc());
7565 }
7566 
7567 template<typename Derived>
7568 ExprResult
7569 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
7570   // Transform the callee.
7571   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
7572   if (Callee.isInvalid())
7573     return ExprError();
7574 
7575   // Transform arguments.
7576   bool ArgChanged = false;
7577   SmallVector<Expr*, 8> Args;
7578   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
7579                                   &ArgChanged))
7580     return ExprError();
7581 
7582   if (!getDerived().AlwaysRebuild() &&
7583       Callee.get() == E->getCallee() &&
7584       !ArgChanged)
7585     return SemaRef.MaybeBindToTemporary(E);
7586 
7587   // FIXME: Wrong source location information for the '('.
7588   SourceLocation FakeLParenLoc
7589     = ((Expr *)Callee.get())->getSourceRange().getBegin();
7590   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
7591                                       Args,
7592                                       E->getRParenLoc());
7593 }
7594 
7595 template<typename Derived>
7596 ExprResult
7597 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
7598   ExprResult Base = getDerived().TransformExpr(E->getBase());
7599   if (Base.isInvalid())
7600     return ExprError();
7601 
7602   NestedNameSpecifierLoc QualifierLoc;
7603   if (E->hasQualifier()) {
7604     QualifierLoc
7605       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7606 
7607     if (!QualifierLoc)
7608       return ExprError();
7609   }
7610   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
7611 
7612   ValueDecl *Member
7613     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
7614                                                          E->getMemberDecl()));
7615   if (!Member)
7616     return ExprError();
7617 
7618   NamedDecl *FoundDecl = E->getFoundDecl();
7619   if (FoundDecl == E->getMemberDecl()) {
7620     FoundDecl = Member;
7621   } else {
7622     FoundDecl = cast_or_null<NamedDecl>(
7623                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
7624     if (!FoundDecl)
7625       return ExprError();
7626   }
7627 
7628   if (!getDerived().AlwaysRebuild() &&
7629       Base.get() == E->getBase() &&
7630       QualifierLoc == E->getQualifierLoc() &&
7631       Member == E->getMemberDecl() &&
7632       FoundDecl == E->getFoundDecl() &&
7633       !E->hasExplicitTemplateArgs()) {
7634 
7635     // Mark it referenced in the new context regardless.
7636     // FIXME: this is a bit instantiation-specific.
7637     SemaRef.MarkMemberReferenced(E);
7638 
7639     return E;
7640   }
7641 
7642   TemplateArgumentListInfo TransArgs;
7643   if (E->hasExplicitTemplateArgs()) {
7644     TransArgs.setLAngleLoc(E->getLAngleLoc());
7645     TransArgs.setRAngleLoc(E->getRAngleLoc());
7646     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
7647                                                 E->getNumTemplateArgs(),
7648                                                 TransArgs))
7649       return ExprError();
7650   }
7651 
7652   // FIXME: Bogus source location for the operator
7653   SourceLocation FakeOperatorLoc =
7654       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
7655 
7656   // FIXME: to do this check properly, we will need to preserve the
7657   // first-qualifier-in-scope here, just in case we had a dependent
7658   // base (and therefore couldn't do the check) and a
7659   // nested-name-qualifier (and therefore could do the lookup).
7660   NamedDecl *FirstQualifierInScope = nullptr;
7661 
7662   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
7663                                         E->isArrow(),
7664                                         QualifierLoc,
7665                                         TemplateKWLoc,
7666                                         E->getMemberNameInfo(),
7667                                         Member,
7668                                         FoundDecl,
7669                                         (E->hasExplicitTemplateArgs()
7670                                            ? &TransArgs : nullptr),
7671                                         FirstQualifierInScope);
7672 }
7673 
7674 template<typename Derived>
7675 ExprResult
7676 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
7677   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7678   if (LHS.isInvalid())
7679     return ExprError();
7680 
7681   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7682   if (RHS.isInvalid())
7683     return ExprError();
7684 
7685   if (!getDerived().AlwaysRebuild() &&
7686       LHS.get() == E->getLHS() &&
7687       RHS.get() == E->getRHS())
7688     return E;
7689 
7690   Sema::FPContractStateRAII FPContractState(getSema());
7691   getSema().FPFeatures.fp_contract = E->isFPContractable();
7692 
7693   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
7694                                             LHS.get(), RHS.get());
7695 }
7696 
7697 template<typename Derived>
7698 ExprResult
7699 TreeTransform<Derived>::TransformCompoundAssignOperator(
7700                                                       CompoundAssignOperator *E) {
7701   return getDerived().TransformBinaryOperator(E);
7702 }
7703 
7704 template<typename Derived>
7705 ExprResult TreeTransform<Derived>::
7706 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
7707   // Just rebuild the common and RHS expressions and see whether we
7708   // get any changes.
7709 
7710   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
7711   if (commonExpr.isInvalid())
7712     return ExprError();
7713 
7714   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
7715   if (rhs.isInvalid())
7716     return ExprError();
7717 
7718   if (!getDerived().AlwaysRebuild() &&
7719       commonExpr.get() == e->getCommon() &&
7720       rhs.get() == e->getFalseExpr())
7721     return e;
7722 
7723   return getDerived().RebuildConditionalOperator(commonExpr.get(),
7724                                                  e->getQuestionLoc(),
7725                                                  nullptr,
7726                                                  e->getColonLoc(),
7727                                                  rhs.get());
7728 }
7729 
7730 template<typename Derived>
7731 ExprResult
7732 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
7733   ExprResult Cond = getDerived().TransformExpr(E->getCond());
7734   if (Cond.isInvalid())
7735     return ExprError();
7736 
7737   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
7738   if (LHS.isInvalid())
7739     return ExprError();
7740 
7741   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
7742   if (RHS.isInvalid())
7743     return ExprError();
7744 
7745   if (!getDerived().AlwaysRebuild() &&
7746       Cond.get() == E->getCond() &&
7747       LHS.get() == E->getLHS() &&
7748       RHS.get() == E->getRHS())
7749     return E;
7750 
7751   return getDerived().RebuildConditionalOperator(Cond.get(),
7752                                                  E->getQuestionLoc(),
7753                                                  LHS.get(),
7754                                                  E->getColonLoc(),
7755                                                  RHS.get());
7756 }
7757 
7758 template<typename Derived>
7759 ExprResult
7760 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
7761   // Implicit casts are eliminated during transformation, since they
7762   // will be recomputed by semantic analysis after transformation.
7763   return getDerived().TransformExpr(E->getSubExprAsWritten());
7764 }
7765 
7766 template<typename Derived>
7767 ExprResult
7768 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
7769   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
7770   if (!Type)
7771     return ExprError();
7772 
7773   ExprResult SubExpr
7774     = getDerived().TransformExpr(E->getSubExprAsWritten());
7775   if (SubExpr.isInvalid())
7776     return ExprError();
7777 
7778   if (!getDerived().AlwaysRebuild() &&
7779       Type == E->getTypeInfoAsWritten() &&
7780       SubExpr.get() == E->getSubExpr())
7781     return E;
7782 
7783   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
7784                                             Type,
7785                                             E->getRParenLoc(),
7786                                             SubExpr.get());
7787 }
7788 
7789 template<typename Derived>
7790 ExprResult
7791 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
7792   TypeSourceInfo *OldT = E->getTypeSourceInfo();
7793   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
7794   if (!NewT)
7795     return ExprError();
7796 
7797   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
7798   if (Init.isInvalid())
7799     return ExprError();
7800 
7801   if (!getDerived().AlwaysRebuild() &&
7802       OldT == NewT &&
7803       Init.get() == E->getInitializer())
7804     return SemaRef.MaybeBindToTemporary(E);
7805 
7806   // Note: the expression type doesn't necessarily match the
7807   // type-as-written, but that's okay, because it should always be
7808   // derivable from the initializer.
7809 
7810   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
7811                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
7812                                                  Init.get());
7813 }
7814 
7815 template<typename Derived>
7816 ExprResult
7817 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
7818   ExprResult Base = getDerived().TransformExpr(E->getBase());
7819   if (Base.isInvalid())
7820     return ExprError();
7821 
7822   if (!getDerived().AlwaysRebuild() &&
7823       Base.get() == E->getBase())
7824     return E;
7825 
7826   // FIXME: Bad source location
7827   SourceLocation FakeOperatorLoc =
7828       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
7829   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
7830                                                   E->getAccessorLoc(),
7831                                                   E->getAccessor());
7832 }
7833 
7834 template<typename Derived>
7835 ExprResult
7836 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
7837   if (InitListExpr *Syntactic = E->getSyntacticForm())
7838     E = Syntactic;
7839 
7840   bool InitChanged = false;
7841 
7842   SmallVector<Expr*, 4> Inits;
7843   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
7844                                   Inits, &InitChanged))
7845     return ExprError();
7846 
7847   if (!getDerived().AlwaysRebuild() && !InitChanged) {
7848     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
7849     // in some cases. We can't reuse it in general, because the syntactic and
7850     // semantic forms are linked, and we can't know that semantic form will
7851     // match even if the syntactic form does.
7852   }
7853 
7854   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
7855                                       E->getRBraceLoc(), E->getType());
7856 }
7857 
7858 template<typename Derived>
7859 ExprResult
7860 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
7861   Designation Desig;
7862 
7863   // transform the initializer value
7864   ExprResult Init = getDerived().TransformExpr(E->getInit());
7865   if (Init.isInvalid())
7866     return ExprError();
7867 
7868   // transform the designators.
7869   SmallVector<Expr*, 4> ArrayExprs;
7870   bool ExprChanged = false;
7871   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
7872                                              DEnd = E->designators_end();
7873        D != DEnd; ++D) {
7874     if (D->isFieldDesignator()) {
7875       Desig.AddDesignator(Designator::getField(D->getFieldName(),
7876                                                D->getDotLoc(),
7877                                                D->getFieldLoc()));
7878       continue;
7879     }
7880 
7881     if (D->isArrayDesignator()) {
7882       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
7883       if (Index.isInvalid())
7884         return ExprError();
7885 
7886       Desig.AddDesignator(Designator::getArray(Index.get(),
7887                                                D->getLBracketLoc()));
7888 
7889       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
7890       ArrayExprs.push_back(Index.get());
7891       continue;
7892     }
7893 
7894     assert(D->isArrayRangeDesignator() && "New kind of designator?");
7895     ExprResult Start
7896       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
7897     if (Start.isInvalid())
7898       return ExprError();
7899 
7900     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
7901     if (End.isInvalid())
7902       return ExprError();
7903 
7904     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
7905                                                   End.get(),
7906                                                   D->getLBracketLoc(),
7907                                                   D->getEllipsisLoc()));
7908 
7909     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
7910       End.get() != E->getArrayRangeEnd(*D);
7911 
7912     ArrayExprs.push_back(Start.get());
7913     ArrayExprs.push_back(End.get());
7914   }
7915 
7916   if (!getDerived().AlwaysRebuild() &&
7917       Init.get() == E->getInit() &&
7918       !ExprChanged)
7919     return E;
7920 
7921   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
7922                                                 E->getEqualOrColonLoc(),
7923                                                 E->usesGNUSyntax(), Init.get());
7924 }
7925 
7926 template<typename Derived>
7927 ExprResult
7928 TreeTransform<Derived>::TransformImplicitValueInitExpr(
7929                                                      ImplicitValueInitExpr *E) {
7930   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
7931 
7932   // FIXME: Will we ever have proper type location here? Will we actually
7933   // need to transform the type?
7934   QualType T = getDerived().TransformType(E->getType());
7935   if (T.isNull())
7936     return ExprError();
7937 
7938   if (!getDerived().AlwaysRebuild() &&
7939       T == E->getType())
7940     return E;
7941 
7942   return getDerived().RebuildImplicitValueInitExpr(T);
7943 }
7944 
7945 template<typename Derived>
7946 ExprResult
7947 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
7948   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
7949   if (!TInfo)
7950     return ExprError();
7951 
7952   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7953   if (SubExpr.isInvalid())
7954     return ExprError();
7955 
7956   if (!getDerived().AlwaysRebuild() &&
7957       TInfo == E->getWrittenTypeInfo() &&
7958       SubExpr.get() == E->getSubExpr())
7959     return E;
7960 
7961   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
7962                                        TInfo, E->getRParenLoc());
7963 }
7964 
7965 template<typename Derived>
7966 ExprResult
7967 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
7968   bool ArgumentChanged = false;
7969   SmallVector<Expr*, 4> Inits;
7970   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
7971                      &ArgumentChanged))
7972     return ExprError();
7973 
7974   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
7975                                            Inits,
7976                                            E->getRParenLoc());
7977 }
7978 
7979 /// \brief Transform an address-of-label expression.
7980 ///
7981 /// By default, the transformation of an address-of-label expression always
7982 /// rebuilds the expression, so that the label identifier can be resolved to
7983 /// the corresponding label statement by semantic analysis.
7984 template<typename Derived>
7985 ExprResult
7986 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
7987   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
7988                                         E->getLabel());
7989   if (!LD)
7990     return ExprError();
7991 
7992   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
7993                                            cast<LabelDecl>(LD));
7994 }
7995 
7996 template<typename Derived>
7997 ExprResult
7998 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
7999   SemaRef.ActOnStartStmtExpr();
8000   StmtResult SubStmt
8001     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
8002   if (SubStmt.isInvalid()) {
8003     SemaRef.ActOnStmtExprError();
8004     return ExprError();
8005   }
8006 
8007   if (!getDerived().AlwaysRebuild() &&
8008       SubStmt.get() == E->getSubStmt()) {
8009     // Calling this an 'error' is unintuitive, but it does the right thing.
8010     SemaRef.ActOnStmtExprError();
8011     return SemaRef.MaybeBindToTemporary(E);
8012   }
8013 
8014   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
8015                                       SubStmt.get(),
8016                                       E->getRParenLoc());
8017 }
8018 
8019 template<typename Derived>
8020 ExprResult
8021 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
8022   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8023   if (Cond.isInvalid())
8024     return ExprError();
8025 
8026   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8027   if (LHS.isInvalid())
8028     return ExprError();
8029 
8030   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8031   if (RHS.isInvalid())
8032     return ExprError();
8033 
8034   if (!getDerived().AlwaysRebuild() &&
8035       Cond.get() == E->getCond() &&
8036       LHS.get() == E->getLHS() &&
8037       RHS.get() == E->getRHS())
8038     return E;
8039 
8040   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
8041                                         Cond.get(), LHS.get(), RHS.get(),
8042                                         E->getRParenLoc());
8043 }
8044 
8045 template<typename Derived>
8046 ExprResult
8047 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
8048   return E;
8049 }
8050 
8051 template<typename Derived>
8052 ExprResult
8053 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
8054   switch (E->getOperator()) {
8055   case OO_New:
8056   case OO_Delete:
8057   case OO_Array_New:
8058   case OO_Array_Delete:
8059     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
8060 
8061   case OO_Call: {
8062     // This is a call to an object's operator().
8063     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
8064 
8065     // Transform the object itself.
8066     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
8067     if (Object.isInvalid())
8068       return ExprError();
8069 
8070     // FIXME: Poor location information
8071     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
8072         static_cast<Expr *>(Object.get())->getLocEnd());
8073 
8074     // Transform the call arguments.
8075     SmallVector<Expr*, 8> Args;
8076     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
8077                                     Args))
8078       return ExprError();
8079 
8080     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
8081                                         Args,
8082                                         E->getLocEnd());
8083   }
8084 
8085 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
8086   case OO_##Name:
8087 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
8088 #include "clang/Basic/OperatorKinds.def"
8089   case OO_Subscript:
8090     // Handled below.
8091     break;
8092 
8093   case OO_Conditional:
8094     llvm_unreachable("conditional operator is not actually overloadable");
8095 
8096   case OO_None:
8097   case NUM_OVERLOADED_OPERATORS:
8098     llvm_unreachable("not an overloaded operator?");
8099   }
8100 
8101   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8102   if (Callee.isInvalid())
8103     return ExprError();
8104 
8105   ExprResult First;
8106   if (E->getOperator() == OO_Amp)
8107     First = getDerived().TransformAddressOfOperand(E->getArg(0));
8108   else
8109     First = getDerived().TransformExpr(E->getArg(0));
8110   if (First.isInvalid())
8111     return ExprError();
8112 
8113   ExprResult Second;
8114   if (E->getNumArgs() == 2) {
8115     Second = getDerived().TransformExpr(E->getArg(1));
8116     if (Second.isInvalid())
8117       return ExprError();
8118   }
8119 
8120   if (!getDerived().AlwaysRebuild() &&
8121       Callee.get() == E->getCallee() &&
8122       First.get() == E->getArg(0) &&
8123       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
8124     return SemaRef.MaybeBindToTemporary(E);
8125 
8126   Sema::FPContractStateRAII FPContractState(getSema());
8127   getSema().FPFeatures.fp_contract = E->isFPContractable();
8128 
8129   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
8130                                                  E->getOperatorLoc(),
8131                                                  Callee.get(),
8132                                                  First.get(),
8133                                                  Second.get());
8134 }
8135 
8136 template<typename Derived>
8137 ExprResult
8138 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
8139   return getDerived().TransformCallExpr(E);
8140 }
8141 
8142 template<typename Derived>
8143 ExprResult
8144 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
8145   // Transform the callee.
8146   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8147   if (Callee.isInvalid())
8148     return ExprError();
8149 
8150   // Transform exec config.
8151   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
8152   if (EC.isInvalid())
8153     return ExprError();
8154 
8155   // Transform arguments.
8156   bool ArgChanged = false;
8157   SmallVector<Expr*, 8> Args;
8158   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8159                                   &ArgChanged))
8160     return ExprError();
8161 
8162   if (!getDerived().AlwaysRebuild() &&
8163       Callee.get() == E->getCallee() &&
8164       !ArgChanged)
8165     return SemaRef.MaybeBindToTemporary(E);
8166 
8167   // FIXME: Wrong source location information for the '('.
8168   SourceLocation FakeLParenLoc
8169     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8170   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8171                                       Args,
8172                                       E->getRParenLoc(), EC.get());
8173 }
8174 
8175 template<typename Derived>
8176 ExprResult
8177 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
8178   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8179   if (!Type)
8180     return ExprError();
8181 
8182   ExprResult SubExpr
8183     = getDerived().TransformExpr(E->getSubExprAsWritten());
8184   if (SubExpr.isInvalid())
8185     return ExprError();
8186 
8187   if (!getDerived().AlwaysRebuild() &&
8188       Type == E->getTypeInfoAsWritten() &&
8189       SubExpr.get() == E->getSubExpr())
8190     return E;
8191   return getDerived().RebuildCXXNamedCastExpr(
8192       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
8193       Type, E->getAngleBrackets().getEnd(),
8194       // FIXME. this should be '(' location
8195       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
8196 }
8197 
8198 template<typename Derived>
8199 ExprResult
8200 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
8201   return getDerived().TransformCXXNamedCastExpr(E);
8202 }
8203 
8204 template<typename Derived>
8205 ExprResult
8206 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
8207   return getDerived().TransformCXXNamedCastExpr(E);
8208 }
8209 
8210 template<typename Derived>
8211 ExprResult
8212 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
8213                                                       CXXReinterpretCastExpr *E) {
8214   return getDerived().TransformCXXNamedCastExpr(E);
8215 }
8216 
8217 template<typename Derived>
8218 ExprResult
8219 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
8220   return getDerived().TransformCXXNamedCastExpr(E);
8221 }
8222 
8223 template<typename Derived>
8224 ExprResult
8225 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
8226                                                      CXXFunctionalCastExpr *E) {
8227   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8228   if (!Type)
8229     return ExprError();
8230 
8231   ExprResult SubExpr
8232     = getDerived().TransformExpr(E->getSubExprAsWritten());
8233   if (SubExpr.isInvalid())
8234     return ExprError();
8235 
8236   if (!getDerived().AlwaysRebuild() &&
8237       Type == E->getTypeInfoAsWritten() &&
8238       SubExpr.get() == E->getSubExpr())
8239     return E;
8240 
8241   return getDerived().RebuildCXXFunctionalCastExpr(Type,
8242                                                    E->getLParenLoc(),
8243                                                    SubExpr.get(),
8244                                                    E->getRParenLoc());
8245 }
8246 
8247 template<typename Derived>
8248 ExprResult
8249 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
8250   if (E->isTypeOperand()) {
8251     TypeSourceInfo *TInfo
8252       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8253     if (!TInfo)
8254       return ExprError();
8255 
8256     if (!getDerived().AlwaysRebuild() &&
8257         TInfo == E->getTypeOperandSourceInfo())
8258       return E;
8259 
8260     return getDerived().RebuildCXXTypeidExpr(E->getType(),
8261                                              E->getLocStart(),
8262                                              TInfo,
8263                                              E->getLocEnd());
8264   }
8265 
8266   // We don't know whether the subexpression is potentially evaluated until
8267   // after we perform semantic analysis.  We speculatively assume it is
8268   // unevaluated; it will get fixed later if the subexpression is in fact
8269   // potentially evaluated.
8270   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8271                                                Sema::ReuseLambdaContextDecl);
8272 
8273   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8274   if (SubExpr.isInvalid())
8275     return ExprError();
8276 
8277   if (!getDerived().AlwaysRebuild() &&
8278       SubExpr.get() == E->getExprOperand())
8279     return E;
8280 
8281   return getDerived().RebuildCXXTypeidExpr(E->getType(),
8282                                            E->getLocStart(),
8283                                            SubExpr.get(),
8284                                            E->getLocEnd());
8285 }
8286 
8287 template<typename Derived>
8288 ExprResult
8289 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
8290   if (E->isTypeOperand()) {
8291     TypeSourceInfo *TInfo
8292       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8293     if (!TInfo)
8294       return ExprError();
8295 
8296     if (!getDerived().AlwaysRebuild() &&
8297         TInfo == E->getTypeOperandSourceInfo())
8298       return E;
8299 
8300     return getDerived().RebuildCXXUuidofExpr(E->getType(),
8301                                              E->getLocStart(),
8302                                              TInfo,
8303                                              E->getLocEnd());
8304   }
8305 
8306   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8307 
8308   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8309   if (SubExpr.isInvalid())
8310     return ExprError();
8311 
8312   if (!getDerived().AlwaysRebuild() &&
8313       SubExpr.get() == E->getExprOperand())
8314     return E;
8315 
8316   return getDerived().RebuildCXXUuidofExpr(E->getType(),
8317                                            E->getLocStart(),
8318                                            SubExpr.get(),
8319                                            E->getLocEnd());
8320 }
8321 
8322 template<typename Derived>
8323 ExprResult
8324 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
8325   return E;
8326 }
8327 
8328 template<typename Derived>
8329 ExprResult
8330 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
8331                                                      CXXNullPtrLiteralExpr *E) {
8332   return E;
8333 }
8334 
8335 template<typename Derived>
8336 ExprResult
8337 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
8338   QualType T = getSema().getCurrentThisType();
8339 
8340   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
8341     // Make sure that we capture 'this'.
8342     getSema().CheckCXXThisCapture(E->getLocStart());
8343     return E;
8344   }
8345 
8346   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
8347 }
8348 
8349 template<typename Derived>
8350 ExprResult
8351 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
8352   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8353   if (SubExpr.isInvalid())
8354     return ExprError();
8355 
8356   if (!getDerived().AlwaysRebuild() &&
8357       SubExpr.get() == E->getSubExpr())
8358     return E;
8359 
8360   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
8361                                           E->isThrownVariableInScope());
8362 }
8363 
8364 template<typename Derived>
8365 ExprResult
8366 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
8367   ParmVarDecl *Param
8368     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
8369                                                            E->getParam()));
8370   if (!Param)
8371     return ExprError();
8372 
8373   if (!getDerived().AlwaysRebuild() &&
8374       Param == E->getParam())
8375     return E;
8376 
8377   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
8378 }
8379 
8380 template<typename Derived>
8381 ExprResult
8382 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
8383   FieldDecl *Field
8384     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
8385                                                          E->getField()));
8386   if (!Field)
8387     return ExprError();
8388 
8389   if (!getDerived().AlwaysRebuild() && Field == E->getField())
8390     return E;
8391 
8392   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
8393 }
8394 
8395 template<typename Derived>
8396 ExprResult
8397 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
8398                                                     CXXScalarValueInitExpr *E) {
8399   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8400   if (!T)
8401     return ExprError();
8402 
8403   if (!getDerived().AlwaysRebuild() &&
8404       T == E->getTypeSourceInfo())
8405     return E;
8406 
8407   return getDerived().RebuildCXXScalarValueInitExpr(T,
8408                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
8409                                                     E->getRParenLoc());
8410 }
8411 
8412 template<typename Derived>
8413 ExprResult
8414 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
8415   // Transform the type that we're allocating
8416   TypeSourceInfo *AllocTypeInfo
8417     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
8418   if (!AllocTypeInfo)
8419     return ExprError();
8420 
8421   // Transform the size of the array we're allocating (if any).
8422   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
8423   if (ArraySize.isInvalid())
8424     return ExprError();
8425 
8426   // Transform the placement arguments (if any).
8427   bool ArgumentChanged = false;
8428   SmallVector<Expr*, 8> PlacementArgs;
8429   if (getDerived().TransformExprs(E->getPlacementArgs(),
8430                                   E->getNumPlacementArgs(), true,
8431                                   PlacementArgs, &ArgumentChanged))
8432     return ExprError();
8433 
8434   // Transform the initializer (if any).
8435   Expr *OldInit = E->getInitializer();
8436   ExprResult NewInit;
8437   if (OldInit)
8438     NewInit = getDerived().TransformInitializer(OldInit, true);
8439   if (NewInit.isInvalid())
8440     return ExprError();
8441 
8442   // Transform new operator and delete operator.
8443   FunctionDecl *OperatorNew = nullptr;
8444   if (E->getOperatorNew()) {
8445     OperatorNew = cast_or_null<FunctionDecl>(
8446                                  getDerived().TransformDecl(E->getLocStart(),
8447                                                          E->getOperatorNew()));
8448     if (!OperatorNew)
8449       return ExprError();
8450   }
8451 
8452   FunctionDecl *OperatorDelete = nullptr;
8453   if (E->getOperatorDelete()) {
8454     OperatorDelete = cast_or_null<FunctionDecl>(
8455                                    getDerived().TransformDecl(E->getLocStart(),
8456                                                        E->getOperatorDelete()));
8457     if (!OperatorDelete)
8458       return ExprError();
8459   }
8460 
8461   if (!getDerived().AlwaysRebuild() &&
8462       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
8463       ArraySize.get() == E->getArraySize() &&
8464       NewInit.get() == OldInit &&
8465       OperatorNew == E->getOperatorNew() &&
8466       OperatorDelete == E->getOperatorDelete() &&
8467       !ArgumentChanged) {
8468     // Mark any declarations we need as referenced.
8469     // FIXME: instantiation-specific.
8470     if (OperatorNew)
8471       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
8472     if (OperatorDelete)
8473       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8474 
8475     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
8476       QualType ElementType
8477         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
8478       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
8479         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
8480         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
8481           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
8482         }
8483       }
8484     }
8485 
8486     return E;
8487   }
8488 
8489   QualType AllocType = AllocTypeInfo->getType();
8490   if (!ArraySize.get()) {
8491     // If no array size was specified, but the new expression was
8492     // instantiated with an array type (e.g., "new T" where T is
8493     // instantiated with "int[4]"), extract the outer bound from the
8494     // array type as our array size. We do this with constant and
8495     // dependently-sized array types.
8496     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
8497     if (!ArrayT) {
8498       // Do nothing
8499     } else if (const ConstantArrayType *ConsArrayT
8500                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
8501       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
8502                                          SemaRef.Context.getSizeType(),
8503                                          /*FIXME:*/ E->getLocStart());
8504       AllocType = ConsArrayT->getElementType();
8505     } else if (const DependentSizedArrayType *DepArrayT
8506                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
8507       if (DepArrayT->getSizeExpr()) {
8508         ArraySize = DepArrayT->getSizeExpr();
8509         AllocType = DepArrayT->getElementType();
8510       }
8511     }
8512   }
8513 
8514   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
8515                                         E->isGlobalNew(),
8516                                         /*FIXME:*/E->getLocStart(),
8517                                         PlacementArgs,
8518                                         /*FIXME:*/E->getLocStart(),
8519                                         E->getTypeIdParens(),
8520                                         AllocType,
8521                                         AllocTypeInfo,
8522                                         ArraySize.get(),
8523                                         E->getDirectInitRange(),
8524                                         NewInit.get());
8525 }
8526 
8527 template<typename Derived>
8528 ExprResult
8529 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
8530   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
8531   if (Operand.isInvalid())
8532     return ExprError();
8533 
8534   // Transform the delete operator, if known.
8535   FunctionDecl *OperatorDelete = nullptr;
8536   if (E->getOperatorDelete()) {
8537     OperatorDelete = cast_or_null<FunctionDecl>(
8538                                    getDerived().TransformDecl(E->getLocStart(),
8539                                                        E->getOperatorDelete()));
8540     if (!OperatorDelete)
8541       return ExprError();
8542   }
8543 
8544   if (!getDerived().AlwaysRebuild() &&
8545       Operand.get() == E->getArgument() &&
8546       OperatorDelete == E->getOperatorDelete()) {
8547     // Mark any declarations we need as referenced.
8548     // FIXME: instantiation-specific.
8549     if (OperatorDelete)
8550       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8551 
8552     if (!E->getArgument()->isTypeDependent()) {
8553       QualType Destroyed = SemaRef.Context.getBaseElementType(
8554                                                          E->getDestroyedType());
8555       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
8556         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
8557         SemaRef.MarkFunctionReferenced(E->getLocStart(),
8558                                        SemaRef.LookupDestructor(Record));
8559       }
8560     }
8561 
8562     return E;
8563   }
8564 
8565   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
8566                                            E->isGlobalDelete(),
8567                                            E->isArrayForm(),
8568                                            Operand.get());
8569 }
8570 
8571 template<typename Derived>
8572 ExprResult
8573 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
8574                                                      CXXPseudoDestructorExpr *E) {
8575   ExprResult Base = getDerived().TransformExpr(E->getBase());
8576   if (Base.isInvalid())
8577     return ExprError();
8578 
8579   ParsedType ObjectTypePtr;
8580   bool MayBePseudoDestructor = false;
8581   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8582                                               E->getOperatorLoc(),
8583                                         E->isArrow()? tok::arrow : tok::period,
8584                                               ObjectTypePtr,
8585                                               MayBePseudoDestructor);
8586   if (Base.isInvalid())
8587     return ExprError();
8588 
8589   QualType ObjectType = ObjectTypePtr.get();
8590   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
8591   if (QualifierLoc) {
8592     QualifierLoc
8593       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
8594     if (!QualifierLoc)
8595       return ExprError();
8596   }
8597   CXXScopeSpec SS;
8598   SS.Adopt(QualifierLoc);
8599 
8600   PseudoDestructorTypeStorage Destroyed;
8601   if (E->getDestroyedTypeInfo()) {
8602     TypeSourceInfo *DestroyedTypeInfo
8603       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
8604                                                 ObjectType, nullptr, SS);
8605     if (!DestroyedTypeInfo)
8606       return ExprError();
8607     Destroyed = DestroyedTypeInfo;
8608   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
8609     // We aren't likely to be able to resolve the identifier down to a type
8610     // now anyway, so just retain the identifier.
8611     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
8612                                             E->getDestroyedTypeLoc());
8613   } else {
8614     // Look for a destructor known with the given name.
8615     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
8616                                               *E->getDestroyedTypeIdentifier(),
8617                                                 E->getDestroyedTypeLoc(),
8618                                                 /*Scope=*/nullptr,
8619                                                 SS, ObjectTypePtr,
8620                                                 false);
8621     if (!T)
8622       return ExprError();
8623 
8624     Destroyed
8625       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
8626                                                  E->getDestroyedTypeLoc());
8627   }
8628 
8629   TypeSourceInfo *ScopeTypeInfo = nullptr;
8630   if (E->getScopeTypeInfo()) {
8631     CXXScopeSpec EmptySS;
8632     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
8633                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
8634     if (!ScopeTypeInfo)
8635       return ExprError();
8636   }
8637 
8638   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
8639                                                      E->getOperatorLoc(),
8640                                                      E->isArrow(),
8641                                                      SS,
8642                                                      ScopeTypeInfo,
8643                                                      E->getColonColonLoc(),
8644                                                      E->getTildeLoc(),
8645                                                      Destroyed);
8646 }
8647 
8648 template<typename Derived>
8649 ExprResult
8650 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
8651                                                   UnresolvedLookupExpr *Old) {
8652   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
8653                  Sema::LookupOrdinaryName);
8654 
8655   // Transform all the decls.
8656   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
8657          E = Old->decls_end(); I != E; ++I) {
8658     NamedDecl *InstD = static_cast<NamedDecl*>(
8659                                  getDerived().TransformDecl(Old->getNameLoc(),
8660                                                             *I));
8661     if (!InstD) {
8662       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
8663       // This can happen because of dependent hiding.
8664       if (isa<UsingShadowDecl>(*I))
8665         continue;
8666       else {
8667         R.clear();
8668         return ExprError();
8669       }
8670     }
8671 
8672     // Expand using declarations.
8673     if (isa<UsingDecl>(InstD)) {
8674       UsingDecl *UD = cast<UsingDecl>(InstD);
8675       for (auto *I : UD->shadows())
8676         R.addDecl(I);
8677       continue;
8678     }
8679 
8680     R.addDecl(InstD);
8681   }
8682 
8683   // Resolve a kind, but don't do any further analysis.  If it's
8684   // ambiguous, the callee needs to deal with it.
8685   R.resolveKind();
8686 
8687   // Rebuild the nested-name qualifier, if present.
8688   CXXScopeSpec SS;
8689   if (Old->getQualifierLoc()) {
8690     NestedNameSpecifierLoc QualifierLoc
8691       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
8692     if (!QualifierLoc)
8693       return ExprError();
8694 
8695     SS.Adopt(QualifierLoc);
8696   }
8697 
8698   if (Old->getNamingClass()) {
8699     CXXRecordDecl *NamingClass
8700       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
8701                                                             Old->getNameLoc(),
8702                                                         Old->getNamingClass()));
8703     if (!NamingClass) {
8704       R.clear();
8705       return ExprError();
8706     }
8707 
8708     R.setNamingClass(NamingClass);
8709   }
8710 
8711   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
8712 
8713   // If we have neither explicit template arguments, nor the template keyword,
8714   // it's a normal declaration name.
8715   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
8716     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
8717 
8718   // If we have template arguments, rebuild them, then rebuild the
8719   // templateid expression.
8720   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
8721   if (Old->hasExplicitTemplateArgs() &&
8722       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
8723                                               Old->getNumTemplateArgs(),
8724                                               TransArgs)) {
8725     R.clear();
8726     return ExprError();
8727   }
8728 
8729   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
8730                                             Old->requiresADL(), &TransArgs);
8731 }
8732 
8733 template<typename Derived>
8734 ExprResult
8735 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
8736   bool ArgChanged = false;
8737   SmallVector<TypeSourceInfo *, 4> Args;
8738   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
8739     TypeSourceInfo *From = E->getArg(I);
8740     TypeLoc FromTL = From->getTypeLoc();
8741     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
8742       TypeLocBuilder TLB;
8743       TLB.reserve(FromTL.getFullDataSize());
8744       QualType To = getDerived().TransformType(TLB, FromTL);
8745       if (To.isNull())
8746         return ExprError();
8747 
8748       if (To == From->getType())
8749         Args.push_back(From);
8750       else {
8751         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8752         ArgChanged = true;
8753       }
8754       continue;
8755     }
8756 
8757     ArgChanged = true;
8758 
8759     // We have a pack expansion. Instantiate it.
8760     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
8761     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
8762     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
8763     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
8764 
8765     // Determine whether the set of unexpanded parameter packs can and should
8766     // be expanded.
8767     bool Expand = true;
8768     bool RetainExpansion = false;
8769     Optional<unsigned> OrigNumExpansions =
8770         ExpansionTL.getTypePtr()->getNumExpansions();
8771     Optional<unsigned> NumExpansions = OrigNumExpansions;
8772     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
8773                                              PatternTL.getSourceRange(),
8774                                              Unexpanded,
8775                                              Expand, RetainExpansion,
8776                                              NumExpansions))
8777       return ExprError();
8778 
8779     if (!Expand) {
8780       // The transform has determined that we should perform a simple
8781       // transformation on the pack expansion, producing another pack
8782       // expansion.
8783       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
8784 
8785       TypeLocBuilder TLB;
8786       TLB.reserve(From->getTypeLoc().getFullDataSize());
8787 
8788       QualType To = getDerived().TransformType(TLB, PatternTL);
8789       if (To.isNull())
8790         return ExprError();
8791 
8792       To = getDerived().RebuildPackExpansionType(To,
8793                                                  PatternTL.getSourceRange(),
8794                                                  ExpansionTL.getEllipsisLoc(),
8795                                                  NumExpansions);
8796       if (To.isNull())
8797         return ExprError();
8798 
8799       PackExpansionTypeLoc ToExpansionTL
8800         = TLB.push<PackExpansionTypeLoc>(To);
8801       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8802       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8803       continue;
8804     }
8805 
8806     // Expand the pack expansion by substituting for each argument in the
8807     // pack(s).
8808     for (unsigned I = 0; I != *NumExpansions; ++I) {
8809       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
8810       TypeLocBuilder TLB;
8811       TLB.reserve(PatternTL.getFullDataSize());
8812       QualType To = getDerived().TransformType(TLB, PatternTL);
8813       if (To.isNull())
8814         return ExprError();
8815 
8816       if (To->containsUnexpandedParameterPack()) {
8817         To = getDerived().RebuildPackExpansionType(To,
8818                                                    PatternTL.getSourceRange(),
8819                                                    ExpansionTL.getEllipsisLoc(),
8820                                                    NumExpansions);
8821         if (To.isNull())
8822           return ExprError();
8823 
8824         PackExpansionTypeLoc ToExpansionTL
8825           = TLB.push<PackExpansionTypeLoc>(To);
8826         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8827       }
8828 
8829       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8830     }
8831 
8832     if (!RetainExpansion)
8833       continue;
8834 
8835     // If we're supposed to retain a pack expansion, do so by temporarily
8836     // forgetting the partially-substituted parameter pack.
8837     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
8838 
8839     TypeLocBuilder TLB;
8840     TLB.reserve(From->getTypeLoc().getFullDataSize());
8841 
8842     QualType To = getDerived().TransformType(TLB, PatternTL);
8843     if (To.isNull())
8844       return ExprError();
8845 
8846     To = getDerived().RebuildPackExpansionType(To,
8847                                                PatternTL.getSourceRange(),
8848                                                ExpansionTL.getEllipsisLoc(),
8849                                                NumExpansions);
8850     if (To.isNull())
8851       return ExprError();
8852 
8853     PackExpansionTypeLoc ToExpansionTL
8854       = TLB.push<PackExpansionTypeLoc>(To);
8855     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8856     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8857   }
8858 
8859   if (!getDerived().AlwaysRebuild() && !ArgChanged)
8860     return E;
8861 
8862   return getDerived().RebuildTypeTrait(E->getTrait(),
8863                                        E->getLocStart(),
8864                                        Args,
8865                                        E->getLocEnd());
8866 }
8867 
8868 template<typename Derived>
8869 ExprResult
8870 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
8871   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
8872   if (!T)
8873     return ExprError();
8874 
8875   if (!getDerived().AlwaysRebuild() &&
8876       T == E->getQueriedTypeSourceInfo())
8877     return E;
8878 
8879   ExprResult SubExpr;
8880   {
8881     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8882     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
8883     if (SubExpr.isInvalid())
8884       return ExprError();
8885 
8886     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
8887       return E;
8888   }
8889 
8890   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
8891                                             E->getLocStart(),
8892                                             T,
8893                                             SubExpr.get(),
8894                                             E->getLocEnd());
8895 }
8896 
8897 template<typename Derived>
8898 ExprResult
8899 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
8900   ExprResult SubExpr;
8901   {
8902     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8903     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
8904     if (SubExpr.isInvalid())
8905       return ExprError();
8906 
8907     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
8908       return E;
8909   }
8910 
8911   return getDerived().RebuildExpressionTrait(
8912       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
8913 }
8914 
8915 template <typename Derived>
8916 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
8917     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
8918     TypeSourceInfo **RecoveryTSI) {
8919   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
8920       DRE, AddrTaken, RecoveryTSI);
8921 
8922   // Propagate both errors and recovered types, which return ExprEmpty.
8923   if (!NewDRE.isUsable())
8924     return NewDRE;
8925 
8926   // We got an expr, wrap it up in parens.
8927   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
8928     return PE;
8929   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
8930                                        PE->getRParen());
8931 }
8932 
8933 template <typename Derived>
8934 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8935     DependentScopeDeclRefExpr *E) {
8936   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
8937                                             nullptr);
8938 }
8939 
8940 template<typename Derived>
8941 ExprResult
8942 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8943                                                DependentScopeDeclRefExpr *E,
8944                                                bool IsAddressOfOperand,
8945                                                TypeSourceInfo **RecoveryTSI) {
8946   assert(E->getQualifierLoc());
8947   NestedNameSpecifierLoc QualifierLoc
8948   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8949   if (!QualifierLoc)
8950     return ExprError();
8951   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8952 
8953   // TODO: If this is a conversion-function-id, verify that the
8954   // destination type name (if present) resolves the same way after
8955   // instantiation as it did in the local scope.
8956 
8957   DeclarationNameInfo NameInfo
8958     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
8959   if (!NameInfo.getName())
8960     return ExprError();
8961 
8962   if (!E->hasExplicitTemplateArgs()) {
8963     if (!getDerived().AlwaysRebuild() &&
8964         QualifierLoc == E->getQualifierLoc() &&
8965         // Note: it is sufficient to compare the Name component of NameInfo:
8966         // if name has not changed, DNLoc has not changed either.
8967         NameInfo.getName() == E->getDeclName())
8968       return E;
8969 
8970     return getDerived().RebuildDependentScopeDeclRefExpr(
8971         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
8972         IsAddressOfOperand, RecoveryTSI);
8973   }
8974 
8975   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
8976   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8977                                               E->getNumTemplateArgs(),
8978                                               TransArgs))
8979     return ExprError();
8980 
8981   return getDerived().RebuildDependentScopeDeclRefExpr(
8982       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
8983       RecoveryTSI);
8984 }
8985 
8986 template<typename Derived>
8987 ExprResult
8988 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
8989   // CXXConstructExprs other than for list-initialization and
8990   // CXXTemporaryObjectExpr are always implicit, so when we have
8991   // a 1-argument construction we just transform that argument.
8992   if ((E->getNumArgs() == 1 ||
8993        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
8994       (!getDerived().DropCallArgument(E->getArg(0))) &&
8995       !E->isListInitialization())
8996     return getDerived().TransformExpr(E->getArg(0));
8997 
8998   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
8999 
9000   QualType T = getDerived().TransformType(E->getType());
9001   if (T.isNull())
9002     return ExprError();
9003 
9004   CXXConstructorDecl *Constructor
9005     = cast_or_null<CXXConstructorDecl>(
9006                                 getDerived().TransformDecl(E->getLocStart(),
9007                                                          E->getConstructor()));
9008   if (!Constructor)
9009     return ExprError();
9010 
9011   bool ArgumentChanged = false;
9012   SmallVector<Expr*, 8> Args;
9013   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9014                                   &ArgumentChanged))
9015     return ExprError();
9016 
9017   if (!getDerived().AlwaysRebuild() &&
9018       T == E->getType() &&
9019       Constructor == E->getConstructor() &&
9020       !ArgumentChanged) {
9021     // Mark the constructor as referenced.
9022     // FIXME: Instantiation-specific
9023     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9024     return E;
9025   }
9026 
9027   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
9028                                               Constructor, E->isElidable(),
9029                                               Args,
9030                                               E->hadMultipleCandidates(),
9031                                               E->isListInitialization(),
9032                                               E->isStdInitListInitialization(),
9033                                               E->requiresZeroInitialization(),
9034                                               E->getConstructionKind(),
9035                                               E->getParenOrBraceRange());
9036 }
9037 
9038 /// \brief Transform a C++ temporary-binding expression.
9039 ///
9040 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
9041 /// transform the subexpression and return that.
9042 template<typename Derived>
9043 ExprResult
9044 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
9045   return getDerived().TransformExpr(E->getSubExpr());
9046 }
9047 
9048 /// \brief Transform a C++ expression that contains cleanups that should
9049 /// be run after the expression is evaluated.
9050 ///
9051 /// Since ExprWithCleanups nodes are implicitly generated, we
9052 /// just transform the subexpression and return that.
9053 template<typename Derived>
9054 ExprResult
9055 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
9056   return getDerived().TransformExpr(E->getSubExpr());
9057 }
9058 
9059 template<typename Derived>
9060 ExprResult
9061 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
9062                                                     CXXTemporaryObjectExpr *E) {
9063   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9064   if (!T)
9065     return ExprError();
9066 
9067   CXXConstructorDecl *Constructor
9068     = cast_or_null<CXXConstructorDecl>(
9069                                   getDerived().TransformDecl(E->getLocStart(),
9070                                                          E->getConstructor()));
9071   if (!Constructor)
9072     return ExprError();
9073 
9074   bool ArgumentChanged = false;
9075   SmallVector<Expr*, 8> Args;
9076   Args.reserve(E->getNumArgs());
9077   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9078                      &ArgumentChanged))
9079     return ExprError();
9080 
9081   if (!getDerived().AlwaysRebuild() &&
9082       T == E->getTypeSourceInfo() &&
9083       Constructor == E->getConstructor() &&
9084       !ArgumentChanged) {
9085     // FIXME: Instantiation-specific
9086     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9087     return SemaRef.MaybeBindToTemporary(E);
9088   }
9089 
9090   // FIXME: Pass in E->isListInitialization().
9091   return getDerived().RebuildCXXTemporaryObjectExpr(T,
9092                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9093                                                     Args,
9094                                                     E->getLocEnd());
9095 }
9096 
9097 template<typename Derived>
9098 ExprResult
9099 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
9100   // Transform any init-capture expressions before entering the scope of the
9101   // lambda body, because they are not semantically within that scope.
9102   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
9103   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
9104       E->explicit_capture_begin());
9105   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9106                                     CEnd = E->capture_end();
9107        C != CEnd; ++C) {
9108     if (!C->isInitCapture())
9109       continue;
9110     EnterExpressionEvaluationContext EEEC(getSema(),
9111                                           Sema::PotentiallyEvaluated);
9112     ExprResult NewExprInitResult = getDerived().TransformInitializer(
9113         C->getCapturedVar()->getInit(),
9114         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
9115 
9116     if (NewExprInitResult.isInvalid())
9117       return ExprError();
9118     Expr *NewExprInit = NewExprInitResult.get();
9119 
9120     VarDecl *OldVD = C->getCapturedVar();
9121     QualType NewInitCaptureType =
9122         getSema().performLambdaInitCaptureInitialization(C->getLocation(),
9123             OldVD->getType()->isReferenceType(), OldVD->getIdentifier(),
9124             NewExprInit);
9125     NewExprInitResult = NewExprInit;
9126     InitCaptureExprsAndTypes[C - E->capture_begin()] =
9127         std::make_pair(NewExprInitResult, NewInitCaptureType);
9128   }
9129 
9130   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
9131   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
9132 
9133   // Transform the template parameters, and add them to the current
9134   // instantiation scope. The null case is handled correctly.
9135   LSI->GLTemplateParameterList = getDerived().TransformTemplateParameterList(
9136       E->getTemplateParameterList());
9137 
9138   // Transform the type of the original lambda's call operator.
9139   // The transformation MUST be done in the CurrentInstantiationScope since
9140   // it introduces a mapping of the original to the newly created
9141   // transformed parameters.
9142   TypeSourceInfo *NewCallOpTSI = nullptr;
9143   {
9144     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
9145     FunctionProtoTypeLoc OldCallOpFPTL =
9146         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
9147 
9148     TypeLocBuilder NewCallOpTLBuilder;
9149     SmallVector<QualType, 4> ExceptionStorage;
9150     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
9151     QualType NewCallOpType = TransformFunctionProtoType(
9152         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
9153         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
9154           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
9155                                               ExceptionStorage, Changed);
9156         });
9157     if (NewCallOpType.isNull())
9158       return ExprError();
9159     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
9160                                                         NewCallOpType);
9161   }
9162 
9163   // Create the local class that will describe the lambda.
9164   CXXRecordDecl *Class
9165     = getSema().createLambdaClosureType(E->getIntroducerRange(),
9166                                         NewCallOpTSI,
9167                                         /*KnownDependent=*/false,
9168                                         E->getCaptureDefault());
9169   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
9170 
9171   // Build the call operator.
9172   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
9173       Class, E->getIntroducerRange(), NewCallOpTSI,
9174       E->getCallOperator()->getLocEnd(),
9175       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams());
9176   LSI->CallOperator = NewCallOperator;
9177 
9178   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
9179 
9180   // TransformLambdaScope will manage the function scope, so we can disable the
9181   // cleanup.
9182   FuncScopeCleanup.disable();
9183 
9184   return getDerived().TransformLambdaScope(E, NewCallOperator,
9185       InitCaptureExprsAndTypes);
9186 }
9187 
9188 template<typename Derived>
9189 ExprResult
9190 TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E,
9191     CXXMethodDecl *CallOperator,
9192     ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes) {
9193   bool Invalid = false;
9194 
9195   // Introduce the context of the call operator.
9196   Sema::ContextRAII SavedContext(getSema(), CallOperator,
9197                                  /*NewThisContext*/false);
9198 
9199   LambdaScopeInfo *const LSI = getSema().getCurLambda();
9200   // Enter the scope of the lambda.
9201   getSema().buildLambdaScope(LSI, CallOperator, E->getIntroducerRange(),
9202                                  E->getCaptureDefault(),
9203                                  E->getCaptureDefaultLoc(),
9204                                  E->hasExplicitParameters(),
9205                                  E->hasExplicitResultType(),
9206                                  E->isMutable());
9207 
9208   // Transform captures.
9209   bool FinishedExplicitCaptures = false;
9210   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9211                                  CEnd = E->capture_end();
9212        C != CEnd; ++C) {
9213     // When we hit the first implicit capture, tell Sema that we've finished
9214     // the list of explicit captures.
9215     if (!FinishedExplicitCaptures && C->isImplicit()) {
9216       getSema().finishLambdaExplicitCaptures(LSI);
9217       FinishedExplicitCaptures = true;
9218     }
9219 
9220     // Capturing 'this' is trivial.
9221     if (C->capturesThis()) {
9222       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
9223       continue;
9224     }
9225     // Captured expression will be recaptured during captured variables
9226     // rebuilding.
9227     if (C->capturesVLAType())
9228       continue;
9229 
9230     // Rebuild init-captures, including the implied field declaration.
9231     if (C->isInitCapture()) {
9232 
9233       InitCaptureInfoTy InitExprTypePair =
9234           InitCaptureExprsAndTypes[C - E->capture_begin()];
9235       ExprResult Init = InitExprTypePair.first;
9236       QualType InitQualType = InitExprTypePair.second;
9237       if (Init.isInvalid() || InitQualType.isNull()) {
9238         Invalid = true;
9239         continue;
9240       }
9241       VarDecl *OldVD = C->getCapturedVar();
9242       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
9243           OldVD->getLocation(), InitExprTypePair.second,
9244           OldVD->getIdentifier(), Init.get());
9245       if (!NewVD)
9246         Invalid = true;
9247       else {
9248         getDerived().transformedLocalDecl(OldVD, NewVD);
9249       }
9250       getSema().buildInitCaptureField(LSI, NewVD);
9251       continue;
9252     }
9253 
9254     assert(C->capturesVariable() && "unexpected kind of lambda capture");
9255 
9256     // Determine the capture kind for Sema.
9257     Sema::TryCaptureKind Kind
9258       = C->isImplicit()? Sema::TryCapture_Implicit
9259                        : C->getCaptureKind() == LCK_ByCopy
9260                            ? Sema::TryCapture_ExplicitByVal
9261                            : Sema::TryCapture_ExplicitByRef;
9262     SourceLocation EllipsisLoc;
9263     if (C->isPackExpansion()) {
9264       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
9265       bool ShouldExpand = false;
9266       bool RetainExpansion = false;
9267       Optional<unsigned> NumExpansions;
9268       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
9269                                                C->getLocation(),
9270                                                Unexpanded,
9271                                                ShouldExpand, RetainExpansion,
9272                                                NumExpansions)) {
9273         Invalid = true;
9274         continue;
9275       }
9276 
9277       if (ShouldExpand) {
9278         // The transform has determined that we should perform an expansion;
9279         // transform and capture each of the arguments.
9280         // expansion of the pattern. Do so.
9281         VarDecl *Pack = C->getCapturedVar();
9282         for (unsigned I = 0; I != *NumExpansions; ++I) {
9283           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9284           VarDecl *CapturedVar
9285             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9286                                                                Pack));
9287           if (!CapturedVar) {
9288             Invalid = true;
9289             continue;
9290           }
9291 
9292           // Capture the transformed variable.
9293           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9294         }
9295 
9296         // FIXME: Retain a pack expansion if RetainExpansion is true.
9297 
9298         continue;
9299       }
9300 
9301       EllipsisLoc = C->getEllipsisLoc();
9302     }
9303 
9304     // Transform the captured variable.
9305     VarDecl *CapturedVar
9306       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9307                                                          C->getCapturedVar()));
9308     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
9309       Invalid = true;
9310       continue;
9311     }
9312 
9313     // Capture the transformed variable.
9314     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9315   }
9316   if (!FinishedExplicitCaptures)
9317     getSema().finishLambdaExplicitCaptures(LSI);
9318 
9319 
9320   // Enter a new evaluation context to insulate the lambda from any
9321   // cleanups from the enclosing full-expression.
9322   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
9323 
9324   if (Invalid) {
9325     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9326                                /*IsInstantiation=*/true);
9327     return ExprError();
9328   }
9329 
9330   // Instantiate the body of the lambda expression.
9331   StmtResult Body = getDerived().TransformStmt(E->getBody());
9332   if (Body.isInvalid()) {
9333     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9334                                /*IsInstantiation=*/true);
9335     return ExprError();
9336   }
9337 
9338   return getSema().ActOnLambdaExpr(E->getLocStart(), Body.get(),
9339                                    /*CurScope=*/nullptr,
9340                                    /*IsInstantiation=*/true);
9341 }
9342 
9343 template<typename Derived>
9344 ExprResult
9345 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
9346                                                   CXXUnresolvedConstructExpr *E) {
9347   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9348   if (!T)
9349     return ExprError();
9350 
9351   bool ArgumentChanged = false;
9352   SmallVector<Expr*, 8> Args;
9353   Args.reserve(E->arg_size());
9354   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
9355                                   &ArgumentChanged))
9356     return ExprError();
9357 
9358   if (!getDerived().AlwaysRebuild() &&
9359       T == E->getTypeSourceInfo() &&
9360       !ArgumentChanged)
9361     return E;
9362 
9363   // FIXME: we're faking the locations of the commas
9364   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
9365                                                         E->getLParenLoc(),
9366                                                         Args,
9367                                                         E->getRParenLoc());
9368 }
9369 
9370 template<typename Derived>
9371 ExprResult
9372 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
9373                                              CXXDependentScopeMemberExpr *E) {
9374   // Transform the base of the expression.
9375   ExprResult Base((Expr*) nullptr);
9376   Expr *OldBase;
9377   QualType BaseType;
9378   QualType ObjectType;
9379   if (!E->isImplicitAccess()) {
9380     OldBase = E->getBase();
9381     Base = getDerived().TransformExpr(OldBase);
9382     if (Base.isInvalid())
9383       return ExprError();
9384 
9385     // Start the member reference and compute the object's type.
9386     ParsedType ObjectTy;
9387     bool MayBePseudoDestructor = false;
9388     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9389                                                 E->getOperatorLoc(),
9390                                       E->isArrow()? tok::arrow : tok::period,
9391                                                 ObjectTy,
9392                                                 MayBePseudoDestructor);
9393     if (Base.isInvalid())
9394       return ExprError();
9395 
9396     ObjectType = ObjectTy.get();
9397     BaseType = ((Expr*) Base.get())->getType();
9398   } else {
9399     OldBase = nullptr;
9400     BaseType = getDerived().TransformType(E->getBaseType());
9401     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
9402   }
9403 
9404   // Transform the first part of the nested-name-specifier that qualifies
9405   // the member name.
9406   NamedDecl *FirstQualifierInScope
9407     = getDerived().TransformFirstQualifierInScope(
9408                                             E->getFirstQualifierFoundInScope(),
9409                                             E->getQualifierLoc().getBeginLoc());
9410 
9411   NestedNameSpecifierLoc QualifierLoc;
9412   if (E->getQualifier()) {
9413     QualifierLoc
9414       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
9415                                                      ObjectType,
9416                                                      FirstQualifierInScope);
9417     if (!QualifierLoc)
9418       return ExprError();
9419   }
9420 
9421   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9422 
9423   // TODO: If this is a conversion-function-id, verify that the
9424   // destination type name (if present) resolves the same way after
9425   // instantiation as it did in the local scope.
9426 
9427   DeclarationNameInfo NameInfo
9428     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
9429   if (!NameInfo.getName())
9430     return ExprError();
9431 
9432   if (!E->hasExplicitTemplateArgs()) {
9433     // This is a reference to a member without an explicitly-specified
9434     // template argument list. Optimize for this common case.
9435     if (!getDerived().AlwaysRebuild() &&
9436         Base.get() == OldBase &&
9437         BaseType == E->getBaseType() &&
9438         QualifierLoc == E->getQualifierLoc() &&
9439         NameInfo.getName() == E->getMember() &&
9440         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
9441       return E;
9442 
9443     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9444                                                        BaseType,
9445                                                        E->isArrow(),
9446                                                        E->getOperatorLoc(),
9447                                                        QualifierLoc,
9448                                                        TemplateKWLoc,
9449                                                        FirstQualifierInScope,
9450                                                        NameInfo,
9451                                                        /*TemplateArgs*/nullptr);
9452   }
9453 
9454   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9455   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9456                                               E->getNumTemplateArgs(),
9457                                               TransArgs))
9458     return ExprError();
9459 
9460   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9461                                                      BaseType,
9462                                                      E->isArrow(),
9463                                                      E->getOperatorLoc(),
9464                                                      QualifierLoc,
9465                                                      TemplateKWLoc,
9466                                                      FirstQualifierInScope,
9467                                                      NameInfo,
9468                                                      &TransArgs);
9469 }
9470 
9471 template<typename Derived>
9472 ExprResult
9473 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
9474   // Transform the base of the expression.
9475   ExprResult Base((Expr*) nullptr);
9476   QualType BaseType;
9477   if (!Old->isImplicitAccess()) {
9478     Base = getDerived().TransformExpr(Old->getBase());
9479     if (Base.isInvalid())
9480       return ExprError();
9481     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
9482                                                      Old->isArrow());
9483     if (Base.isInvalid())
9484       return ExprError();
9485     BaseType = Base.get()->getType();
9486   } else {
9487     BaseType = getDerived().TransformType(Old->getBaseType());
9488   }
9489 
9490   NestedNameSpecifierLoc QualifierLoc;
9491   if (Old->getQualifierLoc()) {
9492     QualifierLoc
9493     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9494     if (!QualifierLoc)
9495       return ExprError();
9496   }
9497 
9498   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9499 
9500   LookupResult R(SemaRef, Old->getMemberNameInfo(),
9501                  Sema::LookupOrdinaryName);
9502 
9503   // Transform all the decls.
9504   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
9505          E = Old->decls_end(); I != E; ++I) {
9506     NamedDecl *InstD = static_cast<NamedDecl*>(
9507                                 getDerived().TransformDecl(Old->getMemberLoc(),
9508                                                            *I));
9509     if (!InstD) {
9510       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9511       // This can happen because of dependent hiding.
9512       if (isa<UsingShadowDecl>(*I))
9513         continue;
9514       else {
9515         R.clear();
9516         return ExprError();
9517       }
9518     }
9519 
9520     // Expand using declarations.
9521     if (isa<UsingDecl>(InstD)) {
9522       UsingDecl *UD = cast<UsingDecl>(InstD);
9523       for (auto *I : UD->shadows())
9524         R.addDecl(I);
9525       continue;
9526     }
9527 
9528     R.addDecl(InstD);
9529   }
9530 
9531   R.resolveKind();
9532 
9533   // Determine the naming class.
9534   if (Old->getNamingClass()) {
9535     CXXRecordDecl *NamingClass
9536       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9537                                                           Old->getMemberLoc(),
9538                                                         Old->getNamingClass()));
9539     if (!NamingClass)
9540       return ExprError();
9541 
9542     R.setNamingClass(NamingClass);
9543   }
9544 
9545   TemplateArgumentListInfo TransArgs;
9546   if (Old->hasExplicitTemplateArgs()) {
9547     TransArgs.setLAngleLoc(Old->getLAngleLoc());
9548     TransArgs.setRAngleLoc(Old->getRAngleLoc());
9549     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9550                                                 Old->getNumTemplateArgs(),
9551                                                 TransArgs))
9552       return ExprError();
9553   }
9554 
9555   // FIXME: to do this check properly, we will need to preserve the
9556   // first-qualifier-in-scope here, just in case we had a dependent
9557   // base (and therefore couldn't do the check) and a
9558   // nested-name-qualifier (and therefore could do the lookup).
9559   NamedDecl *FirstQualifierInScope = nullptr;
9560 
9561   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
9562                                                   BaseType,
9563                                                   Old->getOperatorLoc(),
9564                                                   Old->isArrow(),
9565                                                   QualifierLoc,
9566                                                   TemplateKWLoc,
9567                                                   FirstQualifierInScope,
9568                                                   R,
9569                                               (Old->hasExplicitTemplateArgs()
9570                                                   ? &TransArgs : nullptr));
9571 }
9572 
9573 template<typename Derived>
9574 ExprResult
9575 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
9576   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9577   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
9578   if (SubExpr.isInvalid())
9579     return ExprError();
9580 
9581   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
9582     return E;
9583 
9584   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
9585 }
9586 
9587 template<typename Derived>
9588 ExprResult
9589 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
9590   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
9591   if (Pattern.isInvalid())
9592     return ExprError();
9593 
9594   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
9595     return E;
9596 
9597   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
9598                                            E->getNumExpansions());
9599 }
9600 
9601 template<typename Derived>
9602 ExprResult
9603 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
9604   // If E is not value-dependent, then nothing will change when we transform it.
9605   // Note: This is an instantiation-centric view.
9606   if (!E->isValueDependent())
9607     return E;
9608 
9609   // Note: None of the implementations of TryExpandParameterPacks can ever
9610   // produce a diagnostic when given only a single unexpanded parameter pack,
9611   // so
9612   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
9613   bool ShouldExpand = false;
9614   bool RetainExpansion = false;
9615   Optional<unsigned> NumExpansions;
9616   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
9617                                            Unexpanded,
9618                                            ShouldExpand, RetainExpansion,
9619                                            NumExpansions))
9620     return ExprError();
9621 
9622   if (RetainExpansion)
9623     return E;
9624 
9625   NamedDecl *Pack = E->getPack();
9626   if (!ShouldExpand) {
9627     Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(),
9628                                                               Pack));
9629     if (!Pack)
9630       return ExprError();
9631   }
9632 
9633 
9634   // We now know the length of the parameter pack, so build a new expression
9635   // that stores that length.
9636   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
9637                                             E->getPackLoc(), E->getRParenLoc(),
9638                                             NumExpansions);
9639 }
9640 
9641 template<typename Derived>
9642 ExprResult
9643 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
9644                                           SubstNonTypeTemplateParmPackExpr *E) {
9645   // Default behavior is to do nothing with this transformation.
9646   return E;
9647 }
9648 
9649 template<typename Derived>
9650 ExprResult
9651 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
9652                                           SubstNonTypeTemplateParmExpr *E) {
9653   // Default behavior is to do nothing with this transformation.
9654   return E;
9655 }
9656 
9657 template<typename Derived>
9658 ExprResult
9659 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
9660   // Default behavior is to do nothing with this transformation.
9661   return E;
9662 }
9663 
9664 template<typename Derived>
9665 ExprResult
9666 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
9667                                                   MaterializeTemporaryExpr *E) {
9668   return getDerived().TransformExpr(E->GetTemporaryExpr());
9669 }
9670 
9671 template<typename Derived>
9672 ExprResult
9673 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
9674   Expr *Pattern = E->getPattern();
9675 
9676   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9677   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
9678   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9679 
9680   // Determine whether the set of unexpanded parameter packs can and should
9681   // be expanded.
9682   bool Expand = true;
9683   bool RetainExpansion = false;
9684   Optional<unsigned> NumExpansions;
9685   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
9686                                            Pattern->getSourceRange(),
9687                                            Unexpanded,
9688                                            Expand, RetainExpansion,
9689                                            NumExpansions))
9690     return true;
9691 
9692   if (!Expand) {
9693     // Do not expand any packs here, just transform and rebuild a fold
9694     // expression.
9695     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9696 
9697     ExprResult LHS =
9698         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
9699     if (LHS.isInvalid())
9700       return true;
9701 
9702     ExprResult RHS =
9703         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
9704     if (RHS.isInvalid())
9705       return true;
9706 
9707     if (!getDerived().AlwaysRebuild() &&
9708         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
9709       return E;
9710 
9711     return getDerived().RebuildCXXFoldExpr(
9712         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
9713         RHS.get(), E->getLocEnd());
9714   }
9715 
9716   // The transform has determined that we should perform an elementwise
9717   // expansion of the pattern. Do so.
9718   ExprResult Result = getDerived().TransformExpr(E->getInit());
9719   if (Result.isInvalid())
9720     return true;
9721   bool LeftFold = E->isLeftFold();
9722 
9723   // If we're retaining an expansion for a right fold, it is the innermost
9724   // component and takes the init (if any).
9725   if (!LeftFold && RetainExpansion) {
9726     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9727 
9728     ExprResult Out = getDerived().TransformExpr(Pattern);
9729     if (Out.isInvalid())
9730       return true;
9731 
9732     Result = getDerived().RebuildCXXFoldExpr(
9733         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
9734         Result.get(), E->getLocEnd());
9735     if (Result.isInvalid())
9736       return true;
9737   }
9738 
9739   for (unsigned I = 0; I != *NumExpansions; ++I) {
9740     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
9741         getSema(), LeftFold ? I : *NumExpansions - I - 1);
9742     ExprResult Out = getDerived().TransformExpr(Pattern);
9743     if (Out.isInvalid())
9744       return true;
9745 
9746     if (Out.get()->containsUnexpandedParameterPack()) {
9747       // We still have a pack; retain a pack expansion for this slice.
9748       Result = getDerived().RebuildCXXFoldExpr(
9749           E->getLocStart(),
9750           LeftFold ? Result.get() : Out.get(),
9751           E->getOperator(), E->getEllipsisLoc(),
9752           LeftFold ? Out.get() : Result.get(),
9753           E->getLocEnd());
9754     } else if (Result.isUsable()) {
9755       // We've got down to a single element; build a binary operator.
9756       Result = getDerived().RebuildBinaryOperator(
9757           E->getEllipsisLoc(), E->getOperator(),
9758           LeftFold ? Result.get() : Out.get(),
9759           LeftFold ? Out.get() : Result.get());
9760     } else
9761       Result = Out;
9762 
9763     if (Result.isInvalid())
9764       return true;
9765   }
9766 
9767   // If we're retaining an expansion for a left fold, it is the outermost
9768   // component and takes the complete expansion so far as its init (if any).
9769   if (LeftFold && RetainExpansion) {
9770     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9771 
9772     ExprResult Out = getDerived().TransformExpr(Pattern);
9773     if (Out.isInvalid())
9774       return true;
9775 
9776     Result = getDerived().RebuildCXXFoldExpr(
9777         E->getLocStart(), Result.get(),
9778         E->getOperator(), E->getEllipsisLoc(),
9779         Out.get(), E->getLocEnd());
9780     if (Result.isInvalid())
9781       return true;
9782   }
9783 
9784   // If we had no init and an empty pack, and we're not retaining an expansion,
9785   // then produce a fallback value or error.
9786   if (Result.isUnset())
9787     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
9788                                                 E->getOperator());
9789 
9790   return Result;
9791 }
9792 
9793 template<typename Derived>
9794 ExprResult
9795 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
9796     CXXStdInitializerListExpr *E) {
9797   return getDerived().TransformExpr(E->getSubExpr());
9798 }
9799 
9800 template<typename Derived>
9801 ExprResult
9802 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
9803   return SemaRef.MaybeBindToTemporary(E);
9804 }
9805 
9806 template<typename Derived>
9807 ExprResult
9808 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
9809   return E;
9810 }
9811 
9812 template<typename Derived>
9813 ExprResult
9814 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
9815   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9816   if (SubExpr.isInvalid())
9817     return ExprError();
9818 
9819   if (!getDerived().AlwaysRebuild() &&
9820       SubExpr.get() == E->getSubExpr())
9821     return E;
9822 
9823   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
9824 }
9825 
9826 template<typename Derived>
9827 ExprResult
9828 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
9829   // Transform each of the elements.
9830   SmallVector<Expr *, 8> Elements;
9831   bool ArgChanged = false;
9832   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
9833                                   /*IsCall=*/false, Elements, &ArgChanged))
9834     return ExprError();
9835 
9836   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9837     return SemaRef.MaybeBindToTemporary(E);
9838 
9839   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
9840                                               Elements.data(),
9841                                               Elements.size());
9842 }
9843 
9844 template<typename Derived>
9845 ExprResult
9846 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
9847                                                     ObjCDictionaryLiteral *E) {
9848   // Transform each of the elements.
9849   SmallVector<ObjCDictionaryElement, 8> Elements;
9850   bool ArgChanged = false;
9851   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
9852     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
9853 
9854     if (OrigElement.isPackExpansion()) {
9855       // This key/value element is a pack expansion.
9856       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9857       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
9858       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
9859       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9860 
9861       // Determine whether the set of unexpanded parameter packs can
9862       // and should be expanded.
9863       bool Expand = true;
9864       bool RetainExpansion = false;
9865       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
9866       Optional<unsigned> NumExpansions = OrigNumExpansions;
9867       SourceRange PatternRange(OrigElement.Key->getLocStart(),
9868                                OrigElement.Value->getLocEnd());
9869      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
9870                                                PatternRange,
9871                                                Unexpanded,
9872                                                Expand, RetainExpansion,
9873                                                NumExpansions))
9874         return ExprError();
9875 
9876       if (!Expand) {
9877         // The transform has determined that we should perform a simple
9878         // transformation on the pack expansion, producing another pack
9879         // expansion.
9880         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9881         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9882         if (Key.isInvalid())
9883           return ExprError();
9884 
9885         if (Key.get() != OrigElement.Key)
9886           ArgChanged = true;
9887 
9888         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9889         if (Value.isInvalid())
9890           return ExprError();
9891 
9892         if (Value.get() != OrigElement.Value)
9893           ArgChanged = true;
9894 
9895         ObjCDictionaryElement Expansion = {
9896           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
9897         };
9898         Elements.push_back(Expansion);
9899         continue;
9900       }
9901 
9902       // Record right away that the argument was changed.  This needs
9903       // to happen even if the array expands to nothing.
9904       ArgChanged = true;
9905 
9906       // The transform has determined that we should perform an elementwise
9907       // expansion of the pattern. Do so.
9908       for (unsigned I = 0; I != *NumExpansions; ++I) {
9909         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9910         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9911         if (Key.isInvalid())
9912           return ExprError();
9913 
9914         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9915         if (Value.isInvalid())
9916           return ExprError();
9917 
9918         ObjCDictionaryElement Element = {
9919           Key.get(), Value.get(), SourceLocation(), NumExpansions
9920         };
9921 
9922         // If any unexpanded parameter packs remain, we still have a
9923         // pack expansion.
9924         // FIXME: Can this really happen?
9925         if (Key.get()->containsUnexpandedParameterPack() ||
9926             Value.get()->containsUnexpandedParameterPack())
9927           Element.EllipsisLoc = OrigElement.EllipsisLoc;
9928 
9929         Elements.push_back(Element);
9930       }
9931 
9932       // FIXME: Retain a pack expansion if RetainExpansion is true.
9933 
9934       // We've finished with this pack expansion.
9935       continue;
9936     }
9937 
9938     // Transform and check key.
9939     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9940     if (Key.isInvalid())
9941       return ExprError();
9942 
9943     if (Key.get() != OrigElement.Key)
9944       ArgChanged = true;
9945 
9946     // Transform and check value.
9947     ExprResult Value
9948       = getDerived().TransformExpr(OrigElement.Value);
9949     if (Value.isInvalid())
9950       return ExprError();
9951 
9952     if (Value.get() != OrigElement.Value)
9953       ArgChanged = true;
9954 
9955     ObjCDictionaryElement Element = {
9956       Key.get(), Value.get(), SourceLocation(), None
9957     };
9958     Elements.push_back(Element);
9959   }
9960 
9961   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9962     return SemaRef.MaybeBindToTemporary(E);
9963 
9964   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
9965                                                    Elements.data(),
9966                                                    Elements.size());
9967 }
9968 
9969 template<typename Derived>
9970 ExprResult
9971 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
9972   TypeSourceInfo *EncodedTypeInfo
9973     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
9974   if (!EncodedTypeInfo)
9975     return ExprError();
9976 
9977   if (!getDerived().AlwaysRebuild() &&
9978       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
9979     return E;
9980 
9981   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
9982                                             EncodedTypeInfo,
9983                                             E->getRParenLoc());
9984 }
9985 
9986 template<typename Derived>
9987 ExprResult TreeTransform<Derived>::
9988 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
9989   // This is a kind of implicit conversion, and it needs to get dropped
9990   // and recomputed for the same general reasons that ImplicitCastExprs
9991   // do, as well a more specific one: this expression is only valid when
9992   // it appears *immediately* as an argument expression.
9993   return getDerived().TransformExpr(E->getSubExpr());
9994 }
9995 
9996 template<typename Derived>
9997 ExprResult TreeTransform<Derived>::
9998 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
9999   TypeSourceInfo *TSInfo
10000     = getDerived().TransformType(E->getTypeInfoAsWritten());
10001   if (!TSInfo)
10002     return ExprError();
10003 
10004   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
10005   if (Result.isInvalid())
10006     return ExprError();
10007 
10008   if (!getDerived().AlwaysRebuild() &&
10009       TSInfo == E->getTypeInfoAsWritten() &&
10010       Result.get() == E->getSubExpr())
10011     return E;
10012 
10013   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
10014                                       E->getBridgeKeywordLoc(), TSInfo,
10015                                       Result.get());
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult
10020 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
10021   // Transform arguments.
10022   bool ArgChanged = false;
10023   SmallVector<Expr*, 8> Args;
10024   Args.reserve(E->getNumArgs());
10025   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
10026                                   &ArgChanged))
10027     return ExprError();
10028 
10029   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
10030     // Class message: transform the receiver type.
10031     TypeSourceInfo *ReceiverTypeInfo
10032       = getDerived().TransformType(E->getClassReceiverTypeInfo());
10033     if (!ReceiverTypeInfo)
10034       return ExprError();
10035 
10036     // If nothing changed, just retain the existing message send.
10037     if (!getDerived().AlwaysRebuild() &&
10038         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
10039       return SemaRef.MaybeBindToTemporary(E);
10040 
10041     // Build a new class message send.
10042     SmallVector<SourceLocation, 16> SelLocs;
10043     E->getSelectorLocs(SelLocs);
10044     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
10045                                                E->getSelector(),
10046                                                SelLocs,
10047                                                E->getMethodDecl(),
10048                                                E->getLeftLoc(),
10049                                                Args,
10050                                                E->getRightLoc());
10051   }
10052 
10053   // Instance message: transform the receiver
10054   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
10055          "Only class and instance messages may be instantiated");
10056   ExprResult Receiver
10057     = getDerived().TransformExpr(E->getInstanceReceiver());
10058   if (Receiver.isInvalid())
10059     return ExprError();
10060 
10061   // If nothing changed, just retain the existing message send.
10062   if (!getDerived().AlwaysRebuild() &&
10063       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
10064     return SemaRef.MaybeBindToTemporary(E);
10065 
10066   // Build a new instance message send.
10067   SmallVector<SourceLocation, 16> SelLocs;
10068   E->getSelectorLocs(SelLocs);
10069   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
10070                                              E->getSelector(),
10071                                              SelLocs,
10072                                              E->getMethodDecl(),
10073                                              E->getLeftLoc(),
10074                                              Args,
10075                                              E->getRightLoc());
10076 }
10077 
10078 template<typename Derived>
10079 ExprResult
10080 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
10081   return E;
10082 }
10083 
10084 template<typename Derived>
10085 ExprResult
10086 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
10087   return E;
10088 }
10089 
10090 template<typename Derived>
10091 ExprResult
10092 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
10093   // Transform the base expression.
10094   ExprResult Base = getDerived().TransformExpr(E->getBase());
10095   if (Base.isInvalid())
10096     return ExprError();
10097 
10098   // We don't need to transform the ivar; it will never change.
10099 
10100   // If nothing changed, just retain the existing expression.
10101   if (!getDerived().AlwaysRebuild() &&
10102       Base.get() == E->getBase())
10103     return E;
10104 
10105   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
10106                                              E->getLocation(),
10107                                              E->isArrow(), E->isFreeIvar());
10108 }
10109 
10110 template<typename Derived>
10111 ExprResult
10112 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
10113   // 'super' and types never change. Property never changes. Just
10114   // retain the existing expression.
10115   if (!E->isObjectReceiver())
10116     return E;
10117 
10118   // Transform the base expression.
10119   ExprResult Base = getDerived().TransformExpr(E->getBase());
10120   if (Base.isInvalid())
10121     return ExprError();
10122 
10123   // We don't need to transform the property; it will never change.
10124 
10125   // If nothing changed, just retain the existing expression.
10126   if (!getDerived().AlwaysRebuild() &&
10127       Base.get() == E->getBase())
10128     return E;
10129 
10130   if (E->isExplicitProperty())
10131     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10132                                                    E->getExplicitProperty(),
10133                                                    E->getLocation());
10134 
10135   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10136                                                  SemaRef.Context.PseudoObjectTy,
10137                                                  E->getImplicitPropertyGetter(),
10138                                                  E->getImplicitPropertySetter(),
10139                                                  E->getLocation());
10140 }
10141 
10142 template<typename Derived>
10143 ExprResult
10144 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
10145   // Transform the base expression.
10146   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
10147   if (Base.isInvalid())
10148     return ExprError();
10149 
10150   // Transform the key expression.
10151   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
10152   if (Key.isInvalid())
10153     return ExprError();
10154 
10155   // If nothing changed, just retain the existing expression.
10156   if (!getDerived().AlwaysRebuild() &&
10157       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
10158     return E;
10159 
10160   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
10161                                                   Base.get(), Key.get(),
10162                                                   E->getAtIndexMethodDecl(),
10163                                                   E->setAtIndexMethodDecl());
10164 }
10165 
10166 template<typename Derived>
10167 ExprResult
10168 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
10169   // Transform the base expression.
10170   ExprResult Base = getDerived().TransformExpr(E->getBase());
10171   if (Base.isInvalid())
10172     return ExprError();
10173 
10174   // If nothing changed, just retain the existing expression.
10175   if (!getDerived().AlwaysRebuild() &&
10176       Base.get() == E->getBase())
10177     return E;
10178 
10179   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
10180                                          E->getOpLoc(),
10181                                          E->isArrow());
10182 }
10183 
10184 template<typename Derived>
10185 ExprResult
10186 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
10187   bool ArgumentChanged = false;
10188   SmallVector<Expr*, 8> SubExprs;
10189   SubExprs.reserve(E->getNumSubExprs());
10190   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10191                                   SubExprs, &ArgumentChanged))
10192     return ExprError();
10193 
10194   if (!getDerived().AlwaysRebuild() &&
10195       !ArgumentChanged)
10196     return E;
10197 
10198   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
10199                                                SubExprs,
10200                                                E->getRParenLoc());
10201 }
10202 
10203 template<typename Derived>
10204 ExprResult
10205 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
10206   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
10207   if (SrcExpr.isInvalid())
10208     return ExprError();
10209 
10210   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10211   if (!Type)
10212     return ExprError();
10213 
10214   if (!getDerived().AlwaysRebuild() &&
10215       Type == E->getTypeSourceInfo() &&
10216       SrcExpr.get() == E->getSrcExpr())
10217     return E;
10218 
10219   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
10220                                                SrcExpr.get(), Type,
10221                                                E->getRParenLoc());
10222 }
10223 
10224 template<typename Derived>
10225 ExprResult
10226 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
10227   BlockDecl *oldBlock = E->getBlockDecl();
10228 
10229   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
10230   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
10231 
10232   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
10233   blockScope->TheDecl->setBlockMissingReturnType(
10234                          oldBlock->blockMissingReturnType());
10235 
10236   SmallVector<ParmVarDecl*, 4> params;
10237   SmallVector<QualType, 4> paramTypes;
10238 
10239   // Parameter substitution.
10240   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
10241                                                oldBlock->param_begin(),
10242                                                oldBlock->param_size(),
10243                                                nullptr, paramTypes, &params)) {
10244     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10245     return ExprError();
10246   }
10247 
10248   const FunctionProtoType *exprFunctionType = E->getFunctionType();
10249   QualType exprResultType =
10250       getDerived().TransformType(exprFunctionType->getReturnType());
10251 
10252   QualType functionType =
10253     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes,
10254                                           exprFunctionType->getExtProtoInfo());
10255   blockScope->FunctionType = functionType;
10256 
10257   // Set the parameters on the block decl.
10258   if (!params.empty())
10259     blockScope->TheDecl->setParams(params);
10260 
10261   if (!oldBlock->blockMissingReturnType()) {
10262     blockScope->HasImplicitReturnType = false;
10263     blockScope->ReturnType = exprResultType;
10264   }
10265 
10266   // Transform the body
10267   StmtResult body = getDerived().TransformStmt(E->getBody());
10268   if (body.isInvalid()) {
10269     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10270     return ExprError();
10271   }
10272 
10273 #ifndef NDEBUG
10274   // In builds with assertions, make sure that we captured everything we
10275   // captured before.
10276   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
10277     for (const auto &I : oldBlock->captures()) {
10278       VarDecl *oldCapture = I.getVariable();
10279 
10280       // Ignore parameter packs.
10281       if (isa<ParmVarDecl>(oldCapture) &&
10282           cast<ParmVarDecl>(oldCapture)->isParameterPack())
10283         continue;
10284 
10285       VarDecl *newCapture =
10286         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
10287                                                  oldCapture));
10288       assert(blockScope->CaptureMap.count(newCapture));
10289     }
10290     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
10291   }
10292 #endif
10293 
10294   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
10295                                     /*Scope=*/nullptr);
10296 }
10297 
10298 template<typename Derived>
10299 ExprResult
10300 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
10301   llvm_unreachable("Cannot transform asType expressions yet");
10302 }
10303 
10304 template<typename Derived>
10305 ExprResult
10306 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
10307   QualType RetTy = getDerived().TransformType(E->getType());
10308   bool ArgumentChanged = false;
10309   SmallVector<Expr*, 8> SubExprs;
10310   SubExprs.reserve(E->getNumSubExprs());
10311   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10312                                   SubExprs, &ArgumentChanged))
10313     return ExprError();
10314 
10315   if (!getDerived().AlwaysRebuild() &&
10316       !ArgumentChanged)
10317     return E;
10318 
10319   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
10320                                         RetTy, E->getOp(), E->getRParenLoc());
10321 }
10322 
10323 //===----------------------------------------------------------------------===//
10324 // Type reconstruction
10325 //===----------------------------------------------------------------------===//
10326 
10327 template<typename Derived>
10328 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
10329                                                     SourceLocation Star) {
10330   return SemaRef.BuildPointerType(PointeeType, Star,
10331                                   getDerived().getBaseEntity());
10332 }
10333 
10334 template<typename Derived>
10335 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
10336                                                          SourceLocation Star) {
10337   return SemaRef.BuildBlockPointerType(PointeeType, Star,
10338                                        getDerived().getBaseEntity());
10339 }
10340 
10341 template<typename Derived>
10342 QualType
10343 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
10344                                              bool WrittenAsLValue,
10345                                              SourceLocation Sigil) {
10346   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
10347                                     Sigil, getDerived().getBaseEntity());
10348 }
10349 
10350 template<typename Derived>
10351 QualType
10352 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
10353                                                  QualType ClassType,
10354                                                  SourceLocation Sigil) {
10355   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
10356                                         getDerived().getBaseEntity());
10357 }
10358 
10359 template<typename Derived>
10360 QualType
10361 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
10362                                          ArrayType::ArraySizeModifier SizeMod,
10363                                          const llvm::APInt *Size,
10364                                          Expr *SizeExpr,
10365                                          unsigned IndexTypeQuals,
10366                                          SourceRange BracketsRange) {
10367   if (SizeExpr || !Size)
10368     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
10369                                   IndexTypeQuals, BracketsRange,
10370                                   getDerived().getBaseEntity());
10371 
10372   QualType Types[] = {
10373     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
10374     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
10375     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
10376   };
10377   const unsigned NumTypes = llvm::array_lengthof(Types);
10378   QualType SizeType;
10379   for (unsigned I = 0; I != NumTypes; ++I)
10380     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
10381       SizeType = Types[I];
10382       break;
10383     }
10384 
10385   // Note that we can return a VariableArrayType here in the case where
10386   // the element type was a dependent VariableArrayType.
10387   IntegerLiteral *ArraySize
10388       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
10389                                /*FIXME*/BracketsRange.getBegin());
10390   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
10391                                 IndexTypeQuals, BracketsRange,
10392                                 getDerived().getBaseEntity());
10393 }
10394 
10395 template<typename Derived>
10396 QualType
10397 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
10398                                                  ArrayType::ArraySizeModifier SizeMod,
10399                                                  const llvm::APInt &Size,
10400                                                  unsigned IndexTypeQuals,
10401                                                  SourceRange BracketsRange) {
10402   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
10403                                         IndexTypeQuals, BracketsRange);
10404 }
10405 
10406 template<typename Derived>
10407 QualType
10408 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
10409                                           ArrayType::ArraySizeModifier SizeMod,
10410                                                  unsigned IndexTypeQuals,
10411                                                    SourceRange BracketsRange) {
10412   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
10413                                        IndexTypeQuals, BracketsRange);
10414 }
10415 
10416 template<typename Derived>
10417 QualType
10418 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
10419                                           ArrayType::ArraySizeModifier SizeMod,
10420                                                  Expr *SizeExpr,
10421                                                  unsigned IndexTypeQuals,
10422                                                  SourceRange BracketsRange) {
10423   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10424                                        SizeExpr,
10425                                        IndexTypeQuals, BracketsRange);
10426 }
10427 
10428 template<typename Derived>
10429 QualType
10430 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
10431                                           ArrayType::ArraySizeModifier SizeMod,
10432                                                        Expr *SizeExpr,
10433                                                        unsigned IndexTypeQuals,
10434                                                    SourceRange BracketsRange) {
10435   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10436                                        SizeExpr,
10437                                        IndexTypeQuals, BracketsRange);
10438 }
10439 
10440 template<typename Derived>
10441 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
10442                                                unsigned NumElements,
10443                                                VectorType::VectorKind VecKind) {
10444   // FIXME: semantic checking!
10445   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
10446 }
10447 
10448 template<typename Derived>
10449 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
10450                                                       unsigned NumElements,
10451                                                  SourceLocation AttributeLoc) {
10452   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
10453                           NumElements, true);
10454   IntegerLiteral *VectorSize
10455     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
10456                              AttributeLoc);
10457   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
10458 }
10459 
10460 template<typename Derived>
10461 QualType
10462 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
10463                                                            Expr *SizeExpr,
10464                                                   SourceLocation AttributeLoc) {
10465   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
10466 }
10467 
10468 template<typename Derived>
10469 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
10470     QualType T,
10471     MutableArrayRef<QualType> ParamTypes,
10472     const FunctionProtoType::ExtProtoInfo &EPI) {
10473   return SemaRef.BuildFunctionType(T, ParamTypes,
10474                                    getDerived().getBaseLocation(),
10475                                    getDerived().getBaseEntity(),
10476                                    EPI);
10477 }
10478 
10479 template<typename Derived>
10480 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
10481   return SemaRef.Context.getFunctionNoProtoType(T);
10482 }
10483 
10484 template<typename Derived>
10485 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
10486   assert(D && "no decl found");
10487   if (D->isInvalidDecl()) return QualType();
10488 
10489   // FIXME: Doesn't account for ObjCInterfaceDecl!
10490   TypeDecl *Ty;
10491   if (isa<UsingDecl>(D)) {
10492     UsingDecl *Using = cast<UsingDecl>(D);
10493     assert(Using->hasTypename() &&
10494            "UnresolvedUsingTypenameDecl transformed to non-typename using");
10495 
10496     // A valid resolved using typename decl points to exactly one type decl.
10497     assert(++Using->shadow_begin() == Using->shadow_end());
10498     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
10499 
10500   } else {
10501     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
10502            "UnresolvedUsingTypenameDecl transformed to non-using decl");
10503     Ty = cast<UnresolvedUsingTypenameDecl>(D);
10504   }
10505 
10506   return SemaRef.Context.getTypeDeclType(Ty);
10507 }
10508 
10509 template<typename Derived>
10510 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
10511                                                        SourceLocation Loc) {
10512   return SemaRef.BuildTypeofExprType(E, Loc);
10513 }
10514 
10515 template<typename Derived>
10516 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
10517   return SemaRef.Context.getTypeOfType(Underlying);
10518 }
10519 
10520 template<typename Derived>
10521 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
10522                                                      SourceLocation Loc) {
10523   return SemaRef.BuildDecltypeType(E, Loc);
10524 }
10525 
10526 template<typename Derived>
10527 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
10528                                             UnaryTransformType::UTTKind UKind,
10529                                             SourceLocation Loc) {
10530   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
10531 }
10532 
10533 template<typename Derived>
10534 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
10535                                                       TemplateName Template,
10536                                              SourceLocation TemplateNameLoc,
10537                                      TemplateArgumentListInfo &TemplateArgs) {
10538   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
10539 }
10540 
10541 template<typename Derived>
10542 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
10543                                                    SourceLocation KWLoc) {
10544   return SemaRef.BuildAtomicType(ValueType, KWLoc);
10545 }
10546 
10547 template<typename Derived>
10548 TemplateName
10549 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10550                                             bool TemplateKW,
10551                                             TemplateDecl *Template) {
10552   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
10553                                                   Template);
10554 }
10555 
10556 template<typename Derived>
10557 TemplateName
10558 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10559                                             const IdentifierInfo &Name,
10560                                             SourceLocation NameLoc,
10561                                             QualType ObjectType,
10562                                             NamedDecl *FirstQualifierInScope) {
10563   UnqualifiedId TemplateName;
10564   TemplateName.setIdentifier(&Name, NameLoc);
10565   Sema::TemplateTy Template;
10566   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10567   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10568                                        SS, TemplateKWLoc, TemplateName,
10569                                        ParsedType::make(ObjectType),
10570                                        /*EnteringContext=*/false,
10571                                        Template);
10572   return Template.get();
10573 }
10574 
10575 template<typename Derived>
10576 TemplateName
10577 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10578                                             OverloadedOperatorKind Operator,
10579                                             SourceLocation NameLoc,
10580                                             QualType ObjectType) {
10581   UnqualifiedId Name;
10582   // FIXME: Bogus location information.
10583   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
10584   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
10585   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10586   Sema::TemplateTy Template;
10587   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10588                                        SS, TemplateKWLoc, Name,
10589                                        ParsedType::make(ObjectType),
10590                                        /*EnteringContext=*/false,
10591                                        Template);
10592   return Template.get();
10593 }
10594 
10595 template<typename Derived>
10596 ExprResult
10597 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
10598                                                    SourceLocation OpLoc,
10599                                                    Expr *OrigCallee,
10600                                                    Expr *First,
10601                                                    Expr *Second) {
10602   Expr *Callee = OrigCallee->IgnoreParenCasts();
10603   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
10604 
10605   if (First->getObjectKind() == OK_ObjCProperty) {
10606     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10607     if (BinaryOperator::isAssignmentOp(Opc))
10608       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
10609                                                  First, Second);
10610     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
10611     if (Result.isInvalid())
10612       return ExprError();
10613     First = Result.get();
10614   }
10615 
10616   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
10617     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
10618     if (Result.isInvalid())
10619       return ExprError();
10620     Second = Result.get();
10621   }
10622 
10623   // Determine whether this should be a builtin operation.
10624   if (Op == OO_Subscript) {
10625     if (!First->getType()->isOverloadableType() &&
10626         !Second->getType()->isOverloadableType())
10627       return getSema().CreateBuiltinArraySubscriptExpr(First,
10628                                                        Callee->getLocStart(),
10629                                                        Second, OpLoc);
10630   } else if (Op == OO_Arrow) {
10631     // -> is never a builtin operation.
10632     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
10633   } else if (Second == nullptr || isPostIncDec) {
10634     if (!First->getType()->isOverloadableType()) {
10635       // The argument is not of overloadable type, so try to create a
10636       // built-in unary operation.
10637       UnaryOperatorKind Opc
10638         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10639 
10640       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
10641     }
10642   } else {
10643     if (!First->getType()->isOverloadableType() &&
10644         !Second->getType()->isOverloadableType()) {
10645       // Neither of the arguments is an overloadable type, so try to
10646       // create a built-in binary operation.
10647       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10648       ExprResult Result
10649         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
10650       if (Result.isInvalid())
10651         return ExprError();
10652 
10653       return Result;
10654     }
10655   }
10656 
10657   // Compute the transformed set of functions (and function templates) to be
10658   // used during overload resolution.
10659   UnresolvedSet<16> Functions;
10660 
10661   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
10662     assert(ULE->requiresADL());
10663     Functions.append(ULE->decls_begin(), ULE->decls_end());
10664   } else {
10665     // If we've resolved this to a particular non-member function, just call
10666     // that function. If we resolved it to a member function,
10667     // CreateOverloaded* will find that function for us.
10668     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
10669     if (!isa<CXXMethodDecl>(ND))
10670       Functions.addDecl(ND);
10671   }
10672 
10673   // Add any functions found via argument-dependent lookup.
10674   Expr *Args[2] = { First, Second };
10675   unsigned NumArgs = 1 + (Second != nullptr);
10676 
10677   // Create the overloaded operator invocation for unary operators.
10678   if (NumArgs == 1 || isPostIncDec) {
10679     UnaryOperatorKind Opc
10680       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10681     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
10682   }
10683 
10684   if (Op == OO_Subscript) {
10685     SourceLocation LBrace;
10686     SourceLocation RBrace;
10687 
10688     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
10689         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
10690         LBrace = SourceLocation::getFromRawEncoding(
10691                     NameLoc.CXXOperatorName.BeginOpNameLoc);
10692         RBrace = SourceLocation::getFromRawEncoding(
10693                     NameLoc.CXXOperatorName.EndOpNameLoc);
10694     } else {
10695         LBrace = Callee->getLocStart();
10696         RBrace = OpLoc;
10697     }
10698 
10699     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
10700                                                       First, Second);
10701   }
10702 
10703   // Create the overloaded operator invocation for binary operators.
10704   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10705   ExprResult Result
10706     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
10707   if (Result.isInvalid())
10708     return ExprError();
10709 
10710   return Result;
10711 }
10712 
10713 template<typename Derived>
10714 ExprResult
10715 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
10716                                                      SourceLocation OperatorLoc,
10717                                                        bool isArrow,
10718                                                        CXXScopeSpec &SS,
10719                                                      TypeSourceInfo *ScopeType,
10720                                                        SourceLocation CCLoc,
10721                                                        SourceLocation TildeLoc,
10722                                         PseudoDestructorTypeStorage Destroyed) {
10723   QualType BaseType = Base->getType();
10724   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
10725       (!isArrow && !BaseType->getAs<RecordType>()) ||
10726       (isArrow && BaseType->getAs<PointerType>() &&
10727        !BaseType->getAs<PointerType>()->getPointeeType()
10728                                               ->template getAs<RecordType>())){
10729     // This pseudo-destructor expression is still a pseudo-destructor.
10730     return SemaRef.BuildPseudoDestructorExpr(
10731         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
10732         CCLoc, TildeLoc, Destroyed);
10733   }
10734 
10735   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
10736   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
10737                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
10738   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
10739   NameInfo.setNamedTypeInfo(DestroyedType);
10740 
10741   // The scope type is now known to be a valid nested name specifier
10742   // component. Tack it on to the end of the nested name specifier.
10743   if (ScopeType) {
10744     if (!ScopeType->getType()->getAs<TagType>()) {
10745       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
10746                      diag::err_expected_class_or_namespace)
10747           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
10748       return ExprError();
10749     }
10750     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
10751               CCLoc);
10752   }
10753 
10754   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10755   return getSema().BuildMemberReferenceExpr(Base, BaseType,
10756                                             OperatorLoc, isArrow,
10757                                             SS, TemplateKWLoc,
10758                                             /*FIXME: FirstQualifier*/ nullptr,
10759                                             NameInfo,
10760                                             /*TemplateArgs*/ nullptr);
10761 }
10762 
10763 template<typename Derived>
10764 StmtResult
10765 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
10766   SourceLocation Loc = S->getLocStart();
10767   CapturedDecl *CD = S->getCapturedDecl();
10768   unsigned NumParams = CD->getNumParams();
10769   unsigned ContextParamPos = CD->getContextParamPosition();
10770   SmallVector<Sema::CapturedParamNameType, 4> Params;
10771   for (unsigned I = 0; I < NumParams; ++I) {
10772     if (I != ContextParamPos) {
10773       Params.push_back(
10774              std::make_pair(
10775                   CD->getParam(I)->getName(),
10776                   getDerived().TransformType(CD->getParam(I)->getType())));
10777     } else {
10778       Params.push_back(std::make_pair(StringRef(), QualType()));
10779     }
10780   }
10781   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
10782                                      S->getCapturedRegionKind(), Params);
10783   StmtResult Body;
10784   {
10785     Sema::CompoundScopeRAII CompoundScope(getSema());
10786     Body = getDerived().TransformStmt(S->getCapturedStmt());
10787   }
10788 
10789   if (Body.isInvalid()) {
10790     getSema().ActOnCapturedRegionError();
10791     return StmtError();
10792   }
10793 
10794   return getSema().ActOnCapturedRegionEnd(Body.get());
10795 }
10796 
10797 } // end namespace clang
10798 
10799 #endif
10800