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