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