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 getSema().ActOnSEHFinallyBlock(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   bool InitChanged = false;
7838 
7839   SmallVector<Expr*, 4> Inits;
7840   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
7841                                   Inits, &InitChanged))
7842     return ExprError();
7843 
7844   if (!getDerived().AlwaysRebuild() && !InitChanged)
7845     return E;
7846 
7847   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
7848                                       E->getRBraceLoc(), E->getType());
7849 }
7850 
7851 template<typename Derived>
7852 ExprResult
7853 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
7854   Designation Desig;
7855 
7856   // transform the initializer value
7857   ExprResult Init = getDerived().TransformExpr(E->getInit());
7858   if (Init.isInvalid())
7859     return ExprError();
7860 
7861   // transform the designators.
7862   SmallVector<Expr*, 4> ArrayExprs;
7863   bool ExprChanged = false;
7864   for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
7865                                              DEnd = E->designators_end();
7866        D != DEnd; ++D) {
7867     if (D->isFieldDesignator()) {
7868       Desig.AddDesignator(Designator::getField(D->getFieldName(),
7869                                                D->getDotLoc(),
7870                                                D->getFieldLoc()));
7871       continue;
7872     }
7873 
7874     if (D->isArrayDesignator()) {
7875       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
7876       if (Index.isInvalid())
7877         return ExprError();
7878 
7879       Desig.AddDesignator(Designator::getArray(Index.get(),
7880                                                D->getLBracketLoc()));
7881 
7882       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
7883       ArrayExprs.push_back(Index.get());
7884       continue;
7885     }
7886 
7887     assert(D->isArrayRangeDesignator() && "New kind of designator?");
7888     ExprResult Start
7889       = getDerived().TransformExpr(E->getArrayRangeStart(*D));
7890     if (Start.isInvalid())
7891       return ExprError();
7892 
7893     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
7894     if (End.isInvalid())
7895       return ExprError();
7896 
7897     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
7898                                                   End.get(),
7899                                                   D->getLBracketLoc(),
7900                                                   D->getEllipsisLoc()));
7901 
7902     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
7903       End.get() != E->getArrayRangeEnd(*D);
7904 
7905     ArrayExprs.push_back(Start.get());
7906     ArrayExprs.push_back(End.get());
7907   }
7908 
7909   if (!getDerived().AlwaysRebuild() &&
7910       Init.get() == E->getInit() &&
7911       !ExprChanged)
7912     return E;
7913 
7914   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
7915                                                 E->getEqualOrColonLoc(),
7916                                                 E->usesGNUSyntax(), Init.get());
7917 }
7918 
7919 template<typename Derived>
7920 ExprResult
7921 TreeTransform<Derived>::TransformImplicitValueInitExpr(
7922                                                      ImplicitValueInitExpr *E) {
7923   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
7924 
7925   // FIXME: Will we ever have proper type location here? Will we actually
7926   // need to transform the type?
7927   QualType T = getDerived().TransformType(E->getType());
7928   if (T.isNull())
7929     return ExprError();
7930 
7931   if (!getDerived().AlwaysRebuild() &&
7932       T == E->getType())
7933     return E;
7934 
7935   return getDerived().RebuildImplicitValueInitExpr(T);
7936 }
7937 
7938 template<typename Derived>
7939 ExprResult
7940 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
7941   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
7942   if (!TInfo)
7943     return ExprError();
7944 
7945   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
7946   if (SubExpr.isInvalid())
7947     return ExprError();
7948 
7949   if (!getDerived().AlwaysRebuild() &&
7950       TInfo == E->getWrittenTypeInfo() &&
7951       SubExpr.get() == E->getSubExpr())
7952     return E;
7953 
7954   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
7955                                        TInfo, E->getRParenLoc());
7956 }
7957 
7958 template<typename Derived>
7959 ExprResult
7960 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
7961   bool ArgumentChanged = false;
7962   SmallVector<Expr*, 4> Inits;
7963   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
7964                      &ArgumentChanged))
7965     return ExprError();
7966 
7967   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
7968                                            Inits,
7969                                            E->getRParenLoc());
7970 }
7971 
7972 /// \brief Transform an address-of-label expression.
7973 ///
7974 /// By default, the transformation of an address-of-label expression always
7975 /// rebuilds the expression, so that the label identifier can be resolved to
7976 /// the corresponding label statement by semantic analysis.
7977 template<typename Derived>
7978 ExprResult
7979 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
7980   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
7981                                         E->getLabel());
7982   if (!LD)
7983     return ExprError();
7984 
7985   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
7986                                            cast<LabelDecl>(LD));
7987 }
7988 
7989 template<typename Derived>
7990 ExprResult
7991 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
7992   SemaRef.ActOnStartStmtExpr();
7993   StmtResult SubStmt
7994     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
7995   if (SubStmt.isInvalid()) {
7996     SemaRef.ActOnStmtExprError();
7997     return ExprError();
7998   }
7999 
8000   if (!getDerived().AlwaysRebuild() &&
8001       SubStmt.get() == E->getSubStmt()) {
8002     // Calling this an 'error' is unintuitive, but it does the right thing.
8003     SemaRef.ActOnStmtExprError();
8004     return SemaRef.MaybeBindToTemporary(E);
8005   }
8006 
8007   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
8008                                       SubStmt.get(),
8009                                       E->getRParenLoc());
8010 }
8011 
8012 template<typename Derived>
8013 ExprResult
8014 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
8015   ExprResult Cond = getDerived().TransformExpr(E->getCond());
8016   if (Cond.isInvalid())
8017     return ExprError();
8018 
8019   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
8020   if (LHS.isInvalid())
8021     return ExprError();
8022 
8023   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
8024   if (RHS.isInvalid())
8025     return ExprError();
8026 
8027   if (!getDerived().AlwaysRebuild() &&
8028       Cond.get() == E->getCond() &&
8029       LHS.get() == E->getLHS() &&
8030       RHS.get() == E->getRHS())
8031     return E;
8032 
8033   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
8034                                         Cond.get(), LHS.get(), RHS.get(),
8035                                         E->getRParenLoc());
8036 }
8037 
8038 template<typename Derived>
8039 ExprResult
8040 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
8041   return E;
8042 }
8043 
8044 template<typename Derived>
8045 ExprResult
8046 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
8047   switch (E->getOperator()) {
8048   case OO_New:
8049   case OO_Delete:
8050   case OO_Array_New:
8051   case OO_Array_Delete:
8052     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
8053 
8054   case OO_Call: {
8055     // This is a call to an object's operator().
8056     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
8057 
8058     // Transform the object itself.
8059     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
8060     if (Object.isInvalid())
8061       return ExprError();
8062 
8063     // FIXME: Poor location information
8064     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
8065         static_cast<Expr *>(Object.get())->getLocEnd());
8066 
8067     // Transform the call arguments.
8068     SmallVector<Expr*, 8> Args;
8069     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
8070                                     Args))
8071       return ExprError();
8072 
8073     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
8074                                         Args,
8075                                         E->getLocEnd());
8076   }
8077 
8078 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
8079   case OO_##Name:
8080 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
8081 #include "clang/Basic/OperatorKinds.def"
8082   case OO_Subscript:
8083     // Handled below.
8084     break;
8085 
8086   case OO_Conditional:
8087     llvm_unreachable("conditional operator is not actually overloadable");
8088 
8089   case OO_None:
8090   case NUM_OVERLOADED_OPERATORS:
8091     llvm_unreachable("not an overloaded operator?");
8092   }
8093 
8094   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8095   if (Callee.isInvalid())
8096     return ExprError();
8097 
8098   ExprResult First;
8099   if (E->getOperator() == OO_Amp)
8100     First = getDerived().TransformAddressOfOperand(E->getArg(0));
8101   else
8102     First = getDerived().TransformExpr(E->getArg(0));
8103   if (First.isInvalid())
8104     return ExprError();
8105 
8106   ExprResult Second;
8107   if (E->getNumArgs() == 2) {
8108     Second = getDerived().TransformExpr(E->getArg(1));
8109     if (Second.isInvalid())
8110       return ExprError();
8111   }
8112 
8113   if (!getDerived().AlwaysRebuild() &&
8114       Callee.get() == E->getCallee() &&
8115       First.get() == E->getArg(0) &&
8116       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
8117     return SemaRef.MaybeBindToTemporary(E);
8118 
8119   Sema::FPContractStateRAII FPContractState(getSema());
8120   getSema().FPFeatures.fp_contract = E->isFPContractable();
8121 
8122   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
8123                                                  E->getOperatorLoc(),
8124                                                  Callee.get(),
8125                                                  First.get(),
8126                                                  Second.get());
8127 }
8128 
8129 template<typename Derived>
8130 ExprResult
8131 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
8132   return getDerived().TransformCallExpr(E);
8133 }
8134 
8135 template<typename Derived>
8136 ExprResult
8137 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
8138   // Transform the callee.
8139   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
8140   if (Callee.isInvalid())
8141     return ExprError();
8142 
8143   // Transform exec config.
8144   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
8145   if (EC.isInvalid())
8146     return ExprError();
8147 
8148   // Transform arguments.
8149   bool ArgChanged = false;
8150   SmallVector<Expr*, 8> Args;
8151   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
8152                                   &ArgChanged))
8153     return ExprError();
8154 
8155   if (!getDerived().AlwaysRebuild() &&
8156       Callee.get() == E->getCallee() &&
8157       !ArgChanged)
8158     return SemaRef.MaybeBindToTemporary(E);
8159 
8160   // FIXME: Wrong source location information for the '('.
8161   SourceLocation FakeLParenLoc
8162     = ((Expr *)Callee.get())->getSourceRange().getBegin();
8163   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
8164                                       Args,
8165                                       E->getRParenLoc(), EC.get());
8166 }
8167 
8168 template<typename Derived>
8169 ExprResult
8170 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
8171   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8172   if (!Type)
8173     return ExprError();
8174 
8175   ExprResult SubExpr
8176     = getDerived().TransformExpr(E->getSubExprAsWritten());
8177   if (SubExpr.isInvalid())
8178     return ExprError();
8179 
8180   if (!getDerived().AlwaysRebuild() &&
8181       Type == E->getTypeInfoAsWritten() &&
8182       SubExpr.get() == E->getSubExpr())
8183     return E;
8184   return getDerived().RebuildCXXNamedCastExpr(
8185       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
8186       Type, E->getAngleBrackets().getEnd(),
8187       // FIXME. this should be '(' location
8188       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
8189 }
8190 
8191 template<typename Derived>
8192 ExprResult
8193 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
8194   return getDerived().TransformCXXNamedCastExpr(E);
8195 }
8196 
8197 template<typename Derived>
8198 ExprResult
8199 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
8200   return getDerived().TransformCXXNamedCastExpr(E);
8201 }
8202 
8203 template<typename Derived>
8204 ExprResult
8205 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
8206                                                       CXXReinterpretCastExpr *E) {
8207   return getDerived().TransformCXXNamedCastExpr(E);
8208 }
8209 
8210 template<typename Derived>
8211 ExprResult
8212 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
8213   return getDerived().TransformCXXNamedCastExpr(E);
8214 }
8215 
8216 template<typename Derived>
8217 ExprResult
8218 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
8219                                                      CXXFunctionalCastExpr *E) {
8220   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
8221   if (!Type)
8222     return ExprError();
8223 
8224   ExprResult SubExpr
8225     = getDerived().TransformExpr(E->getSubExprAsWritten());
8226   if (SubExpr.isInvalid())
8227     return ExprError();
8228 
8229   if (!getDerived().AlwaysRebuild() &&
8230       Type == E->getTypeInfoAsWritten() &&
8231       SubExpr.get() == E->getSubExpr())
8232     return E;
8233 
8234   return getDerived().RebuildCXXFunctionalCastExpr(Type,
8235                                                    E->getLParenLoc(),
8236                                                    SubExpr.get(),
8237                                                    E->getRParenLoc());
8238 }
8239 
8240 template<typename Derived>
8241 ExprResult
8242 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
8243   if (E->isTypeOperand()) {
8244     TypeSourceInfo *TInfo
8245       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8246     if (!TInfo)
8247       return ExprError();
8248 
8249     if (!getDerived().AlwaysRebuild() &&
8250         TInfo == E->getTypeOperandSourceInfo())
8251       return E;
8252 
8253     return getDerived().RebuildCXXTypeidExpr(E->getType(),
8254                                              E->getLocStart(),
8255                                              TInfo,
8256                                              E->getLocEnd());
8257   }
8258 
8259   // We don't know whether the subexpression is potentially evaluated until
8260   // after we perform semantic analysis.  We speculatively assume it is
8261   // unevaluated; it will get fixed later if the subexpression is in fact
8262   // potentially evaluated.
8263   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated,
8264                                                Sema::ReuseLambdaContextDecl);
8265 
8266   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8267   if (SubExpr.isInvalid())
8268     return ExprError();
8269 
8270   if (!getDerived().AlwaysRebuild() &&
8271       SubExpr.get() == E->getExprOperand())
8272     return E;
8273 
8274   return getDerived().RebuildCXXTypeidExpr(E->getType(),
8275                                            E->getLocStart(),
8276                                            SubExpr.get(),
8277                                            E->getLocEnd());
8278 }
8279 
8280 template<typename Derived>
8281 ExprResult
8282 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
8283   if (E->isTypeOperand()) {
8284     TypeSourceInfo *TInfo
8285       = getDerived().TransformType(E->getTypeOperandSourceInfo());
8286     if (!TInfo)
8287       return ExprError();
8288 
8289     if (!getDerived().AlwaysRebuild() &&
8290         TInfo == E->getTypeOperandSourceInfo())
8291       return E;
8292 
8293     return getDerived().RebuildCXXUuidofExpr(E->getType(),
8294                                              E->getLocStart(),
8295                                              TInfo,
8296                                              E->getLocEnd());
8297   }
8298 
8299   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8300 
8301   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
8302   if (SubExpr.isInvalid())
8303     return ExprError();
8304 
8305   if (!getDerived().AlwaysRebuild() &&
8306       SubExpr.get() == E->getExprOperand())
8307     return E;
8308 
8309   return getDerived().RebuildCXXUuidofExpr(E->getType(),
8310                                            E->getLocStart(),
8311                                            SubExpr.get(),
8312                                            E->getLocEnd());
8313 }
8314 
8315 template<typename Derived>
8316 ExprResult
8317 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
8318   return E;
8319 }
8320 
8321 template<typename Derived>
8322 ExprResult
8323 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
8324                                                      CXXNullPtrLiteralExpr *E) {
8325   return E;
8326 }
8327 
8328 template<typename Derived>
8329 ExprResult
8330 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
8331   QualType T = getSema().getCurrentThisType();
8332 
8333   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
8334     // Make sure that we capture 'this'.
8335     getSema().CheckCXXThisCapture(E->getLocStart());
8336     return E;
8337   }
8338 
8339   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
8340 }
8341 
8342 template<typename Derived>
8343 ExprResult
8344 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
8345   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8346   if (SubExpr.isInvalid())
8347     return ExprError();
8348 
8349   if (!getDerived().AlwaysRebuild() &&
8350       SubExpr.get() == E->getSubExpr())
8351     return E;
8352 
8353   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
8354                                           E->isThrownVariableInScope());
8355 }
8356 
8357 template<typename Derived>
8358 ExprResult
8359 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
8360   ParmVarDecl *Param
8361     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
8362                                                            E->getParam()));
8363   if (!Param)
8364     return ExprError();
8365 
8366   if (!getDerived().AlwaysRebuild() &&
8367       Param == E->getParam())
8368     return E;
8369 
8370   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
8371 }
8372 
8373 template<typename Derived>
8374 ExprResult
8375 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
8376   FieldDecl *Field
8377     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
8378                                                          E->getField()));
8379   if (!Field)
8380     return ExprError();
8381 
8382   if (!getDerived().AlwaysRebuild() && Field == E->getField())
8383     return E;
8384 
8385   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
8386 }
8387 
8388 template<typename Derived>
8389 ExprResult
8390 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
8391                                                     CXXScalarValueInitExpr *E) {
8392   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
8393   if (!T)
8394     return ExprError();
8395 
8396   if (!getDerived().AlwaysRebuild() &&
8397       T == E->getTypeSourceInfo())
8398     return E;
8399 
8400   return getDerived().RebuildCXXScalarValueInitExpr(T,
8401                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
8402                                                     E->getRParenLoc());
8403 }
8404 
8405 template<typename Derived>
8406 ExprResult
8407 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
8408   // Transform the type that we're allocating
8409   TypeSourceInfo *AllocTypeInfo
8410     = getDerived().TransformType(E->getAllocatedTypeSourceInfo());
8411   if (!AllocTypeInfo)
8412     return ExprError();
8413 
8414   // Transform the size of the array we're allocating (if any).
8415   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
8416   if (ArraySize.isInvalid())
8417     return ExprError();
8418 
8419   // Transform the placement arguments (if any).
8420   bool ArgumentChanged = false;
8421   SmallVector<Expr*, 8> PlacementArgs;
8422   if (getDerived().TransformExprs(E->getPlacementArgs(),
8423                                   E->getNumPlacementArgs(), true,
8424                                   PlacementArgs, &ArgumentChanged))
8425     return ExprError();
8426 
8427   // Transform the initializer (if any).
8428   Expr *OldInit = E->getInitializer();
8429   ExprResult NewInit;
8430   if (OldInit)
8431     NewInit = getDerived().TransformInitializer(OldInit, true);
8432   if (NewInit.isInvalid())
8433     return ExprError();
8434 
8435   // Transform new operator and delete operator.
8436   FunctionDecl *OperatorNew = nullptr;
8437   if (E->getOperatorNew()) {
8438     OperatorNew = cast_or_null<FunctionDecl>(
8439                                  getDerived().TransformDecl(E->getLocStart(),
8440                                                          E->getOperatorNew()));
8441     if (!OperatorNew)
8442       return ExprError();
8443   }
8444 
8445   FunctionDecl *OperatorDelete = nullptr;
8446   if (E->getOperatorDelete()) {
8447     OperatorDelete = cast_or_null<FunctionDecl>(
8448                                    getDerived().TransformDecl(E->getLocStart(),
8449                                                        E->getOperatorDelete()));
8450     if (!OperatorDelete)
8451       return ExprError();
8452   }
8453 
8454   if (!getDerived().AlwaysRebuild() &&
8455       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
8456       ArraySize.get() == E->getArraySize() &&
8457       NewInit.get() == OldInit &&
8458       OperatorNew == E->getOperatorNew() &&
8459       OperatorDelete == E->getOperatorDelete() &&
8460       !ArgumentChanged) {
8461     // Mark any declarations we need as referenced.
8462     // FIXME: instantiation-specific.
8463     if (OperatorNew)
8464       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
8465     if (OperatorDelete)
8466       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8467 
8468     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
8469       QualType ElementType
8470         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
8471       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
8472         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
8473         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
8474           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
8475         }
8476       }
8477     }
8478 
8479     return E;
8480   }
8481 
8482   QualType AllocType = AllocTypeInfo->getType();
8483   if (!ArraySize.get()) {
8484     // If no array size was specified, but the new expression was
8485     // instantiated with an array type (e.g., "new T" where T is
8486     // instantiated with "int[4]"), extract the outer bound from the
8487     // array type as our array size. We do this with constant and
8488     // dependently-sized array types.
8489     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
8490     if (!ArrayT) {
8491       // Do nothing
8492     } else if (const ConstantArrayType *ConsArrayT
8493                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
8494       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
8495                                          SemaRef.Context.getSizeType(),
8496                                          /*FIXME:*/ E->getLocStart());
8497       AllocType = ConsArrayT->getElementType();
8498     } else if (const DependentSizedArrayType *DepArrayT
8499                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
8500       if (DepArrayT->getSizeExpr()) {
8501         ArraySize = DepArrayT->getSizeExpr();
8502         AllocType = DepArrayT->getElementType();
8503       }
8504     }
8505   }
8506 
8507   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
8508                                         E->isGlobalNew(),
8509                                         /*FIXME:*/E->getLocStart(),
8510                                         PlacementArgs,
8511                                         /*FIXME:*/E->getLocStart(),
8512                                         E->getTypeIdParens(),
8513                                         AllocType,
8514                                         AllocTypeInfo,
8515                                         ArraySize.get(),
8516                                         E->getDirectInitRange(),
8517                                         NewInit.get());
8518 }
8519 
8520 template<typename Derived>
8521 ExprResult
8522 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
8523   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
8524   if (Operand.isInvalid())
8525     return ExprError();
8526 
8527   // Transform the delete operator, if known.
8528   FunctionDecl *OperatorDelete = nullptr;
8529   if (E->getOperatorDelete()) {
8530     OperatorDelete = cast_or_null<FunctionDecl>(
8531                                    getDerived().TransformDecl(E->getLocStart(),
8532                                                        E->getOperatorDelete()));
8533     if (!OperatorDelete)
8534       return ExprError();
8535   }
8536 
8537   if (!getDerived().AlwaysRebuild() &&
8538       Operand.get() == E->getArgument() &&
8539       OperatorDelete == E->getOperatorDelete()) {
8540     // Mark any declarations we need as referenced.
8541     // FIXME: instantiation-specific.
8542     if (OperatorDelete)
8543       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
8544 
8545     if (!E->getArgument()->isTypeDependent()) {
8546       QualType Destroyed = SemaRef.Context.getBaseElementType(
8547                                                          E->getDestroyedType());
8548       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
8549         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
8550         SemaRef.MarkFunctionReferenced(E->getLocStart(),
8551                                        SemaRef.LookupDestructor(Record));
8552       }
8553     }
8554 
8555     return E;
8556   }
8557 
8558   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
8559                                            E->isGlobalDelete(),
8560                                            E->isArrayForm(),
8561                                            Operand.get());
8562 }
8563 
8564 template<typename Derived>
8565 ExprResult
8566 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
8567                                                      CXXPseudoDestructorExpr *E) {
8568   ExprResult Base = getDerived().TransformExpr(E->getBase());
8569   if (Base.isInvalid())
8570     return ExprError();
8571 
8572   ParsedType ObjectTypePtr;
8573   bool MayBePseudoDestructor = false;
8574   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
8575                                               E->getOperatorLoc(),
8576                                         E->isArrow()? tok::arrow : tok::period,
8577                                               ObjectTypePtr,
8578                                               MayBePseudoDestructor);
8579   if (Base.isInvalid())
8580     return ExprError();
8581 
8582   QualType ObjectType = ObjectTypePtr.get();
8583   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
8584   if (QualifierLoc) {
8585     QualifierLoc
8586       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
8587     if (!QualifierLoc)
8588       return ExprError();
8589   }
8590   CXXScopeSpec SS;
8591   SS.Adopt(QualifierLoc);
8592 
8593   PseudoDestructorTypeStorage Destroyed;
8594   if (E->getDestroyedTypeInfo()) {
8595     TypeSourceInfo *DestroyedTypeInfo
8596       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
8597                                                 ObjectType, nullptr, SS);
8598     if (!DestroyedTypeInfo)
8599       return ExprError();
8600     Destroyed = DestroyedTypeInfo;
8601   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
8602     // We aren't likely to be able to resolve the identifier down to a type
8603     // now anyway, so just retain the identifier.
8604     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
8605                                             E->getDestroyedTypeLoc());
8606   } else {
8607     // Look for a destructor known with the given name.
8608     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
8609                                               *E->getDestroyedTypeIdentifier(),
8610                                                 E->getDestroyedTypeLoc(),
8611                                                 /*Scope=*/nullptr,
8612                                                 SS, ObjectTypePtr,
8613                                                 false);
8614     if (!T)
8615       return ExprError();
8616 
8617     Destroyed
8618       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
8619                                                  E->getDestroyedTypeLoc());
8620   }
8621 
8622   TypeSourceInfo *ScopeTypeInfo = nullptr;
8623   if (E->getScopeTypeInfo()) {
8624     CXXScopeSpec EmptySS;
8625     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
8626                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
8627     if (!ScopeTypeInfo)
8628       return ExprError();
8629   }
8630 
8631   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
8632                                                      E->getOperatorLoc(),
8633                                                      E->isArrow(),
8634                                                      SS,
8635                                                      ScopeTypeInfo,
8636                                                      E->getColonColonLoc(),
8637                                                      E->getTildeLoc(),
8638                                                      Destroyed);
8639 }
8640 
8641 template<typename Derived>
8642 ExprResult
8643 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
8644                                                   UnresolvedLookupExpr *Old) {
8645   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
8646                  Sema::LookupOrdinaryName);
8647 
8648   // Transform all the decls.
8649   for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(),
8650          E = Old->decls_end(); I != E; ++I) {
8651     NamedDecl *InstD = static_cast<NamedDecl*>(
8652                                  getDerived().TransformDecl(Old->getNameLoc(),
8653                                                             *I));
8654     if (!InstD) {
8655       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
8656       // This can happen because of dependent hiding.
8657       if (isa<UsingShadowDecl>(*I))
8658         continue;
8659       else {
8660         R.clear();
8661         return ExprError();
8662       }
8663     }
8664 
8665     // Expand using declarations.
8666     if (isa<UsingDecl>(InstD)) {
8667       UsingDecl *UD = cast<UsingDecl>(InstD);
8668       for (auto *I : UD->shadows())
8669         R.addDecl(I);
8670       continue;
8671     }
8672 
8673     R.addDecl(InstD);
8674   }
8675 
8676   // Resolve a kind, but don't do any further analysis.  If it's
8677   // ambiguous, the callee needs to deal with it.
8678   R.resolveKind();
8679 
8680   // Rebuild the nested-name qualifier, if present.
8681   CXXScopeSpec SS;
8682   if (Old->getQualifierLoc()) {
8683     NestedNameSpecifierLoc QualifierLoc
8684       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
8685     if (!QualifierLoc)
8686       return ExprError();
8687 
8688     SS.Adopt(QualifierLoc);
8689   }
8690 
8691   if (Old->getNamingClass()) {
8692     CXXRecordDecl *NamingClass
8693       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
8694                                                             Old->getNameLoc(),
8695                                                         Old->getNamingClass()));
8696     if (!NamingClass) {
8697       R.clear();
8698       return ExprError();
8699     }
8700 
8701     R.setNamingClass(NamingClass);
8702   }
8703 
8704   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
8705 
8706   // If we have neither explicit template arguments, nor the template keyword,
8707   // it's a normal declaration name.
8708   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid())
8709     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
8710 
8711   // If we have template arguments, rebuild them, then rebuild the
8712   // templateid expression.
8713   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
8714   if (Old->hasExplicitTemplateArgs() &&
8715       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
8716                                               Old->getNumTemplateArgs(),
8717                                               TransArgs)) {
8718     R.clear();
8719     return ExprError();
8720   }
8721 
8722   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
8723                                             Old->requiresADL(), &TransArgs);
8724 }
8725 
8726 template<typename Derived>
8727 ExprResult
8728 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
8729   bool ArgChanged = false;
8730   SmallVector<TypeSourceInfo *, 4> Args;
8731   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
8732     TypeSourceInfo *From = E->getArg(I);
8733     TypeLoc FromTL = From->getTypeLoc();
8734     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
8735       TypeLocBuilder TLB;
8736       TLB.reserve(FromTL.getFullDataSize());
8737       QualType To = getDerived().TransformType(TLB, FromTL);
8738       if (To.isNull())
8739         return ExprError();
8740 
8741       if (To == From->getType())
8742         Args.push_back(From);
8743       else {
8744         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8745         ArgChanged = true;
8746       }
8747       continue;
8748     }
8749 
8750     ArgChanged = true;
8751 
8752     // We have a pack expansion. Instantiate it.
8753     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
8754     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
8755     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
8756     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
8757 
8758     // Determine whether the set of unexpanded parameter packs can and should
8759     // be expanded.
8760     bool Expand = true;
8761     bool RetainExpansion = false;
8762     Optional<unsigned> OrigNumExpansions =
8763         ExpansionTL.getTypePtr()->getNumExpansions();
8764     Optional<unsigned> NumExpansions = OrigNumExpansions;
8765     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
8766                                              PatternTL.getSourceRange(),
8767                                              Unexpanded,
8768                                              Expand, RetainExpansion,
8769                                              NumExpansions))
8770       return ExprError();
8771 
8772     if (!Expand) {
8773       // The transform has determined that we should perform a simple
8774       // transformation on the pack expansion, producing another pack
8775       // expansion.
8776       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
8777 
8778       TypeLocBuilder TLB;
8779       TLB.reserve(From->getTypeLoc().getFullDataSize());
8780 
8781       QualType To = getDerived().TransformType(TLB, PatternTL);
8782       if (To.isNull())
8783         return ExprError();
8784 
8785       To = getDerived().RebuildPackExpansionType(To,
8786                                                  PatternTL.getSourceRange(),
8787                                                  ExpansionTL.getEllipsisLoc(),
8788                                                  NumExpansions);
8789       if (To.isNull())
8790         return ExprError();
8791 
8792       PackExpansionTypeLoc ToExpansionTL
8793         = TLB.push<PackExpansionTypeLoc>(To);
8794       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8795       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8796       continue;
8797     }
8798 
8799     // Expand the pack expansion by substituting for each argument in the
8800     // pack(s).
8801     for (unsigned I = 0; I != *NumExpansions; ++I) {
8802       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
8803       TypeLocBuilder TLB;
8804       TLB.reserve(PatternTL.getFullDataSize());
8805       QualType To = getDerived().TransformType(TLB, PatternTL);
8806       if (To.isNull())
8807         return ExprError();
8808 
8809       if (To->containsUnexpandedParameterPack()) {
8810         To = getDerived().RebuildPackExpansionType(To,
8811                                                    PatternTL.getSourceRange(),
8812                                                    ExpansionTL.getEllipsisLoc(),
8813                                                    NumExpansions);
8814         if (To.isNull())
8815           return ExprError();
8816 
8817         PackExpansionTypeLoc ToExpansionTL
8818           = TLB.push<PackExpansionTypeLoc>(To);
8819         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8820       }
8821 
8822       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8823     }
8824 
8825     if (!RetainExpansion)
8826       continue;
8827 
8828     // If we're supposed to retain a pack expansion, do so by temporarily
8829     // forgetting the partially-substituted parameter pack.
8830     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
8831 
8832     TypeLocBuilder TLB;
8833     TLB.reserve(From->getTypeLoc().getFullDataSize());
8834 
8835     QualType To = getDerived().TransformType(TLB, PatternTL);
8836     if (To.isNull())
8837       return ExprError();
8838 
8839     To = getDerived().RebuildPackExpansionType(To,
8840                                                PatternTL.getSourceRange(),
8841                                                ExpansionTL.getEllipsisLoc(),
8842                                                NumExpansions);
8843     if (To.isNull())
8844       return ExprError();
8845 
8846     PackExpansionTypeLoc ToExpansionTL
8847       = TLB.push<PackExpansionTypeLoc>(To);
8848     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
8849     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
8850   }
8851 
8852   if (!getDerived().AlwaysRebuild() && !ArgChanged)
8853     return E;
8854 
8855   return getDerived().RebuildTypeTrait(E->getTrait(),
8856                                        E->getLocStart(),
8857                                        Args,
8858                                        E->getLocEnd());
8859 }
8860 
8861 template<typename Derived>
8862 ExprResult
8863 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
8864   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
8865   if (!T)
8866     return ExprError();
8867 
8868   if (!getDerived().AlwaysRebuild() &&
8869       T == E->getQueriedTypeSourceInfo())
8870     return E;
8871 
8872   ExprResult SubExpr;
8873   {
8874     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8875     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
8876     if (SubExpr.isInvalid())
8877       return ExprError();
8878 
8879     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
8880       return E;
8881   }
8882 
8883   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
8884                                             E->getLocStart(),
8885                                             T,
8886                                             SubExpr.get(),
8887                                             E->getLocEnd());
8888 }
8889 
8890 template<typename Derived>
8891 ExprResult
8892 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
8893   ExprResult SubExpr;
8894   {
8895     EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
8896     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
8897     if (SubExpr.isInvalid())
8898       return ExprError();
8899 
8900     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
8901       return E;
8902   }
8903 
8904   return getDerived().RebuildExpressionTrait(
8905       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
8906 }
8907 
8908 template <typename Derived>
8909 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
8910     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
8911     TypeSourceInfo **RecoveryTSI) {
8912   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
8913       DRE, AddrTaken, RecoveryTSI);
8914 
8915   // Propagate both errors and recovered types, which return ExprEmpty.
8916   if (!NewDRE.isUsable())
8917     return NewDRE;
8918 
8919   // We got an expr, wrap it up in parens.
8920   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
8921     return PE;
8922   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
8923                                        PE->getRParen());
8924 }
8925 
8926 template <typename Derived>
8927 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8928     DependentScopeDeclRefExpr *E) {
8929   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
8930                                             nullptr);
8931 }
8932 
8933 template<typename Derived>
8934 ExprResult
8935 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
8936                                                DependentScopeDeclRefExpr *E,
8937                                                bool IsAddressOfOperand,
8938                                                TypeSourceInfo **RecoveryTSI) {
8939   assert(E->getQualifierLoc());
8940   NestedNameSpecifierLoc QualifierLoc
8941   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8942   if (!QualifierLoc)
8943     return ExprError();
8944   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
8945 
8946   // TODO: If this is a conversion-function-id, verify that the
8947   // destination type name (if present) resolves the same way after
8948   // instantiation as it did in the local scope.
8949 
8950   DeclarationNameInfo NameInfo
8951     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
8952   if (!NameInfo.getName())
8953     return ExprError();
8954 
8955   if (!E->hasExplicitTemplateArgs()) {
8956     if (!getDerived().AlwaysRebuild() &&
8957         QualifierLoc == E->getQualifierLoc() &&
8958         // Note: it is sufficient to compare the Name component of NameInfo:
8959         // if name has not changed, DNLoc has not changed either.
8960         NameInfo.getName() == E->getDeclName())
8961       return E;
8962 
8963     return getDerived().RebuildDependentScopeDeclRefExpr(
8964         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
8965         IsAddressOfOperand, RecoveryTSI);
8966   }
8967 
8968   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
8969   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8970                                               E->getNumTemplateArgs(),
8971                                               TransArgs))
8972     return ExprError();
8973 
8974   return getDerived().RebuildDependentScopeDeclRefExpr(
8975       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
8976       RecoveryTSI);
8977 }
8978 
8979 template<typename Derived>
8980 ExprResult
8981 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
8982   // CXXConstructExprs other than for list-initialization and
8983   // CXXTemporaryObjectExpr are always implicit, so when we have
8984   // a 1-argument construction we just transform that argument.
8985   if ((E->getNumArgs() == 1 ||
8986        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
8987       (!getDerived().DropCallArgument(E->getArg(0))) &&
8988       !E->isListInitialization())
8989     return getDerived().TransformExpr(E->getArg(0));
8990 
8991   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
8992 
8993   QualType T = getDerived().TransformType(E->getType());
8994   if (T.isNull())
8995     return ExprError();
8996 
8997   CXXConstructorDecl *Constructor
8998     = cast_or_null<CXXConstructorDecl>(
8999                                 getDerived().TransformDecl(E->getLocStart(),
9000                                                          E->getConstructor()));
9001   if (!Constructor)
9002     return ExprError();
9003 
9004   bool ArgumentChanged = false;
9005   SmallVector<Expr*, 8> Args;
9006   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9007                                   &ArgumentChanged))
9008     return ExprError();
9009 
9010   if (!getDerived().AlwaysRebuild() &&
9011       T == E->getType() &&
9012       Constructor == E->getConstructor() &&
9013       !ArgumentChanged) {
9014     // Mark the constructor as referenced.
9015     // FIXME: Instantiation-specific
9016     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9017     return E;
9018   }
9019 
9020   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
9021                                               Constructor, E->isElidable(),
9022                                               Args,
9023                                               E->hadMultipleCandidates(),
9024                                               E->isListInitialization(),
9025                                               E->isStdInitListInitialization(),
9026                                               E->requiresZeroInitialization(),
9027                                               E->getConstructionKind(),
9028                                               E->getParenOrBraceRange());
9029 }
9030 
9031 /// \brief Transform a C++ temporary-binding expression.
9032 ///
9033 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
9034 /// transform the subexpression and return that.
9035 template<typename Derived>
9036 ExprResult
9037 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
9038   return getDerived().TransformExpr(E->getSubExpr());
9039 }
9040 
9041 /// \brief Transform a C++ expression that contains cleanups that should
9042 /// be run after the expression is evaluated.
9043 ///
9044 /// Since ExprWithCleanups nodes are implicitly generated, we
9045 /// just transform the subexpression and return that.
9046 template<typename Derived>
9047 ExprResult
9048 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
9049   return getDerived().TransformExpr(E->getSubExpr());
9050 }
9051 
9052 template<typename Derived>
9053 ExprResult
9054 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
9055                                                     CXXTemporaryObjectExpr *E) {
9056   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9057   if (!T)
9058     return ExprError();
9059 
9060   CXXConstructorDecl *Constructor
9061     = cast_or_null<CXXConstructorDecl>(
9062                                   getDerived().TransformDecl(E->getLocStart(),
9063                                                          E->getConstructor()));
9064   if (!Constructor)
9065     return ExprError();
9066 
9067   bool ArgumentChanged = false;
9068   SmallVector<Expr*, 8> Args;
9069   Args.reserve(E->getNumArgs());
9070   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9071                      &ArgumentChanged))
9072     return ExprError();
9073 
9074   if (!getDerived().AlwaysRebuild() &&
9075       T == E->getTypeSourceInfo() &&
9076       Constructor == E->getConstructor() &&
9077       !ArgumentChanged) {
9078     // FIXME: Instantiation-specific
9079     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
9080     return SemaRef.MaybeBindToTemporary(E);
9081   }
9082 
9083   // FIXME: Pass in E->isListInitialization().
9084   return getDerived().RebuildCXXTemporaryObjectExpr(T,
9085                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
9086                                                     Args,
9087                                                     E->getLocEnd());
9088 }
9089 
9090 template<typename Derived>
9091 ExprResult
9092 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
9093   // Transform any init-capture expressions before entering the scope of the
9094   // lambda body, because they are not semantically within that scope.
9095   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
9096   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
9097       E->explicit_capture_begin());
9098   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9099                                     CEnd = E->capture_end();
9100        C != CEnd; ++C) {
9101     if (!C->isInitCapture())
9102       continue;
9103     EnterExpressionEvaluationContext EEEC(getSema(),
9104                                           Sema::PotentiallyEvaluated);
9105     ExprResult NewExprInitResult = getDerived().TransformInitializer(
9106         C->getCapturedVar()->getInit(),
9107         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
9108 
9109     if (NewExprInitResult.isInvalid())
9110       return ExprError();
9111     Expr *NewExprInit = NewExprInitResult.get();
9112 
9113     VarDecl *OldVD = C->getCapturedVar();
9114     QualType NewInitCaptureType =
9115         getSema().performLambdaInitCaptureInitialization(C->getLocation(),
9116             OldVD->getType()->isReferenceType(), OldVD->getIdentifier(),
9117             NewExprInit);
9118     NewExprInitResult = NewExprInit;
9119     InitCaptureExprsAndTypes[C - E->capture_begin()] =
9120         std::make_pair(NewExprInitResult, NewInitCaptureType);
9121   }
9122 
9123   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
9124   // Transform the template parameters, and add them to the current
9125   // instantiation scope. The null case is handled correctly.
9126   LSI->GLTemplateParameterList = getDerived().TransformTemplateParameterList(
9127       E->getTemplateParameterList());
9128 
9129   // Transform the type of the original lambda's call operator.
9130   // The transformation MUST be done in the CurrentInstantiationScope since
9131   // it introduces a mapping of the original to the newly created
9132   // transformed parameters.
9133   TypeSourceInfo *NewCallOpTSI = nullptr;
9134   {
9135     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
9136     FunctionProtoTypeLoc OldCallOpFPTL =
9137         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
9138 
9139     TypeLocBuilder NewCallOpTLBuilder;
9140     SmallVector<QualType, 4> ExceptionStorage;
9141     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
9142     QualType NewCallOpType = TransformFunctionProtoType(
9143         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
9144         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
9145           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
9146                                               ExceptionStorage, Changed);
9147         });
9148     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
9149                                                         NewCallOpType);
9150     if (!NewCallOpTSI)
9151       return ExprError();
9152   }
9153 
9154   // Create the local class that will describe the lambda.
9155   CXXRecordDecl *Class
9156     = getSema().createLambdaClosureType(E->getIntroducerRange(),
9157                                         NewCallOpTSI,
9158                                         /*KnownDependent=*/false,
9159                                         E->getCaptureDefault());
9160   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
9161 
9162   // Build the call operator.
9163   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
9164       Class, E->getIntroducerRange(), NewCallOpTSI,
9165       E->getCallOperator()->getLocEnd(),
9166       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams());
9167   LSI->CallOperator = NewCallOperator;
9168 
9169   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
9170 
9171   return getDerived().TransformLambdaScope(E, NewCallOperator,
9172       InitCaptureExprsAndTypes);
9173 }
9174 
9175 template<typename Derived>
9176 ExprResult
9177 TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E,
9178     CXXMethodDecl *CallOperator,
9179     ArrayRef<InitCaptureInfoTy> InitCaptureExprsAndTypes) {
9180   bool Invalid = false;
9181 
9182   // Introduce the context of the call operator.
9183   Sema::ContextRAII SavedContext(getSema(), CallOperator,
9184                                  /*NewThisContext*/false);
9185 
9186   LambdaScopeInfo *const LSI = getSema().getCurLambda();
9187   // Enter the scope of the lambda.
9188   getSema().buildLambdaScope(LSI, CallOperator, E->getIntroducerRange(),
9189                                  E->getCaptureDefault(),
9190                                  E->getCaptureDefaultLoc(),
9191                                  E->hasExplicitParameters(),
9192                                  E->hasExplicitResultType(),
9193                                  E->isMutable());
9194 
9195   // Transform captures.
9196   bool FinishedExplicitCaptures = false;
9197   for (LambdaExpr::capture_iterator C = E->capture_begin(),
9198                                  CEnd = E->capture_end();
9199        C != CEnd; ++C) {
9200     // When we hit the first implicit capture, tell Sema that we've finished
9201     // the list of explicit captures.
9202     if (!FinishedExplicitCaptures && C->isImplicit()) {
9203       getSema().finishLambdaExplicitCaptures(LSI);
9204       FinishedExplicitCaptures = true;
9205     }
9206 
9207     // Capturing 'this' is trivial.
9208     if (C->capturesThis()) {
9209       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit());
9210       continue;
9211     }
9212     // Captured expression will be recaptured during captured variables
9213     // rebuilding.
9214     if (C->capturesVLAType())
9215       continue;
9216 
9217     // Rebuild init-captures, including the implied field declaration.
9218     if (C->isInitCapture()) {
9219 
9220       InitCaptureInfoTy InitExprTypePair =
9221           InitCaptureExprsAndTypes[C - E->capture_begin()];
9222       ExprResult Init = InitExprTypePair.first;
9223       QualType InitQualType = InitExprTypePair.second;
9224       if (Init.isInvalid() || InitQualType.isNull()) {
9225         Invalid = true;
9226         continue;
9227       }
9228       VarDecl *OldVD = C->getCapturedVar();
9229       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
9230           OldVD->getLocation(), InitExprTypePair.second,
9231           OldVD->getIdentifier(), Init.get());
9232       if (!NewVD)
9233         Invalid = true;
9234       else {
9235         getDerived().transformedLocalDecl(OldVD, NewVD);
9236       }
9237       getSema().buildInitCaptureField(LSI, NewVD);
9238       continue;
9239     }
9240 
9241     assert(C->capturesVariable() && "unexpected kind of lambda capture");
9242 
9243     // Determine the capture kind for Sema.
9244     Sema::TryCaptureKind Kind
9245       = C->isImplicit()? Sema::TryCapture_Implicit
9246                        : C->getCaptureKind() == LCK_ByCopy
9247                            ? Sema::TryCapture_ExplicitByVal
9248                            : Sema::TryCapture_ExplicitByRef;
9249     SourceLocation EllipsisLoc;
9250     if (C->isPackExpansion()) {
9251       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
9252       bool ShouldExpand = false;
9253       bool RetainExpansion = false;
9254       Optional<unsigned> NumExpansions;
9255       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
9256                                                C->getLocation(),
9257                                                Unexpanded,
9258                                                ShouldExpand, RetainExpansion,
9259                                                NumExpansions)) {
9260         Invalid = true;
9261         continue;
9262       }
9263 
9264       if (ShouldExpand) {
9265         // The transform has determined that we should perform an expansion;
9266         // transform and capture each of the arguments.
9267         // expansion of the pattern. Do so.
9268         VarDecl *Pack = C->getCapturedVar();
9269         for (unsigned I = 0; I != *NumExpansions; ++I) {
9270           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9271           VarDecl *CapturedVar
9272             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9273                                                                Pack));
9274           if (!CapturedVar) {
9275             Invalid = true;
9276             continue;
9277           }
9278 
9279           // Capture the transformed variable.
9280           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9281         }
9282 
9283         // FIXME: Retain a pack expansion if RetainExpansion is true.
9284 
9285         continue;
9286       }
9287 
9288       EllipsisLoc = C->getEllipsisLoc();
9289     }
9290 
9291     // Transform the captured variable.
9292     VarDecl *CapturedVar
9293       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
9294                                                          C->getCapturedVar()));
9295     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
9296       Invalid = true;
9297       continue;
9298     }
9299 
9300     // Capture the transformed variable.
9301     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
9302   }
9303   if (!FinishedExplicitCaptures)
9304     getSema().finishLambdaExplicitCaptures(LSI);
9305 
9306 
9307   // Enter a new evaluation context to insulate the lambda from any
9308   // cleanups from the enclosing full-expression.
9309   getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated);
9310 
9311   if (Invalid) {
9312     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9313                                /*IsInstantiation=*/true);
9314     return ExprError();
9315   }
9316 
9317   // Instantiate the body of the lambda expression.
9318   StmtResult Body = getDerived().TransformStmt(E->getBody());
9319   if (Body.isInvalid()) {
9320     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
9321                                /*IsInstantiation=*/true);
9322     return ExprError();
9323   }
9324 
9325   return getSema().ActOnLambdaExpr(E->getLocStart(), Body.get(),
9326                                    /*CurScope=*/nullptr,
9327                                    /*IsInstantiation=*/true);
9328 }
9329 
9330 template<typename Derived>
9331 ExprResult
9332 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
9333                                                   CXXUnresolvedConstructExpr *E) {
9334   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
9335   if (!T)
9336     return ExprError();
9337 
9338   bool ArgumentChanged = false;
9339   SmallVector<Expr*, 8> Args;
9340   Args.reserve(E->arg_size());
9341   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
9342                                   &ArgumentChanged))
9343     return ExprError();
9344 
9345   if (!getDerived().AlwaysRebuild() &&
9346       T == E->getTypeSourceInfo() &&
9347       !ArgumentChanged)
9348     return E;
9349 
9350   // FIXME: we're faking the locations of the commas
9351   return getDerived().RebuildCXXUnresolvedConstructExpr(T,
9352                                                         E->getLParenLoc(),
9353                                                         Args,
9354                                                         E->getRParenLoc());
9355 }
9356 
9357 template<typename Derived>
9358 ExprResult
9359 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
9360                                              CXXDependentScopeMemberExpr *E) {
9361   // Transform the base of the expression.
9362   ExprResult Base((Expr*) nullptr);
9363   Expr *OldBase;
9364   QualType BaseType;
9365   QualType ObjectType;
9366   if (!E->isImplicitAccess()) {
9367     OldBase = E->getBase();
9368     Base = getDerived().TransformExpr(OldBase);
9369     if (Base.isInvalid())
9370       return ExprError();
9371 
9372     // Start the member reference and compute the object's type.
9373     ParsedType ObjectTy;
9374     bool MayBePseudoDestructor = false;
9375     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
9376                                                 E->getOperatorLoc(),
9377                                       E->isArrow()? tok::arrow : tok::period,
9378                                                 ObjectTy,
9379                                                 MayBePseudoDestructor);
9380     if (Base.isInvalid())
9381       return ExprError();
9382 
9383     ObjectType = ObjectTy.get();
9384     BaseType = ((Expr*) Base.get())->getType();
9385   } else {
9386     OldBase = nullptr;
9387     BaseType = getDerived().TransformType(E->getBaseType());
9388     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
9389   }
9390 
9391   // Transform the first part of the nested-name-specifier that qualifies
9392   // the member name.
9393   NamedDecl *FirstQualifierInScope
9394     = getDerived().TransformFirstQualifierInScope(
9395                                             E->getFirstQualifierFoundInScope(),
9396                                             E->getQualifierLoc().getBeginLoc());
9397 
9398   NestedNameSpecifierLoc QualifierLoc;
9399   if (E->getQualifier()) {
9400     QualifierLoc
9401       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
9402                                                      ObjectType,
9403                                                      FirstQualifierInScope);
9404     if (!QualifierLoc)
9405       return ExprError();
9406   }
9407 
9408   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9409 
9410   // TODO: If this is a conversion-function-id, verify that the
9411   // destination type name (if present) resolves the same way after
9412   // instantiation as it did in the local scope.
9413 
9414   DeclarationNameInfo NameInfo
9415     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
9416   if (!NameInfo.getName())
9417     return ExprError();
9418 
9419   if (!E->hasExplicitTemplateArgs()) {
9420     // This is a reference to a member without an explicitly-specified
9421     // template argument list. Optimize for this common case.
9422     if (!getDerived().AlwaysRebuild() &&
9423         Base.get() == OldBase &&
9424         BaseType == E->getBaseType() &&
9425         QualifierLoc == E->getQualifierLoc() &&
9426         NameInfo.getName() == E->getMember() &&
9427         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
9428       return E;
9429 
9430     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9431                                                        BaseType,
9432                                                        E->isArrow(),
9433                                                        E->getOperatorLoc(),
9434                                                        QualifierLoc,
9435                                                        TemplateKWLoc,
9436                                                        FirstQualifierInScope,
9437                                                        NameInfo,
9438                                                        /*TemplateArgs*/nullptr);
9439   }
9440 
9441   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
9442   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9443                                               E->getNumTemplateArgs(),
9444                                               TransArgs))
9445     return ExprError();
9446 
9447   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
9448                                                      BaseType,
9449                                                      E->isArrow(),
9450                                                      E->getOperatorLoc(),
9451                                                      QualifierLoc,
9452                                                      TemplateKWLoc,
9453                                                      FirstQualifierInScope,
9454                                                      NameInfo,
9455                                                      &TransArgs);
9456 }
9457 
9458 template<typename Derived>
9459 ExprResult
9460 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
9461   // Transform the base of the expression.
9462   ExprResult Base((Expr*) nullptr);
9463   QualType BaseType;
9464   if (!Old->isImplicitAccess()) {
9465     Base = getDerived().TransformExpr(Old->getBase());
9466     if (Base.isInvalid())
9467       return ExprError();
9468     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
9469                                                      Old->isArrow());
9470     if (Base.isInvalid())
9471       return ExprError();
9472     BaseType = Base.get()->getType();
9473   } else {
9474     BaseType = getDerived().TransformType(Old->getBaseType());
9475   }
9476 
9477   NestedNameSpecifierLoc QualifierLoc;
9478   if (Old->getQualifierLoc()) {
9479     QualifierLoc
9480     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
9481     if (!QualifierLoc)
9482       return ExprError();
9483   }
9484 
9485   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
9486 
9487   LookupResult R(SemaRef, Old->getMemberNameInfo(),
9488                  Sema::LookupOrdinaryName);
9489 
9490   // Transform all the decls.
9491   for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(),
9492          E = Old->decls_end(); I != E; ++I) {
9493     NamedDecl *InstD = static_cast<NamedDecl*>(
9494                                 getDerived().TransformDecl(Old->getMemberLoc(),
9495                                                            *I));
9496     if (!InstD) {
9497       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
9498       // This can happen because of dependent hiding.
9499       if (isa<UsingShadowDecl>(*I))
9500         continue;
9501       else {
9502         R.clear();
9503         return ExprError();
9504       }
9505     }
9506 
9507     // Expand using declarations.
9508     if (isa<UsingDecl>(InstD)) {
9509       UsingDecl *UD = cast<UsingDecl>(InstD);
9510       for (auto *I : UD->shadows())
9511         R.addDecl(I);
9512       continue;
9513     }
9514 
9515     R.addDecl(InstD);
9516   }
9517 
9518   R.resolveKind();
9519 
9520   // Determine the naming class.
9521   if (Old->getNamingClass()) {
9522     CXXRecordDecl *NamingClass
9523       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
9524                                                           Old->getMemberLoc(),
9525                                                         Old->getNamingClass()));
9526     if (!NamingClass)
9527       return ExprError();
9528 
9529     R.setNamingClass(NamingClass);
9530   }
9531 
9532   TemplateArgumentListInfo TransArgs;
9533   if (Old->hasExplicitTemplateArgs()) {
9534     TransArgs.setLAngleLoc(Old->getLAngleLoc());
9535     TransArgs.setRAngleLoc(Old->getRAngleLoc());
9536     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
9537                                                 Old->getNumTemplateArgs(),
9538                                                 TransArgs))
9539       return ExprError();
9540   }
9541 
9542   // FIXME: to do this check properly, we will need to preserve the
9543   // first-qualifier-in-scope here, just in case we had a dependent
9544   // base (and therefore couldn't do the check) and a
9545   // nested-name-qualifier (and therefore could do the lookup).
9546   NamedDecl *FirstQualifierInScope = nullptr;
9547 
9548   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
9549                                                   BaseType,
9550                                                   Old->getOperatorLoc(),
9551                                                   Old->isArrow(),
9552                                                   QualifierLoc,
9553                                                   TemplateKWLoc,
9554                                                   FirstQualifierInScope,
9555                                                   R,
9556                                               (Old->hasExplicitTemplateArgs()
9557                                                   ? &TransArgs : nullptr));
9558 }
9559 
9560 template<typename Derived>
9561 ExprResult
9562 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
9563   EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated);
9564   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
9565   if (SubExpr.isInvalid())
9566     return ExprError();
9567 
9568   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
9569     return E;
9570 
9571   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
9572 }
9573 
9574 template<typename Derived>
9575 ExprResult
9576 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
9577   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
9578   if (Pattern.isInvalid())
9579     return ExprError();
9580 
9581   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
9582     return E;
9583 
9584   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
9585                                            E->getNumExpansions());
9586 }
9587 
9588 template<typename Derived>
9589 ExprResult
9590 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
9591   // If E is not value-dependent, then nothing will change when we transform it.
9592   // Note: This is an instantiation-centric view.
9593   if (!E->isValueDependent())
9594     return E;
9595 
9596   // Note: None of the implementations of TryExpandParameterPacks can ever
9597   // produce a diagnostic when given only a single unexpanded parameter pack,
9598   // so
9599   UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
9600   bool ShouldExpand = false;
9601   bool RetainExpansion = false;
9602   Optional<unsigned> NumExpansions;
9603   if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
9604                                            Unexpanded,
9605                                            ShouldExpand, RetainExpansion,
9606                                            NumExpansions))
9607     return ExprError();
9608 
9609   if (RetainExpansion)
9610     return E;
9611 
9612   NamedDecl *Pack = E->getPack();
9613   if (!ShouldExpand) {
9614     Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(),
9615                                                               Pack));
9616     if (!Pack)
9617       return ExprError();
9618   }
9619 
9620 
9621   // We now know the length of the parameter pack, so build a new expression
9622   // that stores that length.
9623   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
9624                                             E->getPackLoc(), E->getRParenLoc(),
9625                                             NumExpansions);
9626 }
9627 
9628 template<typename Derived>
9629 ExprResult
9630 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
9631                                           SubstNonTypeTemplateParmPackExpr *E) {
9632   // Default behavior is to do nothing with this transformation.
9633   return E;
9634 }
9635 
9636 template<typename Derived>
9637 ExprResult
9638 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
9639                                           SubstNonTypeTemplateParmExpr *E) {
9640   // Default behavior is to do nothing with this transformation.
9641   return E;
9642 }
9643 
9644 template<typename Derived>
9645 ExprResult
9646 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
9647   // Default behavior is to do nothing with this transformation.
9648   return E;
9649 }
9650 
9651 template<typename Derived>
9652 ExprResult
9653 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
9654                                                   MaterializeTemporaryExpr *E) {
9655   return getDerived().TransformExpr(E->GetTemporaryExpr());
9656 }
9657 
9658 template<typename Derived>
9659 ExprResult
9660 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
9661   Expr *Pattern = E->getPattern();
9662 
9663   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9664   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
9665   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9666 
9667   // Determine whether the set of unexpanded parameter packs can and should
9668   // be expanded.
9669   bool Expand = true;
9670   bool RetainExpansion = false;
9671   Optional<unsigned> NumExpansions;
9672   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
9673                                            Pattern->getSourceRange(),
9674                                            Unexpanded,
9675                                            Expand, RetainExpansion,
9676                                            NumExpansions))
9677     return true;
9678 
9679   if (!Expand) {
9680     // Do not expand any packs here, just transform and rebuild a fold
9681     // expression.
9682     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9683 
9684     ExprResult LHS =
9685         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
9686     if (LHS.isInvalid())
9687       return true;
9688 
9689     ExprResult RHS =
9690         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
9691     if (RHS.isInvalid())
9692       return true;
9693 
9694     if (!getDerived().AlwaysRebuild() &&
9695         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
9696       return E;
9697 
9698     return getDerived().RebuildCXXFoldExpr(
9699         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
9700         RHS.get(), E->getLocEnd());
9701   }
9702 
9703   // The transform has determined that we should perform an elementwise
9704   // expansion of the pattern. Do so.
9705   ExprResult Result = getDerived().TransformExpr(E->getInit());
9706   if (Result.isInvalid())
9707     return true;
9708   bool LeftFold = E->isLeftFold();
9709 
9710   // If we're retaining an expansion for a right fold, it is the innermost
9711   // component and takes the init (if any).
9712   if (!LeftFold && RetainExpansion) {
9713     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9714 
9715     ExprResult Out = getDerived().TransformExpr(Pattern);
9716     if (Out.isInvalid())
9717       return true;
9718 
9719     Result = getDerived().RebuildCXXFoldExpr(
9720         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
9721         Result.get(), E->getLocEnd());
9722     if (Result.isInvalid())
9723       return true;
9724   }
9725 
9726   for (unsigned I = 0; I != *NumExpansions; ++I) {
9727     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
9728         getSema(), LeftFold ? I : *NumExpansions - I - 1);
9729     ExprResult Out = getDerived().TransformExpr(Pattern);
9730     if (Out.isInvalid())
9731       return true;
9732 
9733     if (Out.get()->containsUnexpandedParameterPack()) {
9734       // We still have a pack; retain a pack expansion for this slice.
9735       Result = getDerived().RebuildCXXFoldExpr(
9736           E->getLocStart(),
9737           LeftFold ? Result.get() : Out.get(),
9738           E->getOperator(), E->getEllipsisLoc(),
9739           LeftFold ? Out.get() : Result.get(),
9740           E->getLocEnd());
9741     } else if (Result.isUsable()) {
9742       // We've got down to a single element; build a binary operator.
9743       Result = getDerived().RebuildBinaryOperator(
9744           E->getEllipsisLoc(), E->getOperator(),
9745           LeftFold ? Result.get() : Out.get(),
9746           LeftFold ? Out.get() : Result.get());
9747     } else
9748       Result = Out;
9749 
9750     if (Result.isInvalid())
9751       return true;
9752   }
9753 
9754   // If we're retaining an expansion for a left fold, it is the outermost
9755   // component and takes the complete expansion so far as its init (if any).
9756   if (LeftFold && RetainExpansion) {
9757     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
9758 
9759     ExprResult Out = getDerived().TransformExpr(Pattern);
9760     if (Out.isInvalid())
9761       return true;
9762 
9763     Result = getDerived().RebuildCXXFoldExpr(
9764         E->getLocStart(), Result.get(),
9765         E->getOperator(), E->getEllipsisLoc(),
9766         Out.get(), E->getLocEnd());
9767     if (Result.isInvalid())
9768       return true;
9769   }
9770 
9771   // If we had no init and an empty pack, and we're not retaining an expansion,
9772   // then produce a fallback value or error.
9773   if (Result.isUnset())
9774     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
9775                                                 E->getOperator());
9776 
9777   return Result;
9778 }
9779 
9780 template<typename Derived>
9781 ExprResult
9782 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
9783     CXXStdInitializerListExpr *E) {
9784   return getDerived().TransformExpr(E->getSubExpr());
9785 }
9786 
9787 template<typename Derived>
9788 ExprResult
9789 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
9790   return SemaRef.MaybeBindToTemporary(E);
9791 }
9792 
9793 template<typename Derived>
9794 ExprResult
9795 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
9796   return E;
9797 }
9798 
9799 template<typename Derived>
9800 ExprResult
9801 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
9802   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9803   if (SubExpr.isInvalid())
9804     return ExprError();
9805 
9806   if (!getDerived().AlwaysRebuild() &&
9807       SubExpr.get() == E->getSubExpr())
9808     return E;
9809 
9810   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
9811 }
9812 
9813 template<typename Derived>
9814 ExprResult
9815 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
9816   // Transform each of the elements.
9817   SmallVector<Expr *, 8> Elements;
9818   bool ArgChanged = false;
9819   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
9820                                   /*IsCall=*/false, Elements, &ArgChanged))
9821     return ExprError();
9822 
9823   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9824     return SemaRef.MaybeBindToTemporary(E);
9825 
9826   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
9827                                               Elements.data(),
9828                                               Elements.size());
9829 }
9830 
9831 template<typename Derived>
9832 ExprResult
9833 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
9834                                                     ObjCDictionaryLiteral *E) {
9835   // Transform each of the elements.
9836   SmallVector<ObjCDictionaryElement, 8> Elements;
9837   bool ArgChanged = false;
9838   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
9839     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
9840 
9841     if (OrigElement.isPackExpansion()) {
9842       // This key/value element is a pack expansion.
9843       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
9844       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
9845       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
9846       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
9847 
9848       // Determine whether the set of unexpanded parameter packs can
9849       // and should be expanded.
9850       bool Expand = true;
9851       bool RetainExpansion = false;
9852       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
9853       Optional<unsigned> NumExpansions = OrigNumExpansions;
9854       SourceRange PatternRange(OrigElement.Key->getLocStart(),
9855                                OrigElement.Value->getLocEnd());
9856      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
9857                                                PatternRange,
9858                                                Unexpanded,
9859                                                Expand, RetainExpansion,
9860                                                NumExpansions))
9861         return ExprError();
9862 
9863       if (!Expand) {
9864         // The transform has determined that we should perform a simple
9865         // transformation on the pack expansion, producing another pack
9866         // expansion.
9867         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
9868         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9869         if (Key.isInvalid())
9870           return ExprError();
9871 
9872         if (Key.get() != OrigElement.Key)
9873           ArgChanged = true;
9874 
9875         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9876         if (Value.isInvalid())
9877           return ExprError();
9878 
9879         if (Value.get() != OrigElement.Value)
9880           ArgChanged = true;
9881 
9882         ObjCDictionaryElement Expansion = {
9883           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
9884         };
9885         Elements.push_back(Expansion);
9886         continue;
9887       }
9888 
9889       // Record right away that the argument was changed.  This needs
9890       // to happen even if the array expands to nothing.
9891       ArgChanged = true;
9892 
9893       // The transform has determined that we should perform an elementwise
9894       // expansion of the pattern. Do so.
9895       for (unsigned I = 0; I != *NumExpansions; ++I) {
9896         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
9897         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9898         if (Key.isInvalid())
9899           return ExprError();
9900 
9901         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
9902         if (Value.isInvalid())
9903           return ExprError();
9904 
9905         ObjCDictionaryElement Element = {
9906           Key.get(), Value.get(), SourceLocation(), NumExpansions
9907         };
9908 
9909         // If any unexpanded parameter packs remain, we still have a
9910         // pack expansion.
9911         // FIXME: Can this really happen?
9912         if (Key.get()->containsUnexpandedParameterPack() ||
9913             Value.get()->containsUnexpandedParameterPack())
9914           Element.EllipsisLoc = OrigElement.EllipsisLoc;
9915 
9916         Elements.push_back(Element);
9917       }
9918 
9919       // FIXME: Retain a pack expansion if RetainExpansion is true.
9920 
9921       // We've finished with this pack expansion.
9922       continue;
9923     }
9924 
9925     // Transform and check key.
9926     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
9927     if (Key.isInvalid())
9928       return ExprError();
9929 
9930     if (Key.get() != OrigElement.Key)
9931       ArgChanged = true;
9932 
9933     // Transform and check value.
9934     ExprResult Value
9935       = getDerived().TransformExpr(OrigElement.Value);
9936     if (Value.isInvalid())
9937       return ExprError();
9938 
9939     if (Value.get() != OrigElement.Value)
9940       ArgChanged = true;
9941 
9942     ObjCDictionaryElement Element = {
9943       Key.get(), Value.get(), SourceLocation(), None
9944     };
9945     Elements.push_back(Element);
9946   }
9947 
9948   if (!getDerived().AlwaysRebuild() && !ArgChanged)
9949     return SemaRef.MaybeBindToTemporary(E);
9950 
9951   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
9952                                                    Elements.data(),
9953                                                    Elements.size());
9954 }
9955 
9956 template<typename Derived>
9957 ExprResult
9958 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
9959   TypeSourceInfo *EncodedTypeInfo
9960     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
9961   if (!EncodedTypeInfo)
9962     return ExprError();
9963 
9964   if (!getDerived().AlwaysRebuild() &&
9965       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
9966     return E;
9967 
9968   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
9969                                             EncodedTypeInfo,
9970                                             E->getRParenLoc());
9971 }
9972 
9973 template<typename Derived>
9974 ExprResult TreeTransform<Derived>::
9975 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
9976   // This is a kind of implicit conversion, and it needs to get dropped
9977   // and recomputed for the same general reasons that ImplicitCastExprs
9978   // do, as well a more specific one: this expression is only valid when
9979   // it appears *immediately* as an argument expression.
9980   return getDerived().TransformExpr(E->getSubExpr());
9981 }
9982 
9983 template<typename Derived>
9984 ExprResult TreeTransform<Derived>::
9985 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
9986   TypeSourceInfo *TSInfo
9987     = getDerived().TransformType(E->getTypeInfoAsWritten());
9988   if (!TSInfo)
9989     return ExprError();
9990 
9991   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
9992   if (Result.isInvalid())
9993     return ExprError();
9994 
9995   if (!getDerived().AlwaysRebuild() &&
9996       TSInfo == E->getTypeInfoAsWritten() &&
9997       Result.get() == E->getSubExpr())
9998     return E;
9999 
10000   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
10001                                       E->getBridgeKeywordLoc(), TSInfo,
10002                                       Result.get());
10003 }
10004 
10005 template<typename Derived>
10006 ExprResult
10007 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
10008   // Transform arguments.
10009   bool ArgChanged = false;
10010   SmallVector<Expr*, 8> Args;
10011   Args.reserve(E->getNumArgs());
10012   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
10013                                   &ArgChanged))
10014     return ExprError();
10015 
10016   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
10017     // Class message: transform the receiver type.
10018     TypeSourceInfo *ReceiverTypeInfo
10019       = getDerived().TransformType(E->getClassReceiverTypeInfo());
10020     if (!ReceiverTypeInfo)
10021       return ExprError();
10022 
10023     // If nothing changed, just retain the existing message send.
10024     if (!getDerived().AlwaysRebuild() &&
10025         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
10026       return SemaRef.MaybeBindToTemporary(E);
10027 
10028     // Build a new class message send.
10029     SmallVector<SourceLocation, 16> SelLocs;
10030     E->getSelectorLocs(SelLocs);
10031     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
10032                                                E->getSelector(),
10033                                                SelLocs,
10034                                                E->getMethodDecl(),
10035                                                E->getLeftLoc(),
10036                                                Args,
10037                                                E->getRightLoc());
10038   }
10039 
10040   // Instance message: transform the receiver
10041   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
10042          "Only class and instance messages may be instantiated");
10043   ExprResult Receiver
10044     = getDerived().TransformExpr(E->getInstanceReceiver());
10045   if (Receiver.isInvalid())
10046     return ExprError();
10047 
10048   // If nothing changed, just retain the existing message send.
10049   if (!getDerived().AlwaysRebuild() &&
10050       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
10051     return SemaRef.MaybeBindToTemporary(E);
10052 
10053   // Build a new instance message send.
10054   SmallVector<SourceLocation, 16> SelLocs;
10055   E->getSelectorLocs(SelLocs);
10056   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
10057                                              E->getSelector(),
10058                                              SelLocs,
10059                                              E->getMethodDecl(),
10060                                              E->getLeftLoc(),
10061                                              Args,
10062                                              E->getRightLoc());
10063 }
10064 
10065 template<typename Derived>
10066 ExprResult
10067 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
10068   return E;
10069 }
10070 
10071 template<typename Derived>
10072 ExprResult
10073 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
10074   return E;
10075 }
10076 
10077 template<typename Derived>
10078 ExprResult
10079 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
10080   // Transform the base expression.
10081   ExprResult Base = getDerived().TransformExpr(E->getBase());
10082   if (Base.isInvalid())
10083     return ExprError();
10084 
10085   // We don't need to transform the ivar; it will never change.
10086 
10087   // If nothing changed, just retain the existing expression.
10088   if (!getDerived().AlwaysRebuild() &&
10089       Base.get() == E->getBase())
10090     return E;
10091 
10092   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
10093                                              E->getLocation(),
10094                                              E->isArrow(), E->isFreeIvar());
10095 }
10096 
10097 template<typename Derived>
10098 ExprResult
10099 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
10100   // 'super' and types never change. Property never changes. Just
10101   // retain the existing expression.
10102   if (!E->isObjectReceiver())
10103     return E;
10104 
10105   // Transform the base expression.
10106   ExprResult Base = getDerived().TransformExpr(E->getBase());
10107   if (Base.isInvalid())
10108     return ExprError();
10109 
10110   // We don't need to transform the property; it will never change.
10111 
10112   // If nothing changed, just retain the existing expression.
10113   if (!getDerived().AlwaysRebuild() &&
10114       Base.get() == E->getBase())
10115     return E;
10116 
10117   if (E->isExplicitProperty())
10118     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10119                                                    E->getExplicitProperty(),
10120                                                    E->getLocation());
10121 
10122   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
10123                                                  SemaRef.Context.PseudoObjectTy,
10124                                                  E->getImplicitPropertyGetter(),
10125                                                  E->getImplicitPropertySetter(),
10126                                                  E->getLocation());
10127 }
10128 
10129 template<typename Derived>
10130 ExprResult
10131 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
10132   // Transform the base expression.
10133   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
10134   if (Base.isInvalid())
10135     return ExprError();
10136 
10137   // Transform the key expression.
10138   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
10139   if (Key.isInvalid())
10140     return ExprError();
10141 
10142   // If nothing changed, just retain the existing expression.
10143   if (!getDerived().AlwaysRebuild() &&
10144       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
10145     return E;
10146 
10147   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
10148                                                   Base.get(), Key.get(),
10149                                                   E->getAtIndexMethodDecl(),
10150                                                   E->setAtIndexMethodDecl());
10151 }
10152 
10153 template<typename Derived>
10154 ExprResult
10155 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
10156   // Transform the base expression.
10157   ExprResult Base = getDerived().TransformExpr(E->getBase());
10158   if (Base.isInvalid())
10159     return ExprError();
10160 
10161   // If nothing changed, just retain the existing expression.
10162   if (!getDerived().AlwaysRebuild() &&
10163       Base.get() == E->getBase())
10164     return E;
10165 
10166   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
10167                                          E->getOpLoc(),
10168                                          E->isArrow());
10169 }
10170 
10171 template<typename Derived>
10172 ExprResult
10173 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
10174   bool ArgumentChanged = false;
10175   SmallVector<Expr*, 8> SubExprs;
10176   SubExprs.reserve(E->getNumSubExprs());
10177   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10178                                   SubExprs, &ArgumentChanged))
10179     return ExprError();
10180 
10181   if (!getDerived().AlwaysRebuild() &&
10182       !ArgumentChanged)
10183     return E;
10184 
10185   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
10186                                                SubExprs,
10187                                                E->getRParenLoc());
10188 }
10189 
10190 template<typename Derived>
10191 ExprResult
10192 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
10193   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
10194   if (SrcExpr.isInvalid())
10195     return ExprError();
10196 
10197   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10198   if (!Type)
10199     return ExprError();
10200 
10201   if (!getDerived().AlwaysRebuild() &&
10202       Type == E->getTypeSourceInfo() &&
10203       SrcExpr.get() == E->getSrcExpr())
10204     return E;
10205 
10206   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
10207                                                SrcExpr.get(), Type,
10208                                                E->getRParenLoc());
10209 }
10210 
10211 template<typename Derived>
10212 ExprResult
10213 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
10214   BlockDecl *oldBlock = E->getBlockDecl();
10215 
10216   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
10217   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
10218 
10219   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
10220   blockScope->TheDecl->setBlockMissingReturnType(
10221                          oldBlock->blockMissingReturnType());
10222 
10223   SmallVector<ParmVarDecl*, 4> params;
10224   SmallVector<QualType, 4> paramTypes;
10225 
10226   // Parameter substitution.
10227   if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(),
10228                                                oldBlock->param_begin(),
10229                                                oldBlock->param_size(),
10230                                                nullptr, paramTypes, &params)) {
10231     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10232     return ExprError();
10233   }
10234 
10235   const FunctionProtoType *exprFunctionType = E->getFunctionType();
10236   QualType exprResultType =
10237       getDerived().TransformType(exprFunctionType->getReturnType());
10238 
10239   QualType functionType =
10240     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes,
10241                                           exprFunctionType->getExtProtoInfo());
10242   blockScope->FunctionType = functionType;
10243 
10244   // Set the parameters on the block decl.
10245   if (!params.empty())
10246     blockScope->TheDecl->setParams(params);
10247 
10248   if (!oldBlock->blockMissingReturnType()) {
10249     blockScope->HasImplicitReturnType = false;
10250     blockScope->ReturnType = exprResultType;
10251   }
10252 
10253   // Transform the body
10254   StmtResult body = getDerived().TransformStmt(E->getBody());
10255   if (body.isInvalid()) {
10256     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
10257     return ExprError();
10258   }
10259 
10260 #ifndef NDEBUG
10261   // In builds with assertions, make sure that we captured everything we
10262   // captured before.
10263   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
10264     for (const auto &I : oldBlock->captures()) {
10265       VarDecl *oldCapture = I.getVariable();
10266 
10267       // Ignore parameter packs.
10268       if (isa<ParmVarDecl>(oldCapture) &&
10269           cast<ParmVarDecl>(oldCapture)->isParameterPack())
10270         continue;
10271 
10272       VarDecl *newCapture =
10273         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
10274                                                  oldCapture));
10275       assert(blockScope->CaptureMap.count(newCapture));
10276     }
10277     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
10278   }
10279 #endif
10280 
10281   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
10282                                     /*Scope=*/nullptr);
10283 }
10284 
10285 template<typename Derived>
10286 ExprResult
10287 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
10288   llvm_unreachable("Cannot transform asType expressions yet");
10289 }
10290 
10291 template<typename Derived>
10292 ExprResult
10293 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
10294   QualType RetTy = getDerived().TransformType(E->getType());
10295   bool ArgumentChanged = false;
10296   SmallVector<Expr*, 8> SubExprs;
10297   SubExprs.reserve(E->getNumSubExprs());
10298   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
10299                                   SubExprs, &ArgumentChanged))
10300     return ExprError();
10301 
10302   if (!getDerived().AlwaysRebuild() &&
10303       !ArgumentChanged)
10304     return E;
10305 
10306   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
10307                                         RetTy, E->getOp(), E->getRParenLoc());
10308 }
10309 
10310 //===----------------------------------------------------------------------===//
10311 // Type reconstruction
10312 //===----------------------------------------------------------------------===//
10313 
10314 template<typename Derived>
10315 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
10316                                                     SourceLocation Star) {
10317   return SemaRef.BuildPointerType(PointeeType, Star,
10318                                   getDerived().getBaseEntity());
10319 }
10320 
10321 template<typename Derived>
10322 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
10323                                                          SourceLocation Star) {
10324   return SemaRef.BuildBlockPointerType(PointeeType, Star,
10325                                        getDerived().getBaseEntity());
10326 }
10327 
10328 template<typename Derived>
10329 QualType
10330 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
10331                                              bool WrittenAsLValue,
10332                                              SourceLocation Sigil) {
10333   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
10334                                     Sigil, getDerived().getBaseEntity());
10335 }
10336 
10337 template<typename Derived>
10338 QualType
10339 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
10340                                                  QualType ClassType,
10341                                                  SourceLocation Sigil) {
10342   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
10343                                         getDerived().getBaseEntity());
10344 }
10345 
10346 template<typename Derived>
10347 QualType
10348 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
10349                                          ArrayType::ArraySizeModifier SizeMod,
10350                                          const llvm::APInt *Size,
10351                                          Expr *SizeExpr,
10352                                          unsigned IndexTypeQuals,
10353                                          SourceRange BracketsRange) {
10354   if (SizeExpr || !Size)
10355     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
10356                                   IndexTypeQuals, BracketsRange,
10357                                   getDerived().getBaseEntity());
10358 
10359   QualType Types[] = {
10360     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
10361     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
10362     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
10363   };
10364   const unsigned NumTypes = llvm::array_lengthof(Types);
10365   QualType SizeType;
10366   for (unsigned I = 0; I != NumTypes; ++I)
10367     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
10368       SizeType = Types[I];
10369       break;
10370     }
10371 
10372   // Note that we can return a VariableArrayType here in the case where
10373   // the element type was a dependent VariableArrayType.
10374   IntegerLiteral *ArraySize
10375       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
10376                                /*FIXME*/BracketsRange.getBegin());
10377   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
10378                                 IndexTypeQuals, BracketsRange,
10379                                 getDerived().getBaseEntity());
10380 }
10381 
10382 template<typename Derived>
10383 QualType
10384 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
10385                                                  ArrayType::ArraySizeModifier SizeMod,
10386                                                  const llvm::APInt &Size,
10387                                                  unsigned IndexTypeQuals,
10388                                                  SourceRange BracketsRange) {
10389   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
10390                                         IndexTypeQuals, BracketsRange);
10391 }
10392 
10393 template<typename Derived>
10394 QualType
10395 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
10396                                           ArrayType::ArraySizeModifier SizeMod,
10397                                                  unsigned IndexTypeQuals,
10398                                                    SourceRange BracketsRange) {
10399   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
10400                                        IndexTypeQuals, BracketsRange);
10401 }
10402 
10403 template<typename Derived>
10404 QualType
10405 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
10406                                           ArrayType::ArraySizeModifier SizeMod,
10407                                                  Expr *SizeExpr,
10408                                                  unsigned IndexTypeQuals,
10409                                                  SourceRange BracketsRange) {
10410   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10411                                        SizeExpr,
10412                                        IndexTypeQuals, BracketsRange);
10413 }
10414 
10415 template<typename Derived>
10416 QualType
10417 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
10418                                           ArrayType::ArraySizeModifier SizeMod,
10419                                                        Expr *SizeExpr,
10420                                                        unsigned IndexTypeQuals,
10421                                                    SourceRange BracketsRange) {
10422   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
10423                                        SizeExpr,
10424                                        IndexTypeQuals, BracketsRange);
10425 }
10426 
10427 template<typename Derived>
10428 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
10429                                                unsigned NumElements,
10430                                                VectorType::VectorKind VecKind) {
10431   // FIXME: semantic checking!
10432   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
10433 }
10434 
10435 template<typename Derived>
10436 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
10437                                                       unsigned NumElements,
10438                                                  SourceLocation AttributeLoc) {
10439   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
10440                           NumElements, true);
10441   IntegerLiteral *VectorSize
10442     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
10443                              AttributeLoc);
10444   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
10445 }
10446 
10447 template<typename Derived>
10448 QualType
10449 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
10450                                                            Expr *SizeExpr,
10451                                                   SourceLocation AttributeLoc) {
10452   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
10453 }
10454 
10455 template<typename Derived>
10456 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
10457     QualType T,
10458     MutableArrayRef<QualType> ParamTypes,
10459     const FunctionProtoType::ExtProtoInfo &EPI) {
10460   return SemaRef.BuildFunctionType(T, ParamTypes,
10461                                    getDerived().getBaseLocation(),
10462                                    getDerived().getBaseEntity(),
10463                                    EPI);
10464 }
10465 
10466 template<typename Derived>
10467 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
10468   return SemaRef.Context.getFunctionNoProtoType(T);
10469 }
10470 
10471 template<typename Derived>
10472 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) {
10473   assert(D && "no decl found");
10474   if (D->isInvalidDecl()) return QualType();
10475 
10476   // FIXME: Doesn't account for ObjCInterfaceDecl!
10477   TypeDecl *Ty;
10478   if (isa<UsingDecl>(D)) {
10479     UsingDecl *Using = cast<UsingDecl>(D);
10480     assert(Using->hasTypename() &&
10481            "UnresolvedUsingTypenameDecl transformed to non-typename using");
10482 
10483     // A valid resolved using typename decl points to exactly one type decl.
10484     assert(++Using->shadow_begin() == Using->shadow_end());
10485     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
10486 
10487   } else {
10488     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
10489            "UnresolvedUsingTypenameDecl transformed to non-using decl");
10490     Ty = cast<UnresolvedUsingTypenameDecl>(D);
10491   }
10492 
10493   return SemaRef.Context.getTypeDeclType(Ty);
10494 }
10495 
10496 template<typename Derived>
10497 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
10498                                                        SourceLocation Loc) {
10499   return SemaRef.BuildTypeofExprType(E, Loc);
10500 }
10501 
10502 template<typename Derived>
10503 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
10504   return SemaRef.Context.getTypeOfType(Underlying);
10505 }
10506 
10507 template<typename Derived>
10508 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
10509                                                      SourceLocation Loc) {
10510   return SemaRef.BuildDecltypeType(E, Loc);
10511 }
10512 
10513 template<typename Derived>
10514 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
10515                                             UnaryTransformType::UTTKind UKind,
10516                                             SourceLocation Loc) {
10517   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
10518 }
10519 
10520 template<typename Derived>
10521 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
10522                                                       TemplateName Template,
10523                                              SourceLocation TemplateNameLoc,
10524                                      TemplateArgumentListInfo &TemplateArgs) {
10525   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
10526 }
10527 
10528 template<typename Derived>
10529 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
10530                                                    SourceLocation KWLoc) {
10531   return SemaRef.BuildAtomicType(ValueType, KWLoc);
10532 }
10533 
10534 template<typename Derived>
10535 TemplateName
10536 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10537                                             bool TemplateKW,
10538                                             TemplateDecl *Template) {
10539   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
10540                                                   Template);
10541 }
10542 
10543 template<typename Derived>
10544 TemplateName
10545 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10546                                             const IdentifierInfo &Name,
10547                                             SourceLocation NameLoc,
10548                                             QualType ObjectType,
10549                                             NamedDecl *FirstQualifierInScope) {
10550   UnqualifiedId TemplateName;
10551   TemplateName.setIdentifier(&Name, NameLoc);
10552   Sema::TemplateTy Template;
10553   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10554   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10555                                        SS, TemplateKWLoc, TemplateName,
10556                                        ParsedType::make(ObjectType),
10557                                        /*EnteringContext=*/false,
10558                                        Template);
10559   return Template.get();
10560 }
10561 
10562 template<typename Derived>
10563 TemplateName
10564 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
10565                                             OverloadedOperatorKind Operator,
10566                                             SourceLocation NameLoc,
10567                                             QualType ObjectType) {
10568   UnqualifiedId Name;
10569   // FIXME: Bogus location information.
10570   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
10571   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
10572   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10573   Sema::TemplateTy Template;
10574   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
10575                                        SS, TemplateKWLoc, Name,
10576                                        ParsedType::make(ObjectType),
10577                                        /*EnteringContext=*/false,
10578                                        Template);
10579   return Template.get();
10580 }
10581 
10582 template<typename Derived>
10583 ExprResult
10584 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
10585                                                    SourceLocation OpLoc,
10586                                                    Expr *OrigCallee,
10587                                                    Expr *First,
10588                                                    Expr *Second) {
10589   Expr *Callee = OrigCallee->IgnoreParenCasts();
10590   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
10591 
10592   if (First->getObjectKind() == OK_ObjCProperty) {
10593     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10594     if (BinaryOperator::isAssignmentOp(Opc))
10595       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
10596                                                  First, Second);
10597     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
10598     if (Result.isInvalid())
10599       return ExprError();
10600     First = Result.get();
10601   }
10602 
10603   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
10604     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
10605     if (Result.isInvalid())
10606       return ExprError();
10607     Second = Result.get();
10608   }
10609 
10610   // Determine whether this should be a builtin operation.
10611   if (Op == OO_Subscript) {
10612     if (!First->getType()->isOverloadableType() &&
10613         !Second->getType()->isOverloadableType())
10614       return getSema().CreateBuiltinArraySubscriptExpr(First,
10615                                                        Callee->getLocStart(),
10616                                                        Second, OpLoc);
10617   } else if (Op == OO_Arrow) {
10618     // -> is never a builtin operation.
10619     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
10620   } else if (Second == nullptr || isPostIncDec) {
10621     if (!First->getType()->isOverloadableType()) {
10622       // The argument is not of overloadable type, so try to create a
10623       // built-in unary operation.
10624       UnaryOperatorKind Opc
10625         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10626 
10627       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
10628     }
10629   } else {
10630     if (!First->getType()->isOverloadableType() &&
10631         !Second->getType()->isOverloadableType()) {
10632       // Neither of the arguments is an overloadable type, so try to
10633       // create a built-in binary operation.
10634       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10635       ExprResult Result
10636         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
10637       if (Result.isInvalid())
10638         return ExprError();
10639 
10640       return Result;
10641     }
10642   }
10643 
10644   // Compute the transformed set of functions (and function templates) to be
10645   // used during overload resolution.
10646   UnresolvedSet<16> Functions;
10647 
10648   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
10649     assert(ULE->requiresADL());
10650     Functions.append(ULE->decls_begin(), ULE->decls_end());
10651   } else {
10652     // If we've resolved this to a particular non-member function, just call
10653     // that function. If we resolved it to a member function,
10654     // CreateOverloaded* will find that function for us.
10655     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
10656     if (!isa<CXXMethodDecl>(ND))
10657       Functions.addDecl(ND);
10658   }
10659 
10660   // Add any functions found via argument-dependent lookup.
10661   Expr *Args[2] = { First, Second };
10662   unsigned NumArgs = 1 + (Second != nullptr);
10663 
10664   // Create the overloaded operator invocation for unary operators.
10665   if (NumArgs == 1 || isPostIncDec) {
10666     UnaryOperatorKind Opc
10667       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
10668     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First);
10669   }
10670 
10671   if (Op == OO_Subscript) {
10672     SourceLocation LBrace;
10673     SourceLocation RBrace;
10674 
10675     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
10676         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
10677         LBrace = SourceLocation::getFromRawEncoding(
10678                     NameLoc.CXXOperatorName.BeginOpNameLoc);
10679         RBrace = SourceLocation::getFromRawEncoding(
10680                     NameLoc.CXXOperatorName.EndOpNameLoc);
10681     } else {
10682         LBrace = Callee->getLocStart();
10683         RBrace = OpLoc;
10684     }
10685 
10686     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
10687                                                       First, Second);
10688   }
10689 
10690   // Create the overloaded operator invocation for binary operators.
10691   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
10692   ExprResult Result
10693     = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
10694   if (Result.isInvalid())
10695     return ExprError();
10696 
10697   return Result;
10698 }
10699 
10700 template<typename Derived>
10701 ExprResult
10702 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
10703                                                      SourceLocation OperatorLoc,
10704                                                        bool isArrow,
10705                                                        CXXScopeSpec &SS,
10706                                                      TypeSourceInfo *ScopeType,
10707                                                        SourceLocation CCLoc,
10708                                                        SourceLocation TildeLoc,
10709                                         PseudoDestructorTypeStorage Destroyed) {
10710   QualType BaseType = Base->getType();
10711   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
10712       (!isArrow && !BaseType->getAs<RecordType>()) ||
10713       (isArrow && BaseType->getAs<PointerType>() &&
10714        !BaseType->getAs<PointerType>()->getPointeeType()
10715                                               ->template getAs<RecordType>())){
10716     // This pseudo-destructor expression is still a pseudo-destructor.
10717     return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc,
10718                                              isArrow? tok::arrow : tok::period,
10719                                              SS, ScopeType, CCLoc, TildeLoc,
10720                                              Destroyed,
10721                                              /*FIXME?*/true);
10722   }
10723 
10724   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
10725   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
10726                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
10727   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
10728   NameInfo.setNamedTypeInfo(DestroyedType);
10729 
10730   // The scope type is now known to be a valid nested name specifier
10731   // component. Tack it on to the end of the nested name specifier.
10732   if (ScopeType) {
10733     if (!ScopeType->getType()->getAs<TagType>()) {
10734       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
10735                      diag::err_expected_class_or_namespace)
10736           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
10737       return ExprError();
10738     }
10739     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
10740               CCLoc);
10741   }
10742 
10743   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
10744   return getSema().BuildMemberReferenceExpr(Base, BaseType,
10745                                             OperatorLoc, isArrow,
10746                                             SS, TemplateKWLoc,
10747                                             /*FIXME: FirstQualifier*/ nullptr,
10748                                             NameInfo,
10749                                             /*TemplateArgs*/ nullptr);
10750 }
10751 
10752 template<typename Derived>
10753 StmtResult
10754 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
10755   SourceLocation Loc = S->getLocStart();
10756   CapturedDecl *CD = S->getCapturedDecl();
10757   unsigned NumParams = CD->getNumParams();
10758   unsigned ContextParamPos = CD->getContextParamPosition();
10759   SmallVector<Sema::CapturedParamNameType, 4> Params;
10760   for (unsigned I = 0; I < NumParams; ++I) {
10761     if (I != ContextParamPos) {
10762       Params.push_back(
10763              std::make_pair(
10764                   CD->getParam(I)->getName(),
10765                   getDerived().TransformType(CD->getParam(I)->getType())));
10766     } else {
10767       Params.push_back(std::make_pair(StringRef(), QualType()));
10768     }
10769   }
10770   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
10771                                      S->getCapturedRegionKind(), Params);
10772   StmtResult Body;
10773   {
10774     Sema::CompoundScopeRAII CompoundScope(getSema());
10775     Body = getDerived().TransformStmt(S->getCapturedStmt());
10776   }
10777 
10778   if (Body.isInvalid()) {
10779     getSema().ActOnCapturedRegionError();
10780     return StmtError();
10781   }
10782 
10783   return getSema().ActOnCapturedRegionEnd(Body.get());
10784 }
10785 
10786 } // end namespace clang
10787 
10788 #endif
10789