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