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