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