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