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