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