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