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