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