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 "CoroutineStmtBuilder.h"
18 #include "TypeLocBuilder.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/Stmt.h"
27 #include "clang/AST/StmtCXX.h"
28 #include "clang/AST/StmtObjC.h"
29 #include "clang/AST/StmtOpenMP.h"
30 #include "clang/Sema/Designator.h"
31 #include "clang/Sema/Lookup.h"
32 #include "clang/Sema/Ownership.h"
33 #include "clang/Sema/ParsedTemplate.h"
34 #include "clang/Sema/ScopeInfo.h"
35 #include "clang/Sema/SemaDiagnostic.h"
36 #include "clang/Sema/SemaInternal.h"
37 #include "llvm/ADT/ArrayRef.h"
38 #include "llvm/Support/ErrorHandling.h"
39 #include <algorithm>
40 
41 namespace clang {
42 using namespace sema;
43 
44 /// \brief A semantic tree transformation that allows one to transform one
45 /// abstract syntax tree into another.
46 ///
47 /// A new tree transformation is defined by creating a new subclass \c X of
48 /// \c TreeTransform<X> and then overriding certain operations to provide
49 /// behavior specific to that transformation. For example, template
50 /// instantiation is implemented as a tree transformation where the
51 /// transformation of TemplateTypeParmType nodes involves substituting the
52 /// template arguments for their corresponding template parameters; a similar
53 /// transformation is performed for non-type template parameters and
54 /// template template parameters.
55 ///
56 /// This tree-transformation template uses static polymorphism to allow
57 /// subclasses to customize any of its operations. Thus, a subclass can
58 /// override any of the transformation or rebuild operators by providing an
59 /// operation with the same signature as the default implementation. The
60 /// overridding function should not be virtual.
61 ///
62 /// Semantic tree transformations are split into two stages, either of which
63 /// can be replaced by a subclass. The "transform" step transforms an AST node
64 /// or the parts of an AST node using the various transformation functions,
65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
66 /// node of the appropriate kind from the pieces. The default transformation
67 /// routines recursively transform the operands to composite AST nodes (e.g.,
68 /// the pointee type of a PointerType node) and, if any of those operand nodes
69 /// were changed by the transformation, invokes the rebuild operation to create
70 /// a new AST node.
71 ///
72 /// Subclasses can customize the transformation at various levels. The
73 /// most coarse-grained transformations involve replacing TransformType(),
74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
76 /// new implementations.
77 ///
78 /// For more fine-grained transformations, subclasses can replace any of the
79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
81 /// replacing TransformTemplateTypeParmType() allows template instantiation
82 /// to substitute template arguments for their corresponding template
83 /// parameters. Additionally, subclasses can override the \c RebuildXXX
84 /// functions to control how AST nodes are rebuilt when their operands change.
85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
87 /// be able to use more efficient rebuild steps.
88 ///
89 /// There are a handful of other functions that can be overridden, allowing one
90 /// to avoid traversing nodes that don't need any transformation
91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
92 /// operands have not changed (\c AlwaysRebuild()), and customize the
93 /// default locations and entity names used for type-checking
94 /// (\c getBaseLocation(), \c getBaseEntity()).
95 template<typename Derived>
96 class TreeTransform {
97   /// \brief Private RAII object that helps us forget and then re-remember
98   /// the template argument corresponding to a partially-substituted parameter
99   /// pack.
100   class ForgetPartiallySubstitutedPackRAII {
101     Derived &Self;
102     TemplateArgument Old;
103 
104   public:
105     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
106       Old = Self.ForgetPartiallySubstitutedPack();
107     }
108 
109     ~ForgetPartiallySubstitutedPackRAII() {
110       Self.RememberPartiallySubstitutedPack(Old);
111     }
112   };
113 
114 protected:
115   Sema &SemaRef;
116 
117   /// \brief The set of local declarations that have been transformed, for
118   /// cases where we are forced to build new declarations within the transformer
119   /// rather than in the subclass (e.g., lambda closure types).
120   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
121 
122 public:
123   /// \brief Initializes a new tree transformer.
124   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
125 
126   /// \brief Retrieves a reference to the derived class.
127   Derived &getDerived() { return static_cast<Derived&>(*this); }
128 
129   /// \brief Retrieves a reference to the derived class.
130   const Derived &getDerived() const {
131     return static_cast<const Derived&>(*this);
132   }
133 
134   static inline ExprResult Owned(Expr *E) { return E; }
135   static inline StmtResult Owned(Stmt *S) { return S; }
136 
137   /// \brief Retrieves a reference to the semantic analysis object used for
138   /// this tree transform.
139   Sema &getSema() const { return SemaRef; }
140 
141   /// \brief Whether the transformation should always rebuild AST nodes, even
142   /// if none of the children have changed.
143   ///
144   /// Subclasses may override this function to specify when the transformation
145   /// should rebuild all AST nodes.
146   ///
147   /// We must always rebuild all AST nodes when performing variadic template
148   /// pack expansion, in order to avoid violating the AST invariant that each
149   /// statement node appears at most once in its containing declaration.
150   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
151 
152   /// \brief Returns the location of the entity being transformed, if that
153   /// information was not available elsewhere in the AST.
154   ///
155   /// By default, returns no source-location information. Subclasses can
156   /// provide an alternative implementation that provides better location
157   /// information.
158   SourceLocation getBaseLocation() { return SourceLocation(); }
159 
160   /// \brief Returns the name of the entity being transformed, if that
161   /// information was not available elsewhere in the AST.
162   ///
163   /// By default, returns an empty name. Subclasses can provide an alternative
164   /// implementation with a more precise name.
165   DeclarationName getBaseEntity() { return DeclarationName(); }
166 
167   /// \brief Sets the "base" location and entity when that
168   /// information is known based on another transformation.
169   ///
170   /// By default, the source location and entity are ignored. Subclasses can
171   /// override this function to provide a customized implementation.
172   void setBase(SourceLocation Loc, DeclarationName Entity) { }
173 
174   /// \brief RAII object that temporarily sets the base location and entity
175   /// used for reporting diagnostics in types.
176   class TemporaryBase {
177     TreeTransform &Self;
178     SourceLocation OldLocation;
179     DeclarationName OldEntity;
180 
181   public:
182     TemporaryBase(TreeTransform &Self, SourceLocation Location,
183                   DeclarationName Entity) : Self(Self) {
184       OldLocation = Self.getDerived().getBaseLocation();
185       OldEntity = Self.getDerived().getBaseEntity();
186 
187       if (Location.isValid())
188         Self.getDerived().setBase(Location, Entity);
189     }
190 
191     ~TemporaryBase() {
192       Self.getDerived().setBase(OldLocation, OldEntity);
193     }
194   };
195 
196   /// \brief Determine whether the given type \p T has already been
197   /// transformed.
198   ///
199   /// Subclasses can provide an alternative implementation of this routine
200   /// to short-circuit evaluation when it is known that a given type will
201   /// not change. For example, template instantiation need not traverse
202   /// non-dependent types.
203   bool AlreadyTransformed(QualType T) {
204     return T.isNull();
205   }
206 
207   /// \brief Determine whether the given call argument should be dropped, e.g.,
208   /// because it is a default argument.
209   ///
210   /// Subclasses can provide an alternative implementation of this routine to
211   /// determine which kinds of call arguments get dropped. By default,
212   /// CXXDefaultArgument nodes are dropped (prior to transformation).
213   bool DropCallArgument(Expr *E) {
214     return E->isDefaultArgument();
215   }
216 
217   /// \brief Determine whether we should expand a pack expansion with the
218   /// given set of parameter packs into separate arguments by repeatedly
219   /// transforming the pattern.
220   ///
221   /// By default, the transformer never tries to expand pack expansions.
222   /// Subclasses can override this routine to provide different behavior.
223   ///
224   /// \param EllipsisLoc The location of the ellipsis that identifies the
225   /// pack expansion.
226   ///
227   /// \param PatternRange The source range that covers the entire pattern of
228   /// the pack expansion.
229   ///
230   /// \param Unexpanded The set of unexpanded parameter packs within the
231   /// pattern.
232   ///
233   /// \param ShouldExpand Will be set to \c true if the transformer should
234   /// expand the corresponding pack expansions into separate arguments. When
235   /// set, \c NumExpansions must also be set.
236   ///
237   /// \param RetainExpansion Whether the caller should add an unexpanded
238   /// pack expansion after all of the expanded arguments. This is used
239   /// when extending explicitly-specified template argument packs per
240   /// C++0x [temp.arg.explicit]p9.
241   ///
242   /// \param NumExpansions The number of separate arguments that will be in
243   /// the expanded form of the corresponding pack expansion. This is both an
244   /// input and an output parameter, which can be set by the caller if the
245   /// number of expansions is known a priori (e.g., due to a prior substitution)
246   /// and will be set by the callee when the number of expansions is known.
247   /// The callee must set this value when \c ShouldExpand is \c true; it may
248   /// set this value in other cases.
249   ///
250   /// \returns true if an error occurred (e.g., because the parameter packs
251   /// are to be instantiated with arguments of different lengths), false
252   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
253   /// must be set.
254   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
255                                SourceRange PatternRange,
256                                ArrayRef<UnexpandedParameterPack> Unexpanded,
257                                bool &ShouldExpand,
258                                bool &RetainExpansion,
259                                Optional<unsigned> &NumExpansions) {
260     ShouldExpand = false;
261     return false;
262   }
263 
264   /// \brief "Forget" about the partially-substituted pack template argument,
265   /// when performing an instantiation that must preserve the parameter pack
266   /// use.
267   ///
268   /// This routine is meant to be overridden by the template instantiator.
269   TemplateArgument ForgetPartiallySubstitutedPack() {
270     return TemplateArgument();
271   }
272 
273   /// \brief "Remember" the partially-substituted pack template argument
274   /// after performing an instantiation that must preserve the parameter pack
275   /// use.
276   ///
277   /// This routine is meant to be overridden by the template instantiator.
278   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
279 
280   /// \brief Note to the derived class when a function parameter pack is
281   /// being expanded.
282   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
283 
284   /// \brief Transforms the given type into another type.
285   ///
286   /// By default, this routine transforms a type by creating a
287   /// TypeSourceInfo for it and delegating to the appropriate
288   /// function.  This is expensive, but we don't mind, because
289   /// this method is deprecated anyway;  all users should be
290   /// switched to storing TypeSourceInfos.
291   ///
292   /// \returns the transformed type.
293   QualType TransformType(QualType T);
294 
295   /// \brief Transforms the given type-with-location into a new
296   /// type-with-location.
297   ///
298   /// By default, this routine transforms a type by delegating to the
299   /// appropriate TransformXXXType to build a new type.  Subclasses
300   /// may override this function (to take over all type
301   /// transformations) or some set of the TransformXXXType functions
302   /// to alter the transformation.
303   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
304 
305   /// \brief Transform the given type-with-location into a new
306   /// type, collecting location information in the given builder
307   /// as necessary.
308   ///
309   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
310 
311   /// \brief Transform a type that is permitted to produce a
312   /// DeducedTemplateSpecializationType.
313   ///
314   /// This is used in the (relatively rare) contexts where it is acceptable
315   /// for transformation to produce a class template type with deduced
316   /// template arguments.
317   /// @{
318   QualType TransformTypeWithDeducedTST(QualType T);
319   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
320   /// @}
321 
322   /// \brief Transform the given statement.
323   ///
324   /// By default, this routine transforms a statement by delegating to the
325   /// appropriate TransformXXXStmt function to transform a specific kind of
326   /// statement or the TransformExpr() function to transform an expression.
327   /// Subclasses may override this function to transform statements using some
328   /// other mechanism.
329   ///
330   /// \returns the transformed statement.
331   StmtResult TransformStmt(Stmt *S);
332 
333   /// \brief Transform the given statement.
334   ///
335   /// By default, this routine transforms a statement by delegating to the
336   /// appropriate TransformOMPXXXClause function to transform a specific kind
337   /// of clause. Subclasses may override this function to transform statements
338   /// using some other mechanism.
339   ///
340   /// \returns the transformed OpenMP clause.
341   OMPClause *TransformOMPClause(OMPClause *S);
342 
343   /// \brief Transform the given attribute.
344   ///
345   /// By default, this routine transforms a statement by delegating to the
346   /// appropriate TransformXXXAttr function to transform a specific kind
347   /// of attribute. Subclasses may override this function to transform
348   /// attributed statements using some other mechanism.
349   ///
350   /// \returns the transformed attribute
351   const Attr *TransformAttr(const Attr *S);
352 
353 /// \brief Transform the specified attribute.
354 ///
355 /// Subclasses should override the transformation of attributes with a pragma
356 /// spelling to transform expressions stored within the attribute.
357 ///
358 /// \returns the transformed attribute.
359 #define ATTR(X)
360 #define PRAGMA_SPELLING_ATTR(X)                                                \
361   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
362 #include "clang/Basic/AttrList.inc"
363 
364   /// \brief Transform the given expression.
365   ///
366   /// By default, this routine transforms an expression by delegating to the
367   /// appropriate TransformXXXExpr function to build a new expression.
368   /// Subclasses may override this function to transform expressions using some
369   /// other mechanism.
370   ///
371   /// \returns the transformed expression.
372   ExprResult TransformExpr(Expr *E);
373 
374   /// \brief Transform the given initializer.
375   ///
376   /// By default, this routine transforms an initializer by stripping off the
377   /// semantic nodes added by initialization, then passing the result to
378   /// TransformExpr or TransformExprs.
379   ///
380   /// \returns the transformed initializer.
381   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
382 
383   /// \brief Transform the given list of expressions.
384   ///
385   /// This routine transforms a list of expressions by invoking
386   /// \c TransformExpr() for each subexpression. However, it also provides
387   /// support for variadic templates by expanding any pack expansions (if the
388   /// derived class permits such expansion) along the way. When pack expansions
389   /// are present, the number of outputs may not equal the number of inputs.
390   ///
391   /// \param Inputs The set of expressions to be transformed.
392   ///
393   /// \param NumInputs The number of expressions in \c Inputs.
394   ///
395   /// \param IsCall If \c true, then this transform is being performed on
396   /// function-call arguments, and any arguments that should be dropped, will
397   /// be.
398   ///
399   /// \param Outputs The transformed input expressions will be added to this
400   /// vector.
401   ///
402   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
403   /// due to transformation.
404   ///
405   /// \returns true if an error occurred, false otherwise.
406   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
407                       SmallVectorImpl<Expr *> &Outputs,
408                       bool *ArgChanged = nullptr);
409 
410   /// \brief Transform the given declaration, which is referenced from a type
411   /// or expression.
412   ///
413   /// By default, acts as the identity function on declarations, unless the
414   /// transformer has had to transform the declaration itself. Subclasses
415   /// may override this function to provide alternate behavior.
416   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
417     llvm::DenseMap<Decl *, Decl *>::iterator Known
418       = TransformedLocalDecls.find(D);
419     if (Known != TransformedLocalDecls.end())
420       return Known->second;
421 
422     return D;
423   }
424 
425   /// \brief Transform the specified condition.
426   ///
427   /// By default, this transforms the variable and expression and rebuilds
428   /// the condition.
429   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
430                                            Expr *Expr,
431                                            Sema::ConditionKind Kind);
432 
433   /// \brief Transform the attributes associated with the given declaration and
434   /// place them on the new declaration.
435   ///
436   /// By default, this operation does nothing. Subclasses may override this
437   /// behavior to transform attributes.
438   void transformAttrs(Decl *Old, Decl *New) { }
439 
440   /// \brief Note that a local declaration has been transformed by this
441   /// transformer.
442   ///
443   /// Local declarations are typically transformed via a call to
444   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
445   /// the transformer itself has to transform the declarations. This routine
446   /// can be overridden by a subclass that keeps track of such mappings.
447   void transformedLocalDecl(Decl *Old, Decl *New) {
448     TransformedLocalDecls[Old] = New;
449   }
450 
451   /// \brief Transform the definition of the given declaration.
452   ///
453   /// By default, invokes TransformDecl() to transform the declaration.
454   /// Subclasses may override this function to provide alternate behavior.
455   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
456     return getDerived().TransformDecl(Loc, D);
457   }
458 
459   /// \brief Transform the given declaration, which was the first part of a
460   /// nested-name-specifier in a member access expression.
461   ///
462   /// This specific declaration transformation only applies to the first
463   /// identifier in a nested-name-specifier of a member access expression, e.g.,
464   /// the \c T in \c x->T::member
465   ///
466   /// By default, invokes TransformDecl() to transform the declaration.
467   /// Subclasses may override this function to provide alternate behavior.
468   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
469     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
470   }
471 
472   /// Transform the set of declarations in an OverloadExpr.
473   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
474                                   LookupResult &R);
475 
476   /// \brief Transform the given nested-name-specifier with source-location
477   /// information.
478   ///
479   /// By default, transforms all of the types and declarations within the
480   /// nested-name-specifier. Subclasses may override this function to provide
481   /// alternate behavior.
482   NestedNameSpecifierLoc
483   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
484                                   QualType ObjectType = QualType(),
485                                   NamedDecl *FirstQualifierInScope = nullptr);
486 
487   /// \brief Transform the given declaration name.
488   ///
489   /// By default, transforms the types of conversion function, constructor,
490   /// and destructor names and then (if needed) rebuilds the declaration name.
491   /// Identifiers and selectors are returned unmodified. Sublcasses may
492   /// override this function to provide alternate behavior.
493   DeclarationNameInfo
494   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
495 
496   /// \brief Transform the given template name.
497   ///
498   /// \param SS The nested-name-specifier that qualifies the template
499   /// name. This nested-name-specifier must already have been transformed.
500   ///
501   /// \param Name The template name to transform.
502   ///
503   /// \param NameLoc The source location of the template name.
504   ///
505   /// \param ObjectType If we're translating a template name within a member
506   /// access expression, this is the type of the object whose member template
507   /// is being referenced.
508   ///
509   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
510   /// also refers to a name within the current (lexical) scope, this is the
511   /// declaration it refers to.
512   ///
513   /// By default, transforms the template name by transforming the declarations
514   /// and nested-name-specifiers that occur within the template name.
515   /// Subclasses may override this function to provide alternate behavior.
516   TemplateName
517   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
518                         SourceLocation NameLoc,
519                         QualType ObjectType = QualType(),
520                         NamedDecl *FirstQualifierInScope = nullptr,
521                         bool AllowInjectedClassName = false);
522 
523   /// \brief Transform the given template argument.
524   ///
525   /// By default, this operation transforms the type, expression, or
526   /// declaration stored within the template argument and constructs a
527   /// new template argument from the transformed result. Subclasses may
528   /// override this function to provide alternate behavior.
529   ///
530   /// Returns true if there was an error.
531   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
532                                  TemplateArgumentLoc &Output,
533                                  bool Uneval = false);
534 
535   /// \brief Transform the given set of template arguments.
536   ///
537   /// By default, this operation transforms all of the template arguments
538   /// in the input set using \c TransformTemplateArgument(), and appends
539   /// the transformed arguments to the output list.
540   ///
541   /// Note that this overload of \c TransformTemplateArguments() is merely
542   /// a convenience function. Subclasses that wish to override this behavior
543   /// should override the iterator-based member template version.
544   ///
545   /// \param Inputs The set of template arguments to be transformed.
546   ///
547   /// \param NumInputs The number of template arguments in \p Inputs.
548   ///
549   /// \param Outputs The set of transformed template arguments output by this
550   /// routine.
551   ///
552   /// Returns true if an error occurred.
553   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
554                                   unsigned NumInputs,
555                                   TemplateArgumentListInfo &Outputs,
556                                   bool Uneval = false) {
557     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
558                                       Uneval);
559   }
560 
561   /// \brief Transform the given set of template arguments.
562   ///
563   /// By default, this operation transforms all of the template arguments
564   /// in the input set using \c TransformTemplateArgument(), and appends
565   /// the transformed arguments to the output list.
566   ///
567   /// \param First An iterator to the first template argument.
568   ///
569   /// \param Last An iterator one step past the last template argument.
570   ///
571   /// \param Outputs The set of transformed template arguments output by this
572   /// routine.
573   ///
574   /// Returns true if an error occurred.
575   template<typename InputIterator>
576   bool TransformTemplateArguments(InputIterator First,
577                                   InputIterator Last,
578                                   TemplateArgumentListInfo &Outputs,
579                                   bool Uneval = false);
580 
581   /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
582   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
583                                  TemplateArgumentLoc &ArgLoc);
584 
585   /// \brief Fakes up a TypeSourceInfo for a type.
586   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
587     return SemaRef.Context.getTrivialTypeSourceInfo(T,
588                        getDerived().getBaseLocation());
589   }
590 
591 #define ABSTRACT_TYPELOC(CLASS, PARENT)
592 #define TYPELOC(CLASS, PARENT)                                   \
593   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
594 #include "clang/AST/TypeLocNodes.def"
595 
596   template<typename Fn>
597   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
598                                       FunctionProtoTypeLoc TL,
599                                       CXXRecordDecl *ThisContext,
600                                       unsigned ThisTypeQuals,
601                                       Fn TransformExceptionSpec);
602 
603   bool TransformExceptionSpec(SourceLocation Loc,
604                               FunctionProtoType::ExceptionSpecInfo &ESI,
605                               SmallVectorImpl<QualType> &Exceptions,
606                               bool &Changed);
607 
608   StmtResult TransformSEHHandler(Stmt *Handler);
609 
610   QualType
611   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
612                                       TemplateSpecializationTypeLoc TL,
613                                       TemplateName Template);
614 
615   QualType
616   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
617                                       DependentTemplateSpecializationTypeLoc TL,
618                                                TemplateName Template,
619                                                CXXScopeSpec &SS);
620 
621   QualType TransformDependentTemplateSpecializationType(
622       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
623       NestedNameSpecifierLoc QualifierLoc);
624 
625   /// \brief Transforms the parameters of a function type into the
626   /// given vectors.
627   ///
628   /// The result vectors should be kept in sync; null entries in the
629   /// variables vector are acceptable.
630   ///
631   /// Return true on error.
632   bool TransformFunctionTypeParams(
633       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
634       const QualType *ParamTypes,
635       const FunctionProtoType::ExtParameterInfo *ParamInfos,
636       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
637       Sema::ExtParameterInfoBuilder &PInfos);
638 
639   /// \brief Transforms a single function-type parameter.  Return null
640   /// on error.
641   ///
642   /// \param indexAdjustment - A number to add to the parameter's
643   ///   scope index;  can be negative
644   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
645                                           int indexAdjustment,
646                                           Optional<unsigned> NumExpansions,
647                                           bool ExpectParameterPack);
648 
649   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
650 
651   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
652   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
653 
654   TemplateParameterList *TransformTemplateParameterList(
655         TemplateParameterList *TPL) {
656     return TPL;
657   }
658 
659   ExprResult TransformAddressOfOperand(Expr *E);
660 
661   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
662                                                 bool IsAddressOfOperand,
663                                                 TypeSourceInfo **RecoveryTSI);
664 
665   ExprResult TransformParenDependentScopeDeclRefExpr(
666       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
667       TypeSourceInfo **RecoveryTSI);
668 
669   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
670 
671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
672 // amount of stack usage with clang.
673 #define STMT(Node, Parent)                        \
674   LLVM_ATTRIBUTE_NOINLINE \
675   StmtResult Transform##Node(Node *S);
676 #define EXPR(Node, Parent)                        \
677   LLVM_ATTRIBUTE_NOINLINE \
678   ExprResult Transform##Node(Node *E);
679 #define ABSTRACT_STMT(Stmt)
680 #include "clang/AST/StmtNodes.inc"
681 
682 #define OPENMP_CLAUSE(Name, Class)                        \
683   LLVM_ATTRIBUTE_NOINLINE \
684   OMPClause *Transform ## Class(Class *S);
685 #include "clang/Basic/OpenMPKinds.def"
686 
687   /// \brief Build a new qualified type given its unqualified type and type
688   /// qualifiers.
689   ///
690   /// By default, this routine adds type qualifiers only to types that can
691   /// have qualifiers, and silently suppresses those qualifiers that are not
692   /// permitted. Subclasses may override this routine to provide different
693   /// behavior.
694   QualType RebuildQualifiedType(QualType T, SourceLocation Loc,
695                                 Qualifiers Quals);
696 
697   /// \brief Build a new pointer type given its pointee type.
698   ///
699   /// By default, performs semantic analysis when building the pointer type.
700   /// Subclasses may override this routine to provide different behavior.
701   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
702 
703   /// \brief Build a new block pointer type given its pointee type.
704   ///
705   /// By default, performs semantic analysis when building the block pointer
706   /// type. Subclasses may override this routine to provide different behavior.
707   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
708 
709   /// \brief Build a new reference type given the type it references.
710   ///
711   /// By default, performs semantic analysis when building the
712   /// reference type. Subclasses may override this routine to provide
713   /// different behavior.
714   ///
715   /// \param LValue whether the type was written with an lvalue sigil
716   /// or an rvalue sigil.
717   QualType RebuildReferenceType(QualType ReferentType,
718                                 bool LValue,
719                                 SourceLocation Sigil);
720 
721   /// \brief Build a new member pointer type given the pointee type and the
722   /// class type it refers into.
723   ///
724   /// By default, performs semantic analysis when building the member pointer
725   /// type. Subclasses may override this routine to provide different behavior.
726   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
727                                     SourceLocation Sigil);
728 
729   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
730                                     SourceLocation ProtocolLAngleLoc,
731                                     ArrayRef<ObjCProtocolDecl *> Protocols,
732                                     ArrayRef<SourceLocation> ProtocolLocs,
733                                     SourceLocation ProtocolRAngleLoc);
734 
735   /// \brief Build an Objective-C object type.
736   ///
737   /// By default, performs semantic analysis when building the object type.
738   /// Subclasses may override this routine to provide different behavior.
739   QualType RebuildObjCObjectType(QualType BaseType,
740                                  SourceLocation Loc,
741                                  SourceLocation TypeArgsLAngleLoc,
742                                  ArrayRef<TypeSourceInfo *> TypeArgs,
743                                  SourceLocation TypeArgsRAngleLoc,
744                                  SourceLocation ProtocolLAngleLoc,
745                                  ArrayRef<ObjCProtocolDecl *> Protocols,
746                                  ArrayRef<SourceLocation> ProtocolLocs,
747                                  SourceLocation ProtocolRAngleLoc);
748 
749   /// \brief Build a new Objective-C object pointer type given the pointee type.
750   ///
751   /// By default, directly builds the pointer type, with no additional semantic
752   /// analysis.
753   QualType RebuildObjCObjectPointerType(QualType PointeeType,
754                                         SourceLocation Star);
755 
756   /// \brief Build a new array type given the element type, size
757   /// modifier, size of the array (if known), size expression, and index type
758   /// qualifiers.
759   ///
760   /// By default, performs semantic analysis when building the array type.
761   /// Subclasses may override this routine to provide different behavior.
762   /// Also by default, all of the other Rebuild*Array
763   QualType RebuildArrayType(QualType ElementType,
764                             ArrayType::ArraySizeModifier SizeMod,
765                             const llvm::APInt *Size,
766                             Expr *SizeExpr,
767                             unsigned IndexTypeQuals,
768                             SourceRange BracketsRange);
769 
770   /// \brief Build a new constant array type given the element type, size
771   /// modifier, (known) size of the array, and index type qualifiers.
772   ///
773   /// By default, performs semantic analysis when building the array type.
774   /// Subclasses may override this routine to provide different behavior.
775   QualType RebuildConstantArrayType(QualType ElementType,
776                                     ArrayType::ArraySizeModifier SizeMod,
777                                     const llvm::APInt &Size,
778                                     unsigned IndexTypeQuals,
779                                     SourceRange BracketsRange);
780 
781   /// \brief Build a new incomplete array type given the element type, size
782   /// modifier, and index type qualifiers.
783   ///
784   /// By default, performs semantic analysis when building the array type.
785   /// Subclasses may override this routine to provide different behavior.
786   QualType RebuildIncompleteArrayType(QualType ElementType,
787                                       ArrayType::ArraySizeModifier SizeMod,
788                                       unsigned IndexTypeQuals,
789                                       SourceRange BracketsRange);
790 
791   /// \brief Build a new variable-length array type given the element type,
792   /// size modifier, size expression, and index type qualifiers.
793   ///
794   /// By default, performs semantic analysis when building the array type.
795   /// Subclasses may override this routine to provide different behavior.
796   QualType RebuildVariableArrayType(QualType ElementType,
797                                     ArrayType::ArraySizeModifier SizeMod,
798                                     Expr *SizeExpr,
799                                     unsigned IndexTypeQuals,
800                                     SourceRange BracketsRange);
801 
802   /// \brief Build a new dependent-sized array type given the element type,
803   /// size modifier, size expression, and index type qualifiers.
804   ///
805   /// By default, performs semantic analysis when building the array type.
806   /// Subclasses may override this routine to provide different behavior.
807   QualType RebuildDependentSizedArrayType(QualType ElementType,
808                                           ArrayType::ArraySizeModifier SizeMod,
809                                           Expr *SizeExpr,
810                                           unsigned IndexTypeQuals,
811                                           SourceRange BracketsRange);
812 
813   /// \brief Build a new vector type given the element type and
814   /// number of elements.
815   ///
816   /// By default, performs semantic analysis when building the vector type.
817   /// Subclasses may override this routine to provide different behavior.
818   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
819                              VectorType::VectorKind VecKind);
820 
821   /// \brief Build a new extended vector type given the element type and
822   /// number of elements.
823   ///
824   /// By default, performs semantic analysis when building the vector type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
827                                 SourceLocation AttributeLoc);
828 
829   /// \brief Build a new potentially dependently-sized extended vector type
830   /// given the element type and number of elements.
831   ///
832   /// By default, performs semantic analysis when building the vector type.
833   /// Subclasses may override this routine to provide different behavior.
834   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
835                                               Expr *SizeExpr,
836                                               SourceLocation AttributeLoc);
837 
838   /// \brief Build a new DependentAddressSpaceType or return the pointee
839   /// type variable with the correct address space (retrieved from
840   /// AddrSpaceExpr) applied to it. The former will be returned in cases
841   /// where the address space remains dependent.
842   ///
843   /// By default, performs semantic analysis when building the type with address
844   /// space applied. Subclasses may override this routine to provide different
845   /// behavior.
846   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
847                                             Expr *AddrSpaceExpr,
848                                             SourceLocation AttributeLoc);
849 
850   /// \brief Build a new function type.
851   ///
852   /// By default, performs semantic analysis when building the function type.
853   /// Subclasses may override this routine to provide different behavior.
854   QualType RebuildFunctionProtoType(QualType T,
855                                     MutableArrayRef<QualType> ParamTypes,
856                                     const FunctionProtoType::ExtProtoInfo &EPI);
857 
858   /// \brief Build a new unprototyped function type.
859   QualType RebuildFunctionNoProtoType(QualType ResultType);
860 
861   /// \brief Rebuild an unresolved typename type, given the decl that
862   /// the UnresolvedUsingTypenameDecl was transformed to.
863   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
864 
865   /// \brief Build a new typedef type.
866   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
867     return SemaRef.Context.getTypeDeclType(Typedef);
868   }
869 
870   /// \brief Build a new class/struct/union type.
871   QualType RebuildRecordType(RecordDecl *Record) {
872     return SemaRef.Context.getTypeDeclType(Record);
873   }
874 
875   /// \brief Build a new Enum type.
876   QualType RebuildEnumType(EnumDecl *Enum) {
877     return SemaRef.Context.getTypeDeclType(Enum);
878   }
879 
880   /// \brief Build a new typeof(expr) type.
881   ///
882   /// By default, performs semantic analysis when building the typeof type.
883   /// Subclasses may override this routine to provide different behavior.
884   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
885 
886   /// \brief Build a new typeof(type) type.
887   ///
888   /// By default, builds a new TypeOfType with the given underlying type.
889   QualType RebuildTypeOfType(QualType Underlying);
890 
891   /// \brief Build a new unary transform type.
892   QualType RebuildUnaryTransformType(QualType BaseType,
893                                      UnaryTransformType::UTTKind UKind,
894                                      SourceLocation Loc);
895 
896   /// \brief Build a new C++11 decltype type.
897   ///
898   /// By default, performs semantic analysis when building the decltype type.
899   /// Subclasses may override this routine to provide different behavior.
900   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
901 
902   /// \brief Build a new C++11 auto type.
903   ///
904   /// By default, builds a new AutoType with the given deduced type.
905   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
906     // Note, IsDependent is always false here: we implicitly convert an 'auto'
907     // which has been deduced to a dependent type into an undeduced 'auto', so
908     // that we'll retry deduction after the transformation.
909     return SemaRef.Context.getAutoType(Deduced, Keyword,
910                                        /*IsDependent*/ false);
911   }
912 
913   /// By default, builds a new DeducedTemplateSpecializationType with the given
914   /// deduced type.
915   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
916       QualType Deduced) {
917     return SemaRef.Context.getDeducedTemplateSpecializationType(
918         Template, Deduced, /*IsDependent*/ false);
919   }
920 
921   /// \brief Build a new template specialization type.
922   ///
923   /// By default, performs semantic analysis when building the template
924   /// specialization type. Subclasses may override this routine to provide
925   /// different behavior.
926   QualType RebuildTemplateSpecializationType(TemplateName Template,
927                                              SourceLocation TemplateLoc,
928                                              TemplateArgumentListInfo &Args);
929 
930   /// \brief Build a new parenthesized type.
931   ///
932   /// By default, builds a new ParenType type from the inner type.
933   /// Subclasses may override this routine to provide different behavior.
934   QualType RebuildParenType(QualType InnerType) {
935     return SemaRef.BuildParenType(InnerType);
936   }
937 
938   /// \brief Build a new qualified name type.
939   ///
940   /// By default, builds a new ElaboratedType type from the keyword,
941   /// the nested-name-specifier and the named type.
942   /// Subclasses may override this routine to provide different behavior.
943   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
944                                  ElaboratedTypeKeyword Keyword,
945                                  NestedNameSpecifierLoc QualifierLoc,
946                                  QualType Named) {
947     return SemaRef.Context.getElaboratedType(Keyword,
948                                          QualifierLoc.getNestedNameSpecifier(),
949                                              Named);
950   }
951 
952   /// \brief Build a new typename type that refers to a template-id.
953   ///
954   /// By default, builds a new DependentNameType type from the
955   /// nested-name-specifier and the given type. Subclasses may override
956   /// this routine to provide different behavior.
957   QualType RebuildDependentTemplateSpecializationType(
958                                           ElaboratedTypeKeyword Keyword,
959                                           NestedNameSpecifierLoc QualifierLoc,
960                                           const IdentifierInfo *Name,
961                                           SourceLocation NameLoc,
962                                           TemplateArgumentListInfo &Args,
963                                           bool AllowInjectedClassName) {
964     // Rebuild the template name.
965     // TODO: avoid TemplateName abstraction
966     CXXScopeSpec SS;
967     SS.Adopt(QualifierLoc);
968     TemplateName InstName
969       = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(),
970                                          nullptr, AllowInjectedClassName);
971 
972     if (InstName.isNull())
973       return QualType();
974 
975     // If it's still dependent, make a dependent specialization.
976     if (InstName.getAsDependentTemplateName())
977       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
978                                           QualifierLoc.getNestedNameSpecifier(),
979                                                                     Name,
980                                                                     Args);
981 
982     // Otherwise, make an elaborated type wrapping a non-dependent
983     // specialization.
984     QualType T =
985     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
986     if (T.isNull()) return QualType();
987 
988     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
989       return T;
990 
991     return SemaRef.Context.getElaboratedType(Keyword,
992                                        QualifierLoc.getNestedNameSpecifier(),
993                                              T);
994   }
995 
996   /// \brief Build a new typename type that refers to an identifier.
997   ///
998   /// By default, performs semantic analysis when building the typename type
999   /// (or elaborated type). Subclasses may override this routine to provide
1000   /// different behavior.
1001   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1002                                     SourceLocation KeywordLoc,
1003                                     NestedNameSpecifierLoc QualifierLoc,
1004                                     const IdentifierInfo *Id,
1005                                     SourceLocation IdLoc,
1006                                     bool DeducedTSTContext) {
1007     CXXScopeSpec SS;
1008     SS.Adopt(QualifierLoc);
1009 
1010     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1011       // If the name is still dependent, just build a new dependent name type.
1012       if (!SemaRef.computeDeclContext(SS))
1013         return SemaRef.Context.getDependentNameType(Keyword,
1014                                           QualifierLoc.getNestedNameSpecifier(),
1015                                                     Id);
1016     }
1017 
1018     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1019       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1020                                              *Id, IdLoc);
1021       // If a dependent name resolves to a deduced template specialization type,
1022       // check that we're in one of the syntactic contexts permitting it.
1023       if (!DeducedTSTContext) {
1024         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1025                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1026           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1027             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1028                    Deduced->getTemplateName())
1029             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1030           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1031             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1032           return QualType();
1033         }
1034       }
1035       return T;
1036     }
1037 
1038     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1039 
1040     // We had a dependent elaborated-type-specifier that has been transformed
1041     // into a non-dependent elaborated-type-specifier. Find the tag we're
1042     // referring to.
1043     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1044     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1045     if (!DC)
1046       return QualType();
1047 
1048     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1049       return QualType();
1050 
1051     TagDecl *Tag = nullptr;
1052     SemaRef.LookupQualifiedName(Result, DC);
1053     switch (Result.getResultKind()) {
1054       case LookupResult::NotFound:
1055       case LookupResult::NotFoundInCurrentInstantiation:
1056         break;
1057 
1058       case LookupResult::Found:
1059         Tag = Result.getAsSingle<TagDecl>();
1060         break;
1061 
1062       case LookupResult::FoundOverloaded:
1063       case LookupResult::FoundUnresolvedValue:
1064         llvm_unreachable("Tag lookup cannot find non-tags");
1065 
1066       case LookupResult::Ambiguous:
1067         // Let the LookupResult structure handle ambiguities.
1068         return QualType();
1069     }
1070 
1071     if (!Tag) {
1072       // Check where the name exists but isn't a tag type and use that to emit
1073       // better diagnostics.
1074       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1075       SemaRef.LookupQualifiedName(Result, DC);
1076       switch (Result.getResultKind()) {
1077         case LookupResult::Found:
1078         case LookupResult::FoundOverloaded:
1079         case LookupResult::FoundUnresolvedValue: {
1080           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1081           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1082           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1083                                                                << NTK << Kind;
1084           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1085           break;
1086         }
1087         default:
1088           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1089               << Kind << Id << DC << QualifierLoc.getSourceRange();
1090           break;
1091       }
1092       return QualType();
1093     }
1094 
1095     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1096                                               IdLoc, Id)) {
1097       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1098       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1099       return QualType();
1100     }
1101 
1102     // Build the elaborated-type-specifier type.
1103     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1104     return SemaRef.Context.getElaboratedType(Keyword,
1105                                          QualifierLoc.getNestedNameSpecifier(),
1106                                              T);
1107   }
1108 
1109   /// \brief Build a new pack expansion type.
1110   ///
1111   /// By default, builds a new PackExpansionType type from the given pattern.
1112   /// Subclasses may override this routine to provide different behavior.
1113   QualType RebuildPackExpansionType(QualType Pattern,
1114                                     SourceRange PatternRange,
1115                                     SourceLocation EllipsisLoc,
1116                                     Optional<unsigned> NumExpansions) {
1117     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1118                                         NumExpansions);
1119   }
1120 
1121   /// \brief Build a new atomic type given its value type.
1122   ///
1123   /// By default, performs semantic analysis when building the atomic type.
1124   /// Subclasses may override this routine to provide different behavior.
1125   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1126 
1127   /// \brief Build a new pipe type given its value type.
1128   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1129                            bool isReadPipe);
1130 
1131   /// \brief Build a new template name given a nested name specifier, a flag
1132   /// indicating whether the "template" keyword was provided, and the template
1133   /// that the template name refers to.
1134   ///
1135   /// By default, builds the new template name directly. Subclasses may override
1136   /// this routine to provide different behavior.
1137   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1138                                    bool TemplateKW,
1139                                    TemplateDecl *Template);
1140 
1141   /// \brief Build a new template name given a nested name specifier and the
1142   /// name that is referred to as a template.
1143   ///
1144   /// By default, performs semantic analysis to determine whether the name can
1145   /// be resolved to a specific template, then builds the appropriate kind of
1146   /// template name. Subclasses may override this routine to provide different
1147   /// behavior.
1148   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1149                                    const IdentifierInfo &Name,
1150                                    SourceLocation NameLoc,
1151                                    QualType ObjectType,
1152                                    NamedDecl *FirstQualifierInScope,
1153                                    bool AllowInjectedClassName);
1154 
1155   /// \brief Build a new template name given a nested name specifier and the
1156   /// overloaded operator name that is referred to as a template.
1157   ///
1158   /// By default, performs semantic analysis to determine whether the name can
1159   /// be resolved to a specific template, then builds the appropriate kind of
1160   /// template name. Subclasses may override this routine to provide different
1161   /// behavior.
1162   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1163                                    OverloadedOperatorKind Operator,
1164                                    SourceLocation NameLoc,
1165                                    QualType ObjectType,
1166                                    bool AllowInjectedClassName);
1167 
1168   /// \brief Build a new template name given a template template parameter pack
1169   /// and the
1170   ///
1171   /// By default, performs semantic analysis to determine whether the name can
1172   /// be resolved to a specific template, then builds the appropriate kind of
1173   /// template name. Subclasses may override this routine to provide different
1174   /// behavior.
1175   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1176                                    const TemplateArgument &ArgPack) {
1177     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1178   }
1179 
1180   /// \brief Build a new compound statement.
1181   ///
1182   /// By default, performs semantic analysis to build the new statement.
1183   /// Subclasses may override this routine to provide different behavior.
1184   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1185                                        MultiStmtArg Statements,
1186                                        SourceLocation RBraceLoc,
1187                                        bool IsStmtExpr) {
1188     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1189                                        IsStmtExpr);
1190   }
1191 
1192   /// \brief Build a new case statement.
1193   ///
1194   /// By default, performs semantic analysis to build the new statement.
1195   /// Subclasses may override this routine to provide different behavior.
1196   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1197                                    Expr *LHS,
1198                                    SourceLocation EllipsisLoc,
1199                                    Expr *RHS,
1200                                    SourceLocation ColonLoc) {
1201     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1202                                    ColonLoc);
1203   }
1204 
1205   /// \brief Attach the body to a new case statement.
1206   ///
1207   /// By default, performs semantic analysis to build the new statement.
1208   /// Subclasses may override this routine to provide different behavior.
1209   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1210     getSema().ActOnCaseStmtBody(S, Body);
1211     return S;
1212   }
1213 
1214   /// \brief Build a new default 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 RebuildDefaultStmt(SourceLocation DefaultLoc,
1219                                       SourceLocation ColonLoc,
1220                                       Stmt *SubStmt) {
1221     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1222                                       /*CurScope=*/nullptr);
1223   }
1224 
1225   /// \brief Build a new label statement.
1226   ///
1227   /// By default, performs semantic analysis to build the new statement.
1228   /// Subclasses may override this routine to provide different behavior.
1229   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1230                               SourceLocation ColonLoc, Stmt *SubStmt) {
1231     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1232   }
1233 
1234   /// \brief Build a new label statement.
1235   ///
1236   /// By default, performs semantic analysis to build the new statement.
1237   /// Subclasses may override this routine to provide different behavior.
1238   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1239                                    ArrayRef<const Attr*> Attrs,
1240                                    Stmt *SubStmt) {
1241     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1242   }
1243 
1244   /// \brief Build a new "if" statement.
1245   ///
1246   /// By default, performs semantic analysis to build the new statement.
1247   /// Subclasses may override this routine to provide different behavior.
1248   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1249                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1250                            SourceLocation ElseLoc, Stmt *Else) {
1251     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1252                                  ElseLoc, Else);
1253   }
1254 
1255   /// \brief Start building a new switch statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1260                                     Sema::ConditionResult Cond) {
1261     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1262   }
1263 
1264   /// \brief Attach the body to the switch statement.
1265   ///
1266   /// By default, performs semantic analysis to build the new statement.
1267   /// Subclasses may override this routine to provide different behavior.
1268   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1269                                    Stmt *Switch, Stmt *Body) {
1270     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1271   }
1272 
1273   /// \brief Build a new while statement.
1274   ///
1275   /// By default, performs semantic analysis to build the new statement.
1276   /// Subclasses may override this routine to provide different behavior.
1277   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1278                               Sema::ConditionResult Cond, Stmt *Body) {
1279     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1280   }
1281 
1282   /// \brief Build a new do-while statement.
1283   ///
1284   /// By default, performs semantic analysis to build the new statement.
1285   /// Subclasses may override this routine to provide different behavior.
1286   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1287                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1288                            Expr *Cond, SourceLocation RParenLoc) {
1289     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1290                                  Cond, RParenLoc);
1291   }
1292 
1293   /// \brief Build a new for statement.
1294   ///
1295   /// By default, performs semantic analysis to build the new statement.
1296   /// Subclasses may override this routine to provide different behavior.
1297   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1298                             Stmt *Init, Sema::ConditionResult Cond,
1299                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1300                             Stmt *Body) {
1301     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1302                                   Inc, RParenLoc, Body);
1303   }
1304 
1305   /// \brief Build a new goto statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
1309   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1310                              LabelDecl *Label) {
1311     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1312   }
1313 
1314   /// \brief Build a new indirect goto statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
1318   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1319                                      SourceLocation StarLoc,
1320                                      Expr *Target) {
1321     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1322   }
1323 
1324   /// \brief Build a new return statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1329     return getSema().BuildReturnStmt(ReturnLoc, Result);
1330   }
1331 
1332   /// \brief Build a new declaration statement.
1333   ///
1334   /// By default, performs semantic analysis to build the new statement.
1335   /// Subclasses may override this routine to provide different behavior.
1336   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1337                              SourceLocation StartLoc, SourceLocation EndLoc) {
1338     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1339     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1340   }
1341 
1342   /// \brief Build a new inline asm statement.
1343   ///
1344   /// By default, performs semantic analysis to build the new statement.
1345   /// Subclasses may override this routine to provide different behavior.
1346   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1347                                bool IsVolatile, unsigned NumOutputs,
1348                                unsigned NumInputs, IdentifierInfo **Names,
1349                                MultiExprArg Constraints, MultiExprArg Exprs,
1350                                Expr *AsmString, MultiExprArg Clobbers,
1351                                SourceLocation RParenLoc) {
1352     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1353                                      NumInputs, Names, Constraints, Exprs,
1354                                      AsmString, Clobbers, RParenLoc);
1355   }
1356 
1357   /// \brief Build a new MS style inline asm statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1362                               ArrayRef<Token> AsmToks,
1363                               StringRef AsmString,
1364                               unsigned NumOutputs, unsigned NumInputs,
1365                               ArrayRef<StringRef> Constraints,
1366                               ArrayRef<StringRef> Clobbers,
1367                               ArrayRef<Expr*> Exprs,
1368                               SourceLocation EndLoc) {
1369     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1370                                     NumOutputs, NumInputs,
1371                                     Constraints, Clobbers, Exprs, EndLoc);
1372   }
1373 
1374   /// \brief Build a new co_return statement.
1375   ///
1376   /// By default, performs semantic analysis to build the new statement.
1377   /// Subclasses may override this routine to provide different behavior.
1378   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1379                                  bool IsImplicit) {
1380     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1381   }
1382 
1383   /// \brief Build a new co_await expression.
1384   ///
1385   /// By default, performs semantic analysis to build the new expression.
1386   /// Subclasses may override this routine to provide different behavior.
1387   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1388                                 bool IsImplicit) {
1389     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1390   }
1391 
1392   /// \brief Build a new co_await expression.
1393   ///
1394   /// By default, performs semantic analysis to build the new expression.
1395   /// Subclasses may override this routine to provide different behavior.
1396   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1397                                          Expr *Result,
1398                                          UnresolvedLookupExpr *Lookup) {
1399     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1400   }
1401 
1402   /// \brief Build a new co_yield expression.
1403   ///
1404   /// By default, performs semantic analysis to build the new expression.
1405   /// Subclasses may override this routine to provide different behavior.
1406   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1407     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1408   }
1409 
1410   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1411     return getSema().BuildCoroutineBodyStmt(Args);
1412   }
1413 
1414   /// \brief Build a new Objective-C \@try statement.
1415   ///
1416   /// By default, performs semantic analysis to build the new statement.
1417   /// Subclasses may override this routine to provide different behavior.
1418   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1419                                         Stmt *TryBody,
1420                                         MultiStmtArg CatchStmts,
1421                                         Stmt *Finally) {
1422     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1423                                         Finally);
1424   }
1425 
1426   /// \brief Rebuild an Objective-C exception declaration.
1427   ///
1428   /// By default, performs semantic analysis to build the new declaration.
1429   /// Subclasses may override this routine to provide different behavior.
1430   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1431                                     TypeSourceInfo *TInfo, QualType T) {
1432     return getSema().BuildObjCExceptionDecl(TInfo, T,
1433                                             ExceptionDecl->getInnerLocStart(),
1434                                             ExceptionDecl->getLocation(),
1435                                             ExceptionDecl->getIdentifier());
1436   }
1437 
1438   /// \brief Build a new Objective-C \@catch statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1443                                           SourceLocation RParenLoc,
1444                                           VarDecl *Var,
1445                                           Stmt *Body) {
1446     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1447                                           Var, Body);
1448   }
1449 
1450   /// \brief Build a new Objective-C \@finally statement.
1451   ///
1452   /// By default, performs semantic analysis to build the new statement.
1453   /// Subclasses may override this routine to provide different behavior.
1454   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1455                                             Stmt *Body) {
1456     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1457   }
1458 
1459   /// \brief Build a new Objective-C \@throw statement.
1460   ///
1461   /// By default, performs semantic analysis to build the new statement.
1462   /// Subclasses may override this routine to provide different behavior.
1463   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1464                                           Expr *Operand) {
1465     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1466   }
1467 
1468   /// \brief Build a new OpenMP executable directive.
1469   ///
1470   /// By default, performs semantic analysis to build the new statement.
1471   /// Subclasses may override this routine to provide different behavior.
1472   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1473                                            DeclarationNameInfo DirName,
1474                                            OpenMPDirectiveKind CancelRegion,
1475                                            ArrayRef<OMPClause *> Clauses,
1476                                            Stmt *AStmt, SourceLocation StartLoc,
1477                                            SourceLocation EndLoc) {
1478     return getSema().ActOnOpenMPExecutableDirective(
1479         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1480   }
1481 
1482   /// \brief Build a new OpenMP 'if' 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 *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1487                                 Expr *Condition, SourceLocation StartLoc,
1488                                 SourceLocation LParenLoc,
1489                                 SourceLocation NameModifierLoc,
1490                                 SourceLocation ColonLoc,
1491                                 SourceLocation EndLoc) {
1492     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1493                                          LParenLoc, NameModifierLoc, ColonLoc,
1494                                          EndLoc);
1495   }
1496 
1497   /// \brief Build a new OpenMP 'final' clause.
1498   ///
1499   /// By default, performs semantic analysis to build the new OpenMP clause.
1500   /// Subclasses may override this routine to provide different behavior.
1501   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1502                                    SourceLocation LParenLoc,
1503                                    SourceLocation EndLoc) {
1504     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1505                                             EndLoc);
1506   }
1507 
1508   /// \brief Build a new OpenMP 'num_threads' clause.
1509   ///
1510   /// By default, performs semantic analysis to build the new OpenMP clause.
1511   /// Subclasses may override this routine to provide different behavior.
1512   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1513                                         SourceLocation StartLoc,
1514                                         SourceLocation LParenLoc,
1515                                         SourceLocation EndLoc) {
1516     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1517                                                  LParenLoc, EndLoc);
1518   }
1519 
1520   /// \brief Build a new OpenMP 'safelen' clause.
1521   ///
1522   /// By default, performs semantic analysis to build the new OpenMP clause.
1523   /// Subclasses may override this routine to provide different behavior.
1524   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1525                                      SourceLocation LParenLoc,
1526                                      SourceLocation EndLoc) {
1527     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1528   }
1529 
1530   /// \brief Build a new OpenMP 'simdlen' 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 *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1535                                      SourceLocation LParenLoc,
1536                                      SourceLocation EndLoc) {
1537     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1538   }
1539 
1540   /// \brief Build a new OpenMP 'collapse' clause.
1541   ///
1542   /// By default, performs semantic analysis to build the new OpenMP clause.
1543   /// Subclasses may override this routine to provide different behavior.
1544   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1545                                       SourceLocation LParenLoc,
1546                                       SourceLocation EndLoc) {
1547     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1548                                                EndLoc);
1549   }
1550 
1551   /// \brief Build a new OpenMP 'default' clause.
1552   ///
1553   /// By default, performs semantic analysis to build the new OpenMP clause.
1554   /// Subclasses may override this routine to provide different behavior.
1555   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1556                                      SourceLocation KindKwLoc,
1557                                      SourceLocation StartLoc,
1558                                      SourceLocation LParenLoc,
1559                                      SourceLocation EndLoc) {
1560     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1561                                               StartLoc, LParenLoc, EndLoc);
1562   }
1563 
1564   /// \brief Build a new OpenMP 'proc_bind' clause.
1565   ///
1566   /// By default, performs semantic analysis to build the new OpenMP clause.
1567   /// Subclasses may override this routine to provide different behavior.
1568   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1569                                       SourceLocation KindKwLoc,
1570                                       SourceLocation StartLoc,
1571                                       SourceLocation LParenLoc,
1572                                       SourceLocation EndLoc) {
1573     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1574                                                StartLoc, LParenLoc, EndLoc);
1575   }
1576 
1577   /// \brief Build a new OpenMP 'schedule' clause.
1578   ///
1579   /// By default, performs semantic analysis to build the new OpenMP clause.
1580   /// Subclasses may override this routine to provide different behavior.
1581   OMPClause *RebuildOMPScheduleClause(
1582       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1583       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1584       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1585       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1586     return getSema().ActOnOpenMPScheduleClause(
1587         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1588         CommaLoc, EndLoc);
1589   }
1590 
1591   /// \brief Build a new OpenMP 'ordered' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1596                                      SourceLocation EndLoc,
1597                                      SourceLocation LParenLoc, Expr *Num) {
1598     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1599   }
1600 
1601   /// \brief Build a new OpenMP 'private' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1606                                      SourceLocation StartLoc,
1607                                      SourceLocation LParenLoc,
1608                                      SourceLocation EndLoc) {
1609     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1610                                               EndLoc);
1611   }
1612 
1613   /// \brief Build a new OpenMP 'firstprivate' clause.
1614   ///
1615   /// By default, performs semantic analysis to build the new OpenMP clause.
1616   /// Subclasses may override this routine to provide different behavior.
1617   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1618                                           SourceLocation StartLoc,
1619                                           SourceLocation LParenLoc,
1620                                           SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1622                                                    EndLoc);
1623   }
1624 
1625   /// \brief Build a new OpenMP 'lastprivate' clause.
1626   ///
1627   /// By default, performs semantic analysis to build the new OpenMP clause.
1628   /// Subclasses may override this routine to provide different behavior.
1629   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1630                                          SourceLocation StartLoc,
1631                                          SourceLocation LParenLoc,
1632                                          SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1634                                                   EndLoc);
1635   }
1636 
1637   /// \brief Build a new OpenMP 'shared' clause.
1638   ///
1639   /// By default, performs semantic analysis to build the new OpenMP clause.
1640   /// Subclasses may override this routine to provide different behavior.
1641   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1642                                     SourceLocation StartLoc,
1643                                     SourceLocation LParenLoc,
1644                                     SourceLocation EndLoc) {
1645     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1646                                              EndLoc);
1647   }
1648 
1649   /// \brief Build a new OpenMP 'reduction' 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 *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1654                                        SourceLocation StartLoc,
1655                                        SourceLocation LParenLoc,
1656                                        SourceLocation ColonLoc,
1657                                        SourceLocation EndLoc,
1658                                        CXXScopeSpec &ReductionIdScopeSpec,
1659                                        const DeclarationNameInfo &ReductionId,
1660                                        ArrayRef<Expr *> UnresolvedReductions) {
1661     return getSema().ActOnOpenMPReductionClause(
1662         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1663         ReductionId, UnresolvedReductions);
1664   }
1665 
1666   /// Build a new OpenMP 'task_reduction' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new statement.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPTaskReductionClause(
1671       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1672       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1673       CXXScopeSpec &ReductionIdScopeSpec,
1674       const DeclarationNameInfo &ReductionId,
1675       ArrayRef<Expr *> UnresolvedReductions) {
1676     return getSema().ActOnOpenMPTaskReductionClause(
1677         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1678         ReductionId, UnresolvedReductions);
1679   }
1680 
1681   /// Build a new OpenMP 'in_reduction' clause.
1682   ///
1683   /// By default, performs semantic analysis to build the new statement.
1684   /// Subclasses may override this routine to provide different behavior.
1685   OMPClause *
1686   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1687                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1688                               SourceLocation EndLoc,
1689                               CXXScopeSpec &ReductionIdScopeSpec,
1690                               const DeclarationNameInfo &ReductionId,
1691                               ArrayRef<Expr *> UnresolvedReductions) {
1692     return getSema().ActOnOpenMPInReductionClause(
1693         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1694         ReductionId, UnresolvedReductions);
1695   }
1696 
1697   /// \brief Build a new OpenMP 'linear' clause.
1698   ///
1699   /// By default, performs semantic analysis to build the new OpenMP clause.
1700   /// Subclasses may override this routine to provide different behavior.
1701   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1702                                     SourceLocation StartLoc,
1703                                     SourceLocation LParenLoc,
1704                                     OpenMPLinearClauseKind Modifier,
1705                                     SourceLocation ModifierLoc,
1706                                     SourceLocation ColonLoc,
1707                                     SourceLocation EndLoc) {
1708     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1709                                              Modifier, ModifierLoc, ColonLoc,
1710                                              EndLoc);
1711   }
1712 
1713   /// \brief Build a new OpenMP 'aligned' clause.
1714   ///
1715   /// By default, performs semantic analysis to build the new OpenMP clause.
1716   /// Subclasses may override this routine to provide different behavior.
1717   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1718                                      SourceLocation StartLoc,
1719                                      SourceLocation LParenLoc,
1720                                      SourceLocation ColonLoc,
1721                                      SourceLocation EndLoc) {
1722     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1723                                               LParenLoc, ColonLoc, EndLoc);
1724   }
1725 
1726   /// \brief Build a new OpenMP 'copyin' clause.
1727   ///
1728   /// By default, performs semantic analysis to build the new OpenMP clause.
1729   /// Subclasses may override this routine to provide different behavior.
1730   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1731                                     SourceLocation StartLoc,
1732                                     SourceLocation LParenLoc,
1733                                     SourceLocation EndLoc) {
1734     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1735                                              EndLoc);
1736   }
1737 
1738   /// \brief Build a new OpenMP 'copyprivate' clause.
1739   ///
1740   /// By default, performs semantic analysis to build the new OpenMP clause.
1741   /// Subclasses may override this routine to provide different behavior.
1742   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1743                                          SourceLocation StartLoc,
1744                                          SourceLocation LParenLoc,
1745                                          SourceLocation EndLoc) {
1746     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1747                                                   EndLoc);
1748   }
1749 
1750   /// \brief Build a new OpenMP 'flush' pseudo clause.
1751   ///
1752   /// By default, performs semantic analysis to build the new OpenMP clause.
1753   /// Subclasses may override this routine to provide different behavior.
1754   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1755                                    SourceLocation StartLoc,
1756                                    SourceLocation LParenLoc,
1757                                    SourceLocation EndLoc) {
1758     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1759                                             EndLoc);
1760   }
1761 
1762   /// \brief Build a new OpenMP 'depend' pseudo clause.
1763   ///
1764   /// By default, performs semantic analysis to build the new OpenMP clause.
1765   /// Subclasses may override this routine to provide different behavior.
1766   OMPClause *
1767   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1768                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1769                          SourceLocation StartLoc, SourceLocation LParenLoc,
1770                          SourceLocation EndLoc) {
1771     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1772                                              StartLoc, LParenLoc, EndLoc);
1773   }
1774 
1775   /// \brief Build a new OpenMP 'device' clause.
1776   ///
1777   /// By default, performs semantic analysis to build the new statement.
1778   /// Subclasses may override this routine to provide different behavior.
1779   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1780                                     SourceLocation LParenLoc,
1781                                     SourceLocation EndLoc) {
1782     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1783                                              EndLoc);
1784   }
1785 
1786   /// \brief Build a new OpenMP 'map' clause.
1787   ///
1788   /// By default, performs semantic analysis to build the new OpenMP clause.
1789   /// Subclasses may override this routine to provide different behavior.
1790   OMPClause *
1791   RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier,
1792                       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1793                       SourceLocation MapLoc, SourceLocation ColonLoc,
1794                       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1795                       SourceLocation LParenLoc, SourceLocation EndLoc) {
1796     return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType,
1797                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1798                                           VarList, StartLoc, LParenLoc, EndLoc);
1799   }
1800 
1801   /// \brief Build a new OpenMP 'num_teams' clause.
1802   ///
1803   /// By default, performs semantic analysis to build the new statement.
1804   /// Subclasses may override this routine to provide different behavior.
1805   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1806                                       SourceLocation LParenLoc,
1807                                       SourceLocation EndLoc) {
1808     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1809                                                EndLoc);
1810   }
1811 
1812   /// \brief Build a new OpenMP 'thread_limit' clause.
1813   ///
1814   /// By default, performs semantic analysis to build the new statement.
1815   /// Subclasses may override this routine to provide different behavior.
1816   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1817                                          SourceLocation StartLoc,
1818                                          SourceLocation LParenLoc,
1819                                          SourceLocation EndLoc) {
1820     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1821                                                   LParenLoc, EndLoc);
1822   }
1823 
1824   /// \brief Build a new OpenMP 'priority' clause.
1825   ///
1826   /// By default, performs semantic analysis to build the new statement.
1827   /// Subclasses may override this routine to provide different behavior.
1828   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1829                                       SourceLocation LParenLoc,
1830                                       SourceLocation EndLoc) {
1831     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1832                                                EndLoc);
1833   }
1834 
1835   /// \brief Build a new OpenMP 'grainsize' clause.
1836   ///
1837   /// By default, performs semantic analysis to build the new statement.
1838   /// Subclasses may override this routine to provide different behavior.
1839   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1840                                        SourceLocation LParenLoc,
1841                                        SourceLocation EndLoc) {
1842     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1843                                                 EndLoc);
1844   }
1845 
1846   /// \brief Build a new OpenMP 'num_tasks' clause.
1847   ///
1848   /// By default, performs semantic analysis to build the new statement.
1849   /// Subclasses may override this routine to provide different behavior.
1850   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1851                                       SourceLocation LParenLoc,
1852                                       SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1854                                                EndLoc);
1855   }
1856 
1857   /// \brief Build a new OpenMP 'hint' clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new statement.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1862                                   SourceLocation LParenLoc,
1863                                   SourceLocation EndLoc) {
1864     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1865   }
1866 
1867   /// \brief Build a new OpenMP 'dist_schedule' clause.
1868   ///
1869   /// By default, performs semantic analysis to build the new OpenMP clause.
1870   /// Subclasses may override this routine to provide different behavior.
1871   OMPClause *
1872   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1873                                Expr *ChunkSize, SourceLocation StartLoc,
1874                                SourceLocation LParenLoc, SourceLocation KindLoc,
1875                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDistScheduleClause(
1877         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1878   }
1879 
1880   /// \brief Build a new OpenMP 'to' clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new statement.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1885                                 SourceLocation StartLoc,
1886                                 SourceLocation LParenLoc,
1887                                 SourceLocation EndLoc) {
1888     return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc);
1889   }
1890 
1891   /// \brief Build a new OpenMP 'from' clause.
1892   ///
1893   /// By default, performs semantic analysis to build the new statement.
1894   /// Subclasses may override this routine to provide different behavior.
1895   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1896                                   SourceLocation StartLoc,
1897                                   SourceLocation LParenLoc,
1898                                   SourceLocation EndLoc) {
1899     return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc,
1900                                            EndLoc);
1901   }
1902 
1903   /// Build a new OpenMP 'use_device_ptr' clause.
1904   ///
1905   /// By default, performs semantic analysis to build the new OpenMP clause.
1906   /// Subclasses may override this routine to provide different behavior.
1907   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1908                                           SourceLocation StartLoc,
1909                                           SourceLocation LParenLoc,
1910                                           SourceLocation EndLoc) {
1911     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc,
1912                                                    EndLoc);
1913   }
1914 
1915   /// Build a new OpenMP 'is_device_ptr' clause.
1916   ///
1917   /// By default, performs semantic analysis to build the new OpenMP clause.
1918   /// Subclasses may override this routine to provide different behavior.
1919   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1920                                          SourceLocation StartLoc,
1921                                          SourceLocation LParenLoc,
1922                                          SourceLocation EndLoc) {
1923     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc,
1924                                                   EndLoc);
1925   }
1926 
1927   /// \brief Rebuild the operand to an Objective-C \@synchronized statement.
1928   ///
1929   /// By default, performs semantic analysis to build the new statement.
1930   /// Subclasses may override this routine to provide different behavior.
1931   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1932                                               Expr *object) {
1933     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1934   }
1935 
1936   /// \brief Build a new Objective-C \@synchronized statement.
1937   ///
1938   /// By default, performs semantic analysis to build the new statement.
1939   /// Subclasses may override this routine to provide different behavior.
1940   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1941                                            Expr *Object, Stmt *Body) {
1942     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1943   }
1944 
1945   /// \brief Build a new Objective-C \@autoreleasepool statement.
1946   ///
1947   /// By default, performs semantic analysis to build the new statement.
1948   /// Subclasses may override this routine to provide different behavior.
1949   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1950                                             Stmt *Body) {
1951     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1952   }
1953 
1954   /// \brief Build a new Objective-C fast enumeration statement.
1955   ///
1956   /// By default, performs semantic analysis to build the new statement.
1957   /// Subclasses may override this routine to provide different behavior.
1958   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1959                                           Stmt *Element,
1960                                           Expr *Collection,
1961                                           SourceLocation RParenLoc,
1962                                           Stmt *Body) {
1963     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1964                                                 Element,
1965                                                 Collection,
1966                                                 RParenLoc);
1967     if (ForEachStmt.isInvalid())
1968       return StmtError();
1969 
1970     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1971   }
1972 
1973   /// \brief Build a new C++ exception declaration.
1974   ///
1975   /// By default, performs semantic analysis to build the new decaration.
1976   /// Subclasses may override this routine to provide different behavior.
1977   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1978                                 TypeSourceInfo *Declarator,
1979                                 SourceLocation StartLoc,
1980                                 SourceLocation IdLoc,
1981                                 IdentifierInfo *Id) {
1982     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
1983                                                        StartLoc, IdLoc, Id);
1984     if (Var)
1985       getSema().CurContext->addDecl(Var);
1986     return Var;
1987   }
1988 
1989   /// \brief Build a new C++ catch statement.
1990   ///
1991   /// By default, performs semantic analysis to build the new statement.
1992   /// Subclasses may override this routine to provide different behavior.
1993   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
1994                                  VarDecl *ExceptionDecl,
1995                                  Stmt *Handler) {
1996     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
1997                                                       Handler));
1998   }
1999 
2000   /// \brief Build a new C++ try statement.
2001   ///
2002   /// By default, performs semantic analysis to build the new statement.
2003   /// Subclasses may override this routine to provide different behavior.
2004   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2005                                ArrayRef<Stmt *> Handlers) {
2006     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2007   }
2008 
2009   /// \brief Build a new C++0x range-based for statement.
2010   ///
2011   /// By default, performs semantic analysis to build the new statement.
2012   /// Subclasses may override this routine to provide different behavior.
2013   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2014                                     SourceLocation CoawaitLoc,
2015                                     SourceLocation ColonLoc,
2016                                     Stmt *Range, Stmt *Begin, Stmt *End,
2017                                     Expr *Cond, Expr *Inc,
2018                                     Stmt *LoopVar,
2019                                     SourceLocation RParenLoc) {
2020     // If we've just learned that the range is actually an Objective-C
2021     // collection, treat this as an Objective-C fast enumeration loop.
2022     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2023       if (RangeStmt->isSingleDecl()) {
2024         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2025           if (RangeVar->isInvalidDecl())
2026             return StmtError();
2027 
2028           Expr *RangeExpr = RangeVar->getInit();
2029           if (!RangeExpr->isTypeDependent() &&
2030               RangeExpr->getType()->isObjCObjectPointerType())
2031             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr,
2032                                                         RParenLoc);
2033         }
2034       }
2035     }
2036 
2037     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc,
2038                                           Range, Begin, End,
2039                                           Cond, Inc, LoopVar, RParenLoc,
2040                                           Sema::BFRK_Rebuild);
2041   }
2042 
2043   /// \brief Build a new C++0x range-based for statement.
2044   ///
2045   /// By default, performs semantic analysis to build the new statement.
2046   /// Subclasses may override this routine to provide different behavior.
2047   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2048                                           bool IsIfExists,
2049                                           NestedNameSpecifierLoc QualifierLoc,
2050                                           DeclarationNameInfo NameInfo,
2051                                           Stmt *Nested) {
2052     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2053                                                 QualifierLoc, NameInfo, Nested);
2054   }
2055 
2056   /// \brief Attach body to a C++0x range-based for statement.
2057   ///
2058   /// By default, performs semantic analysis to finish the new statement.
2059   /// Subclasses may override this routine to provide different behavior.
2060   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2061     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2062   }
2063 
2064   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2065                                Stmt *TryBlock, Stmt *Handler) {
2066     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2067   }
2068 
2069   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2070                                   Stmt *Block) {
2071     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2072   }
2073 
2074   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2075     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2076   }
2077 
2078   /// \brief Build a new predefined expression.
2079   ///
2080   /// By default, performs semantic analysis to build the new expression.
2081   /// Subclasses may override this routine to provide different behavior.
2082   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2083                                    PredefinedExpr::IdentType IT) {
2084     return getSema().BuildPredefinedExpr(Loc, IT);
2085   }
2086 
2087   /// \brief Build a new expression that references a declaration.
2088   ///
2089   /// By default, performs semantic analysis to build the new expression.
2090   /// Subclasses may override this routine to provide different behavior.
2091   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2092                                         LookupResult &R,
2093                                         bool RequiresADL) {
2094     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2095   }
2096 
2097 
2098   /// \brief Build a new expression that references a declaration.
2099   ///
2100   /// By default, performs semantic analysis to build the new expression.
2101   /// Subclasses may override this routine to provide different behavior.
2102   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2103                                 ValueDecl *VD,
2104                                 const DeclarationNameInfo &NameInfo,
2105                                 TemplateArgumentListInfo *TemplateArgs) {
2106     CXXScopeSpec SS;
2107     SS.Adopt(QualifierLoc);
2108 
2109     // FIXME: loses template args.
2110 
2111     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2112   }
2113 
2114   /// \brief Build a new expression in parentheses.
2115   ///
2116   /// By default, performs semantic analysis to build the new expression.
2117   /// Subclasses may override this routine to provide different behavior.
2118   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2119                                     SourceLocation RParen) {
2120     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2121   }
2122 
2123   /// \brief Build a new pseudo-destructor expression.
2124   ///
2125   /// By default, performs semantic analysis to build the new expression.
2126   /// Subclasses may override this routine to provide different behavior.
2127   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2128                                             SourceLocation OperatorLoc,
2129                                             bool isArrow,
2130                                             CXXScopeSpec &SS,
2131                                             TypeSourceInfo *ScopeType,
2132                                             SourceLocation CCLoc,
2133                                             SourceLocation TildeLoc,
2134                                         PseudoDestructorTypeStorage Destroyed);
2135 
2136   /// \brief Build a new unary operator expression.
2137   ///
2138   /// By default, performs semantic analysis to build the new expression.
2139   /// Subclasses may override this routine to provide different behavior.
2140   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2141                                         UnaryOperatorKind Opc,
2142                                         Expr *SubExpr) {
2143     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2144   }
2145 
2146   /// \brief Build a new builtin offsetof expression.
2147   ///
2148   /// By default, performs semantic analysis to build the new expression.
2149   /// Subclasses may override this routine to provide different behavior.
2150   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2151                                  TypeSourceInfo *Type,
2152                                  ArrayRef<Sema::OffsetOfComponent> Components,
2153                                  SourceLocation RParenLoc) {
2154     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2155                                           RParenLoc);
2156   }
2157 
2158   /// \brief Build a new sizeof, alignof or vec_step expression with a
2159   /// type argument.
2160   ///
2161   /// By default, performs semantic analysis to build the new expression.
2162   /// Subclasses may override this routine to provide different behavior.
2163   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2164                                          SourceLocation OpLoc,
2165                                          UnaryExprOrTypeTrait ExprKind,
2166                                          SourceRange R) {
2167     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2168   }
2169 
2170   /// \brief Build a new sizeof, alignof or vec step expression with an
2171   /// expression argument.
2172   ///
2173   /// By default, performs semantic analysis to build the new expression.
2174   /// Subclasses may override this routine to provide different behavior.
2175   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2176                                          UnaryExprOrTypeTrait ExprKind,
2177                                          SourceRange R) {
2178     ExprResult Result
2179       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2180     if (Result.isInvalid())
2181       return ExprError();
2182 
2183     return Result;
2184   }
2185 
2186   /// \brief Build a new array subscript expression.
2187   ///
2188   /// By default, performs semantic analysis to build the new expression.
2189   /// Subclasses may override this routine to provide different behavior.
2190   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2191                                              SourceLocation LBracketLoc,
2192                                              Expr *RHS,
2193                                              SourceLocation RBracketLoc) {
2194     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2195                                              LBracketLoc, RHS,
2196                                              RBracketLoc);
2197   }
2198 
2199   /// \brief Build a new array section expression.
2200   ///
2201   /// By default, performs semantic analysis to build the new expression.
2202   /// Subclasses may override this routine to provide different behavior.
2203   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2204                                         Expr *LowerBound,
2205                                         SourceLocation ColonLoc, Expr *Length,
2206                                         SourceLocation RBracketLoc) {
2207     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2208                                               ColonLoc, Length, RBracketLoc);
2209   }
2210 
2211   /// \brief Build a new call expression.
2212   ///
2213   /// By default, performs semantic analysis to build the new expression.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2216                                    MultiExprArg Args,
2217                                    SourceLocation RParenLoc,
2218                                    Expr *ExecConfig = nullptr) {
2219     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2220                                    Args, RParenLoc, ExecConfig);
2221   }
2222 
2223   /// \brief Build a new member access expression.
2224   ///
2225   /// By default, performs semantic analysis to build the new expression.
2226   /// Subclasses may override this routine to provide different behavior.
2227   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2228                                bool isArrow,
2229                                NestedNameSpecifierLoc QualifierLoc,
2230                                SourceLocation TemplateKWLoc,
2231                                const DeclarationNameInfo &MemberNameInfo,
2232                                ValueDecl *Member,
2233                                NamedDecl *FoundDecl,
2234                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2235                                NamedDecl *FirstQualifierInScope) {
2236     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2237                                                                       isArrow);
2238     if (!Member->getDeclName()) {
2239       // We have a reference to an unnamed field.  This is always the
2240       // base of an anonymous struct/union member access, i.e. the
2241       // field is always of record type.
2242       assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!");
2243       assert(Member->getType()->isRecordType() &&
2244              "unnamed member not of record type?");
2245 
2246       BaseResult =
2247         getSema().PerformObjectMemberConversion(BaseResult.get(),
2248                                                 QualifierLoc.getNestedNameSpecifier(),
2249                                                 FoundDecl, Member);
2250       if (BaseResult.isInvalid())
2251         return ExprError();
2252       Base = BaseResult.get();
2253       ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
2254       MemberExpr *ME = new (getSema().Context)
2255           MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
2256                      cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
2257       return ME;
2258     }
2259 
2260     CXXScopeSpec SS;
2261     SS.Adopt(QualifierLoc);
2262 
2263     Base = BaseResult.get();
2264     QualType BaseType = Base->getType();
2265 
2266     if (isArrow && !BaseType->isPointerType())
2267       return ExprError();
2268 
2269     // FIXME: this involves duplicating earlier analysis in a lot of
2270     // cases; we should avoid this when possible.
2271     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2272     R.addDecl(FoundDecl);
2273     R.resolveKind();
2274 
2275     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2276                                               SS, TemplateKWLoc,
2277                                               FirstQualifierInScope,
2278                                               R, ExplicitTemplateArgs,
2279                                               /*S*/nullptr);
2280   }
2281 
2282   /// \brief Build a new binary operator expression.
2283   ///
2284   /// By default, performs semantic analysis to build the new expression.
2285   /// Subclasses may override this routine to provide different behavior.
2286   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2287                                          BinaryOperatorKind Opc,
2288                                          Expr *LHS, Expr *RHS) {
2289     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2290   }
2291 
2292   /// \brief Build a new conditional operator expression.
2293   ///
2294   /// By default, performs semantic analysis to build the new expression.
2295   /// Subclasses may override this routine to provide different behavior.
2296   ExprResult RebuildConditionalOperator(Expr *Cond,
2297                                         SourceLocation QuestionLoc,
2298                                         Expr *LHS,
2299                                         SourceLocation ColonLoc,
2300                                         Expr *RHS) {
2301     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2302                                         LHS, RHS);
2303   }
2304 
2305   /// \brief Build a new C-style cast expression.
2306   ///
2307   /// By default, performs semantic analysis to build the new expression.
2308   /// Subclasses may override this routine to provide different behavior.
2309   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2310                                          TypeSourceInfo *TInfo,
2311                                          SourceLocation RParenLoc,
2312                                          Expr *SubExpr) {
2313     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2314                                          SubExpr);
2315   }
2316 
2317   /// \brief Build a new compound literal expression.
2318   ///
2319   /// By default, performs semantic analysis to build the new expression.
2320   /// Subclasses may override this routine to provide different behavior.
2321   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2322                                               TypeSourceInfo *TInfo,
2323                                               SourceLocation RParenLoc,
2324                                               Expr *Init) {
2325     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2326                                               Init);
2327   }
2328 
2329   /// \brief Build a new extended vector element access expression.
2330   ///
2331   /// By default, performs semantic analysis to build the new expression.
2332   /// Subclasses may override this routine to provide different behavior.
2333   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2334                                                SourceLocation OpLoc,
2335                                                SourceLocation AccessorLoc,
2336                                                IdentifierInfo &Accessor) {
2337 
2338     CXXScopeSpec SS;
2339     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2340     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2341                                               OpLoc, /*IsArrow*/ false,
2342                                               SS, SourceLocation(),
2343                                               /*FirstQualifierInScope*/ nullptr,
2344                                               NameInfo,
2345                                               /* TemplateArgs */ nullptr,
2346                                               /*S*/ nullptr);
2347   }
2348 
2349   /// \brief Build a new initializer list expression.
2350   ///
2351   /// By default, performs semantic analysis to build the new expression.
2352   /// Subclasses may override this routine to provide different behavior.
2353   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2354                              MultiExprArg Inits,
2355                              SourceLocation RBraceLoc) {
2356     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2357   }
2358 
2359   /// \brief Build a new designated initializer expression.
2360   ///
2361   /// By default, performs semantic analysis to build the new expression.
2362   /// Subclasses may override this routine to provide different behavior.
2363   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2364                                              MultiExprArg ArrayExprs,
2365                                              SourceLocation EqualOrColonLoc,
2366                                              bool GNUSyntax,
2367                                              Expr *Init) {
2368     ExprResult Result
2369       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2370                                            Init);
2371     if (Result.isInvalid())
2372       return ExprError();
2373 
2374     return Result;
2375   }
2376 
2377   /// \brief Build a new value-initialized expression.
2378   ///
2379   /// By default, builds the implicit value initialization without performing
2380   /// any semantic analysis. Subclasses may override this routine to provide
2381   /// different behavior.
2382   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2383     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2384   }
2385 
2386   /// \brief Build a new \c va_arg expression.
2387   ///
2388   /// By default, performs semantic analysis to build the new expression.
2389   /// Subclasses may override this routine to provide different behavior.
2390   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2391                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2392                                     SourceLocation RParenLoc) {
2393     return getSema().BuildVAArgExpr(BuiltinLoc,
2394                                     SubExpr, TInfo,
2395                                     RParenLoc);
2396   }
2397 
2398   /// \brief Build a new expression list in parentheses.
2399   ///
2400   /// By default, performs semantic analysis to build the new expression.
2401   /// Subclasses may override this routine to provide different behavior.
2402   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2403                                   MultiExprArg SubExprs,
2404                                   SourceLocation RParenLoc) {
2405     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2406   }
2407 
2408   /// \brief Build a new address-of-label expression.
2409   ///
2410   /// By default, performs semantic analysis, using the name of the label
2411   /// rather than attempting to map the label statement itself.
2412   /// Subclasses may override this routine to provide different behavior.
2413   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2414                                   SourceLocation LabelLoc, LabelDecl *Label) {
2415     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2416   }
2417 
2418   /// \brief Build a new GNU statement expression.
2419   ///
2420   /// By default, performs semantic analysis to build the new expression.
2421   /// Subclasses may override this routine to provide different behavior.
2422   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2423                                    Stmt *SubStmt,
2424                                    SourceLocation RParenLoc) {
2425     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2426   }
2427 
2428   /// \brief Build a new __builtin_choose_expr expression.
2429   ///
2430   /// By default, performs semantic analysis to build the new expression.
2431   /// Subclasses may override this routine to provide different behavior.
2432   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2433                                      Expr *Cond, Expr *LHS, Expr *RHS,
2434                                      SourceLocation RParenLoc) {
2435     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2436                                    Cond, LHS, RHS,
2437                                    RParenLoc);
2438   }
2439 
2440   /// \brief Build a new generic selection expression.
2441   ///
2442   /// By default, performs semantic analysis to build the new expression.
2443   /// Subclasses may override this routine to provide different behavior.
2444   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2445                                          SourceLocation DefaultLoc,
2446                                          SourceLocation RParenLoc,
2447                                          Expr *ControllingExpr,
2448                                          ArrayRef<TypeSourceInfo *> Types,
2449                                          ArrayRef<Expr *> Exprs) {
2450     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2451                                                 ControllingExpr, Types, Exprs);
2452   }
2453 
2454   /// \brief Build a new overloaded operator call expression.
2455   ///
2456   /// By default, performs semantic analysis to build the new expression.
2457   /// The semantic analysis provides the behavior of template instantiation,
2458   /// copying with transformations that turn what looks like an overloaded
2459   /// operator call into a use of a builtin operator, performing
2460   /// argument-dependent lookup, etc. Subclasses may override this routine to
2461   /// provide different behavior.
2462   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2463                                               SourceLocation OpLoc,
2464                                               Expr *Callee,
2465                                               Expr *First,
2466                                               Expr *Second);
2467 
2468   /// \brief Build a new C++ "named" cast expression, such as static_cast or
2469   /// reinterpret_cast.
2470   ///
2471   /// By default, this routine dispatches to one of the more-specific routines
2472   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2473   /// Subclasses may override this routine to provide different behavior.
2474   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2475                                            Stmt::StmtClass Class,
2476                                            SourceLocation LAngleLoc,
2477                                            TypeSourceInfo *TInfo,
2478                                            SourceLocation RAngleLoc,
2479                                            SourceLocation LParenLoc,
2480                                            Expr *SubExpr,
2481                                            SourceLocation RParenLoc) {
2482     switch (Class) {
2483     case Stmt::CXXStaticCastExprClass:
2484       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2485                                                    RAngleLoc, LParenLoc,
2486                                                    SubExpr, RParenLoc);
2487 
2488     case Stmt::CXXDynamicCastExprClass:
2489       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2490                                                     RAngleLoc, LParenLoc,
2491                                                     SubExpr, RParenLoc);
2492 
2493     case Stmt::CXXReinterpretCastExprClass:
2494       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2495                                                         RAngleLoc, LParenLoc,
2496                                                         SubExpr,
2497                                                         RParenLoc);
2498 
2499     case Stmt::CXXConstCastExprClass:
2500       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2501                                                    RAngleLoc, LParenLoc,
2502                                                    SubExpr, RParenLoc);
2503 
2504     default:
2505       llvm_unreachable("Invalid C++ named cast");
2506     }
2507   }
2508 
2509   /// \brief Build a new C++ static_cast expression.
2510   ///
2511   /// By default, performs semantic analysis to build the new expression.
2512   /// Subclasses may override this routine to provide different behavior.
2513   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2514                                             SourceLocation LAngleLoc,
2515                                             TypeSourceInfo *TInfo,
2516                                             SourceLocation RAngleLoc,
2517                                             SourceLocation LParenLoc,
2518                                             Expr *SubExpr,
2519                                             SourceLocation RParenLoc) {
2520     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2521                                        TInfo, SubExpr,
2522                                        SourceRange(LAngleLoc, RAngleLoc),
2523                                        SourceRange(LParenLoc, RParenLoc));
2524   }
2525 
2526   /// \brief Build a new C++ dynamic_cast expression.
2527   ///
2528   /// By default, performs semantic analysis to build the new expression.
2529   /// Subclasses may override this routine to provide different behavior.
2530   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2531                                              SourceLocation LAngleLoc,
2532                                              TypeSourceInfo *TInfo,
2533                                              SourceLocation RAngleLoc,
2534                                              SourceLocation LParenLoc,
2535                                              Expr *SubExpr,
2536                                              SourceLocation RParenLoc) {
2537     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2538                                        TInfo, SubExpr,
2539                                        SourceRange(LAngleLoc, RAngleLoc),
2540                                        SourceRange(LParenLoc, RParenLoc));
2541   }
2542 
2543   /// \brief Build a new C++ reinterpret_cast expression.
2544   ///
2545   /// By default, performs semantic analysis to build the new expression.
2546   /// Subclasses may override this routine to provide different behavior.
2547   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2548                                                  SourceLocation LAngleLoc,
2549                                                  TypeSourceInfo *TInfo,
2550                                                  SourceLocation RAngleLoc,
2551                                                  SourceLocation LParenLoc,
2552                                                  Expr *SubExpr,
2553                                                  SourceLocation RParenLoc) {
2554     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2555                                        TInfo, SubExpr,
2556                                        SourceRange(LAngleLoc, RAngleLoc),
2557                                        SourceRange(LParenLoc, RParenLoc));
2558   }
2559 
2560   /// \brief Build a new C++ const_cast expression.
2561   ///
2562   /// By default, performs semantic analysis to build the new expression.
2563   /// Subclasses may override this routine to provide different behavior.
2564   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2565                                            SourceLocation LAngleLoc,
2566                                            TypeSourceInfo *TInfo,
2567                                            SourceLocation RAngleLoc,
2568                                            SourceLocation LParenLoc,
2569                                            Expr *SubExpr,
2570                                            SourceLocation RParenLoc) {
2571     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2572                                        TInfo, SubExpr,
2573                                        SourceRange(LAngleLoc, RAngleLoc),
2574                                        SourceRange(LParenLoc, RParenLoc));
2575   }
2576 
2577   /// \brief Build a new C++ functional-style cast expression.
2578   ///
2579   /// By default, performs semantic analysis to build the new expression.
2580   /// Subclasses may override this routine to provide different behavior.
2581   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2582                                           SourceLocation LParenLoc,
2583                                           Expr *Sub,
2584                                           SourceLocation RParenLoc,
2585                                           bool ListInitialization) {
2586     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2587                                                MultiExprArg(&Sub, 1), RParenLoc,
2588                                                ListInitialization);
2589   }
2590 
2591   /// \brief Build a new C++ typeid(type) expression.
2592   ///
2593   /// By default, performs semantic analysis to build the new expression.
2594   /// Subclasses may override this routine to provide different behavior.
2595   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2596                                         SourceLocation TypeidLoc,
2597                                         TypeSourceInfo *Operand,
2598                                         SourceLocation RParenLoc) {
2599     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2600                                     RParenLoc);
2601   }
2602 
2603 
2604   /// \brief Build a new C++ typeid(expr) expression.
2605   ///
2606   /// By default, performs semantic analysis to build the new expression.
2607   /// Subclasses may override this routine to provide different behavior.
2608   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2609                                         SourceLocation TypeidLoc,
2610                                         Expr *Operand,
2611                                         SourceLocation RParenLoc) {
2612     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2613                                     RParenLoc);
2614   }
2615 
2616   /// \brief Build a new C++ __uuidof(type) expression.
2617   ///
2618   /// By default, performs semantic analysis to build the new expression.
2619   /// Subclasses may override this routine to provide different behavior.
2620   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2621                                         SourceLocation TypeidLoc,
2622                                         TypeSourceInfo *Operand,
2623                                         SourceLocation RParenLoc) {
2624     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2625                                     RParenLoc);
2626   }
2627 
2628   /// \brief Build a new C++ __uuidof(expr) expression.
2629   ///
2630   /// By default, performs semantic analysis to build the new expression.
2631   /// Subclasses may override this routine to provide different behavior.
2632   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2633                                         SourceLocation TypeidLoc,
2634                                         Expr *Operand,
2635                                         SourceLocation RParenLoc) {
2636     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2637                                     RParenLoc);
2638   }
2639 
2640   /// \brief Build a new C++ "this" expression.
2641   ///
2642   /// By default, builds a new "this" expression without performing any
2643   /// semantic analysis. Subclasses may override this routine to provide
2644   /// different behavior.
2645   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2646                                 QualType ThisType,
2647                                 bool isImplicit) {
2648     getSema().CheckCXXThisCapture(ThisLoc);
2649     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2650   }
2651 
2652   /// \brief Build a new C++ throw expression.
2653   ///
2654   /// By default, performs semantic analysis to build the new expression.
2655   /// Subclasses may override this routine to provide different behavior.
2656   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2657                                  bool IsThrownVariableInScope) {
2658     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2659   }
2660 
2661   /// \brief Build a new C++ default-argument expression.
2662   ///
2663   /// By default, builds a new default-argument expression, which does not
2664   /// require any semantic analysis. Subclasses may override this routine to
2665   /// provide different behavior.
2666   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2667                                             ParmVarDecl *Param) {
2668     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2669   }
2670 
2671   /// \brief Build a new C++11 default-initialization expression.
2672   ///
2673   /// By default, builds a new default field initialization expression, which
2674   /// does not require any semantic analysis. Subclasses may override this
2675   /// routine to provide different behavior.
2676   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2677                                        FieldDecl *Field) {
2678     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2679   }
2680 
2681   /// \brief Build a new C++ zero-initialization expression.
2682   ///
2683   /// By default, performs semantic analysis to build the new expression.
2684   /// Subclasses may override this routine to provide different behavior.
2685   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2686                                            SourceLocation LParenLoc,
2687                                            SourceLocation RParenLoc) {
2688     return getSema().BuildCXXTypeConstructExpr(
2689         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2690   }
2691 
2692   /// \brief Build a new C++ "new" expression.
2693   ///
2694   /// By default, performs semantic analysis to build the new expression.
2695   /// Subclasses may override this routine to provide different behavior.
2696   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2697                                bool UseGlobal,
2698                                SourceLocation PlacementLParen,
2699                                MultiExprArg PlacementArgs,
2700                                SourceLocation PlacementRParen,
2701                                SourceRange TypeIdParens,
2702                                QualType AllocatedType,
2703                                TypeSourceInfo *AllocatedTypeInfo,
2704                                Expr *ArraySize,
2705                                SourceRange DirectInitRange,
2706                                Expr *Initializer) {
2707     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2708                                  PlacementLParen,
2709                                  PlacementArgs,
2710                                  PlacementRParen,
2711                                  TypeIdParens,
2712                                  AllocatedType,
2713                                  AllocatedTypeInfo,
2714                                  ArraySize,
2715                                  DirectInitRange,
2716                                  Initializer);
2717   }
2718 
2719   /// \brief Build a new C++ "delete" expression.
2720   ///
2721   /// By default, performs semantic analysis to build the new expression.
2722   /// Subclasses may override this routine to provide different behavior.
2723   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2724                                         bool IsGlobalDelete,
2725                                         bool IsArrayForm,
2726                                         Expr *Operand) {
2727     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2728                                     Operand);
2729   }
2730 
2731   /// \brief Build a new type trait expression.
2732   ///
2733   /// By default, performs semantic analysis to build the new expression.
2734   /// Subclasses may override this routine to provide different behavior.
2735   ExprResult RebuildTypeTrait(TypeTrait Trait,
2736                               SourceLocation StartLoc,
2737                               ArrayRef<TypeSourceInfo *> Args,
2738                               SourceLocation RParenLoc) {
2739     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2740   }
2741 
2742   /// \brief Build a new array type trait expression.
2743   ///
2744   /// By default, performs semantic analysis to build the new expression.
2745   /// Subclasses may override this routine to provide different behavior.
2746   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2747                                    SourceLocation StartLoc,
2748                                    TypeSourceInfo *TSInfo,
2749                                    Expr *DimExpr,
2750                                    SourceLocation RParenLoc) {
2751     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2752   }
2753 
2754   /// \brief Build a new expression trait expression.
2755   ///
2756   /// By default, performs semantic analysis to build the new expression.
2757   /// Subclasses may override this routine to provide different behavior.
2758   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2759                                    SourceLocation StartLoc,
2760                                    Expr *Queried,
2761                                    SourceLocation RParenLoc) {
2762     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2763   }
2764 
2765   /// \brief Build a new (previously unresolved) declaration reference
2766   /// expression.
2767   ///
2768   /// By default, performs semantic analysis to build the new expression.
2769   /// Subclasses may override this routine to provide different behavior.
2770   ExprResult RebuildDependentScopeDeclRefExpr(
2771                                           NestedNameSpecifierLoc QualifierLoc,
2772                                           SourceLocation TemplateKWLoc,
2773                                        const DeclarationNameInfo &NameInfo,
2774                               const TemplateArgumentListInfo *TemplateArgs,
2775                                           bool IsAddressOfOperand,
2776                                           TypeSourceInfo **RecoveryTSI) {
2777     CXXScopeSpec SS;
2778     SS.Adopt(QualifierLoc);
2779 
2780     if (TemplateArgs || TemplateKWLoc.isValid())
2781       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2782                                                     TemplateArgs);
2783 
2784     return getSema().BuildQualifiedDeclarationNameExpr(
2785         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2786   }
2787 
2788   /// \brief Build a new template-id expression.
2789   ///
2790   /// By default, performs semantic analysis to build the new expression.
2791   /// Subclasses may override this routine to provide different behavior.
2792   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2793                                    SourceLocation TemplateKWLoc,
2794                                    LookupResult &R,
2795                                    bool RequiresADL,
2796                               const TemplateArgumentListInfo *TemplateArgs) {
2797     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2798                                          TemplateArgs);
2799   }
2800 
2801   /// \brief Build a new object-construction expression.
2802   ///
2803   /// By default, performs semantic analysis to build the new expression.
2804   /// Subclasses may override this routine to provide different behavior.
2805   ExprResult RebuildCXXConstructExpr(QualType T,
2806                                      SourceLocation Loc,
2807                                      CXXConstructorDecl *Constructor,
2808                                      bool IsElidable,
2809                                      MultiExprArg Args,
2810                                      bool HadMultipleCandidates,
2811                                      bool ListInitialization,
2812                                      bool StdInitListInitialization,
2813                                      bool RequiresZeroInit,
2814                              CXXConstructExpr::ConstructionKind ConstructKind,
2815                                      SourceRange ParenRange) {
2816     SmallVector<Expr*, 8> ConvertedArgs;
2817     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2818                                           ConvertedArgs))
2819       return ExprError();
2820 
2821     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2822                                            IsElidable,
2823                                            ConvertedArgs,
2824                                            HadMultipleCandidates,
2825                                            ListInitialization,
2826                                            StdInitListInitialization,
2827                                            RequiresZeroInit, ConstructKind,
2828                                            ParenRange);
2829   }
2830 
2831   /// \brief Build a new implicit construction via inherited constructor
2832   /// expression.
2833   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2834                                              CXXConstructorDecl *Constructor,
2835                                              bool ConstructsVBase,
2836                                              bool InheritedFromVBase) {
2837     return new (getSema().Context) CXXInheritedCtorInitExpr(
2838         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2839   }
2840 
2841   /// \brief Build a new object-construction expression.
2842   ///
2843   /// By default, performs semantic analysis to build the new expression.
2844   /// Subclasses may override this routine to provide different behavior.
2845   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2846                                            SourceLocation LParenOrBraceLoc,
2847                                            MultiExprArg Args,
2848                                            SourceLocation RParenOrBraceLoc,
2849                                            bool ListInitialization) {
2850     return getSema().BuildCXXTypeConstructExpr(
2851         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2852   }
2853 
2854   /// \brief Build a new object-construction 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 RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2859                                                SourceLocation LParenLoc,
2860                                                MultiExprArg Args,
2861                                                SourceLocation RParenLoc,
2862                                                bool ListInitialization) {
2863     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2864                                                RParenLoc, ListInitialization);
2865   }
2866 
2867   /// \brief Build a new member reference expression.
2868   ///
2869   /// By default, performs semantic analysis to build the new expression.
2870   /// Subclasses may override this routine to provide different behavior.
2871   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2872                                                 QualType BaseType,
2873                                                 bool IsArrow,
2874                                                 SourceLocation OperatorLoc,
2875                                           NestedNameSpecifierLoc QualifierLoc,
2876                                                 SourceLocation TemplateKWLoc,
2877                                             NamedDecl *FirstQualifierInScope,
2878                                    const DeclarationNameInfo &MemberNameInfo,
2879                               const TemplateArgumentListInfo *TemplateArgs) {
2880     CXXScopeSpec SS;
2881     SS.Adopt(QualifierLoc);
2882 
2883     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2884                                             OperatorLoc, IsArrow,
2885                                             SS, TemplateKWLoc,
2886                                             FirstQualifierInScope,
2887                                             MemberNameInfo,
2888                                             TemplateArgs, /*S*/nullptr);
2889   }
2890 
2891   /// \brief Build a new member reference expression.
2892   ///
2893   /// By default, performs semantic analysis to build the new expression.
2894   /// Subclasses may override this routine to provide different behavior.
2895   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2896                                          SourceLocation OperatorLoc,
2897                                          bool IsArrow,
2898                                          NestedNameSpecifierLoc QualifierLoc,
2899                                          SourceLocation TemplateKWLoc,
2900                                          NamedDecl *FirstQualifierInScope,
2901                                          LookupResult &R,
2902                                 const TemplateArgumentListInfo *TemplateArgs) {
2903     CXXScopeSpec SS;
2904     SS.Adopt(QualifierLoc);
2905 
2906     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2907                                             OperatorLoc, IsArrow,
2908                                             SS, TemplateKWLoc,
2909                                             FirstQualifierInScope,
2910                                             R, TemplateArgs, /*S*/nullptr);
2911   }
2912 
2913   /// \brief Build a new noexcept expression.
2914   ///
2915   /// By default, performs semantic analysis to build the new expression.
2916   /// Subclasses may override this routine to provide different behavior.
2917   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2918     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2919   }
2920 
2921   /// \brief Build a new expression to compute the length of a parameter pack.
2922   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2923                                    NamedDecl *Pack,
2924                                    SourceLocation PackLoc,
2925                                    SourceLocation RParenLoc,
2926                                    Optional<unsigned> Length,
2927                                    ArrayRef<TemplateArgument> PartialArgs) {
2928     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2929                                   RParenLoc, Length, PartialArgs);
2930   }
2931 
2932   /// \brief Build a new Objective-C boxed expression.
2933   ///
2934   /// By default, performs semantic analysis to build the new expression.
2935   /// Subclasses may override this routine to provide different behavior.
2936   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2937     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2938   }
2939 
2940   /// \brief Build a new Objective-C array literal.
2941   ///
2942   /// By default, performs semantic analysis to build the new expression.
2943   /// Subclasses may override this routine to provide different behavior.
2944   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2945                                      Expr **Elements, unsigned NumElements) {
2946     return getSema().BuildObjCArrayLiteral(Range,
2947                                            MultiExprArg(Elements, NumElements));
2948   }
2949 
2950   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2951                                          Expr *Base, Expr *Key,
2952                                          ObjCMethodDecl *getterMethod,
2953                                          ObjCMethodDecl *setterMethod) {
2954     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2955                                                    getterMethod, setterMethod);
2956   }
2957 
2958   /// \brief Build a new Objective-C dictionary literal.
2959   ///
2960   /// By default, performs semantic analysis to build the new expression.
2961   /// Subclasses may override this routine to provide different behavior.
2962   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2963                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2964     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2965   }
2966 
2967   /// \brief Build a new Objective-C \@encode expression.
2968   ///
2969   /// By default, performs semantic analysis to build the new expression.
2970   /// Subclasses may override this routine to provide different behavior.
2971   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
2972                                          TypeSourceInfo *EncodeTypeInfo,
2973                                          SourceLocation RParenLoc) {
2974     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
2975   }
2976 
2977   /// \brief Build a new Objective-C class message.
2978   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
2979                                           Selector Sel,
2980                                           ArrayRef<SourceLocation> SelectorLocs,
2981                                           ObjCMethodDecl *Method,
2982                                           SourceLocation LBracLoc,
2983                                           MultiExprArg Args,
2984                                           SourceLocation RBracLoc) {
2985     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
2986                                      ReceiverTypeInfo->getType(),
2987                                      /*SuperLoc=*/SourceLocation(),
2988                                      Sel, Method, LBracLoc, SelectorLocs,
2989                                      RBracLoc, Args);
2990   }
2991 
2992   /// \brief Build a new Objective-C instance message.
2993   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
2994                                           Selector Sel,
2995                                           ArrayRef<SourceLocation> SelectorLocs,
2996                                           ObjCMethodDecl *Method,
2997                                           SourceLocation LBracLoc,
2998                                           MultiExprArg Args,
2999                                           SourceLocation RBracLoc) {
3000     return SemaRef.BuildInstanceMessage(Receiver,
3001                                         Receiver->getType(),
3002                                         /*SuperLoc=*/SourceLocation(),
3003                                         Sel, Method, LBracLoc, SelectorLocs,
3004                                         RBracLoc, Args);
3005   }
3006 
3007   /// \brief Build a new Objective-C instance/class message to 'super'.
3008   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3009                                     Selector Sel,
3010                                     ArrayRef<SourceLocation> SelectorLocs,
3011                                     QualType SuperType,
3012                                     ObjCMethodDecl *Method,
3013                                     SourceLocation LBracLoc,
3014                                     MultiExprArg Args,
3015                                     SourceLocation RBracLoc) {
3016     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3017                                           SuperType,
3018                                           SuperLoc,
3019                                           Sel, Method, LBracLoc, SelectorLocs,
3020                                           RBracLoc, Args)
3021                                       : SemaRef.BuildClassMessage(nullptr,
3022                                           SuperType,
3023                                           SuperLoc,
3024                                           Sel, Method, LBracLoc, SelectorLocs,
3025                                           RBracLoc, Args);
3026 
3027 
3028   }
3029 
3030   /// \brief Build a new Objective-C ivar reference expression.
3031   ///
3032   /// By default, performs semantic analysis to build the new expression.
3033   /// Subclasses may override this routine to provide different behavior.
3034   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3035                                           SourceLocation IvarLoc,
3036                                           bool IsArrow, bool IsFreeIvar) {
3037     CXXScopeSpec SS;
3038     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3039     ExprResult Result = getSema().BuildMemberReferenceExpr(
3040         BaseArg, BaseArg->getType(),
3041         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3042         /*FirstQualifierInScope=*/nullptr, NameInfo,
3043         /*TemplateArgs=*/nullptr,
3044         /*S=*/nullptr);
3045     if (IsFreeIvar && Result.isUsable())
3046       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3047     return Result;
3048   }
3049 
3050   /// \brief Build a new Objective-C property reference expression.
3051   ///
3052   /// By default, performs semantic analysis to build the new expression.
3053   /// Subclasses may override this routine to provide different behavior.
3054   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3055                                         ObjCPropertyDecl *Property,
3056                                         SourceLocation PropertyLoc) {
3057     CXXScopeSpec SS;
3058     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3059     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3060                                               /*FIXME:*/PropertyLoc,
3061                                               /*IsArrow=*/false,
3062                                               SS, SourceLocation(),
3063                                               /*FirstQualifierInScope=*/nullptr,
3064                                               NameInfo,
3065                                               /*TemplateArgs=*/nullptr,
3066                                               /*S=*/nullptr);
3067   }
3068 
3069   /// \brief Build a new Objective-C property reference expression.
3070   ///
3071   /// By default, performs semantic analysis to build the new expression.
3072   /// Subclasses may override this routine to provide different behavior.
3073   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3074                                         ObjCMethodDecl *Getter,
3075                                         ObjCMethodDecl *Setter,
3076                                         SourceLocation PropertyLoc) {
3077     // Since these expressions can only be value-dependent, we do not
3078     // need to perform semantic analysis again.
3079     return Owned(
3080       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3081                                                   VK_LValue, OK_ObjCProperty,
3082                                                   PropertyLoc, Base));
3083   }
3084 
3085   /// \brief Build a new Objective-C "isa" expression.
3086   ///
3087   /// By default, performs semantic analysis to build the new expression.
3088   /// Subclasses may override this routine to provide different behavior.
3089   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3090                                 SourceLocation OpLoc, bool IsArrow) {
3091     CXXScopeSpec SS;
3092     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3093     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3094                                               OpLoc, IsArrow,
3095                                               SS, SourceLocation(),
3096                                               /*FirstQualifierInScope=*/nullptr,
3097                                               NameInfo,
3098                                               /*TemplateArgs=*/nullptr,
3099                                               /*S=*/nullptr);
3100   }
3101 
3102   /// \brief Build a new shuffle vector expression.
3103   ///
3104   /// By default, performs semantic analysis to build the new expression.
3105   /// Subclasses may override this routine to provide different behavior.
3106   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3107                                       MultiExprArg SubExprs,
3108                                       SourceLocation RParenLoc) {
3109     // Find the declaration for __builtin_shufflevector
3110     const IdentifierInfo &Name
3111       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3112     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3113     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3114     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3115 
3116     // Build a reference to the __builtin_shufflevector builtin
3117     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3118     Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false,
3119                                                   SemaRef.Context.BuiltinFnTy,
3120                                                   VK_RValue, BuiltinLoc);
3121     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3122     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3123                                        CK_BuiltinFnToFnPtr).get();
3124 
3125     // Build the CallExpr
3126     ExprResult TheCall = new (SemaRef.Context) CallExpr(
3127         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3128         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3129 
3130     // Type-check the __builtin_shufflevector expression.
3131     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3132   }
3133 
3134   /// \brief Build a new convert vector expression.
3135   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3136                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3137                                       SourceLocation RParenLoc) {
3138     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3139                                          BuiltinLoc, RParenLoc);
3140   }
3141 
3142   /// \brief Build a new template argument pack expansion.
3143   ///
3144   /// By default, performs semantic analysis to build a new pack expansion
3145   /// for a template argument. Subclasses may override this routine to provide
3146   /// different behavior.
3147   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3148                                            SourceLocation EllipsisLoc,
3149                                            Optional<unsigned> NumExpansions) {
3150     switch (Pattern.getArgument().getKind()) {
3151     case TemplateArgument::Expression: {
3152       ExprResult Result
3153         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3154                                        EllipsisLoc, NumExpansions);
3155       if (Result.isInvalid())
3156         return TemplateArgumentLoc();
3157 
3158       return TemplateArgumentLoc(Result.get(), Result.get());
3159     }
3160 
3161     case TemplateArgument::Template:
3162       return TemplateArgumentLoc(TemplateArgument(
3163                                           Pattern.getArgument().getAsTemplate(),
3164                                                   NumExpansions),
3165                                  Pattern.getTemplateQualifierLoc(),
3166                                  Pattern.getTemplateNameLoc(),
3167                                  EllipsisLoc);
3168 
3169     case TemplateArgument::Null:
3170     case TemplateArgument::Integral:
3171     case TemplateArgument::Declaration:
3172     case TemplateArgument::Pack:
3173     case TemplateArgument::TemplateExpansion:
3174     case TemplateArgument::NullPtr:
3175       llvm_unreachable("Pack expansion pattern has no parameter packs");
3176 
3177     case TemplateArgument::Type:
3178       if (TypeSourceInfo *Expansion
3179             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3180                                            EllipsisLoc,
3181                                            NumExpansions))
3182         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3183                                    Expansion);
3184       break;
3185     }
3186 
3187     return TemplateArgumentLoc();
3188   }
3189 
3190   /// \brief Build a new expression pack expansion.
3191   ///
3192   /// By default, performs semantic analysis to build a new pack expansion
3193   /// for an expression. Subclasses may override this routine to provide
3194   /// different behavior.
3195   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3196                                   Optional<unsigned> NumExpansions) {
3197     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3198   }
3199 
3200   /// \brief Build a new C++1z fold-expression.
3201   ///
3202   /// By default, performs semantic analysis in order to build a new fold
3203   /// expression.
3204   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3205                                 BinaryOperatorKind Operator,
3206                                 SourceLocation EllipsisLoc, Expr *RHS,
3207                                 SourceLocation RParenLoc) {
3208     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3209                                       RHS, RParenLoc);
3210   }
3211 
3212   /// \brief Build an empty C++1z fold-expression with the given operator.
3213   ///
3214   /// By default, produces the fallback value for the fold-expression, or
3215   /// produce an error if there is no fallback value.
3216   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3217                                      BinaryOperatorKind Operator) {
3218     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3219   }
3220 
3221   /// \brief Build a new atomic operation expression.
3222   ///
3223   /// By default, performs semantic analysis to build the new expression.
3224   /// Subclasses may override this routine to provide different behavior.
3225   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3226                                MultiExprArg SubExprs,
3227                                QualType RetTy,
3228                                AtomicExpr::AtomicOp Op,
3229                                SourceLocation RParenLoc) {
3230     // Just create the expression; there is not any interesting semantic
3231     // analysis here because we can't actually build an AtomicExpr until
3232     // we are sure it is semantically sound.
3233     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3234                                             RParenLoc);
3235   }
3236 
3237 private:
3238   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3239                                      QualType ObjectType,
3240                                      NamedDecl *FirstQualifierInScope,
3241                                      CXXScopeSpec &SS);
3242 
3243   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3244                                              QualType ObjectType,
3245                                              NamedDecl *FirstQualifierInScope,
3246                                              CXXScopeSpec &SS);
3247 
3248   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3249                                             NamedDecl *FirstQualifierInScope,
3250                                             CXXScopeSpec &SS);
3251 
3252   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3253                                       DependentNameTypeLoc TL,
3254                                       bool DeducibleTSTContext);
3255 };
3256 
3257 template<typename Derived>
3258 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
3259   if (!S)
3260     return S;
3261 
3262   switch (S->getStmtClass()) {
3263   case Stmt::NoStmtClass: break;
3264 
3265   // Transform individual statement nodes
3266 #define STMT(Node, Parent)                                              \
3267   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3268 #define ABSTRACT_STMT(Node)
3269 #define EXPR(Node, Parent)
3270 #include "clang/AST/StmtNodes.inc"
3271 
3272   // Transform expressions by calling TransformExpr.
3273 #define STMT(Node, Parent)
3274 #define ABSTRACT_STMT(Stmt)
3275 #define EXPR(Node, Parent) case Stmt::Node##Class:
3276 #include "clang/AST/StmtNodes.inc"
3277     {
3278       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3279       if (E.isInvalid())
3280         return StmtError();
3281 
3282       return getSema().ActOnExprStmt(E);
3283     }
3284   }
3285 
3286   return S;
3287 }
3288 
3289 template<typename Derived>
3290 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3291   if (!S)
3292     return S;
3293 
3294   switch (S->getClauseKind()) {
3295   default: break;
3296   // Transform individual clause nodes
3297 #define OPENMP_CLAUSE(Name, Class)                                             \
3298   case OMPC_ ## Name :                                                         \
3299     return getDerived().Transform ## Class(cast<Class>(S));
3300 #include "clang/Basic/OpenMPKinds.def"
3301   }
3302 
3303   return S;
3304 }
3305 
3306 
3307 template<typename Derived>
3308 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3309   if (!E)
3310     return E;
3311 
3312   switch (E->getStmtClass()) {
3313     case Stmt::NoStmtClass: break;
3314 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3315 #define ABSTRACT_STMT(Stmt)
3316 #define EXPR(Node, Parent)                                              \
3317     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3318 #include "clang/AST/StmtNodes.inc"
3319   }
3320 
3321   return E;
3322 }
3323 
3324 template<typename Derived>
3325 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3326                                                         bool NotCopyInit) {
3327   // Initializers are instantiated like expressions, except that various outer
3328   // layers are stripped.
3329   if (!Init)
3330     return Init;
3331 
3332   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
3333     Init = ExprTemp->getSubExpr();
3334 
3335   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3336     Init = AIL->getCommonExpr();
3337 
3338   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3339     Init = MTE->GetTemporaryExpr();
3340 
3341   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3342     Init = Binder->getSubExpr();
3343 
3344   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3345     Init = ICE->getSubExprAsWritten();
3346 
3347   if (CXXStdInitializerListExpr *ILE =
3348           dyn_cast<CXXStdInitializerListExpr>(Init))
3349     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3350 
3351   // If this is copy-initialization, we only need to reconstruct
3352   // InitListExprs. Other forms of copy-initialization will be a no-op if
3353   // the initializer is already the right type.
3354   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3355   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3356     return getDerived().TransformExpr(Init);
3357 
3358   // Revert value-initialization back to empty parens.
3359   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3360     SourceRange Parens = VIE->getSourceRange();
3361     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3362                                              Parens.getEnd());
3363   }
3364 
3365   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3366   if (isa<ImplicitValueInitExpr>(Init))
3367     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3368                                              SourceLocation());
3369 
3370   // Revert initialization by constructor back to a parenthesized or braced list
3371   // of expressions. Any other form of initializer can just be reused directly.
3372   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3373     return getDerived().TransformExpr(Init);
3374 
3375   // If the initialization implicitly converted an initializer list to a
3376   // std::initializer_list object, unwrap the std::initializer_list too.
3377   if (Construct && Construct->isStdInitListInitialization())
3378     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3379 
3380   SmallVector<Expr*, 8> NewArgs;
3381   bool ArgChanged = false;
3382   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3383                                   /*IsCall*/true, NewArgs, &ArgChanged))
3384     return ExprError();
3385 
3386   // If this was list initialization, revert to syntactic list form.
3387   if (Construct->isListInitialization())
3388     return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs,
3389                                         Construct->getLocEnd());
3390 
3391   // Build a ParenListExpr to represent anything else.
3392   SourceRange Parens = Construct->getParenOrBraceRange();
3393   if (Parens.isInvalid()) {
3394     // This was a variable declaration's initialization for which no initializer
3395     // was specified.
3396     assert(NewArgs.empty() &&
3397            "no parens or braces but have direct init with arguments?");
3398     return ExprEmpty();
3399   }
3400   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3401                                            Parens.getEnd());
3402 }
3403 
3404 template<typename Derived>
3405 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3406                                             unsigned NumInputs,
3407                                             bool IsCall,
3408                                       SmallVectorImpl<Expr *> &Outputs,
3409                                             bool *ArgChanged) {
3410   for (unsigned I = 0; I != NumInputs; ++I) {
3411     // If requested, drop call arguments that need to be dropped.
3412     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3413       if (ArgChanged)
3414         *ArgChanged = true;
3415 
3416       break;
3417     }
3418 
3419     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3420       Expr *Pattern = Expansion->getPattern();
3421 
3422       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3423       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3424       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3425 
3426       // Determine whether the set of unexpanded parameter packs can and should
3427       // be expanded.
3428       bool Expand = true;
3429       bool RetainExpansion = false;
3430       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3431       Optional<unsigned> NumExpansions = OrigNumExpansions;
3432       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3433                                                Pattern->getSourceRange(),
3434                                                Unexpanded,
3435                                                Expand, RetainExpansion,
3436                                                NumExpansions))
3437         return true;
3438 
3439       if (!Expand) {
3440         // The transform has determined that we should perform a simple
3441         // transformation on the pack expansion, producing another pack
3442         // expansion.
3443         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3444         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3445         if (OutPattern.isInvalid())
3446           return true;
3447 
3448         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3449                                                 Expansion->getEllipsisLoc(),
3450                                                            NumExpansions);
3451         if (Out.isInvalid())
3452           return true;
3453 
3454         if (ArgChanged)
3455           *ArgChanged = true;
3456         Outputs.push_back(Out.get());
3457         continue;
3458       }
3459 
3460       // Record right away that the argument was changed.  This needs
3461       // to happen even if the array expands to nothing.
3462       if (ArgChanged) *ArgChanged = true;
3463 
3464       // The transform has determined that we should perform an elementwise
3465       // expansion of the pattern. Do so.
3466       for (unsigned I = 0; I != *NumExpansions; ++I) {
3467         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3468         ExprResult Out = getDerived().TransformExpr(Pattern);
3469         if (Out.isInvalid())
3470           return true;
3471 
3472         if (Out.get()->containsUnexpandedParameterPack()) {
3473           Out = getDerived().RebuildPackExpansion(
3474               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3475           if (Out.isInvalid())
3476             return true;
3477         }
3478 
3479         Outputs.push_back(Out.get());
3480       }
3481 
3482       // If we're supposed to retain a pack expansion, do so by temporarily
3483       // forgetting the partially-substituted parameter pack.
3484       if (RetainExpansion) {
3485         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3486 
3487         ExprResult Out = getDerived().TransformExpr(Pattern);
3488         if (Out.isInvalid())
3489           return true;
3490 
3491         Out = getDerived().RebuildPackExpansion(
3492             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3493         if (Out.isInvalid())
3494           return true;
3495 
3496         Outputs.push_back(Out.get());
3497       }
3498 
3499       continue;
3500     }
3501 
3502     ExprResult Result =
3503       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3504              : getDerived().TransformExpr(Inputs[I]);
3505     if (Result.isInvalid())
3506       return true;
3507 
3508     if (Result.get() != Inputs[I] && ArgChanged)
3509       *ArgChanged = true;
3510 
3511     Outputs.push_back(Result.get());
3512   }
3513 
3514   return false;
3515 }
3516 
3517 template <typename Derived>
3518 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3519     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3520   if (Var) {
3521     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3522         getDerived().TransformDefinition(Var->getLocation(), Var));
3523 
3524     if (!ConditionVar)
3525       return Sema::ConditionError();
3526 
3527     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3528   }
3529 
3530   if (Expr) {
3531     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3532 
3533     if (CondExpr.isInvalid())
3534       return Sema::ConditionError();
3535 
3536     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3537   }
3538 
3539   return Sema::ConditionResult();
3540 }
3541 
3542 template<typename Derived>
3543 NestedNameSpecifierLoc
3544 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3545                                                     NestedNameSpecifierLoc NNS,
3546                                                      QualType ObjectType,
3547                                              NamedDecl *FirstQualifierInScope) {
3548   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3549   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3550        Qualifier = Qualifier.getPrefix())
3551     Qualifiers.push_back(Qualifier);
3552 
3553   CXXScopeSpec SS;
3554   while (!Qualifiers.empty()) {
3555     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3556     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3557 
3558     switch (QNNS->getKind()) {
3559     case NestedNameSpecifier::Identifier: {
3560       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3561                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3562       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3563                                               SS, FirstQualifierInScope, false))
3564         return NestedNameSpecifierLoc();
3565     }
3566       break;
3567 
3568     case NestedNameSpecifier::Namespace: {
3569       NamespaceDecl *NS
3570         = cast_or_null<NamespaceDecl>(
3571                                     getDerived().TransformDecl(
3572                                                           Q.getLocalBeginLoc(),
3573                                                        QNNS->getAsNamespace()));
3574       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3575       break;
3576     }
3577 
3578     case NestedNameSpecifier::NamespaceAlias: {
3579       NamespaceAliasDecl *Alias
3580         = cast_or_null<NamespaceAliasDecl>(
3581                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3582                                                  QNNS->getAsNamespaceAlias()));
3583       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3584                 Q.getLocalEndLoc());
3585       break;
3586     }
3587 
3588     case NestedNameSpecifier::Global:
3589       // There is no meaningful transformation that one could perform on the
3590       // global scope.
3591       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3592       break;
3593 
3594     case NestedNameSpecifier::Super: {
3595       CXXRecordDecl *RD =
3596           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3597               SourceLocation(), QNNS->getAsRecordDecl()));
3598       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3599       break;
3600     }
3601 
3602     case NestedNameSpecifier::TypeSpecWithTemplate:
3603     case NestedNameSpecifier::TypeSpec: {
3604       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3605                                               FirstQualifierInScope, SS);
3606 
3607       if (!TL)
3608         return NestedNameSpecifierLoc();
3609 
3610       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3611           (SemaRef.getLangOpts().CPlusPlus11 &&
3612            TL.getType()->isEnumeralType())) {
3613         assert(!TL.getType().hasLocalQualifiers() &&
3614                "Can't get cv-qualifiers here");
3615         if (TL.getType()->isEnumeralType())
3616           SemaRef.Diag(TL.getBeginLoc(),
3617                        diag::warn_cxx98_compat_enum_nested_name_spec);
3618         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3619                   Q.getLocalEndLoc());
3620         break;
3621       }
3622       // If the nested-name-specifier is an invalid type def, don't emit an
3623       // error because a previous error should have already been emitted.
3624       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3625       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3626         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3627           << TL.getType() << SS.getRange();
3628       }
3629       return NestedNameSpecifierLoc();
3630     }
3631     }
3632 
3633     // The qualifier-in-scope and object type only apply to the leftmost entity.
3634     FirstQualifierInScope = nullptr;
3635     ObjectType = QualType();
3636   }
3637 
3638   // Don't rebuild the nested-name-specifier if we don't have to.
3639   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3640       !getDerived().AlwaysRebuild())
3641     return NNS;
3642 
3643   // If we can re-use the source-location data from the original
3644   // nested-name-specifier, do so.
3645   if (SS.location_size() == NNS.getDataLength() &&
3646       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3647     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3648 
3649   // Allocate new nested-name-specifier location information.
3650   return SS.getWithLocInContext(SemaRef.Context);
3651 }
3652 
3653 template<typename Derived>
3654 DeclarationNameInfo
3655 TreeTransform<Derived>
3656 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3657   DeclarationName Name = NameInfo.getName();
3658   if (!Name)
3659     return DeclarationNameInfo();
3660 
3661   switch (Name.getNameKind()) {
3662   case DeclarationName::Identifier:
3663   case DeclarationName::ObjCZeroArgSelector:
3664   case DeclarationName::ObjCOneArgSelector:
3665   case DeclarationName::ObjCMultiArgSelector:
3666   case DeclarationName::CXXOperatorName:
3667   case DeclarationName::CXXLiteralOperatorName:
3668   case DeclarationName::CXXUsingDirective:
3669     return NameInfo;
3670 
3671   case DeclarationName::CXXDeductionGuideName: {
3672     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3673     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3674         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3675     if (!NewTemplate)
3676       return DeclarationNameInfo();
3677 
3678     DeclarationNameInfo NewNameInfo(NameInfo);
3679     NewNameInfo.setName(
3680         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3681     return NewNameInfo;
3682   }
3683 
3684   case DeclarationName::CXXConstructorName:
3685   case DeclarationName::CXXDestructorName:
3686   case DeclarationName::CXXConversionFunctionName: {
3687     TypeSourceInfo *NewTInfo;
3688     CanQualType NewCanTy;
3689     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3690       NewTInfo = getDerived().TransformType(OldTInfo);
3691       if (!NewTInfo)
3692         return DeclarationNameInfo();
3693       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3694     }
3695     else {
3696       NewTInfo = nullptr;
3697       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3698       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3699       if (NewT.isNull())
3700         return DeclarationNameInfo();
3701       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3702     }
3703 
3704     DeclarationName NewName
3705       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3706                                                            NewCanTy);
3707     DeclarationNameInfo NewNameInfo(NameInfo);
3708     NewNameInfo.setName(NewName);
3709     NewNameInfo.setNamedTypeInfo(NewTInfo);
3710     return NewNameInfo;
3711   }
3712   }
3713 
3714   llvm_unreachable("Unknown name kind.");
3715 }
3716 
3717 template<typename Derived>
3718 TemplateName
3719 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3720                                               TemplateName Name,
3721                                               SourceLocation NameLoc,
3722                                               QualType ObjectType,
3723                                               NamedDecl *FirstQualifierInScope,
3724                                               bool AllowInjectedClassName) {
3725   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3726     TemplateDecl *Template = QTN->getTemplateDecl();
3727     assert(Template && "qualified template name must refer to a template");
3728 
3729     TemplateDecl *TransTemplate
3730       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3731                                                               Template));
3732     if (!TransTemplate)
3733       return TemplateName();
3734 
3735     if (!getDerived().AlwaysRebuild() &&
3736         SS.getScopeRep() == QTN->getQualifier() &&
3737         TransTemplate == Template)
3738       return Name;
3739 
3740     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3741                                             TransTemplate);
3742   }
3743 
3744   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3745     if (SS.getScopeRep()) {
3746       // These apply to the scope specifier, not the template.
3747       ObjectType = QualType();
3748       FirstQualifierInScope = nullptr;
3749     }
3750 
3751     if (!getDerived().AlwaysRebuild() &&
3752         SS.getScopeRep() == DTN->getQualifier() &&
3753         ObjectType.isNull())
3754       return Name;
3755 
3756     if (DTN->isIdentifier()) {
3757       return getDerived().RebuildTemplateName(SS,
3758                                               *DTN->getIdentifier(),
3759                                               NameLoc,
3760                                               ObjectType,
3761                                               FirstQualifierInScope,
3762                                               AllowInjectedClassName);
3763     }
3764 
3765     return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc,
3766                                             ObjectType, AllowInjectedClassName);
3767   }
3768 
3769   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3770     TemplateDecl *TransTemplate
3771       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3772                                                               Template));
3773     if (!TransTemplate)
3774       return TemplateName();
3775 
3776     if (!getDerived().AlwaysRebuild() &&
3777         TransTemplate == Template)
3778       return Name;
3779 
3780     return TemplateName(TransTemplate);
3781   }
3782 
3783   if (SubstTemplateTemplateParmPackStorage *SubstPack
3784       = Name.getAsSubstTemplateTemplateParmPack()) {
3785     TemplateTemplateParmDecl *TransParam
3786     = cast_or_null<TemplateTemplateParmDecl>(
3787             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3788     if (!TransParam)
3789       return TemplateName();
3790 
3791     if (!getDerived().AlwaysRebuild() &&
3792         TransParam == SubstPack->getParameterPack())
3793       return Name;
3794 
3795     return getDerived().RebuildTemplateName(TransParam,
3796                                             SubstPack->getArgumentPack());
3797   }
3798 
3799   // These should be getting filtered out before they reach the AST.
3800   llvm_unreachable("overloaded function decl survived to here");
3801 }
3802 
3803 template<typename Derived>
3804 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3805                                          const TemplateArgument &Arg,
3806                                          TemplateArgumentLoc &Output) {
3807   SourceLocation Loc = getDerived().getBaseLocation();
3808   switch (Arg.getKind()) {
3809   case TemplateArgument::Null:
3810     llvm_unreachable("null template argument in TreeTransform");
3811     break;
3812 
3813   case TemplateArgument::Type:
3814     Output = TemplateArgumentLoc(Arg,
3815                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3816 
3817     break;
3818 
3819   case TemplateArgument::Template:
3820   case TemplateArgument::TemplateExpansion: {
3821     NestedNameSpecifierLocBuilder Builder;
3822     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3823     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3824       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3825     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3826       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3827 
3828     if (Arg.getKind() == TemplateArgument::Template)
3829       Output = TemplateArgumentLoc(Arg,
3830                                    Builder.getWithLocInContext(SemaRef.Context),
3831                                    Loc);
3832     else
3833       Output = TemplateArgumentLoc(Arg,
3834                                    Builder.getWithLocInContext(SemaRef.Context),
3835                                    Loc, Loc);
3836 
3837     break;
3838   }
3839 
3840   case TemplateArgument::Expression:
3841     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3842     break;
3843 
3844   case TemplateArgument::Declaration:
3845   case TemplateArgument::Integral:
3846   case TemplateArgument::Pack:
3847   case TemplateArgument::NullPtr:
3848     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3849     break;
3850   }
3851 }
3852 
3853 template<typename Derived>
3854 bool TreeTransform<Derived>::TransformTemplateArgument(
3855                                          const TemplateArgumentLoc &Input,
3856                                          TemplateArgumentLoc &Output, bool Uneval) {
3857   const TemplateArgument &Arg = Input.getArgument();
3858   switch (Arg.getKind()) {
3859   case TemplateArgument::Null:
3860   case TemplateArgument::Integral:
3861   case TemplateArgument::Pack:
3862   case TemplateArgument::Declaration:
3863   case TemplateArgument::NullPtr:
3864     llvm_unreachable("Unexpected TemplateArgument");
3865 
3866   case TemplateArgument::Type: {
3867     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3868     if (!DI)
3869       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3870 
3871     DI = getDerived().TransformType(DI);
3872     if (!DI) return true;
3873 
3874     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3875     return false;
3876   }
3877 
3878   case TemplateArgument::Template: {
3879     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3880     if (QualifierLoc) {
3881       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3882       if (!QualifierLoc)
3883         return true;
3884     }
3885 
3886     CXXScopeSpec SS;
3887     SS.Adopt(QualifierLoc);
3888     TemplateName Template
3889       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3890                                            Input.getTemplateNameLoc());
3891     if (Template.isNull())
3892       return true;
3893 
3894     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3895                                  Input.getTemplateNameLoc());
3896     return false;
3897   }
3898 
3899   case TemplateArgument::TemplateExpansion:
3900     llvm_unreachable("Caller should expand pack expansions");
3901 
3902   case TemplateArgument::Expression: {
3903     // Template argument expressions are constant expressions.
3904     EnterExpressionEvaluationContext Unevaluated(
3905         getSema(), Uneval
3906                        ? Sema::ExpressionEvaluationContext::Unevaluated
3907                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3908 
3909     Expr *InputExpr = Input.getSourceExpression();
3910     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3911 
3912     ExprResult E = getDerived().TransformExpr(InputExpr);
3913     E = SemaRef.ActOnConstantExpression(E);
3914     if (E.isInvalid()) return true;
3915     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3916     return false;
3917   }
3918   }
3919 
3920   // Work around bogus GCC warning
3921   return true;
3922 }
3923 
3924 /// \brief Iterator adaptor that invents template argument location information
3925 /// for each of the template arguments in its underlying iterator.
3926 template<typename Derived, typename InputIterator>
3927 class TemplateArgumentLocInventIterator {
3928   TreeTransform<Derived> &Self;
3929   InputIterator Iter;
3930 
3931 public:
3932   typedef TemplateArgumentLoc value_type;
3933   typedef TemplateArgumentLoc reference;
3934   typedef typename std::iterator_traits<InputIterator>::difference_type
3935     difference_type;
3936   typedef std::input_iterator_tag iterator_category;
3937 
3938   class pointer {
3939     TemplateArgumentLoc Arg;
3940 
3941   public:
3942     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3943 
3944     const TemplateArgumentLoc *operator->() const { return &Arg; }
3945   };
3946 
3947   TemplateArgumentLocInventIterator() { }
3948 
3949   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3950                                              InputIterator Iter)
3951     : Self(Self), Iter(Iter) { }
3952 
3953   TemplateArgumentLocInventIterator &operator++() {
3954     ++Iter;
3955     return *this;
3956   }
3957 
3958   TemplateArgumentLocInventIterator operator++(int) {
3959     TemplateArgumentLocInventIterator Old(*this);
3960     ++(*this);
3961     return Old;
3962   }
3963 
3964   reference operator*() const {
3965     TemplateArgumentLoc Result;
3966     Self.InventTemplateArgumentLoc(*Iter, Result);
3967     return Result;
3968   }
3969 
3970   pointer operator->() const { return pointer(**this); }
3971 
3972   friend bool operator==(const TemplateArgumentLocInventIterator &X,
3973                          const TemplateArgumentLocInventIterator &Y) {
3974     return X.Iter == Y.Iter;
3975   }
3976 
3977   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
3978                          const TemplateArgumentLocInventIterator &Y) {
3979     return X.Iter != Y.Iter;
3980   }
3981 };
3982 
3983 template<typename Derived>
3984 template<typename InputIterator>
3985 bool TreeTransform<Derived>::TransformTemplateArguments(
3986     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
3987     bool Uneval) {
3988   for (; First != Last; ++First) {
3989     TemplateArgumentLoc Out;
3990     TemplateArgumentLoc In = *First;
3991 
3992     if (In.getArgument().getKind() == TemplateArgument::Pack) {
3993       // Unpack argument packs, which we translate them into separate
3994       // arguments.
3995       // FIXME: We could do much better if we could guarantee that the
3996       // TemplateArgumentLocInfo for the pack expansion would be usable for
3997       // all of the template arguments in the argument pack.
3998       typedef TemplateArgumentLocInventIterator<Derived,
3999                                                 TemplateArgument::pack_iterator>
4000         PackLocIterator;
4001       if (TransformTemplateArguments(PackLocIterator(*this,
4002                                                  In.getArgument().pack_begin()),
4003                                      PackLocIterator(*this,
4004                                                    In.getArgument().pack_end()),
4005                                      Outputs, Uneval))
4006         return true;
4007 
4008       continue;
4009     }
4010 
4011     if (In.getArgument().isPackExpansion()) {
4012       // We have a pack expansion, for which we will be substituting into
4013       // the pattern.
4014       SourceLocation Ellipsis;
4015       Optional<unsigned> OrigNumExpansions;
4016       TemplateArgumentLoc Pattern
4017         = getSema().getTemplateArgumentPackExpansionPattern(
4018               In, Ellipsis, OrigNumExpansions);
4019 
4020       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4021       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4022       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4023 
4024       // Determine whether the set of unexpanded parameter packs can and should
4025       // be expanded.
4026       bool Expand = true;
4027       bool RetainExpansion = false;
4028       Optional<unsigned> NumExpansions = OrigNumExpansions;
4029       if (getDerived().TryExpandParameterPacks(Ellipsis,
4030                                                Pattern.getSourceRange(),
4031                                                Unexpanded,
4032                                                Expand,
4033                                                RetainExpansion,
4034                                                NumExpansions))
4035         return true;
4036 
4037       if (!Expand) {
4038         // The transform has determined that we should perform a simple
4039         // transformation on the pack expansion, producing another pack
4040         // expansion.
4041         TemplateArgumentLoc OutPattern;
4042         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4043         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4044           return true;
4045 
4046         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4047                                                 NumExpansions);
4048         if (Out.getArgument().isNull())
4049           return true;
4050 
4051         Outputs.addArgument(Out);
4052         continue;
4053       }
4054 
4055       // The transform has determined that we should perform an elementwise
4056       // expansion of the pattern. Do so.
4057       for (unsigned I = 0; I != *NumExpansions; ++I) {
4058         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4059 
4060         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4061           return true;
4062 
4063         if (Out.getArgument().containsUnexpandedParameterPack()) {
4064           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4065                                                   OrigNumExpansions);
4066           if (Out.getArgument().isNull())
4067             return true;
4068         }
4069 
4070         Outputs.addArgument(Out);
4071       }
4072 
4073       // If we're supposed to retain a pack expansion, do so by temporarily
4074       // forgetting the partially-substituted parameter pack.
4075       if (RetainExpansion) {
4076         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4077 
4078         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4079           return true;
4080 
4081         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4082                                                 OrigNumExpansions);
4083         if (Out.getArgument().isNull())
4084           return true;
4085 
4086         Outputs.addArgument(Out);
4087       }
4088 
4089       continue;
4090     }
4091 
4092     // The simple case:
4093     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4094       return true;
4095 
4096     Outputs.addArgument(Out);
4097   }
4098 
4099   return false;
4100 
4101 }
4102 
4103 //===----------------------------------------------------------------------===//
4104 // Type transformation
4105 //===----------------------------------------------------------------------===//
4106 
4107 template<typename Derived>
4108 QualType TreeTransform<Derived>::TransformType(QualType T) {
4109   if (getDerived().AlreadyTransformed(T))
4110     return T;
4111 
4112   // Temporary workaround.  All of these transformations should
4113   // eventually turn into transformations on TypeLocs.
4114   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4115                                                 getDerived().getBaseLocation());
4116 
4117   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4118 
4119   if (!NewDI)
4120     return QualType();
4121 
4122   return NewDI->getType();
4123 }
4124 
4125 template<typename Derived>
4126 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4127   // Refine the base location to the type's location.
4128   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4129                        getDerived().getBaseEntity());
4130   if (getDerived().AlreadyTransformed(DI->getType()))
4131     return DI;
4132 
4133   TypeLocBuilder TLB;
4134 
4135   TypeLoc TL = DI->getTypeLoc();
4136   TLB.reserve(TL.getFullDataSize());
4137 
4138   QualType Result = getDerived().TransformType(TLB, TL);
4139   if (Result.isNull())
4140     return nullptr;
4141 
4142   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4143 }
4144 
4145 template<typename Derived>
4146 QualType
4147 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4148   switch (T.getTypeLocClass()) {
4149 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4150 #define TYPELOC(CLASS, PARENT)                                                 \
4151   case TypeLoc::CLASS:                                                         \
4152     return getDerived().Transform##CLASS##Type(TLB,                            \
4153                                                T.castAs<CLASS##TypeLoc>());
4154 #include "clang/AST/TypeLocNodes.def"
4155   }
4156 
4157   llvm_unreachable("unhandled type loc!");
4158 }
4159 
4160 template<typename Derived>
4161 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4162   if (!isa<DependentNameType>(T))
4163     return TransformType(T);
4164 
4165   if (getDerived().AlreadyTransformed(T))
4166     return T;
4167   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4168                                                 getDerived().getBaseLocation());
4169   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4170   return NewDI ? NewDI->getType() : QualType();
4171 }
4172 
4173 template<typename Derived>
4174 TypeSourceInfo *
4175 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4176   if (!isa<DependentNameType>(DI->getType()))
4177     return TransformType(DI);
4178 
4179   // Refine the base location to the type's location.
4180   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4181                        getDerived().getBaseEntity());
4182   if (getDerived().AlreadyTransformed(DI->getType()))
4183     return DI;
4184 
4185   TypeLocBuilder TLB;
4186 
4187   TypeLoc TL = DI->getTypeLoc();
4188   TLB.reserve(TL.getFullDataSize());
4189 
4190   auto QTL = TL.getAs<QualifiedTypeLoc>();
4191   if (QTL)
4192     TL = QTL.getUnqualifiedLoc();
4193 
4194   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4195 
4196   QualType Result = getDerived().TransformDependentNameType(
4197       TLB, DNTL, /*DeducedTSTContext*/true);
4198   if (Result.isNull())
4199     return nullptr;
4200 
4201   if (QTL) {
4202     Result = getDerived().RebuildQualifiedType(
4203         Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers());
4204     TLB.TypeWasModifiedSafely(Result);
4205   }
4206 
4207   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4208 }
4209 
4210 template<typename Derived>
4211 QualType
4212 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4213                                                QualifiedTypeLoc T) {
4214   Qualifiers Quals = T.getType().getLocalQualifiers();
4215 
4216   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4217   if (Result.isNull())
4218     return QualType();
4219 
4220   Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals);
4221 
4222   // RebuildQualifiedType might have updated the type, but not in a way
4223   // that invalidates the TypeLoc. (There's no location information for
4224   // qualifiers.)
4225   TLB.TypeWasModifiedSafely(Result);
4226 
4227   return Result;
4228 }
4229 
4230 template<typename Derived>
4231 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4232                                                       SourceLocation Loc,
4233                                                       Qualifiers Quals) {
4234   // C++ [dcl.fct]p7:
4235   //   [When] adding cv-qualifications on top of the function type [...] the
4236   //   cv-qualifiers are ignored.
4237   // C++ [dcl.ref]p1:
4238   //   when the cv-qualifiers are introduced through the use of a typedef-name
4239   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4240   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4241   // applied to a reference type.
4242   // FIXME: This removes all qualifiers, not just cv-qualifiers!
4243   if (T->isFunctionType() || T->isReferenceType())
4244     return T;
4245 
4246   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4247   // resulting type.
4248   if (Quals.hasObjCLifetime()) {
4249     if (!T->isObjCLifetimeType() && !T->isDependentType())
4250       Quals.removeObjCLifetime();
4251     else if (T.getObjCLifetime()) {
4252       // Objective-C ARC:
4253       //   A lifetime qualifier applied to a substituted template parameter
4254       //   overrides the lifetime qualifier from the template argument.
4255       const AutoType *AutoTy;
4256       if (const SubstTemplateTypeParmType *SubstTypeParam
4257                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4258         QualType Replacement = SubstTypeParam->getReplacementType();
4259         Qualifiers Qs = Replacement.getQualifiers();
4260         Qs.removeObjCLifetime();
4261         Replacement = SemaRef.Context.getQualifiedType(
4262             Replacement.getUnqualifiedType(), Qs);
4263         T = SemaRef.Context.getSubstTemplateTypeParmType(
4264             SubstTypeParam->getReplacedParameter(), Replacement);
4265       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4266         // 'auto' types behave the same way as template parameters.
4267         QualType Deduced = AutoTy->getDeducedType();
4268         Qualifiers Qs = Deduced.getQualifiers();
4269         Qs.removeObjCLifetime();
4270         Deduced =
4271             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4272         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4273                                         AutoTy->isDependentType());
4274       } else {
4275         // Otherwise, complain about the addition of a qualifier to an
4276         // already-qualified type.
4277         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4278         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4279         Quals.removeObjCLifetime();
4280       }
4281     }
4282   }
4283 
4284   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4285 }
4286 
4287 template<typename Derived>
4288 TypeLoc
4289 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4290                                                    QualType ObjectType,
4291                                                    NamedDecl *UnqualLookup,
4292                                                    CXXScopeSpec &SS) {
4293   if (getDerived().AlreadyTransformed(TL.getType()))
4294     return TL;
4295 
4296   TypeSourceInfo *TSI =
4297       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4298   if (TSI)
4299     return TSI->getTypeLoc();
4300   return TypeLoc();
4301 }
4302 
4303 template<typename Derived>
4304 TypeSourceInfo *
4305 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4306                                                    QualType ObjectType,
4307                                                    NamedDecl *UnqualLookup,
4308                                                    CXXScopeSpec &SS) {
4309   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4310     return TSInfo;
4311 
4312   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4313                                    UnqualLookup, SS);
4314 }
4315 
4316 template <typename Derived>
4317 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4318     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4319     CXXScopeSpec &SS) {
4320   QualType T = TL.getType();
4321   assert(!getDerived().AlreadyTransformed(T));
4322 
4323   TypeLocBuilder TLB;
4324   QualType Result;
4325 
4326   if (isa<TemplateSpecializationType>(T)) {
4327     TemplateSpecializationTypeLoc SpecTL =
4328         TL.castAs<TemplateSpecializationTypeLoc>();
4329 
4330     TemplateName Template = getDerived().TransformTemplateName(
4331         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4332         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4333     if (Template.isNull())
4334       return nullptr;
4335 
4336     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4337                                                               Template);
4338   } else if (isa<DependentTemplateSpecializationType>(T)) {
4339     DependentTemplateSpecializationTypeLoc SpecTL =
4340         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4341 
4342     TemplateName Template
4343       = getDerived().RebuildTemplateName(SS,
4344                                          *SpecTL.getTypePtr()->getIdentifier(),
4345                                          SpecTL.getTemplateNameLoc(),
4346                                          ObjectType, UnqualLookup,
4347                                          /*AllowInjectedClassName*/true);
4348     if (Template.isNull())
4349       return nullptr;
4350 
4351     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4352                                                                        SpecTL,
4353                                                                        Template,
4354                                                                        SS);
4355   } else {
4356     // Nothing special needs to be done for these.
4357     Result = getDerived().TransformType(TLB, TL);
4358   }
4359 
4360   if (Result.isNull())
4361     return nullptr;
4362 
4363   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4364 }
4365 
4366 template <class TyLoc> static inline
4367 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4368   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4369   NewT.setNameLoc(T.getNameLoc());
4370   return T.getType();
4371 }
4372 
4373 template<typename Derived>
4374 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4375                                                       BuiltinTypeLoc T) {
4376   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4377   NewT.setBuiltinLoc(T.getBuiltinLoc());
4378   if (T.needsExtraLocalData())
4379     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4380   return T.getType();
4381 }
4382 
4383 template<typename Derived>
4384 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4385                                                       ComplexTypeLoc T) {
4386   // FIXME: recurse?
4387   return TransformTypeSpecType(TLB, T);
4388 }
4389 
4390 template <typename Derived>
4391 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4392                                                        AdjustedTypeLoc TL) {
4393   // Adjustments applied during transformation are handled elsewhere.
4394   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4395 }
4396 
4397 template<typename Derived>
4398 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4399                                                       DecayedTypeLoc TL) {
4400   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4401   if (OriginalType.isNull())
4402     return QualType();
4403 
4404   QualType Result = TL.getType();
4405   if (getDerived().AlwaysRebuild() ||
4406       OriginalType != TL.getOriginalLoc().getType())
4407     Result = SemaRef.Context.getDecayedType(OriginalType);
4408   TLB.push<DecayedTypeLoc>(Result);
4409   // Nothing to set for DecayedTypeLoc.
4410   return Result;
4411 }
4412 
4413 template<typename Derived>
4414 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4415                                                       PointerTypeLoc TL) {
4416   QualType PointeeType
4417     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4418   if (PointeeType.isNull())
4419     return QualType();
4420 
4421   QualType Result = TL.getType();
4422   if (PointeeType->getAs<ObjCObjectType>()) {
4423     // A dependent pointer type 'T *' has is being transformed such
4424     // that an Objective-C class type is being replaced for 'T'. The
4425     // resulting pointer type is an ObjCObjectPointerType, not a
4426     // PointerType.
4427     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4428 
4429     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4430     NewT.setStarLoc(TL.getStarLoc());
4431     return Result;
4432   }
4433 
4434   if (getDerived().AlwaysRebuild() ||
4435       PointeeType != TL.getPointeeLoc().getType()) {
4436     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4437     if (Result.isNull())
4438       return QualType();
4439   }
4440 
4441   // Objective-C ARC can add lifetime qualifiers to the type that we're
4442   // pointing to.
4443   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4444 
4445   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4446   NewT.setSigilLoc(TL.getSigilLoc());
4447   return Result;
4448 }
4449 
4450 template<typename Derived>
4451 QualType
4452 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4453                                                   BlockPointerTypeLoc TL) {
4454   QualType PointeeType
4455     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4456   if (PointeeType.isNull())
4457     return QualType();
4458 
4459   QualType Result = TL.getType();
4460   if (getDerived().AlwaysRebuild() ||
4461       PointeeType != TL.getPointeeLoc().getType()) {
4462     Result = getDerived().RebuildBlockPointerType(PointeeType,
4463                                                   TL.getSigilLoc());
4464     if (Result.isNull())
4465       return QualType();
4466   }
4467 
4468   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4469   NewT.setSigilLoc(TL.getSigilLoc());
4470   return Result;
4471 }
4472 
4473 /// Transforms a reference type.  Note that somewhat paradoxically we
4474 /// don't care whether the type itself is an l-value type or an r-value
4475 /// type;  we only care if the type was *written* as an l-value type
4476 /// or an r-value type.
4477 template<typename Derived>
4478 QualType
4479 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4480                                                ReferenceTypeLoc TL) {
4481   const ReferenceType *T = TL.getTypePtr();
4482 
4483   // Note that this works with the pointee-as-written.
4484   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4485   if (PointeeType.isNull())
4486     return QualType();
4487 
4488   QualType Result = TL.getType();
4489   if (getDerived().AlwaysRebuild() ||
4490       PointeeType != T->getPointeeTypeAsWritten()) {
4491     Result = getDerived().RebuildReferenceType(PointeeType,
4492                                                T->isSpelledAsLValue(),
4493                                                TL.getSigilLoc());
4494     if (Result.isNull())
4495       return QualType();
4496   }
4497 
4498   // Objective-C ARC can add lifetime qualifiers to the type that we're
4499   // referring to.
4500   TLB.TypeWasModifiedSafely(
4501                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4502 
4503   // r-value references can be rebuilt as l-value references.
4504   ReferenceTypeLoc NewTL;
4505   if (isa<LValueReferenceType>(Result))
4506     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4507   else
4508     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4509   NewTL.setSigilLoc(TL.getSigilLoc());
4510 
4511   return Result;
4512 }
4513 
4514 template<typename Derived>
4515 QualType
4516 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4517                                                  LValueReferenceTypeLoc TL) {
4518   return TransformReferenceType(TLB, TL);
4519 }
4520 
4521 template<typename Derived>
4522 QualType
4523 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4524                                                  RValueReferenceTypeLoc TL) {
4525   return TransformReferenceType(TLB, TL);
4526 }
4527 
4528 template<typename Derived>
4529 QualType
4530 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4531                                                    MemberPointerTypeLoc TL) {
4532   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4533   if (PointeeType.isNull())
4534     return QualType();
4535 
4536   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4537   TypeSourceInfo *NewClsTInfo = nullptr;
4538   if (OldClsTInfo) {
4539     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4540     if (!NewClsTInfo)
4541       return QualType();
4542   }
4543 
4544   const MemberPointerType *T = TL.getTypePtr();
4545   QualType OldClsType = QualType(T->getClass(), 0);
4546   QualType NewClsType;
4547   if (NewClsTInfo)
4548     NewClsType = NewClsTInfo->getType();
4549   else {
4550     NewClsType = getDerived().TransformType(OldClsType);
4551     if (NewClsType.isNull())
4552       return QualType();
4553   }
4554 
4555   QualType Result = TL.getType();
4556   if (getDerived().AlwaysRebuild() ||
4557       PointeeType != T->getPointeeType() ||
4558       NewClsType != OldClsType) {
4559     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4560                                                    TL.getStarLoc());
4561     if (Result.isNull())
4562       return QualType();
4563   }
4564 
4565   // If we had to adjust the pointee type when building a member pointer, make
4566   // sure to push TypeLoc info for it.
4567   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4568   if (MPT && PointeeType != MPT->getPointeeType()) {
4569     assert(isa<AdjustedType>(MPT->getPointeeType()));
4570     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4571   }
4572 
4573   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4574   NewTL.setSigilLoc(TL.getSigilLoc());
4575   NewTL.setClassTInfo(NewClsTInfo);
4576 
4577   return Result;
4578 }
4579 
4580 template<typename Derived>
4581 QualType
4582 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4583                                                    ConstantArrayTypeLoc TL) {
4584   const ConstantArrayType *T = TL.getTypePtr();
4585   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4586   if (ElementType.isNull())
4587     return QualType();
4588 
4589   QualType Result = TL.getType();
4590   if (getDerived().AlwaysRebuild() ||
4591       ElementType != T->getElementType()) {
4592     Result = getDerived().RebuildConstantArrayType(ElementType,
4593                                                    T->getSizeModifier(),
4594                                                    T->getSize(),
4595                                              T->getIndexTypeCVRQualifiers(),
4596                                                    TL.getBracketsRange());
4597     if (Result.isNull())
4598       return QualType();
4599   }
4600 
4601   // We might have either a ConstantArrayType or a VariableArrayType now:
4602   // a ConstantArrayType is allowed to have an element type which is a
4603   // VariableArrayType if the type is dependent.  Fortunately, all array
4604   // types have the same location layout.
4605   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4606   NewTL.setLBracketLoc(TL.getLBracketLoc());
4607   NewTL.setRBracketLoc(TL.getRBracketLoc());
4608 
4609   Expr *Size = TL.getSizeExpr();
4610   if (Size) {
4611     EnterExpressionEvaluationContext Unevaluated(
4612         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4613     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4614     Size = SemaRef.ActOnConstantExpression(Size).get();
4615   }
4616   NewTL.setSizeExpr(Size);
4617 
4618   return Result;
4619 }
4620 
4621 template<typename Derived>
4622 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4623                                               TypeLocBuilder &TLB,
4624                                               IncompleteArrayTypeLoc TL) {
4625   const IncompleteArrayType *T = TL.getTypePtr();
4626   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4627   if (ElementType.isNull())
4628     return QualType();
4629 
4630   QualType Result = TL.getType();
4631   if (getDerived().AlwaysRebuild() ||
4632       ElementType != T->getElementType()) {
4633     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4634                                                      T->getSizeModifier(),
4635                                            T->getIndexTypeCVRQualifiers(),
4636                                                      TL.getBracketsRange());
4637     if (Result.isNull())
4638       return QualType();
4639   }
4640 
4641   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4642   NewTL.setLBracketLoc(TL.getLBracketLoc());
4643   NewTL.setRBracketLoc(TL.getRBracketLoc());
4644   NewTL.setSizeExpr(nullptr);
4645 
4646   return Result;
4647 }
4648 
4649 template<typename Derived>
4650 QualType
4651 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4652                                                    VariableArrayTypeLoc TL) {
4653   const VariableArrayType *T = TL.getTypePtr();
4654   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4655   if (ElementType.isNull())
4656     return QualType();
4657 
4658   ExprResult SizeResult;
4659   {
4660     EnterExpressionEvaluationContext Context(
4661         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4662     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4663   }
4664   if (SizeResult.isInvalid())
4665     return QualType();
4666   SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get());
4667   if (SizeResult.isInvalid())
4668     return QualType();
4669 
4670   Expr *Size = SizeResult.get();
4671 
4672   QualType Result = TL.getType();
4673   if (getDerived().AlwaysRebuild() ||
4674       ElementType != T->getElementType() ||
4675       Size != T->getSizeExpr()) {
4676     Result = getDerived().RebuildVariableArrayType(ElementType,
4677                                                    T->getSizeModifier(),
4678                                                    Size,
4679                                              T->getIndexTypeCVRQualifiers(),
4680                                                    TL.getBracketsRange());
4681     if (Result.isNull())
4682       return QualType();
4683   }
4684 
4685   // We might have constant size array now, but fortunately it has the same
4686   // location layout.
4687   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4688   NewTL.setLBracketLoc(TL.getLBracketLoc());
4689   NewTL.setRBracketLoc(TL.getRBracketLoc());
4690   NewTL.setSizeExpr(Size);
4691 
4692   return Result;
4693 }
4694 
4695 template<typename Derived>
4696 QualType
4697 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4698                                              DependentSizedArrayTypeLoc TL) {
4699   const DependentSizedArrayType *T = TL.getTypePtr();
4700   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4701   if (ElementType.isNull())
4702     return QualType();
4703 
4704   // Array bounds are constant expressions.
4705   EnterExpressionEvaluationContext Unevaluated(
4706       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4707 
4708   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4709   Expr *origSize = TL.getSizeExpr();
4710   if (!origSize) origSize = T->getSizeExpr();
4711 
4712   ExprResult sizeResult
4713     = getDerived().TransformExpr(origSize);
4714   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4715   if (sizeResult.isInvalid())
4716     return QualType();
4717 
4718   Expr *size = sizeResult.get();
4719 
4720   QualType Result = TL.getType();
4721   if (getDerived().AlwaysRebuild() ||
4722       ElementType != T->getElementType() ||
4723       size != origSize) {
4724     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4725                                                          T->getSizeModifier(),
4726                                                          size,
4727                                                 T->getIndexTypeCVRQualifiers(),
4728                                                         TL.getBracketsRange());
4729     if (Result.isNull())
4730       return QualType();
4731   }
4732 
4733   // We might have any sort of array type now, but fortunately they
4734   // all have the same location layout.
4735   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4736   NewTL.setLBracketLoc(TL.getLBracketLoc());
4737   NewTL.setRBracketLoc(TL.getRBracketLoc());
4738   NewTL.setSizeExpr(size);
4739 
4740   return Result;
4741 }
4742 
4743 template<typename Derived>
4744 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4745                                       TypeLocBuilder &TLB,
4746                                       DependentSizedExtVectorTypeLoc TL) {
4747   const DependentSizedExtVectorType *T = TL.getTypePtr();
4748 
4749   // FIXME: ext vector locs should be nested
4750   QualType ElementType = getDerived().TransformType(T->getElementType());
4751   if (ElementType.isNull())
4752     return QualType();
4753 
4754   // Vector sizes are constant expressions.
4755   EnterExpressionEvaluationContext Unevaluated(
4756       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4757 
4758   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4759   Size = SemaRef.ActOnConstantExpression(Size);
4760   if (Size.isInvalid())
4761     return QualType();
4762 
4763   QualType Result = TL.getType();
4764   if (getDerived().AlwaysRebuild() ||
4765       ElementType != T->getElementType() ||
4766       Size.get() != T->getSizeExpr()) {
4767     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4768                                                              Size.get(),
4769                                                          T->getAttributeLoc());
4770     if (Result.isNull())
4771       return QualType();
4772   }
4773 
4774   // Result might be dependent or not.
4775   if (isa<DependentSizedExtVectorType>(Result)) {
4776     DependentSizedExtVectorTypeLoc NewTL
4777       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4778     NewTL.setNameLoc(TL.getNameLoc());
4779   } else {
4780     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4781     NewTL.setNameLoc(TL.getNameLoc());
4782   }
4783 
4784   return Result;
4785 }
4786 
4787 template <typename Derived>
4788 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4789     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4790   const DependentAddressSpaceType *T = TL.getTypePtr();
4791 
4792   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4793 
4794   if (pointeeType.isNull())
4795     return QualType();
4796 
4797   // Address spaces are constant expressions.
4798   EnterExpressionEvaluationContext Unevaluated(
4799       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4800 
4801   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4802   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4803   if (AddrSpace.isInvalid())
4804     return QualType();
4805 
4806   QualType Result = TL.getType();
4807   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4808       AddrSpace.get() != T->getAddrSpaceExpr()) {
4809     Result = getDerived().RebuildDependentAddressSpaceType(
4810         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4811     if (Result.isNull())
4812       return QualType();
4813   }
4814 
4815   // Result might be dependent or not.
4816   if (isa<DependentAddressSpaceType>(Result)) {
4817     DependentAddressSpaceTypeLoc NewTL =
4818         TLB.push<DependentAddressSpaceTypeLoc>(Result);
4819 
4820     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4821     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
4822     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
4823 
4824   } else {
4825     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
4826         Result, getDerived().getBaseLocation());
4827     TransformType(TLB, DI->getTypeLoc());
4828   }
4829 
4830   return Result;
4831 }
4832 
4833 template <typename Derived>
4834 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4835                                                      VectorTypeLoc TL) {
4836   const VectorType *T = TL.getTypePtr();
4837   QualType ElementType = getDerived().TransformType(T->getElementType());
4838   if (ElementType.isNull())
4839     return QualType();
4840 
4841   QualType Result = TL.getType();
4842   if (getDerived().AlwaysRebuild() ||
4843       ElementType != T->getElementType()) {
4844     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4845                                             T->getVectorKind());
4846     if (Result.isNull())
4847       return QualType();
4848   }
4849 
4850   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4851   NewTL.setNameLoc(TL.getNameLoc());
4852 
4853   return Result;
4854 }
4855 
4856 template<typename Derived>
4857 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4858                                                         ExtVectorTypeLoc TL) {
4859   const VectorType *T = TL.getTypePtr();
4860   QualType ElementType = getDerived().TransformType(T->getElementType());
4861   if (ElementType.isNull())
4862     return QualType();
4863 
4864   QualType Result = TL.getType();
4865   if (getDerived().AlwaysRebuild() ||
4866       ElementType != T->getElementType()) {
4867     Result = getDerived().RebuildExtVectorType(ElementType,
4868                                                T->getNumElements(),
4869                                                /*FIXME*/ SourceLocation());
4870     if (Result.isNull())
4871       return QualType();
4872   }
4873 
4874   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4875   NewTL.setNameLoc(TL.getNameLoc());
4876 
4877   return Result;
4878 }
4879 
4880 template <typename Derived>
4881 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4882     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4883     bool ExpectParameterPack) {
4884   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4885   TypeSourceInfo *NewDI = nullptr;
4886 
4887   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4888     // If we're substituting into a pack expansion type and we know the
4889     // length we want to expand to, just substitute for the pattern.
4890     TypeLoc OldTL = OldDI->getTypeLoc();
4891     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
4892 
4893     TypeLocBuilder TLB;
4894     TypeLoc NewTL = OldDI->getTypeLoc();
4895     TLB.reserve(NewTL.getFullDataSize());
4896 
4897     QualType Result = getDerived().TransformType(TLB,
4898                                                OldExpansionTL.getPatternLoc());
4899     if (Result.isNull())
4900       return nullptr;
4901 
4902     Result = RebuildPackExpansionType(Result,
4903                                 OldExpansionTL.getPatternLoc().getSourceRange(),
4904                                       OldExpansionTL.getEllipsisLoc(),
4905                                       NumExpansions);
4906     if (Result.isNull())
4907       return nullptr;
4908 
4909     PackExpansionTypeLoc NewExpansionTL
4910       = TLB.push<PackExpansionTypeLoc>(Result);
4911     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
4912     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
4913   } else
4914     NewDI = getDerived().TransformType(OldDI);
4915   if (!NewDI)
4916     return nullptr;
4917 
4918   if (NewDI == OldDI && indexAdjustment == 0)
4919     return OldParm;
4920 
4921   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
4922                                              OldParm->getDeclContext(),
4923                                              OldParm->getInnerLocStart(),
4924                                              OldParm->getLocation(),
4925                                              OldParm->getIdentifier(),
4926                                              NewDI->getType(),
4927                                              NewDI,
4928                                              OldParm->getStorageClass(),
4929                                              /* DefArg */ nullptr);
4930   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
4931                         OldParm->getFunctionScopeIndex() + indexAdjustment);
4932   return newParm;
4933 }
4934 
4935 template <typename Derived>
4936 bool TreeTransform<Derived>::TransformFunctionTypeParams(
4937     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
4938     const QualType *ParamTypes,
4939     const FunctionProtoType::ExtParameterInfo *ParamInfos,
4940     SmallVectorImpl<QualType> &OutParamTypes,
4941     SmallVectorImpl<ParmVarDecl *> *PVars,
4942     Sema::ExtParameterInfoBuilder &PInfos) {
4943   int indexAdjustment = 0;
4944 
4945   unsigned NumParams = Params.size();
4946   for (unsigned i = 0; i != NumParams; ++i) {
4947     if (ParmVarDecl *OldParm = Params[i]) {
4948       assert(OldParm->getFunctionScopeIndex() == i);
4949 
4950       Optional<unsigned> NumExpansions;
4951       ParmVarDecl *NewParm = nullptr;
4952       if (OldParm->isParameterPack()) {
4953         // We have a function parameter pack that may need to be expanded.
4954         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4955 
4956         // Find the parameter packs that could be expanded.
4957         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
4958         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
4959         TypeLoc Pattern = ExpansionTL.getPatternLoc();
4960         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
4961         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
4962 
4963         // Determine whether we should expand the parameter packs.
4964         bool ShouldExpand = false;
4965         bool RetainExpansion = false;
4966         Optional<unsigned> OrigNumExpansions =
4967             ExpansionTL.getTypePtr()->getNumExpansions();
4968         NumExpansions = OrigNumExpansions;
4969         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
4970                                                  Pattern.getSourceRange(),
4971                                                  Unexpanded,
4972                                                  ShouldExpand,
4973                                                  RetainExpansion,
4974                                                  NumExpansions)) {
4975           return true;
4976         }
4977 
4978         if (ShouldExpand) {
4979           // Expand the function parameter pack into multiple, separate
4980           // parameters.
4981           getDerived().ExpandingFunctionParameterPack(OldParm);
4982           for (unsigned I = 0; I != *NumExpansions; ++I) {
4983             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4984             ParmVarDecl *NewParm
4985               = getDerived().TransformFunctionTypeParam(OldParm,
4986                                                         indexAdjustment++,
4987                                                         OrigNumExpansions,
4988                                                 /*ExpectParameterPack=*/false);
4989             if (!NewParm)
4990               return true;
4991 
4992             if (ParamInfos)
4993               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
4994             OutParamTypes.push_back(NewParm->getType());
4995             if (PVars)
4996               PVars->push_back(NewParm);
4997           }
4998 
4999           // If we're supposed to retain a pack expansion, do so by temporarily
5000           // forgetting the partially-substituted parameter pack.
5001           if (RetainExpansion) {
5002             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5003             ParmVarDecl *NewParm
5004               = getDerived().TransformFunctionTypeParam(OldParm,
5005                                                         indexAdjustment++,
5006                                                         OrigNumExpansions,
5007                                                 /*ExpectParameterPack=*/false);
5008             if (!NewParm)
5009               return true;
5010 
5011             if (ParamInfos)
5012               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5013             OutParamTypes.push_back(NewParm->getType());
5014             if (PVars)
5015               PVars->push_back(NewParm);
5016           }
5017 
5018           // The next parameter should have the same adjustment as the
5019           // last thing we pushed, but we post-incremented indexAdjustment
5020           // on every push.  Also, if we push nothing, the adjustment should
5021           // go down by one.
5022           indexAdjustment--;
5023 
5024           // We're done with the pack expansion.
5025           continue;
5026         }
5027 
5028         // We'll substitute the parameter now without expanding the pack
5029         // expansion.
5030         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5031         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5032                                                           indexAdjustment,
5033                                                           NumExpansions,
5034                                                   /*ExpectParameterPack=*/true);
5035       } else {
5036         NewParm = getDerived().TransformFunctionTypeParam(
5037             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5038       }
5039 
5040       if (!NewParm)
5041         return true;
5042 
5043       if (ParamInfos)
5044         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5045       OutParamTypes.push_back(NewParm->getType());
5046       if (PVars)
5047         PVars->push_back(NewParm);
5048       continue;
5049     }
5050 
5051     // Deal with the possibility that we don't have a parameter
5052     // declaration for this parameter.
5053     QualType OldType = ParamTypes[i];
5054     bool IsPackExpansion = false;
5055     Optional<unsigned> NumExpansions;
5056     QualType NewType;
5057     if (const PackExpansionType *Expansion
5058                                        = dyn_cast<PackExpansionType>(OldType)) {
5059       // We have a function parameter pack that may need to be expanded.
5060       QualType Pattern = Expansion->getPattern();
5061       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5062       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5063 
5064       // Determine whether we should expand the parameter packs.
5065       bool ShouldExpand = false;
5066       bool RetainExpansion = false;
5067       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5068                                                Unexpanded,
5069                                                ShouldExpand,
5070                                                RetainExpansion,
5071                                                NumExpansions)) {
5072         return true;
5073       }
5074 
5075       if (ShouldExpand) {
5076         // Expand the function parameter pack into multiple, separate
5077         // parameters.
5078         for (unsigned I = 0; I != *NumExpansions; ++I) {
5079           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5080           QualType NewType = getDerived().TransformType(Pattern);
5081           if (NewType.isNull())
5082             return true;
5083 
5084           if (NewType->containsUnexpandedParameterPack()) {
5085             NewType =
5086                 getSema().getASTContext().getPackExpansionType(NewType, None);
5087 
5088             if (NewType.isNull())
5089               return true;
5090           }
5091 
5092           if (ParamInfos)
5093             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5094           OutParamTypes.push_back(NewType);
5095           if (PVars)
5096             PVars->push_back(nullptr);
5097         }
5098 
5099         // We're done with the pack expansion.
5100         continue;
5101       }
5102 
5103       // If we're supposed to retain a pack expansion, do so by temporarily
5104       // forgetting the partially-substituted parameter pack.
5105       if (RetainExpansion) {
5106         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5107         QualType NewType = getDerived().TransformType(Pattern);
5108         if (NewType.isNull())
5109           return true;
5110 
5111         if (ParamInfos)
5112           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5113         OutParamTypes.push_back(NewType);
5114         if (PVars)
5115           PVars->push_back(nullptr);
5116       }
5117 
5118       // We'll substitute the parameter now without expanding the pack
5119       // expansion.
5120       OldType = Expansion->getPattern();
5121       IsPackExpansion = true;
5122       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5123       NewType = getDerived().TransformType(OldType);
5124     } else {
5125       NewType = getDerived().TransformType(OldType);
5126     }
5127 
5128     if (NewType.isNull())
5129       return true;
5130 
5131     if (IsPackExpansion)
5132       NewType = getSema().Context.getPackExpansionType(NewType,
5133                                                        NumExpansions);
5134 
5135     if (ParamInfos)
5136       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5137     OutParamTypes.push_back(NewType);
5138     if (PVars)
5139       PVars->push_back(nullptr);
5140   }
5141 
5142 #ifndef NDEBUG
5143   if (PVars) {
5144     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5145       if (ParmVarDecl *parm = (*PVars)[i])
5146         assert(parm->getFunctionScopeIndex() == i);
5147   }
5148 #endif
5149 
5150   return false;
5151 }
5152 
5153 template<typename Derived>
5154 QualType
5155 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5156                                                    FunctionProtoTypeLoc TL) {
5157   SmallVector<QualType, 4> ExceptionStorage;
5158   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5159   return getDerived().TransformFunctionProtoType(
5160       TLB, TL, nullptr, 0,
5161       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5162         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5163                                             ExceptionStorage, Changed);
5164       });
5165 }
5166 
5167 template<typename Derived> template<typename Fn>
5168 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5169     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5170     unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
5171 
5172   // Transform the parameters and return type.
5173   //
5174   // We are required to instantiate the params and return type in source order.
5175   // When the function has a trailing return type, we instantiate the
5176   // parameters before the return type,  since the return type can then refer
5177   // to the parameters themselves (via decltype, sizeof, etc.).
5178   //
5179   SmallVector<QualType, 4> ParamTypes;
5180   SmallVector<ParmVarDecl*, 4> ParamDecls;
5181   Sema::ExtParameterInfoBuilder ExtParamInfos;
5182   const FunctionProtoType *T = TL.getTypePtr();
5183 
5184   QualType ResultType;
5185 
5186   if (T->hasTrailingReturn()) {
5187     if (getDerived().TransformFunctionTypeParams(
5188             TL.getBeginLoc(), TL.getParams(),
5189             TL.getTypePtr()->param_type_begin(),
5190             T->getExtParameterInfosOrNull(),
5191             ParamTypes, &ParamDecls, ExtParamInfos))
5192       return QualType();
5193 
5194     {
5195       // C++11 [expr.prim.general]p3:
5196       //   If a declaration declares a member function or member function
5197       //   template of a class X, the expression this is a prvalue of type
5198       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5199       //   and the end of the function-definition, member-declarator, or
5200       //   declarator.
5201       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5202 
5203       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5204       if (ResultType.isNull())
5205         return QualType();
5206     }
5207   }
5208   else {
5209     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5210     if (ResultType.isNull())
5211       return QualType();
5212 
5213     if (getDerived().TransformFunctionTypeParams(
5214             TL.getBeginLoc(), TL.getParams(),
5215             TL.getTypePtr()->param_type_begin(),
5216             T->getExtParameterInfosOrNull(),
5217             ParamTypes, &ParamDecls, ExtParamInfos))
5218       return QualType();
5219   }
5220 
5221   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5222 
5223   bool EPIChanged = false;
5224   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5225     return QualType();
5226 
5227   // Handle extended parameter information.
5228   if (auto NewExtParamInfos =
5229         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5230     if (!EPI.ExtParameterInfos ||
5231         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5232           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5233       EPIChanged = true;
5234     }
5235     EPI.ExtParameterInfos = NewExtParamInfos;
5236   } else if (EPI.ExtParameterInfos) {
5237     EPIChanged = true;
5238     EPI.ExtParameterInfos = nullptr;
5239   }
5240 
5241   QualType Result = TL.getType();
5242   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5243       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5244     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5245     if (Result.isNull())
5246       return QualType();
5247   }
5248 
5249   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5250   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5251   NewTL.setLParenLoc(TL.getLParenLoc());
5252   NewTL.setRParenLoc(TL.getRParenLoc());
5253   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5254   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5255   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5256     NewTL.setParam(i, ParamDecls[i]);
5257 
5258   return Result;
5259 }
5260 
5261 template<typename Derived>
5262 bool TreeTransform<Derived>::TransformExceptionSpec(
5263     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5264     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5265   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5266 
5267   // Instantiate a dynamic noexcept expression, if any.
5268   if (ESI.Type == EST_ComputedNoexcept) {
5269     EnterExpressionEvaluationContext Unevaluated(
5270         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5271     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5272     if (NoexceptExpr.isInvalid())
5273       return true;
5274 
5275     // FIXME: This is bogus, a noexcept expression is not a condition.
5276     NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get());
5277     if (NoexceptExpr.isInvalid())
5278       return true;
5279 
5280     if (!NoexceptExpr.get()->isValueDependent()) {
5281       NoexceptExpr = getSema().VerifyIntegerConstantExpression(
5282           NoexceptExpr.get(), nullptr,
5283           diag::err_noexcept_needs_constant_expression,
5284           /*AllowFold*/false);
5285       if (NoexceptExpr.isInvalid())
5286         return true;
5287     }
5288 
5289     if (ESI.NoexceptExpr != NoexceptExpr.get())
5290       Changed = true;
5291     ESI.NoexceptExpr = NoexceptExpr.get();
5292   }
5293 
5294   if (ESI.Type != EST_Dynamic)
5295     return false;
5296 
5297   // Instantiate a dynamic exception specification's type.
5298   for (QualType T : ESI.Exceptions) {
5299     if (const PackExpansionType *PackExpansion =
5300             T->getAs<PackExpansionType>()) {
5301       Changed = true;
5302 
5303       // We have a pack expansion. Instantiate it.
5304       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5305       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5306                                               Unexpanded);
5307       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5308 
5309       // Determine whether the set of unexpanded parameter packs can and
5310       // should
5311       // be expanded.
5312       bool Expand = false;
5313       bool RetainExpansion = false;
5314       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5315       // FIXME: Track the location of the ellipsis (and track source location
5316       // information for the types in the exception specification in general).
5317       if (getDerived().TryExpandParameterPacks(
5318               Loc, SourceRange(), Unexpanded, Expand,
5319               RetainExpansion, NumExpansions))
5320         return true;
5321 
5322       if (!Expand) {
5323         // We can't expand this pack expansion into separate arguments yet;
5324         // just substitute into the pattern and create a new pack expansion
5325         // type.
5326         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5327         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5328         if (U.isNull())
5329           return true;
5330 
5331         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5332         Exceptions.push_back(U);
5333         continue;
5334       }
5335 
5336       // Substitute into the pack expansion pattern for each slice of the
5337       // pack.
5338       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5339         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5340 
5341         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5342         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5343           return true;
5344 
5345         Exceptions.push_back(U);
5346       }
5347     } else {
5348       QualType U = getDerived().TransformType(T);
5349       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5350         return true;
5351       if (T != U)
5352         Changed = true;
5353 
5354       Exceptions.push_back(U);
5355     }
5356   }
5357 
5358   ESI.Exceptions = Exceptions;
5359   if (ESI.Exceptions.empty())
5360     ESI.Type = EST_DynamicNone;
5361   return false;
5362 }
5363 
5364 template<typename Derived>
5365 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5366                                                  TypeLocBuilder &TLB,
5367                                                  FunctionNoProtoTypeLoc TL) {
5368   const FunctionNoProtoType *T = TL.getTypePtr();
5369   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5370   if (ResultType.isNull())
5371     return QualType();
5372 
5373   QualType Result = TL.getType();
5374   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5375     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5376 
5377   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5378   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5379   NewTL.setLParenLoc(TL.getLParenLoc());
5380   NewTL.setRParenLoc(TL.getRParenLoc());
5381   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5382 
5383   return Result;
5384 }
5385 
5386 template<typename Derived> QualType
5387 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5388                                                  UnresolvedUsingTypeLoc TL) {
5389   const UnresolvedUsingType *T = TL.getTypePtr();
5390   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5391   if (!D)
5392     return QualType();
5393 
5394   QualType Result = TL.getType();
5395   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5396     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5397     if (Result.isNull())
5398       return QualType();
5399   }
5400 
5401   // We might get an arbitrary type spec type back.  We should at
5402   // least always get a type spec type, though.
5403   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5404   NewTL.setNameLoc(TL.getNameLoc());
5405 
5406   return Result;
5407 }
5408 
5409 template<typename Derived>
5410 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5411                                                       TypedefTypeLoc TL) {
5412   const TypedefType *T = TL.getTypePtr();
5413   TypedefNameDecl *Typedef
5414     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5415                                                                T->getDecl()));
5416   if (!Typedef)
5417     return QualType();
5418 
5419   QualType Result = TL.getType();
5420   if (getDerived().AlwaysRebuild() ||
5421       Typedef != T->getDecl()) {
5422     Result = getDerived().RebuildTypedefType(Typedef);
5423     if (Result.isNull())
5424       return QualType();
5425   }
5426 
5427   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5428   NewTL.setNameLoc(TL.getNameLoc());
5429 
5430   return Result;
5431 }
5432 
5433 template<typename Derived>
5434 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5435                                                       TypeOfExprTypeLoc TL) {
5436   // typeof expressions are not potentially evaluated contexts
5437   EnterExpressionEvaluationContext Unevaluated(
5438       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5439       Sema::ReuseLambdaContextDecl);
5440 
5441   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5442   if (E.isInvalid())
5443     return QualType();
5444 
5445   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5446   if (E.isInvalid())
5447     return QualType();
5448 
5449   QualType Result = TL.getType();
5450   if (getDerived().AlwaysRebuild() ||
5451       E.get() != TL.getUnderlyingExpr()) {
5452     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5453     if (Result.isNull())
5454       return QualType();
5455   }
5456   else E.get();
5457 
5458   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5459   NewTL.setTypeofLoc(TL.getTypeofLoc());
5460   NewTL.setLParenLoc(TL.getLParenLoc());
5461   NewTL.setRParenLoc(TL.getRParenLoc());
5462 
5463   return Result;
5464 }
5465 
5466 template<typename Derived>
5467 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5468                                                      TypeOfTypeLoc TL) {
5469   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5470   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5471   if (!New_Under_TI)
5472     return QualType();
5473 
5474   QualType Result = TL.getType();
5475   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5476     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5477     if (Result.isNull())
5478       return QualType();
5479   }
5480 
5481   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5482   NewTL.setTypeofLoc(TL.getTypeofLoc());
5483   NewTL.setLParenLoc(TL.getLParenLoc());
5484   NewTL.setRParenLoc(TL.getRParenLoc());
5485   NewTL.setUnderlyingTInfo(New_Under_TI);
5486 
5487   return Result;
5488 }
5489 
5490 template<typename Derived>
5491 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5492                                                        DecltypeTypeLoc TL) {
5493   const DecltypeType *T = TL.getTypePtr();
5494 
5495   // decltype expressions are not potentially evaluated contexts
5496   EnterExpressionEvaluationContext Unevaluated(
5497       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5498       /*IsDecltype=*/true);
5499 
5500   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5501   if (E.isInvalid())
5502     return QualType();
5503 
5504   E = getSema().ActOnDecltypeExpression(E.get());
5505   if (E.isInvalid())
5506     return QualType();
5507 
5508   QualType Result = TL.getType();
5509   if (getDerived().AlwaysRebuild() ||
5510       E.get() != T->getUnderlyingExpr()) {
5511     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5512     if (Result.isNull())
5513       return QualType();
5514   }
5515   else E.get();
5516 
5517   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5518   NewTL.setNameLoc(TL.getNameLoc());
5519 
5520   return Result;
5521 }
5522 
5523 template<typename Derived>
5524 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5525                                                             TypeLocBuilder &TLB,
5526                                                      UnaryTransformTypeLoc TL) {
5527   QualType Result = TL.getType();
5528   if (Result->isDependentType()) {
5529     const UnaryTransformType *T = TL.getTypePtr();
5530     QualType NewBase =
5531       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5532     Result = getDerived().RebuildUnaryTransformType(NewBase,
5533                                                     T->getUTTKind(),
5534                                                     TL.getKWLoc());
5535     if (Result.isNull())
5536       return QualType();
5537   }
5538 
5539   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5540   NewTL.setKWLoc(TL.getKWLoc());
5541   NewTL.setParensRange(TL.getParensRange());
5542   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5543   return Result;
5544 }
5545 
5546 template<typename Derived>
5547 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5548                                                    AutoTypeLoc TL) {
5549   const AutoType *T = TL.getTypePtr();
5550   QualType OldDeduced = T->getDeducedType();
5551   QualType NewDeduced;
5552   if (!OldDeduced.isNull()) {
5553     NewDeduced = getDerived().TransformType(OldDeduced);
5554     if (NewDeduced.isNull())
5555       return QualType();
5556   }
5557 
5558   QualType Result = TL.getType();
5559   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5560       T->isDependentType()) {
5561     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5562     if (Result.isNull())
5563       return QualType();
5564   }
5565 
5566   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5567   NewTL.setNameLoc(TL.getNameLoc());
5568 
5569   return Result;
5570 }
5571 
5572 template<typename Derived>
5573 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5574     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5575   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5576 
5577   CXXScopeSpec SS;
5578   TemplateName TemplateName = getDerived().TransformTemplateName(
5579       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5580   if (TemplateName.isNull())
5581     return QualType();
5582 
5583   QualType OldDeduced = T->getDeducedType();
5584   QualType NewDeduced;
5585   if (!OldDeduced.isNull()) {
5586     NewDeduced = getDerived().TransformType(OldDeduced);
5587     if (NewDeduced.isNull())
5588       return QualType();
5589   }
5590 
5591   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5592       TemplateName, NewDeduced);
5593   if (Result.isNull())
5594     return QualType();
5595 
5596   DeducedTemplateSpecializationTypeLoc NewTL =
5597       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5598   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5599 
5600   return Result;
5601 }
5602 
5603 template<typename Derived>
5604 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5605                                                      RecordTypeLoc TL) {
5606   const RecordType *T = TL.getTypePtr();
5607   RecordDecl *Record
5608     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5609                                                           T->getDecl()));
5610   if (!Record)
5611     return QualType();
5612 
5613   QualType Result = TL.getType();
5614   if (getDerived().AlwaysRebuild() ||
5615       Record != T->getDecl()) {
5616     Result = getDerived().RebuildRecordType(Record);
5617     if (Result.isNull())
5618       return QualType();
5619   }
5620 
5621   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5622   NewTL.setNameLoc(TL.getNameLoc());
5623 
5624   return Result;
5625 }
5626 
5627 template<typename Derived>
5628 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5629                                                    EnumTypeLoc TL) {
5630   const EnumType *T = TL.getTypePtr();
5631   EnumDecl *Enum
5632     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5633                                                         T->getDecl()));
5634   if (!Enum)
5635     return QualType();
5636 
5637   QualType Result = TL.getType();
5638   if (getDerived().AlwaysRebuild() ||
5639       Enum != T->getDecl()) {
5640     Result = getDerived().RebuildEnumType(Enum);
5641     if (Result.isNull())
5642       return QualType();
5643   }
5644 
5645   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5646   NewTL.setNameLoc(TL.getNameLoc());
5647 
5648   return Result;
5649 }
5650 
5651 template<typename Derived>
5652 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5653                                          TypeLocBuilder &TLB,
5654                                          InjectedClassNameTypeLoc TL) {
5655   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5656                                        TL.getTypePtr()->getDecl());
5657   if (!D) return QualType();
5658 
5659   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5660   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5661   return T;
5662 }
5663 
5664 template<typename Derived>
5665 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5666                                                 TypeLocBuilder &TLB,
5667                                                 TemplateTypeParmTypeLoc TL) {
5668   return TransformTypeSpecType(TLB, TL);
5669 }
5670 
5671 template<typename Derived>
5672 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5673                                          TypeLocBuilder &TLB,
5674                                          SubstTemplateTypeParmTypeLoc TL) {
5675   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5676 
5677   // Substitute into the replacement type, which itself might involve something
5678   // that needs to be transformed. This only tends to occur with default
5679   // template arguments of template template parameters.
5680   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5681   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5682   if (Replacement.isNull())
5683     return QualType();
5684 
5685   // Always canonicalize the replacement type.
5686   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5687   QualType Result
5688     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5689                                                    Replacement);
5690 
5691   // Propagate type-source information.
5692   SubstTemplateTypeParmTypeLoc NewTL
5693     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5694   NewTL.setNameLoc(TL.getNameLoc());
5695   return Result;
5696 
5697 }
5698 
5699 template<typename Derived>
5700 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5701                                           TypeLocBuilder &TLB,
5702                                           SubstTemplateTypeParmPackTypeLoc TL) {
5703   return TransformTypeSpecType(TLB, TL);
5704 }
5705 
5706 template<typename Derived>
5707 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5708                                                         TypeLocBuilder &TLB,
5709                                            TemplateSpecializationTypeLoc TL) {
5710   const TemplateSpecializationType *T = TL.getTypePtr();
5711 
5712   // The nested-name-specifier never matters in a TemplateSpecializationType,
5713   // because we can't have a dependent nested-name-specifier anyway.
5714   CXXScopeSpec SS;
5715   TemplateName Template
5716     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5717                                          TL.getTemplateNameLoc());
5718   if (Template.isNull())
5719     return QualType();
5720 
5721   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5722 }
5723 
5724 template<typename Derived>
5725 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5726                                                      AtomicTypeLoc TL) {
5727   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5728   if (ValueType.isNull())
5729     return QualType();
5730 
5731   QualType Result = TL.getType();
5732   if (getDerived().AlwaysRebuild() ||
5733       ValueType != TL.getValueLoc().getType()) {
5734     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5735     if (Result.isNull())
5736       return QualType();
5737   }
5738 
5739   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5740   NewTL.setKWLoc(TL.getKWLoc());
5741   NewTL.setLParenLoc(TL.getLParenLoc());
5742   NewTL.setRParenLoc(TL.getRParenLoc());
5743 
5744   return Result;
5745 }
5746 
5747 template <typename Derived>
5748 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5749                                                    PipeTypeLoc TL) {
5750   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5751   if (ValueType.isNull())
5752     return QualType();
5753 
5754   QualType Result = TL.getType();
5755   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5756     const PipeType *PT = Result->getAs<PipeType>();
5757     bool isReadPipe = PT->isReadOnly();
5758     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5759     if (Result.isNull())
5760       return QualType();
5761   }
5762 
5763   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5764   NewTL.setKWLoc(TL.getKWLoc());
5765 
5766   return Result;
5767 }
5768 
5769   /// \brief Simple iterator that traverses the template arguments in a
5770   /// container that provides a \c getArgLoc() member function.
5771   ///
5772   /// This iterator is intended to be used with the iterator form of
5773   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5774   template<typename ArgLocContainer>
5775   class TemplateArgumentLocContainerIterator {
5776     ArgLocContainer *Container;
5777     unsigned Index;
5778 
5779   public:
5780     typedef TemplateArgumentLoc value_type;
5781     typedef TemplateArgumentLoc reference;
5782     typedef int difference_type;
5783     typedef std::input_iterator_tag iterator_category;
5784 
5785     class pointer {
5786       TemplateArgumentLoc Arg;
5787 
5788     public:
5789       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5790 
5791       const TemplateArgumentLoc *operator->() const {
5792         return &Arg;
5793       }
5794     };
5795 
5796 
5797     TemplateArgumentLocContainerIterator() {}
5798 
5799     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5800                                  unsigned Index)
5801       : Container(&Container), Index(Index) { }
5802 
5803     TemplateArgumentLocContainerIterator &operator++() {
5804       ++Index;
5805       return *this;
5806     }
5807 
5808     TemplateArgumentLocContainerIterator operator++(int) {
5809       TemplateArgumentLocContainerIterator Old(*this);
5810       ++(*this);
5811       return Old;
5812     }
5813 
5814     TemplateArgumentLoc operator*() const {
5815       return Container->getArgLoc(Index);
5816     }
5817 
5818     pointer operator->() const {
5819       return pointer(Container->getArgLoc(Index));
5820     }
5821 
5822     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5823                            const TemplateArgumentLocContainerIterator &Y) {
5824       return X.Container == Y.Container && X.Index == Y.Index;
5825     }
5826 
5827     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5828                            const TemplateArgumentLocContainerIterator &Y) {
5829       return !(X == Y);
5830     }
5831   };
5832 
5833 
5834 template <typename Derived>
5835 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5836                                                         TypeLocBuilder &TLB,
5837                                            TemplateSpecializationTypeLoc TL,
5838                                                       TemplateName Template) {
5839   TemplateArgumentListInfo NewTemplateArgs;
5840   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5841   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5842   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5843     ArgIterator;
5844   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5845                                               ArgIterator(TL, TL.getNumArgs()),
5846                                               NewTemplateArgs))
5847     return QualType();
5848 
5849   // FIXME: maybe don't rebuild if all the template arguments are the same.
5850 
5851   QualType Result =
5852     getDerived().RebuildTemplateSpecializationType(Template,
5853                                                    TL.getTemplateNameLoc(),
5854                                                    NewTemplateArgs);
5855 
5856   if (!Result.isNull()) {
5857     // Specializations of template template parameters are represented as
5858     // TemplateSpecializationTypes, and substitution of type alias templates
5859     // within a dependent context can transform them into
5860     // DependentTemplateSpecializationTypes.
5861     if (isa<DependentTemplateSpecializationType>(Result)) {
5862       DependentTemplateSpecializationTypeLoc NewTL
5863         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5864       NewTL.setElaboratedKeywordLoc(SourceLocation());
5865       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5866       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5867       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5868       NewTL.setLAngleLoc(TL.getLAngleLoc());
5869       NewTL.setRAngleLoc(TL.getRAngleLoc());
5870       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5871         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5872       return Result;
5873     }
5874 
5875     TemplateSpecializationTypeLoc NewTL
5876       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5877     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5878     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5879     NewTL.setLAngleLoc(TL.getLAngleLoc());
5880     NewTL.setRAngleLoc(TL.getRAngleLoc());
5881     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5882       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5883   }
5884 
5885   return Result;
5886 }
5887 
5888 template <typename Derived>
5889 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
5890                                      TypeLocBuilder &TLB,
5891                                      DependentTemplateSpecializationTypeLoc TL,
5892                                      TemplateName Template,
5893                                      CXXScopeSpec &SS) {
5894   TemplateArgumentListInfo NewTemplateArgs;
5895   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5896   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5897   typedef TemplateArgumentLocContainerIterator<
5898             DependentTemplateSpecializationTypeLoc> ArgIterator;
5899   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5900                                               ArgIterator(TL, TL.getNumArgs()),
5901                                               NewTemplateArgs))
5902     return QualType();
5903 
5904   // FIXME: maybe don't rebuild if all the template arguments are the same.
5905 
5906   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
5907     QualType Result
5908       = getSema().Context.getDependentTemplateSpecializationType(
5909                                                 TL.getTypePtr()->getKeyword(),
5910                                                          DTN->getQualifier(),
5911                                                          DTN->getIdentifier(),
5912                                                                NewTemplateArgs);
5913 
5914     DependentTemplateSpecializationTypeLoc NewTL
5915       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5916     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5917     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
5918     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5919     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5920     NewTL.setLAngleLoc(TL.getLAngleLoc());
5921     NewTL.setRAngleLoc(TL.getRAngleLoc());
5922     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5923       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5924     return Result;
5925   }
5926 
5927   QualType Result
5928     = getDerived().RebuildTemplateSpecializationType(Template,
5929                                                      TL.getTemplateNameLoc(),
5930                                                      NewTemplateArgs);
5931 
5932   if (!Result.isNull()) {
5933     /// FIXME: Wrap this in an elaborated-type-specifier?
5934     TemplateSpecializationTypeLoc NewTL
5935       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5936     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5937     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5938     NewTL.setLAngleLoc(TL.getLAngleLoc());
5939     NewTL.setRAngleLoc(TL.getRAngleLoc());
5940     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5941       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5942   }
5943 
5944   return Result;
5945 }
5946 
5947 template<typename Derived>
5948 QualType
5949 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
5950                                                 ElaboratedTypeLoc TL) {
5951   const ElaboratedType *T = TL.getTypePtr();
5952 
5953   NestedNameSpecifierLoc QualifierLoc;
5954   // NOTE: the qualifier in an ElaboratedType is optional.
5955   if (TL.getQualifierLoc()) {
5956     QualifierLoc
5957       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
5958     if (!QualifierLoc)
5959       return QualType();
5960   }
5961 
5962   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
5963   if (NamedT.isNull())
5964     return QualType();
5965 
5966   // C++0x [dcl.type.elab]p2:
5967   //   If the identifier resolves to a typedef-name or the simple-template-id
5968   //   resolves to an alias template specialization, the
5969   //   elaborated-type-specifier is ill-formed.
5970   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
5971     if (const TemplateSpecializationType *TST =
5972           NamedT->getAs<TemplateSpecializationType>()) {
5973       TemplateName Template = TST->getTemplateName();
5974       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
5975               Template.getAsTemplateDecl())) {
5976         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
5977                      diag::err_tag_reference_non_tag)
5978             << TAT << Sema::NTK_TypeAliasTemplate
5979             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
5980         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
5981       }
5982     }
5983   }
5984 
5985   QualType Result = TL.getType();
5986   if (getDerived().AlwaysRebuild() ||
5987       QualifierLoc != TL.getQualifierLoc() ||
5988       NamedT != T->getNamedType()) {
5989     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
5990                                                 T->getKeyword(),
5991                                                 QualifierLoc, NamedT);
5992     if (Result.isNull())
5993       return QualType();
5994   }
5995 
5996   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
5997   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5998   NewTL.setQualifierLoc(QualifierLoc);
5999   return Result;
6000 }
6001 
6002 template<typename Derived>
6003 QualType TreeTransform<Derived>::TransformAttributedType(
6004                                                 TypeLocBuilder &TLB,
6005                                                 AttributedTypeLoc TL) {
6006   const AttributedType *oldType = TL.getTypePtr();
6007   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6008   if (modifiedType.isNull())
6009     return QualType();
6010 
6011   QualType result = TL.getType();
6012 
6013   // FIXME: dependent operand expressions?
6014   if (getDerived().AlwaysRebuild() ||
6015       modifiedType != oldType->getModifiedType()) {
6016     // TODO: this is really lame; we should really be rebuilding the
6017     // equivalent type from first principles.
6018     QualType equivalentType
6019       = getDerived().TransformType(oldType->getEquivalentType());
6020     if (equivalentType.isNull())
6021       return QualType();
6022 
6023     // Check whether we can add nullability; it is only represented as
6024     // type sugar, and therefore cannot be diagnosed in any other way.
6025     if (auto nullability = oldType->getImmediateNullability()) {
6026       if (!modifiedType->canHaveNullability()) {
6027         SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer)
6028           << DiagNullabilityKind(*nullability, false) << modifiedType;
6029         return QualType();
6030       }
6031     }
6032 
6033     result = SemaRef.Context.getAttributedType(oldType->getAttrKind(),
6034                                                modifiedType,
6035                                                equivalentType);
6036   }
6037 
6038   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6039   newTL.setAttrNameLoc(TL.getAttrNameLoc());
6040   if (TL.hasAttrOperand())
6041     newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
6042   if (TL.hasAttrExprOperand())
6043     newTL.setAttrExprOperand(TL.getAttrExprOperand());
6044   else if (TL.hasAttrEnumOperand())
6045     newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc());
6046 
6047   return result;
6048 }
6049 
6050 template<typename Derived>
6051 QualType
6052 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6053                                            ParenTypeLoc TL) {
6054   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6055   if (Inner.isNull())
6056     return QualType();
6057 
6058   QualType Result = TL.getType();
6059   if (getDerived().AlwaysRebuild() ||
6060       Inner != TL.getInnerLoc().getType()) {
6061     Result = getDerived().RebuildParenType(Inner);
6062     if (Result.isNull())
6063       return QualType();
6064   }
6065 
6066   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6067   NewTL.setLParenLoc(TL.getLParenLoc());
6068   NewTL.setRParenLoc(TL.getRParenLoc());
6069   return Result;
6070 }
6071 
6072 template<typename Derived>
6073 QualType TreeTransform<Derived>::TransformDependentNameType(
6074     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6075   return TransformDependentNameType(TLB, TL, false);
6076 }
6077 
6078 template<typename Derived>
6079 QualType TreeTransform<Derived>::TransformDependentNameType(
6080     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6081   const DependentNameType *T = TL.getTypePtr();
6082 
6083   NestedNameSpecifierLoc QualifierLoc
6084     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6085   if (!QualifierLoc)
6086     return QualType();
6087 
6088   QualType Result
6089     = getDerived().RebuildDependentNameType(T->getKeyword(),
6090                                             TL.getElaboratedKeywordLoc(),
6091                                             QualifierLoc,
6092                                             T->getIdentifier(),
6093                                             TL.getNameLoc(),
6094                                             DeducedTSTContext);
6095   if (Result.isNull())
6096     return QualType();
6097 
6098   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6099     QualType NamedT = ElabT->getNamedType();
6100     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6101 
6102     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6103     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6104     NewTL.setQualifierLoc(QualifierLoc);
6105   } else {
6106     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6107     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6108     NewTL.setQualifierLoc(QualifierLoc);
6109     NewTL.setNameLoc(TL.getNameLoc());
6110   }
6111   return Result;
6112 }
6113 
6114 template<typename Derived>
6115 QualType TreeTransform<Derived>::
6116           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6117                                  DependentTemplateSpecializationTypeLoc TL) {
6118   NestedNameSpecifierLoc QualifierLoc;
6119   if (TL.getQualifierLoc()) {
6120     QualifierLoc
6121       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6122     if (!QualifierLoc)
6123       return QualType();
6124   }
6125 
6126   return getDerived()
6127            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6128 }
6129 
6130 template<typename Derived>
6131 QualType TreeTransform<Derived>::
6132 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6133                                    DependentTemplateSpecializationTypeLoc TL,
6134                                        NestedNameSpecifierLoc QualifierLoc) {
6135   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6136 
6137   TemplateArgumentListInfo NewTemplateArgs;
6138   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6139   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6140 
6141   typedef TemplateArgumentLocContainerIterator<
6142   DependentTemplateSpecializationTypeLoc> ArgIterator;
6143   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6144                                               ArgIterator(TL, TL.getNumArgs()),
6145                                               NewTemplateArgs))
6146     return QualType();
6147 
6148   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6149       T->getKeyword(), QualifierLoc, T->getIdentifier(),
6150       TL.getTemplateNameLoc(), NewTemplateArgs,
6151       /*AllowInjectedClassName*/ false);
6152   if (Result.isNull())
6153     return QualType();
6154 
6155   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6156     QualType NamedT = ElabT->getNamedType();
6157 
6158     // Copy information relevant to the template specialization.
6159     TemplateSpecializationTypeLoc NamedTL
6160       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6161     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6162     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6163     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6164     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6165     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6166       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6167 
6168     // Copy information relevant to the elaborated type.
6169     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6170     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6171     NewTL.setQualifierLoc(QualifierLoc);
6172   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6173     DependentTemplateSpecializationTypeLoc SpecTL
6174       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6175     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6176     SpecTL.setQualifierLoc(QualifierLoc);
6177     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6178     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6179     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6180     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6181     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6182       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6183   } else {
6184     TemplateSpecializationTypeLoc SpecTL
6185       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6186     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6187     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6188     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6189     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6190     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6191       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6192   }
6193   return Result;
6194 }
6195 
6196 template<typename Derived>
6197 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6198                                                       PackExpansionTypeLoc TL) {
6199   QualType Pattern
6200     = getDerived().TransformType(TLB, TL.getPatternLoc());
6201   if (Pattern.isNull())
6202     return QualType();
6203 
6204   QualType Result = TL.getType();
6205   if (getDerived().AlwaysRebuild() ||
6206       Pattern != TL.getPatternLoc().getType()) {
6207     Result = getDerived().RebuildPackExpansionType(Pattern,
6208                                            TL.getPatternLoc().getSourceRange(),
6209                                                    TL.getEllipsisLoc(),
6210                                            TL.getTypePtr()->getNumExpansions());
6211     if (Result.isNull())
6212       return QualType();
6213   }
6214 
6215   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6216   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6217   return Result;
6218 }
6219 
6220 template<typename Derived>
6221 QualType
6222 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6223                                                    ObjCInterfaceTypeLoc TL) {
6224   // ObjCInterfaceType is never dependent.
6225   TLB.pushFullCopy(TL);
6226   return TL.getType();
6227 }
6228 
6229 template<typename Derived>
6230 QualType
6231 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6232                                                    ObjCTypeParamTypeLoc TL) {
6233   const ObjCTypeParamType *T = TL.getTypePtr();
6234   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6235       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6236   if (!OTP)
6237     return QualType();
6238 
6239   QualType Result = TL.getType();
6240   if (getDerived().AlwaysRebuild() ||
6241       OTP != T->getDecl()) {
6242     Result = getDerived().RebuildObjCTypeParamType(OTP,
6243                  TL.getProtocolLAngleLoc(),
6244                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6245                                     TL.getNumProtocols()),
6246                  TL.getProtocolLocs(),
6247                  TL.getProtocolRAngleLoc());
6248     if (Result.isNull())
6249       return QualType();
6250   }
6251 
6252   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6253   if (TL.getNumProtocols()) {
6254     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6255     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6256       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6257     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6258   }
6259   return Result;
6260 }
6261 
6262 template<typename Derived>
6263 QualType
6264 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6265                                                 ObjCObjectTypeLoc TL) {
6266   // Transform base type.
6267   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6268   if (BaseType.isNull())
6269     return QualType();
6270 
6271   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6272 
6273   // Transform type arguments.
6274   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6275   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6276     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6277     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6278     QualType TypeArg = TypeArgInfo->getType();
6279     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6280       AnyChanged = true;
6281 
6282       // We have a pack expansion. Instantiate it.
6283       const auto *PackExpansion = PackExpansionLoc.getType()
6284                                     ->castAs<PackExpansionType>();
6285       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6286       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6287                                               Unexpanded);
6288       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6289 
6290       // Determine whether the set of unexpanded parameter packs can
6291       // and should be expanded.
6292       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6293       bool Expand = false;
6294       bool RetainExpansion = false;
6295       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6296       if (getDerived().TryExpandParameterPacks(
6297             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6298             Unexpanded, Expand, RetainExpansion, NumExpansions))
6299         return QualType();
6300 
6301       if (!Expand) {
6302         // We can't expand this pack expansion into separate arguments yet;
6303         // just substitute into the pattern and create a new pack expansion
6304         // type.
6305         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6306 
6307         TypeLocBuilder TypeArgBuilder;
6308         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6309         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6310                                                              PatternLoc);
6311         if (NewPatternType.isNull())
6312           return QualType();
6313 
6314         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6315                                       NewPatternType, NumExpansions);
6316         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6317         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6318         NewTypeArgInfos.push_back(
6319           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6320         continue;
6321       }
6322 
6323       // Substitute into the pack expansion pattern for each slice of the
6324       // pack.
6325       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6326         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6327 
6328         TypeLocBuilder TypeArgBuilder;
6329         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6330 
6331         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6332                                                          PatternLoc);
6333         if (NewTypeArg.isNull())
6334           return QualType();
6335 
6336         NewTypeArgInfos.push_back(
6337           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6338       }
6339 
6340       continue;
6341     }
6342 
6343     TypeLocBuilder TypeArgBuilder;
6344     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6345     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6346     if (NewTypeArg.isNull())
6347       return QualType();
6348 
6349     // If nothing changed, just keep the old TypeSourceInfo.
6350     if (NewTypeArg == TypeArg) {
6351       NewTypeArgInfos.push_back(TypeArgInfo);
6352       continue;
6353     }
6354 
6355     NewTypeArgInfos.push_back(
6356       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6357     AnyChanged = true;
6358   }
6359 
6360   QualType Result = TL.getType();
6361   if (getDerived().AlwaysRebuild() || AnyChanged) {
6362     // Rebuild the type.
6363     Result = getDerived().RebuildObjCObjectType(
6364                BaseType,
6365                TL.getLocStart(),
6366                TL.getTypeArgsLAngleLoc(),
6367                NewTypeArgInfos,
6368                TL.getTypeArgsRAngleLoc(),
6369                TL.getProtocolLAngleLoc(),
6370                llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6371                                   TL.getNumProtocols()),
6372                TL.getProtocolLocs(),
6373                TL.getProtocolRAngleLoc());
6374 
6375     if (Result.isNull())
6376       return QualType();
6377   }
6378 
6379   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6380   NewT.setHasBaseTypeAsWritten(true);
6381   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6382   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6383     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6384   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6385   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6386   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6387     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6388   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6389   return Result;
6390 }
6391 
6392 template<typename Derived>
6393 QualType
6394 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6395                                                ObjCObjectPointerTypeLoc TL) {
6396   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6397   if (PointeeType.isNull())
6398     return QualType();
6399 
6400   QualType Result = TL.getType();
6401   if (getDerived().AlwaysRebuild() ||
6402       PointeeType != TL.getPointeeLoc().getType()) {
6403     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6404                                                        TL.getStarLoc());
6405     if (Result.isNull())
6406       return QualType();
6407   }
6408 
6409   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6410   NewT.setStarLoc(TL.getStarLoc());
6411   return Result;
6412 }
6413 
6414 //===----------------------------------------------------------------------===//
6415 // Statement transformation
6416 //===----------------------------------------------------------------------===//
6417 template<typename Derived>
6418 StmtResult
6419 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6420   return S;
6421 }
6422 
6423 template<typename Derived>
6424 StmtResult
6425 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6426   return getDerived().TransformCompoundStmt(S, false);
6427 }
6428 
6429 template<typename Derived>
6430 StmtResult
6431 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6432                                               bool IsStmtExpr) {
6433   Sema::CompoundScopeRAII CompoundScope(getSema());
6434 
6435   bool SubStmtInvalid = false;
6436   bool SubStmtChanged = false;
6437   SmallVector<Stmt*, 8> Statements;
6438   for (auto *B : S->body()) {
6439     StmtResult Result = getDerived().TransformStmt(B);
6440     if (Result.isInvalid()) {
6441       // Immediately fail if this was a DeclStmt, since it's very
6442       // likely that this will cause problems for future statements.
6443       if (isa<DeclStmt>(B))
6444         return StmtError();
6445 
6446       // Otherwise, just keep processing substatements and fail later.
6447       SubStmtInvalid = true;
6448       continue;
6449     }
6450 
6451     SubStmtChanged = SubStmtChanged || Result.get() != B;
6452     Statements.push_back(Result.getAs<Stmt>());
6453   }
6454 
6455   if (SubStmtInvalid)
6456     return StmtError();
6457 
6458   if (!getDerived().AlwaysRebuild() &&
6459       !SubStmtChanged)
6460     return S;
6461 
6462   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6463                                           Statements,
6464                                           S->getRBracLoc(),
6465                                           IsStmtExpr);
6466 }
6467 
6468 template<typename Derived>
6469 StmtResult
6470 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6471   ExprResult LHS, RHS;
6472   {
6473     EnterExpressionEvaluationContext Unevaluated(
6474         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6475 
6476     // Transform the left-hand case value.
6477     LHS = getDerived().TransformExpr(S->getLHS());
6478     LHS = SemaRef.ActOnConstantExpression(LHS);
6479     if (LHS.isInvalid())
6480       return StmtError();
6481 
6482     // Transform the right-hand case value (for the GNU case-range extension).
6483     RHS = getDerived().TransformExpr(S->getRHS());
6484     RHS = SemaRef.ActOnConstantExpression(RHS);
6485     if (RHS.isInvalid())
6486       return StmtError();
6487   }
6488 
6489   // Build the case statement.
6490   // Case statements are always rebuilt so that they will attached to their
6491   // transformed switch statement.
6492   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6493                                                        LHS.get(),
6494                                                        S->getEllipsisLoc(),
6495                                                        RHS.get(),
6496                                                        S->getColonLoc());
6497   if (Case.isInvalid())
6498     return StmtError();
6499 
6500   // Transform the statement following the case
6501   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6502   if (SubStmt.isInvalid())
6503     return StmtError();
6504 
6505   // Attach the body to the case statement
6506   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6507 }
6508 
6509 template<typename Derived>
6510 StmtResult
6511 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6512   // Transform the statement following the default case
6513   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6514   if (SubStmt.isInvalid())
6515     return StmtError();
6516 
6517   // Default statements are always rebuilt
6518   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6519                                          SubStmt.get());
6520 }
6521 
6522 template<typename Derived>
6523 StmtResult
6524 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
6525   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6526   if (SubStmt.isInvalid())
6527     return StmtError();
6528 
6529   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6530                                         S->getDecl());
6531   if (!LD)
6532     return StmtError();
6533 
6534 
6535   // FIXME: Pass the real colon location in.
6536   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6537                                        cast<LabelDecl>(LD), SourceLocation(),
6538                                        SubStmt.get());
6539 }
6540 
6541 template <typename Derived>
6542 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6543   if (!R)
6544     return R;
6545 
6546   switch (R->getKind()) {
6547 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6548 #define ATTR(X)
6549 #define PRAGMA_SPELLING_ATTR(X)                                                \
6550   case attr::X:                                                                \
6551     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6552 #include "clang/Basic/AttrList.inc"
6553   default:
6554     return R;
6555   }
6556 }
6557 
6558 template <typename Derived>
6559 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) {
6560   bool AttrsChanged = false;
6561   SmallVector<const Attr *, 1> Attrs;
6562 
6563   // Visit attributes and keep track if any are transformed.
6564   for (const auto *I : S->getAttrs()) {
6565     const Attr *R = getDerived().TransformAttr(I);
6566     AttrsChanged |= (I != R);
6567     Attrs.push_back(R);
6568   }
6569 
6570   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
6571   if (SubStmt.isInvalid())
6572     return StmtError();
6573 
6574   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6575     return S;
6576 
6577   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6578                                             SubStmt.get());
6579 }
6580 
6581 template<typename Derived>
6582 StmtResult
6583 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6584   // Transform the initialization statement
6585   StmtResult Init = getDerived().TransformStmt(S->getInit());
6586   if (Init.isInvalid())
6587     return StmtError();
6588 
6589   // Transform the condition
6590   Sema::ConditionResult Cond = getDerived().TransformCondition(
6591       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6592       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6593                        : Sema::ConditionKind::Boolean);
6594   if (Cond.isInvalid())
6595     return StmtError();
6596 
6597   // If this is a constexpr if, determine which arm we should instantiate.
6598   llvm::Optional<bool> ConstexprConditionValue;
6599   if (S->isConstexpr())
6600     ConstexprConditionValue = Cond.getKnownValue();
6601 
6602   // Transform the "then" branch.
6603   StmtResult Then;
6604   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6605     Then = getDerived().TransformStmt(S->getThen());
6606     if (Then.isInvalid())
6607       return StmtError();
6608   } else {
6609     Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart());
6610   }
6611 
6612   // Transform the "else" branch.
6613   StmtResult Else;
6614   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6615     Else = getDerived().TransformStmt(S->getElse());
6616     if (Else.isInvalid())
6617       return StmtError();
6618   }
6619 
6620   if (!getDerived().AlwaysRebuild() &&
6621       Init.get() == S->getInit() &&
6622       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6623       Then.get() == S->getThen() &&
6624       Else.get() == S->getElse())
6625     return S;
6626 
6627   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6628                                     Init.get(), Then.get(), S->getElseLoc(),
6629                                     Else.get());
6630 }
6631 
6632 template<typename Derived>
6633 StmtResult
6634 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6635   // Transform the initialization statement
6636   StmtResult Init = getDerived().TransformStmt(S->getInit());
6637   if (Init.isInvalid())
6638     return StmtError();
6639 
6640   // Transform the condition.
6641   Sema::ConditionResult Cond = getDerived().TransformCondition(
6642       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6643       Sema::ConditionKind::Switch);
6644   if (Cond.isInvalid())
6645     return StmtError();
6646 
6647   // Rebuild the switch statement.
6648   StmtResult Switch
6649     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6650   if (Switch.isInvalid())
6651     return StmtError();
6652 
6653   // Transform the body of the switch statement.
6654   StmtResult Body = getDerived().TransformStmt(S->getBody());
6655   if (Body.isInvalid())
6656     return StmtError();
6657 
6658   // Complete the switch statement.
6659   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6660                                             Body.get());
6661 }
6662 
6663 template<typename Derived>
6664 StmtResult
6665 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6666   // Transform the condition
6667   Sema::ConditionResult Cond = getDerived().TransformCondition(
6668       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6669       Sema::ConditionKind::Boolean);
6670   if (Cond.isInvalid())
6671     return StmtError();
6672 
6673   // Transform the body
6674   StmtResult Body = getDerived().TransformStmt(S->getBody());
6675   if (Body.isInvalid())
6676     return StmtError();
6677 
6678   if (!getDerived().AlwaysRebuild() &&
6679       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6680       Body.get() == S->getBody())
6681     return Owned(S);
6682 
6683   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6684 }
6685 
6686 template<typename Derived>
6687 StmtResult
6688 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6689   // Transform the body
6690   StmtResult Body = getDerived().TransformStmt(S->getBody());
6691   if (Body.isInvalid())
6692     return StmtError();
6693 
6694   // Transform the condition
6695   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6696   if (Cond.isInvalid())
6697     return StmtError();
6698 
6699   if (!getDerived().AlwaysRebuild() &&
6700       Cond.get() == S->getCond() &&
6701       Body.get() == S->getBody())
6702     return S;
6703 
6704   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6705                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6706                                     S->getRParenLoc());
6707 }
6708 
6709 template<typename Derived>
6710 StmtResult
6711 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6712   // Transform the initialization statement
6713   StmtResult Init = getDerived().TransformStmt(S->getInit());
6714   if (Init.isInvalid())
6715     return StmtError();
6716 
6717   // In OpenMP loop region loop control variable must be captured and be
6718   // private. Perform analysis of first part (if any).
6719   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6720     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6721 
6722   // Transform the condition
6723   Sema::ConditionResult Cond = getDerived().TransformCondition(
6724       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6725       Sema::ConditionKind::Boolean);
6726   if (Cond.isInvalid())
6727     return StmtError();
6728 
6729   // Transform the increment
6730   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6731   if (Inc.isInvalid())
6732     return StmtError();
6733 
6734   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6735   if (S->getInc() && !FullInc.get())
6736     return StmtError();
6737 
6738   // Transform the body
6739   StmtResult Body = getDerived().TransformStmt(S->getBody());
6740   if (Body.isInvalid())
6741     return StmtError();
6742 
6743   if (!getDerived().AlwaysRebuild() &&
6744       Init.get() == S->getInit() &&
6745       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6746       Inc.get() == S->getInc() &&
6747       Body.get() == S->getBody())
6748     return S;
6749 
6750   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6751                                      Init.get(), Cond, FullInc,
6752                                      S->getRParenLoc(), Body.get());
6753 }
6754 
6755 template<typename Derived>
6756 StmtResult
6757 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6758   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6759                                         S->getLabel());
6760   if (!LD)
6761     return StmtError();
6762 
6763   // Goto statements must always be rebuilt, to resolve the label.
6764   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6765                                       cast<LabelDecl>(LD));
6766 }
6767 
6768 template<typename Derived>
6769 StmtResult
6770 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6771   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6772   if (Target.isInvalid())
6773     return StmtError();
6774   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6775 
6776   if (!getDerived().AlwaysRebuild() &&
6777       Target.get() == S->getTarget())
6778     return S;
6779 
6780   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6781                                               Target.get());
6782 }
6783 
6784 template<typename Derived>
6785 StmtResult
6786 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6787   return S;
6788 }
6789 
6790 template<typename Derived>
6791 StmtResult
6792 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6793   return S;
6794 }
6795 
6796 template<typename Derived>
6797 StmtResult
6798 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6799   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6800                                                         /*NotCopyInit*/false);
6801   if (Result.isInvalid())
6802     return StmtError();
6803 
6804   // FIXME: We always rebuild the return statement because there is no way
6805   // to tell whether the return type of the function has changed.
6806   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6807 }
6808 
6809 template<typename Derived>
6810 StmtResult
6811 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6812   bool DeclChanged = false;
6813   SmallVector<Decl *, 4> Decls;
6814   for (auto *D : S->decls()) {
6815     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6816     if (!Transformed)
6817       return StmtError();
6818 
6819     if (Transformed != D)
6820       DeclChanged = true;
6821 
6822     Decls.push_back(Transformed);
6823   }
6824 
6825   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6826     return S;
6827 
6828   return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc());
6829 }
6830 
6831 template<typename Derived>
6832 StmtResult
6833 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6834 
6835   SmallVector<Expr*, 8> Constraints;
6836   SmallVector<Expr*, 8> Exprs;
6837   SmallVector<IdentifierInfo *, 4> Names;
6838 
6839   ExprResult AsmString;
6840   SmallVector<Expr*, 8> Clobbers;
6841 
6842   bool ExprsChanged = false;
6843 
6844   // Go through the outputs.
6845   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6846     Names.push_back(S->getOutputIdentifier(I));
6847 
6848     // No need to transform the constraint literal.
6849     Constraints.push_back(S->getOutputConstraintLiteral(I));
6850 
6851     // Transform the output expr.
6852     Expr *OutputExpr = S->getOutputExpr(I);
6853     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6854     if (Result.isInvalid())
6855       return StmtError();
6856 
6857     ExprsChanged |= Result.get() != OutputExpr;
6858 
6859     Exprs.push_back(Result.get());
6860   }
6861 
6862   // Go through the inputs.
6863   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6864     Names.push_back(S->getInputIdentifier(I));
6865 
6866     // No need to transform the constraint literal.
6867     Constraints.push_back(S->getInputConstraintLiteral(I));
6868 
6869     // Transform the input expr.
6870     Expr *InputExpr = S->getInputExpr(I);
6871     ExprResult Result = getDerived().TransformExpr(InputExpr);
6872     if (Result.isInvalid())
6873       return StmtError();
6874 
6875     ExprsChanged |= Result.get() != InputExpr;
6876 
6877     Exprs.push_back(Result.get());
6878   }
6879 
6880   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
6881     return S;
6882 
6883   // Go through the clobbers.
6884   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
6885     Clobbers.push_back(S->getClobberStringLiteral(I));
6886 
6887   // No need to transform the asm string literal.
6888   AsmString = S->getAsmString();
6889   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
6890                                         S->isVolatile(), S->getNumOutputs(),
6891                                         S->getNumInputs(), Names.data(),
6892                                         Constraints, Exprs, AsmString.get(),
6893                                         Clobbers, S->getRParenLoc());
6894 }
6895 
6896 template<typename Derived>
6897 StmtResult
6898 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
6899   ArrayRef<Token> AsmToks =
6900     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
6901 
6902   bool HadError = false, HadChange = false;
6903 
6904   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
6905   SmallVector<Expr*, 8> TransformedExprs;
6906   TransformedExprs.reserve(SrcExprs.size());
6907   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
6908     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
6909     if (!Result.isUsable()) {
6910       HadError = true;
6911     } else {
6912       HadChange |= (Result.get() != SrcExprs[i]);
6913       TransformedExprs.push_back(Result.get());
6914     }
6915   }
6916 
6917   if (HadError) return StmtError();
6918   if (!HadChange && !getDerived().AlwaysRebuild())
6919     return Owned(S);
6920 
6921   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
6922                                        AsmToks, S->getAsmString(),
6923                                        S->getNumOutputs(), S->getNumInputs(),
6924                                        S->getAllConstraints(), S->getClobbers(),
6925                                        TransformedExprs, S->getEndLoc());
6926 }
6927 
6928 // C++ Coroutines TS
6929 
6930 template<typename Derived>
6931 StmtResult
6932 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
6933   auto *ScopeInfo = SemaRef.getCurFunction();
6934   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
6935   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
6936          ScopeInfo->NeedsCoroutineSuspends &&
6937          ScopeInfo->CoroutineSuspends.first == nullptr &&
6938          ScopeInfo->CoroutineSuspends.second == nullptr &&
6939          "expected clean scope info");
6940 
6941   // Set that we have (possibly-invalid) suspend points before we do anything
6942   // that may fail.
6943   ScopeInfo->setNeedsCoroutineSuspends(false);
6944 
6945   // The new CoroutinePromise object needs to be built and put into the current
6946   // FunctionScopeInfo before any transformations or rebuilding occurs.
6947   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
6948     return StmtError();
6949   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
6950   if (!Promise)
6951     return StmtError();
6952   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
6953   ScopeInfo->CoroutinePromise = Promise;
6954 
6955   // Transform the implicit coroutine statements we built during the initial
6956   // parse.
6957   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
6958   if (InitSuspend.isInvalid())
6959     return StmtError();
6960   StmtResult FinalSuspend =
6961       getDerived().TransformStmt(S->getFinalSuspendStmt());
6962   if (FinalSuspend.isInvalid())
6963     return StmtError();
6964   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
6965   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
6966 
6967   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
6968   if (BodyRes.isInvalid())
6969     return StmtError();
6970 
6971   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
6972   if (Builder.isInvalid())
6973     return StmtError();
6974 
6975   Expr *ReturnObject = S->getReturnValueInit();
6976   assert(ReturnObject && "the return object is expected to be valid");
6977   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
6978                                                      /*NoCopyInit*/ false);
6979   if (Res.isInvalid())
6980     return StmtError();
6981   Builder.ReturnValue = Res.get();
6982 
6983   if (S->hasDependentPromiseType()) {
6984     assert(!Promise->getType()->isDependentType() &&
6985            "the promise type must no longer be dependent");
6986     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
6987            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
6988            "these nodes should not have been built yet");
6989     if (!Builder.buildDependentStatements())
6990       return StmtError();
6991   } else {
6992     if (auto *OnFallthrough = S->getFallthroughHandler()) {
6993       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
6994       if (Res.isInvalid())
6995         return StmtError();
6996       Builder.OnFallthrough = Res.get();
6997     }
6998 
6999     if (auto *OnException = S->getExceptionHandler()) {
7000       StmtResult Res = getDerived().TransformStmt(OnException);
7001       if (Res.isInvalid())
7002         return StmtError();
7003       Builder.OnException = Res.get();
7004     }
7005 
7006     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7007       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7008       if (Res.isInvalid())
7009         return StmtError();
7010       Builder.ReturnStmtOnAllocFailure = Res.get();
7011     }
7012 
7013     // Transform any additional statements we may have already built
7014     assert(S->getAllocate() && S->getDeallocate() &&
7015            "allocation and deallocation calls must already be built");
7016     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7017     if (AllocRes.isInvalid())
7018       return StmtError();
7019     Builder.Allocate = AllocRes.get();
7020 
7021     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7022     if (DeallocRes.isInvalid())
7023       return StmtError();
7024     Builder.Deallocate = DeallocRes.get();
7025 
7026     assert(S->getResultDecl() && "ResultDecl must already be built");
7027     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7028     if (ResultDecl.isInvalid())
7029       return StmtError();
7030     Builder.ResultDecl = ResultDecl.get();
7031 
7032     if (auto *ReturnStmt = S->getReturnStmt()) {
7033       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7034       if (Res.isInvalid())
7035         return StmtError();
7036       Builder.ReturnStmt = Res.get();
7037     }
7038   }
7039 
7040   return getDerived().RebuildCoroutineBodyStmt(Builder);
7041 }
7042 
7043 template<typename Derived>
7044 StmtResult
7045 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7046   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7047                                                         /*NotCopyInit*/false);
7048   if (Result.isInvalid())
7049     return StmtError();
7050 
7051   // Always rebuild; we don't know if this needs to be injected into a new
7052   // context or if the promise type has changed.
7053   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7054                                           S->isImplicit());
7055 }
7056 
7057 template<typename Derived>
7058 ExprResult
7059 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7060   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7061                                                         /*NotCopyInit*/false);
7062   if (Result.isInvalid())
7063     return ExprError();
7064 
7065   // Always rebuild; we don't know if this needs to be injected into a new
7066   // context or if the promise type has changed.
7067   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7068                                          E->isImplicit());
7069 }
7070 
7071 template <typename Derived>
7072 ExprResult
7073 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7074   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7075                                                         /*NotCopyInit*/ false);
7076   if (OperandResult.isInvalid())
7077     return ExprError();
7078 
7079   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7080           E->getOperatorCoawaitLookup());
7081 
7082   if (LookupResult.isInvalid())
7083     return ExprError();
7084 
7085   // Always rebuild; we don't know if this needs to be injected into a new
7086   // context or if the promise type has changed.
7087   return getDerived().RebuildDependentCoawaitExpr(
7088       E->getKeywordLoc(), OperandResult.get(),
7089       cast<UnresolvedLookupExpr>(LookupResult.get()));
7090 }
7091 
7092 template<typename Derived>
7093 ExprResult
7094 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7095   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7096                                                         /*NotCopyInit*/false);
7097   if (Result.isInvalid())
7098     return ExprError();
7099 
7100   // Always rebuild; we don't know if this needs to be injected into a new
7101   // context or if the promise type has changed.
7102   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7103 }
7104 
7105 // Objective-C Statements.
7106 
7107 template<typename Derived>
7108 StmtResult
7109 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7110   // Transform the body of the @try.
7111   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7112   if (TryBody.isInvalid())
7113     return StmtError();
7114 
7115   // Transform the @catch statements (if present).
7116   bool AnyCatchChanged = false;
7117   SmallVector<Stmt*, 8> CatchStmts;
7118   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7119     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7120     if (Catch.isInvalid())
7121       return StmtError();
7122     if (Catch.get() != S->getCatchStmt(I))
7123       AnyCatchChanged = true;
7124     CatchStmts.push_back(Catch.get());
7125   }
7126 
7127   // Transform the @finally statement (if present).
7128   StmtResult Finally;
7129   if (S->getFinallyStmt()) {
7130     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7131     if (Finally.isInvalid())
7132       return StmtError();
7133   }
7134 
7135   // If nothing changed, just retain this statement.
7136   if (!getDerived().AlwaysRebuild() &&
7137       TryBody.get() == S->getTryBody() &&
7138       !AnyCatchChanged &&
7139       Finally.get() == S->getFinallyStmt())
7140     return S;
7141 
7142   // Build a new statement.
7143   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7144                                            CatchStmts, Finally.get());
7145 }
7146 
7147 template<typename Derived>
7148 StmtResult
7149 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7150   // Transform the @catch parameter, if there is one.
7151   VarDecl *Var = nullptr;
7152   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7153     TypeSourceInfo *TSInfo = nullptr;
7154     if (FromVar->getTypeSourceInfo()) {
7155       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7156       if (!TSInfo)
7157         return StmtError();
7158     }
7159 
7160     QualType T;
7161     if (TSInfo)
7162       T = TSInfo->getType();
7163     else {
7164       T = getDerived().TransformType(FromVar->getType());
7165       if (T.isNull())
7166         return StmtError();
7167     }
7168 
7169     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7170     if (!Var)
7171       return StmtError();
7172   }
7173 
7174   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7175   if (Body.isInvalid())
7176     return StmtError();
7177 
7178   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7179                                              S->getRParenLoc(),
7180                                              Var, Body.get());
7181 }
7182 
7183 template<typename Derived>
7184 StmtResult
7185 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7186   // Transform the body.
7187   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7188   if (Body.isInvalid())
7189     return StmtError();
7190 
7191   // If nothing changed, just retain this statement.
7192   if (!getDerived().AlwaysRebuild() &&
7193       Body.get() == S->getFinallyBody())
7194     return S;
7195 
7196   // Build a new statement.
7197   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7198                                                Body.get());
7199 }
7200 
7201 template<typename Derived>
7202 StmtResult
7203 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7204   ExprResult Operand;
7205   if (S->getThrowExpr()) {
7206     Operand = getDerived().TransformExpr(S->getThrowExpr());
7207     if (Operand.isInvalid())
7208       return StmtError();
7209   }
7210 
7211   if (!getDerived().AlwaysRebuild() &&
7212       Operand.get() == S->getThrowExpr())
7213     return S;
7214 
7215   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7216 }
7217 
7218 template<typename Derived>
7219 StmtResult
7220 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7221                                                   ObjCAtSynchronizedStmt *S) {
7222   // Transform the object we are locking.
7223   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7224   if (Object.isInvalid())
7225     return StmtError();
7226   Object =
7227     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7228                                                   Object.get());
7229   if (Object.isInvalid())
7230     return StmtError();
7231 
7232   // Transform the body.
7233   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7234   if (Body.isInvalid())
7235     return StmtError();
7236 
7237   // If nothing change, just retain the current statement.
7238   if (!getDerived().AlwaysRebuild() &&
7239       Object.get() == S->getSynchExpr() &&
7240       Body.get() == S->getSynchBody())
7241     return S;
7242 
7243   // Build a new statement.
7244   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7245                                                     Object.get(), Body.get());
7246 }
7247 
7248 template<typename Derived>
7249 StmtResult
7250 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7251                                               ObjCAutoreleasePoolStmt *S) {
7252   // Transform the body.
7253   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7254   if (Body.isInvalid())
7255     return StmtError();
7256 
7257   // If nothing changed, just retain this statement.
7258   if (!getDerived().AlwaysRebuild() &&
7259       Body.get() == S->getSubStmt())
7260     return S;
7261 
7262   // Build a new statement.
7263   return getDerived().RebuildObjCAutoreleasePoolStmt(
7264                         S->getAtLoc(), Body.get());
7265 }
7266 
7267 template<typename Derived>
7268 StmtResult
7269 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7270                                                   ObjCForCollectionStmt *S) {
7271   // Transform the element statement.
7272   StmtResult Element = getDerived().TransformStmt(S->getElement());
7273   if (Element.isInvalid())
7274     return StmtError();
7275 
7276   // Transform the collection expression.
7277   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7278   if (Collection.isInvalid())
7279     return StmtError();
7280 
7281   // Transform the body.
7282   StmtResult Body = getDerived().TransformStmt(S->getBody());
7283   if (Body.isInvalid())
7284     return StmtError();
7285 
7286   // If nothing changed, just retain this statement.
7287   if (!getDerived().AlwaysRebuild() &&
7288       Element.get() == S->getElement() &&
7289       Collection.get() == S->getCollection() &&
7290       Body.get() == S->getBody())
7291     return S;
7292 
7293   // Build a new statement.
7294   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7295                                                    Element.get(),
7296                                                    Collection.get(),
7297                                                    S->getRParenLoc(),
7298                                                    Body.get());
7299 }
7300 
7301 template <typename Derived>
7302 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7303   // Transform the exception declaration, if any.
7304   VarDecl *Var = nullptr;
7305   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7306     TypeSourceInfo *T =
7307         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7308     if (!T)
7309       return StmtError();
7310 
7311     Var = getDerived().RebuildExceptionDecl(
7312         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7313         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7314     if (!Var || Var->isInvalidDecl())
7315       return StmtError();
7316   }
7317 
7318   // Transform the actual exception handler.
7319   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7320   if (Handler.isInvalid())
7321     return StmtError();
7322 
7323   if (!getDerived().AlwaysRebuild() && !Var &&
7324       Handler.get() == S->getHandlerBlock())
7325     return S;
7326 
7327   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7328 }
7329 
7330 template <typename Derived>
7331 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7332   // Transform the try block itself.
7333   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7334   if (TryBlock.isInvalid())
7335     return StmtError();
7336 
7337   // Transform the handlers.
7338   bool HandlerChanged = false;
7339   SmallVector<Stmt *, 8> Handlers;
7340   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7341     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7342     if (Handler.isInvalid())
7343       return StmtError();
7344 
7345     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7346     Handlers.push_back(Handler.getAs<Stmt>());
7347   }
7348 
7349   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7350       !HandlerChanged)
7351     return S;
7352 
7353   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7354                                         Handlers);
7355 }
7356 
7357 template<typename Derived>
7358 StmtResult
7359 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7360   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7361   if (Range.isInvalid())
7362     return StmtError();
7363 
7364   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7365   if (Begin.isInvalid())
7366     return StmtError();
7367   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7368   if (End.isInvalid())
7369     return StmtError();
7370 
7371   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7372   if (Cond.isInvalid())
7373     return StmtError();
7374   if (Cond.get())
7375     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7376   if (Cond.isInvalid())
7377     return StmtError();
7378   if (Cond.get())
7379     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7380 
7381   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7382   if (Inc.isInvalid())
7383     return StmtError();
7384   if (Inc.get())
7385     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7386 
7387   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7388   if (LoopVar.isInvalid())
7389     return StmtError();
7390 
7391   StmtResult NewStmt = S;
7392   if (getDerived().AlwaysRebuild() ||
7393       Range.get() != S->getRangeStmt() ||
7394       Begin.get() != S->getBeginStmt() ||
7395       End.get() != S->getEndStmt() ||
7396       Cond.get() != S->getCond() ||
7397       Inc.get() != S->getInc() ||
7398       LoopVar.get() != S->getLoopVarStmt()) {
7399     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7400                                                   S->getCoawaitLoc(),
7401                                                   S->getColonLoc(), Range.get(),
7402                                                   Begin.get(), End.get(),
7403                                                   Cond.get(),
7404                                                   Inc.get(), LoopVar.get(),
7405                                                   S->getRParenLoc());
7406     if (NewStmt.isInvalid())
7407       return StmtError();
7408   }
7409 
7410   StmtResult Body = getDerived().TransformStmt(S->getBody());
7411   if (Body.isInvalid())
7412     return StmtError();
7413 
7414   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7415   // it now so we have a new statement to attach the body to.
7416   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7417     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7418                                                   S->getCoawaitLoc(),
7419                                                   S->getColonLoc(), Range.get(),
7420                                                   Begin.get(), End.get(),
7421                                                   Cond.get(),
7422                                                   Inc.get(), LoopVar.get(),
7423                                                   S->getRParenLoc());
7424     if (NewStmt.isInvalid())
7425       return StmtError();
7426   }
7427 
7428   if (NewStmt.get() == S)
7429     return S;
7430 
7431   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7432 }
7433 
7434 template<typename Derived>
7435 StmtResult
7436 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7437                                                     MSDependentExistsStmt *S) {
7438   // Transform the nested-name-specifier, if any.
7439   NestedNameSpecifierLoc QualifierLoc;
7440   if (S->getQualifierLoc()) {
7441     QualifierLoc
7442       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7443     if (!QualifierLoc)
7444       return StmtError();
7445   }
7446 
7447   // Transform the declaration name.
7448   DeclarationNameInfo NameInfo = S->getNameInfo();
7449   if (NameInfo.getName()) {
7450     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7451     if (!NameInfo.getName())
7452       return StmtError();
7453   }
7454 
7455   // Check whether anything changed.
7456   if (!getDerived().AlwaysRebuild() &&
7457       QualifierLoc == S->getQualifierLoc() &&
7458       NameInfo.getName() == S->getNameInfo().getName())
7459     return S;
7460 
7461   // Determine whether this name exists, if we can.
7462   CXXScopeSpec SS;
7463   SS.Adopt(QualifierLoc);
7464   bool Dependent = false;
7465   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7466   case Sema::IER_Exists:
7467     if (S->isIfExists())
7468       break;
7469 
7470     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7471 
7472   case Sema::IER_DoesNotExist:
7473     if (S->isIfNotExists())
7474       break;
7475 
7476     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7477 
7478   case Sema::IER_Dependent:
7479     Dependent = true;
7480     break;
7481 
7482   case Sema::IER_Error:
7483     return StmtError();
7484   }
7485 
7486   // We need to continue with the instantiation, so do so now.
7487   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7488   if (SubStmt.isInvalid())
7489     return StmtError();
7490 
7491   // If we have resolved the name, just transform to the substatement.
7492   if (!Dependent)
7493     return SubStmt;
7494 
7495   // The name is still dependent, so build a dependent expression again.
7496   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7497                                                    S->isIfExists(),
7498                                                    QualifierLoc,
7499                                                    NameInfo,
7500                                                    SubStmt.get());
7501 }
7502 
7503 template<typename Derived>
7504 ExprResult
7505 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7506   NestedNameSpecifierLoc QualifierLoc;
7507   if (E->getQualifierLoc()) {
7508     QualifierLoc
7509     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7510     if (!QualifierLoc)
7511       return ExprError();
7512   }
7513 
7514   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7515     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7516   if (!PD)
7517     return ExprError();
7518 
7519   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7520   if (Base.isInvalid())
7521     return ExprError();
7522 
7523   return new (SemaRef.getASTContext())
7524       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7525                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7526                         QualifierLoc, E->getMemberLoc());
7527 }
7528 
7529 template <typename Derived>
7530 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7531     MSPropertySubscriptExpr *E) {
7532   auto BaseRes = getDerived().TransformExpr(E->getBase());
7533   if (BaseRes.isInvalid())
7534     return ExprError();
7535   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7536   if (IdxRes.isInvalid())
7537     return ExprError();
7538 
7539   if (!getDerived().AlwaysRebuild() &&
7540       BaseRes.get() == E->getBase() &&
7541       IdxRes.get() == E->getIdx())
7542     return E;
7543 
7544   return getDerived().RebuildArraySubscriptExpr(
7545       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7546 }
7547 
7548 template <typename Derived>
7549 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7550   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7551   if (TryBlock.isInvalid())
7552     return StmtError();
7553 
7554   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7555   if (Handler.isInvalid())
7556     return StmtError();
7557 
7558   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7559       Handler.get() == S->getHandler())
7560     return S;
7561 
7562   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7563                                         TryBlock.get(), Handler.get());
7564 }
7565 
7566 template <typename Derived>
7567 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7568   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7569   if (Block.isInvalid())
7570     return StmtError();
7571 
7572   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7573 }
7574 
7575 template <typename Derived>
7576 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7577   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7578   if (FilterExpr.isInvalid())
7579     return StmtError();
7580 
7581   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7582   if (Block.isInvalid())
7583     return StmtError();
7584 
7585   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7586                                            Block.get());
7587 }
7588 
7589 template <typename Derived>
7590 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7591   if (isa<SEHFinallyStmt>(Handler))
7592     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7593   else
7594     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7595 }
7596 
7597 template<typename Derived>
7598 StmtResult
7599 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7600   return S;
7601 }
7602 
7603 //===----------------------------------------------------------------------===//
7604 // OpenMP directive transformation
7605 //===----------------------------------------------------------------------===//
7606 template <typename Derived>
7607 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7608     OMPExecutableDirective *D) {
7609 
7610   // Transform the clauses
7611   llvm::SmallVector<OMPClause *, 16> TClauses;
7612   ArrayRef<OMPClause *> Clauses = D->clauses();
7613   TClauses.reserve(Clauses.size());
7614   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7615        I != E; ++I) {
7616     if (*I) {
7617       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7618       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7619       getDerived().getSema().EndOpenMPClause();
7620       if (Clause)
7621         TClauses.push_back(Clause);
7622     } else {
7623       TClauses.push_back(nullptr);
7624     }
7625   }
7626   StmtResult AssociatedStmt;
7627   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7628     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7629                                                   /*CurScope=*/nullptr);
7630     StmtResult Body;
7631     {
7632       Sema::CompoundScopeRAII CompoundScope(getSema());
7633       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7634       Body = getDerived().TransformStmt(CS);
7635     }
7636     AssociatedStmt =
7637         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7638     if (AssociatedStmt.isInvalid()) {
7639       return StmtError();
7640     }
7641   }
7642   if (TClauses.size() != Clauses.size()) {
7643     return StmtError();
7644   }
7645 
7646   // Transform directive name for 'omp critical' directive.
7647   DeclarationNameInfo DirName;
7648   if (D->getDirectiveKind() == OMPD_critical) {
7649     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7650     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7651   }
7652   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7653   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7654     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7655   } else if (D->getDirectiveKind() == OMPD_cancel) {
7656     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7657   }
7658 
7659   return getDerived().RebuildOMPExecutableDirective(
7660       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7661       AssociatedStmt.get(), D->getLocStart(), D->getLocEnd());
7662 }
7663 
7664 template <typename Derived>
7665 StmtResult
7666 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7667   DeclarationNameInfo DirName;
7668   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7669                                              D->getLocStart());
7670   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7671   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7672   return Res;
7673 }
7674 
7675 template <typename Derived>
7676 StmtResult
7677 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7678   DeclarationNameInfo DirName;
7679   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7680                                              D->getLocStart());
7681   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7682   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7683   return Res;
7684 }
7685 
7686 template <typename Derived>
7687 StmtResult
7688 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7689   DeclarationNameInfo DirName;
7690   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7691                                              D->getLocStart());
7692   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7693   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7694   return Res;
7695 }
7696 
7697 template <typename Derived>
7698 StmtResult
7699 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7700   DeclarationNameInfo DirName;
7701   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7702                                              D->getLocStart());
7703   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7704   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7705   return Res;
7706 }
7707 
7708 template <typename Derived>
7709 StmtResult
7710 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7711   DeclarationNameInfo DirName;
7712   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7713                                              D->getLocStart());
7714   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7715   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7716   return Res;
7717 }
7718 
7719 template <typename Derived>
7720 StmtResult
7721 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7722   DeclarationNameInfo DirName;
7723   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7724                                              D->getLocStart());
7725   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7726   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7727   return Res;
7728 }
7729 
7730 template <typename Derived>
7731 StmtResult
7732 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7733   DeclarationNameInfo DirName;
7734   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7735                                              D->getLocStart());
7736   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7737   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7738   return Res;
7739 }
7740 
7741 template <typename Derived>
7742 StmtResult
7743 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7744   DeclarationNameInfo DirName;
7745   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7746                                              D->getLocStart());
7747   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7748   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7749   return Res;
7750 }
7751 
7752 template <typename Derived>
7753 StmtResult
7754 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7755   getDerived().getSema().StartOpenMPDSABlock(
7756       OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart());
7757   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7758   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7759   return Res;
7760 }
7761 
7762 template <typename Derived>
7763 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7764     OMPParallelForDirective *D) {
7765   DeclarationNameInfo DirName;
7766   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7767                                              nullptr, D->getLocStart());
7768   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7769   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7770   return Res;
7771 }
7772 
7773 template <typename Derived>
7774 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7775     OMPParallelForSimdDirective *D) {
7776   DeclarationNameInfo DirName;
7777   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7778                                              nullptr, D->getLocStart());
7779   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7780   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7781   return Res;
7782 }
7783 
7784 template <typename Derived>
7785 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7786     OMPParallelSectionsDirective *D) {
7787   DeclarationNameInfo DirName;
7788   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7789                                              nullptr, D->getLocStart());
7790   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7791   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7792   return Res;
7793 }
7794 
7795 template <typename Derived>
7796 StmtResult
7797 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7798   DeclarationNameInfo DirName;
7799   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7800                                              D->getLocStart());
7801   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7802   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7803   return Res;
7804 }
7805 
7806 template <typename Derived>
7807 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7808     OMPTaskyieldDirective *D) {
7809   DeclarationNameInfo DirName;
7810   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7811                                              D->getLocStart());
7812   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7813   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7814   return Res;
7815 }
7816 
7817 template <typename Derived>
7818 StmtResult
7819 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7820   DeclarationNameInfo DirName;
7821   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7822                                              D->getLocStart());
7823   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7824   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7825   return Res;
7826 }
7827 
7828 template <typename Derived>
7829 StmtResult
7830 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7831   DeclarationNameInfo DirName;
7832   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7833                                              D->getLocStart());
7834   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7835   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7836   return Res;
7837 }
7838 
7839 template <typename Derived>
7840 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7841     OMPTaskgroupDirective *D) {
7842   DeclarationNameInfo DirName;
7843   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7844                                              D->getLocStart());
7845   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7846   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7847   return Res;
7848 }
7849 
7850 template <typename Derived>
7851 StmtResult
7852 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7853   DeclarationNameInfo DirName;
7854   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7855                                              D->getLocStart());
7856   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7857   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7858   return Res;
7859 }
7860 
7861 template <typename Derived>
7862 StmtResult
7863 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7864   DeclarationNameInfo DirName;
7865   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7866                                              D->getLocStart());
7867   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7868   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7869   return Res;
7870 }
7871 
7872 template <typename Derived>
7873 StmtResult
7874 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
7875   DeclarationNameInfo DirName;
7876   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
7877                                              D->getLocStart());
7878   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7879   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7880   return Res;
7881 }
7882 
7883 template <typename Derived>
7884 StmtResult
7885 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
7886   DeclarationNameInfo DirName;
7887   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
7888                                              D->getLocStart());
7889   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7890   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7891   return Res;
7892 }
7893 
7894 template <typename Derived>
7895 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
7896     OMPTargetDataDirective *D) {
7897   DeclarationNameInfo DirName;
7898   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
7899                                              D->getLocStart());
7900   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7901   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7902   return Res;
7903 }
7904 
7905 template <typename Derived>
7906 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
7907     OMPTargetEnterDataDirective *D) {
7908   DeclarationNameInfo DirName;
7909   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
7910                                              nullptr, D->getLocStart());
7911   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7912   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7913   return Res;
7914 }
7915 
7916 template <typename Derived>
7917 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
7918     OMPTargetExitDataDirective *D) {
7919   DeclarationNameInfo DirName;
7920   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
7921                                              nullptr, D->getLocStart());
7922   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7923   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7924   return Res;
7925 }
7926 
7927 template <typename Derived>
7928 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
7929     OMPTargetParallelDirective *D) {
7930   DeclarationNameInfo DirName;
7931   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
7932                                              nullptr, D->getLocStart());
7933   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7934   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7935   return Res;
7936 }
7937 
7938 template <typename Derived>
7939 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
7940     OMPTargetParallelForDirective *D) {
7941   DeclarationNameInfo DirName;
7942   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
7943                                              nullptr, D->getLocStart());
7944   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7945   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7946   return Res;
7947 }
7948 
7949 template <typename Derived>
7950 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
7951     OMPTargetUpdateDirective *D) {
7952   DeclarationNameInfo DirName;
7953   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
7954                                              nullptr, D->getLocStart());
7955   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7956   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7957   return Res;
7958 }
7959 
7960 template <typename Derived>
7961 StmtResult
7962 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
7963   DeclarationNameInfo DirName;
7964   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
7965                                              D->getLocStart());
7966   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7967   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7968   return Res;
7969 }
7970 
7971 template <typename Derived>
7972 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
7973     OMPCancellationPointDirective *D) {
7974   DeclarationNameInfo DirName;
7975   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
7976                                              nullptr, D->getLocStart());
7977   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7978   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7979   return Res;
7980 }
7981 
7982 template <typename Derived>
7983 StmtResult
7984 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
7985   DeclarationNameInfo DirName;
7986   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
7987                                              D->getLocStart());
7988   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7989   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7990   return Res;
7991 }
7992 
7993 template <typename Derived>
7994 StmtResult
7995 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
7996   DeclarationNameInfo DirName;
7997   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
7998                                              D->getLocStart());
7999   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8000   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8001   return Res;
8002 }
8003 
8004 template <typename Derived>
8005 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8006     OMPTaskLoopSimdDirective *D) {
8007   DeclarationNameInfo DirName;
8008   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8009                                              nullptr, D->getLocStart());
8010   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8011   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8012   return Res;
8013 }
8014 
8015 template <typename Derived>
8016 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8017     OMPDistributeDirective *D) {
8018   DeclarationNameInfo DirName;
8019   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8020                                              D->getLocStart());
8021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8023   return Res;
8024 }
8025 
8026 template <typename Derived>
8027 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8028     OMPDistributeParallelForDirective *D) {
8029   DeclarationNameInfo DirName;
8030   getDerived().getSema().StartOpenMPDSABlock(
8031       OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart());
8032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8034   return Res;
8035 }
8036 
8037 template <typename Derived>
8038 StmtResult
8039 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8040     OMPDistributeParallelForSimdDirective *D) {
8041   DeclarationNameInfo DirName;
8042   getDerived().getSema().StartOpenMPDSABlock(
8043       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8044   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8045   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8046   return Res;
8047 }
8048 
8049 template <typename Derived>
8050 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8051     OMPDistributeSimdDirective *D) {
8052   DeclarationNameInfo DirName;
8053   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8054                                              nullptr, D->getLocStart());
8055   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8056   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8057   return Res;
8058 }
8059 
8060 template <typename Derived>
8061 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8062     OMPTargetParallelForSimdDirective *D) {
8063   DeclarationNameInfo DirName;
8064   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd,
8065                                              DirName, nullptr,
8066                                              D->getLocStart());
8067   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8068   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8069   return Res;
8070 }
8071 
8072 template <typename Derived>
8073 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8074     OMPTargetSimdDirective *D) {
8075   DeclarationNameInfo DirName;
8076   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8077                                              D->getLocStart());
8078   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8079   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8080   return Res;
8081 }
8082 
8083 template <typename Derived>
8084 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8085     OMPTeamsDistributeDirective *D) {
8086   DeclarationNameInfo DirName;
8087   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8088                                              nullptr, D->getLocStart());
8089   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8090   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8091   return Res;
8092 }
8093 
8094 template <typename Derived>
8095 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8096     OMPTeamsDistributeSimdDirective *D) {
8097   DeclarationNameInfo DirName;
8098   getDerived().getSema().StartOpenMPDSABlock(
8099       OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8100   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8101   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8102   return Res;
8103 }
8104 
8105 template <typename Derived>
8106 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8107     OMPTeamsDistributeParallelForSimdDirective *D) {
8108   DeclarationNameInfo DirName;
8109   getDerived().getSema().StartOpenMPDSABlock(
8110       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart());
8111   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8112   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8113   return Res;
8114 }
8115 
8116 template <typename Derived>
8117 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8118     OMPTeamsDistributeParallelForDirective *D) {
8119   DeclarationNameInfo DirName;
8120   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for,
8121       DirName, nullptr, D->getLocStart());
8122   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8123   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8124   return Res;
8125 }
8126 
8127 template <typename Derived>
8128 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8129     OMPTargetTeamsDirective *D) {
8130   DeclarationNameInfo DirName;
8131   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8132                                              nullptr, D->getLocStart());
8133   auto Res = getDerived().TransformOMPExecutableDirective(D);
8134   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8135   return Res;
8136 }
8137 
8138 template <typename Derived>
8139 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8140     OMPTargetTeamsDistributeDirective *D) {
8141   DeclarationNameInfo DirName;
8142   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute,
8143       DirName, nullptr, D->getLocStart());
8144   auto Res = getDerived().TransformOMPExecutableDirective(D);
8145   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8146   return Res;
8147 }
8148 
8149 template <typename Derived>
8150 StmtResult
8151 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8152     OMPTargetTeamsDistributeParallelForDirective *D) {
8153   DeclarationNameInfo DirName;
8154   getDerived().getSema().StartOpenMPDSABlock(
8155       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8156       D->getLocStart());
8157   auto Res = getDerived().TransformOMPExecutableDirective(D);
8158   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8159   return Res;
8160 }
8161 
8162 template <typename Derived>
8163 StmtResult TreeTransform<Derived>::
8164     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8165         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8166   DeclarationNameInfo DirName;
8167   getDerived().getSema().StartOpenMPDSABlock(
8168       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8169       D->getLocStart());
8170   auto Res = getDerived().TransformOMPExecutableDirective(D);
8171   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8172   return Res;
8173 }
8174 
8175 template <typename Derived>
8176 StmtResult
8177 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8178     OMPTargetTeamsDistributeSimdDirective *D) {
8179   DeclarationNameInfo DirName;
8180   getDerived().getSema().StartOpenMPDSABlock(
8181       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart());
8182   auto Res = getDerived().TransformOMPExecutableDirective(D);
8183   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8184   return Res;
8185 }
8186 
8187 
8188 //===----------------------------------------------------------------------===//
8189 // OpenMP clause transformation
8190 //===----------------------------------------------------------------------===//
8191 template <typename Derived>
8192 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8193   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8194   if (Cond.isInvalid())
8195     return nullptr;
8196   return getDerived().RebuildOMPIfClause(
8197       C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(),
8198       C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd());
8199 }
8200 
8201 template <typename Derived>
8202 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8203   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8204   if (Cond.isInvalid())
8205     return nullptr;
8206   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(),
8207                                             C->getLParenLoc(), C->getLocEnd());
8208 }
8209 
8210 template <typename Derived>
8211 OMPClause *
8212 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8213   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8214   if (NumThreads.isInvalid())
8215     return nullptr;
8216   return getDerived().RebuildOMPNumThreadsClause(
8217       NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8218 }
8219 
8220 template <typename Derived>
8221 OMPClause *
8222 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8223   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8224   if (E.isInvalid())
8225     return nullptr;
8226   return getDerived().RebuildOMPSafelenClause(
8227       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8228 }
8229 
8230 template <typename Derived>
8231 OMPClause *
8232 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8233   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8234   if (E.isInvalid())
8235     return nullptr;
8236   return getDerived().RebuildOMPSimdlenClause(
8237       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8238 }
8239 
8240 template <typename Derived>
8241 OMPClause *
8242 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8243   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8244   if (E.isInvalid())
8245     return nullptr;
8246   return getDerived().RebuildOMPCollapseClause(
8247       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8248 }
8249 
8250 template <typename Derived>
8251 OMPClause *
8252 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8253   return getDerived().RebuildOMPDefaultClause(
8254       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(),
8255       C->getLParenLoc(), C->getLocEnd());
8256 }
8257 
8258 template <typename Derived>
8259 OMPClause *
8260 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8261   return getDerived().RebuildOMPProcBindClause(
8262       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(),
8263       C->getLParenLoc(), C->getLocEnd());
8264 }
8265 
8266 template <typename Derived>
8267 OMPClause *
8268 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8269   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8270   if (E.isInvalid())
8271     return nullptr;
8272   return getDerived().RebuildOMPScheduleClause(
8273       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8274       C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8275       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8276       C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8277 }
8278 
8279 template <typename Derived>
8280 OMPClause *
8281 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8282   ExprResult E;
8283   if (auto *Num = C->getNumForLoops()) {
8284     E = getDerived().TransformExpr(Num);
8285     if (E.isInvalid())
8286       return nullptr;
8287   }
8288   return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(),
8289                                               C->getLParenLoc(), E.get());
8290 }
8291 
8292 template <typename Derived>
8293 OMPClause *
8294 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8295   // No need to rebuild this clause, no template-dependent parameters.
8296   return C;
8297 }
8298 
8299 template <typename Derived>
8300 OMPClause *
8301 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8302   // No need to rebuild this clause, no template-dependent parameters.
8303   return C;
8304 }
8305 
8306 template <typename Derived>
8307 OMPClause *
8308 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8309   // No need to rebuild this clause, no template-dependent parameters.
8310   return C;
8311 }
8312 
8313 template <typename Derived>
8314 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8315   // No need to rebuild this clause, no template-dependent parameters.
8316   return C;
8317 }
8318 
8319 template <typename Derived>
8320 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8321   // No need to rebuild this clause, no template-dependent parameters.
8322   return C;
8323 }
8324 
8325 template <typename Derived>
8326 OMPClause *
8327 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8328   // No need to rebuild this clause, no template-dependent parameters.
8329   return C;
8330 }
8331 
8332 template <typename Derived>
8333 OMPClause *
8334 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8335   // No need to rebuild this clause, no template-dependent parameters.
8336   return C;
8337 }
8338 
8339 template <typename Derived>
8340 OMPClause *
8341 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8342   // No need to rebuild this clause, no template-dependent parameters.
8343   return C;
8344 }
8345 
8346 template <typename Derived>
8347 OMPClause *
8348 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8349   // No need to rebuild this clause, no template-dependent parameters.
8350   return C;
8351 }
8352 
8353 template <typename Derived>
8354 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8355   // No need to rebuild this clause, no template-dependent parameters.
8356   return C;
8357 }
8358 
8359 template <typename Derived>
8360 OMPClause *
8361 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8362   // No need to rebuild this clause, no template-dependent parameters.
8363   return C;
8364 }
8365 
8366 template <typename Derived>
8367 OMPClause *
8368 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8369   llvm::SmallVector<Expr *, 16> Vars;
8370   Vars.reserve(C->varlist_size());
8371   for (auto *VE : C->varlists()) {
8372     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8373     if (EVar.isInvalid())
8374       return nullptr;
8375     Vars.push_back(EVar.get());
8376   }
8377   return getDerived().RebuildOMPPrivateClause(
8378       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8379 }
8380 
8381 template <typename Derived>
8382 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8383     OMPFirstprivateClause *C) {
8384   llvm::SmallVector<Expr *, 16> Vars;
8385   Vars.reserve(C->varlist_size());
8386   for (auto *VE : C->varlists()) {
8387     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8388     if (EVar.isInvalid())
8389       return nullptr;
8390     Vars.push_back(EVar.get());
8391   }
8392   return getDerived().RebuildOMPFirstprivateClause(
8393       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8394 }
8395 
8396 template <typename Derived>
8397 OMPClause *
8398 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8399   llvm::SmallVector<Expr *, 16> Vars;
8400   Vars.reserve(C->varlist_size());
8401   for (auto *VE : C->varlists()) {
8402     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8403     if (EVar.isInvalid())
8404       return nullptr;
8405     Vars.push_back(EVar.get());
8406   }
8407   return getDerived().RebuildOMPLastprivateClause(
8408       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8409 }
8410 
8411 template <typename Derived>
8412 OMPClause *
8413 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8414   llvm::SmallVector<Expr *, 16> Vars;
8415   Vars.reserve(C->varlist_size());
8416   for (auto *VE : C->varlists()) {
8417     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8418     if (EVar.isInvalid())
8419       return nullptr;
8420     Vars.push_back(EVar.get());
8421   }
8422   return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(),
8423                                              C->getLParenLoc(), C->getLocEnd());
8424 }
8425 
8426 template <typename Derived>
8427 OMPClause *
8428 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8429   llvm::SmallVector<Expr *, 16> Vars;
8430   Vars.reserve(C->varlist_size());
8431   for (auto *VE : C->varlists()) {
8432     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8433     if (EVar.isInvalid())
8434       return nullptr;
8435     Vars.push_back(EVar.get());
8436   }
8437   CXXScopeSpec ReductionIdScopeSpec;
8438   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8439 
8440   DeclarationNameInfo NameInfo = C->getNameInfo();
8441   if (NameInfo.getName()) {
8442     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8443     if (!NameInfo.getName())
8444       return nullptr;
8445   }
8446   // Build a list of all UDR decls with the same names ranged by the Scopes.
8447   // The Scope boundary is a duplication of the previous decl.
8448   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8449   for (auto *E : C->reduction_ops()) {
8450     // Transform all the decls.
8451     if (E) {
8452       auto *ULE = cast<UnresolvedLookupExpr>(E);
8453       UnresolvedSet<8> Decls;
8454       for (auto *D : ULE->decls()) {
8455         NamedDecl *InstD =
8456             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8457         Decls.addDecl(InstD, InstD->getAccess());
8458       }
8459       UnresolvedReductions.push_back(
8460        UnresolvedLookupExpr::Create(
8461           SemaRef.Context, /*NamingClass=*/nullptr,
8462           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8463           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8464           Decls.begin(), Decls.end()));
8465     } else
8466       UnresolvedReductions.push_back(nullptr);
8467   }
8468   return getDerived().RebuildOMPReductionClause(
8469       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8470       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8471 }
8472 
8473 template <typename Derived>
8474 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8475     OMPTaskReductionClause *C) {
8476   llvm::SmallVector<Expr *, 16> Vars;
8477   Vars.reserve(C->varlist_size());
8478   for (auto *VE : C->varlists()) {
8479     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8480     if (EVar.isInvalid())
8481       return nullptr;
8482     Vars.push_back(EVar.get());
8483   }
8484   CXXScopeSpec ReductionIdScopeSpec;
8485   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8486 
8487   DeclarationNameInfo NameInfo = C->getNameInfo();
8488   if (NameInfo.getName()) {
8489     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8490     if (!NameInfo.getName())
8491       return nullptr;
8492   }
8493   // Build a list of all UDR decls with the same names ranged by the Scopes.
8494   // The Scope boundary is a duplication of the previous decl.
8495   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8496   for (auto *E : C->reduction_ops()) {
8497     // Transform all the decls.
8498     if (E) {
8499       auto *ULE = cast<UnresolvedLookupExpr>(E);
8500       UnresolvedSet<8> Decls;
8501       for (auto *D : ULE->decls()) {
8502         NamedDecl *InstD =
8503             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8504         Decls.addDecl(InstD, InstD->getAccess());
8505       }
8506       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8507           SemaRef.Context, /*NamingClass=*/nullptr,
8508           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8509           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8510     } else
8511       UnresolvedReductions.push_back(nullptr);
8512   }
8513   return getDerived().RebuildOMPTaskReductionClause(
8514       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8515       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8516 }
8517 
8518 template <typename Derived>
8519 OMPClause *
8520 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8521   llvm::SmallVector<Expr *, 16> Vars;
8522   Vars.reserve(C->varlist_size());
8523   for (auto *VE : C->varlists()) {
8524     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8525     if (EVar.isInvalid())
8526       return nullptr;
8527     Vars.push_back(EVar.get());
8528   }
8529   CXXScopeSpec ReductionIdScopeSpec;
8530   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8531 
8532   DeclarationNameInfo NameInfo = C->getNameInfo();
8533   if (NameInfo.getName()) {
8534     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8535     if (!NameInfo.getName())
8536       return nullptr;
8537   }
8538   // Build a list of all UDR decls with the same names ranged by the Scopes.
8539   // The Scope boundary is a duplication of the previous decl.
8540   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8541   for (auto *E : C->reduction_ops()) {
8542     // Transform all the decls.
8543     if (E) {
8544       auto *ULE = cast<UnresolvedLookupExpr>(E);
8545       UnresolvedSet<8> Decls;
8546       for (auto *D : ULE->decls()) {
8547         NamedDecl *InstD =
8548             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8549         Decls.addDecl(InstD, InstD->getAccess());
8550       }
8551       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8552           SemaRef.Context, /*NamingClass=*/nullptr,
8553           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8554           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8555     } else
8556       UnresolvedReductions.push_back(nullptr);
8557   }
8558   return getDerived().RebuildOMPInReductionClause(
8559       Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(),
8560       C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8561 }
8562 
8563 template <typename Derived>
8564 OMPClause *
8565 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8566   llvm::SmallVector<Expr *, 16> Vars;
8567   Vars.reserve(C->varlist_size());
8568   for (auto *VE : C->varlists()) {
8569     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8570     if (EVar.isInvalid())
8571       return nullptr;
8572     Vars.push_back(EVar.get());
8573   }
8574   ExprResult Step = getDerived().TransformExpr(C->getStep());
8575   if (Step.isInvalid())
8576     return nullptr;
8577   return getDerived().RebuildOMPLinearClause(
8578       Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(),
8579       C->getModifierLoc(), C->getColonLoc(), C->getLocEnd());
8580 }
8581 
8582 template <typename Derived>
8583 OMPClause *
8584 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8585   llvm::SmallVector<Expr *, 16> Vars;
8586   Vars.reserve(C->varlist_size());
8587   for (auto *VE : C->varlists()) {
8588     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8589     if (EVar.isInvalid())
8590       return nullptr;
8591     Vars.push_back(EVar.get());
8592   }
8593   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8594   if (Alignment.isInvalid())
8595     return nullptr;
8596   return getDerived().RebuildOMPAlignedClause(
8597       Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(),
8598       C->getColonLoc(), C->getLocEnd());
8599 }
8600 
8601 template <typename Derived>
8602 OMPClause *
8603 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8604   llvm::SmallVector<Expr *, 16> Vars;
8605   Vars.reserve(C->varlist_size());
8606   for (auto *VE : C->varlists()) {
8607     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8608     if (EVar.isInvalid())
8609       return nullptr;
8610     Vars.push_back(EVar.get());
8611   }
8612   return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(),
8613                                              C->getLParenLoc(), C->getLocEnd());
8614 }
8615 
8616 template <typename Derived>
8617 OMPClause *
8618 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8619   llvm::SmallVector<Expr *, 16> Vars;
8620   Vars.reserve(C->varlist_size());
8621   for (auto *VE : C->varlists()) {
8622     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8623     if (EVar.isInvalid())
8624       return nullptr;
8625     Vars.push_back(EVar.get());
8626   }
8627   return getDerived().RebuildOMPCopyprivateClause(
8628       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8629 }
8630 
8631 template <typename Derived>
8632 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8633   llvm::SmallVector<Expr *, 16> Vars;
8634   Vars.reserve(C->varlist_size());
8635   for (auto *VE : C->varlists()) {
8636     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8637     if (EVar.isInvalid())
8638       return nullptr;
8639     Vars.push_back(EVar.get());
8640   }
8641   return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(),
8642                                             C->getLParenLoc(), C->getLocEnd());
8643 }
8644 
8645 template <typename Derived>
8646 OMPClause *
8647 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8648   llvm::SmallVector<Expr *, 16> Vars;
8649   Vars.reserve(C->varlist_size());
8650   for (auto *VE : C->varlists()) {
8651     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8652     if (EVar.isInvalid())
8653       return nullptr;
8654     Vars.push_back(EVar.get());
8655   }
8656   return getDerived().RebuildOMPDependClause(
8657       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8658       C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8659 }
8660 
8661 template <typename Derived>
8662 OMPClause *
8663 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8664   ExprResult E = getDerived().TransformExpr(C->getDevice());
8665   if (E.isInvalid())
8666     return nullptr;
8667   return getDerived().RebuildOMPDeviceClause(
8668       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8669 }
8670 
8671 template <typename Derived>
8672 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8673   llvm::SmallVector<Expr *, 16> Vars;
8674   Vars.reserve(C->varlist_size());
8675   for (auto *VE : C->varlists()) {
8676     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8677     if (EVar.isInvalid())
8678       return nullptr;
8679     Vars.push_back(EVar.get());
8680   }
8681   return getDerived().RebuildOMPMapClause(
8682       C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(),
8683       C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(),
8684       C->getLParenLoc(), C->getLocEnd());
8685 }
8686 
8687 template <typename Derived>
8688 OMPClause *
8689 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8690   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8691   if (E.isInvalid())
8692     return nullptr;
8693   return getDerived().RebuildOMPNumTeamsClause(
8694       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8695 }
8696 
8697 template <typename Derived>
8698 OMPClause *
8699 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8700   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8701   if (E.isInvalid())
8702     return nullptr;
8703   return getDerived().RebuildOMPThreadLimitClause(
8704       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8705 }
8706 
8707 template <typename Derived>
8708 OMPClause *
8709 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8710   ExprResult E = getDerived().TransformExpr(C->getPriority());
8711   if (E.isInvalid())
8712     return nullptr;
8713   return getDerived().RebuildOMPPriorityClause(
8714       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8715 }
8716 
8717 template <typename Derived>
8718 OMPClause *
8719 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8720   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8721   if (E.isInvalid())
8722     return nullptr;
8723   return getDerived().RebuildOMPGrainsizeClause(
8724       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8725 }
8726 
8727 template <typename Derived>
8728 OMPClause *
8729 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8730   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8731   if (E.isInvalid())
8732     return nullptr;
8733   return getDerived().RebuildOMPNumTasksClause(
8734       E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8735 }
8736 
8737 template <typename Derived>
8738 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8739   ExprResult E = getDerived().TransformExpr(C->getHint());
8740   if (E.isInvalid())
8741     return nullptr;
8742   return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(),
8743                                            C->getLParenLoc(), C->getLocEnd());
8744 }
8745 
8746 template <typename Derived>
8747 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8748     OMPDistScheduleClause *C) {
8749   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8750   if (E.isInvalid())
8751     return nullptr;
8752   return getDerived().RebuildOMPDistScheduleClause(
8753       C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(),
8754       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd());
8755 }
8756 
8757 template <typename Derived>
8758 OMPClause *
8759 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8760   return C;
8761 }
8762 
8763 template <typename Derived>
8764 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8765   llvm::SmallVector<Expr *, 16> Vars;
8766   Vars.reserve(C->varlist_size());
8767   for (auto *VE : C->varlists()) {
8768     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8769     if (EVar.isInvalid())
8770       return 0;
8771     Vars.push_back(EVar.get());
8772   }
8773   return getDerived().RebuildOMPToClause(Vars, C->getLocStart(),
8774                                          C->getLParenLoc(), C->getLocEnd());
8775 }
8776 
8777 template <typename Derived>
8778 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
8779   llvm::SmallVector<Expr *, 16> Vars;
8780   Vars.reserve(C->varlist_size());
8781   for (auto *VE : C->varlists()) {
8782     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8783     if (EVar.isInvalid())
8784       return 0;
8785     Vars.push_back(EVar.get());
8786   }
8787   return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(),
8788                                            C->getLParenLoc(), C->getLocEnd());
8789 }
8790 
8791 template <typename Derived>
8792 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
8793     OMPUseDevicePtrClause *C) {
8794   llvm::SmallVector<Expr *, 16> Vars;
8795   Vars.reserve(C->varlist_size());
8796   for (auto *VE : C->varlists()) {
8797     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8798     if (EVar.isInvalid())
8799       return nullptr;
8800     Vars.push_back(EVar.get());
8801   }
8802   return getDerived().RebuildOMPUseDevicePtrClause(
8803       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8804 }
8805 
8806 template <typename Derived>
8807 OMPClause *
8808 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
8809   llvm::SmallVector<Expr *, 16> Vars;
8810   Vars.reserve(C->varlist_size());
8811   for (auto *VE : C->varlists()) {
8812     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8813     if (EVar.isInvalid())
8814       return nullptr;
8815     Vars.push_back(EVar.get());
8816   }
8817   return getDerived().RebuildOMPIsDevicePtrClause(
8818       Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd());
8819 }
8820 
8821 //===----------------------------------------------------------------------===//
8822 // Expression transformation
8823 //===----------------------------------------------------------------------===//
8824 template<typename Derived>
8825 ExprResult
8826 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
8827   if (!E->isTypeDependent())
8828     return E;
8829 
8830   return getDerived().RebuildPredefinedExpr(E->getLocation(),
8831                                             E->getIdentType());
8832 }
8833 
8834 template<typename Derived>
8835 ExprResult
8836 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
8837   NestedNameSpecifierLoc QualifierLoc;
8838   if (E->getQualifierLoc()) {
8839     QualifierLoc
8840       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8841     if (!QualifierLoc)
8842       return ExprError();
8843   }
8844 
8845   ValueDecl *ND
8846     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
8847                                                          E->getDecl()));
8848   if (!ND)
8849     return ExprError();
8850 
8851   DeclarationNameInfo NameInfo = E->getNameInfo();
8852   if (NameInfo.getName()) {
8853     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8854     if (!NameInfo.getName())
8855       return ExprError();
8856   }
8857 
8858   if (!getDerived().AlwaysRebuild() &&
8859       QualifierLoc == E->getQualifierLoc() &&
8860       ND == E->getDecl() &&
8861       NameInfo.getName() == E->getDecl()->getDeclName() &&
8862       !E->hasExplicitTemplateArgs()) {
8863 
8864     // Mark it referenced in the new context regardless.
8865     // FIXME: this is a bit instantiation-specific.
8866     SemaRef.MarkDeclRefReferenced(E);
8867 
8868     return E;
8869   }
8870 
8871   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
8872   if (E->hasExplicitTemplateArgs()) {
8873     TemplateArgs = &TransArgs;
8874     TransArgs.setLAngleLoc(E->getLAngleLoc());
8875     TransArgs.setRAngleLoc(E->getRAngleLoc());
8876     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
8877                                                 E->getNumTemplateArgs(),
8878                                                 TransArgs))
8879       return ExprError();
8880   }
8881 
8882   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
8883                                          TemplateArgs);
8884 }
8885 
8886 template<typename Derived>
8887 ExprResult
8888 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
8889   return E;
8890 }
8891 
8892 template<typename Derived>
8893 ExprResult
8894 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
8895   return E;
8896 }
8897 
8898 template<typename Derived>
8899 ExprResult
8900 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
8901   return E;
8902 }
8903 
8904 template<typename Derived>
8905 ExprResult
8906 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
8907   return E;
8908 }
8909 
8910 template<typename Derived>
8911 ExprResult
8912 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
8913   return E;
8914 }
8915 
8916 template<typename Derived>
8917 ExprResult
8918 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
8919   if (FunctionDecl *FD = E->getDirectCallee())
8920     SemaRef.MarkFunctionReferenced(E->getLocStart(), FD);
8921   return SemaRef.MaybeBindToTemporary(E);
8922 }
8923 
8924 template<typename Derived>
8925 ExprResult
8926 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
8927   ExprResult ControllingExpr =
8928     getDerived().TransformExpr(E->getControllingExpr());
8929   if (ControllingExpr.isInvalid())
8930     return ExprError();
8931 
8932   SmallVector<Expr *, 4> AssocExprs;
8933   SmallVector<TypeSourceInfo *, 4> AssocTypes;
8934   for (unsigned i = 0; i != E->getNumAssocs(); ++i) {
8935     TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i);
8936     if (TS) {
8937       TypeSourceInfo *AssocType = getDerived().TransformType(TS);
8938       if (!AssocType)
8939         return ExprError();
8940       AssocTypes.push_back(AssocType);
8941     } else {
8942       AssocTypes.push_back(nullptr);
8943     }
8944 
8945     ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i));
8946     if (AssocExpr.isInvalid())
8947       return ExprError();
8948     AssocExprs.push_back(AssocExpr.get());
8949   }
8950 
8951   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
8952                                                   E->getDefaultLoc(),
8953                                                   E->getRParenLoc(),
8954                                                   ControllingExpr.get(),
8955                                                   AssocTypes,
8956                                                   AssocExprs);
8957 }
8958 
8959 template<typename Derived>
8960 ExprResult
8961 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
8962   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
8963   if (SubExpr.isInvalid())
8964     return ExprError();
8965 
8966   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8967     return E;
8968 
8969   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
8970                                        E->getRParen());
8971 }
8972 
8973 /// \brief The operand of a unary address-of operator has special rules: it's
8974 /// allowed to refer to a non-static member of a class even if there's no 'this'
8975 /// object available.
8976 template<typename Derived>
8977 ExprResult
8978 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
8979   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
8980     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
8981   else
8982     return getDerived().TransformExpr(E);
8983 }
8984 
8985 template<typename Derived>
8986 ExprResult
8987 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
8988   ExprResult SubExpr;
8989   if (E->getOpcode() == UO_AddrOf)
8990     SubExpr = TransformAddressOfOperand(E->getSubExpr());
8991   else
8992     SubExpr = TransformExpr(E->getSubExpr());
8993   if (SubExpr.isInvalid())
8994     return ExprError();
8995 
8996   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
8997     return E;
8998 
8999   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9000                                            E->getOpcode(),
9001                                            SubExpr.get());
9002 }
9003 
9004 template<typename Derived>
9005 ExprResult
9006 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9007   // Transform the type.
9008   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9009   if (!Type)
9010     return ExprError();
9011 
9012   // Transform all of the components into components similar to what the
9013   // parser uses.
9014   // FIXME: It would be slightly more efficient in the non-dependent case to
9015   // just map FieldDecls, rather than requiring the rebuilder to look for
9016   // the fields again. However, __builtin_offsetof is rare enough in
9017   // template code that we don't care.
9018   bool ExprChanged = false;
9019   typedef Sema::OffsetOfComponent Component;
9020   SmallVector<Component, 4> Components;
9021   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9022     const OffsetOfNode &ON = E->getComponent(I);
9023     Component Comp;
9024     Comp.isBrackets = true;
9025     Comp.LocStart = ON.getSourceRange().getBegin();
9026     Comp.LocEnd = ON.getSourceRange().getEnd();
9027     switch (ON.getKind()) {
9028     case OffsetOfNode::Array: {
9029       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9030       ExprResult Index = getDerived().TransformExpr(FromIndex);
9031       if (Index.isInvalid())
9032         return ExprError();
9033 
9034       ExprChanged = ExprChanged || Index.get() != FromIndex;
9035       Comp.isBrackets = true;
9036       Comp.U.E = Index.get();
9037       break;
9038     }
9039 
9040     case OffsetOfNode::Field:
9041     case OffsetOfNode::Identifier:
9042       Comp.isBrackets = false;
9043       Comp.U.IdentInfo = ON.getFieldName();
9044       if (!Comp.U.IdentInfo)
9045         continue;
9046 
9047       break;
9048 
9049     case OffsetOfNode::Base:
9050       // Will be recomputed during the rebuild.
9051       continue;
9052     }
9053 
9054     Components.push_back(Comp);
9055   }
9056 
9057   // If nothing changed, retain the existing expression.
9058   if (!getDerived().AlwaysRebuild() &&
9059       Type == E->getTypeSourceInfo() &&
9060       !ExprChanged)
9061     return E;
9062 
9063   // Build a new offsetof expression.
9064   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9065                                           Components, E->getRParenLoc());
9066 }
9067 
9068 template<typename Derived>
9069 ExprResult
9070 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9071   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9072          "opaque value expression requires transformation");
9073   return E;
9074 }
9075 
9076 template<typename Derived>
9077 ExprResult
9078 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9079   return E;
9080 }
9081 
9082 template<typename Derived>
9083 ExprResult
9084 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9085   // Rebuild the syntactic form.  The original syntactic form has
9086   // opaque-value expressions in it, so strip those away and rebuild
9087   // the result.  This is a really awful way of doing this, but the
9088   // better solution (rebuilding the semantic expressions and
9089   // rebinding OVEs as necessary) doesn't work; we'd need
9090   // TreeTransform to not strip away implicit conversions.
9091   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9092   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9093   if (result.isInvalid()) return ExprError();
9094 
9095   // If that gives us a pseudo-object result back, the pseudo-object
9096   // expression must have been an lvalue-to-rvalue conversion which we
9097   // should reapply.
9098   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9099     result = SemaRef.checkPseudoObjectRValue(result.get());
9100 
9101   return result;
9102 }
9103 
9104 template<typename Derived>
9105 ExprResult
9106 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9107                                                 UnaryExprOrTypeTraitExpr *E) {
9108   if (E->isArgumentType()) {
9109     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9110 
9111     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9112     if (!NewT)
9113       return ExprError();
9114 
9115     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9116       return E;
9117 
9118     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9119                                                     E->getKind(),
9120                                                     E->getSourceRange());
9121   }
9122 
9123   // C++0x [expr.sizeof]p1:
9124   //   The operand is either an expression, which is an unevaluated operand
9125   //   [...]
9126   EnterExpressionEvaluationContext Unevaluated(
9127       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9128       Sema::ReuseLambdaContextDecl);
9129 
9130   // Try to recover if we have something like sizeof(T::X) where X is a type.
9131   // Notably, there must be *exactly* one set of parens if X is a type.
9132   TypeSourceInfo *RecoveryTSI = nullptr;
9133   ExprResult SubExpr;
9134   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9135   if (auto *DRE =
9136           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9137     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9138         PE, DRE, false, &RecoveryTSI);
9139   else
9140     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9141 
9142   if (RecoveryTSI) {
9143     return getDerived().RebuildUnaryExprOrTypeTrait(
9144         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9145   } else if (SubExpr.isInvalid())
9146     return ExprError();
9147 
9148   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9149     return E;
9150 
9151   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9152                                                   E->getOperatorLoc(),
9153                                                   E->getKind(),
9154                                                   E->getSourceRange());
9155 }
9156 
9157 template<typename Derived>
9158 ExprResult
9159 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9160   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9161   if (LHS.isInvalid())
9162     return ExprError();
9163 
9164   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9165   if (RHS.isInvalid())
9166     return ExprError();
9167 
9168 
9169   if (!getDerived().AlwaysRebuild() &&
9170       LHS.get() == E->getLHS() &&
9171       RHS.get() == E->getRHS())
9172     return E;
9173 
9174   return getDerived().RebuildArraySubscriptExpr(LHS.get(),
9175                                            /*FIXME:*/E->getLHS()->getLocStart(),
9176                                                 RHS.get(),
9177                                                 E->getRBracketLoc());
9178 }
9179 
9180 template <typename Derived>
9181 ExprResult
9182 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9183   ExprResult Base = getDerived().TransformExpr(E->getBase());
9184   if (Base.isInvalid())
9185     return ExprError();
9186 
9187   ExprResult LowerBound;
9188   if (E->getLowerBound()) {
9189     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9190     if (LowerBound.isInvalid())
9191       return ExprError();
9192   }
9193 
9194   ExprResult Length;
9195   if (E->getLength()) {
9196     Length = getDerived().TransformExpr(E->getLength());
9197     if (Length.isInvalid())
9198       return ExprError();
9199   }
9200 
9201   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9202       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9203     return E;
9204 
9205   return getDerived().RebuildOMPArraySectionExpr(
9206       Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(),
9207       Length.get(), E->getRBracketLoc());
9208 }
9209 
9210 template<typename Derived>
9211 ExprResult
9212 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9213   // Transform the callee.
9214   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9215   if (Callee.isInvalid())
9216     return ExprError();
9217 
9218   // Transform arguments.
9219   bool ArgChanged = false;
9220   SmallVector<Expr*, 8> Args;
9221   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9222                                   &ArgChanged))
9223     return ExprError();
9224 
9225   if (!getDerived().AlwaysRebuild() &&
9226       Callee.get() == E->getCallee() &&
9227       !ArgChanged)
9228     return SemaRef.MaybeBindToTemporary(E);
9229 
9230   // FIXME: Wrong source location information for the '('.
9231   SourceLocation FakeLParenLoc
9232     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9233   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9234                                       Args,
9235                                       E->getRParenLoc());
9236 }
9237 
9238 template<typename Derived>
9239 ExprResult
9240 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9241   ExprResult Base = getDerived().TransformExpr(E->getBase());
9242   if (Base.isInvalid())
9243     return ExprError();
9244 
9245   NestedNameSpecifierLoc QualifierLoc;
9246   if (E->hasQualifier()) {
9247     QualifierLoc
9248       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9249 
9250     if (!QualifierLoc)
9251       return ExprError();
9252   }
9253   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9254 
9255   ValueDecl *Member
9256     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9257                                                          E->getMemberDecl()));
9258   if (!Member)
9259     return ExprError();
9260 
9261   NamedDecl *FoundDecl = E->getFoundDecl();
9262   if (FoundDecl == E->getMemberDecl()) {
9263     FoundDecl = Member;
9264   } else {
9265     FoundDecl = cast_or_null<NamedDecl>(
9266                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9267     if (!FoundDecl)
9268       return ExprError();
9269   }
9270 
9271   if (!getDerived().AlwaysRebuild() &&
9272       Base.get() == E->getBase() &&
9273       QualifierLoc == E->getQualifierLoc() &&
9274       Member == E->getMemberDecl() &&
9275       FoundDecl == E->getFoundDecl() &&
9276       !E->hasExplicitTemplateArgs()) {
9277 
9278     // Mark it referenced in the new context regardless.
9279     // FIXME: this is a bit instantiation-specific.
9280     SemaRef.MarkMemberReferenced(E);
9281 
9282     return E;
9283   }
9284 
9285   TemplateArgumentListInfo TransArgs;
9286   if (E->hasExplicitTemplateArgs()) {
9287     TransArgs.setLAngleLoc(E->getLAngleLoc());
9288     TransArgs.setRAngleLoc(E->getRAngleLoc());
9289     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9290                                                 E->getNumTemplateArgs(),
9291                                                 TransArgs))
9292       return ExprError();
9293   }
9294 
9295   // FIXME: Bogus source location for the operator
9296   SourceLocation FakeOperatorLoc =
9297       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9298 
9299   // FIXME: to do this check properly, we will need to preserve the
9300   // first-qualifier-in-scope here, just in case we had a dependent
9301   // base (and therefore couldn't do the check) and a
9302   // nested-name-qualifier (and therefore could do the lookup).
9303   NamedDecl *FirstQualifierInScope = nullptr;
9304   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9305   if (MemberNameInfo.getName()) {
9306     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9307     if (!MemberNameInfo.getName())
9308       return ExprError();
9309   }
9310 
9311   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9312                                         E->isArrow(),
9313                                         QualifierLoc,
9314                                         TemplateKWLoc,
9315                                         MemberNameInfo,
9316                                         Member,
9317                                         FoundDecl,
9318                                         (E->hasExplicitTemplateArgs()
9319                                            ? &TransArgs : nullptr),
9320                                         FirstQualifierInScope);
9321 }
9322 
9323 template<typename Derived>
9324 ExprResult
9325 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9326   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9327   if (LHS.isInvalid())
9328     return ExprError();
9329 
9330   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9331   if (RHS.isInvalid())
9332     return ExprError();
9333 
9334   if (!getDerived().AlwaysRebuild() &&
9335       LHS.get() == E->getLHS() &&
9336       RHS.get() == E->getRHS())
9337     return E;
9338 
9339   Sema::FPContractStateRAII FPContractState(getSema());
9340   getSema().FPFeatures = E->getFPFeatures();
9341 
9342   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9343                                             LHS.get(), RHS.get());
9344 }
9345 
9346 template<typename Derived>
9347 ExprResult
9348 TreeTransform<Derived>::TransformCompoundAssignOperator(
9349                                                       CompoundAssignOperator *E) {
9350   return getDerived().TransformBinaryOperator(E);
9351 }
9352 
9353 template<typename Derived>
9354 ExprResult TreeTransform<Derived>::
9355 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9356   // Just rebuild the common and RHS expressions and see whether we
9357   // get any changes.
9358 
9359   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9360   if (commonExpr.isInvalid())
9361     return ExprError();
9362 
9363   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9364   if (rhs.isInvalid())
9365     return ExprError();
9366 
9367   if (!getDerived().AlwaysRebuild() &&
9368       commonExpr.get() == e->getCommon() &&
9369       rhs.get() == e->getFalseExpr())
9370     return e;
9371 
9372   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9373                                                  e->getQuestionLoc(),
9374                                                  nullptr,
9375                                                  e->getColonLoc(),
9376                                                  rhs.get());
9377 }
9378 
9379 template<typename Derived>
9380 ExprResult
9381 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9382   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9383   if (Cond.isInvalid())
9384     return ExprError();
9385 
9386   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9387   if (LHS.isInvalid())
9388     return ExprError();
9389 
9390   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9391   if (RHS.isInvalid())
9392     return ExprError();
9393 
9394   if (!getDerived().AlwaysRebuild() &&
9395       Cond.get() == E->getCond() &&
9396       LHS.get() == E->getLHS() &&
9397       RHS.get() == E->getRHS())
9398     return E;
9399 
9400   return getDerived().RebuildConditionalOperator(Cond.get(),
9401                                                  E->getQuestionLoc(),
9402                                                  LHS.get(),
9403                                                  E->getColonLoc(),
9404                                                  RHS.get());
9405 }
9406 
9407 template<typename Derived>
9408 ExprResult
9409 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9410   // Implicit casts are eliminated during transformation, since they
9411   // will be recomputed by semantic analysis after transformation.
9412   return getDerived().TransformExpr(E->getSubExprAsWritten());
9413 }
9414 
9415 template<typename Derived>
9416 ExprResult
9417 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9418   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9419   if (!Type)
9420     return ExprError();
9421 
9422   ExprResult SubExpr
9423     = getDerived().TransformExpr(E->getSubExprAsWritten());
9424   if (SubExpr.isInvalid())
9425     return ExprError();
9426 
9427   if (!getDerived().AlwaysRebuild() &&
9428       Type == E->getTypeInfoAsWritten() &&
9429       SubExpr.get() == E->getSubExpr())
9430     return E;
9431 
9432   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9433                                             Type,
9434                                             E->getRParenLoc(),
9435                                             SubExpr.get());
9436 }
9437 
9438 template<typename Derived>
9439 ExprResult
9440 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9441   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9442   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9443   if (!NewT)
9444     return ExprError();
9445 
9446   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9447   if (Init.isInvalid())
9448     return ExprError();
9449 
9450   if (!getDerived().AlwaysRebuild() &&
9451       OldT == NewT &&
9452       Init.get() == E->getInitializer())
9453     return SemaRef.MaybeBindToTemporary(E);
9454 
9455   // Note: the expression type doesn't necessarily match the
9456   // type-as-written, but that's okay, because it should always be
9457   // derivable from the initializer.
9458 
9459   return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT,
9460                                    /*FIXME:*/E->getInitializer()->getLocEnd(),
9461                                                  Init.get());
9462 }
9463 
9464 template<typename Derived>
9465 ExprResult
9466 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9467   ExprResult Base = getDerived().TransformExpr(E->getBase());
9468   if (Base.isInvalid())
9469     return ExprError();
9470 
9471   if (!getDerived().AlwaysRebuild() &&
9472       Base.get() == E->getBase())
9473     return E;
9474 
9475   // FIXME: Bad source location
9476   SourceLocation FakeOperatorLoc =
9477       SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd());
9478   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9479                                                   E->getAccessorLoc(),
9480                                                   E->getAccessor());
9481 }
9482 
9483 template<typename Derived>
9484 ExprResult
9485 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9486   if (InitListExpr *Syntactic = E->getSyntacticForm())
9487     E = Syntactic;
9488 
9489   bool InitChanged = false;
9490 
9491   SmallVector<Expr*, 4> Inits;
9492   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9493                                   Inits, &InitChanged))
9494     return ExprError();
9495 
9496   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9497     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9498     // in some cases. We can't reuse it in general, because the syntactic and
9499     // semantic forms are linked, and we can't know that semantic form will
9500     // match even if the syntactic form does.
9501   }
9502 
9503   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9504                                       E->getRBraceLoc());
9505 }
9506 
9507 template<typename Derived>
9508 ExprResult
9509 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9510   Designation Desig;
9511 
9512   // transform the initializer value
9513   ExprResult Init = getDerived().TransformExpr(E->getInit());
9514   if (Init.isInvalid())
9515     return ExprError();
9516 
9517   // transform the designators.
9518   SmallVector<Expr*, 4> ArrayExprs;
9519   bool ExprChanged = false;
9520   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9521     if (D.isFieldDesignator()) {
9522       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9523                                                D.getDotLoc(),
9524                                                D.getFieldLoc()));
9525       if (D.getField()) {
9526         FieldDecl *Field = cast_or_null<FieldDecl>(
9527             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9528         if (Field != D.getField())
9529           // Rebuild the expression when the transformed FieldDecl is
9530           // different to the already assigned FieldDecl.
9531           ExprChanged = true;
9532       } else {
9533         // Ensure that the designator expression is rebuilt when there isn't
9534         // a resolved FieldDecl in the designator as we don't want to assign
9535         // a FieldDecl to a pattern designator that will be instantiated again.
9536         ExprChanged = true;
9537       }
9538       continue;
9539     }
9540 
9541     if (D.isArrayDesignator()) {
9542       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9543       if (Index.isInvalid())
9544         return ExprError();
9545 
9546       Desig.AddDesignator(
9547           Designator::getArray(Index.get(), D.getLBracketLoc()));
9548 
9549       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9550       ArrayExprs.push_back(Index.get());
9551       continue;
9552     }
9553 
9554     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9555     ExprResult Start
9556       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9557     if (Start.isInvalid())
9558       return ExprError();
9559 
9560     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9561     if (End.isInvalid())
9562       return ExprError();
9563 
9564     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9565                                                   End.get(),
9566                                                   D.getLBracketLoc(),
9567                                                   D.getEllipsisLoc()));
9568 
9569     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9570                   End.get() != E->getArrayRangeEnd(D);
9571 
9572     ArrayExprs.push_back(Start.get());
9573     ArrayExprs.push_back(End.get());
9574   }
9575 
9576   if (!getDerived().AlwaysRebuild() &&
9577       Init.get() == E->getInit() &&
9578       !ExprChanged)
9579     return E;
9580 
9581   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9582                                                 E->getEqualOrColonLoc(),
9583                                                 E->usesGNUSyntax(), Init.get());
9584 }
9585 
9586 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9587 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9588 template<typename Derived>
9589 ExprResult
9590 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9591     DesignatedInitUpdateExpr *E) {
9592   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9593                    "initializer");
9594   return ExprError();
9595 }
9596 
9597 template<typename Derived>
9598 ExprResult
9599 TreeTransform<Derived>::TransformNoInitExpr(
9600     NoInitExpr *E) {
9601   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9602   return ExprError();
9603 }
9604 
9605 template<typename Derived>
9606 ExprResult
9607 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9608   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9609   return ExprError();
9610 }
9611 
9612 template<typename Derived>
9613 ExprResult
9614 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9615   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9616   return ExprError();
9617 }
9618 
9619 template<typename Derived>
9620 ExprResult
9621 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9622                                                      ImplicitValueInitExpr *E) {
9623   TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
9624 
9625   // FIXME: Will we ever have proper type location here? Will we actually
9626   // need to transform the type?
9627   QualType T = getDerived().TransformType(E->getType());
9628   if (T.isNull())
9629     return ExprError();
9630 
9631   if (!getDerived().AlwaysRebuild() &&
9632       T == E->getType())
9633     return E;
9634 
9635   return getDerived().RebuildImplicitValueInitExpr(T);
9636 }
9637 
9638 template<typename Derived>
9639 ExprResult
9640 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9641   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9642   if (!TInfo)
9643     return ExprError();
9644 
9645   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9646   if (SubExpr.isInvalid())
9647     return ExprError();
9648 
9649   if (!getDerived().AlwaysRebuild() &&
9650       TInfo == E->getWrittenTypeInfo() &&
9651       SubExpr.get() == E->getSubExpr())
9652     return E;
9653 
9654   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9655                                        TInfo, E->getRParenLoc());
9656 }
9657 
9658 template<typename Derived>
9659 ExprResult
9660 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9661   bool ArgumentChanged = false;
9662   SmallVector<Expr*, 4> Inits;
9663   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9664                      &ArgumentChanged))
9665     return ExprError();
9666 
9667   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9668                                            Inits,
9669                                            E->getRParenLoc());
9670 }
9671 
9672 /// \brief Transform an address-of-label expression.
9673 ///
9674 /// By default, the transformation of an address-of-label expression always
9675 /// rebuilds the expression, so that the label identifier can be resolved to
9676 /// the corresponding label statement by semantic analysis.
9677 template<typename Derived>
9678 ExprResult
9679 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9680   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9681                                         E->getLabel());
9682   if (!LD)
9683     return ExprError();
9684 
9685   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9686                                            cast<LabelDecl>(LD));
9687 }
9688 
9689 template<typename Derived>
9690 ExprResult
9691 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9692   SemaRef.ActOnStartStmtExpr();
9693   StmtResult SubStmt
9694     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9695   if (SubStmt.isInvalid()) {
9696     SemaRef.ActOnStmtExprError();
9697     return ExprError();
9698   }
9699 
9700   if (!getDerived().AlwaysRebuild() &&
9701       SubStmt.get() == E->getSubStmt()) {
9702     // Calling this an 'error' is unintuitive, but it does the right thing.
9703     SemaRef.ActOnStmtExprError();
9704     return SemaRef.MaybeBindToTemporary(E);
9705   }
9706 
9707   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9708                                       SubStmt.get(),
9709                                       E->getRParenLoc());
9710 }
9711 
9712 template<typename Derived>
9713 ExprResult
9714 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9715   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9716   if (Cond.isInvalid())
9717     return ExprError();
9718 
9719   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9720   if (LHS.isInvalid())
9721     return ExprError();
9722 
9723   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9724   if (RHS.isInvalid())
9725     return ExprError();
9726 
9727   if (!getDerived().AlwaysRebuild() &&
9728       Cond.get() == E->getCond() &&
9729       LHS.get() == E->getLHS() &&
9730       RHS.get() == E->getRHS())
9731     return E;
9732 
9733   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9734                                         Cond.get(), LHS.get(), RHS.get(),
9735                                         E->getRParenLoc());
9736 }
9737 
9738 template<typename Derived>
9739 ExprResult
9740 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9741   return E;
9742 }
9743 
9744 template<typename Derived>
9745 ExprResult
9746 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9747   switch (E->getOperator()) {
9748   case OO_New:
9749   case OO_Delete:
9750   case OO_Array_New:
9751   case OO_Array_Delete:
9752     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9753 
9754   case OO_Call: {
9755     // This is a call to an object's operator().
9756     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9757 
9758     // Transform the object itself.
9759     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9760     if (Object.isInvalid())
9761       return ExprError();
9762 
9763     // FIXME: Poor location information
9764     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
9765         static_cast<Expr *>(Object.get())->getLocEnd());
9766 
9767     // Transform the call arguments.
9768     SmallVector<Expr*, 8> Args;
9769     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
9770                                     Args))
9771       return ExprError();
9772 
9773     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc,
9774                                         Args,
9775                                         E->getLocEnd());
9776   }
9777 
9778 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
9779   case OO_##Name:
9780 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
9781 #include "clang/Basic/OperatorKinds.def"
9782   case OO_Subscript:
9783     // Handled below.
9784     break;
9785 
9786   case OO_Conditional:
9787     llvm_unreachable("conditional operator is not actually overloadable");
9788 
9789   case OO_None:
9790   case NUM_OVERLOADED_OPERATORS:
9791     llvm_unreachable("not an overloaded operator?");
9792   }
9793 
9794   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9795   if (Callee.isInvalid())
9796     return ExprError();
9797 
9798   ExprResult First;
9799   if (E->getOperator() == OO_Amp)
9800     First = getDerived().TransformAddressOfOperand(E->getArg(0));
9801   else
9802     First = getDerived().TransformExpr(E->getArg(0));
9803   if (First.isInvalid())
9804     return ExprError();
9805 
9806   ExprResult Second;
9807   if (E->getNumArgs() == 2) {
9808     Second = getDerived().TransformExpr(E->getArg(1));
9809     if (Second.isInvalid())
9810       return ExprError();
9811   }
9812 
9813   if (!getDerived().AlwaysRebuild() &&
9814       Callee.get() == E->getCallee() &&
9815       First.get() == E->getArg(0) &&
9816       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
9817     return SemaRef.MaybeBindToTemporary(E);
9818 
9819   Sema::FPContractStateRAII FPContractState(getSema());
9820   getSema().FPFeatures = E->getFPFeatures();
9821 
9822   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
9823                                                  E->getOperatorLoc(),
9824                                                  Callee.get(),
9825                                                  First.get(),
9826                                                  Second.get());
9827 }
9828 
9829 template<typename Derived>
9830 ExprResult
9831 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
9832   return getDerived().TransformCallExpr(E);
9833 }
9834 
9835 template<typename Derived>
9836 ExprResult
9837 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
9838   // Transform the callee.
9839   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9840   if (Callee.isInvalid())
9841     return ExprError();
9842 
9843   // Transform exec config.
9844   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
9845   if (EC.isInvalid())
9846     return ExprError();
9847 
9848   // Transform arguments.
9849   bool ArgChanged = false;
9850   SmallVector<Expr*, 8> Args;
9851   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9852                                   &ArgChanged))
9853     return ExprError();
9854 
9855   if (!getDerived().AlwaysRebuild() &&
9856       Callee.get() == E->getCallee() &&
9857       !ArgChanged)
9858     return SemaRef.MaybeBindToTemporary(E);
9859 
9860   // FIXME: Wrong source location information for the '('.
9861   SourceLocation FakeLParenLoc
9862     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9863   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9864                                       Args,
9865                                       E->getRParenLoc(), EC.get());
9866 }
9867 
9868 template<typename Derived>
9869 ExprResult
9870 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
9871   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9872   if (!Type)
9873     return ExprError();
9874 
9875   ExprResult SubExpr
9876     = getDerived().TransformExpr(E->getSubExprAsWritten());
9877   if (SubExpr.isInvalid())
9878     return ExprError();
9879 
9880   if (!getDerived().AlwaysRebuild() &&
9881       Type == E->getTypeInfoAsWritten() &&
9882       SubExpr.get() == E->getSubExpr())
9883     return E;
9884   return getDerived().RebuildCXXNamedCastExpr(
9885       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
9886       Type, E->getAngleBrackets().getEnd(),
9887       // FIXME. this should be '(' location
9888       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
9889 }
9890 
9891 template<typename Derived>
9892 ExprResult
9893 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
9894   return getDerived().TransformCXXNamedCastExpr(E);
9895 }
9896 
9897 template<typename Derived>
9898 ExprResult
9899 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
9900   return getDerived().TransformCXXNamedCastExpr(E);
9901 }
9902 
9903 template<typename Derived>
9904 ExprResult
9905 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
9906                                                       CXXReinterpretCastExpr *E) {
9907   return getDerived().TransformCXXNamedCastExpr(E);
9908 }
9909 
9910 template<typename Derived>
9911 ExprResult
9912 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
9913   return getDerived().TransformCXXNamedCastExpr(E);
9914 }
9915 
9916 template<typename Derived>
9917 ExprResult
9918 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
9919                                                      CXXFunctionalCastExpr *E) {
9920   TypeSourceInfo *Type =
9921       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
9922   if (!Type)
9923     return ExprError();
9924 
9925   ExprResult SubExpr
9926     = getDerived().TransformExpr(E->getSubExprAsWritten());
9927   if (SubExpr.isInvalid())
9928     return ExprError();
9929 
9930   if (!getDerived().AlwaysRebuild() &&
9931       Type == E->getTypeInfoAsWritten() &&
9932       SubExpr.get() == E->getSubExpr())
9933     return E;
9934 
9935   return getDerived().RebuildCXXFunctionalCastExpr(Type,
9936                                                    E->getLParenLoc(),
9937                                                    SubExpr.get(),
9938                                                    E->getRParenLoc(),
9939                                                    E->isListInitialization());
9940 }
9941 
9942 template<typename Derived>
9943 ExprResult
9944 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
9945   if (E->isTypeOperand()) {
9946     TypeSourceInfo *TInfo
9947       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9948     if (!TInfo)
9949       return ExprError();
9950 
9951     if (!getDerived().AlwaysRebuild() &&
9952         TInfo == E->getTypeOperandSourceInfo())
9953       return E;
9954 
9955     return getDerived().RebuildCXXTypeidExpr(E->getType(),
9956                                              E->getLocStart(),
9957                                              TInfo,
9958                                              E->getLocEnd());
9959   }
9960 
9961   // We don't know whether the subexpression is potentially evaluated until
9962   // after we perform semantic analysis.  We speculatively assume it is
9963   // unevaluated; it will get fixed later if the subexpression is in fact
9964   // potentially evaluated.
9965   EnterExpressionEvaluationContext Unevaluated(
9966       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9967       Sema::ReuseLambdaContextDecl);
9968 
9969   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
9970   if (SubExpr.isInvalid())
9971     return ExprError();
9972 
9973   if (!getDerived().AlwaysRebuild() &&
9974       SubExpr.get() == E->getExprOperand())
9975     return E;
9976 
9977   return getDerived().RebuildCXXTypeidExpr(E->getType(),
9978                                            E->getLocStart(),
9979                                            SubExpr.get(),
9980                                            E->getLocEnd());
9981 }
9982 
9983 template<typename Derived>
9984 ExprResult
9985 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
9986   if (E->isTypeOperand()) {
9987     TypeSourceInfo *TInfo
9988       = getDerived().TransformType(E->getTypeOperandSourceInfo());
9989     if (!TInfo)
9990       return ExprError();
9991 
9992     if (!getDerived().AlwaysRebuild() &&
9993         TInfo == E->getTypeOperandSourceInfo())
9994       return E;
9995 
9996     return getDerived().RebuildCXXUuidofExpr(E->getType(),
9997                                              E->getLocStart(),
9998                                              TInfo,
9999                                              E->getLocEnd());
10000   }
10001 
10002   EnterExpressionEvaluationContext Unevaluated(
10003       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10004 
10005   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10006   if (SubExpr.isInvalid())
10007     return ExprError();
10008 
10009   if (!getDerived().AlwaysRebuild() &&
10010       SubExpr.get() == E->getExprOperand())
10011     return E;
10012 
10013   return getDerived().RebuildCXXUuidofExpr(E->getType(),
10014                                            E->getLocStart(),
10015                                            SubExpr.get(),
10016                                            E->getLocEnd());
10017 }
10018 
10019 template<typename Derived>
10020 ExprResult
10021 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10022   return E;
10023 }
10024 
10025 template<typename Derived>
10026 ExprResult
10027 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10028                                                      CXXNullPtrLiteralExpr *E) {
10029   return E;
10030 }
10031 
10032 template<typename Derived>
10033 ExprResult
10034 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10035   QualType T = getSema().getCurrentThisType();
10036 
10037   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10038     // Make sure that we capture 'this'.
10039     getSema().CheckCXXThisCapture(E->getLocStart());
10040     return E;
10041   }
10042 
10043   return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit());
10044 }
10045 
10046 template<typename Derived>
10047 ExprResult
10048 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10049   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10050   if (SubExpr.isInvalid())
10051     return ExprError();
10052 
10053   if (!getDerived().AlwaysRebuild() &&
10054       SubExpr.get() == E->getSubExpr())
10055     return E;
10056 
10057   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10058                                           E->isThrownVariableInScope());
10059 }
10060 
10061 template<typename Derived>
10062 ExprResult
10063 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10064   ParmVarDecl *Param
10065     = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(),
10066                                                            E->getParam()));
10067   if (!Param)
10068     return ExprError();
10069 
10070   if (!getDerived().AlwaysRebuild() &&
10071       Param == E->getParam())
10072     return E;
10073 
10074   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10075 }
10076 
10077 template<typename Derived>
10078 ExprResult
10079 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10080   FieldDecl *Field
10081     = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(),
10082                                                          E->getField()));
10083   if (!Field)
10084     return ExprError();
10085 
10086   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10087     return E;
10088 
10089   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10090 }
10091 
10092 template<typename Derived>
10093 ExprResult
10094 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10095                                                     CXXScalarValueInitExpr *E) {
10096   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10097   if (!T)
10098     return ExprError();
10099 
10100   if (!getDerived().AlwaysRebuild() &&
10101       T == E->getTypeSourceInfo())
10102     return E;
10103 
10104   return getDerived().RebuildCXXScalarValueInitExpr(T,
10105                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10106                                                     E->getRParenLoc());
10107 }
10108 
10109 template<typename Derived>
10110 ExprResult
10111 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10112   // Transform the type that we're allocating
10113   TypeSourceInfo *AllocTypeInfo =
10114       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10115   if (!AllocTypeInfo)
10116     return ExprError();
10117 
10118   // Transform the size of the array we're allocating (if any).
10119   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10120   if (ArraySize.isInvalid())
10121     return ExprError();
10122 
10123   // Transform the placement arguments (if any).
10124   bool ArgumentChanged = false;
10125   SmallVector<Expr*, 8> PlacementArgs;
10126   if (getDerived().TransformExprs(E->getPlacementArgs(),
10127                                   E->getNumPlacementArgs(), true,
10128                                   PlacementArgs, &ArgumentChanged))
10129     return ExprError();
10130 
10131   // Transform the initializer (if any).
10132   Expr *OldInit = E->getInitializer();
10133   ExprResult NewInit;
10134   if (OldInit)
10135     NewInit = getDerived().TransformInitializer(OldInit, true);
10136   if (NewInit.isInvalid())
10137     return ExprError();
10138 
10139   // Transform new operator and delete operator.
10140   FunctionDecl *OperatorNew = nullptr;
10141   if (E->getOperatorNew()) {
10142     OperatorNew = cast_or_null<FunctionDecl>(
10143                                  getDerived().TransformDecl(E->getLocStart(),
10144                                                          E->getOperatorNew()));
10145     if (!OperatorNew)
10146       return ExprError();
10147   }
10148 
10149   FunctionDecl *OperatorDelete = nullptr;
10150   if (E->getOperatorDelete()) {
10151     OperatorDelete = cast_or_null<FunctionDecl>(
10152                                    getDerived().TransformDecl(E->getLocStart(),
10153                                                        E->getOperatorDelete()));
10154     if (!OperatorDelete)
10155       return ExprError();
10156   }
10157 
10158   if (!getDerived().AlwaysRebuild() &&
10159       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10160       ArraySize.get() == E->getArraySize() &&
10161       NewInit.get() == OldInit &&
10162       OperatorNew == E->getOperatorNew() &&
10163       OperatorDelete == E->getOperatorDelete() &&
10164       !ArgumentChanged) {
10165     // Mark any declarations we need as referenced.
10166     // FIXME: instantiation-specific.
10167     if (OperatorNew)
10168       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew);
10169     if (OperatorDelete)
10170       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10171 
10172     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10173       QualType ElementType
10174         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10175       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10176         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10177         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10178           SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor);
10179         }
10180       }
10181     }
10182 
10183     return E;
10184   }
10185 
10186   QualType AllocType = AllocTypeInfo->getType();
10187   if (!ArraySize.get()) {
10188     // If no array size was specified, but the new expression was
10189     // instantiated with an array type (e.g., "new T" where T is
10190     // instantiated with "int[4]"), extract the outer bound from the
10191     // array type as our array size. We do this with constant and
10192     // dependently-sized array types.
10193     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10194     if (!ArrayT) {
10195       // Do nothing
10196     } else if (const ConstantArrayType *ConsArrayT
10197                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10198       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10199                                          SemaRef.Context.getSizeType(),
10200                                          /*FIXME:*/ E->getLocStart());
10201       AllocType = ConsArrayT->getElementType();
10202     } else if (const DependentSizedArrayType *DepArrayT
10203                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10204       if (DepArrayT->getSizeExpr()) {
10205         ArraySize = DepArrayT->getSizeExpr();
10206         AllocType = DepArrayT->getElementType();
10207       }
10208     }
10209   }
10210 
10211   return getDerived().RebuildCXXNewExpr(E->getLocStart(),
10212                                         E->isGlobalNew(),
10213                                         /*FIXME:*/E->getLocStart(),
10214                                         PlacementArgs,
10215                                         /*FIXME:*/E->getLocStart(),
10216                                         E->getTypeIdParens(),
10217                                         AllocType,
10218                                         AllocTypeInfo,
10219                                         ArraySize.get(),
10220                                         E->getDirectInitRange(),
10221                                         NewInit.get());
10222 }
10223 
10224 template<typename Derived>
10225 ExprResult
10226 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10227   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10228   if (Operand.isInvalid())
10229     return ExprError();
10230 
10231   // Transform the delete operator, if known.
10232   FunctionDecl *OperatorDelete = nullptr;
10233   if (E->getOperatorDelete()) {
10234     OperatorDelete = cast_or_null<FunctionDecl>(
10235                                    getDerived().TransformDecl(E->getLocStart(),
10236                                                        E->getOperatorDelete()));
10237     if (!OperatorDelete)
10238       return ExprError();
10239   }
10240 
10241   if (!getDerived().AlwaysRebuild() &&
10242       Operand.get() == E->getArgument() &&
10243       OperatorDelete == E->getOperatorDelete()) {
10244     // Mark any declarations we need as referenced.
10245     // FIXME: instantiation-specific.
10246     if (OperatorDelete)
10247       SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete);
10248 
10249     if (!E->getArgument()->isTypeDependent()) {
10250       QualType Destroyed = SemaRef.Context.getBaseElementType(
10251                                                          E->getDestroyedType());
10252       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10253         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10254         SemaRef.MarkFunctionReferenced(E->getLocStart(),
10255                                        SemaRef.LookupDestructor(Record));
10256       }
10257     }
10258 
10259     return E;
10260   }
10261 
10262   return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
10263                                            E->isGlobalDelete(),
10264                                            E->isArrayForm(),
10265                                            Operand.get());
10266 }
10267 
10268 template<typename Derived>
10269 ExprResult
10270 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10271                                                      CXXPseudoDestructorExpr *E) {
10272   ExprResult Base = getDerived().TransformExpr(E->getBase());
10273   if (Base.isInvalid())
10274     return ExprError();
10275 
10276   ParsedType ObjectTypePtr;
10277   bool MayBePseudoDestructor = false;
10278   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10279                                               E->getOperatorLoc(),
10280                                         E->isArrow()? tok::arrow : tok::period,
10281                                               ObjectTypePtr,
10282                                               MayBePseudoDestructor);
10283   if (Base.isInvalid())
10284     return ExprError();
10285 
10286   QualType ObjectType = ObjectTypePtr.get();
10287   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10288   if (QualifierLoc) {
10289     QualifierLoc
10290       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10291     if (!QualifierLoc)
10292       return ExprError();
10293   }
10294   CXXScopeSpec SS;
10295   SS.Adopt(QualifierLoc);
10296 
10297   PseudoDestructorTypeStorage Destroyed;
10298   if (E->getDestroyedTypeInfo()) {
10299     TypeSourceInfo *DestroyedTypeInfo
10300       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10301                                                 ObjectType, nullptr, SS);
10302     if (!DestroyedTypeInfo)
10303       return ExprError();
10304     Destroyed = DestroyedTypeInfo;
10305   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10306     // We aren't likely to be able to resolve the identifier down to a type
10307     // now anyway, so just retain the identifier.
10308     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10309                                             E->getDestroyedTypeLoc());
10310   } else {
10311     // Look for a destructor known with the given name.
10312     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10313                                               *E->getDestroyedTypeIdentifier(),
10314                                                 E->getDestroyedTypeLoc(),
10315                                                 /*Scope=*/nullptr,
10316                                                 SS, ObjectTypePtr,
10317                                                 false);
10318     if (!T)
10319       return ExprError();
10320 
10321     Destroyed
10322       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10323                                                  E->getDestroyedTypeLoc());
10324   }
10325 
10326   TypeSourceInfo *ScopeTypeInfo = nullptr;
10327   if (E->getScopeTypeInfo()) {
10328     CXXScopeSpec EmptySS;
10329     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10330                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10331     if (!ScopeTypeInfo)
10332       return ExprError();
10333   }
10334 
10335   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10336                                                      E->getOperatorLoc(),
10337                                                      E->isArrow(),
10338                                                      SS,
10339                                                      ScopeTypeInfo,
10340                                                      E->getColonColonLoc(),
10341                                                      E->getTildeLoc(),
10342                                                      Destroyed);
10343 }
10344 
10345 template <typename Derived>
10346 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10347                                                         bool RequiresADL,
10348                                                         LookupResult &R) {
10349   // Transform all the decls.
10350   bool AllEmptyPacks = true;
10351   for (auto *OldD : Old->decls()) {
10352     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10353     if (!InstD) {
10354       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10355       // This can happen because of dependent hiding.
10356       if (isa<UsingShadowDecl>(OldD))
10357         continue;
10358       else {
10359         R.clear();
10360         return true;
10361       }
10362     }
10363 
10364     // Expand using pack declarations.
10365     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10366     ArrayRef<NamedDecl*> Decls = SingleDecl;
10367     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10368       Decls = UPD->expansions();
10369 
10370     // Expand using declarations.
10371     for (auto *D : Decls) {
10372       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10373         for (auto *SD : UD->shadows())
10374           R.addDecl(SD);
10375       } else {
10376         R.addDecl(D);
10377       }
10378     }
10379 
10380     AllEmptyPacks &= Decls.empty();
10381   };
10382 
10383   // C++ [temp.res]/8.4.2:
10384   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10385   //   a name in the template definition found a using-declaration, but the
10386   //   lookup in the corresponding scope in the instantiation odoes not find
10387   //   any declarations because the using-declaration was a pack expansion and
10388   //   the corresponding pack is empty
10389   if (AllEmptyPacks && !RequiresADL) {
10390     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10391         << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName();
10392     return true;
10393   }
10394 
10395   // Resolve a kind, but don't do any further analysis.  If it's
10396   // ambiguous, the callee needs to deal with it.
10397   R.resolveKind();
10398   return false;
10399 }
10400 
10401 template<typename Derived>
10402 ExprResult
10403 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10404                                                   UnresolvedLookupExpr *Old) {
10405   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10406                  Sema::LookupOrdinaryName);
10407 
10408   // Transform the declaration set.
10409   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10410     return ExprError();
10411 
10412   // Rebuild the nested-name qualifier, if present.
10413   CXXScopeSpec SS;
10414   if (Old->getQualifierLoc()) {
10415     NestedNameSpecifierLoc QualifierLoc
10416       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10417     if (!QualifierLoc)
10418       return ExprError();
10419 
10420     SS.Adopt(QualifierLoc);
10421   }
10422 
10423   if (Old->getNamingClass()) {
10424     CXXRecordDecl *NamingClass
10425       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10426                                                             Old->getNameLoc(),
10427                                                         Old->getNamingClass()));
10428     if (!NamingClass) {
10429       R.clear();
10430       return ExprError();
10431     }
10432 
10433     R.setNamingClass(NamingClass);
10434   }
10435 
10436   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10437 
10438   // If we have neither explicit template arguments, nor the template keyword,
10439   // it's a normal declaration name or member reference.
10440   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10441     NamedDecl *D = R.getAsSingle<NamedDecl>();
10442     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10443     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10444     // give a good diagnostic.
10445     if (D && D->isCXXInstanceMember()) {
10446       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10447                                                      /*TemplateArgs=*/nullptr,
10448                                                      /*Scope=*/nullptr);
10449     }
10450 
10451     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10452   }
10453 
10454   // If we have template arguments, rebuild them, then rebuild the
10455   // templateid expression.
10456   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10457   if (Old->hasExplicitTemplateArgs() &&
10458       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10459                                               Old->getNumTemplateArgs(),
10460                                               TransArgs)) {
10461     R.clear();
10462     return ExprError();
10463   }
10464 
10465   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10466                                             Old->requiresADL(), &TransArgs);
10467 }
10468 
10469 template<typename Derived>
10470 ExprResult
10471 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10472   bool ArgChanged = false;
10473   SmallVector<TypeSourceInfo *, 4> Args;
10474   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10475     TypeSourceInfo *From = E->getArg(I);
10476     TypeLoc FromTL = From->getTypeLoc();
10477     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10478       TypeLocBuilder TLB;
10479       TLB.reserve(FromTL.getFullDataSize());
10480       QualType To = getDerived().TransformType(TLB, FromTL);
10481       if (To.isNull())
10482         return ExprError();
10483 
10484       if (To == From->getType())
10485         Args.push_back(From);
10486       else {
10487         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10488         ArgChanged = true;
10489       }
10490       continue;
10491     }
10492 
10493     ArgChanged = true;
10494 
10495     // We have a pack expansion. Instantiate it.
10496     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10497     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10498     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10499     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10500 
10501     // Determine whether the set of unexpanded parameter packs can and should
10502     // be expanded.
10503     bool Expand = true;
10504     bool RetainExpansion = false;
10505     Optional<unsigned> OrigNumExpansions =
10506         ExpansionTL.getTypePtr()->getNumExpansions();
10507     Optional<unsigned> NumExpansions = OrigNumExpansions;
10508     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10509                                              PatternTL.getSourceRange(),
10510                                              Unexpanded,
10511                                              Expand, RetainExpansion,
10512                                              NumExpansions))
10513       return ExprError();
10514 
10515     if (!Expand) {
10516       // The transform has determined that we should perform a simple
10517       // transformation on the pack expansion, producing another pack
10518       // expansion.
10519       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10520 
10521       TypeLocBuilder TLB;
10522       TLB.reserve(From->getTypeLoc().getFullDataSize());
10523 
10524       QualType To = getDerived().TransformType(TLB, PatternTL);
10525       if (To.isNull())
10526         return ExprError();
10527 
10528       To = getDerived().RebuildPackExpansionType(To,
10529                                                  PatternTL.getSourceRange(),
10530                                                  ExpansionTL.getEllipsisLoc(),
10531                                                  NumExpansions);
10532       if (To.isNull())
10533         return ExprError();
10534 
10535       PackExpansionTypeLoc ToExpansionTL
10536         = TLB.push<PackExpansionTypeLoc>(To);
10537       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10538       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10539       continue;
10540     }
10541 
10542     // Expand the pack expansion by substituting for each argument in the
10543     // pack(s).
10544     for (unsigned I = 0; I != *NumExpansions; ++I) {
10545       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10546       TypeLocBuilder TLB;
10547       TLB.reserve(PatternTL.getFullDataSize());
10548       QualType To = getDerived().TransformType(TLB, PatternTL);
10549       if (To.isNull())
10550         return ExprError();
10551 
10552       if (To->containsUnexpandedParameterPack()) {
10553         To = getDerived().RebuildPackExpansionType(To,
10554                                                    PatternTL.getSourceRange(),
10555                                                    ExpansionTL.getEllipsisLoc(),
10556                                                    NumExpansions);
10557         if (To.isNull())
10558           return ExprError();
10559 
10560         PackExpansionTypeLoc ToExpansionTL
10561           = TLB.push<PackExpansionTypeLoc>(To);
10562         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10563       }
10564 
10565       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10566     }
10567 
10568     if (!RetainExpansion)
10569       continue;
10570 
10571     // If we're supposed to retain a pack expansion, do so by temporarily
10572     // forgetting the partially-substituted parameter pack.
10573     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10574 
10575     TypeLocBuilder TLB;
10576     TLB.reserve(From->getTypeLoc().getFullDataSize());
10577 
10578     QualType To = getDerived().TransformType(TLB, PatternTL);
10579     if (To.isNull())
10580       return ExprError();
10581 
10582     To = getDerived().RebuildPackExpansionType(To,
10583                                                PatternTL.getSourceRange(),
10584                                                ExpansionTL.getEllipsisLoc(),
10585                                                NumExpansions);
10586     if (To.isNull())
10587       return ExprError();
10588 
10589     PackExpansionTypeLoc ToExpansionTL
10590       = TLB.push<PackExpansionTypeLoc>(To);
10591     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10592     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10593   }
10594 
10595   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10596     return E;
10597 
10598   return getDerived().RebuildTypeTrait(E->getTrait(),
10599                                        E->getLocStart(),
10600                                        Args,
10601                                        E->getLocEnd());
10602 }
10603 
10604 template<typename Derived>
10605 ExprResult
10606 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10607   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10608   if (!T)
10609     return ExprError();
10610 
10611   if (!getDerived().AlwaysRebuild() &&
10612       T == E->getQueriedTypeSourceInfo())
10613     return E;
10614 
10615   ExprResult SubExpr;
10616   {
10617     EnterExpressionEvaluationContext Unevaluated(
10618         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10619     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10620     if (SubExpr.isInvalid())
10621       return ExprError();
10622 
10623     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10624       return E;
10625   }
10626 
10627   return getDerived().RebuildArrayTypeTrait(E->getTrait(),
10628                                             E->getLocStart(),
10629                                             T,
10630                                             SubExpr.get(),
10631                                             E->getLocEnd());
10632 }
10633 
10634 template<typename Derived>
10635 ExprResult
10636 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10637   ExprResult SubExpr;
10638   {
10639     EnterExpressionEvaluationContext Unevaluated(
10640         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10641     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10642     if (SubExpr.isInvalid())
10643       return ExprError();
10644 
10645     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10646       return E;
10647   }
10648 
10649   return getDerived().RebuildExpressionTrait(
10650       E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd());
10651 }
10652 
10653 template <typename Derived>
10654 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10655     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10656     TypeSourceInfo **RecoveryTSI) {
10657   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10658       DRE, AddrTaken, RecoveryTSI);
10659 
10660   // Propagate both errors and recovered types, which return ExprEmpty.
10661   if (!NewDRE.isUsable())
10662     return NewDRE;
10663 
10664   // We got an expr, wrap it up in parens.
10665   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10666     return PE;
10667   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10668                                        PE->getRParen());
10669 }
10670 
10671 template <typename Derived>
10672 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10673     DependentScopeDeclRefExpr *E) {
10674   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10675                                             nullptr);
10676 }
10677 
10678 template<typename Derived>
10679 ExprResult
10680 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10681                                                DependentScopeDeclRefExpr *E,
10682                                                bool IsAddressOfOperand,
10683                                                TypeSourceInfo **RecoveryTSI) {
10684   assert(E->getQualifierLoc());
10685   NestedNameSpecifierLoc QualifierLoc
10686   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10687   if (!QualifierLoc)
10688     return ExprError();
10689   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10690 
10691   // TODO: If this is a conversion-function-id, verify that the
10692   // destination type name (if present) resolves the same way after
10693   // instantiation as it did in the local scope.
10694 
10695   DeclarationNameInfo NameInfo
10696     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10697   if (!NameInfo.getName())
10698     return ExprError();
10699 
10700   if (!E->hasExplicitTemplateArgs()) {
10701     if (!getDerived().AlwaysRebuild() &&
10702         QualifierLoc == E->getQualifierLoc() &&
10703         // Note: it is sufficient to compare the Name component of NameInfo:
10704         // if name has not changed, DNLoc has not changed either.
10705         NameInfo.getName() == E->getDeclName())
10706       return E;
10707 
10708     return getDerived().RebuildDependentScopeDeclRefExpr(
10709         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10710         IsAddressOfOperand, RecoveryTSI);
10711   }
10712 
10713   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10714   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10715                                               E->getNumTemplateArgs(),
10716                                               TransArgs))
10717     return ExprError();
10718 
10719   return getDerived().RebuildDependentScopeDeclRefExpr(
10720       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10721       RecoveryTSI);
10722 }
10723 
10724 template<typename Derived>
10725 ExprResult
10726 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10727   // CXXConstructExprs other than for list-initialization and
10728   // CXXTemporaryObjectExpr are always implicit, so when we have
10729   // a 1-argument construction we just transform that argument.
10730   if ((E->getNumArgs() == 1 ||
10731        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10732       (!getDerived().DropCallArgument(E->getArg(0))) &&
10733       !E->isListInitialization())
10734     return getDerived().TransformExpr(E->getArg(0));
10735 
10736   TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
10737 
10738   QualType T = getDerived().TransformType(E->getType());
10739   if (T.isNull())
10740     return ExprError();
10741 
10742   CXXConstructorDecl *Constructor
10743     = cast_or_null<CXXConstructorDecl>(
10744                                 getDerived().TransformDecl(E->getLocStart(),
10745                                                          E->getConstructor()));
10746   if (!Constructor)
10747     return ExprError();
10748 
10749   bool ArgumentChanged = false;
10750   SmallVector<Expr*, 8> Args;
10751   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10752                                   &ArgumentChanged))
10753     return ExprError();
10754 
10755   if (!getDerived().AlwaysRebuild() &&
10756       T == E->getType() &&
10757       Constructor == E->getConstructor() &&
10758       !ArgumentChanged) {
10759     // Mark the constructor as referenced.
10760     // FIXME: Instantiation-specific
10761     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10762     return E;
10763   }
10764 
10765   return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(),
10766                                               Constructor,
10767                                               E->isElidable(), Args,
10768                                               E->hadMultipleCandidates(),
10769                                               E->isListInitialization(),
10770                                               E->isStdInitListInitialization(),
10771                                               E->requiresZeroInitialization(),
10772                                               E->getConstructionKind(),
10773                                               E->getParenOrBraceRange());
10774 }
10775 
10776 template<typename Derived>
10777 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10778     CXXInheritedCtorInitExpr *E) {
10779   QualType T = getDerived().TransformType(E->getType());
10780   if (T.isNull())
10781     return ExprError();
10782 
10783   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10784       getDerived().TransformDecl(E->getLocStart(), E->getConstructor()));
10785   if (!Constructor)
10786     return ExprError();
10787 
10788   if (!getDerived().AlwaysRebuild() &&
10789       T == E->getType() &&
10790       Constructor == E->getConstructor()) {
10791     // Mark the constructor as referenced.
10792     // FIXME: Instantiation-specific
10793     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10794     return E;
10795   }
10796 
10797   return getDerived().RebuildCXXInheritedCtorInitExpr(
10798       T, E->getLocation(), Constructor,
10799       E->constructsVBase(), E->inheritedFromVBase());
10800 }
10801 
10802 /// \brief Transform a C++ temporary-binding expression.
10803 ///
10804 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
10805 /// transform the subexpression and return that.
10806 template<typename Derived>
10807 ExprResult
10808 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
10809   return getDerived().TransformExpr(E->getSubExpr());
10810 }
10811 
10812 /// \brief Transform a C++ expression that contains cleanups that should
10813 /// be run after the expression is evaluated.
10814 ///
10815 /// Since ExprWithCleanups nodes are implicitly generated, we
10816 /// just transform the subexpression and return that.
10817 template<typename Derived>
10818 ExprResult
10819 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
10820   return getDerived().TransformExpr(E->getSubExpr());
10821 }
10822 
10823 template<typename Derived>
10824 ExprResult
10825 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
10826                                                     CXXTemporaryObjectExpr *E) {
10827   TypeSourceInfo *T =
10828       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
10829   if (!T)
10830     return ExprError();
10831 
10832   CXXConstructorDecl *Constructor
10833     = cast_or_null<CXXConstructorDecl>(
10834                                   getDerived().TransformDecl(E->getLocStart(),
10835                                                          E->getConstructor()));
10836   if (!Constructor)
10837     return ExprError();
10838 
10839   bool ArgumentChanged = false;
10840   SmallVector<Expr*, 8> Args;
10841   Args.reserve(E->getNumArgs());
10842   if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10843                      &ArgumentChanged))
10844     return ExprError();
10845 
10846   if (!getDerived().AlwaysRebuild() &&
10847       T == E->getTypeSourceInfo() &&
10848       Constructor == E->getConstructor() &&
10849       !ArgumentChanged) {
10850     // FIXME: Instantiation-specific
10851     SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor);
10852     return SemaRef.MaybeBindToTemporary(E);
10853   }
10854 
10855   // FIXME: We should just pass E->isListInitialization(), but we're not
10856   // prepared to handle list-initialization without a child InitListExpr.
10857   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
10858   return getDerived().RebuildCXXTemporaryObjectExpr(
10859       T, LParenLoc, Args, E->getLocEnd(),
10860       /*ListInitialization=*/LParenLoc.isInvalid());
10861 }
10862 
10863 template<typename Derived>
10864 ExprResult
10865 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
10866   // Transform any init-capture expressions before entering the scope of the
10867   // lambda body, because they are not semantically within that scope.
10868   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
10869   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
10870   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
10871                                   E->explicit_capture_begin());
10872   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10873                                     CEnd = E->capture_end();
10874        C != CEnd; ++C) {
10875     if (!E->isInitCapture(C))
10876       continue;
10877     EnterExpressionEvaluationContext EEEC(
10878         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
10879     ExprResult NewExprInitResult = getDerived().TransformInitializer(
10880         C->getCapturedVar()->getInit(),
10881         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
10882 
10883     if (NewExprInitResult.isInvalid())
10884       return ExprError();
10885     Expr *NewExprInit = NewExprInitResult.get();
10886 
10887     VarDecl *OldVD = C->getCapturedVar();
10888     QualType NewInitCaptureType =
10889         getSema().buildLambdaInitCaptureInitialization(
10890             C->getLocation(), OldVD->getType()->isReferenceType(),
10891             OldVD->getIdentifier(),
10892             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
10893     NewExprInitResult = NewExprInit;
10894     InitCaptureExprsAndTypes[C - E->capture_begin()] =
10895         std::make_pair(NewExprInitResult, NewInitCaptureType);
10896   }
10897 
10898   // Transform the template parameters, and add them to the current
10899   // instantiation scope. The null case is handled correctly.
10900   auto TPL = getDerived().TransformTemplateParameterList(
10901       E->getTemplateParameterList());
10902 
10903   // Transform the type of the original lambda's call operator.
10904   // The transformation MUST be done in the CurrentInstantiationScope since
10905   // it introduces a mapping of the original to the newly created
10906   // transformed parameters.
10907   TypeSourceInfo *NewCallOpTSI = nullptr;
10908   {
10909     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
10910     FunctionProtoTypeLoc OldCallOpFPTL =
10911         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
10912 
10913     TypeLocBuilder NewCallOpTLBuilder;
10914     SmallVector<QualType, 4> ExceptionStorage;
10915     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
10916     QualType NewCallOpType = TransformFunctionProtoType(
10917         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
10918         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
10919           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
10920                                               ExceptionStorage, Changed);
10921         });
10922     if (NewCallOpType.isNull())
10923       return ExprError();
10924     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
10925                                                         NewCallOpType);
10926   }
10927 
10928   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
10929   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
10930   LSI->GLTemplateParameterList = TPL;
10931 
10932   // Create the local class that will describe the lambda.
10933   CXXRecordDecl *Class
10934     = getSema().createLambdaClosureType(E->getIntroducerRange(),
10935                                         NewCallOpTSI,
10936                                         /*KnownDependent=*/false,
10937                                         E->getCaptureDefault());
10938   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
10939 
10940   // Build the call operator.
10941   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
10942       Class, E->getIntroducerRange(), NewCallOpTSI,
10943       E->getCallOperator()->getLocEnd(),
10944       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
10945       E->getCallOperator()->isConstexpr());
10946 
10947   LSI->CallOperator = NewCallOperator;
10948 
10949   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
10950        I != NumParams; ++I) {
10951     auto *P = NewCallOperator->getParamDecl(I);
10952     if (P->hasUninstantiatedDefaultArg()) {
10953       EnterExpressionEvaluationContext Eval(
10954           getSema(),
10955           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
10956       ExprResult R = getDerived().TransformExpr(
10957           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
10958       P->setDefaultArg(R.get());
10959     }
10960   }
10961 
10962   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
10963   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
10964 
10965   // Introduce the context of the call operator.
10966   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
10967                                  /*NewThisContext*/false);
10968 
10969   // Enter the scope of the lambda.
10970   getSema().buildLambdaScope(LSI, NewCallOperator,
10971                              E->getIntroducerRange(),
10972                              E->getCaptureDefault(),
10973                              E->getCaptureDefaultLoc(),
10974                              E->hasExplicitParameters(),
10975                              E->hasExplicitResultType(),
10976                              E->isMutable());
10977 
10978   bool Invalid = false;
10979 
10980   // Transform captures.
10981   bool FinishedExplicitCaptures = false;
10982   for (LambdaExpr::capture_iterator C = E->capture_begin(),
10983                                  CEnd = E->capture_end();
10984        C != CEnd; ++C) {
10985     // When we hit the first implicit capture, tell Sema that we've finished
10986     // the list of explicit captures.
10987     if (!FinishedExplicitCaptures && C->isImplicit()) {
10988       getSema().finishLambdaExplicitCaptures(LSI);
10989       FinishedExplicitCaptures = true;
10990     }
10991 
10992     // Capturing 'this' is trivial.
10993     if (C->capturesThis()) {
10994       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
10995                                     /*BuildAndDiagnose*/ true, nullptr,
10996                                     C->getCaptureKind() == LCK_StarThis);
10997       continue;
10998     }
10999     // Captured expression will be recaptured during captured variables
11000     // rebuilding.
11001     if (C->capturesVLAType())
11002       continue;
11003 
11004     // Rebuild init-captures, including the implied field declaration.
11005     if (E->isInitCapture(C)) {
11006       InitCaptureInfoTy InitExprTypePair =
11007           InitCaptureExprsAndTypes[C - E->capture_begin()];
11008       ExprResult Init = InitExprTypePair.first;
11009       QualType InitQualType = InitExprTypePair.second;
11010       if (Init.isInvalid() || InitQualType.isNull()) {
11011         Invalid = true;
11012         continue;
11013       }
11014       VarDecl *OldVD = C->getCapturedVar();
11015       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11016           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
11017           OldVD->getInitStyle(), Init.get());
11018       if (!NewVD)
11019         Invalid = true;
11020       else {
11021         getDerived().transformedLocalDecl(OldVD, NewVD);
11022       }
11023       getSema().buildInitCaptureField(LSI, NewVD);
11024       continue;
11025     }
11026 
11027     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11028 
11029     // Determine the capture kind for Sema.
11030     Sema::TryCaptureKind Kind
11031       = C->isImplicit()? Sema::TryCapture_Implicit
11032                        : C->getCaptureKind() == LCK_ByCopy
11033                            ? Sema::TryCapture_ExplicitByVal
11034                            : Sema::TryCapture_ExplicitByRef;
11035     SourceLocation EllipsisLoc;
11036     if (C->isPackExpansion()) {
11037       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11038       bool ShouldExpand = false;
11039       bool RetainExpansion = false;
11040       Optional<unsigned> NumExpansions;
11041       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11042                                                C->getLocation(),
11043                                                Unexpanded,
11044                                                ShouldExpand, RetainExpansion,
11045                                                NumExpansions)) {
11046         Invalid = true;
11047         continue;
11048       }
11049 
11050       if (ShouldExpand) {
11051         // The transform has determined that we should perform an expansion;
11052         // transform and capture each of the arguments.
11053         // expansion of the pattern. Do so.
11054         VarDecl *Pack = C->getCapturedVar();
11055         for (unsigned I = 0; I != *NumExpansions; ++I) {
11056           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11057           VarDecl *CapturedVar
11058             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11059                                                                Pack));
11060           if (!CapturedVar) {
11061             Invalid = true;
11062             continue;
11063           }
11064 
11065           // Capture the transformed variable.
11066           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11067         }
11068 
11069         // FIXME: Retain a pack expansion if RetainExpansion is true.
11070 
11071         continue;
11072       }
11073 
11074       EllipsisLoc = C->getEllipsisLoc();
11075     }
11076 
11077     // Transform the captured variable.
11078     VarDecl *CapturedVar
11079       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11080                                                          C->getCapturedVar()));
11081     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11082       Invalid = true;
11083       continue;
11084     }
11085 
11086     // Capture the transformed variable.
11087     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11088                                  EllipsisLoc);
11089   }
11090   if (!FinishedExplicitCaptures)
11091     getSema().finishLambdaExplicitCaptures(LSI);
11092 
11093   // Enter a new evaluation context to insulate the lambda from any
11094   // cleanups from the enclosing full-expression.
11095   getSema().PushExpressionEvaluationContext(
11096       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11097 
11098   // Instantiate the body of the lambda expression.
11099   StmtResult Body =
11100       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11101 
11102   // ActOnLambda* will pop the function scope for us.
11103   FuncScopeCleanup.disable();
11104 
11105   if (Body.isInvalid()) {
11106     SavedContext.pop();
11107     getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr,
11108                                /*IsInstantiation=*/true);
11109     return ExprError();
11110   }
11111 
11112   // Copy the LSI before ActOnFinishFunctionBody removes it.
11113   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11114   // the call operator.
11115   auto LSICopy = *LSI;
11116   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11117                                     /*IsInstantiation*/ true);
11118   SavedContext.pop();
11119 
11120   return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(),
11121                                    &LSICopy);
11122 }
11123 
11124 template<typename Derived>
11125 ExprResult
11126 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11127                                                   CXXUnresolvedConstructExpr *E) {
11128   TypeSourceInfo *T =
11129       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11130   if (!T)
11131     return ExprError();
11132 
11133   bool ArgumentChanged = false;
11134   SmallVector<Expr*, 8> Args;
11135   Args.reserve(E->arg_size());
11136   if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11137                                   &ArgumentChanged))
11138     return ExprError();
11139 
11140   if (!getDerived().AlwaysRebuild() &&
11141       T == E->getTypeSourceInfo() &&
11142       !ArgumentChanged)
11143     return E;
11144 
11145   // FIXME: we're faking the locations of the commas
11146   return getDerived().RebuildCXXUnresolvedConstructExpr(
11147       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11148 }
11149 
11150 template<typename Derived>
11151 ExprResult
11152 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11153                                              CXXDependentScopeMemberExpr *E) {
11154   // Transform the base of the expression.
11155   ExprResult Base((Expr*) nullptr);
11156   Expr *OldBase;
11157   QualType BaseType;
11158   QualType ObjectType;
11159   if (!E->isImplicitAccess()) {
11160     OldBase = E->getBase();
11161     Base = getDerived().TransformExpr(OldBase);
11162     if (Base.isInvalid())
11163       return ExprError();
11164 
11165     // Start the member reference and compute the object's type.
11166     ParsedType ObjectTy;
11167     bool MayBePseudoDestructor = false;
11168     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11169                                                 E->getOperatorLoc(),
11170                                       E->isArrow()? tok::arrow : tok::period,
11171                                                 ObjectTy,
11172                                                 MayBePseudoDestructor);
11173     if (Base.isInvalid())
11174       return ExprError();
11175 
11176     ObjectType = ObjectTy.get();
11177     BaseType = ((Expr*) Base.get())->getType();
11178   } else {
11179     OldBase = nullptr;
11180     BaseType = getDerived().TransformType(E->getBaseType());
11181     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11182   }
11183 
11184   // Transform the first part of the nested-name-specifier that qualifies
11185   // the member name.
11186   NamedDecl *FirstQualifierInScope
11187     = getDerived().TransformFirstQualifierInScope(
11188                                             E->getFirstQualifierFoundInScope(),
11189                                             E->getQualifierLoc().getBeginLoc());
11190 
11191   NestedNameSpecifierLoc QualifierLoc;
11192   if (E->getQualifier()) {
11193     QualifierLoc
11194       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11195                                                      ObjectType,
11196                                                      FirstQualifierInScope);
11197     if (!QualifierLoc)
11198       return ExprError();
11199   }
11200 
11201   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11202 
11203   // TODO: If this is a conversion-function-id, verify that the
11204   // destination type name (if present) resolves the same way after
11205   // instantiation as it did in the local scope.
11206 
11207   DeclarationNameInfo NameInfo
11208     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11209   if (!NameInfo.getName())
11210     return ExprError();
11211 
11212   if (!E->hasExplicitTemplateArgs()) {
11213     // This is a reference to a member without an explicitly-specified
11214     // template argument list. Optimize for this common case.
11215     if (!getDerived().AlwaysRebuild() &&
11216         Base.get() == OldBase &&
11217         BaseType == E->getBaseType() &&
11218         QualifierLoc == E->getQualifierLoc() &&
11219         NameInfo.getName() == E->getMember() &&
11220         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11221       return E;
11222 
11223     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11224                                                        BaseType,
11225                                                        E->isArrow(),
11226                                                        E->getOperatorLoc(),
11227                                                        QualifierLoc,
11228                                                        TemplateKWLoc,
11229                                                        FirstQualifierInScope,
11230                                                        NameInfo,
11231                                                        /*TemplateArgs*/nullptr);
11232   }
11233 
11234   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11235   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11236                                               E->getNumTemplateArgs(),
11237                                               TransArgs))
11238     return ExprError();
11239 
11240   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11241                                                      BaseType,
11242                                                      E->isArrow(),
11243                                                      E->getOperatorLoc(),
11244                                                      QualifierLoc,
11245                                                      TemplateKWLoc,
11246                                                      FirstQualifierInScope,
11247                                                      NameInfo,
11248                                                      &TransArgs);
11249 }
11250 
11251 template<typename Derived>
11252 ExprResult
11253 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11254   // Transform the base of the expression.
11255   ExprResult Base((Expr*) nullptr);
11256   QualType BaseType;
11257   if (!Old->isImplicitAccess()) {
11258     Base = getDerived().TransformExpr(Old->getBase());
11259     if (Base.isInvalid())
11260       return ExprError();
11261     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11262                                                      Old->isArrow());
11263     if (Base.isInvalid())
11264       return ExprError();
11265     BaseType = Base.get()->getType();
11266   } else {
11267     BaseType = getDerived().TransformType(Old->getBaseType());
11268   }
11269 
11270   NestedNameSpecifierLoc QualifierLoc;
11271   if (Old->getQualifierLoc()) {
11272     QualifierLoc
11273     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11274     if (!QualifierLoc)
11275       return ExprError();
11276   }
11277 
11278   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11279 
11280   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11281                  Sema::LookupOrdinaryName);
11282 
11283   // Transform the declaration set.
11284   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11285     return ExprError();
11286 
11287   // Determine the naming class.
11288   if (Old->getNamingClass()) {
11289     CXXRecordDecl *NamingClass
11290       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11291                                                           Old->getMemberLoc(),
11292                                                         Old->getNamingClass()));
11293     if (!NamingClass)
11294       return ExprError();
11295 
11296     R.setNamingClass(NamingClass);
11297   }
11298 
11299   TemplateArgumentListInfo TransArgs;
11300   if (Old->hasExplicitTemplateArgs()) {
11301     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11302     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11303     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11304                                                 Old->getNumTemplateArgs(),
11305                                                 TransArgs))
11306       return ExprError();
11307   }
11308 
11309   // FIXME: to do this check properly, we will need to preserve the
11310   // first-qualifier-in-scope here, just in case we had a dependent
11311   // base (and therefore couldn't do the check) and a
11312   // nested-name-qualifier (and therefore could do the lookup).
11313   NamedDecl *FirstQualifierInScope = nullptr;
11314 
11315   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11316                                                   BaseType,
11317                                                   Old->getOperatorLoc(),
11318                                                   Old->isArrow(),
11319                                                   QualifierLoc,
11320                                                   TemplateKWLoc,
11321                                                   FirstQualifierInScope,
11322                                                   R,
11323                                               (Old->hasExplicitTemplateArgs()
11324                                                   ? &TransArgs : nullptr));
11325 }
11326 
11327 template<typename Derived>
11328 ExprResult
11329 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11330   EnterExpressionEvaluationContext Unevaluated(
11331       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11332   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11333   if (SubExpr.isInvalid())
11334     return ExprError();
11335 
11336   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11337     return E;
11338 
11339   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11340 }
11341 
11342 template<typename Derived>
11343 ExprResult
11344 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11345   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11346   if (Pattern.isInvalid())
11347     return ExprError();
11348 
11349   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11350     return E;
11351 
11352   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11353                                            E->getNumExpansions());
11354 }
11355 
11356 template<typename Derived>
11357 ExprResult
11358 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11359   // If E is not value-dependent, then nothing will change when we transform it.
11360   // Note: This is an instantiation-centric view.
11361   if (!E->isValueDependent())
11362     return E;
11363 
11364   EnterExpressionEvaluationContext Unevaluated(
11365       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11366 
11367   ArrayRef<TemplateArgument> PackArgs;
11368   TemplateArgument ArgStorage;
11369 
11370   // Find the argument list to transform.
11371   if (E->isPartiallySubstituted()) {
11372     PackArgs = E->getPartialArguments();
11373   } else if (E->isValueDependent()) {
11374     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11375     bool ShouldExpand = false;
11376     bool RetainExpansion = false;
11377     Optional<unsigned> NumExpansions;
11378     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11379                                              Unexpanded,
11380                                              ShouldExpand, RetainExpansion,
11381                                              NumExpansions))
11382       return ExprError();
11383 
11384     // If we need to expand the pack, build a template argument from it and
11385     // expand that.
11386     if (ShouldExpand) {
11387       auto *Pack = E->getPack();
11388       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11389         ArgStorage = getSema().Context.getPackExpansionType(
11390             getSema().Context.getTypeDeclType(TTPD), None);
11391       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11392         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11393       } else {
11394         auto *VD = cast<ValueDecl>(Pack);
11395         ExprResult DRE = getSema().BuildDeclRefExpr(
11396             VD, VD->getType().getNonLValueExprType(getSema().Context),
11397             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11398             E->getPackLoc());
11399         if (DRE.isInvalid())
11400           return ExprError();
11401         ArgStorage = new (getSema().Context) PackExpansionExpr(
11402             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11403       }
11404       PackArgs = ArgStorage;
11405     }
11406   }
11407 
11408   // If we're not expanding the pack, just transform the decl.
11409   if (!PackArgs.size()) {
11410     auto *Pack = cast_or_null<NamedDecl>(
11411         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11412     if (!Pack)
11413       return ExprError();
11414     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11415                                               E->getPackLoc(),
11416                                               E->getRParenLoc(), None, None);
11417   }
11418 
11419   // Try to compute the result without performing a partial substitution.
11420   Optional<unsigned> Result = 0;
11421   for (const TemplateArgument &Arg : PackArgs) {
11422     if (!Arg.isPackExpansion()) {
11423       Result = *Result + 1;
11424       continue;
11425     }
11426 
11427     TemplateArgumentLoc ArgLoc;
11428     InventTemplateArgumentLoc(Arg, ArgLoc);
11429 
11430     // Find the pattern of the pack expansion.
11431     SourceLocation Ellipsis;
11432     Optional<unsigned> OrigNumExpansions;
11433     TemplateArgumentLoc Pattern =
11434         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11435                                                           OrigNumExpansions);
11436 
11437     // Substitute under the pack expansion. Do not expand the pack (yet).
11438     TemplateArgumentLoc OutPattern;
11439     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11440     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11441                                                /*Uneval*/ true))
11442       return true;
11443 
11444     // See if we can determine the number of arguments from the result.
11445     Optional<unsigned> NumExpansions =
11446         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11447     if (!NumExpansions) {
11448       // No: we must be in an alias template expansion, and we're going to need
11449       // to actually expand the packs.
11450       Result = None;
11451       break;
11452     }
11453 
11454     Result = *Result + *NumExpansions;
11455   }
11456 
11457   // Common case: we could determine the number of expansions without
11458   // substituting.
11459   if (Result)
11460     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11461                                               E->getPackLoc(),
11462                                               E->getRParenLoc(), *Result, None);
11463 
11464   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11465                                                E->getPackLoc());
11466   {
11467     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11468     typedef TemplateArgumentLocInventIterator<
11469         Derived, const TemplateArgument*> PackLocIterator;
11470     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11471                                    PackLocIterator(*this, PackArgs.end()),
11472                                    TransformedPackArgs, /*Uneval*/true))
11473       return ExprError();
11474   }
11475 
11476   // Check whether we managed to fully-expand the pack.
11477   // FIXME: Is it possible for us to do so and not hit the early exit path?
11478   SmallVector<TemplateArgument, 8> Args;
11479   bool PartialSubstitution = false;
11480   for (auto &Loc : TransformedPackArgs.arguments()) {
11481     Args.push_back(Loc.getArgument());
11482     if (Loc.getArgument().isPackExpansion())
11483       PartialSubstitution = true;
11484   }
11485 
11486   if (PartialSubstitution)
11487     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11488                                               E->getPackLoc(),
11489                                               E->getRParenLoc(), None, Args);
11490 
11491   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11492                                             E->getPackLoc(), E->getRParenLoc(),
11493                                             Args.size(), None);
11494 }
11495 
11496 template<typename Derived>
11497 ExprResult
11498 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11499                                           SubstNonTypeTemplateParmPackExpr *E) {
11500   // Default behavior is to do nothing with this transformation.
11501   return E;
11502 }
11503 
11504 template<typename Derived>
11505 ExprResult
11506 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11507                                           SubstNonTypeTemplateParmExpr *E) {
11508   // Default behavior is to do nothing with this transformation.
11509   return E;
11510 }
11511 
11512 template<typename Derived>
11513 ExprResult
11514 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11515   // Default behavior is to do nothing with this transformation.
11516   return E;
11517 }
11518 
11519 template<typename Derived>
11520 ExprResult
11521 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11522                                                   MaterializeTemporaryExpr *E) {
11523   return getDerived().TransformExpr(E->GetTemporaryExpr());
11524 }
11525 
11526 template<typename Derived>
11527 ExprResult
11528 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11529   Expr *Pattern = E->getPattern();
11530 
11531   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11532   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11533   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11534 
11535   // Determine whether the set of unexpanded parameter packs can and should
11536   // be expanded.
11537   bool Expand = true;
11538   bool RetainExpansion = false;
11539   Optional<unsigned> NumExpansions;
11540   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11541                                            Pattern->getSourceRange(),
11542                                            Unexpanded,
11543                                            Expand, RetainExpansion,
11544                                            NumExpansions))
11545     return true;
11546 
11547   if (!Expand) {
11548     // Do not expand any packs here, just transform and rebuild a fold
11549     // expression.
11550     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11551 
11552     ExprResult LHS =
11553         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11554     if (LHS.isInvalid())
11555       return true;
11556 
11557     ExprResult RHS =
11558         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11559     if (RHS.isInvalid())
11560       return true;
11561 
11562     if (!getDerived().AlwaysRebuild() &&
11563         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11564       return E;
11565 
11566     return getDerived().RebuildCXXFoldExpr(
11567         E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11568         RHS.get(), E->getLocEnd());
11569   }
11570 
11571   // The transform has determined that we should perform an elementwise
11572   // expansion of the pattern. Do so.
11573   ExprResult Result = getDerived().TransformExpr(E->getInit());
11574   if (Result.isInvalid())
11575     return true;
11576   bool LeftFold = E->isLeftFold();
11577 
11578   // If we're retaining an expansion for a right fold, it is the innermost
11579   // component and takes the init (if any).
11580   if (!LeftFold && RetainExpansion) {
11581     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11582 
11583     ExprResult Out = getDerived().TransformExpr(Pattern);
11584     if (Out.isInvalid())
11585       return true;
11586 
11587     Result = getDerived().RebuildCXXFoldExpr(
11588         E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11589         Result.get(), E->getLocEnd());
11590     if (Result.isInvalid())
11591       return true;
11592   }
11593 
11594   for (unsigned I = 0; I != *NumExpansions; ++I) {
11595     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11596         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11597     ExprResult Out = getDerived().TransformExpr(Pattern);
11598     if (Out.isInvalid())
11599       return true;
11600 
11601     if (Out.get()->containsUnexpandedParameterPack()) {
11602       // We still have a pack; retain a pack expansion for this slice.
11603       Result = getDerived().RebuildCXXFoldExpr(
11604           E->getLocStart(),
11605           LeftFold ? Result.get() : Out.get(),
11606           E->getOperator(), E->getEllipsisLoc(),
11607           LeftFold ? Out.get() : Result.get(),
11608           E->getLocEnd());
11609     } else if (Result.isUsable()) {
11610       // We've got down to a single element; build a binary operator.
11611       Result = getDerived().RebuildBinaryOperator(
11612           E->getEllipsisLoc(), E->getOperator(),
11613           LeftFold ? Result.get() : Out.get(),
11614           LeftFold ? Out.get() : Result.get());
11615     } else
11616       Result = Out;
11617 
11618     if (Result.isInvalid())
11619       return true;
11620   }
11621 
11622   // If we're retaining an expansion for a left fold, it is the outermost
11623   // component and takes the complete expansion so far as its init (if any).
11624   if (LeftFold && RetainExpansion) {
11625     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11626 
11627     ExprResult Out = getDerived().TransformExpr(Pattern);
11628     if (Out.isInvalid())
11629       return true;
11630 
11631     Result = getDerived().RebuildCXXFoldExpr(
11632         E->getLocStart(), Result.get(),
11633         E->getOperator(), E->getEllipsisLoc(),
11634         Out.get(), E->getLocEnd());
11635     if (Result.isInvalid())
11636       return true;
11637   }
11638 
11639   // If we had no init and an empty pack, and we're not retaining an expansion,
11640   // then produce a fallback value or error.
11641   if (Result.isUnset())
11642     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11643                                                 E->getOperator());
11644 
11645   return Result;
11646 }
11647 
11648 template<typename Derived>
11649 ExprResult
11650 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11651     CXXStdInitializerListExpr *E) {
11652   return getDerived().TransformExpr(E->getSubExpr());
11653 }
11654 
11655 template<typename Derived>
11656 ExprResult
11657 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11658   return SemaRef.MaybeBindToTemporary(E);
11659 }
11660 
11661 template<typename Derived>
11662 ExprResult
11663 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11664   return E;
11665 }
11666 
11667 template<typename Derived>
11668 ExprResult
11669 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11670   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11671   if (SubExpr.isInvalid())
11672     return ExprError();
11673 
11674   if (!getDerived().AlwaysRebuild() &&
11675       SubExpr.get() == E->getSubExpr())
11676     return E;
11677 
11678   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11679 }
11680 
11681 template<typename Derived>
11682 ExprResult
11683 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11684   // Transform each of the elements.
11685   SmallVector<Expr *, 8> Elements;
11686   bool ArgChanged = false;
11687   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11688                                   /*IsCall=*/false, Elements, &ArgChanged))
11689     return ExprError();
11690 
11691   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11692     return SemaRef.MaybeBindToTemporary(E);
11693 
11694   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11695                                               Elements.data(),
11696                                               Elements.size());
11697 }
11698 
11699 template<typename Derived>
11700 ExprResult
11701 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11702                                                     ObjCDictionaryLiteral *E) {
11703   // Transform each of the elements.
11704   SmallVector<ObjCDictionaryElement, 8> Elements;
11705   bool ArgChanged = false;
11706   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11707     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11708 
11709     if (OrigElement.isPackExpansion()) {
11710       // This key/value element is a pack expansion.
11711       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11712       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11713       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11714       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11715 
11716       // Determine whether the set of unexpanded parameter packs can
11717       // and should be expanded.
11718       bool Expand = true;
11719       bool RetainExpansion = false;
11720       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11721       Optional<unsigned> NumExpansions = OrigNumExpansions;
11722       SourceRange PatternRange(OrigElement.Key->getLocStart(),
11723                                OrigElement.Value->getLocEnd());
11724      if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11725                                                PatternRange,
11726                                                Unexpanded,
11727                                                Expand, RetainExpansion,
11728                                                NumExpansions))
11729         return ExprError();
11730 
11731       if (!Expand) {
11732         // The transform has determined that we should perform a simple
11733         // transformation on the pack expansion, producing another pack
11734         // expansion.
11735         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11736         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11737         if (Key.isInvalid())
11738           return ExprError();
11739 
11740         if (Key.get() != OrigElement.Key)
11741           ArgChanged = true;
11742 
11743         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11744         if (Value.isInvalid())
11745           return ExprError();
11746 
11747         if (Value.get() != OrigElement.Value)
11748           ArgChanged = true;
11749 
11750         ObjCDictionaryElement Expansion = {
11751           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11752         };
11753         Elements.push_back(Expansion);
11754         continue;
11755       }
11756 
11757       // Record right away that the argument was changed.  This needs
11758       // to happen even if the array expands to nothing.
11759       ArgChanged = true;
11760 
11761       // The transform has determined that we should perform an elementwise
11762       // expansion of the pattern. Do so.
11763       for (unsigned I = 0; I != *NumExpansions; ++I) {
11764         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11765         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11766         if (Key.isInvalid())
11767           return ExprError();
11768 
11769         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11770         if (Value.isInvalid())
11771           return ExprError();
11772 
11773         ObjCDictionaryElement Element = {
11774           Key.get(), Value.get(), SourceLocation(), NumExpansions
11775         };
11776 
11777         // If any unexpanded parameter packs remain, we still have a
11778         // pack expansion.
11779         // FIXME: Can this really happen?
11780         if (Key.get()->containsUnexpandedParameterPack() ||
11781             Value.get()->containsUnexpandedParameterPack())
11782           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11783 
11784         Elements.push_back(Element);
11785       }
11786 
11787       // FIXME: Retain a pack expansion if RetainExpansion is true.
11788 
11789       // We've finished with this pack expansion.
11790       continue;
11791     }
11792 
11793     // Transform and check key.
11794     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11795     if (Key.isInvalid())
11796       return ExprError();
11797 
11798     if (Key.get() != OrigElement.Key)
11799       ArgChanged = true;
11800 
11801     // Transform and check value.
11802     ExprResult Value
11803       = getDerived().TransformExpr(OrigElement.Value);
11804     if (Value.isInvalid())
11805       return ExprError();
11806 
11807     if (Value.get() != OrigElement.Value)
11808       ArgChanged = true;
11809 
11810     ObjCDictionaryElement Element = {
11811       Key.get(), Value.get(), SourceLocation(), None
11812     };
11813     Elements.push_back(Element);
11814   }
11815 
11816   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11817     return SemaRef.MaybeBindToTemporary(E);
11818 
11819   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
11820                                                    Elements);
11821 }
11822 
11823 template<typename Derived>
11824 ExprResult
11825 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
11826   TypeSourceInfo *EncodedTypeInfo
11827     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
11828   if (!EncodedTypeInfo)
11829     return ExprError();
11830 
11831   if (!getDerived().AlwaysRebuild() &&
11832       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
11833     return E;
11834 
11835   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
11836                                             EncodedTypeInfo,
11837                                             E->getRParenLoc());
11838 }
11839 
11840 template<typename Derived>
11841 ExprResult TreeTransform<Derived>::
11842 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
11843   // This is a kind of implicit conversion, and it needs to get dropped
11844   // and recomputed for the same general reasons that ImplicitCastExprs
11845   // do, as well a more specific one: this expression is only valid when
11846   // it appears *immediately* as an argument expression.
11847   return getDerived().TransformExpr(E->getSubExpr());
11848 }
11849 
11850 template<typename Derived>
11851 ExprResult TreeTransform<Derived>::
11852 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
11853   TypeSourceInfo *TSInfo
11854     = getDerived().TransformType(E->getTypeInfoAsWritten());
11855   if (!TSInfo)
11856     return ExprError();
11857 
11858   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
11859   if (Result.isInvalid())
11860     return ExprError();
11861 
11862   if (!getDerived().AlwaysRebuild() &&
11863       TSInfo == E->getTypeInfoAsWritten() &&
11864       Result.get() == E->getSubExpr())
11865     return E;
11866 
11867   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
11868                                       E->getBridgeKeywordLoc(), TSInfo,
11869                                       Result.get());
11870 }
11871 
11872 template <typename Derived>
11873 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
11874     ObjCAvailabilityCheckExpr *E) {
11875   return E;
11876 }
11877 
11878 template<typename Derived>
11879 ExprResult
11880 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
11881   // Transform arguments.
11882   bool ArgChanged = false;
11883   SmallVector<Expr*, 8> Args;
11884   Args.reserve(E->getNumArgs());
11885   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
11886                                   &ArgChanged))
11887     return ExprError();
11888 
11889   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
11890     // Class message: transform the receiver type.
11891     TypeSourceInfo *ReceiverTypeInfo
11892       = getDerived().TransformType(E->getClassReceiverTypeInfo());
11893     if (!ReceiverTypeInfo)
11894       return ExprError();
11895 
11896     // If nothing changed, just retain the existing message send.
11897     if (!getDerived().AlwaysRebuild() &&
11898         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
11899       return SemaRef.MaybeBindToTemporary(E);
11900 
11901     // Build a new class message send.
11902     SmallVector<SourceLocation, 16> SelLocs;
11903     E->getSelectorLocs(SelLocs);
11904     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
11905                                                E->getSelector(),
11906                                                SelLocs,
11907                                                E->getMethodDecl(),
11908                                                E->getLeftLoc(),
11909                                                Args,
11910                                                E->getRightLoc());
11911   }
11912   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
11913            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
11914     if (!E->getMethodDecl())
11915       return ExprError();
11916 
11917     // Build a new class message send to 'super'.
11918     SmallVector<SourceLocation, 16> SelLocs;
11919     E->getSelectorLocs(SelLocs);
11920     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
11921                                                E->getSelector(),
11922                                                SelLocs,
11923                                                E->getReceiverType(),
11924                                                E->getMethodDecl(),
11925                                                E->getLeftLoc(),
11926                                                Args,
11927                                                E->getRightLoc());
11928   }
11929 
11930   // Instance message: transform the receiver
11931   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
11932          "Only class and instance messages may be instantiated");
11933   ExprResult Receiver
11934     = getDerived().TransformExpr(E->getInstanceReceiver());
11935   if (Receiver.isInvalid())
11936     return ExprError();
11937 
11938   // If nothing changed, just retain the existing message send.
11939   if (!getDerived().AlwaysRebuild() &&
11940       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
11941     return SemaRef.MaybeBindToTemporary(E);
11942 
11943   // Build a new instance message send.
11944   SmallVector<SourceLocation, 16> SelLocs;
11945   E->getSelectorLocs(SelLocs);
11946   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
11947                                              E->getSelector(),
11948                                              SelLocs,
11949                                              E->getMethodDecl(),
11950                                              E->getLeftLoc(),
11951                                              Args,
11952                                              E->getRightLoc());
11953 }
11954 
11955 template<typename Derived>
11956 ExprResult
11957 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
11958   return E;
11959 }
11960 
11961 template<typename Derived>
11962 ExprResult
11963 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
11964   return E;
11965 }
11966 
11967 template<typename Derived>
11968 ExprResult
11969 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
11970   // Transform the base expression.
11971   ExprResult Base = getDerived().TransformExpr(E->getBase());
11972   if (Base.isInvalid())
11973     return ExprError();
11974 
11975   // We don't need to transform the ivar; it will never change.
11976 
11977   // If nothing changed, just retain the existing expression.
11978   if (!getDerived().AlwaysRebuild() &&
11979       Base.get() == E->getBase())
11980     return E;
11981 
11982   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
11983                                              E->getLocation(),
11984                                              E->isArrow(), E->isFreeIvar());
11985 }
11986 
11987 template<typename Derived>
11988 ExprResult
11989 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
11990   // 'super' and types never change. Property never changes. Just
11991   // retain the existing expression.
11992   if (!E->isObjectReceiver())
11993     return E;
11994 
11995   // Transform the base expression.
11996   ExprResult Base = getDerived().TransformExpr(E->getBase());
11997   if (Base.isInvalid())
11998     return ExprError();
11999 
12000   // We don't need to transform the property; it will never change.
12001 
12002   // If nothing changed, just retain the existing expression.
12003   if (!getDerived().AlwaysRebuild() &&
12004       Base.get() == E->getBase())
12005     return E;
12006 
12007   if (E->isExplicitProperty())
12008     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12009                                                    E->getExplicitProperty(),
12010                                                    E->getLocation());
12011 
12012   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12013                                                  SemaRef.Context.PseudoObjectTy,
12014                                                  E->getImplicitPropertyGetter(),
12015                                                  E->getImplicitPropertySetter(),
12016                                                  E->getLocation());
12017 }
12018 
12019 template<typename Derived>
12020 ExprResult
12021 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12022   // Transform the base expression.
12023   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12024   if (Base.isInvalid())
12025     return ExprError();
12026 
12027   // Transform the key expression.
12028   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12029   if (Key.isInvalid())
12030     return ExprError();
12031 
12032   // If nothing changed, just retain the existing expression.
12033   if (!getDerived().AlwaysRebuild() &&
12034       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12035     return E;
12036 
12037   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12038                                                   Base.get(), Key.get(),
12039                                                   E->getAtIndexMethodDecl(),
12040                                                   E->setAtIndexMethodDecl());
12041 }
12042 
12043 template<typename Derived>
12044 ExprResult
12045 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12046   // Transform the base expression.
12047   ExprResult Base = getDerived().TransformExpr(E->getBase());
12048   if (Base.isInvalid())
12049     return ExprError();
12050 
12051   // If nothing changed, just retain the existing expression.
12052   if (!getDerived().AlwaysRebuild() &&
12053       Base.get() == E->getBase())
12054     return E;
12055 
12056   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12057                                          E->getOpLoc(),
12058                                          E->isArrow());
12059 }
12060 
12061 template<typename Derived>
12062 ExprResult
12063 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12064   bool ArgumentChanged = false;
12065   SmallVector<Expr*, 8> SubExprs;
12066   SubExprs.reserve(E->getNumSubExprs());
12067   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12068                                   SubExprs, &ArgumentChanged))
12069     return ExprError();
12070 
12071   if (!getDerived().AlwaysRebuild() &&
12072       !ArgumentChanged)
12073     return E;
12074 
12075   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12076                                                SubExprs,
12077                                                E->getRParenLoc());
12078 }
12079 
12080 template<typename Derived>
12081 ExprResult
12082 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12083   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12084   if (SrcExpr.isInvalid())
12085     return ExprError();
12086 
12087   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12088   if (!Type)
12089     return ExprError();
12090 
12091   if (!getDerived().AlwaysRebuild() &&
12092       Type == E->getTypeSourceInfo() &&
12093       SrcExpr.get() == E->getSrcExpr())
12094     return E;
12095 
12096   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12097                                                SrcExpr.get(), Type,
12098                                                E->getRParenLoc());
12099 }
12100 
12101 template<typename Derived>
12102 ExprResult
12103 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12104   BlockDecl *oldBlock = E->getBlockDecl();
12105 
12106   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12107   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12108 
12109   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12110   blockScope->TheDecl->setBlockMissingReturnType(
12111                          oldBlock->blockMissingReturnType());
12112 
12113   SmallVector<ParmVarDecl*, 4> params;
12114   SmallVector<QualType, 4> paramTypes;
12115 
12116   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12117 
12118   // Parameter substitution.
12119   Sema::ExtParameterInfoBuilder extParamInfos;
12120   if (getDerived().TransformFunctionTypeParams(
12121           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12122           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12123           extParamInfos)) {
12124     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12125     return ExprError();
12126   }
12127 
12128   QualType exprResultType =
12129       getDerived().TransformType(exprFunctionType->getReturnType());
12130 
12131   auto epi = exprFunctionType->getExtProtoInfo();
12132   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12133 
12134   QualType functionType =
12135     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12136   blockScope->FunctionType = functionType;
12137 
12138   // Set the parameters on the block decl.
12139   if (!params.empty())
12140     blockScope->TheDecl->setParams(params);
12141 
12142   if (!oldBlock->blockMissingReturnType()) {
12143     blockScope->HasImplicitReturnType = false;
12144     blockScope->ReturnType = exprResultType;
12145   }
12146 
12147   // Transform the body
12148   StmtResult body = getDerived().TransformStmt(E->getBody());
12149   if (body.isInvalid()) {
12150     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12151     return ExprError();
12152   }
12153 
12154 #ifndef NDEBUG
12155   // In builds with assertions, make sure that we captured everything we
12156   // captured before.
12157   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12158     for (const auto &I : oldBlock->captures()) {
12159       VarDecl *oldCapture = I.getVariable();
12160 
12161       // Ignore parameter packs.
12162       if (isa<ParmVarDecl>(oldCapture) &&
12163           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12164         continue;
12165 
12166       VarDecl *newCapture =
12167         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12168                                                  oldCapture));
12169       assert(blockScope->CaptureMap.count(newCapture));
12170     }
12171     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12172   }
12173 #endif
12174 
12175   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12176                                     /*Scope=*/nullptr);
12177 }
12178 
12179 template<typename Derived>
12180 ExprResult
12181 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12182   llvm_unreachable("Cannot transform asType expressions yet");
12183 }
12184 
12185 template<typename Derived>
12186 ExprResult
12187 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12188   QualType RetTy = getDerived().TransformType(E->getType());
12189   bool ArgumentChanged = false;
12190   SmallVector<Expr*, 8> SubExprs;
12191   SubExprs.reserve(E->getNumSubExprs());
12192   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12193                                   SubExprs, &ArgumentChanged))
12194     return ExprError();
12195 
12196   if (!getDerived().AlwaysRebuild() &&
12197       !ArgumentChanged)
12198     return E;
12199 
12200   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12201                                         RetTy, E->getOp(), E->getRParenLoc());
12202 }
12203 
12204 //===----------------------------------------------------------------------===//
12205 // Type reconstruction
12206 //===----------------------------------------------------------------------===//
12207 
12208 template<typename Derived>
12209 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12210                                                     SourceLocation Star) {
12211   return SemaRef.BuildPointerType(PointeeType, Star,
12212                                   getDerived().getBaseEntity());
12213 }
12214 
12215 template<typename Derived>
12216 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12217                                                          SourceLocation Star) {
12218   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12219                                        getDerived().getBaseEntity());
12220 }
12221 
12222 template<typename Derived>
12223 QualType
12224 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12225                                              bool WrittenAsLValue,
12226                                              SourceLocation Sigil) {
12227   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12228                                     Sigil, getDerived().getBaseEntity());
12229 }
12230 
12231 template<typename Derived>
12232 QualType
12233 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12234                                                  QualType ClassType,
12235                                                  SourceLocation Sigil) {
12236   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12237                                         getDerived().getBaseEntity());
12238 }
12239 
12240 template<typename Derived>
12241 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12242            const ObjCTypeParamDecl *Decl,
12243            SourceLocation ProtocolLAngleLoc,
12244            ArrayRef<ObjCProtocolDecl *> Protocols,
12245            ArrayRef<SourceLocation> ProtocolLocs,
12246            SourceLocation ProtocolRAngleLoc) {
12247   return SemaRef.BuildObjCTypeParamType(Decl,
12248                                         ProtocolLAngleLoc, Protocols,
12249                                         ProtocolLocs, ProtocolRAngleLoc,
12250                                         /*FailOnError=*/true);
12251 }
12252 
12253 template<typename Derived>
12254 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12255            QualType BaseType,
12256            SourceLocation Loc,
12257            SourceLocation TypeArgsLAngleLoc,
12258            ArrayRef<TypeSourceInfo *> TypeArgs,
12259            SourceLocation TypeArgsRAngleLoc,
12260            SourceLocation ProtocolLAngleLoc,
12261            ArrayRef<ObjCProtocolDecl *> Protocols,
12262            ArrayRef<SourceLocation> ProtocolLocs,
12263            SourceLocation ProtocolRAngleLoc) {
12264   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12265                                      TypeArgs, TypeArgsRAngleLoc,
12266                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12267                                      ProtocolRAngleLoc,
12268                                      /*FailOnError=*/true);
12269 }
12270 
12271 template<typename Derived>
12272 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12273            QualType PointeeType,
12274            SourceLocation Star) {
12275   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12276 }
12277 
12278 template<typename Derived>
12279 QualType
12280 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12281                                          ArrayType::ArraySizeModifier SizeMod,
12282                                          const llvm::APInt *Size,
12283                                          Expr *SizeExpr,
12284                                          unsigned IndexTypeQuals,
12285                                          SourceRange BracketsRange) {
12286   if (SizeExpr || !Size)
12287     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12288                                   IndexTypeQuals, BracketsRange,
12289                                   getDerived().getBaseEntity());
12290 
12291   QualType Types[] = {
12292     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12293     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12294     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12295   };
12296   const unsigned NumTypes = llvm::array_lengthof(Types);
12297   QualType SizeType;
12298   for (unsigned I = 0; I != NumTypes; ++I)
12299     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12300       SizeType = Types[I];
12301       break;
12302     }
12303 
12304   // Note that we can return a VariableArrayType here in the case where
12305   // the element type was a dependent VariableArrayType.
12306   IntegerLiteral *ArraySize
12307       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12308                                /*FIXME*/BracketsRange.getBegin());
12309   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12310                                 IndexTypeQuals, BracketsRange,
12311                                 getDerived().getBaseEntity());
12312 }
12313 
12314 template<typename Derived>
12315 QualType
12316 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12317                                                  ArrayType::ArraySizeModifier SizeMod,
12318                                                  const llvm::APInt &Size,
12319                                                  unsigned IndexTypeQuals,
12320                                                  SourceRange BracketsRange) {
12321   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12322                                         IndexTypeQuals, BracketsRange);
12323 }
12324 
12325 template<typename Derived>
12326 QualType
12327 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12328                                           ArrayType::ArraySizeModifier SizeMod,
12329                                                  unsigned IndexTypeQuals,
12330                                                    SourceRange BracketsRange) {
12331   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12332                                        IndexTypeQuals, BracketsRange);
12333 }
12334 
12335 template<typename Derived>
12336 QualType
12337 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12338                                           ArrayType::ArraySizeModifier SizeMod,
12339                                                  Expr *SizeExpr,
12340                                                  unsigned IndexTypeQuals,
12341                                                  SourceRange BracketsRange) {
12342   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12343                                        SizeExpr,
12344                                        IndexTypeQuals, BracketsRange);
12345 }
12346 
12347 template<typename Derived>
12348 QualType
12349 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12350                                           ArrayType::ArraySizeModifier SizeMod,
12351                                                        Expr *SizeExpr,
12352                                                        unsigned IndexTypeQuals,
12353                                                    SourceRange BracketsRange) {
12354   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12355                                        SizeExpr,
12356                                        IndexTypeQuals, BracketsRange);
12357 }
12358 
12359 template <typename Derived>
12360 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12361     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12362   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12363                                           AttributeLoc);
12364 }
12365 
12366 template <typename Derived>
12367 QualType
12368 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12369                                           unsigned NumElements,
12370                                           VectorType::VectorKind VecKind) {
12371   // FIXME: semantic checking!
12372   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12373 }
12374 
12375 template<typename Derived>
12376 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12377                                                       unsigned NumElements,
12378                                                  SourceLocation AttributeLoc) {
12379   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12380                           NumElements, true);
12381   IntegerLiteral *VectorSize
12382     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12383                              AttributeLoc);
12384   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12385 }
12386 
12387 template<typename Derived>
12388 QualType
12389 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12390                                                            Expr *SizeExpr,
12391                                                   SourceLocation AttributeLoc) {
12392   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12393 }
12394 
12395 template<typename Derived>
12396 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12397     QualType T,
12398     MutableArrayRef<QualType> ParamTypes,
12399     const FunctionProtoType::ExtProtoInfo &EPI) {
12400   return SemaRef.BuildFunctionType(T, ParamTypes,
12401                                    getDerived().getBaseLocation(),
12402                                    getDerived().getBaseEntity(),
12403                                    EPI);
12404 }
12405 
12406 template<typename Derived>
12407 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12408   return SemaRef.Context.getFunctionNoProtoType(T);
12409 }
12410 
12411 template<typename Derived>
12412 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12413                                                             Decl *D) {
12414   assert(D && "no decl found");
12415   if (D->isInvalidDecl()) return QualType();
12416 
12417   // FIXME: Doesn't account for ObjCInterfaceDecl!
12418   TypeDecl *Ty;
12419   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12420     // A valid resolved using typename pack expansion decl can have multiple
12421     // UsingDecls, but they must each have exactly one type, and it must be
12422     // the same type in every case. But we must have at least one expansion!
12423     if (UPD->expansions().empty()) {
12424       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12425           << UPD->isCXXClassMember() << UPD;
12426       return QualType();
12427     }
12428 
12429     // We might still have some unresolved types. Try to pick a resolved type
12430     // if we can. The final instantiation will check that the remaining
12431     // unresolved types instantiate to the type we pick.
12432     QualType FallbackT;
12433     QualType T;
12434     for (auto *E : UPD->expansions()) {
12435       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12436       if (ThisT.isNull())
12437         continue;
12438       else if (ThisT->getAs<UnresolvedUsingType>())
12439         FallbackT = ThisT;
12440       else if (T.isNull())
12441         T = ThisT;
12442       else
12443         assert(getSema().Context.hasSameType(ThisT, T) &&
12444                "mismatched resolved types in using pack expansion");
12445     }
12446     return T.isNull() ? FallbackT : T;
12447   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12448     assert(Using->hasTypename() &&
12449            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12450 
12451     // A valid resolved using typename decl points to exactly one type decl.
12452     assert(++Using->shadow_begin() == Using->shadow_end());
12453     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12454   } else {
12455     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12456            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12457     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12458   }
12459 
12460   return SemaRef.Context.getTypeDeclType(Ty);
12461 }
12462 
12463 template<typename Derived>
12464 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12465                                                        SourceLocation Loc) {
12466   return SemaRef.BuildTypeofExprType(E, Loc);
12467 }
12468 
12469 template<typename Derived>
12470 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12471   return SemaRef.Context.getTypeOfType(Underlying);
12472 }
12473 
12474 template<typename Derived>
12475 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12476                                                      SourceLocation Loc) {
12477   return SemaRef.BuildDecltypeType(E, Loc);
12478 }
12479 
12480 template<typename Derived>
12481 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12482                                             UnaryTransformType::UTTKind UKind,
12483                                             SourceLocation Loc) {
12484   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12485 }
12486 
12487 template<typename Derived>
12488 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12489                                                       TemplateName Template,
12490                                              SourceLocation TemplateNameLoc,
12491                                      TemplateArgumentListInfo &TemplateArgs) {
12492   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12493 }
12494 
12495 template<typename Derived>
12496 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12497                                                    SourceLocation KWLoc) {
12498   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12499 }
12500 
12501 template<typename Derived>
12502 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12503                                                  SourceLocation KWLoc,
12504                                                  bool isReadPipe) {
12505   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12506                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12507 }
12508 
12509 template<typename Derived>
12510 TemplateName
12511 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12512                                             bool TemplateKW,
12513                                             TemplateDecl *Template) {
12514   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12515                                                   Template);
12516 }
12517 
12518 template<typename Derived>
12519 TemplateName
12520 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12521                                             const IdentifierInfo &Name,
12522                                             SourceLocation NameLoc,
12523                                             QualType ObjectType,
12524                                             NamedDecl *FirstQualifierInScope,
12525                                             bool AllowInjectedClassName) {
12526   UnqualifiedId TemplateName;
12527   TemplateName.setIdentifier(&Name, NameLoc);
12528   Sema::TemplateTy Template;
12529   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12530   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12531                                        SS, TemplateKWLoc, TemplateName,
12532                                        ParsedType::make(ObjectType),
12533                                        /*EnteringContext=*/false,
12534                                        Template, AllowInjectedClassName);
12535   return Template.get();
12536 }
12537 
12538 template<typename Derived>
12539 TemplateName
12540 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12541                                             OverloadedOperatorKind Operator,
12542                                             SourceLocation NameLoc,
12543                                             QualType ObjectType,
12544                                             bool AllowInjectedClassName) {
12545   UnqualifiedId Name;
12546   // FIXME: Bogus location information.
12547   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12548   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12549   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12550   Sema::TemplateTy Template;
12551   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12552                                        SS, TemplateKWLoc, Name,
12553                                        ParsedType::make(ObjectType),
12554                                        /*EnteringContext=*/false,
12555                                        Template, AllowInjectedClassName);
12556   return Template.get();
12557 }
12558 
12559 template<typename Derived>
12560 ExprResult
12561 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12562                                                    SourceLocation OpLoc,
12563                                                    Expr *OrigCallee,
12564                                                    Expr *First,
12565                                                    Expr *Second) {
12566   Expr *Callee = OrigCallee->IgnoreParenCasts();
12567   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12568 
12569   if (First->getObjectKind() == OK_ObjCProperty) {
12570     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12571     if (BinaryOperator::isAssignmentOp(Opc))
12572       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12573                                                  First, Second);
12574     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12575     if (Result.isInvalid())
12576       return ExprError();
12577     First = Result.get();
12578   }
12579 
12580   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12581     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12582     if (Result.isInvalid())
12583       return ExprError();
12584     Second = Result.get();
12585   }
12586 
12587   // Determine whether this should be a builtin operation.
12588   if (Op == OO_Subscript) {
12589     if (!First->getType()->isOverloadableType() &&
12590         !Second->getType()->isOverloadableType())
12591       return getSema().CreateBuiltinArraySubscriptExpr(First,
12592                                                        Callee->getLocStart(),
12593                                                        Second, OpLoc);
12594   } else if (Op == OO_Arrow) {
12595     // -> is never a builtin operation.
12596     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12597   } else if (Second == nullptr || isPostIncDec) {
12598     if (!First->getType()->isOverloadableType()) {
12599       // The argument is not of overloadable type, so try to create a
12600       // built-in unary operation.
12601       UnaryOperatorKind Opc
12602         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12603 
12604       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12605     }
12606   } else {
12607     if (!First->getType()->isOverloadableType() &&
12608         !Second->getType()->isOverloadableType()) {
12609       // Neither of the arguments is an overloadable type, so try to
12610       // create a built-in binary operation.
12611       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12612       ExprResult Result
12613         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12614       if (Result.isInvalid())
12615         return ExprError();
12616 
12617       return Result;
12618     }
12619   }
12620 
12621   // Compute the transformed set of functions (and function templates) to be
12622   // used during overload resolution.
12623   UnresolvedSet<16> Functions;
12624   bool RequiresADL;
12625 
12626   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12627     Functions.append(ULE->decls_begin(), ULE->decls_end());
12628     // If the overload could not be resolved in the template definition
12629     // (because we had a dependent argument), ADL is performed as part of
12630     // template instantiation.
12631     RequiresADL = ULE->requiresADL();
12632   } else {
12633     // If we've resolved this to a particular non-member function, just call
12634     // that function. If we resolved it to a member function,
12635     // CreateOverloaded* will find that function for us.
12636     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12637     if (!isa<CXXMethodDecl>(ND))
12638       Functions.addDecl(ND);
12639     RequiresADL = false;
12640   }
12641 
12642   // Add any functions found via argument-dependent lookup.
12643   Expr *Args[2] = { First, Second };
12644   unsigned NumArgs = 1 + (Second != nullptr);
12645 
12646   // Create the overloaded operator invocation for unary operators.
12647   if (NumArgs == 1 || isPostIncDec) {
12648     UnaryOperatorKind Opc
12649       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12650     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
12651                                            RequiresADL);
12652   }
12653 
12654   if (Op == OO_Subscript) {
12655     SourceLocation LBrace;
12656     SourceLocation RBrace;
12657 
12658     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12659         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12660         LBrace = SourceLocation::getFromRawEncoding(
12661                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12662         RBrace = SourceLocation::getFromRawEncoding(
12663                     NameLoc.CXXOperatorName.EndOpNameLoc);
12664     } else {
12665         LBrace = Callee->getLocStart();
12666         RBrace = OpLoc;
12667     }
12668 
12669     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12670                                                       First, Second);
12671   }
12672 
12673   // Create the overloaded operator invocation for binary operators.
12674   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12675   ExprResult Result = SemaRef.CreateOverloadedBinOp(
12676       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
12677   if (Result.isInvalid())
12678     return ExprError();
12679 
12680   return Result;
12681 }
12682 
12683 template<typename Derived>
12684 ExprResult
12685 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12686                                                      SourceLocation OperatorLoc,
12687                                                        bool isArrow,
12688                                                        CXXScopeSpec &SS,
12689                                                      TypeSourceInfo *ScopeType,
12690                                                        SourceLocation CCLoc,
12691                                                        SourceLocation TildeLoc,
12692                                         PseudoDestructorTypeStorage Destroyed) {
12693   QualType BaseType = Base->getType();
12694   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12695       (!isArrow && !BaseType->getAs<RecordType>()) ||
12696       (isArrow && BaseType->getAs<PointerType>() &&
12697        !BaseType->getAs<PointerType>()->getPointeeType()
12698                                               ->template getAs<RecordType>())){
12699     // This pseudo-destructor expression is still a pseudo-destructor.
12700     return SemaRef.BuildPseudoDestructorExpr(
12701         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12702         CCLoc, TildeLoc, Destroyed);
12703   }
12704 
12705   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12706   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12707                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12708   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12709   NameInfo.setNamedTypeInfo(DestroyedType);
12710 
12711   // The scope type is now known to be a valid nested name specifier
12712   // component. Tack it on to the end of the nested name specifier.
12713   if (ScopeType) {
12714     if (!ScopeType->getType()->getAs<TagType>()) {
12715       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12716                      diag::err_expected_class_or_namespace)
12717           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12718       return ExprError();
12719     }
12720     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12721               CCLoc);
12722   }
12723 
12724   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12725   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12726                                             OperatorLoc, isArrow,
12727                                             SS, TemplateKWLoc,
12728                                             /*FIXME: FirstQualifier*/ nullptr,
12729                                             NameInfo,
12730                                             /*TemplateArgs*/ nullptr,
12731                                             /*S*/nullptr);
12732 }
12733 
12734 template<typename Derived>
12735 StmtResult
12736 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12737   SourceLocation Loc = S->getLocStart();
12738   CapturedDecl *CD = S->getCapturedDecl();
12739   unsigned NumParams = CD->getNumParams();
12740   unsigned ContextParamPos = CD->getContextParamPosition();
12741   SmallVector<Sema::CapturedParamNameType, 4> Params;
12742   for (unsigned I = 0; I < NumParams; ++I) {
12743     if (I != ContextParamPos) {
12744       Params.push_back(
12745              std::make_pair(
12746                   CD->getParam(I)->getName(),
12747                   getDerived().TransformType(CD->getParam(I)->getType())));
12748     } else {
12749       Params.push_back(std::make_pair(StringRef(), QualType()));
12750     }
12751   }
12752   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12753                                      S->getCapturedRegionKind(), Params);
12754   StmtResult Body;
12755   {
12756     Sema::CompoundScopeRAII CompoundScope(getSema());
12757     Body = getDerived().TransformStmt(S->getCapturedStmt());
12758   }
12759 
12760   if (Body.isInvalid()) {
12761     getSema().ActOnCapturedRegionError();
12762     return StmtError();
12763   }
12764 
12765   return getSema().ActOnCapturedRegionEnd(Body.get());
12766 }
12767 
12768 } // end namespace clang
12769 
12770 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12771