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