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