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